diff --git a/.docs/api/data-db.md b/.docs/api/data-db.md index f721b2b16454e17ce9446887a38aba7c65fb198b..caeee6d171a2190e732302977e806034cfb3c4ac 100644 --- a/.docs/api/data-db.md +++ b/.docs/api/data-db.md @@ -4,7 +4,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/bitnami/mariadb-galera:11.1.3-debian-11-r8`](https://hub.docker.com/r/bitnami/mariadb-galera) + Image: [`docker.io/bitnami/mariadb-galera:11.3.2-debian-12-r9`](https://hub.docker.com/r/bitnami/mariadb-galera) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` diff --git a/.docs/api/metadata-db.md b/.docs/api/metadata-db.md index ba93d051d0e00d3386680c93ccbfe1f4a5af2e7f..05d164cf3cf616ec9972d6cc9210a92e1019f362 100644 --- a/.docs/api/metadata-db.md +++ b/.docs/api/metadata-db.md @@ -4,7 +4,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/bitnami/mariadb-galera:11.1.3-debian-11-r8`](https://hub.docker.com/r/bitnami/mariadb-galera) + Image: [`docker.io/bitnami/mariadb-galera:11.3.2-debian-12-r9`](https://hub.docker.com/r/bitnami/mariadb-galera) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` diff --git a/.docs/changelog.md b/.docs/changelog.md index 947d9120fedc6eba69ffa15aa0c4c5238adb91e6..e2d08d0ab416f21c14c2b819e45362761ff74c4a 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,20 +2,43 @@ author: Martin Weise --- -## v1.6.0 (2024-xx-xx) +## v1.6.0 (2025-01-07) [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.0) ### What's Changed +#### Features + +* Added possibility to modify table description and privacy mode that hides metadata of databases, tables, subsets and + views in [#472](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/472). +* Added Auth Service init container to sync internal system ("admin") user into Metadata Database + in [#470](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/470.) + #### Changes -* Bumped SeaweedFS version from `3.59` to `3.71` and use the Bitnami image - in [#477](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/477). +* Drop MariaDB Galera chart version from [ + `14.0.12`](https://artifacthub.io/packages/helm/bitnami/mariadb-galera/14.0.12) + to [`13.2.7`](https://artifacthub.io/packages/helm/bitnami/mariadb-galera/13.2.7) because of stability issues with the + newer versions on the OpenShift Kubernetes cluster. +* Bumped Grafana chart version from [`10.1.1`](https://artifacthub.io/packages/helm/bitnami/grafana/10.1.1) + to [`11.4.2`](https://artifacthub.io/packages/helm/bitnami/grafana/11.4.2). +* Bumped NGINX chart version from [`18.2.6`](https://artifacthub.io/packages/helm/bitnami/nginx/18.2.6) + to [`18.3.1`](https://artifacthub.io/packages/helm/bitnami/nginx/18.3.1). +* Bumped SeaweedFS chart version from [`1.0.2`](https://artifacthub.io/packages/helm/bitnami/seaweedfs/1.0.2) + to [`4.2.1`](https://github.com/MartinWeise/charts/tree/main/bitnami/spark) (created a pull request + [#31192](https://github.com/bitnami/charts/pull/31192)). +* Improve RESTfulness of HTTP API to e.g. not include the database image due to size + in [#463](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/463). #### Fixes -* Fixed a bug where the dataset separator was being ignored for imports +* Fixed a wrong JPA entity configuration in Hibernate that in some cases causes the `SERIAL` increment to not trigger + in MariaDB Galera. Removed the + deprecated [ + `@GenericGenerator`](https://docs.jboss.org/hibernate/orm/6.6/javadocs/org/hibernate/annotations/GenericGenerator.html) + annotation on JPA entities. +* Fixed a bug where the dataset separator was being ignored for imports in [#478](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/478). ## v1.5.3 (2024-12-13) @@ -38,14 +61,14 @@ author: Martin Weise #### Changes * Adapt Helm chart to support `runAsNonRoot` throughout and specify `resource` presets for the highly-constrained - OpenShift Kubernetes environment + OpenShift Kubernetes environment in [#467](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/467). * Require authentication for uploading files in [#466](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/466). #### Fixes -* Fixed a validation problem failing to validate UUIDs +* Fixed a validation problem failing to validate UUIDs in [#471](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/471). * Fixed the `dist.tar.gz` file not being found in the CI/CD pipeline on `release-` branches in [#465](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/465). diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e72b11bcb87d6a0ee12ac9fb8b3c9c41ab05b0f..31260590890b807f76bdc81a50569f53cbf56285 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,15 +1,17 @@ variables: - HOSTALIASES: ./hosts + HOSTALIASES: "./hosts" DOCKER_HOST: "unix:///var/run/dind/docker.sock" + DOCKER_VERSION: "27" TESTCONTAINERS_RYUK_DISABLED: "false" ALPINE_VERSION: "3.21" PYTHON_VERSION: "3.11" JAVA_VERSION: "17" + SONARQUBE_VERSION: "10.0" BUN_VERSION: "1.1.40" DOC_VERSION: "1.6" APP_VERSION: "1.6.0" CHART_VERSION: "1.6.0" - CACHE_FALLBACK_KEY: ${CI_DEFAULT_BRANCH} + CACHE_FALLBACK_KEY: "${CI_DEFAULT_BRANCH}" # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true -Dstyle.color=always" @@ -70,7 +72,7 @@ lint-docker-compose: - "bash .scripts/check-service.sh 'dbrepo-upload-service'" lint-helm-chart: - image: docker.io/alpine:3.20 + image: docker.io/alpine:${ALPINE_VERSION} stage: lint before_script: - apk add helm @@ -148,11 +150,9 @@ build-search-service: - "pip install pipenv" - "cd dbrepo-search-service && pipenv install --system --deploy" -build-docker: - image: docker.io/docker:24-dind +build-images: + image: docker.io/docker:${DOCKER_VERSION}-dind stage: build - variables: - DOCKER_BUILDKIT: 0 before_script: - "apk add --no-cache make" - echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY_URL @@ -160,7 +160,7 @@ build-docker: - "make build-images" build-helm: - image: docker.io/docker:24-dind + image: docker.io/docker:${DOCKER_VERSION}-dind stage: build before_script: - apk add --no-cache helm make @@ -178,7 +178,7 @@ deploy-staging: name: staging/datalab url: ${CI_ENV_STAGING_URL} before_script: - - apk add --no-cache helm kubectl + - apk add --no-cache helm kubectl make - echo ${CI_K8S_CONFIG} | base64 -d > ./kubecfg - make build-helm - helm -n ${CI_ENV_STAGING_NAMESPACE} uninstall ${CI_ENV_STAGING_RELEASE_NAME} --ignore-not-found @@ -189,7 +189,6 @@ deploy-staging: refs: - dev - master - when: manual test-metadata-service: image: maven:3-openjdk-${JAVA_VERSION} @@ -340,7 +339,7 @@ test-lib: test-ui: stage: test - image: docker.io/docker:24-dind + image: docker.io/docker:${DOCKER_VERSION}-dind needs: - build-ui dependencies: @@ -355,7 +354,7 @@ test-ui: release-images: stage: release - image: docker:24-dind + image: docker:${DOCKER_VERSION}-dind dependencies: - test-metadata-service - test-data-service @@ -375,7 +374,7 @@ release-images: release-helm: stage: release - image: docker:24-dind + image: docker:${DOCKER_VERSION}-dind only: refs: - /^release-.*/ @@ -452,7 +451,7 @@ release-libs: - bash ./lib/python/release.sh verify-install-script: - image: docker.io/docker:24-dind + image: docker.io/docker:${DOCKER_VERSION}-dind stage: verify only: refs: @@ -476,7 +475,7 @@ verify-dist: - "curl -v --output /dev/null --fail https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${APP_VERSION}/dist.tar.gz" scan-sonarqube: - image: sonarsource/sonar-scanner-cli:10.0 + image: sonarsource/sonar-scanner-cli:${SONARQUBE_VERSION} stage: scan only: refs: diff --git a/.gitlab/agents/dev/values.yaml b/.gitlab/agents/dev/values.yaml index e1641b507792aa9b342d543ad859a2dac278a959..aa241d7f0eef507e104fb2ea49c9c01e37390ed5 100644 --- a/.gitlab/agents/dev/values.yaml +++ b/.gitlab/agents/dev/values.yaml @@ -118,9 +118,9 @@ ui: client: https://s155.datalab.tuwien.ac.at server: https://s155.datalab.tuwien.ac.at title: "Database Repository" - logo: "https://s155.datalab.tuwien.ac.at/assets/logo.png" - icon: "https://s155.datalab.tuwien.ac.at/assets/favicon.png" - touch: "https://s155.datalab.tuwien.ac.at/assets/favicon.png" + logo: "https://ec.tuwien.ac.at/~weise/images/DS_white_hiRes.png" + icon: "https://ec.tuwien.ac.at/~weise/images/DS-icon_white_hiRes.png" + touch: "https://ec.tuwien.ac.at/~weise/images/DS-icon_white_hiRes.png" broker: host: s155.datalab.tuwien.ac.at extra: "128.130.0.0/15" @@ -142,13 +142,7 @@ ui: # subPath: logo.svg gatewayservice: - extraVolumes: - - name: config-map - configMap: - name: gateway-service-config - extraVolumeMounts: - - name: config-map - mountPath: /etc/nginx/assets/assets + enabled: true ingress: enabled: true diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index c92a071976c86ef7d449ab8468b22bfc800def95..0a59148511a9af575c5bd78df44601ab2b9d27b8 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", - "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", - "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", - "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", - "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", - "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", - "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", - "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", - "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", - "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", - "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", - "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", - "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", - "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", - "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", - "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", - "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", - "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", - "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", - "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", - "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", - "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", - "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", - "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", - "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", - "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", - "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", - "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", - "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", - "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", - "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", - "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", - "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", - "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", - "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", - "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", - "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", - "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", - "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", - "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", - "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", - "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", - "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", - "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", - "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", - "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", - "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", - "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", - "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", - "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", - "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", - "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", - "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", - "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", - "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", - "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", - "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", - "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", - "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", - "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", - "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", - "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", - "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", - "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", - "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", - "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", - "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", - "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", - "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", - "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", - "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", - "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", - "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", - "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", - "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", - "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" + "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", + "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33", + "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", + "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", + "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9", + "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e", + "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350", + "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226", + "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", + "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a", + "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6", + "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add", + "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", + "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", + "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", + "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e", + "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", + "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1", + "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c", + "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", + "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5", + "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e", + "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", + "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3", + "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438", + "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", + "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3", + "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", + "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", + "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2", + "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", + "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c", + "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55", + "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", + "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e", + "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1", + "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", + "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", + "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", + "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", + "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1", + "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", + "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", + "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", + "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", + "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8", + "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", + "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", + "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", + "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", + "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", + "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef", + "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28", + "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", + "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", + "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", + "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", + "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", + "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", + "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", + "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745", + "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", + "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", + "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43", + "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", + "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", + "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd", + "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d", + "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", + "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", + "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", + "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", + "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", + "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f", + "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", + "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e" ], "markers": "python_version >= '3.9'", - "version": "==3.11.10" + "version": "==3.11.11" }, "aiosignal": { "hashes": [ @@ -159,11 +159,11 @@ }, "attrs": { "hashes": [ - "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", - "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" + "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", + "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308" ], - "markers": "python_version >= '3.7'", - "version": "==24.2.0" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "blinker": { "hashes": [ @@ -175,28 +175,28 @@ }, "boto3": { "hashes": [ - "sha256:742941b2424c0223d2d94a08c3485462fa7c58d816b62ca80f08e555243acee1", - "sha256:d2e95fa06f095b8e0c545dd678c6269d253809b2997c30f5ce8a956c410b4e86" + "sha256:2446e819cf4e295833474cdcf2c92bc82718ce537e9ee1f17f7e3d237f60e69b", + "sha256:7de2c44c960e486f3c57e5203ea6393c6c4f0914c5f81c789ceb8b5d2ba5d1c5" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.35.81" + "version": "==1.35.93" }, "botocore": { "hashes": [ - "sha256:564c2478e50179e0b766e6a87e5e0cdd35e1bc37eb375c1cf15511f5dd13600d", - "sha256:a7b13bbd959bf2d6f38f681676aab408be01974c46802ab997617b51399239f7" + "sha256:47f7161000af6036f806449e3de12acdd3ec11aac7f5578e43e96241413a0f8f", + "sha256:b8d245a01e7d64c41edcf75a42be158df57b9518a83a3dbf5c7e4b8c2bc540cc" ], "markers": "python_version >= '3.8'", - "version": "==1.35.81" + "version": "==1.35.93" }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "cffi": { "hashes": [ @@ -273,122 +273,109 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "version": "==8.1.8" }, "cryptography": { "hashes": [ @@ -425,7 +412,7 @@ }, "dbrepo": { "hashes": [ - "sha256:52b776f5be91b9529c0f8cb1d006824f67e5da2f3d5bad4becc0857229036c19" + "sha256:769c6d9c4475b26d3f752dcc9910346798d31afeca45ef014f48dd293074b8fb" ], "path": "./lib/dbrepo-1.6.0.tar.gz" }, @@ -735,11 +722,11 @@ }, "jinja2": { "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb" ], "markers": "python_version >= '3.7'", - "version": "==3.1.4" + "version": "==3.1.5" }, "jmespath": { "hashes": [ @@ -842,20 +829,20 @@ }, "minio": { "hashes": [ - "sha256:2a3fcf4ab753824de8ae3ffeb14da33d6ad416f83a7e82363a27b34da8e91f27", - "sha256:4b63370ca83f82c23e6fb0a094a1e2b08b275884ae43f6a90c4388a45633e3f5" + "sha256:868dfe907e1702ce4bec86df1f3ced577a73ca85f344ef898d94fe2b5237f8c1", + "sha256:f5c24bf236fefd2edc567cd4455dc49a11ad8ff7ac984bb031b849d82f01222a" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.2.12" + "version": "==7.2.14" }, "mistune": { "hashes": [ - "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", - "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" + "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", + "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667" ], - "markers": "python_version >= '3.7'", - "version": "==3.0.2" + "markers": "python_version >= '3.8'", + "version": "==3.1.0" }, "multidict": { "hashes": [ @@ -957,65 +944,65 @@ }, "numpy": { "hashes": [ - "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", - "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", - "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", - "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", - "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", - "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", - "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", - "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", - "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", - "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", - "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", - "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", - "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", - "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", - "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", - "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", - "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", - "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", - "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", - "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", - "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", - "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", - "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", - "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", - "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", - "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", - "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", - "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", - "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", - "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", - "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", - "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", - "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", - "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", - "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", - "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", - "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", - "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", - "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", - "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", - "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", - "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", - "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", - "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", - "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", - "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", - "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", - "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", - "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", - "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", - "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", - "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", - "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", - "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", - "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" + "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2", + "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", + "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", + "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", + "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", + "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8", + "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", + "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16", + "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", + "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591", + "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964", + "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", + "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484", + "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957", + "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800", + "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", + "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95", + "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0", + "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", + "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", + "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73", + "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", + "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", + "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", + "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", + "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e", + "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440", + "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675", + "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", + "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", + "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", + "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", + "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308", + "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", + "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3", + "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", + "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5", + "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", + "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", + "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", + "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf", + "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab", + "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd", + "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf", + "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", + "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb", + "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", + "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", + "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", + "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", + "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", + "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528", + "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", + "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7", + "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.2.0" + "version": "==2.2.1" }, "opensearch-py": { "hashes": [ @@ -1243,118 +1230,118 @@ }, "pydantic": { "hashes": [ - "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d", - "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9" + "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", + "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.10.3" + "version": "==2.10.4" }, "pydantic-core": { "hashes": [ - "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9", - "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b", - "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c", - "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", - "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", - "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854", - "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d", - "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278", - "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a", - "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", - "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f", - "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27", - "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f", - "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", - "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", - "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97", - "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", - "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", - "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", - "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4", - "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", - "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131", - "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", - "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd", - "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", - "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", - "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6", - "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60", - "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", - "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", - "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08", - "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05", - "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2", - "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", - "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c", - "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17", - "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62", - "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", - "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be", - "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067", - "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", - "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f", - "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", - "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840", - "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5", - "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807", - "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", - "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", - "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864", - "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e", - "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a", - "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", - "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", - "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a", - "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3", - "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", - "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", - "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31", - "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", - "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", - "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6", - "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36", - "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c", - "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154", - "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", - "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", - "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd", - "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3", - "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", - "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78", - "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", - "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618", - "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", - "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4", - "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", - "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c", - "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", - "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", - "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792", - "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", - "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9", - "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f", - "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01", - "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", - "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", - "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f", - "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd", - "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", - "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab", - "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", - "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676", - "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", - "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed", - "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", - "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967", - "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", - "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", - "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c", - "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206", - "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b" + "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", + "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", + "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", + "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", + "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", + "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", + "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", + "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", + "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", + "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", + "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", + "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", + "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", + "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", + "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", + "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", + "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", + "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", + "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", + "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", + "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", + "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", + "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", + "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", + "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", + "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", + "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", + "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", + "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", + "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", + "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", + "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", + "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", + "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", + "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", + "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", + "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", + "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", + "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320", + "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", + "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", + "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", + "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046", + "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", + "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", + "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", + "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", + "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", + "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", + "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", + "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", + "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", + "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", + "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", + "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", + "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", + "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", + "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145", + "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", + "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", + "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", + "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", + "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", + "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", + "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5", + "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", + "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", + "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", + "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", + "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da", + "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", + "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", + "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", + "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", + "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", + "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", + "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", + "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d", + "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", + "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", + "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", + "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", + "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a", + "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9", + "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506", + "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", + "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1", + "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", + "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", + "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", + "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", + "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", + "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", + "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", + "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", + "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", + "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228", + "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b", + "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", + "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad" ], "markers": "python_version >= '3.8'", - "version": "==2.27.1" + "version": "==2.27.2" }, "pyjwt": { "hashes": [ @@ -1574,11 +1561,11 @@ }, "setuptools": { "hashes": [ - "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", - "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" + "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183", + "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f" ], "markers": "python_version >= '3.9'", - "version": "==75.6.0" + "version": "==75.7.0" }, "six": { "hashes": [ @@ -1622,11 +1609,11 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" + "markers": "python_version >= '3.9'", + "version": "==2.3.0" }, "werkzeug": { "hashes": [ @@ -1814,11 +1801,11 @@ }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "cffi": { "hashes": [ @@ -1895,183 +1882,170 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "coverage": { "hashes": [ - "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", - "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", - "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", - "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", - "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", - "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", - "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", - "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", - "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", - "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", - "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", - "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", - "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", - "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", - "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", - "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", - "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", - "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", - "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", - "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", - "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", - "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", - "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", - "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", - "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", - "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", - "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", - "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", - "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", - "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", - "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", - "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", - "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", - "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", - "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", - "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", - "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", - "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", - "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", - "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", - "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", - "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", - "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", - "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", - "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", - "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", - "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", - "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", - "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", - "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", - "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", - "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", - "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", - "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", - "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", - "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", - "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", - "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", - "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", - "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", - "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", - "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" + "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", + "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", + "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", + "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", + "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", + "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", + "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", + "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", + "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", + "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", + "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", + "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", + "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", + "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", + "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", + "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", + "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", + "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", + "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", + "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", + "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", + "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", + "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", + "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", + "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", + "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", + "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", + "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", + "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", + "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", + "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", + "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", + "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", + "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", + "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", + "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", + "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", + "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", + "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", + "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", + "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", + "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", + "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", + "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", + "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", + "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", + "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", + "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", + "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", + "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", + "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", + "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", + "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", + "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", + "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", + "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", + "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", + "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", + "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", + "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", + "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", + "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.9" + "version": "==7.6.10" }, "docker": { "hashes": [ @@ -2105,12 +2079,12 @@ }, "minio": { "hashes": [ - "sha256:2a3fcf4ab753824de8ae3ffeb14da33d6ad416f83a7e82363a27b34da8e91f27", - "sha256:4b63370ca83f82c23e6fb0a094a1e2b08b275884ae43f6a90c4388a45633e3f5" + "sha256:868dfe907e1702ce4bec86df1f3ced577a73ca85f344ef898d94fe2b5237f8c1", + "sha256:f5c24bf236fefd2edc567cd4455dc49a11ad8ff7ac984bb031b849d82f01222a" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.2.12" + "version": "==7.2.14" }, "opensearch-py": { "hashes": [ @@ -2259,11 +2233,11 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" + "markers": "python_version >= '3.9'", + "version": "==2.3.0" }, "wrapt": { "hashes": [ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz index 9e5365baf3dd79d695a606637d225eaf2e72a751..80c2ba74f662e7b02895122a37e301fde2157b82 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz and b/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz differ diff --git a/dbrepo-auth-service/init/app.py b/dbrepo-auth-service/init/app.py index d3a26a42fe56d46ceece4199a95b434e109d6ff3..7d43f163fa3f50e326ba71933674500121d9fef2 100644 --- a/dbrepo-auth-service/init/app.py +++ b/dbrepo-auth-service/init/app.py @@ -12,7 +12,7 @@ user_id = admin.get_user_id(username=system_username) print(f'Successfully fetched user id: {user_id}') try: - conn = mariadb.connect(user="root", + conn = mariadb.connect(user=os.getenv('METADATA_USERNAME', 'root'), password=os.getenv('METADATA_DB_PASSWORD', 'dbrepo'), host="metadata-db", port=3306, diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index cd5c809af1f872239d234c8f1e6cba56f25a95fb..0b244a12a46ec7d9ec25ba86fd01c9f2d5b97d5f 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -23,7 +23,7 @@ <module>report</module> </modules> - <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/</url> + <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/</url> <developers> <developer> <name>Martin Weise</name> diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index 15daf4381ddfa3195e999801d509aba4a778cb6c..fd66cf805ef4bc7d5e7bb5e93ee54381015e88f6 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -44,10 +44,6 @@ server { listen 8080 default_server; server_name _; - location = /basic_status { - stub_status; - } - location /dashboard/ { rewrite ^/dashboard/(.*) /$1 break; proxy_set_header Host $host; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java index 168c0cc752079d259ac21b5da411d795cbd1cf46..a2fb1264cc360f0de0d5502306b215d79a442a70 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java @@ -5,7 +5,6 @@ import at.tuwien.entities.database.Database; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -13,6 +12,8 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.Instant; import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -20,14 +21,12 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_containers") public class Container { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "containers-sequence") - @GenericGenerator(name = "containers-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -55,7 +54,7 @@ public class Container { @Column private String uiAdditionalFlags; - @ToString.Exclude + @EqualsAndHashCode.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false) @@ -68,11 +67,13 @@ public class Container { }) private ContainerImage image; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java index 4a9e9a4b9f6a6552c1b4f8342da3248006e7ad34..7e04ce2086c3b4e9e677548b106cc28ddc9756ee 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java @@ -4,7 +4,6 @@ import at.tuwien.entities.container.Container; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -12,6 +11,8 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.Instant; import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -19,7 +20,7 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_images", uniqueConstraints = @UniqueConstraint(columnNames = {"name", "version"})) @NamedQueries({ @NamedQuery(name = "ContainerImage.findAll", query = "select i from ContainerImage i order by i.id asc") @@ -27,9 +28,7 @@ import java.util.List; public class ContainerImage { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "images-sequence") - @GenericGenerator(name = "images-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) public Long id; @@ -61,11 +60,13 @@ public class ContainerImage { @OneToMany(fetch = FetchType.LAZY, mappedBy = "image") private List<Container> containers; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java index 47872da89036300ed6ec9970821a77580322b630..5f4ddbfb8c6dd8a657a88432d4606fa6f9c56f7e 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java @@ -2,9 +2,10 @@ package at.tuwien.entities.container.image; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -12,14 +13,12 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_image_types") public class DataType { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "image-type-sequence") - @GenericGenerator(name = "image-type-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) public Long id; @@ -69,6 +68,7 @@ public class DataType { private Boolean buildable; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "image_id", referencedColumnName = "id") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java index 418d54cb6446670123aa2b2acd4ed6e7b01e3ccc..bbd994fa7ec05d775ba8a7c2eebb1ece418d2726 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java @@ -2,9 +2,10 @@ package at.tuwien.entities.container.image; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -12,14 +13,12 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_image_operators") public class Operator { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "image-type-sequence") - @GenericGenerator(name = "image-type-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) public Long id; @@ -33,6 +32,7 @@ public class Operator { private String documentation; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "image_id", referencedColumnName = "id") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java index 41808a14535ff310233cc77627376cc6684365bc..f70fbd93a31d7566e878fd11f31945bc73689c49 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -5,13 +5,10 @@ import at.tuwien.entities.database.table.Table; import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.user.User; import com.fasterxml.jackson.annotation.JsonFormat; -import jakarta.persistence.CascadeType; import jakarta.persistence.*; -import jakarta.persistence.NamedQueries; -import jakarta.persistence.NamedQuery; -import jakarta.persistence.OrderBy; import lombok.*; -import org.hibernate.annotations.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.Where; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -21,12 +18,15 @@ import java.time.Instant; import java.util.List; import java.util.UUID; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder(toBuilder = true) @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_databases", uniqueConstraints = { @UniqueConstraint(columnNames = {"cid", "internalName"}) @@ -44,13 +44,10 @@ import java.util.UUID; public class Database implements Serializable { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "databases-sequence") - @GenericGenerator(name = "databases-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; - @ToString.Exclude @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "owned_by", columnDefinition = "VARCHAR(36)") private UUID ownedBy; @@ -64,6 +61,7 @@ public class Database implements Serializable { @Column(nullable = false) private Long cid; + @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false) @@ -82,7 +80,6 @@ public class Database implements Serializable { @Column(columnDefinition = "TEXT") private String description; - @ToString.Exclude @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "contact_person", columnDefinition = "VARCHAR(36)") private UUID contactPerson; @@ -93,29 +90,24 @@ public class Database implements Serializable { }) private User contact; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database") @Where(clause = "identifier_type='DATABASE'") @OrderBy("id DESC") private List<Identifier> identifiers; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database") @Where(clause = "identifier_type='SUBSET'") @OrderBy("id DESC") private List<Identifier> subsets; - @ToString.Exclude @OrderBy("id DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<Table> tables; - @ToString.Exclude @OrderBy("id DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<View> views; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<DatabaseAccess> accesses; @@ -130,11 +122,13 @@ public class Database implements Serializable { @Column(columnDefinition = "LONGBLOB") private byte[] image; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java index eeb9da55fef08b16b743d3afe06ef1ea9b4ab5bc..079aac84c7d191f71d29657c6837a6ae9f545bab 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java @@ -17,7 +17,7 @@ import java.util.UUID; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @IdClass(DatabaseAccessKey.class) @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_have_access") @@ -28,7 +28,6 @@ import java.util.UUID; public class DatabaseAccess { @Id - @EqualsAndHashCode.Include @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "user_id", updatable = false, columnDefinition = "VARCHAR(36)") private UUID huserid; @@ -42,11 +41,11 @@ public class DatabaseAccess { private User user; @Id - @EqualsAndHashCode.Include @Column(name = "database_id", updatable = false) private Long hdbid; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @@ -58,9 +57,4 @@ public class DatabaseAccess { @Column(nullable = false, name = "access_type", columnDefinition = "enum('READ', 'WRITE_OWN', 'WRITE_ALL')") private AccessType type; - @CreatedDate - @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - } diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java index 2421612358cf37f8ce600c494dc3eca30afe0762..67e6d6d18ac26a1cb2641ed45ae9e969c7393164 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java @@ -4,13 +4,11 @@ import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.user.User; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; -import jakarta.persistence.CascadeType; -import jakarta.persistence.NamedQueries; -import jakarta.persistence.NamedQuery; -import jakarta.persistence.OrderBy; -import jakarta.persistence.Table; import lombok.*; -import org.hibernate.annotations.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.hibernate.annotations.Where; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -19,12 +17,15 @@ import java.time.Instant; import java.util.List; import java.util.UUID; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_view") @NamedQueries({ @@ -37,9 +38,7 @@ public class View { @Id @org.springframework.data.annotation.Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "views-sequence") - @GenericGenerator(name = "views-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -90,6 +89,7 @@ public class View { private List<Identifier> identifiers; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @@ -103,11 +103,13 @@ public class View { @OrderBy("ordinalPosition") private List<ViewColumn> columns; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java index 201d7075e5f1df0b90c4c885ed76c2573e19d870..7ef6e8b9d63c30e05313514c78ad562306318185 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java @@ -3,16 +3,17 @@ package at.tuwien.entities.database; import at.tuwien.entities.database.table.columns.TableColumnType; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder(toBuilder = true) @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = { @UniqueConstraint(columnNames = {"view_id", "internal_name"}) @@ -20,13 +21,12 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; public class ViewColumn implements Comparable<ViewColumn> { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "view-columns-sequence") - @GenericGenerator(name = "view-columns-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "view_id", referencedColumnName = "id", nullable = false) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 2fe81e2e37df1e23822ae8a4216a332411d221fe..3cdb01d7d38477cc8a77b4e12ed9af61d04ecfba 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -6,12 +6,13 @@ import at.tuwien.entities.database.table.constraints.Constraints; import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.user.User; import com.fasterxml.jackson.annotation.JsonFormat; -import jakarta.persistence.CascadeType; -import jakarta.persistence.OrderBy; import jakarta.persistence.*; import lombok.*; import lombok.extern.log4j.Log4j2; -import org.hibernate.annotations.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.hibernate.annotations.Where; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -20,6 +21,8 @@ import java.time.Instant; import java.util.List; import java.util.UUID; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -27,7 +30,7 @@ import java.util.UUID; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_tables", uniqueConstraints = { @UniqueConstraint(columnNames = {"tdbid", "internalName"}) @@ -35,9 +38,7 @@ import java.util.UUID; public class Table { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "tables-sequence") - @GenericGenerator(name = "tables-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(name = "ID", updatable = false, nullable = false) private Long id; @@ -68,6 +69,7 @@ public class Table { private String description; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @@ -86,7 +88,6 @@ public class Table { @OrderBy("id DESC") private List<Identifier> identifiers; - @ToString.Exclude @Embedded private Constraints constraints; @@ -111,17 +112,18 @@ public class Table { @Column(name = "avg_row_length") private Long avgRowLength; - @ToString.Exclude @OnDelete(action = OnDeleteAction.CASCADE) @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "table") @OrderBy("ordinalPosition") private List<TableColumn> columns; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java index 841dbde754a09a5fdd51cec7872ae4c8a4e5e946..9f4c4e0606802a475e5873e3d0ebc57455a6a0e2 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java @@ -4,7 +4,6 @@ import at.tuwien.entities.database.table.Table; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -13,13 +12,15 @@ import java.math.BigDecimal; import java.time.Instant; import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder(toBuilder = true) @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_columns", uniqueConstraints = { @UniqueConstraint(columnNames = {"tID", "internal_name"}) @@ -30,13 +31,12 @@ import java.util.List; public class TableColumn implements Comparable<TableColumn> { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "columns-sequence") - @GenericGenerator(name = "columns-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "tID", referencedColumnName = "id", nullable = false) @@ -71,11 +71,6 @@ public class TableColumn implements Comparable<TableColumn> { @Column(nullable = false) private Integer ordinalPosition; - @CreatedDate - @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @JoinTable(name = "mdb_columns_concepts", joinColumns = @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false), @@ -119,6 +114,13 @@ public class TableColumn implements Comparable<TableColumn> { @Column(name = "std_dev") private BigDecimal stdDev; + @EqualsAndHashCode.Exclude + @CreatedDate + @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") + private Instant created; + + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java index e53e69f49808946cff5907f8057bde8923afd9b7..5a9e8292be0af3e99050bc87be1ba7b8b9756bf7 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java @@ -1,16 +1,16 @@ package at.tuwien.entities.database.table.columns; import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; - import java.time.Instant; import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -18,7 +18,7 @@ import java.util.List; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_concepts", uniqueConstraints = { @UniqueConstraint(columnNames = {"uri"}) }) @@ -29,9 +29,7 @@ import java.util.List; public class TableColumnConcept { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "concepts-sequence") - @GenericGenerator(name = "concepts-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -44,6 +42,7 @@ public class TableColumnConcept { @Column(columnDefinition = "TEXT") private String description; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java index df3950785e4d8a35ef4f8021bfe3a4c34540fbb2..7e8fe915b3b9de49e53eb0806da1f5ed03608a1d 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java @@ -1,15 +1,16 @@ package at.tuwien.entities.database.table.columns; import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; import java.time.Instant; import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -17,7 +18,7 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_units", uniqueConstraints = { @UniqueConstraint(columnNames = {"uri"}) }) @@ -28,9 +29,7 @@ import java.util.List; public class TableColumnUnit { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "units-sequence") - @GenericGenerator(name = "units-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -43,6 +42,7 @@ public class TableColumnUnit { @Column(columnDefinition = "TEXT") private String description; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java index e5a58f5d0d37f14ba812f030b70a81a213e8219f..76de9463cfa37048fb45d2b091b472190124ff1b 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java @@ -1,14 +1,14 @@ package at.tuwien.entities.database.table.constraints.foreignKey; import at.tuwien.entities.database.table.Table; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; - import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -16,14 +16,12 @@ import java.util.List; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @jakarta.persistence.Table(name = "mdb_constraints_foreign_key") public class ForeignKey { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "foreign-key-sequence") - @GenericGenerator(name = "foreign-key-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(name = "fkid", updatable = false, nullable = false) private Long id; @@ -31,6 +29,7 @@ public class ForeignKey { private String name; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "tid", referencedColumnName = "id", nullable = false) @@ -38,6 +37,7 @@ public class ForeignKey { private Table table; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "rtid", referencedColumnName = "id", nullable = false) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java index c5f3570099dd5bd12ec641f07e6d2a9f8963b1ce..ed2691fc524a3de33788ed977b1ba213b18b5bfe 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java @@ -1,11 +1,11 @@ package at.tuwien.entities.database.table.constraints.foreignKey; import at.tuwien.entities.database.table.columns.TableColumn; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; +import static jakarta.persistence.GenerationType.IDENTITY; @Data @Entity @@ -14,20 +14,19 @@ import jakarta.persistence.*; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_constraints_foreign_key_reference", uniqueConstraints = { @UniqueConstraint(columnNames = {"fkid", "cid", "rcid"}) }) public class ForeignKeyReference { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "foreign-key-reference-sequence") - @GenericGenerator(name = "foreign-key-reference-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false) private ForeignKey foreignKey; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java index aaa1e5fc8f9102c97294d1f9e53624c5fa3b8e45..407e2fb7f3f98b6a8b65d28636c92afaceb3e69c 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java @@ -4,9 +4,10 @@ import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -14,18 +15,17 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @jakarta.persistence.Table(name = "mdb_constraints_primary_key") public class PrimaryKey { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "foreign-key-sequence") - @GenericGenerator(name = "foreign-key-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(name = "pkid", updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @@ -34,6 +34,7 @@ public class PrimaryKey { private Table table; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java index c49fc48eb67b6d5ed3689086a1fba4c75e7a1b6c..c0dfc467109cf794dda89925393b442286254da5 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java @@ -2,14 +2,14 @@ package at.tuwien.entities.database.table.constraints.unique; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; - import java.util.List; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @@ -17,14 +17,12 @@ import java.util.List; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @jakarta.persistence.Table(name = "mdb_constraints_unique") public class Unique { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "constraints-unique-sequence") - @GenericGenerator(name = "constraints-unique-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(name = "uid", updatable = false, nullable = false) private Long id; @@ -32,6 +30,7 @@ public class Unique { private String name; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @@ -39,6 +38,7 @@ public class Unique { }) private Table table; + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinTable( diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java index f69f3c6d7177bd1f71cdaff66355971f9e2e1f8c..1b0692ae50adf8d6ca280a5403908cb3e8d65f42 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java @@ -1,10 +1,10 @@ package at.tuwien.entities.identifier; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; +import static jakarta.persistence.GenerationType.IDENTITY; @Data @Entity @@ -12,15 +12,14 @@ import jakarta.persistence.*; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_creators") public class Creator { @Id @org.springframework.data.annotation.Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "creators-sequence") - @GenericGenerator(name = "creators-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java index 311362a82073c1d8c936abd6500426d695a74acf..b98a1b8c6b7509ef0772f69e2af343b1b63d386e 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java @@ -6,13 +6,8 @@ import at.tuwien.entities.database.License; import at.tuwien.entities.user.User; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; -import jakarta.persistence.CascadeType; -import jakarta.persistence.NamedQueries; -import jakarta.persistence.NamedQuery; -import jakarta.persistence.OrderBy; -import jakarta.persistence.Table; import lombok.*; -import org.hibernate.annotations.*; +import org.hibernate.annotations.JdbcTypeCode; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -22,13 +17,15 @@ import java.time.Instant; import java.util.List; import java.util.UUID; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder(toBuilder = true) @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifiers") @NamedQueries({ @@ -42,9 +39,7 @@ import java.util.UUID; public class Identifier implements Serializable { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "identifiers-sequence") - @GenericGenerator(name = "identifiers-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -143,6 +138,7 @@ public class Identifier implements Serializable { * Databases are never created/updated/deleted by the Identifier entity. */ @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "dbid", referencedColumnName = "id", nullable = false, updatable = false) @@ -170,10 +166,12 @@ public class Identifier implements Serializable { }) private User owner; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java index 8544650a6c1b30ae06f3502fe91b33ce75783485..af684d2347b20bd54a959040b7b07937fc69952f 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java @@ -3,26 +3,26 @@ package at.tuwien.entities.identifier; import at.tuwien.entities.database.LanguageType; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.io.Serializable; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_descriptions") public class IdentifierDescription implements Serializable { @Id @org.springframework.data.annotation.Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "identifier-descriptions-sequence") - @GenericGenerator(name = "identifier-descriptions-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java index cd08b9ccbe56045d18b477d17e34427163bae689..c5720223467f5e52ac54354c11dc21baf36fcd0d 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java @@ -2,25 +2,25 @@ package at.tuwien.entities.identifier; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.io.Serializable; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_funders") public class IdentifierFunder implements Serializable { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "identifier-titles-sequence") - @GenericGenerator(name = "identifier-titles-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -30,7 +30,7 @@ public class IdentifierFunder implements Serializable { @Column(columnDefinition = "TEXT") private String funderIdentifier; - @Column(name="funder_identifier_type", columnDefinition = "ENUM('CROSSREF_FUNDER_ID', 'ROR', 'GND', 'ISNI', 'OTHER')") + @Column(name = "funder_identifier_type", columnDefinition = "ENUM('CROSSREF_FUNDER_ID', 'ROR', 'GND', 'ISNI', 'OTHER')") @Enumerated(EnumType.STRING) private IdentifierFunderType funderIdentifierType; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java index 72cc7c95ca87bdea83540c64d1ed32aee084bf88..cecc2c5c9804114529be0c6543de1ea69f5668aa 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java @@ -3,25 +3,25 @@ package at.tuwien.entities.identifier; import at.tuwien.entities.database.LanguageType; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.io.Serializable; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_titles") public class IdentifierTitle implements Serializable { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "identifier-titles-sequence") - @GenericGenerator(name = "identifier-titles-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java index 1bc3d269fa183f673b9f3c6912b290d36aebcc1c..e8b1acde125265bdda9d94918daf0bf478ff4904 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java @@ -1,10 +1,10 @@ package at.tuwien.entities.identifier; +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; +import static jakarta.persistence.GenerationType.IDENTITY; @Data @Entity @@ -12,7 +12,7 @@ import jakarta.persistence.*; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_related_identifiers", uniqueConstraints = { @UniqueConstraint(columnNames = {"id", "pid"}) @@ -20,9 +20,7 @@ import jakarta.persistence.*; public class RelatedIdentifier { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "related-identifiers-sequence") - @GenericGenerator(name = "related-identifiers-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java index de0d917b43c9a4b0b8aeba9ca71d329f7a0bf7a8..f22cee71a7a3dc4a97c8294619b5ec8931db1714 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java @@ -2,17 +2,19 @@ package at.tuwien.entities.maintenance; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.Instant; +import static jakarta.persistence.GenerationType.IDENTITY; + @Data @Entity @Builder @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_banner_messages") @NamedQueries({ @@ -21,9 +23,7 @@ import java.time.Instant; public class BannerMessage { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "messages-sequence") - @GenericGenerator(name = "messages-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java index c5043c361791b3ca2fc8915c1a573dd8174de6d3..576aab1e375028a9a776ae96cb0ea983f84e7274 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java @@ -2,14 +2,13 @@ package at.tuwien.entities.semantics; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.JdbcTypeCode; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.Instant; -import java.util.UUID; + +import static jakarta.persistence.GenerationType.IDENTITY; @Data @Entity @@ -17,6 +16,7 @@ import java.util.UUID; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_ontologies") @NamedQueries({ @@ -27,9 +27,7 @@ import java.util.UUID; public class Ontology { @Id - @EqualsAndHashCode.Include - @GeneratedValue(generator = "ontologies-sequence") - @GenericGenerator(name = "ontologies-sequence", strategy = "increment") + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -48,10 +46,12 @@ public class Ontology { @Column private String rdfPath; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java index 2d6ac4ccbee653e28cc25c5b78bbedeb89b1652f..c732864969c23bf45e4c616bd0c154703615d286 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java @@ -15,16 +15,15 @@ import java.util.UUID; @Data @Entity @Builder +@ToString @AllArgsConstructor @NoArgsConstructor -@ToString +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @Table(name = "mdb_users") public class User { @Id - @EqualsAndHashCode.Include @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") private UUID id; @@ -50,7 +49,6 @@ public class User { @Column private String language; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "user_id", referencedColumnName = "ID", insertable = false, updatable = false) @@ -60,43 +58,7 @@ public class User { @Column(nullable = false) private String theme; - @ToString.Exclude @Column(name = "mariadb_password", nullable = false) private String mariadbPassword; - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o instanceof Principal principal) { - final boolean result = this.getUsername().equals(principal.getName()); - log.trace("check if username {} equals principal name {}: {}", username, principal.getName(), result); - return result; - } - if (!(o instanceof User other)) { - return false; - } - final boolean result = this.getId().equals(other.getId()); - log.trace("check if id {} equals other id {}: {}", id, other.getId(), result); - return result; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 31 * hash + (id == null ? 0 : id.hashCode()); - hash = 31 * hash + (username == null ? 0 : username.hashCode()); - hash = 31 * hash + (firstname == null ? 0 : firstname.hashCode()); - hash = 31 * hash + (lastname == null ? 0 : lastname.hashCode()); - hash = 31 * hash + (email == null ? 0 : email.hashCode()); - hash = 31 * hash + (orcid == null ? 0 : orcid.hashCode()); - hash = 31 * hash + (affiliation == null ? 0 : affiliation.hashCode()); - hash = 31 * hash + (language == null ? 0 : language.hashCode()); - hash = 31 * hash + (accesses == null ? 0 : accesses.hashCode()); - hash = 31 * hash + (theme == null ? 0 : theme.hashCode()); - hash = 31 * hash + (mariadbPassword == null ? 0 : mariadbPassword.hashCode()); - return hash; - } - } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java index 812ec7bc21f1d5f080ba874b863d06ab2da5c4f2..99e4d2e6b11d58fa31bd58effbd849a9696c16d1 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java @@ -99,20 +99,20 @@ public class AccessEndpoint { log.debug("endpoint give access to database, databaseId={}, userId={}, access.type={}", databaseId, userId, data.getType()); final Database database = databaseService.findById(databaseId); - final User user = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(user)) { + final User caller = userService.findByUsername(principal.getName()); + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to create access: not owner"); throw new NotAllowedException("Failed to create access: not owner"); } - final User otherUser = userService.findById(userId); + final User user = userService.findById(userId); try { - accessService.find(database, otherUser); + accessService.find(database, user); log.error("Failed to create access to user with id {}: already has access", userId); throw new NotAllowedException("Failed to create access to user with id " + userId + ": already has access"); } catch (AccessNotFoundException e) { /* ignore */ } - accessService.create(database, otherUser, data.getType()); + accessService.create(database, user, data.getType()); return ResponseEntity.accepted() .build(); } @@ -159,17 +159,17 @@ public class AccessEndpoint { @NotNull Principal principal) throws NotAllowedException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, UserNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException { - log.debug("endpoint modify database access, databaseId={}, userId={}, access.type={}", databaseId, userId, - data.getType()); + log.debug("endpoint modify database access, databaseId={}, userId={}, access.type={}, principal.name={}", + databaseId, userId, data.getType(), principal.getName()); final Database database = databaseService.findById(databaseId); - final User user = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(user)) { + final User caller = userService.findByUsername(principal.getName()); + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to update access: not owner"); throw new NotAllowedException("Failed to update access: not owner"); } - final User otherUser = userService.findById(userId); - accessService.find(database, otherUser); - accessService.update(database, otherUser, data.getType()); + final User user = userService.findById(userId); + accessService.find(database, user); + accessService.update(database, user, data.getType()); return ResponseEntity.accepted() .build(); } @@ -204,7 +204,8 @@ public class AccessEndpoint { UserNotFoundException, AccessNotFoundException, NotAllowedException { log.debug("endpoint get database access, databaseId={}, userId={}, principal.name={}", databaseId, userId, principal.getName()); - if (!userId.equals(UserUtil.getId(principal))) { + final User caller = userService.findByUsername(principal.getName()); + if (!userId.equals(caller.getId())) { if (!UserUtil.hasRole(principal, "check-foreign-database-access")) { log.error("Failed to find access: foreign user"); throw new NotAllowedException("Failed to find access: foreign user"); @@ -212,11 +213,9 @@ public class AccessEndpoint { log.trace("principal is allowed to check foreign user access"); } final Database database = databaseService.findById(databaseId); - final User otherUser = userService.findById(userId); - final DatabaseAccess access = accessService.find(database, otherUser); - final DatabaseAccessDto dto = databaseMapper.databaseAccessToDatabaseAccessDto(access); - log.trace("check access resulted in dto {}", dto); - return ResponseEntity.ok(dto); + final User user = userService.findById(userId); + final DatabaseAccess access = accessService.find(database, user); + return ResponseEntity.ok(databaseMapper.databaseAccessToDatabaseAccessDto(access)); } @DeleteMapping("/{userId}") @@ -262,14 +261,14 @@ public class AccessEndpoint { SearchServiceException, SearchServiceConnectionException { log.debug("endpoint revoke database access, databaseId={}, userId={}", databaseId, userId); final Database database = databaseService.findById(databaseId); - final User user = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(user)) { + final User caller = userService.findByUsername(principal.getName()); + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to revoke access: not owner"); throw new NotAllowedException("Failed to revoke access: not owner"); } - final User otherUser = userService.findById(userId); - accessService.find(database, otherUser); - accessService.delete(database, otherUser); + final User user = userService.findById(userId); + accessService.find(database, user); + accessService.delete(database, user); return ResponseEntity.accepted() .build(); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index f0e2aaeaa1c046aa582d6ea97931fa5c706dcf2d..29c27074d77253c5cecd6e4ea67afb07954e3bed 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -213,7 +213,7 @@ public class DatabaseEndpoint { log.debug("endpoint refresh database metadata, databaseId={}", databaseId); final Database database = databaseService.findById(databaseId); final User caller = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(principal)) { + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to refresh database tables metadata: not owner"); throw new NotAllowedException("Failed to refresh tables metadata: not owner"); } @@ -259,10 +259,10 @@ public class DatabaseEndpoint { @NotNull Principal principal) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException, SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, ViewNotFoundException { - log.debug("endpoint refresh database metadata, databaseId={}", databaseId); + log.debug("endpoint refresh database metadata, databaseId={}, principal.name={}", databaseId, principal.getName()); final Database database = databaseService.findById(databaseId); final User caller = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(principal)) { + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to refresh database views metadata: not owner"); throw new NotAllowedException("Failed to refresh database views metadata: not owner"); } @@ -429,7 +429,7 @@ public class DatabaseEndpoint { log.debug("endpoint modify database image, databaseId={}, data.key={}", databaseId, data.getKey()); final Database database = databaseService.findById(databaseId); final User caller = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(caller)) { + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to update database image: not owner"); throw new NotAllowedException("Failed to update database image: not owner"); } @@ -510,7 +510,7 @@ public class DatabaseEndpoint { caller = null; } final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller); - if (database.getOwner().equals(principal)) { + if (caller != null && database.getOwner().getId().equals(caller.getId())) { log.debug("current logged-in user is also the owner: additionally load access list"); /* only owner sees the access rights */ final List<DatabaseAccess> accesses = accessService.list(database); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java index e84b7161f808dc2d3b70b7165b6c9a100fc116f9..31fcd6730551277b4eab2a8bdced3e42afbfbcb5 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java @@ -1,6 +1,5 @@ package at.tuwien.endpoints; -import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.api.identifier.*; import at.tuwien.api.identifier.ld.LdDatasetDto; @@ -8,8 +7,6 @@ import at.tuwien.api.user.external.ExternalMetadataDto; import at.tuwien.config.EndpointConfig; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; -import at.tuwien.entities.database.View; -import at.tuwien.entities.database.table.Table; import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.identifier.IdentifierStatusType; import at.tuwien.entities.identifier.IdentifierType; @@ -137,8 +134,10 @@ public class IdentifierEndpoint { .toList(); log.debug("find identifier resulted in identifiers {}", resource2); return ResponseEntity.ok(resource2); + default: + log.error("accept header {} is not supported", accept); + throw new FormatNotAvailableException("Must provide either application/json or application/ld+json headers"); } - throw new FormatNotAvailableException("Must provide either application/json or application/ld+json headers"); } @GetMapping(value = "/{identifierId}", produces = {MediaType.APPLICATION_JSON_VALUE, "application/ld+json", @@ -202,56 +201,54 @@ public class IdentifierEndpoint { DataServiceException, DataServiceConnectionException, MalformedException, FormatNotAvailableException, QueryNotFoundException { log.debug("endpoint find identifier, identifierId={}, accept={}", identifierId, accept); + if (accept == null) { + accept = ""; + } final Identifier identifier = identifierService.find(identifierId); - log.info("Found persistent identifier with id {}", identifier.getId()); - log.trace("found persistent identifier {}", identifier); - if (accept != null) { - log.trace("accept header present: {}", accept); - switch (accept) { - case "application/json": - log.trace("accept header matches json"); - final IdentifierDto resource1 = metadataMapper.identifierToIdentifierDto(identifier); - log.debug("find identifier resulted in identifier {}", resource1); - return ResponseEntity.ok(resource1); - case "application/ld+json": - log.trace("accept header matches json-ld"); - final LdDatasetDto resource2 = metadataMapper.identifierToLdDatasetDto(identifier, endpointConfig.getWebsiteUrl()); - log.debug("find identifier resulted in identifier {}", resource2); - return ResponseEntity.ok(resource2); - case "text/csv": - log.trace("accept header matches csv"); - if (identifier.getType().equals(IdentifierType.DATABASE)) { - log.error("Failed to export dataset: identifier type is database"); - throw new FormatNotAvailableException("Failed to export dataset: identifier type is database"); - } - final InputStreamResource resource3; - resource3 = identifierService.exportResource(identifier); - log.debug("find identifier resulted in resource {}", resource3); - return ResponseEntity.ok(resource3); - case "text/xml": - log.trace("accept header matches xml"); - final InputStreamResource resource4 = identifierService.exportMetadata(identifier); - log.debug("find identifier resulted in resource {}", resource4); - return ResponseEntity.ok(resource4); - } - final Pattern regex = Pattern.compile("text\\/bibliography(; ?style=(apa|ieee|bibtex))?"); - final Matcher matcher = regex.matcher(accept); - if (matcher.find()) { - log.trace("accept header matches bibliography"); - final BibliographyTypeDto style; - if (matcher.group(2) != null) { - style = BibliographyTypeDto.valueOf(matcher.group(2).toUpperCase()); - log.trace("bibliography style matches {}", style); - } else { - style = BibliographyTypeDto.APA; - log.trace("no bibliography style provided, default: {}", style); + log.info("Found persistent identifier with id: {}", identifier.getId()); + switch (accept) { + case "application/json": + log.trace("accept header matches json"); + final IdentifierDto resource1 = metadataMapper.identifierToIdentifierDto(identifier); + log.debug("find identifier resulted in identifier {}", resource1); + return ResponseEntity.ok(resource1); + case "application/ld+json": + log.trace("accept header matches json-ld"); + final LdDatasetDto resource2 = metadataMapper.identifierToLdDatasetDto(identifier, endpointConfig.getWebsiteUrl()); + log.debug("find identifier resulted in identifier {}", resource2); + log.debug("find identifier resulted in identifier {}", resource2); + return ResponseEntity.ok(resource2); + case "text/csv": + log.trace("accept header matches csv"); + if (identifier.getType().equals(IdentifierType.DATABASE)) { + log.error("Failed to export dataset: identifier type is database"); + throw new FormatNotAvailableException("Failed to export dataset: identifier type is database"); } - final String resource = identifierService.exportBibliography(identifier, style); - log.debug("find identifier resulted in resource {}", resource); - return ResponseEntity.ok(resource); + final InputStreamResource resource3; + resource3 = identifierService.exportResource(identifier); + log.debug("find identifier resulted in resource {}", resource3); + return ResponseEntity.ok(resource3); + case "text/xml": + log.trace("accept header matches xml"); + final InputStreamResource resource4 = identifierService.exportMetadata(identifier); + log.debug("find identifier resulted in resource {}", resource4); + return ResponseEntity.ok(resource4); + } + final Pattern regex = Pattern.compile("text\\/bibliography(; ?style=(apa|ieee|bibtex))?"); + final Matcher matcher = regex.matcher(accept); + if (matcher.find()) { + log.trace("accept header matches bibliography"); + final BibliographyTypeDto style; + if (matcher.group(2) != null) { + style = BibliographyTypeDto.valueOf(matcher.group(2).toUpperCase()); + log.trace("bibliography style matches {}", style); + } else { + style = BibliographyTypeDto.APA; + log.trace("no bibliography style provided, default: {}", style); } - } else { - log.trace("no accept header present"); + final String resource = identifierService.exportBibliography(identifier, style); + log.debug("find identifier resulted in resource {}", resource); + return ResponseEntity.ok(resource); } final HttpHeaders headers = new HttpHeaders(); final String url = metadataMapper.identifierToLocationUrl(endpointConfig.getWebsiteUrl(), identifier); @@ -351,9 +348,9 @@ public class IdentifierEndpoint { throws SearchServiceException, DatabaseNotFoundException, SearchServiceConnectionException, MalformedException, DataServiceConnectionException, IdentifierNotFoundException, ExternalServiceException { log.debug("endpoint publish identifier, identifierId={}", identifierId); - identifierService.find(identifierId); + final Identifier identifier = identifierService.find(identifierId); return ResponseEntity.status(HttpStatus.CREATED) - .body(metadataMapper.identifierToIdentifierDto(identifierService.publish(identifierId))); + .body(metadataMapper.identifierToIdentifierDto(identifierService.publish(identifier))); } @PutMapping("/{identifierId}") @@ -405,10 +402,10 @@ public class IdentifierEndpoint { log.debug("endpoint save identifier, identifierId={}, data.id={}, principal.name={}", identifierId, data.getId(), principal.getName()); final Database database = databaseService.findById(data.getDatabaseId()); - final User user = userService.findByUsername(principal.getName()); + final User caller = userService.findByUsername(principal.getName()); final Identifier identifier = identifierService.find(identifierId); /* check owner */ - if (!identifier.getOwner().equals(user) && !UserUtil.hasRole(principal, "create-foreign-identifier")) { + if (!identifier.getOwner().getId().equals(caller.getId()) && !UserUtil.hasRole(principal, "create-foreign-identifier")) { log.error("Failed to save identifier: foreign user"); throw new NotAllowedException("Failed to save identifier: foreign user"); } @@ -418,9 +415,8 @@ public class IdentifierEndpoint { throw new MalformedException("Failed to save identifier: publication date is invalid"); } /* check access */ - DatabaseAccess access = null; try { - access = accessService.find(database, user); + final DatabaseAccess access = accessService.find(database, caller); log.trace("found access: {}", access); } catch (AccessNotFoundException e) { if (!UserUtil.hasRole(principal, "create-foreign-identifier")) { @@ -434,22 +430,12 @@ public class IdentifierEndpoint { log.error("Failed to save view identifier: only parameters database_id & view_id must be present"); throw new MalformedException("Failed to save view identifier: only parameters database_id & view_id must be present"); } - final View view = viewService.findById(database, data.getViewId()); - if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(view.getOwner(), principal, access, "create-foreign-identifier")) { - log.error("Failed to save view identifier: insufficient access or role"); - throw new MalformedException("Failed to save view identifier: insufficient access or role"); - } } case TABLE -> { if (data.getQueryId() != null || data.getViewId() != null || data.getTableId() == null) { log.error("Failed to save table identifier: only parameters database_id & table_id must be present"); throw new MalformedException("Failed to save table identifier: only parameters database_id & table_id must be present"); } - final Table table = tableService.findById(data.getDatabaseId(), data.getTableId()); - if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(table.getOwner(), principal, access, "create-foreign-identifier")) { - log.error("Failed to save table identifier: insufficient access or role"); - throw new MalformedException("Failed to save table identifier: insufficient access or role"); - } } case SUBSET -> { if (data.getQueryId() == null || data.getViewId() != null || data.getTableId() != null) { @@ -457,26 +443,16 @@ public class IdentifierEndpoint { throw new MalformedException("Failed to save subset identifier: only parameters database_id & query_id must be present"); } log.debug("retrieving subset from data service: data.database_id={}, data.query_id={}", data.getDatabaseId(), data.getQueryId()); - final QueryDto query = dataServiceGateway.findQuery(data.getDatabaseId(), data.getQueryId()); - final User queryCreator = userService.findById(query.getOwner().getId()); - if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(queryCreator, principal, access, "create-foreign-identifier")) { - log.error("Failed to create subset identifier: insufficient access or role"); - throw new MalformedException("Failed to create subset identifier: insufficient access or role"); - } } case DATABASE -> { if (data.getQueryId() != null || data.getViewId() != null || data.getTableId() != null) { log.error("Failed to save database identifier: only parameters database_id must be present"); throw new MalformedException("Failed to save database identifier: only parameters database_id must be present"); } - if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(database.getOwner(), principal, access, "create-foreign-identifier")) { - log.error("Failed to save database identifier: insufficient access or role"); - throw new MalformedException("Failed to save database identifier: insufficient access or role"); - } } } return ResponseEntity.accepted() - .body(metadataMapper.identifierToIdentifierDto(identifierService.save(database, user, data))); + .body(metadataMapper.identifierToIdentifierDto(identifierService.save(database, caller, data))); } @PostMapping @@ -525,18 +501,17 @@ public class IdentifierEndpoint { IdentifierNotFoundException, ViewNotFoundException, ExternalServiceException { log.debug("endpoint create identifier, data.databaseId={}", data.getDatabaseId()); final Database database = databaseService.findById(data.getDatabaseId()); - final User user = userService.findByUsername(principal.getName()); + final User caller = userService.findByUsername(principal.getName()); /* check access */ try { - final DatabaseAccess access = accessService.find(database, user); - log.trace("found access: {}", access.getType()); + accessService.find(database, caller); } catch (AccessNotFoundException e) { if (!UserUtil.hasRole(principal, "create-foreign-identifier")) { log.error("Failed to create identifier: insufficient role"); throw new NotAllowedException("Failed to create identifier: insufficient role"); } } - final Identifier identifier = identifierService.create(database, user, data); + final Identifier identifier = identifierService.create(database, caller, data); return ResponseEntity.status(HttpStatus.CREATED) .body(metadataMapper.identifierToIdentifierDto(identifier)); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java index 088dc2981b94671d2b895754f411b75856eaafb3..2a9dd568703c03932d3a2f20a57bb49b19433fbc 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java @@ -31,7 +31,6 @@ import org.springframework.web.bind.annotation.*; import java.security.Principal; import java.util.List; -import java.util.stream.Collectors; @Log4j2 @RestController @@ -97,11 +96,7 @@ public class ImageEndpoint { public ResponseEntity<ImageDto> create(@Valid @RequestBody ImageCreateDto data, @NotNull Principal principal) throws ImageAlreadyExistsException, ImageInvalidException { - log.debug("endpoint create image, data={}", data); - if (data.getDefaultPort() == null) { - log.error("Failed to create image, default port is null"); - throw new ImageInvalidException("Failed to create image, default port is null"); - } + log.debug("endpoint create image, data={}, principal.name={}", data, principal.getName()); final ContainerImage image = imageService.create(data, principal); final ImageDto dto = metadataMapper.containerImageToImageDto(image); log.trace("create image resulted in image {}", dto); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java index 886db20df0d917f36e13e7f36c669259a0b5c4d5..fbfd40e6289ef20d20ae2ade97b08b9e47f96d96 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java @@ -18,7 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -97,9 +100,8 @@ public class MetadataEndpoint { log.error("Failed to get record: Identifier is empty"); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(metadataService.error(OaiErrorType.NO_RECORDS_MATCH)); - } else if (supportedIdentifierPrefixes.stream().noneMatch(identifierPrefix -> parameters.getIdentifier().startsWith(identifierPrefix)) - || parameters.getIdentifier().indexOf(':') > 3) { - log.error("Failed to get record: Identifier does not match supported prefixes {}", supportedIdentifierPrefixes); + } else if (supportedIdentifierPrefixes.stream().noneMatch(identifierPrefix -> parameters.getIdentifier().startsWith(identifierPrefix))) { + log.error("Failed to get record: Identifier does not match supported identifier prefixes {}", supportedIdentifierPrefixes); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(metadataService.error(OaiErrorType.NO_RECORDS_MATCH)); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index a517c39d10f9c0463a756239c40fa14818d3a6b2..822581bb991786467123b7adde5e35c1e6cde6e2 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -112,7 +112,7 @@ public class TableEndpoint { @PreAuthorize("hasAuthority('table-semantic-analyse')") @Observed(name = "dbrepo_semantic_table_analyse") @Operation(summary = "Suggest semantics", - description = "Suggests semantic concepts for a table. Requires role `table-semantic-analyse`.", + description = "Suggests semantic concepts for a table. This action can only be performed by the table owner. Requires role `table-semantic-analyse`.", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -125,6 +125,11 @@ public class TableEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not the table owner.", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", description = "Failed to find database/table in metadata database", content = {@Content( @@ -142,13 +147,19 @@ public class TableEndpoint { schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<List<EntityDto>> analyseTable(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId) - throws MalformedException, TableNotFoundException, DatabaseNotFoundException { - log.debug("endpoint analyse table semantics, databaseId={}, tableId={}", databaseId, tableId); - final Table table = tableService.findById(databaseId, tableId); - final List<EntityDto> dtos = entityService.suggestByTable(table); + @NotNull @PathVariable("tableId") Long tableId, + @NotNull Principal principal) + throws MalformedException, TableNotFoundException, DatabaseNotFoundException, NotAllowedException { + log.debug("endpoint analyse table semantics, databaseId={}, tableId={}, principal.name={}", databaseId, tableId, + principal); + final Database database = databaseService.findById(databaseId); + final Table table = tableService.findById(database, tableId); + if (!table.getOwner().getUsername().equals(principal.getName())) { + log.error("Failed to analyse table semantics: not owner"); + throw new NotAllowedException("Failed to analyse table semantics: not owner"); + } return ResponseEntity.ok() - .body(dtos); + .body(entityService.suggestByTable(table)); } @PutMapping("/{tableId}/statistic") @@ -156,18 +167,23 @@ public class TableEndpoint { @PreAuthorize("hasAuthority('update-table-statistic')") @Observed(name = "dbrepo_statistic_table_update") @Operation(summary = "Update statistics", - description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. Requires role `update-table-statistic`.", + description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. This action can only be performed by the table owner. Requires role `update-table-statistic`.", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", description = "Updated table statistics successfully"), - @ApiResponse(responseCode = "404", - description = "Failed to find database/table in metadata database", + @ApiResponse(responseCode = "400", + description = "Failed to map column statistic to known columns", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "400", - description = "Failed to map column statistic to known columns", + @ApiResponse(responseCode = "403", + description = "Not the owner", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database/table in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -183,11 +199,18 @@ public class TableEndpoint { schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> updateStatistic(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId) - throws TableNotFoundException, DatabaseNotFoundException, SearchServiceException, + @NotNull @PathVariable("tableId") Long tableId, + @NotNull Principal principal) + throws TableNotFoundException, DatabaseNotFoundException, SearchServiceException, NotAllowedException, SearchServiceConnectionException, MalformedException, DataServiceException, DataServiceConnectionException { - log.debug("endpoint update table statistics, databaseId={}, tableId={}", databaseId, tableId); - final Table table = tableService.findById(databaseId, tableId); + log.debug("endpoint update table statistics, databaseId={}, tableId={}, principal.name={}", databaseId, tableId, + principal.getName()); + final Database database = databaseService.findById(databaseId); + final Table table = tableService.findById(database, tableId); + if (!table.getOwner().getUsername().equals(principal.getName())) { + log.error("Failed to update table statistics: not owner"); + throw new NotAllowedException("Failed to update table statistics: not owner"); + } tableService.updateStatistics(table); return ResponseEntity.accepted() .build(); @@ -232,17 +255,19 @@ public class TableEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<ColumnDto> update(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId, - @NotNull @PathVariable("columnId") Long columnId, - @NotNull @Valid @RequestBody ColumnSemanticsUpdateDto updateDto, - @NotNull Principal principal) throws NotAllowedException, + public ResponseEntity<ColumnDto> updateColumn(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("tableId") Long tableId, + @NotNull @PathVariable("columnId") Long columnId, + @NotNull @Valid @RequestBody ColumnSemanticsUpdateDto updateDto, + @NotNull Principal principal) throws NotAllowedException, MalformedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException, OntologyNotFoundException, SemanticEntityNotFoundException { - log.debug("endpoint update table, databaseId={}, tableId={}, columnId={}", databaseId, tableId, columnId); + log.debug("endpoint update table, databaseId={}, tableId={}, columnId={}, principal.name={}", databaseId, + tableId, columnId, principal.getName()); + final Database database = databaseService.findById(databaseId); final User user = userService.findByUsername(principal.getName()); - final Table table = tableService.findById(databaseId, tableId); + final Table table = tableService.findById(database, tableId); if (!UserUtil.hasRole(principal, "modify-foreign-table-column-semantics")) { endpointValidator.validateOnlyAccess(table.getDatabase(), principal, true); endpointValidator.validateOnlyOwnerOrWriteAll(table, user); @@ -287,10 +312,13 @@ public class TableEndpoint { }) public ResponseEntity<List<TableColumnEntityDto>> analyseTableColumn(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("tableId") Long tableId, - @NotNull @PathVariable("columnId") Long columnId) + @NotNull @PathVariable("columnId") Long columnId, + @NotNull Principal principal) throws MalformedException, TableNotFoundException, DatabaseNotFoundException { - log.debug("endpoint analyse table column semantics, databaseId={}, tableId={}, columnId={}", databaseId, tableId, columnId); - final Table table = tableService.findById(databaseId, tableId); + log.debug("endpoint analyse table column semantics, databaseId={}, tableId={}, columnId={}, principal.name={}", + databaseId, tableId, columnId, principal.getName()); + final Database database = databaseService.findById(databaseId); + final Table table = tableService.findById(database, tableId); TableColumn column = tableService.findColumnById(table, columnId); final List<TableColumnEntityDto> dtos = entityService.suggestByColumn(column); return ResponseEntity.ok() @@ -347,7 +375,8 @@ public class TableEndpoint { DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, UserNotFoundException, AccessNotFoundException, TableNotFoundException, TableExistsException, SearchServiceException, SearchServiceConnectionException, OntologyNotFoundException, SemanticEntityNotFoundException { - log.debug("endpoint create table, databaseId={}, data.name={}", databaseId, data.getName()); + log.debug("endpoint create table, databaseId={}, data.name={}, principal.name={}", databaseId, data.getName(), + principal.getName()); final Database database = databaseService.findById(databaseId); endpointValidator.validateOnlyAccess(database, principal, true); endpointValidator.validateColumnCreateConstraints(data); @@ -403,10 +432,11 @@ public class TableEndpoint { @NotNull Principal principal) throws NotAllowedException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException, SearchServiceConnectionException { - log.debug("endpoint update table, databaseId={}, data.is_public={}, data.is_schema_public={}", databaseId, - data.getIsPublic(), data.getIsSchemaPublic()); - final Table table = tableService.findById(databaseId, tableId); - if (!table.getOwner().equals(principal)) { + log.debug("endpoint update table, databaseId={}, data.is_public={}, data.is_schema_public={}, principal.name={}", + databaseId, data.getIsPublic(), data.getIsSchemaPublic(), principal.getName()); + final Database database = databaseService.findById(databaseId); + final Table table = tableService.findById(database, tableId); + if (!table.getOwner().getUsername().equals(principal.getName())) { log.error("Failed to update table: not owner"); throw new NotAllowedException("Failed to update table: not owner"); } @@ -462,7 +492,8 @@ public class TableEndpoint { Principal principal) throws DataServiceException, DataServiceConnectionException, TableNotFoundException, DatabaseNotFoundException, QueueNotFoundException { log.debug("endpoint find table, databaseId={}, tableId={}", databaseId, tableId); - final Table table = tableService.findById(databaseId, tableId); + final Database database = databaseService.findById(databaseId); + final Table table = tableService.findById(database, tableId); boolean hasAccess = UserUtil.isSystem(principal); boolean isOwner = false; try { @@ -470,7 +501,7 @@ public class TableEndpoint { final User user = userService.findByUsername(principal.getName()); accessService.find(table.getDatabase(), user); hasAccess = true; - isOwner = table.getOwner().equals(user); + isOwner = table.getOwner().getId().equals(user.getId()); } } catch (UserNotFoundException | AccessNotFoundException e) { /* ignore */ @@ -537,10 +568,12 @@ public class TableEndpoint { @NotNull Principal principal) throws NotAllowedException, DataServiceException, DataServiceConnectionException, TableNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { - log.debug("endpoint delete table, databaseId={}, tableId={}", databaseId, tableId); - final Table table = tableService.findById(databaseId, tableId); + log.debug("endpoint delete table, databaseId={}, tableId={}, principal.name={}", databaseId, tableId, + principal.getName()); + final Database database = databaseService.findById(databaseId); + final Table table = tableService.findById(database, tableId); /* roles */ - if (!table.getOwner().equals(principal) && !UserUtil.hasRole(principal, "delete-foreign-table")) { + if (!table.getOwner().getUsername().equals(principal.getName()) && !UserUtil.hasRole(principal, "delete-foreign-table")) { log.error("Failed to delete table: not owned by current user"); throw new NotAllowedException("Failed to delete table: not owned by current user"); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index ca8159fd536ba0f55aefeb418479836b589192eb..151169c2446f2bc699cb108f56623fbb6a6a3fba 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -205,7 +205,7 @@ public class UserEndpoint { .password(data.getPassword()) .build(); final at.tuwien.api.keycloak.UserDto user = authenticationService.findByUsername(data.getUsername()); - if (user.getAttributes().getLdapId().length != 1) { + if (user.getAttributes().getLdapId() == null || user.getAttributes().getLdapId().length != 1) { log.error("Failed to map ldap id for user with username: {}", data.getUsername()); throw new UserNotFoundException("Failed to map ldap id"); } @@ -281,7 +281,7 @@ public class UserEndpoint { log.debug("endpoint find a user, userId={}, principal.name={}", userId, principal.getName()); /* check */ final User user = userService.findById(userId); - if (!user.equals(principal)) { + if (!user.getUsername().equals(principal.getName())) { if (!UserUtil.hasRole(principal, "find-foreign-user")) { log.error("Failed to find user: foreign user"); throw new NotAllowedException("Failed to find user: foreign user"); @@ -332,13 +332,12 @@ public class UserEndpoint { @NotNull Principal principal) throws NotAllowedException, UserNotFoundException, DatabaseNotFoundException { log.debug("endpoint modify a user, userId={}, data={}", userId, data); - User user = userService.findById(userId); - if (!user.equals(principal)) { - log.error("Failed to modify user: not current user"); - throw new NotAllowedException("Failed to modify user: not current user"); + final User user = userService.findById(userId); + if (!user.getUsername().equals(principal.getName())) { + log.error("Failed to modify user: not current user {}", user.getId()); + throw new NotAllowedException("Failed to modify user: not current user " + user.getId()); } - user = userService.modify(user, data); - final UserDto dto = userMapper.userToUserDto(user); + final UserDto dto = userMapper.userToUserDto(userService.modify(user, data)); return ResponseEntity.accepted() .body(dto); } @@ -386,7 +385,7 @@ public class UserEndpoint { DataServiceConnectionException, CredentialsInvalidException { log.debug("endpoint modify a user password, userId={}", userId); final User user = userService.findById(userId); - if (!user.equals(principal)) { + if (!user.getUsername().equals(principal.getName())) { log.error("Failed to modify user password: not current user"); throw new NotAllowedException("Failed to modify user password: not current user"); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index 75958f5bde9f8aca33cf1e517fab437d376866cf..012206289e19f654cb8154668aee2dac598b61b0 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -141,14 +141,14 @@ public class ViewEndpoint { UserNotFoundException, SearchServiceException, SearchServiceConnectionException { log.debug("endpoint create view, databaseId={}, data={}", databaseId, data); final Database database = databaseService.findById(databaseId); - if (!database.getOwner().equals(principal)) { + final User caller = userService.findByUsername(principal.getName()); + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to create view: not the database owner"); throw new NotAllowedException("Failed to create view: not the database owner"); } - final User user = userService.findByUsername(principal.getName()); log.trace("create view for database {}", database); final View view; - view = viewService.create(database, user, data); + view = viewService.create(database, caller, data); final ViewBriefDto dto = metadataMapper.viewToViewBriefDto(view); return ResponseEntity.status(HttpStatus.CREATED) .body(dto); @@ -256,9 +256,9 @@ public class ViewEndpoint { SearchServiceConnectionException { log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId); final Database database = databaseService.findById(databaseId); - if (!database.getOwner().equals(principal)) { - log.error("Failed to delete view: not the database owner"); - throw new NotAllowedException("Failed to delete view: not the database owner"); + if (!database.getOwner().getUsername().equals(principal.getName())) { + log.error("Failed to delete view: not the database owner {}", database.getOwner().getId()); + throw new NotAllowedException("Failed to delete view: not the database owner " + database.getOwner().getId()); } final View view = viewService.findById(database, viewId); viewService.delete(view); @@ -311,7 +311,7 @@ public class ViewEndpoint { log.debug("endpoint update view, databaseId={}, viewId={}", databaseId, viewId); final Database database = databaseService.findById(databaseId); final View view = viewService.findById(database, viewId); - if (!database.getOwner().equals(principal) && !view.getOwner().equals(principal)) { + if (!database.getOwner().getUsername().equals(principal.getName()) && !view.getOwner().getUsername().equals(principal.getName())) { log.error("Failed to update view: not the database- or view owner"); throw new NotAllowedException("Failed to update view: not the database- or view owner"); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java index 75c277a3b9699a722a5d43a6eb6548a809de0406..70f2e4e420eb104b7e76caaa702ed23850fe9565 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java @@ -176,7 +176,7 @@ public class EndpointValidator { log.error("validation failed: access is null"); return false; } - if (owner.equals(principal) && (access.getType().equals(AccessType.WRITE_ALL) || access.getType().equals(AccessType.WRITE_OWN))) { + if (owner.getUsername().equals(principal.getName()) && (access.getType().equals(AccessType.WRITE_ALL) || access.getType().equals(AccessType.WRITE_OWN))) { log.debug("validation passed: user {} matches owner {} and has write access {}", principal.getName(), owner.getUsername(), access.getType()); return true; } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java index 7c6061ed1e663c27d9f2a72bc64e309eaee0ffc1..f4a700e859e68f5705475a63dbc66f2afeaeb5c4 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java @@ -7,9 +7,9 @@ import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.mapper.MetadataMapper; -import at.tuwien.repository.DatabaseRepository; -import at.tuwien.repository.UserRepository; import at.tuwien.service.AccessService; +import at.tuwien.service.DatabaseService; +import at.tuwien.service.UserService; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; @@ -20,12 +20,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; -import java.util.Optional; +import java.util.List; import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; @@ -41,10 +43,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { private AccessService accessService; @MockBean - private DatabaseRepository databaseRepository; + private DatabaseService databaseService; @MockBean - private UserRepository userRepository; + private UserService userService; @Autowired private AccessEndpoint accessEndpoint; @@ -63,7 +65,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_create(null, null, null, null); + generic_create(null, null, null, null, null); }); } @@ -73,7 +75,37 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_create(USER_2_PRINCIPAL, USER_2, USER_4_ID, USER_4); + generic_create(USER_2_PRINCIPAL, USER_2, USER_4_ID, USER_4, null); + }); + } + + @Test + @WithMockUser(username = USER_4_USERNAME) + public void create_noRole_fails() { + + /* test */ + assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + generic_create(USER_2_PRINCIPAL, USER_2, USER_4_ID, USER_4, null); + }); + } + + @Test + @WithMockUser(username = USER_4_USERNAME, authorities = {"create-database-access"}) + public void create_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_create(USER_2_PRINCIPAL, USER_2, USER_4_ID, USER_4, null); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database-access"}) + public void create_alreadyAccess_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_create(USER_1_PRINCIPAL, USER_1, USER_2_ID, USER_2, DATABASE_1_USER_2_READ_ACCESS); }); } @@ -88,7 +120,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_1_USER_1_READ_ACCESS); /* test */ - generic_create(USER_1_PRINCIPAL, USER_1, USER_2_ID, USER_2); + generic_create(USER_1_PRINCIPAL, USER_1, USER_2_ID, USER_2, null); } @Test @@ -97,7 +129,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(AccessNotFoundException.class, () -> { - generic_find(DATABASE_1_ID, DATABASE_1, null, USER_2_PRINCIPAL, USER_2_ID, USER_2); + generic_find(DATABASE_1_ID, DATABASE_1, null, USER_2_PRINCIPAL, USER_2, USER_2_ID, USER_2); }); } @@ -107,7 +139,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { AccessNotFoundException, NotAllowedException { /* test */ - generic_find(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, USER_1_PRINCIPAL, USER_1_ID, USER_1); + generic_find(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, USER_1_PRINCIPAL, USER_1, USER_1_ID, USER_1); } @Test @@ -116,17 +148,20 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - generic_find(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, USER_1_PRINCIPAL, USER_2_ID, USER_2); + generic_find(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, USER_1_PRINCIPAL, USER_1, USER_2_ID, USER_2); }); } @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"check-foreign-database-access"}) + @WithMockUser(username = USER_1_USERNAME, authorities = {"check-database-access", "check-foreign-database-access"}) public void find_hasRoleHasAccessForeign_succeeds() throws UserNotFoundException, NotAllowedException, DatabaseNotFoundException, AccessNotFoundException { + final Principal principal = new UsernamePasswordAuthenticationToken(USER_1_DETAILS, USER_1_PASSWORD, List.of( + new SimpleGrantedAuthority("check-database-access"), + new SimpleGrantedAuthority("check-foreign-database-access"))); /* test */ - generic_find(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, USER_1_PRINCIPAL, USER_1_ID, USER_1); + generic_find(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_2_READ_ACCESS, principal, USER_1, USER_2_ID, USER_2); } @Test @@ -159,6 +194,16 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_4_USERNAME, authorities = {"update-database-access"}) + public void update_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_update(USER_4_PRINCIPAL, USER_4, USER_1_ID, USER_1, null); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"update-database-access"}) public void update_succeeds() throws NotAllowedException, DataServiceException, DataServiceConnectionException, @@ -194,6 +239,16 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_4_USERNAME, authorities = {"delete-database-access"}) + public void revoke_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_revoke(USER_4_PRINCIPAL, USER_4, USER_1_ID, USER_1); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"delete-database-access"}) public void revoke_succeeds() throws NotAllowedException, DataServiceException, DataServiceConnectionException, @@ -213,30 +268,37 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - protected void generic_create(Principal principal, User principalUser, UUID userId, User user) + protected void generic_create(Principal principal, User principalUser, UUID userId, User user, DatabaseAccess access) throws NotAllowedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException { /* mock */ - when(databaseRepository.findById(DATABASE_1_ID)) - .thenReturn(Optional.of(DATABASE_1)); - doThrow(AccessNotFoundException.class) - .when(accessService) - .find(DATABASE_1, user); + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + if (access != null) { + when(accessService.find(DATABASE_1, user)) + .thenReturn(access); + } else { + doThrow(AccessNotFoundException.class) + .when(accessService) + .find(DATABASE_1, user); + } if (principalUser != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(principalUser)); + when(userService.findByUsername(principal.getName())) + .thenReturn(principalUser); } else { - when(userRepository.findByUsername(anyString())) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(anyString()); } if (user != null) { - when(userRepository.findById(userId)) - .thenReturn(Optional.of(user)); + when(userService.findById(userId)) + .thenReturn(user); } else { - when(userRepository.findById(any(UUID.class))) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findById(any(UUID.class)); } /* test */ @@ -246,14 +308,16 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { } protected void generic_find(Long databaseId, Database database, DatabaseAccess access, Principal principal, - UUID userId, User user) throws UserNotFoundException, DatabaseNotFoundException, - AccessNotFoundException, NotAllowedException { + User caller, UUID userId, User user) throws UserNotFoundException, + DatabaseNotFoundException, AccessNotFoundException, NotAllowedException { /* mock */ - when(databaseRepository.findById(databaseId)) - .thenReturn(Optional.of(database)); - when(userRepository.findById(userId)) - .thenReturn(Optional.of(user)); + when(userService.findByUsername(principal.getName())) + .thenReturn(caller); + when(databaseService.findById(databaseId)) + .thenReturn(database); + when(userService.findById(userId)) + .thenReturn(user); if (access != null) { log.trace("mock access {} for user with id {} for database with id {}", access.getType(), userId, databaseId); when(accessService.find(database, user)) @@ -264,10 +328,6 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .when(accessService) .find(database, user); } - if (principal != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(user)); - } /* test */ final ResponseEntity<DatabaseAccessDto> response = accessEndpoint.find(databaseId, userId, principal); @@ -287,8 +347,8 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { SearchServiceException, SearchServiceConnectionException { /* mock */ - when(databaseRepository.findById(DATABASE_1_ID)) - .thenReturn(Optional.of(DATABASE_1)); + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); if (access != null) { log.trace("mock access {} for user with id {} for database with id {}", access.getType(), userId, DATABASE_1_ID); when(accessService.find(DATABASE_1, user)) @@ -300,18 +360,20 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .find(DATABASE_1, user); } if (userId != null) { - when(userRepository.findById(userId)) - .thenReturn(Optional.of(user)); + when(userService.findById(userId)) + .thenReturn(user); } else { - when(userRepository.findById(any(UUID.class))) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findById(any(UUID.class)); } if (principal != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(principalUser)); + when(userService.findByUsername(principal.getName())) + .thenReturn(principalUser); } else { - when(userRepository.findByUsername(anyString())) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(anyString()); } /* test */ @@ -326,14 +388,14 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { SearchServiceConnectionException { /* mock */ - when(databaseRepository.findById(DATABASE_1_ID)) - .thenReturn(Optional.of(DATABASE_1)); + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); if (principal != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(principalUser)); + when(userService.findByUsername(principal.getName())) + .thenReturn(principalUser); } - when(userRepository.findById(userId)) - .thenReturn(Optional.of(user)); + when(userService.findById(userId)) + .thenReturn(user); /* test */ final ResponseEntity<?> response = accessEndpoint.revoke(DATABASE_1_ID, userId, principal); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index 9852cde936981ed222260675c248345745314317..b788fd206b962c89644d2f0e6802b1a15282627a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -5,7 +5,6 @@ import at.tuwien.entities.database.Database; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.KeycloakGateway; -import at.tuwien.repository.UserRepository; import at.tuwien.service.*; import at.tuwien.service.impl.DatabaseServiceImpl; import at.tuwien.test.AbstractUnitTest; @@ -19,13 +18,13 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; import java.util.List; -import java.util.Optional; import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; @@ -76,7 +75,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(request, null, null); }); } @@ -91,7 +90,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(request, USER_4_PRINCIPAL, USER_4); }); } @@ -125,6 +124,156 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { create_generic(request, USER_1_PRINCIPAL, USER_1); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database"}) + public void create_quotaExceeded_fails() throws UserNotFoundException, ContainerNotFoundException { + final DatabaseCreateDto request = DatabaseCreateDto.builder() + .cid(CONTAINER_4_ID) + .name(DATABASE_1_NAME) + .isPublic(DATABASE_1_PUBLIC) + .build(); + + /* mock */ + when(containerService.find(CONTAINER_4_ID)) + .thenReturn(CONTAINER_4); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(ContainerQuotaException.class, () -> { + create_generic(request, USER_1_PRINCIPAL, USER_1); + }); + } + + @Test + @WithAnonymousUser + public void refreshTableMetadata_anonymous_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, null); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshTableMetadata_noRole_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"find-database"}) + public void refreshTableMetadata_notOwner_fails() throws UserNotFoundException, TableNotFoundException, + SearchServiceException, MalformedException, DataServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + when(databaseService.updateTableMetadata(any(Database.class))) + .thenReturn(DATABASE_1); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) + public void refreshTableMetadata_succeeds() throws UserNotFoundException, TableNotFoundException, + SearchServiceException, MalformedException, DataServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException, NotAllowedException, + QueryNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + when(databaseService.updateTableMetadata(any(Database.class))) + .thenReturn(DATABASE_1); + + /* test */ + final ResponseEntity<DatabaseDto> response = databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) + public void refreshViewMetadata_succeeds() throws UserNotFoundException, SearchServiceException, + NotAllowedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + when(databaseService.updateViewMetadata(any(Database.class))) + .thenReturn(DATABASE_1); + + /* test */ + final ResponseEntity<DatabaseDto> response = databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"find-database"}) + public void refreshViewMetadata_notOwner_fails() throws UserNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshViewMetadata_noRole_fails() throws UserNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + }); + } + + @Test + @WithAnonymousUser + public void refreshViewMetadata_anonymous_fails() throws UserNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, null); + }); + } + @Test @WithAnonymousUser public void list_anonymous_succeeds() throws DatabaseNotFoundException { @@ -182,7 +331,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { visibility_generic(DATABASE_1_ID, DATABASE_1, request, null); }); } @@ -214,7 +363,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { visibility_generic(DATABASE_1_ID, DATABASE_1, request, USER_4_PRINCIPAL); }); } @@ -237,21 +386,40 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { } @Test - @WithMockUser(username = USER_4_USERNAME) + @WithMockUser(username = USER_3_USERNAME) public void modifyImage_noRole_fails() { final DatabaseModifyImageDto request = DatabaseModifyImageDto.builder() .key("s3key_here") .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - databaseEndpoint.modifyImage(DATABASE_3_ID, request, USER_4_PRINCIPAL); + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.modifyImage(DATABASE_3_ID, request, USER_3_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-database-image"}) + public void modifyImage_notOwner_fails() throws DatabaseNotFoundException, UserNotFoundException { + final DatabaseModifyImageDto request = DatabaseModifyImageDto.builder() + .key("s3key_here") + .build(); + + /* mock */ + when(databaseService.findById(DATABASE_3_ID)) + .thenReturn(DATABASE_3); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + databaseEndpoint.modifyImage(DATABASE_3_ID, request, USER_2_PRINCIPAL); }); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-image"}) - public void modifyImage_hasRole_succeeds() throws NotAllowedException, UserNotFoundException, + public void modifyImage_succeeds() throws NotAllowedException, UserNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, StorageUnavailableException, StorageNotFoundException { final DatabaseModifyImageDto request = DatabaseModifyImageDto.builder() @@ -264,7 +432,26 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { when(userService.findByUsername(USER_1_USERNAME)) .thenReturn(USER_1); when(storageService.getBytes(request.getKey())) - .thenReturn(new byte[]{}); + .thenReturn(new byte[]{1, 2, 3, 4, 5}); + + /* test */ + databaseEndpoint.modifyImage(DATABASE_1_ID, request, USER_1_PRINCIPAL); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-image"}) + public void modifyImage_empty_succeeds() throws NotAllowedException, UserNotFoundException, + DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, + StorageUnavailableException, StorageNotFoundException { + final DatabaseModifyImageDto request = DatabaseModifyImageDto.builder() + .key(null) + .build(); + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); /* test */ databaseEndpoint.modifyImage(DATABASE_1_ID, request, USER_1_PRINCIPAL); @@ -278,7 +465,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { databaseEndpoint.transfer(DATABASE_3_ID, request, USER_4_PRINCIPAL); }); } @@ -403,7 +590,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { final DatabaseDto response = findById_generic(DATABASE_1_ID, DATABASE_1, USER_1_PRINCIPAL); final List<DatabaseAccessDto> accessList = response.getAccesses(); assertNotNull(accessList); - assertEquals(2, accessList.size()); + assertEquals(3, accessList.size()); } @Test @@ -489,6 +676,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { doNothing() .when(messageQueueService) .setVirtualHostPermissions(user); + when(databaseService.findById(anyLong())) + .thenReturn(DATABASE_1); /* test */ final ResponseEntity<DatabaseDto> response = databaseEndpoint.create(data, principal); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java index 8a98bf11f5035e5e746e3fccfec77691d70a9ff7..ce560cb646342f627a3e78d09a11f77a59c1223f 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java @@ -1,6 +1,7 @@ package at.tuwien.endpoints; import at.tuwien.api.identifier.*; +import at.tuwien.api.identifier.ld.LdDatasetDto; import at.tuwien.config.EndpointConfig; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; @@ -9,25 +10,27 @@ import at.tuwien.entities.identifier.IdentifierType; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; -import at.tuwien.service.AccessService; -import at.tuwien.service.DatabaseService; -import at.tuwien.service.IdentifierService; -import at.tuwien.service.UserService; +import at.tuwien.service.*; import at.tuwien.test.AbstractUnitTest; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -38,6 +41,7 @@ import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.security.Principal; import java.util.List; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -62,6 +66,12 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { @MockBean private UserService userService; + @MockBean + private ViewService viewService; + + @MockBean + private TableService tableService; + @Autowired private IdentifierEndpoint identifierEndpoint; @@ -71,11 +81,162 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { @Autowired private EndpointConfig endpointConfig; + public static Stream<Arguments> save_parameters() { + return Stream.of( + Arguments.arguments("foreign_subset", DATABASE_2_ID, DATABASE_2, null, IDENTIFIER_5, IDENTIFIER_5_SAVE_DTO, USER_1_PRINCIPAL, USER_1), + Arguments.arguments("foreign_database", DATABASE_1_ID, DATABASE_1, null, IDENTIFIER_1, IDENTIFIER_1_SAVE_DTO, USER_1_PRINCIPAL, USER_1), + Arguments.arguments("foreign_view", DATABASE_1_ID, DATABASE_1, null, IDENTIFIER_3, IDENTIFIER_3_SAVE_DTO, USER_1_PRINCIPAL, USER_1), + Arguments.arguments("foreign_table", DATABASE_1_ID, DATABASE_1, null, IDENTIFIER_4, IDENTIFIER_4_SAVE_DTO, USER_1_PRINCIPAL, USER_1) + ); + } + + public static Stream<Arguments> malformedDatabase_parameters() { + return Stream.of( + Arguments.arguments("queryId", 9999L, null, null), + Arguments.arguments("viewId", null, 9999L, null), + Arguments.arguments("tableId", null, null, 9999L) + ); + } + + public static Stream<Arguments> malformedSubset_parameters() { + return Stream.of( + Arguments.arguments("queryId", null, null, null), + Arguments.arguments("viewId", null, 9999L, null), + Arguments.arguments("tableId", null, null, 9999L) + ); + } + + public static Stream<Arguments> malformedView_parameters() { + return Stream.of( + Arguments.arguments("queryId", 9999L, null, null), + Arguments.arguments("viewId", null, null, null), + Arguments.arguments("tableId", null, null, 9999L) + ); + } + + public static Stream<Arguments> malformedTable_parameters() { + return Stream.of( + Arguments.arguments("queryId", 9999L, null, null), + Arguments.arguments("viewId", null, 9999L, null), + Arguments.arguments("tableId", null, null, null) + ); + } + + public static Stream<Arguments> findAll_filterDatabase_parameters() { + return Stream.of( + Arguments.arguments("dbid", DATABASE_1_ID, null, null, null, 4), + Arguments.arguments("qid", DATABASE_1_ID, QUERY_1_ID, null, null, 1), + Arguments.arguments("vid", DATABASE_1_ID, null, VIEW_1_ID, null, 1), + Arguments.arguments("tid", DATABASE_1_ID, null, null, TABLE_1_ID, 1) + ); + } + + public static Stream<Arguments> save_foreign_parameters() { + return Stream.of( + Arguments.arguments("view", IDENTIFIER_3, IDENTIFIER_3_SAVE_DTO), + Arguments.arguments("table", IDENTIFIER_4, IDENTIFIER_4_SAVE_DTO), + Arguments.arguments("subset", IDENTIFIER_2, IDENTIFIER_2_SAVE_DTO) + ); + } + @BeforeEach public void beforeEach() { genesis(); } + @Test + @WithAnonymousUser + public void findAll_empty_succeeds() throws FormatNotAvailableException { + + /* mock */ + when(identifierService.findAll()) + .thenReturn(List.of()); + + /* test */ + final ResponseEntity<?> response = identifierEndpoint.findAll(null, null, null, null, "application/json"); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + final List<IdentifierBriefDto> identifiers = (List<IdentifierBriefDto>) response.getBody(); + assertNotNull(identifiers); + assertEquals(0, identifiers.size()); + } + + @ParameterizedTest + @MethodSource("findAll_filterDatabase_parameters") + @WithAnonymousUser + public void findAll_filterDatabase_succeeds(String name, Long databaseId, Long queryId, Long viewId, Long tableId, + Integer expectedSize) throws FormatNotAvailableException, + ViewNotFoundException, TableNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(identifierService.findAll()) + .thenReturn(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4, IDENTIFIER_5, IDENTIFIER_6, IDENTIFIER_7)); + if (viewId != null) { + when(viewService.findById(DATABASE_1, VIEW_1_ID)) + .thenReturn(VIEW_1); + } + if (tableId != null) { + when(tableService.findById(DATABASE_1, TABLE_1_ID)) + .thenReturn(TABLE_1); + } + + /* test */ + final ResponseEntity<?> response = identifierEndpoint.findAll(databaseId, queryId, viewId, tableId, "application/json"); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + final List<IdentifierBriefDto> identifiers = (List<IdentifierBriefDto>) response.getBody(); + assertNotNull(identifiers); + assertEquals(expectedSize, identifiers.size()); + } + + @Test + @WithAnonymousUser + public void findAll_json_succeeds() throws FormatNotAvailableException { + + /* mock */ + when(identifierService.findAll()) + .thenReturn(List.of(IDENTIFIER_1)); + + /* test */ + final ResponseEntity<?> response = identifierEndpoint.findAll(null, null, null, null, "application/json"); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + final List<IdentifierBriefDto> identifiers = (List<IdentifierBriefDto>) response.getBody(); + assertNotNull(identifiers); + assertEquals(1, identifiers.size()); + } + + @Test + @WithAnonymousUser + public void findAll_jsonLd_succeeds() throws FormatNotAvailableException { + + /* mock */ + when(identifierService.findAll()) + .thenReturn(List.of(IDENTIFIER_1)); + + /* test */ + final ResponseEntity<?> response = identifierEndpoint.findAll(null, null, null, null, "application/ld+json"); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + final List<LdDatasetDto> identifiers = (List<LdDatasetDto>) response.getBody(); + assertNotNull(identifiers); + assertEquals(1, identifiers.size()); + } + + @Test + @WithAnonymousUser + public void findAll_format_fails() { + + /* mock */ + when(identifierService.findAll()) + .thenReturn(List.of(IDENTIFIER_1)); + + /* test */ + assertThrows(FormatNotAvailableException.class, () -> { + identifierEndpoint.findAll(null, null, null, null, "text/csv"); + }); + } + @Test @WithAnonymousUser public void find_json0_succeeds() throws IOException, MalformedException, DataServiceException, @@ -179,47 +340,6 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { assertEquals(inputStreamToString(compare.getInputStream()), inputStreamToString(body.getInputStream())); } - @Test - @Disabled("not testable with xml") - public void find_xml0_succeeds() throws IOException, MalformedException, DataServiceException, - DataServiceConnectionException, IdentifierNotFoundException, QueryNotFoundException, - FormatNotAvailableException { - final String accept = "text/xml"; - final InputStreamResource compare = new InputStreamResource(FileUtils.openInputStream(new File("src/test/resources/xml/metadata0.xml"))); - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = identifierEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertEquals(inputStreamToString(compare.getInputStream()), inputStreamToString(body.getInputStream())); - } - - @Test - @Disabled("not testable with xml") - public void find_xml1_succeeds() throws IOException, MalformedException, DataServiceException, - DataServiceConnectionException, QueryNotFoundException, IdentifierNotFoundException, - FormatNotAvailableException { - final String accept = "text/xml"; - final InputStreamResource compare = new InputStreamResource(FileUtils.openInputStream(new File("src/test/resources/xml/metadata1.xml"))); - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = identifierEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertEquals(inputStreamToString(body.getInputStream()), inputStreamToString(compare.getInputStream())); - - } - @Test @WithAnonymousUser public void find_bibliography_succeeds() throws IOException, MalformedException, DataServiceException, @@ -345,7 +465,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { StandardCharsets.UTF_8); /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.APA)) + when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.APA))) .thenReturn(compare); when(identifierService.find(IDENTIFIER_1_ID)) .thenReturn(IDENTIFIER_1_WITH_DOI); @@ -437,7 +557,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { StandardCharsets.UTF_8); /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.IEEE)) + when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.IEEE))) .thenReturn(compare); when(identifierService.find(IDENTIFIER_1_ID)) .thenReturn(IDENTIFIER_1_WITH_DOI); @@ -529,7 +649,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { StandardCharsets.UTF_8); /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.BIBTEX)) + when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.BIBTEX))) .thenReturn(compare); when(identifierService.find(IDENTIFIER_1_ID)) .thenReturn(IDENTIFIER_1_WITH_DOI); @@ -542,6 +662,52 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { assertEquals(compare, body); } + @Test + @WithAnonymousUser + public void find_jsonLd_succeeds() throws MalformedException, DataServiceException, DataServiceConnectionException, + QueryNotFoundException, IdentifierNotFoundException, FormatNotAvailableException { + final String accept = "application/ld+json"; + + /* mock */ + when(identifierService.find(IDENTIFIER_1_ID)) + .thenReturn(IDENTIFIER_1); + + /* test */ + final ResponseEntity<?> response = identifierEndpoint.find(IDENTIFIER_1_ID, accept); + assertEquals(HttpStatus.OK, response.getStatusCode()); + final LdDatasetDto body = (LdDatasetDto) response.getBody(); + assertNotNull(body); + } + + @Test + @WithAnonymousUser + public void find_jsonDatabase_fails() throws IdentifierNotFoundException { + final String accept = "text/csv"; + + /* mock */ + when(identifierService.find(IDENTIFIER_7_ID)) + .thenReturn(IDENTIFIER_7); + + /* test */ + assertThrows(FormatNotAvailableException.class, () -> { + identifierEndpoint.find(IDENTIFIER_7_ID, accept); + }); + } + + @Test + @WithAnonymousUser + public void find_move_succeeds() throws MalformedException, DataServiceException, DataServiceConnectionException, + QueryNotFoundException, IdentifierNotFoundException, FormatNotAvailableException { + + /* mock */ + when(identifierService.find(IDENTIFIER_1_ID)) + .thenReturn(IDENTIFIER_1); + + /* test */ + final ResponseEntity<?> response = identifierEndpoint.find(IDENTIFIER_1_ID, null); + assertEquals(HttpStatus.MOVED_PERMANENTLY, response.getStatusCode()); + } + @Test @WithAnonymousUser public void delete_anonymous_fails() { @@ -565,7 +731,118 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { SearchServiceException, SearchServiceConnectionException { /* test */ - this.generic_delete(); + generic_delete(); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-identifier"}) + public void delete_alreadyPublished_fails() throws DataServiceException, DataServiceConnectionException, + DatabaseNotFoundException, IdentifierNotFoundException, SearchServiceException, + SearchServiceConnectionException { + + /* mock */ + when(identifierService.find(IDENTIFIER_1_ID)) + .thenReturn(IDENTIFIER_1); + doNothing() + .when(identifierService) + .delete(IDENTIFIER_1); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + identifierEndpoint.delete(IDENTIFIER_1_ID); + }); + } + + @Test + @WithAnonymousUser + public void publish_anonymous_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + identifierEndpoint.publish(IDENTIFIER_1_ID); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void publish_noRole_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + identifierEndpoint.publish(IDENTIFIER_1_ID); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"publish-identifier"}) + public void publish_succeeds() throws IdentifierNotFoundException, SearchServiceException, MalformedException, + DatabaseNotFoundException, ExternalServiceException, SearchServiceConnectionException, + DataServiceConnectionException { + + /* mock */ + when(identifierService.find(IDENTIFIER_1_ID)) + .thenReturn(IDENTIFIER_1); + when(identifierService.publish(IDENTIFIER_1)) + .thenReturn(IDENTIFIER_1); + + /* test */ + final ResponseEntity<IdentifierDto> response = identifierEndpoint.publish(IDENTIFIER_1_ID); + assertEquals(HttpStatus.CREATED, response.getStatusCode()); + final IdentifierDto body = response.getBody(); + assertNotNull(body); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"publish-identifier"}) + public void publish_searchService_fails() throws IdentifierNotFoundException, SearchServiceException, MalformedException, + DatabaseNotFoundException, ExternalServiceException, SearchServiceConnectionException, + DataServiceConnectionException { + + /* mock */ + when(identifierService.find(IDENTIFIER_1_ID)) + .thenReturn(IDENTIFIER_1); + doThrow(SearchServiceException.class) + .when(identifierService) + .publish(IDENTIFIER_1); + + /* test */ + assertThrows(SearchServiceException.class, () -> { + identifierEndpoint.publish(IDENTIFIER_1_ID); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"publish-identifier"}) + public void publish_searchServiceConnection_fails() throws IdentifierNotFoundException, SearchServiceException, + MalformedException, DatabaseNotFoundException, ExternalServiceException, SearchServiceConnectionException, + DataServiceConnectionException { + + /* mock */ + when(identifierService.find(IDENTIFIER_1_ID)) + .thenReturn(IDENTIFIER_1); + doThrow(SearchServiceConnectionException.class) + .when(identifierService) + .publish(IDENTIFIER_1); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + identifierEndpoint.publish(IDENTIFIER_1_ID); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"publish-identifier"}) + public void publish_notFound_fails() throws IdentifierNotFoundException { + + /* mock */ + doThrow(IdentifierNotFoundException.class) + .when(identifierService) + .find(IDENTIFIER_1_ID); + + /* test */ + assertThrows(IdentifierNotFoundException.class, () -> { + identifierEndpoint.publish(IDENTIFIER_1_ID); + }); } @Test @@ -627,7 +904,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_hasRoleDatabase_succeeds() throws MalformedException, NotAllowedException, DataServiceException, + public void save_succeeds() throws MalformedException, NotAllowedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueryNotFoundException, IdentifierNotFoundException, ViewNotFoundException, SearchServiceException, SearchServiceConnectionException, TableNotFoundException, ExternalServiceException { @@ -638,7 +915,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_hasRoleDatabaseNoAccess_fails() { + public void save_noAccess_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { @@ -648,7 +925,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_2_USERNAME, authorities = {"create-identifier"}) - public void save_hasRoleReadAccessQuery_succeeds() throws MalformedException, NotAllowedException, + public void save_readAccessQuery_succeeds() throws MalformedException, NotAllowedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueryNotFoundException, IdentifierNotFoundException, ViewNotFoundException, SearchServiceException, SearchServiceConnectionException, TableNotFoundException, ExternalServiceException { @@ -661,11 +938,14 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { generic_save(DATABASE_2_ID, DATABASE_2, DATABASE_2_USER_1_READ_ACCESS, IDENTIFIER_5, IDENTIFIER_5_SAVE_DTO, USER_2_PRINCIPAL, USER_2); } - @Test + @ParameterizedTest + @MethodSource("malformedSubset_parameters") @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_invalidSubset_fails() { + public void save_malformedSubset_fails(String name, Long queryId, Long viewId, Long tableId) { final IdentifierSaveDto request = IdentifierSaveDto.builder() - .queryId(null) // <-- + .queryId(queryId) + .viewId(viewId) + .tableId(tableId) .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) @@ -683,21 +963,23 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { }); } - @Test + @ParameterizedTest + @MethodSource("malformedView_parameters") @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_invalidDatabase_fails() { + public void save_malformedView_fails(String name, Long queryId, Long viewId, Long tableId) { final IdentifierSaveDto request = IdentifierSaveDto.builder() - .queryId(1L) // <-- + .queryId(queryId) + .viewId(viewId) + .tableId(tableId) .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) - .relatedIdentifiers(List.of(IDENTIFIER_1_RELATED_IDENTIFIER_5_CREATE_DTO)) - .publicationDay(IDENTIFIER_1_PUBLICATION_DAY) + .relatedIdentifiers(List.of()) .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) .creators(List.of(IDENTIFIER_1_CREATOR_1_CREATE_DTO)) .publisher(IDENTIFIER_1_PUBLISHER) - .type(IdentifierTypeDto.DATABASE) + .type(IdentifierTypeDto.VIEW) .build(); /* test */ @@ -706,21 +988,48 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { }); } - @Test + @ParameterizedTest + @MethodSource("malformedTable_parameters") @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_invalidView_fails() { + public void save_malformedTable_fails(String name, Long queryId, Long viewId, Long tableId) { final IdentifierSaveDto request = IdentifierSaveDto.builder() - .tableId(1L) // <-- - .databaseId(DATABASE_1_ID) + .queryId(queryId) + .viewId(viewId) + .tableId(tableId) + .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) - .relatedIdentifiers(List.of(IDENTIFIER_1_RELATED_IDENTIFIER_5_CREATE_DTO)) - .publicationDay(IDENTIFIER_1_PUBLICATION_DAY) + .relatedIdentifiers(List.of()) .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) .creators(List.of(IDENTIFIER_1_CREATOR_1_CREATE_DTO)) .publisher(IDENTIFIER_1_PUBLISHER) - .type(IdentifierTypeDto.VIEW) + .type(IdentifierTypeDto.TABLE) + .build(); + + /* test */ + assertThrows(MalformedException.class, () -> { + generic_save(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, IDENTIFIER_1, request, USER_1_PRINCIPAL, USER_1); + }); + } + + @ParameterizedTest + @MethodSource("malformedDatabase_parameters") + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void save_malformedDatabase_fails(String name, Long queryId, Long viewId, Long tableId) { + final IdentifierSaveDto request = IdentifierSaveDto.builder() + .queryId(queryId) + .viewId(viewId) + .tableId(tableId) + .databaseId(IDENTIFIER_1_DATABASE_ID) + .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) + .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) + .relatedIdentifiers(List.of()) + .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) + .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) + .creators(List.of(IDENTIFIER_1_CREATOR_1_CREATE_DTO)) + .publisher(IDENTIFIER_1_PUBLISHER) + .type(IdentifierTypeDto.DATABASE) .build(); /* test */ @@ -731,42 +1040,40 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_foreignUser_fails() { + public void save_invalidDateDay_fails() { final IdentifierSaveDto request = IdentifierSaveDto.builder() - .viewId(9999L) // <-- - .databaseId(DATABASE_1_ID) + .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) .relatedIdentifiers(List.of(IDENTIFIER_1_RELATED_IDENTIFIER_5_CREATE_DTO)) - .publicationDay(IDENTIFIER_1_PUBLICATION_DAY) + .publicationDay(32) // <<< .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) .creators(List.of(IDENTIFIER_1_CREATOR_1_CREATE_DTO)) .publisher(IDENTIFIER_1_PUBLISHER) - .type(IdentifierTypeDto.VIEW) + .type(IdentifierTypeDto.DATABASE) .build(); /* test */ - assertThrows(NotAllowedException.class, () -> { - generic_save(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, IDENTIFIER_5, request, USER_1_PRINCIPAL, USER_1); + assertThrows(MalformedException.class, () -> { + generic_save(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, IDENTIFIER_1, request, USER_1_PRINCIPAL, USER_1); }); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_invalidTable_fails() { + public void save_invalidDateMonth_fails() { final IdentifierSaveDto request = IdentifierSaveDto.builder() - .viewId(1L) // <-- - .databaseId(DATABASE_1_ID) + .databaseId(IDENTIFIER_1_DATABASE_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) .relatedIdentifiers(List.of(IDENTIFIER_1_RELATED_IDENTIFIER_5_CREATE_DTO)) .publicationDay(IDENTIFIER_1_PUBLICATION_DAY) - .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) + .publicationMonth(13) // <<< .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) .creators(List.of(IDENTIFIER_1_CREATOR_1_CREATE_DTO)) .publisher(IDENTIFIER_1_PUBLISHER) - .type(IdentifierTypeDto.TABLE) + .type(IdentifierTypeDto.DATABASE) .build(); /* test */ @@ -775,11 +1082,27 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { }); } + @ParameterizedTest + @MethodSource("save_foreign_parameters") + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void save_foreign_fails(String name, Identifier identifier, IdentifierSaveDto data) + throws UserNotFoundException { + + /* mock */ + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_save(DATABASE_1_ID, DATABASE_1, null, identifier, data, USER_1_PRINCIPAL, USER_1); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_tableNotFound_fails() { + public void save_invalidTable_fails() { final IdentifierSaveDto request = IdentifierSaveDto.builder() - .tableId(9999L) // <-- + .viewId(1L) // <-- .databaseId(DATABASE_1_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) @@ -793,18 +1116,121 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(TableNotFoundException.class, () -> { + assertThrows(MalformedException.class, () -> { generic_save(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, IDENTIFIER_1, request, USER_1_PRINCIPAL, USER_1); }); } + @ParameterizedTest + @MethodSource("save_parameters") + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void save_noForeign_fails(String name, Long databaseId, Database database, DatabaseAccess access, + Identifier identifier, IdentifierSaveDto data, Principal principal, User user) { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_save(databaseId, database, access, identifier, data, principal, user); + }); + } + + @Test + @WithAnonymousUser + public void create_anonymous_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + identifierEndpoint.create(IDENTIFIER_1_CREATE_DTO, USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void create_noRole_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + identifierEndpoint.create(IDENTIFIER_1_CREATE_DTO, USER_1_PRINCIPAL); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void save_queryForeign_fails() { + public void create_succeeds() throws DatabaseNotFoundException, UserNotFoundException, AccessNotFoundException, + SearchServiceException, MalformedException, DataServiceException, QueryNotFoundException, + ExternalServiceException, SearchServiceConnectionException, DataServiceConnectionException, + IdentifierNotFoundException, ViewNotFoundException, NotAllowedException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + when(accessService.find(DATABASE_1, USER_1)) + .thenReturn(DATABASE_1_USER_1_READ_ACCESS); + when(identifierService.create(DATABASE_1, USER_1, IDENTIFIER_1_CREATE_DTO)) + .thenReturn(IDENTIFIER_1); + + /* test */ + final ResponseEntity<IdentifierDto> response = identifierEndpoint.create(IDENTIFIER_1_CREATE_DTO, USER_1_PRINCIPAL); + assertEquals(HttpStatus.CREATED, response.getStatusCode()); + final IdentifierDto body = response.getBody(); + assertNotNull(body); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_noAccess_fails() throws DatabaseNotFoundException, UserNotFoundException, + AccessNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + doThrow(AccessNotFoundException.class) + .when(accessService) + .find(DATABASE_1, USER_1); /* test */ assertThrows(NotAllowedException.class, () -> { - generic_save(DATABASE_2_ID, DATABASE_2, null, IDENTIFIER_5, IDENTIFIER_5_SAVE_DTO, USER_1_PRINCIPAL, USER_1); + identifierEndpoint.create(IDENTIFIER_1_CREATE_DTO, USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"create-foreign-identifier"}) + public void create_hasForeign_succeeds() throws DatabaseNotFoundException, UserNotFoundException, + AccessNotFoundException, SearchServiceException, MalformedException, NotAllowedException, + DataServiceException, QueryNotFoundException, ExternalServiceException, SearchServiceConnectionException, + DataServiceConnectionException, IdentifierNotFoundException, ViewNotFoundException { + final Principal principal = new UsernamePasswordAuthenticationToken(USER_2_DETAILS, USER_2_PASSWORD, List.of( + new SimpleGrantedAuthority("create-foreign-identifier"))); + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + doThrow(AccessNotFoundException.class) + .when(accessService) + .find(DATABASE_1, USER_2); + + /* test */ + identifierEndpoint.create(IDENTIFIER_1_CREATE_DTO, principal); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_databaseNotFound_fails() throws DatabaseNotFoundException { + + /* mock */ + doThrow(DatabaseNotFoundException.class) + .when(databaseService) + .findById(DATABASE_1_ID); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + identifierEndpoint.create(IDENTIFIER_1_CREATE_DTO, USER_1_PRINCIPAL); }); } @@ -820,6 +1246,14 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { SearchServiceConnectionException, TableNotFoundException, ExternalServiceException { /* mock */ + if (database != null) { + when(databaseService.findById(databaseId)) + .thenReturn(database); + } else { + doThrow(DatabaseNotFoundException.class) + .when(databaseService) + .findById(databaseId); + } if (access != null) { log.trace("mock access: {}", access); when(accessService.find(any(Database.class), any(User.class))) @@ -833,8 +1267,6 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { if (identifier.getType().equals(IdentifierType.SUBSET)) { when(dataServiceGateway.findQuery(databaseId, QUERY_2_ID)) .thenReturn(QUERY_2_DTO); - when(userService.findById(USER_1_ID)) - .thenReturn(USER_1); } when(identifierService.find(identifier.getId())) .thenReturn(identifier); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ImageEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ImageEndpointUnitTest.java index c5c3c24cfd37ea0986079132cf67a4e527669892..bf1b2ffa55c51e74ebb7d643d374407954bfdbd3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ImageEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ImageEndpointUnitTest.java @@ -1,13 +1,15 @@ package at.tuwien.endpoints; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.container.image.ImageBriefDto; import at.tuwien.api.container.image.ImageChangeDto; import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.api.container.image.ImageDto; import at.tuwien.entities.container.image.ContainerImage; -import at.tuwien.exception.*; +import at.tuwien.exception.ImageAlreadyExistsException; +import at.tuwien.exception.ImageInvalidException; +import at.tuwien.exception.ImageNotFoundException; import at.tuwien.service.impl.ImageServiceImpl; +import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -120,19 +122,10 @@ public class ImageEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"create-image"}) - public void create_missingEssentialInfo_fails() { - final ImageCreateDto request = ImageCreateDto.builder() - .name(IMAGE_1_NAME) - .version(IMAGE_1_VERSION) - .defaultPort(null) - .dialect(IMAGE_1_DIALECT) - .jdbcMethod(IMAGE_1_JDBC) - .build(); + public void create_succeeds() throws ImageAlreadyExistsException, ImageInvalidException { /* test */ - assertThrows(ImageInvalidException.class, () -> { - create_generic(request, USER_1_PRINCIPAL); - }); + create_generic(IMAGE_1_CREATE_DTO, USER_1_PRINCIPAL); } @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java index 59166b720076f1541774f6ed8ac3dcc816da9e9a..22516074ae83d88c5140de9e9fb0d32e575e598d 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java @@ -58,11 +58,17 @@ public class MessageEndpointUnitTest extends AbstractUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"list-maintenance-messages"}) - public void list_hasRole_succeeds() { + @WithAnonymousUser + public void list_onlyActive_succeeds() { + + /* mock */ + when(bannerMessageService.getActive()) + .thenReturn(List.of(BANNER_MESSAGE_1)); /* test */ - list_generic(); + final ResponseEntity<List<BannerMessageDto>> response = messageEndpoint.list(true); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); } @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java index 7ed994534287e13f0f3b33e0c19abcfb360e3f50..8853728d471e3649c5b5108a21ea5404e5ed1ea2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java @@ -1,9 +1,9 @@ package at.tuwien.endpoints; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.oaipmh.OaiListIdentifiersParameters; import at.tuwien.oaipmh.OaiRecordParameters; import at.tuwien.repository.IdentifierRepository; +import at.tuwien.test.AbstractUnitTest; import at.tuwien.utils.XmlUtils; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; @@ -178,6 +178,24 @@ public class MetadataEndpointUnitTest extends AbstractUnitTest { // TODO: currently no strict validation passes } + @Test + @WithAnonymousUser + public void getRecord_invalidIdentifierPrefix_succeeds() { + final OaiRecordParameters parameters = new OaiRecordParameters(); + parameters.setMetadataPrefix("oai_datacite"); + parameters.setIdentifier("ark:1"); + + /* mock */ + when(identifierRepository.findById(IDENTIFIER_1_ID)) + .thenReturn(Optional.of(IDENTIFIER_1)); + + /* test */ + final ResponseEntity<String> response = metadataEndpoint.getRecord(parameters); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final String body = response.getBody(); + assertNotNull(body); + } + @Test @WithAnonymousUser public void getRecord_notFound_fails() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java index b7af494253ebc97fa51f3b5da86f72a9515a4703..c3f276c2dfca9a557117571bfa3a147b0f8bc507 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java @@ -81,6 +81,26 @@ public class OntologyEndpointUnitTest extends AbstractUnitTest { find_generic(ONTOLOGY_1_ID, ONTOLOGY_1); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"}) + public void find_noSparql_fails() throws OntologyNotFoundException { + final Ontology mock = Ontology.builder() + .id(9999L) + .uri(ONTOLOGY_1_URI) + .uriPattern(ONTOLOGY_1_URI_PATTERN) + .sparqlEndpoint(null) // <<< + .build(); + + /* mock */ + when(ontologyService.find(9999L)) + .thenReturn(mock); + + /* test */ + assertThrows(OntologyNotFoundException.class, () -> { + ontologyEndpoint.find(9999L, null, UNIT_1_URI); + }); + } + @Test @WithAnonymousUser public void find_notFound_fails() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java index 1ceb6fd75ff22547f630c85bb7a1cbbb27bd86ab..dcc10f61a70ef663f0b4427c60f1acefba8f58ed 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java @@ -3,6 +3,7 @@ package at.tuwien.endpoints; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.TableDto; +import at.tuwien.api.database.table.TableUpdateDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; @@ -29,8 +30,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; @@ -47,7 +46,6 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) @SpringBootTest @ExtendWith(SpringExtension.class) public class TableEndpointUnitTest extends AbstractUnitTest { @@ -468,10 +466,10 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .name("Some Table") .description("Some Description") .columns(List.of(ColumnCreateDto.builder() - .name("ID") - .type(ColumnTypeDto.SERIAL) - .nullAllowed(true) // <<< - .build())) + .name("ID") + .type(ColumnTypeDto.SERIAL) + .nullAllowed(true) // <<< + .build())) .constraints(ConstraintsCreateDto.builder() .uniques(List.of(List.of("ID"))) .build()) @@ -514,7 +512,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void findById_publicAnonymous_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, + UserNotFoundException { /* test */ generic_findById(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, null, null, null); @@ -532,17 +531,19 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = "find-table") - public void findById_publicHasRoleDatabaseNotFound_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + public void findById_publicHasRoleDatabaseNotFound_fails() { /* test */ - generic_findById(DATABASE_3_ID, null, TABLE_8_ID, TABLE_8, USER_1_PRINCIPAL, USER_1, DATABASE_1_USER_1_READ_ACCESS); + assertThrows(DatabaseNotFoundException.class, () -> { + generic_findById(DATABASE_3_ID, null, TABLE_8_ID, TABLE_8, USER_1_PRINCIPAL, USER_1, DATABASE_1_USER_1_READ_ACCESS); + }); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = "find-table") public void findById_publicHasRole_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, + UserNotFoundException { /* test */ final ResponseEntity<TableDto> response = generic_findById(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, USER_1_PRINCIPAL, USER_1, DATABASE_1_USER_1_READ_ACCESS); @@ -554,7 +555,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_4_USERNAME) public void findById_publicNoRole_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, + UserNotFoundException { /* test */ generic_findById(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, USER_1_PRINCIPAL, USER_1, null); @@ -566,7 +568,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - analyseTable_generic(DATABASE_1_ID, TABLE_1_ID, TABLE_1); + analyseTable_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, null); }); } @@ -576,17 +578,17 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - analyseTable_generic(DATABASE_1_ID, TABLE_1_ID, TABLE_1); + analyseTable_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_4_PRINCIPAL); }); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"table-semantic-analyse"}) public void findAll_hasRole_succeeds() throws MalformedException, TableNotFoundException, - DatabaseNotFoundException { + DatabaseNotFoundException, NotAllowedException { /* test */ - analyseTable_generic(DATABASE_1_ID, TABLE_1_ID, TABLE_1); + analyseTable_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_1_PRINCIPAL); } @Test @@ -595,7 +597,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - analyseTableColumn_generic(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0)); + analyseTableColumn_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), null); }); } @@ -605,7 +607,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - analyseTableColumn_generic(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0)); + analyseTableColumn_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_4_PRINCIPAL); }); } @@ -615,7 +617,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { DatabaseNotFoundException { /* test */ - analyseTableColumn_generic(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0)); + analyseTableColumn_generic(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_1_PRINCIPAL); } @Test @@ -627,7 +629,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), null, null, request, null); }); } @@ -641,7 +643,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(AccessNotFoundException.class, () -> { - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, null); }); } @@ -655,7 +657,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, DATABASE_3_USER_1_READ_ACCESS); }); } @@ -671,7 +673,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, DATABASE_3_USER_1_WRITE_OWN_ACCESS); } @@ -684,7 +686,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), USER_2_PRINCIPAL, USER_2, request, DATABASE_3_USER_2_WRITE_OWN_ACCESS); }); } @@ -698,7 +700,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(TableNotFoundException.class, () -> { - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, null, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, null, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, DATABASE_3_USER_1_WRITE_OWN_ACCESS); }); } @@ -714,7 +716,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - generic_update(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_3_ID, DATABASE_3, TABLE_8_ID, TABLE_8, TABLE_8_COLUMNS.get(0).getId(), TABLE_8_COLUMNS.get(0), USER_2_PRINCIPAL, USER_2, request, DATABASE_3_USER_2_WRITE_ALL_ACCESS); } @@ -731,7 +733,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), null, null, request, null); }); } @@ -745,7 +747,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(AccessNotFoundException.class, () -> { - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, null); }); } @@ -759,7 +761,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, DATABASE_1_USER_1_READ_ACCESS); }); } @@ -775,7 +777,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_1_PRINCIPAL, USER_1, request, DATABASE_1_USER_1_WRITE_OWN_ACCESS); } @@ -788,7 +790,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_2_PRINCIPAL, USER_2, request, DATABASE_1_USER_2_WRITE_OWN_ACCESS); }); } @@ -802,7 +804,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(TableNotFoundException.class, () -> { - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, null, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, null, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_2_PRINCIPAL, USER_2, request, DATABASE_1_USER_2_WRITE_ALL_ACCESS); }); } @@ -818,7 +820,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - generic_update(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), + generic_updateColumn(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, TABLE_1_COLUMNS.get(0).getId(), TABLE_1_COLUMNS.get(0), USER_2_PRINCIPAL, USER_2, request, DATABASE_1_USER_2_WRITE_ALL_ACCESS); } @@ -897,7 +899,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void findById_privateAnonymous_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, + UserNotFoundException { /* test */ generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, null, null, null); @@ -915,17 +918,19 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = "find-table") - public void findById_privateHasRoleDatabaseNotFound_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + public void findById_privateHasRoleDatabaseNotFound_fails() { /* test */ - generic_findById(DATABASE_1_ID, null, TABLE_1_ID, TABLE_1, USER_1_PRINCIPAL, USER_1, DATABASE_1_USER_1_READ_ACCESS); + assertThrows(DatabaseNotFoundException.class, () -> { + generic_findById(DATABASE_1_ID, null, TABLE_1_ID, TABLE_1, USER_1_PRINCIPAL, USER_1, DATABASE_1_USER_1_READ_ACCESS); + }); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = "find-table") public void findById_privateHasRole_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, + UserNotFoundException { /* test */ final ResponseEntity<TableDto> response = generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_1_PRINCIPAL, USER_1, DATABASE_1_USER_1_READ_ACCESS); @@ -937,7 +942,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_4_USERNAME) public void findById_privateNoRole_succeeds() throws DataServiceException, DataServiceConnectionException, - TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException { + TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, QueueNotFoundException, + UserNotFoundException { /* test */ generic_findById(DATABASE_1_ID, DATABASE_1, TABLE_1_ID, TABLE_1, USER_4_PRINCIPAL, USER_4, null); @@ -998,25 +1004,83 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"update-table"}) + public void update_succeeds() throws TableNotFoundException, SearchServiceException, NotAllowedException, + DataServiceException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException { + final TableUpdateDto request = TableUpdateDto.builder() + .isPublic(true) + .isSchemaPublic(true) + .description("Debug") + .build(); + + /* test */ + final ResponseEntity<TableDto> response = generic_update(request, USER_1_PRINCIPAL); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"update-table"}) + public void update_notOwner_fails() { + final TableUpdateDto request = TableUpdateDto.builder() + .isPublic(true) + .isSchemaPublic(true) + .description("Debug") + .build(); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_update(request, USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"update-table-statistic"}) + public void updateStatistic_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_updateStatistic(USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"update-table-statistic"}) + public void updateStatistic_succeeds() throws TableNotFoundException, SearchServiceException, MalformedException, + NotAllowedException, DataServiceException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException { + + /* test */ + final ResponseEntity<Void> response = generic_updateStatistic(USER_1_PRINCIPAL); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + } + /* ################################################################################################### */ /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - public void analyseTable_generic(Long databaseId, Long tableId, Table table) throws MalformedException, - TableNotFoundException, DatabaseNotFoundException { + public void analyseTable_generic(Long databaseId, Database database, Long tableId, Table table, Principal principal) + throws MalformedException, TableNotFoundException, DatabaseNotFoundException, NotAllowedException { /* mock */ + when(databaseService.findById(databaseId)) + .thenReturn(database); + when(tableService.findById(database, tableId)) + .thenReturn(table); when(entityService.suggestByTable(table)) .thenReturn(List.of()); /* test */ - final ResponseEntity<List<EntityDto>> response = tableEndpoint.analyseTable(databaseId, tableId); + final ResponseEntity<List<EntityDto>> response = tableEndpoint.analyseTable(databaseId, tableId, principal); assertEquals(HttpStatus.OK, response.getStatusCode()); final List<EntityDto> body = response.getBody(); assertNotNull(body); } - public void analyseTableColumn_generic(Long databaseId, Long tableId, Long columnId, TableColumn tableColumn) + public void analyseTableColumn_generic(Long databaseId, Database database, Long tableId, Long columnId, + TableColumn tableColumn, Principal principal) throws MalformedException, TableNotFoundException, DatabaseNotFoundException { /* mock */ @@ -1024,7 +1088,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .thenReturn(List.of()); /* test */ - final ResponseEntity<List<TableColumnEntityDto>> response = tableEndpoint.analyseTableColumn(databaseId, tableId, columnId); + final ResponseEntity<List<TableColumnEntityDto>> response = tableEndpoint.analyseTableColumn(databaseId, + tableId, columnId, principal); assertEquals(HttpStatus.OK, response.getStatusCode()); final List<TableColumnEntityDto> body = response.getBody(); assertNotNull(body); @@ -1095,19 +1160,9 @@ public class TableEndpointUnitTest extends AbstractUnitTest { Table table, Principal principal, User user, DatabaseAccess access) throws DataServiceException, DataServiceConnectionException, TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, - QueueNotFoundException { + QueueNotFoundException, UserNotFoundException { /* mock */ - if (table != null) { - when(tableService.findById(databaseId, tableId)) - .thenReturn(table); - when(databaseService.findById(databaseId)) - .thenReturn(database); - } else { - doThrow(TableNotFoundException.class) - .when(tableService) - .findById(databaseId, tableId); - } if (database != null) { when(databaseService.findById(databaseId)) .thenReturn(database); @@ -1116,13 +1171,19 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .when(databaseService) .findById(databaseId); } - if (access != null) { - when(accessService.find(database, user)) - .thenReturn(access); + if (table != null) { + when(tableService.findById(any(Database.class), eq(tableId))) + .thenReturn(table); } else { - doThrow(AccessNotFoundException.class) - .when(accessService) - .find(database, user); + doThrow(TableNotFoundException.class) + .when(tableService) + .findById(any(Database.class), eq(tableId)); + } + if (principal != null) { + when(userService.findByUsername(principal.getName())) + .thenReturn(user); + when(accessService.find(any(Database.class), eq(user))) + .thenReturn(access); } /* test */ @@ -1134,24 +1195,29 @@ public class TableEndpointUnitTest extends AbstractUnitTest { SearchServiceException, SearchServiceConnectionException { /* mock */ - when(tableService.findById(anyLong(), anyLong())) + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(tableService.findById(any(Database.class), anyLong())) .thenReturn(table); /* test */ return tableEndpoint.delete(DATABASE_1_ID, TABLE_1_ID, principal); } - protected ResponseEntity<ColumnDto> generic_update(Long databaseId, Database database, Long tableId, Table table, - Long columnId, TableColumn column, Principal principal, - User user, ColumnSemanticsUpdateDto data, DatabaseAccess access) + protected ResponseEntity<ColumnDto> generic_updateColumn(Long databaseId, Database database, Long tableId, + Table table, Long columnId, TableColumn column, + Principal principal, User user, + ColumnSemanticsUpdateDto data, DatabaseAccess access) throws DataServiceException, DataServiceConnectionException, MalformedException, NotAllowedException, UserNotFoundException, TableNotFoundException, DatabaseNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException, OntologyNotFoundException, SemanticEntityNotFoundException { /* mock */ + when(databaseService.findById(databaseId)) + .thenReturn(database); if (table != null) { - when(tableService.findById(databaseId, tableId)) + when(tableService.findById(database, tableId)) .thenReturn(table); when(tableService.update(column, data)) .thenReturn(column); @@ -1161,7 +1227,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .update(column, data); doThrow(TableNotFoundException.class) .when(tableService) - .findById(databaseId, tableId); + .findById(database, tableId); } if (principal != null) { log.trace("mock user {}", user); @@ -1180,6 +1246,40 @@ public class TableEndpointUnitTest extends AbstractUnitTest { } /* test */ - return tableEndpoint.update(databaseId, tableId, columnId, data, principal); + return tableEndpoint.updateColumn(databaseId, tableId, columnId, data, principal); + } + + protected ResponseEntity<TableDto> generic_update(TableUpdateDto data, Principal caller) + throws TableNotFoundException, SearchServiceException, NotAllowedException, DataServiceException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(tableService.findById(DATABASE_1, TABLE_1_ID)) + .thenReturn(TABLE_1); + when(tableService.updateTable(any(Table.class), eq(data))) + .thenReturn(TABLE_1); + + /* test */ + return tableEndpoint.update(DATABASE_1_ID, TABLE_1_ID, data, caller); + } + + protected ResponseEntity<Void> generic_updateStatistic(Principal caller) + throws TableNotFoundException, SearchServiceException, NotAllowedException, DataServiceException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException, + MalformedException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(tableService.findById(DATABASE_1, TABLE_1_ID)) + .thenReturn(TABLE_1); + doNothing() + .when(tableService) + .updateStatistics(TABLE_1); + + /* test */ + return tableEndpoint.updateStatistic(DATABASE_1_ID, TABLE_1_ID, caller); } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java index da86dd9344606e59c55a9037111877fc55fcb1c4..54cef2ca4b1e08b2feacc94cc00781687a5e8881 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java @@ -1,23 +1,32 @@ package at.tuwien.endpoints; -import at.tuwien.test.AbstractUnitTest; +import at.tuwien.api.auth.LoginRequestDto; import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.user.*; +import at.tuwien.api.keycloak.UserAttributesDto; +import at.tuwien.api.user.UserBriefDto; +import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserPasswordDto; +import at.tuwien.api.user.UserUpdateDto; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.service.AuthenticationService; +import at.tuwien.service.DatabaseService; import at.tuwien.service.UserService; +import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -25,12 +34,12 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; import java.util.List; import java.util.UUID; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) @SpringBootTest @ExtendWith(SpringExtension.class) public class UserEndpointUnitTest extends AbstractUnitTest { @@ -41,9 +50,19 @@ public class UserEndpointUnitTest extends AbstractUnitTest { @MockBean private AuthenticationService authenticationService; + @MockBean + private DatabaseService databaseService; + @Autowired private UserEndpoint userEndpoint; + public static Stream<Arguments> getToken_parameters() { + return Stream.of( + Arguments.arguments("null", null), + Arguments.arguments("empty", new UUID[]{}) + ); + } + @BeforeEach public void beforeEach() { genesis(); @@ -142,13 +161,28 @@ public class UserEndpointUnitTest extends AbstractUnitTest { } @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"find-user"}) - public void find_hasRoleForeign_succeeds() { + @WithMockUser(username = USER_3_USERNAME, authorities = {"find-foreign-user"}) + public void find_hasRoleForeign_succeeds() throws UserNotFoundException, NotAllowedException { + final Principal principal = new UsernamePasswordAuthenticationToken(USER_3_DETAILS, USER_3_PASSWORD, List.of( + new SimpleGrantedAuthority("find-foreign-user"))); /* test */ - assertThrows(NotAllowedException.class, () -> { - find_generic(USER_2_ID, USER_2, USER_3_PRINCIPAL); - }); + find_generic(USER_2_ID, USER_2, principal); + } + + @Test + @WithMockUser(username = USER_3_USERNAME, authorities = {"system"}) + public void find_system_succeeds() throws UserNotFoundException, NotAllowedException { + final Principal principal = new UsernamePasswordAuthenticationToken(USER_3_DETAILS, USER_3_PASSWORD, List.of( + new SimpleGrantedAuthority("system"))); + + /* test */ + final ResponseEntity<UserDto> response = find_generic(USER_3_ID, USER_3, principal); + assertNotNull(response.getHeaders().get("X-Username")); + assertEquals(USER_3_USERNAME, response.getHeaders().get("X-Username").get(0)); + assertNotNull(response.getHeaders().get("X-Password")); + assertNotEquals(USER_3_PASSWORD, response.getHeaders().get("X-Password").get(0)); + assertEquals(USER_3_DATABASE_PASSWORD, response.getHeaders().get("X-Password").get(0)); } @Test @@ -252,6 +286,136 @@ public class UserEndpointUnitTest extends AbstractUnitTest { password_generic(USER_1_PRINCIPAL, request); } + @Test + @WithAnonymousUser + public void getToken_anonymous_succeeds() throws UserNotFoundException, AuthServiceException, + AuthServiceConnectionException, AccountNotSetupException, CredentialsInvalidException { + + /* test */ + getToken_generic(USER_1_LOGIN_REQUEST_DTO, USER_1_PRINCIPAL, USER_1); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void getToken_loggedIn_succeeds() throws UserNotFoundException, AuthServiceException, + AuthServiceConnectionException, AccountNotSetupException, CredentialsInvalidException { + + /* test */ + getToken_generic(USER_1_LOGIN_REQUEST_DTO, USER_1_PRINCIPAL, USER_1); + } + + @Test + @WithAnonymousUser + public void getToken_notExists_succeeds() throws UserNotFoundException, AuthServiceException, + AuthServiceConnectionException, AccountNotSetupException, CredentialsInvalidException { + + /* mock */ + when(authenticationService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1_KEYCLOAK_DTO); + when(userService.create(any(SignupRequestDto.class), any(UUID.class))) + .thenReturn(USER_1); + + /* test */ + getToken_generic(USER_1_LOGIN_REQUEST_DTO, USER_1_PRINCIPAL, null); + } + + @Test + @WithAnonymousUser + public void getToken_notExists_fails() throws UserNotFoundException, AuthServiceException, + AuthServiceConnectionException, CredentialsInvalidException { + + /* mock */ + doThrow(UserNotFoundException.class) + .when(authenticationService) + .findByUsername(USER_1_USERNAME); + + /* test */ + assertThrows(UserNotFoundException.class, () -> { + getToken_generic(USER_1_LOGIN_REQUEST_DTO, USER_1_PRINCIPAL, null); + }); + } + + @ParameterizedTest + @MethodSource("getToken_parameters") + @WithAnonymousUser + public void getToken_missingLdapId_fails(String name, UUID[] ldapId) throws UserNotFoundException, AuthServiceException, + AuthServiceConnectionException, CredentialsInvalidException { + final at.tuwien.api.keycloak.UserDto mock = at.tuwien.api.keycloak.UserDto.builder() + .attributes(UserAttributesDto.builder() + .ldapId(ldapId) + .build()) + .build(); + + /* mock */ + when(authenticationService.findByUsername(USER_1_USERNAME)) + .thenReturn(mock); + + /* test */ + assertThrows(UserNotFoundException.class, () -> { + getToken_generic(USER_1_LOGIN_REQUEST_DTO, USER_1_PRINCIPAL, null); + }); + } + + @Test + @WithAnonymousUser + public void refreshToken_anonymous_succeeds() throws AuthServiceConnectionException, CredentialsInvalidException { + + /* mock */ + when(authenticationService.refreshToken(anyString())) + .thenReturn(TOKEN_DTO); + + /* test */ + final ResponseEntity<?> response = userEndpoint.refreshToken(REFRESH_TOKEN_REQUEST_DTO); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshToken_loggedIn_succeeds() throws AuthServiceConnectionException, CredentialsInvalidException { + + /* mock */ + when(authenticationService.refreshToken(anyString())) + .thenReturn(TOKEN_DTO); + + /* test */ + final ResponseEntity<?> response = userEndpoint.refreshToken(REFRESH_TOKEN_REQUEST_DTO); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshToken_authServiceConnection_fails() throws AuthServiceConnectionException, + CredentialsInvalidException { + + /* mock */ + doThrow(AuthServiceConnectionException.class) + .when(authenticationService) + .refreshToken(anyString()); + + /* test */ + assertThrows(AuthServiceConnectionException.class, () -> { + userEndpoint.refreshToken(REFRESH_TOKEN_REQUEST_DTO); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshToken_invalidCredentials_fails() throws AuthServiceConnectionException, + CredentialsInvalidException { + + /* mock */ + doThrow(CredentialsInvalidException.class) + .when(authenticationService) + .refreshToken(anyString()); + + /* test */ + assertThrows(CredentialsInvalidException.class, () -> { + userEndpoint.refreshToken(REFRESH_TOKEN_REQUEST_DTO); + }); + } + /* ################################################################################################### */ /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ @@ -300,7 +464,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { assertNotNull(body); } - protected void find_generic(UUID id, User user, Principal principal) throws NotAllowedException, + protected ResponseEntity<UserDto> find_generic(UUID id, User user, Principal principal) throws NotAllowedException, UserNotFoundException { /* mock */ @@ -318,6 +482,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { assertEquals(HttpStatus.OK, response.getStatusCode()); final UserDto body = response.getBody(); assertNotNull(body); + return response; } protected void modify_generic(UUID userId, User user, Principal principal, UserUpdateDto data) @@ -347,9 +512,36 @@ public class UserEndpointUnitTest extends AbstractUnitTest { doNothing() .when(userService) .updatePassword(USER_1, data); + when(databaseService.findAllAccess(USER_1_ID)) + .thenReturn(List.of(DATABASE_1)); + doNothing() + .when(databaseService) + .updatePassword(DATABASE_1, USER_1); /* test */ final ResponseEntity<?> response = userEndpoint.password(USER_1_ID, data, principal); assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); } + + protected void getToken_generic(LoginRequestDto request, Principal principal, User user) + throws UserNotFoundException, AuthServiceConnectionException, AccountNotSetupException, + CredentialsInvalidException, AuthServiceException { + + /* mock */ + when(authenticationService.obtainToken(any(LoginRequestDto.class))) + .thenReturn(TOKEN_DTO); + if (user != null) { + when(userService.findByUsername(principal.getName())) + .thenReturn(user); + } else { + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(principal.getName()); + } + + /* test */ + final ResponseEntity<?> response = userEndpoint.getToken(request); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java index 7f1855b91ea97ea8f15d34b68f1a13782837324d..ccd8b067de4d002a5f358f47734b85f86ff6cfc8 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java @@ -3,6 +3,7 @@ package at.tuwien.endpoints; import at.tuwien.api.database.ViewBriefDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; +import at.tuwien.api.database.ViewUpdateDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.database.View; @@ -22,6 +23,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -99,7 +101,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void create_publicAnonymous_succeeds() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(DATABASE_3_ID, DATABASE_3, null, null, null, null); }); } @@ -129,11 +131,21 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void create_publicNoRole_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(DATABASE_3_ID, DATABASE_3, USER_2_PRINCIPAL, USER_2_ID, USER_2, null); }); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database-view"}) + public void create_succeeds() throws UserNotFoundException, SearchServiceException, MalformedException, + NotAllowedException, DataServiceException, DatabaseNotFoundException, AccessNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* test */ + create_generic(DATABASE_1_ID, DATABASE_1, USER_1_PRINCIPAL, USER_1_ID, USER_1, DATABASE_1_USER_1_WRITE_ALL_ACCESS); + } + @Test @WithAnonymousUser public void find_publicAnonymous_succeeds() throws UserNotFoundException, DatabaseNotFoundException, @@ -175,7 +187,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void delete_publicAnonymous_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { delete_generic(DATABASE_3_ID, DATABASE_3, VIEW_1_ID, VIEW_1, null, null, null, null); }); } @@ -195,7 +207,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void delete_publicNoRole_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { delete_generic(DATABASE_3_ID, DATABASE_3, VIEW_1_ID, VIEW_1, USER_2_PRINCIPAL, USER_2_ID, USER_2, DATABASE_2_USER_1_READ_ACCESS); }); } @@ -252,10 +264,10 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser - public void create_privateAnonymous_succeeds() { + public void create_privateAnonymous_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(DATABASE_1_ID, DATABASE_1, null, null, null, null); }); } @@ -285,7 +297,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void create_privateNoRole_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(DATABASE_1_ID, DATABASE_1, USER_2_PRINCIPAL, USER_2_ID, USER_2, null); }); } @@ -331,7 +343,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void delete_privateAnonymous_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { delete_generic(DATABASE_1_ID, DATABASE_1, VIEW_1_ID, VIEW_1, null, null, null, null); }); } @@ -351,7 +363,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { public void delete_privateNoRole_fails() { /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { delete_generic(DATABASE_1_ID, DATABASE_1, VIEW_1_ID, VIEW_1, USER_2_PRINCIPAL, USER_2_ID, USER_2, DATABASE_2_USER_1_READ_ACCESS); }); } @@ -366,6 +378,45 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { delete_generic(DATABASE_1_ID, DATABASE_1, VIEW_1_ID, VIEW_1, USER_1_PRINCIPAL, USER_1_ID, USER_1, DATABASE_1_USER_1_WRITE_ALL_ACCESS); } + @Test + @WithAnonymousUser + public void update_anonymous_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + update_generic(USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void update_noRole_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + update_generic(USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-view-visibility"}) + public void update_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + update_generic(USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-view-visibility"}) + public void update_succeeds() throws NotAllowedException, DataServiceConnectionException, DatabaseNotFoundException, + SearchServiceException, SearchServiceConnectionException, ViewNotFoundException { + + /* test */ + update_generic(USER_1_PRINCIPAL); + } + /* ################################################################################################### */ /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ @@ -419,6 +470,10 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* mock */ when(databaseService.findById(databaseId)) .thenReturn(database); + if (principal != null) { + when(userService.findByUsername(principal.getName())) + .thenReturn(user); + } if (access != null) { log.trace("mock access of database with id {} and user id {}", databaseId, userId); when(accessService.find(database, user)) @@ -499,4 +554,26 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); } + protected void update_generic(Principal principal) throws SearchServiceException, NotAllowedException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException, + ViewNotFoundException { + final ViewUpdateDto request = ViewUpdateDto.builder() + .isPublic(true) + .isSchemaPublic(true) + .build(); + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(viewService.findById(DATABASE_1, VIEW_1_ID)) + .thenReturn(VIEW_1); + when(viewService.update(DATABASE_1, VIEW_1, request)) + .thenReturn(VIEW_1); + + /* test */ + final ResponseEntity<ViewDto> response = viewEndpoint.update(DATABASE_1_ID, VIEW_1_ID, request, principal); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java index abfd9653dbbdaf8e40916b893d4acae35af865a0..fb574f35cae9dd3f3e10ae53be29d2d2b87aa8ff 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java @@ -63,23 +63,6 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { assertNotEquals(CONTAINER_1, CONTAINER_2); } - @Test - public void containerEquals_identity_succeeds() { - - /* test */ - assertEquals(CONTAINER_1, CONTAINER_1); - } - - @Test - public void containerEquals_similar_succeeds() { - final Container tmp = Container.builder() - .id(CONTAINER_1_ID) - .build(); - - /* test */ - assertEquals(CONTAINER_1, tmp); - } - @Test public void identifierTypeDtoToIdentifierType_succeeds() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java index 9a43b234d939a760b19765a4075574379ce4a65c..578f6276c791ab8465b46f115acc05ace1b7e948 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java @@ -535,22 +535,22 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* ignore */ } try { - tableEndpoint.analyseTable(DATABASE_1_ID, TABLE_1_ID); + tableEndpoint.analyseTable(DATABASE_1_ID, TABLE_1_ID, USER_1_PRINCIPAL); } catch (Exception e) { /* ignore */ } try { - tableEndpoint.updateStatistic(DATABASE_1_ID, TABLE_1_ID); + tableEndpoint.updateStatistic(DATABASE_1_ID, TABLE_1_ID, USER_1_PRINCIPAL); } catch (Exception e) { /* ignore */ } try { - tableEndpoint.analyseTableColumn(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId()); + tableEndpoint.analyseTableColumn(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId(), USER_1_PRINCIPAL); } catch (Exception e) { /* ignore */ } try { - tableEndpoint.update(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(3).getId(), request, USER_1_PRINCIPAL); + tableEndpoint.updateColumn(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(3).getId(), request, USER_1_PRINCIPAL); } catch (Exception e) { /* ignore */ } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java index fa939b0cb1795b08257b743ddb239bd075871cf0..54015177aaff7d3e52a98b5c2db7103a8c272fc1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java @@ -65,8 +65,6 @@ public class AccessServiceUnitTest extends AbstractUnitTest { @Test public void find_succeeds() throws AccessNotFoundException { - /* mock */ - /* test */ final DatabaseAccess response = accessService.find(DATABASE_1, USER_1); assertEquals(AccessType.READ, response.getType()); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java index 7cec5e624187fcb5c5285fc4fc0b4787b6a4e9a0..164f335eb73f68c986583da9881b743a32c44a06 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java @@ -6,7 +6,6 @@ import at.tuwien.test.AbstractUnitTest; import at.tuwien.entities.database.table.columns.TableColumnConcept; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java index a319044d3909efc8f87f703c9f6658e1d6be8b5b..182fe8e14ac5cd63ad1752fec07ee9b511ba8726 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java @@ -30,6 +30,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -121,6 +122,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { } @Test + @Transactional(readOnly = true) public void find_succeeds() throws IdentifierNotFoundException { /* test */ @@ -215,8 +217,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { @Test public void publish_succeeds() throws MalformedException, DataServiceConnectionException, SearchServiceException, - DatabaseNotFoundException, SearchServiceConnectionException, IdentifierNotFoundException, - ExternalServiceException { + DatabaseNotFoundException, SearchServiceConnectionException, ExternalServiceException { final ResponseEntity<DataCiteBody<DataCiteDoi>> mock = ResponseEntity.status(HttpStatus.CREATED) .body(IDENTIFIER_7_DATA_CITE); @@ -225,7 +226,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { .thenReturn(mock); /* test */ - final Identifier response = dataCiteIdentifierService.publish(IDENTIFIER_7_ID); + final Identifier response = dataCiteIdentifierService.publish(IDENTIFIER_7); assertEquals(IDENTIFIER_7_ID, response.getId()); assertEquals(IdentifierStatusType.PUBLISHED, response.getStatus()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java index b324a94c9e1c9ba8346eb4d3e3c6a81ecc7cad0b..bda2fc0ee5b103393a14b32b4244018c242d3f5a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java @@ -54,79 +54,21 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { } @Test - @Transactional + @Transactional(readOnly = true) public void findById_succeeds() throws DatabaseNotFoundException { /* test */ final Database response = databaseService.findById(DATABASE_1_ID); - assertEquals(DATABASE_1_ID, response.getId()); - assertEquals(CONTAINER_1_ID, response.getCid()); - /* container */ - assertNotNull(response.getContainer()); - assertEquals(CONTAINER_1_ID, response.getContainer().getId()); - assertEquals(CONTAINER_1_NAME, response.getContainer().getName()); - assertEquals(CONTAINER_1_INTERNALNAME, response.getContainer().getInternalName()); - assertEquals(CONTAINER_1_HOST, response.getContainer().getHost()); - assertEquals(CONTAINER_1_PORT, response.getContainer().getPort()); - assertEquals(CONTAINER_1_UI_HOST, response.getContainer().getUiHost()); - assertEquals(CONTAINER_1_UI_PORT, response.getContainer().getUiPort()); - assertEquals(CONTAINER_1_UI_ADDITIONAL_FLAGS, response.getContainer().getUiAdditionalFlags()); - assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getContainer().getPrivilegedUsername()); - assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getContainer().getPrivilegedPassword()); - assertNotNull(response.getContainer().getImage()); - assertEquals(IMAGE_1_NAME, response.getContainer().getImage().getName()); - assertEquals(IMAGE_1_VERSION, response.getContainer().getImage().getVersion()); - assertEquals(IMAGE_1_DIALECT, response.getContainer().getImage().getDialect()); - assertEquals(IMAGE_1_JDBC, response.getContainer().getImage().getJdbcMethod()); - assertEquals(IMAGE_1_DRIVER, response.getContainer().getImage().getDriverClass()); - assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry()); - assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort()); - /* creator */ - assertNotNull(response.getOwner()); - assertEquals(USER_1_ID, response.getOwner().getId()); - assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); - assertEquals(USER_1_EMAIL, response.getOwner().getEmail()); - assertEquals(USER_1_THEME, response.getOwner().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage()); - assertNotNull(response.getOwner().getAccesses()); + assertEquals(DATABASE_1, response); } @Test - @Transactional + @Transactional(readOnly = true) public void findByInternalName_succeeds() throws DatabaseNotFoundException { /* test */ final Database response = databaseService.findByInternalName(DATABASE_1_INTERNALNAME); - assertEquals(DATABASE_1_ID, response.getId()); - assertEquals(CONTAINER_1_ID, response.getCid()); - /* container */ - assertNotNull(response.getContainer()); - assertEquals(CONTAINER_1_ID, response.getContainer().getId()); - assertEquals(CONTAINER_1_NAME, response.getContainer().getName()); - assertEquals(CONTAINER_1_INTERNALNAME, response.getContainer().getInternalName()); - assertEquals(CONTAINER_1_HOST, response.getContainer().getHost()); - assertEquals(CONTAINER_1_PORT, response.getContainer().getPort()); - assertEquals(CONTAINER_1_UI_HOST, response.getContainer().getUiHost()); - assertEquals(CONTAINER_1_UI_PORT, response.getContainer().getUiPort()); - assertEquals(CONTAINER_1_UI_ADDITIONAL_FLAGS, response.getContainer().getUiAdditionalFlags()); - assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getContainer().getPrivilegedUsername()); - assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getContainer().getPrivilegedPassword()); - assertNotNull(response.getContainer().getImage()); - assertEquals(IMAGE_1_NAME, response.getContainer().getImage().getName()); - assertEquals(IMAGE_1_VERSION, response.getContainer().getImage().getVersion()); - assertEquals(IMAGE_1_DIALECT, response.getContainer().getImage().getDialect()); - assertEquals(IMAGE_1_JDBC, response.getContainer().getImage().getJdbcMethod()); - assertEquals(IMAGE_1_DRIVER, response.getContainer().getImage().getDriverClass()); - assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry()); - assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort()); - /* creator */ - assertNotNull(response.getOwner()); - assertEquals(USER_1_ID, response.getOwner().getId()); - assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); - assertEquals(USER_1_EMAIL, response.getOwner().getEmail()); - assertEquals(USER_1_THEME, response.getOwner().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage()); - assertNotNull(response.getOwner().getAccesses()); + assertEquals(DATABASE_1, response); } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index b0919f816a0b3aa0cbaad90aa62093987c54eabd..7815c4ae69a98c5dfd5171e1c83cd9fdb6de0a72 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -2,7 +2,9 @@ package at.tuwien.service; import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.internal.CreateDatabaseDto; +import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.entities.database.Database; +import at.tuwien.entities.database.table.Table; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; @@ -22,10 +24,8 @@ import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; @Log4j2 @SpringBootTest @@ -87,6 +87,263 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { }); } + @Test + public void findByInternalName_notFound_fails() { + + /* mock */ + when(databaseRepository.findByInternalName(DATABASE_1_INTERNALNAME)) + .thenReturn(Optional.empty()); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + databaseService.findByInternalName(DATABASE_1_INTERNALNAME); + }); + } + + @Test + public void updatePassword_succeeds() throws DataServiceException, DatabaseNotFoundException, + DataServiceConnectionException { + + /* mock */ + when(databaseRepository.findReadAccess(USER_1_ID)) + .thenReturn(List.of(DATABASE_1)); + doNothing() + .when(dataServiceGateway) + .updateDatabase(eq(DATABASE_1_ID), any(UpdateUserPasswordDto.class)); + + /* test */ + databaseService.updatePassword(DATABASE_1, USER_1); + } + + @Test + public void modifyImage_succeeds() throws SearchServiceException, DatabaseNotFoundException, SearchServiceConnectionException { + final byte[] image = new byte[]{1, 2, 3, 4, 5}; + + /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.modifyImage(DATABASE_1, image); + assertNotNull(response); + } + + @Test + public void modifyImage_searchServiceNotFound_fails() throws SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + final byte[] image = new byte[]{1, 2, 3, 4, 5}; + + /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(DatabaseNotFoundException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + databaseService.modifyImage(DATABASE_1, image); + }); + } + + @Test + public void modifyImage_searchServiceConnection_fails() throws SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + final byte[] image = new byte[]{1, 2, 3, 4, 5}; + + /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(SearchServiceConnectionException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + databaseService.modifyImage(DATABASE_1, image); + }); + } + + @Test + public void updateViewMetadata_empty_succeeds() throws SearchServiceException, DataServiceException, + QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateViewMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateViewMetadata_searchServiceConnection_fails() throws SearchServiceException, DataServiceException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException, + ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(SearchServiceConnectionException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + databaseService.updateViewMetadata(DATABASE_1); + }); + } + + @Test + public void updateViewMetadata_searchServiceNotFound_fails() throws SearchServiceException, DataServiceException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException, + ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(DatabaseNotFoundException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + databaseService.updateViewMetadata(DATABASE_1); + }); + } + + @Test + public void updateViewMetadata_oneMissing_succeeds() throws SearchServiceException, DataServiceException, + QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO, VIEW_4_DTO)); /* <<< */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateViewMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateViewMetadata_allKnown_succeeds() throws SearchServiceException, DataServiceException, + QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)); /* <<< */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateViewMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateTableMetadata_empty_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateTableMetadata_allKnown_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO)); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateTableMetadata_oneMissing_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO, TABLE_5_DTO)); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + assertNotNull(response); + final Optional<Table> optional = response.getTables() + .stream() + .filter(t -> t.getInternalName().equals(TABLE_5_INTERNALNAME)) + .findFirst(); + assertTrue(optional.isPresent()); + final Table table = optional.get(); + table.getColumns() + .forEach(column -> { + assertNotNull(column.getTable()); + assertEquals(TABLE_5_ID, column.getTable().getId()); + }); + table.getConstraints() + .getUniques() + .forEach(uk -> { + assertNotNull(uk.getTable()); + assertEquals(TABLE_5_ID, uk.getTable().getId()); + }); + table.getConstraints() + .getForeignKeys() + .forEach(fk -> { + assertNotNull(fk.getTable()); + assertEquals(TABLE_5_ID, fk.getTable().getId()); + }); + table.getConstraints() + .getPrimaryKey() + .forEach(pk -> { + assertNotNull(pk.getTable()); + assertEquals(TABLE_5_ID, pk.getTable().getId()); + assertEquals(TABLE_5_COLUMNS.get(0), pk.getColumn()); + }); + } + @Test public void find_succeeds() throws DatabaseNotFoundException { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java index 48da5206bbd8ddeb4125605891a7b4bef1e0f1f6..0c87dcdd692533cd751401f9be37fee69b5186cc 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java @@ -118,6 +118,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest { } @Test + @Transactional(readOnly = true) public void find_succeeds() throws IdentifierNotFoundException { /* test */ @@ -492,11 +493,10 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest { @Test public void publish_succeeds() throws MalformedException, DataServiceConnectionException, SearchServiceException, - DatabaseNotFoundException, SearchServiceConnectionException, IdentifierNotFoundException, - ExternalServiceException { + DatabaseNotFoundException, SearchServiceConnectionException, ExternalServiceException { /* test */ - final Identifier response = identifierService.publish(IDENTIFIER_7_ID); + final Identifier response = identifierService.publish(IDENTIFIER_7); assertEquals(IDENTIFIER_7_ID, response.getId()); assertEquals(IdentifierStatusType.PUBLISHED, response.getStatus()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java index 7aa22159c395046548324a714d7d8274fc8114af..3126f9e9f42b36fb8dc09dfa3f8e60c88d851722 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java @@ -30,11 +30,13 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.List; +import java.util.Set; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; @Log4j2 @SpringBootTest @@ -83,6 +85,8 @@ public class TableServicePersistenceTest extends AbstractUnitTest { final TableCreateDto request = TableCreateDto.builder() .name("New Table") .description("A wonderful table") + .isPublic(true) + .isSchemaPublic(true) .columns(List.of(ColumnCreateDto.builder() .name("id") .nullAllowed(false) @@ -138,4 +142,21 @@ public class TableServicePersistenceTest extends AbstractUnitTest { assertEquals(request.getConstraints().getForeignKeys().size(), foreignKeys.size()); } + @Test + public void findColumnById_succeeds() throws MalformedException { + + /* test */ + final TableColumn response = tableService.findColumnById(TABLE_1, COLUMN_1_1_ID); + assertEquals(TABLE_1_COLUMNS.get(0), response); + } + + @Test + public void findColumnById_fails() { + + /* test */ + assertThrows(MalformedException.class, () -> { + tableService.findColumnById(TABLE_1, 9999L); + }); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java index 01fc883bc8668b8c163527913b23d1206af302a6..d975e808e3dd03e3b4fd0f27d3af4b60f4fec7a1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java @@ -1,8 +1,11 @@ package at.tuwien.service; import at.tuwien.api.database.table.TableCreateDto; +import at.tuwien.api.database.table.TableStatisticDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; +import at.tuwien.api.database.table.columns.ColumnStatisticDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; +import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; import at.tuwien.api.database.table.constraints.foreign.ForeignKeyCreateDto; import at.tuwien.entities.database.Database; @@ -25,6 +28,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import static org.junit.jupiter.api.Assertions.*; @@ -46,6 +50,15 @@ public class TableServiceUnitTest extends AbstractUnitTest { @MockBean private UserService userService; + @MockBean + private UnitService unitService; + + @MockBean + private EntityService entityService; + + @MockBean + private ConceptService conceptService; + @MockBean private DataServiceGateway dataServiceGateway; @@ -65,7 +78,7 @@ public class TableServiceUnitTest extends AbstractUnitTest { .thenReturn(Optional.of(DATABASE_3)); /* test */ - final Table response = tableService.findById(DATABASE_3_ID, TABLE_8_ID); + final Table response = tableService.findById(DATABASE_3, TABLE_8_ID); assertEquals(TABLE_8_ID, response.getId()); assertEquals(TABLE_8_NAME, response.getName()); assertEquals(TABLE_8_INTERNAL_NAME, response.getInternalName()); @@ -80,7 +93,7 @@ public class TableServiceUnitTest extends AbstractUnitTest { /* test */ assertThrows(TableNotFoundException.class, () -> { - tableService.findById(DATABASE_3_ID, TABLE_1_ID); + tableService.findById(DATABASE_3, TABLE_1_ID); }); } @@ -92,7 +105,7 @@ public class TableServiceUnitTest extends AbstractUnitTest { .thenReturn(Optional.of(DATABASE_3)); /* test */ - final Table response = tableService.findByName(DATABASE_3_ID, TABLE_8_INTERNAL_NAME); + final Table response = tableService.findByName(DATABASE_3, TABLE_8_INTERNAL_NAME); assertEquals(TABLE_8_ID, response.getId()); assertEquals(TABLE_8_NAME, response.getName()); assertEquals(TABLE_8_INTERNAL_NAME, response.getInternalName()); @@ -105,12 +118,152 @@ public class TableServiceUnitTest extends AbstractUnitTest { when(databaseRepository.findById(DATABASE_3_ID)) .thenReturn(Optional.empty()); + /* test */ + assertThrows(TableNotFoundException.class, () -> { + tableService.findByName(DATABASE_3, TABLE_1_INTERNAL_NAME); + }); + } + + @Test + public void updateStatistics_succeeds() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, MalformedException { + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_STATISTIC_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + tableService.updateStatistics(TABLE_8); + } + + @Test + public void updateStatistics_searchServiceNotFound_fails() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_STATISTIC_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(DatabaseNotFoundException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - tableService.findByName(DATABASE_3_ID, TABLE_1_INTERNAL_NAME); + tableService.updateStatistics(TABLE_8); + }); + } + + @Test + public void updateStatistics_searchServiceConnection_fails() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_STATISTIC_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(SearchServiceConnectionException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + tableService.updateStatistics(TABLE_8); }); } + @Test + public void updateStatistics_columnNotFound_fails() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException { + final TableStatisticDto mock = TableStatisticDto.builder() + .columns(new HashMap<>() {{ + put("unknown_column", ColumnStatisticDto.builder() + .min(BigDecimal.valueOf(11.2)) + .max(BigDecimal.valueOf(23.1)) + .mean(BigDecimal.valueOf(13.5333)) + .median(BigDecimal.valueOf(11.4)) + .stdDev(BigDecimal.valueOf(4.2952)) + .build()); + }}) + .build(); + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(mock); + + /* test */ + assertThrows(MalformedException.class, () -> { + tableService.updateStatistics(TABLE_8); + }); + } + + @Test + public void update_known_succeeds() throws SearchServiceException, MalformedException, DataServiceException, + DatabaseNotFoundException, OntologyNotFoundException, SearchServiceConnectionException, + SemanticEntityNotFoundException, DataServiceConnectionException, UnitNotFoundException, + ConceptNotFoundException { + final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder() + .unitUri(UNIT_1_URI) + .conceptUri(CONCEPT_1_URI) + .build(); + + /* mock */ + when(unitService.find(UNIT_1_URI)) + .thenReturn(UNIT_1); + when(conceptService.find(CONCEPT_1_URI)) + .thenReturn(CONCEPT_1); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request); + assertNotNull(response.getUnit()); + assertNotNull(response.getConcept()); + } + + @Test + public void update_unknown_succeeds() throws SearchServiceException, MalformedException, DataServiceException, + DatabaseNotFoundException, OntologyNotFoundException, SearchServiceConnectionException, + SemanticEntityNotFoundException, DataServiceConnectionException, UnitNotFoundException, + ConceptNotFoundException { + final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder() + .unitUri(UNIT_1_URI) + .conceptUri(CONCEPT_1_URI) + .build(); + + /* mock */ + doThrow(UnitNotFoundException.class) + .when(unitService) + .find(UNIT_1_URI); + when(entityService.findOneByUri(UNIT_1_URI)) + .thenReturn(UNIT_1_ENTITY_DTO); + doThrow(ConceptNotFoundException.class) + .when(conceptService) + .find(CONCEPT_1_URI); + when(entityService.findOneByUri(CONCEPT_1_URI)) + .thenReturn(CONCEPT_1_ENTITY_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request); + assertNotNull(response.getUnit()); + assertNotNull(response.getConcept()); + } + @Test public void createTable_succeeds() throws DataServiceException, DataServiceConnectionException, UserNotFoundException, TableNotFoundException, DatabaseNotFoundException, TableExistsException, @@ -389,16 +542,7 @@ public class TableServiceUnitTest extends AbstractUnitTest { /* test */ assertThrows(TableNotFoundException.class, () -> { - tableService.findByName(DATABASE_1_ID, "i_do_not_exist"); - }); - } - - @Test - public void findById_databaseNotFound_fails() { - - /* test */ - assertThrows(DatabaseNotFoundException.class, () -> { - tableService.findByName(99999L, TABLE_3_INTERNALNAME); + tableService.findByName(DATABASE_1, "i_do_not_exist"); }); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java index 8528d29f07d267bd4dcbe94de5379e47e13f1cef..29718b0962c76b8b1ad01ef003de092459d92714 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java @@ -1,21 +1,20 @@ package at.tuwien.validator; -import at.tuwien.entities.database.Database; -import at.tuwien.entities.user.User; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.SortType; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.identifier.IdentifierSaveDto; +import at.tuwien.entities.database.Database; +import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.service.AccessService; import at.tuwien.service.DatabaseService; import at.tuwien.service.TableService; +import at.tuwien.test.AbstractUnitTest; import at.tuwien.validation.EndpointValidator; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -159,12 +158,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyAccessOrPublic_privateAnonymous_fails() throws DatabaseNotFoundException { - - /* mock */ - when(databaseService.findById(anyLong())) - .thenReturn(DATABASE_1); + public void validateOnlyAccessOrPublic_privateAnonymous_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { @@ -173,13 +167,9 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyAccessOrPublic_privateNoAccess_fails() throws DatabaseNotFoundException, - AccessNotFoundException { + public void validateOnlyAccessOrPublic_privateNoAccess_fails() throws AccessNotFoundException { /* mock */ - when(databaseService.findById(DATABASE_1_ID)) - .thenReturn(DATABASE_1); doThrow(AccessNotFoundException.class) .when(accessService) .find(any(Database.class), any(User.class)); @@ -237,7 +227,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { TableNotFoundException, AccessNotFoundException { /* mock */ - when(tableService.findById(DATABASE_1_ID, TABLE_1_ID)) + when(tableService.findById(DATABASE_1, TABLE_1_ID)) .thenReturn(TABLE_1); when(accessService.find(eq(DATABASE_1), any(User.class))) .thenReturn(DATABASE_1_USER_1_READ_ACCESS); @@ -253,7 +243,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { DatabaseNotFoundException, AccessNotFoundException, TableNotFoundException { /* mock */ - when(tableService.findById(DATABASE_1_ID, TABLE_1_ID)) + when(tableService.findById(DATABASE_1, TABLE_1_ID)) .thenReturn(TABLE_1); when(accessService.find(eq(DATABASE_1), any(User.class))) .thenReturn(DATABASE_1_USER_1_WRITE_OWN_ACCESS); @@ -322,7 +312,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { TableNotFoundException, AccessNotFoundException { /* mock */ - when(tableService.findById(DATABASE_1_ID, TABLE_1_ID)) + when(tableService.findById(DATABASE_1, TABLE_1_ID)) .thenReturn(TABLE_1); when(accessService.find(DATABASE_1, USER_1)) .thenReturn(DATABASE_1_USER_1_READ_ACCESS); @@ -334,12 +324,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyPrivateHasRole_privatePrincipalMissing_fails() throws DatabaseNotFoundException { - - /* mock */ - when(databaseService.findById(anyLong())) - .thenReturn(DATABASE_1); + public void validateOnlyPrivateHasRole_privatePrincipalMissing_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { @@ -348,12 +333,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyPrivateHasRole_privateRoleMissing_fails() throws DatabaseNotFoundException { - - /* mock */ - when(databaseService.findById(anyLong())) - .thenReturn(DATABASE_1); + public void validateOnlyPrivateHasRole_privateRoleMissing_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java index 621ee53dfefdf7668c2c18ee45866c50202697ee..976830cebbb17d0378ee6e4afedba30170507250 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java @@ -21,57 +21,62 @@ public interface DataServiceGateway { /** * Create r/w access for a given user to a given database. + * * @param databaseId The database id. - * @param userId The user id. - * @param access The access. + * @param userId The user id. + * @param access The access. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. + * @throws DataServiceException The data service responded unexpectedly. + * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. */ void createAccess(Long databaseId, UUID userId, AccessTypeDto access) throws DataServiceConnectionException, DataServiceException, DatabaseNotFoundException; /** * Update r/w access for a given user to a given database. + * * @param databaseId The database id. - * @param userId The user id. - * @param access The access. + * @param userId The user id. + * @param access The access. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws AccessNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. + * @throws DataServiceException The data service responded unexpectedly. + * @throws AccessNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. */ void updateAccess(Long databaseId, UUID userId, AccessTypeDto access) throws DataServiceConnectionException, DataServiceException, AccessNotFoundException; /** * Deletes access for a given user to a given database. + * * @param databaseId The database id. - * @param userId The user id. + * @param userId The user id. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws AccessNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. + * @throws DataServiceException The data service responded unexpectedly. + * @throws AccessNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. */ void deleteAccess(Long databaseId, UUID userId) throws DataServiceConnectionException, DataServiceException, AccessNotFoundException; /** * Creates a database in the data service. + * * @param data The data. * @return The created database, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. + * @throws DataServiceException The data service responded unexpectedly. + * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. */ DatabaseDto createDatabase(CreateDatabaseDto data) throws DataServiceConnectionException, DataServiceException, DatabaseNotFoundException; /** * Updates the user password in the given database in the data service. + * * @param databaseId The database id. - * @param data The user password. + * @param data The user password. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. + * @throws DataServiceException The data service responded unexpectedly. + * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. */ void updateDatabase(Long databaseId, UpdateUserPasswordDto data) throws DataServiceConnectionException, DataServiceException, DatabaseNotFoundException; @@ -81,102 +86,111 @@ public interface DataServiceGateway { /** * Creates a table in a given database. + * * @param databaseId The database id. - * @param data The table data. + * @param data The table data. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. - * @throws TableExistsException A table with this internal name exists already in the database. + * @throws DataServiceException The data service responded unexpectedly. + * @throws DatabaseNotFoundException Some of the privileged parameters of the given database were not provided by the metadata service. + * @throws TableExistsException A table with this internal name exists already in the database. */ void createTable(Long databaseId, TableCreateDto data) throws DataServiceConnectionException, DataServiceException, DatabaseNotFoundException, TableExistsException; /** * Deletes a given table in a given database. + * * @param databaseId The database id. - * @param tableId The table id. + * @param tableId The table id. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws TableNotFoundException The given table was not found in the database. + * @throws DataServiceException The data service responded unexpectedly. + * @throws TableNotFoundException The given table was not found in the database. */ void deleteTable(Long databaseId, Long tableId) throws DataServiceConnectionException, DataServiceException, TableNotFoundException; /** * Creates a view in the given database. + * * @param databaseId The database id. - * @param data The view data. + * @param data The view data. * @return The created view, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. + * @throws DataServiceException The data service responded unexpectedly. */ ViewDto createView(Long databaseId, ViewCreateDto data) throws DataServiceConnectionException, DataServiceException; /** * Deletes a given view in the given database. + * * @param databaseId The database id. - * @param viewId The view id. + * @param viewId The view id. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws ViewNotFoundException The given view was not found in the database. + * @throws DataServiceException The data service responded unexpectedly. + * @throws ViewNotFoundException The given view was not found in the database. */ void deleteView(Long databaseId, Long viewId) throws DataServiceConnectionException, DataServiceException, ViewNotFoundException; /** * Finds a given query in a given database. + * * @param databaseId The database id. - * @param queryId The query id. + * @param queryId The query id. * @return The query, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws QueryNotFoundException The given query was not found in the query store. + * @throws DataServiceException The data service responded unexpectedly. + * @throws QueryNotFoundException The given query was not found in the query store. */ QueryDto findQuery(Long databaseId, Long queryId) throws DataServiceConnectionException, DataServiceException, QueryNotFoundException; /** * Exports a given query. + * * @param databaseId The database id. - * @param queryId The query id. + * @param queryId The query id. * @return The exported resource, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws QueryNotFoundException The given query was not found in the query store. + * @throws DataServiceException The data service responded unexpectedly. + * @throws QueryNotFoundException The given query was not found in the query store. */ ExportResourceDto exportQuery(Long databaseId, Long queryId) throws DataServiceConnectionException, DataServiceException, QueryNotFoundException; /** * Obtain table schemas from a given database. + * * @param databaseId The database id. * @return The list of tables, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws TableNotFoundException The table was not found in the database. + * @throws DataServiceException The data service responded unexpectedly. + * @throws TableNotFoundException The table was not found in the database. */ List<TableDto> getTableSchemas(Long databaseId) throws DataServiceConnectionException, DataServiceException, TableNotFoundException; /** * Obtain view schemas from a given database. + * * @param databaseId The database id. * @return The list of tables, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws ViewNotFoundException The table was not found in the database. + * @throws DataServiceException The data service responded unexpectedly. + * @throws ViewNotFoundException The table was not found in the database. */ List<ViewDto> getViewSchemas(Long databaseId) throws DataServiceConnectionException, DataServiceException, ViewNotFoundException; /** * Obtain table statistics for a given table in a given database. + * * @param databaseId The database id. - * @param tableId The table id. + * @param tableId The table id. * @return The statistic, if successful. * @throws DataServiceConnectionException The connection to the data service could not be established. - * @throws DataServiceException The data service responded unexpectedly. - * @throws TableNotFoundException The table was not found in the database. + * @throws DataServiceException The data service responded unexpectedly. + * @throws TableNotFoundException The table was not found in the database. */ TableStatisticDto getTableStatistics(Long databaseId, Long tableId) throws DataServiceConnectionException, DataServiceException, TableNotFoundException; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java index 09ad1e55da73ed27c0d79b4ed8eae550532ae9ac..2b0cd72dda4c3896ae104e477d3f825dab0cb995 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java @@ -14,7 +14,10 @@ import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java index c47bb8daa36519ff251202d14a02f38c9212aafe..2642574f2720e0e6f565e0b83669c6398ccf453f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java @@ -6,6 +6,7 @@ import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.user.User; import at.tuwien.exception.*; +import java.security.Principal; import java.util.List; public interface AccessService { @@ -19,7 +20,7 @@ public interface AccessService { List<DatabaseAccess> list(Database database); /** - * Finds database access by given database and user. + * Finds database access by given database and user, where the access is determined by the username (needed since {@link Principal#getName()} embeds the username). * * @param database The database. * @param user The user. @@ -37,7 +38,7 @@ public interface AccessService { * @return The database access, if successful. * @throws DataServiceException The data service responded with unexpected behavior. * @throws DataServiceConnectionException The connection with the data service could not be established. - * @throws DatabaseNotFoundException The database was not found in the metadata/search database. + * @throws DatabaseNotFoundException The database was not found in the metadata/search database. */ DatabaseAccess create(Database database, User user, AccessTypeDto access) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; @@ -50,7 +51,7 @@ public interface AccessService { * @param access The updated access. * @throws DataServiceException The data service responded with unexpected behavior. * @throws DataServiceConnectionException The connection with the data service could not be established. - * @throws DatabaseNotFoundException The database was not found in the metadata/search database. + * @throws DatabaseNotFoundException The database was not found in the metadata/search database. */ void update(Database database, User user, AccessTypeDto access) throws at.tuwien.exception.DataServiceException, DataServiceConnectionException, AccessNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; @@ -62,7 +63,7 @@ public interface AccessService { * @param user The user. * @throws DataServiceException The data service responded with unexpected behavior. * @throws DataServiceConnectionException The connection with the data service could not be established. - * @throws DatabaseNotFoundException The database was not found in the search database. + * @throws DatabaseNotFoundException The database was not found in the search database. */ void delete(Database database, User user) throws AccessNotFoundException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/IdentifierService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/IdentifierService.java index 4d0228f4108164eb463ccecd926d6a0ea52214c8..ded8204f32b8b6f99af5553952dfa6f0c535c652 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/IdentifierService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/IdentifierService.java @@ -87,7 +87,8 @@ public interface IdentifierService { /** * Publishes a draft identifier with DataCite. - * @param identifierId The identifier id. + * + * @param identifier The identifier. * @return The resulting identifier. * @throws SearchServiceException * @throws DatabaseNotFoundException @@ -96,9 +97,9 @@ public interface IdentifierService { * @throws DataServiceConnectionException * @throws IdentifierNotFoundException */ - Identifier publish(Long identifierId) throws SearchServiceException, DatabaseNotFoundException, + Identifier publish(Identifier identifier) throws SearchServiceException, DatabaseNotFoundException, SearchServiceConnectionException, MalformedException, DataServiceConnectionException, - IdentifierNotFoundException, ExternalServiceException; + ExternalServiceException; /** * Creates a new identifier in the metadata database for a query or database. diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java index 9a5c395c72abd23198c1e8d59daf346e42916fb0..299283e68bbf6bd07ddb6b042248ead6681a6970 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java @@ -7,7 +7,6 @@ import at.tuwien.entities.database.Database; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.exception.*; -import org.springframework.transaction.annotation.Transactional; import java.security.Principal; @@ -16,20 +15,20 @@ public interface TableService { /** * Find a table in the metadata database by database and table id. * - * @param databaseId The database id. - * @param tableId The table id. + * @param database The database. + * @param tableId The table id. * @return The table, if successful. */ - Table findById(Long databaseId, Long tableId) throws TableNotFoundException, DatabaseNotFoundException; + Table findById(Database database, Long tableId) throws TableNotFoundException, DatabaseNotFoundException; /** * Find a table in the metadata database by database id and table name. * - * @param databaseId The database id. + * @param database The database. * @param internalName The table name. * @return The table, if successful. */ - Table findByName(Long databaseId, String internalName) throws TableNotFoundException, DatabaseNotFoundException; + Table findByName(Database database, String internalName) throws TableNotFoundException, DatabaseNotFoundException; /** diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java index b3f98b01bbb2d406738d314fd15333727aaf4885..a0f45fb34f3c3762a8da630c622d9aa23d327af3 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java @@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.security.Principal; import java.util.List; import java.util.Optional; @@ -52,7 +51,7 @@ public class AccessServiceImpl implements AccessService { public DatabaseAccess find(Database database, User user) throws AccessNotFoundException { final Optional<DatabaseAccess> optional = database.getAccesses() .stream() - .filter(a -> a.getUser().getId().equals(user.getId())) + .filter(a -> a.getUser().getUsername().equals(user.getUsername())) .findFirst(); if (optional.isEmpty()) { log.error("Failed to find database access for database with id: {}", database.getId()); @@ -93,19 +92,16 @@ public class AccessServiceImpl implements AccessService { /* update in data database */ dataServiceGateway.updateAccess(database.getId(), user.getId(), access); /* update in metadata database */ - final DatabaseAccess entity = DatabaseAccess.builder() - .hdbid(database.getId()) - .database(database) - .huserid(user.getId()) - .type(metadataMapper.accessTypeDtoToAccessType(access)) - .user(user) - .build(); - final int idx = database.getAccesses().indexOf(entity); - if (idx == -1) { - log.error("Failed to update access"); - throw new AccessNotFoundException("Failed to find update access"); + final Optional<DatabaseAccess> optional = database.getAccesses() + .stream() + .filter(a -> a.getUser().getId().equals(user.getId())) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to update access for user with id: {}", user.getId()); + throw new AccessNotFoundException("Failed to find update access for user with id: " + user.getId()); } - database.getAccesses().set(idx, entity); + optional.get() + .setType(metadataMapper.accessTypeDtoToAccessType(access)); database = databaseRepository.save(database); /* update in search service */ searchServiceGateway.update(database); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java index ed58148707440f4dc20728fafbbc19ad3fd06594..0151ea92f7c4e8110bda544b70b7d341381902c2 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java @@ -70,9 +70,8 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService { @Override @Transactional - public Identifier publish(Long identifierId) throws MalformedException, DataServiceConnectionException, - IdentifierNotFoundException, ExternalServiceException { - final Identifier identifier = find(identifierId); + public Identifier publish(Identifier identifier) throws MalformedException, DataServiceConnectionException, + ExternalServiceException { identifier.setStatus(IdentifierStatusType.PUBLISHED); identifier.setDoi(remoteSave(identifier, DataCiteDoiEvent.PUBLISH)); return identifierRepository.save(identifier); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index 9ffa720d4d94acc38ebe1652624aa8956f80ae83..f3f4cccc5d5d8742d4c35d12b982001e0cfbb431 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -88,7 +88,7 @@ public class DatabaseServiceImpl implements DatabaseService { public Database create(Container container, DatabaseCreateDto data, User user) throws UserNotFoundException, ContainerNotFoundException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { - Database database = Database.builder() + final Database entity = Database.builder() .isPublic(data.getIsPublic()) .isSchemaPublic(data.getIsSchemaPublic()) .name(data.getName()) @@ -112,21 +112,21 @@ public class DatabaseServiceImpl implements DatabaseService { .password(user.getMariadbPassword()) .privilegedUsername(container.getPrivilegedUsername()) .privilegedPassword(container.getPrivilegedPassword()) - .internalName(database.getInternalName()) + .internalName(entity.getInternalName()) .build(); final DatabaseDto dto = dataServiceGateway.createDatabase(payload); - database.setExchangeName(dto.getExchangeName()); + entity.setExchangeName(dto.getExchangeName()); /* create in metadata database */ - database = databaseRepository.save(database); - database.getAccesses() + final Database entity1 = databaseRepository.save(entity); + entity1.getAccesses() .add(DatabaseAccess.builder() .type(AccessType.WRITE_ALL) - .hdbid(database.getId()) - .database(database) + .hdbid(entity1.getId()) + .database(entity1) .huserid(user.getId()) .user(user) .build()); - database = databaseRepository.save(database); + final Database database = databaseRepository.save(entity1); /* create in search service */ searchServiceGateway.update(database); log.info("Created database with id {}", database.getId()); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java index 0682225e8ad28c1ea0e2fd93c9b6efd9c1366d26..8706e18bbc7719b7d8beec8c36a33834b4397471 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java @@ -147,9 +147,8 @@ public class IdentifierServiceImpl implements IdentifierService { @Override @Transactional - public Identifier publish(Long identifierId) throws SearchServiceException, DatabaseNotFoundException, - SearchServiceConnectionException, IdentifierNotFoundException { - Identifier identifier = find(identifierId); + public Identifier publish(Identifier identifier) throws SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { /* publish identifier */ identifier.setStatus(IdentifierStatusType.PUBLISHED); identifier = identifierRepository.save(identifier); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java index 57b546fcea0b9cfe558ab935022b79d78c83edca..52a9a63667c8faa22bdd142d5161f04e85d70513 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java @@ -40,7 +40,6 @@ public class TableServiceImpl implements TableService { private final EntityService entityService; private final ConceptService conceptService; private final MetadataMapper metadataMapper; - private final DatabaseService databaseService; private final DataServiceGateway dataServiceGateway; private final DatabaseRepository databaseRepository; private final SearchServiceGateway searchServiceGateway; @@ -48,15 +47,14 @@ public class TableServiceImpl implements TableService { @Autowired public TableServiceImpl(UserService userService, UnitService unitService, RabbitConfig rabbitConfig, EntityService entityService, ConceptService conceptService, MetadataMapper metadataMapper, - DatabaseService databaseService, DataServiceGateway dataServiceGateway, - DatabaseRepository databaseRepository, SearchServiceGateway searchServiceGateway) { + DataServiceGateway dataServiceGateway, DatabaseRepository databaseRepository, + SearchServiceGateway searchServiceGateway) { this.userService = userService; this.unitService = unitService; this.rabbitConfig = rabbitConfig; this.entityService = entityService; this.conceptService = conceptService; this.metadataMapper = metadataMapper; - this.databaseService = databaseService; this.dataServiceGateway = dataServiceGateway; this.databaseRepository = databaseRepository; this.searchServiceGateway = searchServiceGateway; @@ -64,10 +62,8 @@ public class TableServiceImpl implements TableService { @Override @Transactional(readOnly = true) - public Table findById(Long databaseId, Long tableId) throws TableNotFoundException, - DatabaseNotFoundException { - final Optional<Table> table = databaseService.findById(databaseId) - .getTables() + public Table findById(Database database, Long tableId) throws TableNotFoundException { + final Optional<Table> table = database.getTables() .stream() .filter(t -> t.getId().equals(tableId)) .findFirst(); @@ -80,10 +76,8 @@ public class TableServiceImpl implements TableService { @Override @Transactional(readOnly = true) - public Table findByName(Long databaseId, String internalName) throws TableNotFoundException, - DatabaseNotFoundException { - final Optional<Table> table = databaseService.findById(databaseId) - .getTables() + public Table findByName(Database database, String internalName) throws TableNotFoundException { + final Optional<Table> table = database.getTables() .stream() .filter(t -> t.getInternalName().equals(internalName)) .findFirst(); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index c67cb68ce2ca8bf58d07654a3a05deeb97404a4d..887c61501b3b4c40bfaebcfb11f8b9fc95be6adb 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -1,5 +1,7 @@ package at.tuwien.test; +import at.tuwien.entities.database.AccessType; +import at.tuwien.entities.identifier.IdentifierStatusType; import org.springframework.test.context.TestPropertySource; import java.util.LinkedList; @@ -25,17 +27,26 @@ public abstract class AbstractUnitTest extends BaseTest { /* USER_4 */ USER_5.setAccesses(new LinkedList<>()); /* DATABASE 1 */ + TABLE_1_COLUMNS.get(0).setUnit(null); + TABLE_1_COLUMNS.get(0).setConcept(null); DATABASE_1.setOwner(USER_1); DATABASE_1.setSubsets(new LinkedList<>()); + DATABASE_1.setIsPublic(false); + DATABASE_1_USER_1_READ_ACCESS.setType(AccessType.READ); DATABASE_1.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS, DATABASE_1_USER_2_WRITE_OWN_ACCESS, DATABASE_1_USER_3_WRITE_ALL_ACCESS))); DATABASE_1_PRIVILEGED_DTO.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS_DTO, DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO, DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO))); TABLE_1.setDatabase(DATABASE_1); + UNIT_1.setId(UNIT_1_ID); TABLE_1.setColumns(new LinkedList<>(TABLE_1_COLUMNS)); TABLE_1.setConstraints(TABLE_1_CONSTRAINTS); TABLE_1_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_1_COLUMNS_DTO)); TABLE_1_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); VIEW_1_DTO.setDatabase(DATABASE_1_DTO); DATABASE_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4))); + IDENTIFIER_1.setDatabase(DATABASE_1); + IDENTIFIER_2.setDatabase(DATABASE_1); + IDENTIFIER_3.setDatabase(DATABASE_1); + IDENTIFIER_4.setDatabase(DATABASE_1); DATABASE_1.setTables(new LinkedList<>(List.of(TABLE_1, TABLE_2, TABLE_3, TABLE_4))); DATABASE_1.setViews(new LinkedList<>(List.of(VIEW_1, VIEW_2, VIEW_3))); DATABASE_1_PRIVILEGED_DTO.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO))); @@ -130,6 +141,7 @@ public abstract class AbstractUnitTest extends BaseTest { DATABASE_4.setSubsets(new LinkedList<>()); DATABASE_4.setAccesses(new LinkedList<>(List.of(DATABASE_4_USER_1_READ_ACCESS, DATABASE_4_USER_2_WRITE_OWN_ACCESS, DATABASE_4_USER_3_WRITE_ALL_ACCESS))); DATABASE_4.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_7))); + IDENTIFIER_7.setStatus(IdentifierStatusType.DRAFT); IDENTIFIER_7.setDatabase(DATABASE_4); } diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 52c33633dd9befecca647c9812be3961adffbbbf..5e5b653852782dd6fab81dd39d1d7e5762396bfa 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -6,6 +6,7 @@ import at.tuwien.api.amqp.ExchangeDto; import at.tuwien.api.amqp.GrantVirtualHostPermissionsDto; import at.tuwien.api.amqp.QueueDto; import at.tuwien.api.auth.LoginRequestDto; +import at.tuwien.api.auth.RefreshTokenRequestDto; import at.tuwien.api.auth.SignupRequestDto; import at.tuwien.api.container.ContainerBriefDto; import at.tuwien.api.container.ContainerDto; @@ -56,6 +57,7 @@ import at.tuwien.api.orcid.activities.employments.affiliation.group.summary.orga import at.tuwien.api.orcid.person.OrcidPersonDto; import at.tuwien.api.orcid.person.name.OrcidNameDto; import at.tuwien.api.orcid.person.name.OrcidValueDto; +import at.tuwien.api.semantics.EntityDto; import at.tuwien.api.semantics.OntologyCreateDto; import at.tuwien.api.semantics.OntologyModifyDto; import at.tuwien.api.user.*; @@ -159,7 +161,7 @@ public abstract class BaseTest { public final static String MINIO_IMAGE = "minio/minio:RELEASE.2024-06-06T09-36-42Z"; - public final static String MARIADB_IMAGE = "mariadb:11.1.3"; + public final static String MARIADB_IMAGE = "mariadb:11.3.2"; public final static String[] DEFAULT_SEMANTICS_HANDLING = new String[]{"default-semantics-handling", "create-semantic-unit", "execute-semantic-query", "table-semantic-analyse", "create-semantic-concept"}; @@ -286,11 +288,15 @@ public abstract class BaseTest { .scope("openid") .build(); + public final static RefreshTokenRequestDto REFRESH_TOKEN_REQUEST_DTO = RefreshTokenRequestDto.builder() + .refreshToken("ey.yee.skrr") + .build(); + public final static Long CONCEPT_1_ID = 1L; public final static String CONCEPT_1_NAME = "precipitation"; public final static String CONCEPT_1_URI = "http://www.wikidata.org/entity/Q25257"; public final static String CONCEPT_1_DESCRIPTION = null; - public final static Instant CONCEPT_1_CREATED = Instant.ofEpochSecond(1701976048L) /* 2023-12-07 19:07:27 */; + public final static Instant CONCEPT_1_CREATED = Instant.ofEpochSecond(1701976048L) /* 2023-12-07 19:07:27 (UTC) */; public final static ConceptSaveDto CONCEPT_1_SAVE_DTO = ConceptSaveDto.builder() .uri(CONCEPT_1_URI) @@ -313,6 +319,12 @@ public abstract class BaseTest { .created(CONCEPT_1_CREATED) .build(); + public final static EntityDto CONCEPT_1_ENTITY_DTO = EntityDto.builder() + .uri(CONCEPT_1_URI) + .description(CONCEPT_1_DESCRIPTION) + .label(CONCEPT_1_NAME) + .build(); + public final static Long CONCEPT_2_ID = 2L; public final static String CONCEPT_2_NAME = "FAIR data"; public final static String CONCEPT_2_URI = "http://www.wikidata.org/entity/Q29032648"; @@ -367,6 +379,12 @@ public abstract class BaseTest { .created(UNIT_1_CREATED) .build(); + public final static EntityDto UNIT_1_ENTITY_DTO = EntityDto.builder() + .uri(UNIT_1_URI) + .description(UNIT_1_DESCRIPTION) + .label(UNIT_1_NAME) + .build(); + public final static Long UNIT_2_ID = 2L; public final static String UNIT_2_NAME = "tonne"; public final static String UNIT_2_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/tonne"; @@ -2339,6 +2357,7 @@ public abstract class BaseTest { public final static String ONTOLOGY_1_PREFIX = "om2"; public final static String ONTOLOGY_1_NEW_PREFIX = "om-2"; public final static String ONTOLOGY_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/"; + public final static String ONTOLOGY_1_URI_PATTERN = "http://www.ontology-of-units-of-measure.org/resource/om-2/.*"; public final static String ONTOLOGY_1_SPARQL_ENDPOINT = null; public final static String ONTOLOGY_1_RDF_PATH = "rdf/om-2.0.rdf"; public final static UUID ONTOLOGY_1_CREATED_BY = USER_1_ID; @@ -2347,6 +2366,7 @@ public abstract class BaseTest { .id(ONTOLOGY_1_ID) .prefix(ONTOLOGY_1_PREFIX) .uri(ONTOLOGY_1_URI) + .uriPattern(ONTOLOGY_1_URI_PATTERN) .sparqlEndpoint(ONTOLOGY_1_SPARQL_ENDPOINT) .rdfPath(ONTOLOGY_1_RDF_PATH) .build(); @@ -5931,6 +5951,7 @@ public abstract class BaseTest { .firstname(IDENTIFIER_1_CREATOR_1_FIRSTNAME) .lastname(IDENTIFIER_1_CREATOR_1_LASTNAME) .creatorName(IDENTIFIER_1_CREATOR_1_NAME) + .nameType(NameType.PERSONAL) .nameIdentifier(IDENTIFIER_1_CREATOR_1_ORCID) .nameIdentifierScheme(IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE) .affiliation(IDENTIFIER_1_CREATOR_1_AFFILIATION) @@ -5944,6 +5965,7 @@ public abstract class BaseTest { .firstname(IDENTIFIER_1_CREATOR_1_FIRSTNAME) .lastname(IDENTIFIER_1_CREATOR_1_LASTNAME) .creatorName(IDENTIFIER_1_CREATOR_1_NAME) + .nameType(NameTypeDto.PERSONAL) .nameIdentifier(IDENTIFIER_1_CREATOR_1_ORCID) .nameIdentifierScheme(IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE_DTO) .affiliation(IDENTIFIER_1_CREATOR_1_AFFILIATION) @@ -5957,6 +5979,7 @@ public abstract class BaseTest { .firstname(IDENTIFIER_1_CREATOR_1_FIRSTNAME) .lastname(IDENTIFIER_1_CREATOR_1_LASTNAME) .creatorName(IDENTIFIER_1_CREATOR_1_NAME) + .nameType(NameTypeDto.PERSONAL) .nameIdentifier(IDENTIFIER_1_CREATOR_1_ORCID) .nameIdentifierScheme(IDENTIFIER_1_CREATOR_1_IDENTIFIER_SCHEME_TYPE_DTO) .affiliation(IDENTIFIER_1_CREATOR_1_AFFILIATION) @@ -7127,7 +7150,7 @@ public abstract class BaseTest { public final static String BANNER_MESSAGE_1_MESSAGE = "Next maintenance in 7 days!"; public final static BannerMessageType BANNER_MESSAGE_1_TYPE = BannerMessageType.INFO; public final static BannerMessageTypeDto BANNER_MESSAGE_1_TYPE_DTO = BannerMessageTypeDto.INFO; - public final static Instant BANNER_MESSAGE_1_START = Instant.ofEpochSecond(1684577786L); + public final static Instant BANNER_MESSAGE_1_START = Instant.ofEpochSecond(1684577786L) /* 2022-12-23 22:00:00 (UTC) */; public final static Instant BANNER_MESSAGE_1_END = null; public final static BannerMessage BANNER_MESSAGE_1 = BannerMessage.builder() @@ -7156,8 +7179,8 @@ public abstract class BaseTest { public final static String BANNER_MESSAGE_2_MESSAGE = "No operation on Christmas 2022!"; public final static BannerMessageType BANNER_MESSAGE_2_TYPE = BannerMessageType.ERROR; public final static BannerMessageTypeDto BANNER_MESSAGE_2_TYPE_DTO = BannerMessageTypeDto.ERROR; - public final static Instant BANNER_MESSAGE_2_START = Instant.ofEpochSecond(1671836400L); - public final static Instant BANNER_MESSAGE_2_END = Instant.ofEpochSecond(1672009200L); + public final static Instant BANNER_MESSAGE_2_START = Instant.ofEpochSecond(1671836400L) /* 2022-12-23 22:00:00 (UTC) */; + public final static Instant BANNER_MESSAGE_2_END = Instant.ofEpochSecond(1672009200L) /* 2022-12-25 22:00:00 (UTC) */; public final static BannerMessage BANNER_MESSAGE_2 = BannerMessage.builder() .id(BANNER_MESSAGE_2_ID) @@ -7759,6 +7782,7 @@ public abstract class BaseTest { public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>(List.of("`mintemp` > 0"))) .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder() + .id(1L) .name("fk_location") .onDelete(ReferenceType.NO_ACTION) .references(new LinkedList<>(List.of(ForeignKeyReference.builder() diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index eb09848759a147926fba0ab1e90c0999ac21fa1a..c7e1f6005d78d40641abae50f4bb3189251aac42 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", - "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", - "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", - "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", - "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", - "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", - "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", - "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", - "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", - "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", - "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", - "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", - "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", - "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", - "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", - "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", - "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", - "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", - "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", - "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", - "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", - "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", - "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", - "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", - "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", - "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", - "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", - "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", - "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", - "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", - "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", - "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", - "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", - "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", - "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", - "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", - "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", - "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", - "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", - "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", - "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", - "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", - "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", - "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", - "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", - "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", - "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", - "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", - "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", - "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", - "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", - "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", - "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", - "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", - "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", - "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", - "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", - "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", - "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", - "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", - "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", - "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", - "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", - "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", - "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", - "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", - "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", - "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", - "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", - "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", - "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", - "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", - "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", - "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", - "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", - "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" + "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", + "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33", + "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", + "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", + "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9", + "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e", + "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350", + "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226", + "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", + "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a", + "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6", + "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add", + "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", + "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", + "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", + "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e", + "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", + "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1", + "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c", + "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", + "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5", + "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e", + "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", + "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3", + "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438", + "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", + "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3", + "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", + "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", + "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2", + "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", + "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c", + "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55", + "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", + "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e", + "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1", + "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", + "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", + "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", + "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", + "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1", + "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", + "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", + "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", + "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", + "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8", + "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", + "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", + "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", + "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", + "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", + "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef", + "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28", + "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", + "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", + "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", + "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", + "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", + "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", + "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", + "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745", + "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", + "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", + "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43", + "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", + "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", + "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd", + "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d", + "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", + "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", + "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", + "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", + "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", + "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f", + "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", + "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e" ], "markers": "python_version >= '3.9'", - "version": "==3.11.10" + "version": "==3.11.11" }, "aiosignal": { "hashes": [ @@ -124,11 +124,11 @@ }, "attrs": { "hashes": [ - "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", - "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" + "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", + "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308" ], - "markers": "python_version >= '3.7'", - "version": "==24.2.0" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "blinker": { "hashes": [ @@ -140,11 +140,11 @@ }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "cffi": { "hashes": [ @@ -221,122 +221,109 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "version": "==8.1.8" }, "cryptography": { "hashes": [ @@ -373,7 +360,7 @@ }, "dbrepo": { "hashes": [ - "sha256:52b776f5be91b9529c0f8cb1d006824f67e5da2f3d5bad4becc0857229036c19" + "sha256:769c6d9c4475b26d3f752dcc9910346798d31afeca45ef014f48dd293074b8fb" ], "path": "./lib/dbrepo-1.6.0.tar.gz" }, @@ -653,11 +640,11 @@ }, "jinja2": { "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb" ], "markers": "python_version >= '3.7'", - "version": "==3.1.4" + "version": "==3.1.5" }, "jsonschema": { "hashes": [ @@ -752,11 +739,11 @@ }, "mistune": { "hashes": [ - "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", - "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" + "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", + "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667" ], - "markers": "python_version >= '3.7'", - "version": "==3.0.2" + "markers": "python_version >= '3.8'", + "version": "==3.1.0" }, "multidict": { "hashes": [ @@ -858,64 +845,64 @@ }, "numpy": { "hashes": [ - "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", - "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", - "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", - "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", - "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", - "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", - "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", - "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", - "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", - "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", - "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", - "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", - "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", - "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", - "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", - "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", - "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", - "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", - "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", - "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", - "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", - "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", - "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", - "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", - "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", - "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", - "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", - "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", - "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", - "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", - "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", - "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", - "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", - "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", - "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", - "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", - "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", - "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", - "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", - "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", - "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", - "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", - "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", - "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", - "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", - "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", - "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", - "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", - "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", - "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", - "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", - "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", - "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", - "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", - "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" + "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2", + "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", + "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", + "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", + "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", + "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8", + "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", + "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16", + "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", + "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591", + "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964", + "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", + "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484", + "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957", + "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800", + "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", + "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95", + "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0", + "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", + "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", + "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73", + "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", + "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", + "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", + "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", + "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e", + "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440", + "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675", + "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", + "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", + "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", + "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", + "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308", + "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", + "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3", + "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", + "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5", + "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", + "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", + "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", + "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf", + "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab", + "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd", + "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf", + "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", + "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb", + "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", + "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", + "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", + "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", + "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", + "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528", + "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", + "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7", + "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51" ], "markers": "python_version == '3.11'", - "version": "==2.2.0" + "version": "==2.2.1" }, "opensearch-py": { "hashes": [ @@ -1112,117 +1099,117 @@ }, "pydantic": { "hashes": [ - "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d", - "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9" + "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", + "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06" ], "markers": "python_version >= '3.8'", - "version": "==2.10.3" + "version": "==2.10.4" }, "pydantic-core": { "hashes": [ - "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9", - "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b", - "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c", - "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", - "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", - "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854", - "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d", - "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278", - "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a", - "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", - "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f", - "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27", - "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f", - "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", - "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", - "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97", - "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", - "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", - "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", - "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4", - "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", - "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131", - "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", - "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd", - "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", - "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", - "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6", - "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60", - "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", - "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", - "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08", - "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05", - "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2", - "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", - "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c", - "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17", - "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62", - "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", - "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be", - "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067", - "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", - "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f", - "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", - "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840", - "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5", - "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807", - "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", - "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", - "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864", - "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e", - "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a", - "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", - "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", - "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a", - "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3", - "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", - "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", - "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31", - "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", - "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", - "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6", - "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36", - "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c", - "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154", - "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", - "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", - "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd", - "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3", - "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", - "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78", - "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", - "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618", - "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", - "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4", - "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", - "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c", - "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", - "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", - "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792", - "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", - "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9", - "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f", - "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01", - "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", - "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", - "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f", - "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd", - "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", - "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab", - "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", - "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676", - "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", - "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed", - "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", - "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967", - "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", - "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", - "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c", - "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206", - "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b" + "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", + "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", + "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", + "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", + "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", + "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", + "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", + "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", + "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", + "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", + "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", + "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", + "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", + "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", + "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", + "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", + "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", + "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", + "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", + "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", + "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", + "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", + "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", + "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", + "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", + "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", + "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", + "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", + "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", + "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", + "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", + "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", + "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", + "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", + "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", + "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", + "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", + "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", + "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320", + "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", + "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", + "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", + "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046", + "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", + "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", + "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", + "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", + "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", + "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", + "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", + "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", + "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", + "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", + "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", + "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", + "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", + "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", + "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145", + "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", + "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", + "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", + "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", + "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", + "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", + "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5", + "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", + "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", + "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", + "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", + "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da", + "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", + "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", + "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", + "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", + "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", + "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", + "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", + "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d", + "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", + "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", + "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", + "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", + "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a", + "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9", + "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506", + "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", + "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1", + "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", + "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", + "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", + "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", + "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", + "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", + "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", + "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", + "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", + "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228", + "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b", + "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", + "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad" ], "markers": "python_version >= '3.8'", - "version": "==2.27.1" + "version": "==2.27.2" }, "pyjwt": { "hashes": [ @@ -1234,11 +1221,11 @@ }, "pyparsing": { "hashes": [ - "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84", - "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c" + "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", + "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a" ], "markers": "python_version >= '3.9'", - "version": "==3.2.0" + "version": "==3.2.1" }, "pytest": { "hashes": [ @@ -1595,11 +1582,11 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], "markers": "python_version >= '3.10'", - "version": "==2.2.3" + "version": "==2.3.0" }, "werkzeug": { "hashes": [ @@ -1772,191 +1759,178 @@ "develop": { "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "coverage": { "hashes": [ - "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", - "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", - "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", - "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", - "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", - "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", - "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", - "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", - "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", - "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", - "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", - "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", - "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", - "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", - "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", - "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", - "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", - "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", - "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", - "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", - "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", - "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", - "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", - "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", - "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", - "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", - "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", - "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", - "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", - "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", - "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", - "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", - "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", - "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", - "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", - "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", - "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", - "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", - "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", - "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", - "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", - "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", - "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", - "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", - "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", - "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", - "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", - "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", - "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", - "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", - "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", - "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", - "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", - "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", - "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", - "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", - "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", - "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", - "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", - "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", - "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", - "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" + "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", + "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", + "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", + "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", + "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", + "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", + "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", + "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", + "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", + "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", + "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", + "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", + "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", + "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", + "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", + "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", + "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", + "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", + "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", + "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", + "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", + "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", + "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", + "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", + "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", + "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", + "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", + "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", + "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", + "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", + "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", + "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", + "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", + "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", + "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", + "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", + "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", + "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", + "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", + "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", + "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", + "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", + "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", + "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", + "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", + "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", + "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", + "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", + "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", + "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", + "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", + "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", + "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", + "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", + "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", + "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", + "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", + "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", + "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", + "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", + "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", + "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.9" + "version": "==7.6.10" }, "idna": { "hashes": [ @@ -2018,11 +1992,11 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], "markers": "python_version >= '3.10'", - "version": "==2.2.3" + "version": "==2.3.0" } } } diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index 69778a8caf8b4c11ffb60269d523904073e1f308..4362403bdd15b3976ac8f2c1b10a51bb63ba63ba 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", - "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", - "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", - "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", - "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", - "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", - "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", - "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", - "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", - "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", - "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", - "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", - "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", - "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", - "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", - "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", - "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", - "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", - "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", - "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", - "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", - "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", - "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", - "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", - "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", - "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", - "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", - "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", - "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", - "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", - "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", - "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", - "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", - "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", - "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", - "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", - "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", - "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", - "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", - "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", - "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", - "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", - "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", - "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", - "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", - "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", - "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", - "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", - "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", - "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", - "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", - "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", - "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", - "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", - "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", - "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", - "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", - "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", - "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", - "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", - "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", - "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", - "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", - "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", - "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", - "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", - "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", - "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", - "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", - "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", - "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", - "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", - "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", - "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", - "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", - "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" + "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", + "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33", + "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", + "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", + "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9", + "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e", + "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350", + "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226", + "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", + "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a", + "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6", + "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add", + "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", + "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", + "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", + "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e", + "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", + "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1", + "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c", + "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", + "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5", + "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e", + "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", + "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3", + "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438", + "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", + "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3", + "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", + "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", + "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2", + "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", + "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c", + "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55", + "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", + "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e", + "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1", + "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", + "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", + "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", + "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", + "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1", + "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", + "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", + "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", + "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", + "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8", + "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", + "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", + "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", + "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", + "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", + "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef", + "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28", + "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", + "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", + "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", + "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", + "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", + "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", + "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", + "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745", + "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", + "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", + "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43", + "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", + "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", + "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd", + "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d", + "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", + "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", + "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", + "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", + "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", + "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f", + "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", + "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e" ], "markers": "python_version >= '3.9'", - "version": "==3.11.10" + "version": "==3.11.11" }, "aiosignal": { "hashes": [ @@ -124,11 +124,11 @@ }, "attrs": { "hashes": [ - "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", - "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" + "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", + "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308" ], - "markers": "python_version >= '3.7'", - "version": "==24.2.0" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "blinker": { "hashes": [ @@ -140,130 +140,117 @@ }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "version": "==8.1.8" }, "dbrepo": { "hashes": [ @@ -420,11 +407,11 @@ }, "jinja2": { "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb" ], "markers": "python_version >= '3.7'", - "version": "==3.1.4" + "version": "==3.1.5" }, "markupsafe": { "hashes": [ @@ -593,64 +580,64 @@ }, "numpy": { "hashes": [ - "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", - "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", - "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", - "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", - "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", - "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", - "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", - "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", - "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", - "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", - "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", - "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", - "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", - "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", - "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", - "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", - "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", - "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", - "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", - "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", - "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", - "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", - "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", - "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", - "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", - "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", - "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", - "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", - "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", - "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", - "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", - "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", - "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", - "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", - "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", - "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", - "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", - "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", - "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", - "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", - "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", - "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", - "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", - "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", - "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", - "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", - "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", - "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", - "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", - "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", - "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", - "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", - "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", - "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", - "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" + "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2", + "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", + "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", + "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", + "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", + "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8", + "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", + "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16", + "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", + "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591", + "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964", + "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", + "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484", + "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957", + "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800", + "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", + "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95", + "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0", + "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", + "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", + "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73", + "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", + "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", + "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", + "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", + "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e", + "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440", + "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675", + "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", + "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", + "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", + "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", + "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308", + "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", + "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3", + "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", + "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5", + "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", + "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", + "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", + "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf", + "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab", + "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd", + "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf", + "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", + "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb", + "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", + "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", + "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", + "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", + "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", + "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528", + "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", + "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7", + "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51" ], "markers": "python_version == '3.11'", - "version": "==2.2.0" + "version": "==2.2.1" }, "opensearch-py": { "hashes": [ @@ -823,125 +810,125 @@ }, "pydantic": { "hashes": [ - "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d", - "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9" + "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", + "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06" ], "markers": "python_version >= '3.8'", - "version": "==2.10.3" + "version": "==2.10.4" }, "pydantic-core": { "hashes": [ - "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9", - "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b", - "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c", - "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", - "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", - "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854", - "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d", - "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278", - "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a", - "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", - "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f", - "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27", - "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f", - "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", - "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", - "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97", - "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", - "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", - "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", - "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4", - "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", - "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131", - "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", - "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd", - "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", - "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", - "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6", - "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60", - "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", - "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", - "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08", - "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05", - "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2", - "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", - "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c", - "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17", - "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62", - "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", - "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be", - "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067", - "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", - "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f", - "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", - "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840", - "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5", - "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807", - "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", - "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", - "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864", - "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e", - "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a", - "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", - "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", - "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a", - "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3", - "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", - "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", - "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31", - "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", - "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", - "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6", - "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36", - "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c", - "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154", - "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", - "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", - "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd", - "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3", - "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", - "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78", - "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", - "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618", - "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", - "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4", - "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", - "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c", - "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", - "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", - "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792", - "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", - "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9", - "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f", - "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01", - "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", - "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", - "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f", - "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd", - "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", - "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab", - "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", - "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676", - "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", - "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed", - "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", - "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967", - "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", - "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", - "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c", - "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206", - "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b" + "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", + "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", + "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", + "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", + "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", + "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", + "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", + "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", + "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", + "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", + "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", + "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", + "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", + "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", + "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", + "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", + "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", + "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", + "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", + "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", + "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", + "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", + "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", + "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", + "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", + "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", + "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", + "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", + "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", + "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", + "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", + "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", + "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", + "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", + "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", + "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", + "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", + "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", + "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320", + "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", + "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", + "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", + "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046", + "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", + "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", + "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", + "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", + "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", + "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", + "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", + "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", + "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", + "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", + "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", + "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", + "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", + "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", + "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145", + "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", + "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", + "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", + "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", + "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", + "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", + "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5", + "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", + "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", + "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", + "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", + "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da", + "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", + "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", + "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", + "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", + "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", + "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", + "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", + "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d", + "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", + "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", + "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", + "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", + "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a", + "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9", + "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506", + "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", + "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1", + "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", + "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", + "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", + "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", + "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", + "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", + "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", + "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", + "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", + "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228", + "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b", + "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", + "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad" ], "markers": "python_version >= '3.8'", - "version": "==2.27.1" + "version": "==2.27.2" }, "pyparsing": { "hashes": [ - "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84", - "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c" + "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", + "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a" ], "markers": "python_version >= '3.9'", - "version": "==3.2.0" + "version": "==3.2.1" }, "pytest": { "hashes": [ @@ -1050,11 +1037,11 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], "markers": "python_version >= '3.10'", - "version": "==2.2.3" + "version": "==2.3.0" }, "werkzeug": { "hashes": [ @@ -1227,72 +1214,72 @@ "develop": { "coverage": { "hashes": [ - "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", - "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", - "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", - "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", - "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", - "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", - "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", - "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", - "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", - "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", - "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", - "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", - "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", - "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", - "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", - "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", - "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", - "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", - "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", - "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", - "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", - "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", - "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", - "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", - "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", - "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", - "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", - "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", - "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", - "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", - "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", - "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", - "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", - "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", - "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", - "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", - "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", - "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", - "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", - "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", - "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", - "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", - "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", - "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", - "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", - "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", - "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", - "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", - "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", - "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", - "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", - "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", - "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", - "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", - "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", - "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", - "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", - "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", - "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", - "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", - "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", - "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" + "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", + "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", + "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", + "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", + "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", + "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", + "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", + "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", + "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", + "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", + "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", + "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", + "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", + "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", + "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", + "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", + "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", + "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", + "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", + "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", + "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", + "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", + "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", + "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", + "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", + "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", + "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", + "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", + "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", + "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", + "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", + "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", + "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", + "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", + "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", + "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", + "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", + "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", + "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", + "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", + "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", + "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", + "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", + "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", + "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", + "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", + "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", + "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", + "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", + "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", + "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", + "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", + "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", + "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", + "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", + "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", + "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", + "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", + "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", + "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", + "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", + "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.9" + "version": "==7.6.10" }, "iniconfig": { "hashes": [ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz index 9e5365baf3dd79d695a606637d225eaf2e72a751..80c2ba74f662e7b02895122a37e301fde2157b82 100644 Binary files a/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz and b/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz b/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz index 9e5365baf3dd79d695a606637d225eaf2e72a751..80c2ba74f662e7b02895122a37e301fde2157b82 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz and b/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz differ diff --git a/dbrepo-search-service/test/test_app.py b/dbrepo-search-service/test/test_app.py index 8621f6a0a42f744b2dba09dbc3ef4c0f3afe73cc..0482ff3f586050f49135039bb36ec5d16320396d 100644 --- a/dbrepo-search-service/test/test_app.py +++ b/dbrepo-search-service/test/test_app.py @@ -3,8 +3,8 @@ import time import unittest import jwt -from dbrepo.api.dto import Database, User, Container, Image, Table, Constraints, Column, ColumnType, Concept, Unit, \ - UserBrief +from dbrepo.api.dto import Database, Table, Constraints, Column, ColumnType, Concept, Unit, \ + UserBrief, ContainerBrief, ImageBrief from app import app @@ -16,21 +16,14 @@ req = Database(id=1, exchange_name="dbrepo", is_public=True, is_schema_public=True, - container=Container(id=1, - name="MariaDB", - internal_name="mariadb", - host="data-db", - port="3306", - sidecar_host="data-db-sidecar", - sidecar_port=3305, - image=Image(id=1, - registry="docker.io", - name="mariadb", - version="11.1.3", - dialect="org.hibernate.dialect.MariaDBDialect", - driver_class="org.mariadb.jdbc.Driver", - jdbc_method="mariadb", - default_port=3306)), + container=ContainerBrief(id=1, + name="MariaDB", + internal_name="mariadb", + host="data-db", + image=ImageBrief(id=1, + name="mariadb", + version="11.1.3", + jdbc_method="mariadb")), tables=[Table(id=1, database_id=1, name="Data", internal_name="data", owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), constraints=Constraints(uniques=[], foreign_keys=[], checks=[], primary_key=[]), diff --git a/dbrepo-search-service/test/test_opensearch_client.py b/dbrepo-search-service/test/test_opensearch_client.py index dc17c01d3ba8d8de82ce6ec339a463c45584caa4..295b2917af7995f56ef0d962fac0948334c9aeff 100644 --- a/dbrepo-search-service/test/test_opensearch_client.py +++ b/dbrepo-search-service/test/test_opensearch_client.py @@ -1,9 +1,8 @@ -import datetime import unittest import opensearchpy -from dbrepo.api.dto import Database, Container, Image, Table, Column, ColumnType, Constraints, PrimaryKey, \ - TableMinimal, ColumnMinimal, Concept, Unit, UserBrief +from dbrepo.api.dto import Database, Table, Column, ColumnType, Constraints, PrimaryKey, \ + TableMinimal, ColumnMinimal, Concept, Unit, UserBrief, ContainerBrief, ImageBrief from opensearchpy import NotFoundError from app import app @@ -17,21 +16,14 @@ req = Database(id=1, exchange_name="dbrepo", is_public=True, is_schema_public=True, - container=Container(id=1, - name="MariaDB", - internal_name="mariadb", - host="data-db", - port="3306", - sidecar_host="data-db-sidecar", - sidecar_port=3305, - image=Image(id=1, - registry="docker.io", - name="mariadb", - version="11.1.3", - dialect="org.hibernate.dialect.MariaDBDialect", - driver_class="org.mariadb.jdbc.Driver", - jdbc_method="mariadb", - default_port=3306)), + container=ContainerBrief(id=1, + name="MariaDB", + internal_name="mariadb", + host="data-db", + image=ImageBrief(id=1, + name="mariadb", + version="11.1.3", + jdbc_method="mariadb")), tables=[Table(id=1, database_id=1, name="Data", diff --git a/dbrepo-storage-service/init/Dockerfile b/dbrepo-storage-service/init/Dockerfile index cf1f23ead3a7dcd69166c54f8ddea5528ff49167..4f4f0c797434901d27311cadbbe250bb0e96c480 100644 --- a/dbrepo-storage-service/init/Dockerfile +++ b/dbrepo-storage-service/init/Dockerfile @@ -1,7 +1,13 @@ -FROM docker.io/bitnami/seaweedfs:3.80.0-debian-12-r1 AS runtime +FROM docker.io/python:3.11-alpine3.21 AS runtime +LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" + +RUN apk add --no-cache bash \ + && pip install s3cmd + +USER 1001 WORKDIR /app -COPY ./create-buckets.sh ./create-buckets.sh +COPY --chown=1001 --chmod=0744 ./init.sh /app/init.sh -ENTRYPOINT [ "/bin/sh", "/app/create-buckets.sh" ] \ No newline at end of file +ENTRYPOINT [ "bash", "-c", "/app/init.sh" ] diff --git a/dbrepo-storage-service/init/create-buckets.sh b/dbrepo-storage-service/init/create-buckets.sh deleted file mode 100644 index 316a4cf11ee824101e7c23d688387dabf143bff7..0000000000000000000000000000000000000000 --- a/dbrepo-storage-service/init/create-buckets.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -S3_BUCKET=${S3_BUCKET:-dbrepo} - -function log { - echo "$(date '+%Y-%m-%d %H:%M:%S') $1" -} - -log "SeaweedFS master is set to ${WEED_CLUSTER_SW_MASTER}" -log "Starting to create bucket ${S3_BUCKET}" -echo "s3.bucket.create -name ${S3_BUCKET}" | weed shell -master="${WEED_CLUSTER_SW_MASTER}" -log "Created bucket ${S3_BUCKET}" diff --git a/dbrepo-storage-service/init/init.sh b/dbrepo-storage-service/init/init.sh new file mode 100644 index 0000000000000000000000000000000000000000..50ead671dba3a1f2058ee861e0d8569dc43f167f --- /dev/null +++ b/dbrepo-storage-service/init/init.sh @@ -0,0 +1,12 @@ +#!/bin/bash +cat << EOF > /app/config/.s3cfg +access_key = ${S3_ACCESS_KEY_ID} +secret_key = ${S3_SECRET_ACCESS_KEY} +# Setup endpoint +host_base = ${STORAGE_ENDPOINT} +host_bucket = ${STORAGE_ENDPOINT} +use_https = False +# Enable S3 v4 signature APIs +signature_v2 = False +EOF +s3cmd --config=/app/config/.s3cfg mb s3://${S3_BUCKET} \ No newline at end of file diff --git a/dbrepo-ui/components/database/DatabaseCreate.vue b/dbrepo-ui/components/database/DatabaseCreate.vue index cd854897905dff7165fdadb10ff44b46d41c6479..d0f386b08899b2c3f911958297e88d7d67bba4f8 100644 --- a/dbrepo-ui/components/database/DatabaseCreate.vue +++ b/dbrepo-ui/components/database/DatabaseCreate.vue @@ -54,30 +54,12 @@ </v-col> </v-row> <v-row> - <v-col - md="6"> - <v-select - v-model="payload.is_public" - name="public" - :label="$t('pages.database.subpages.create.data.label')" - :hint="$t('pages.database.subpages.create.data.hint')" - persistent-hint - :variant="inputVariant" - :items="visibilityOptions" - item-title="name" - item-value="value" - :rules="[v => !!v || $t('validation.required')]" - return-object - required> - </v-select> - </v-col> - <v-col - md="6"> + <v-col> <v-select - v-model="payload.is_schema_public" - name="schema-public" - :label="$t('pages.database.subpages.create.schema.label')" - :hint="$t('pages.database.subpages.create.schema.hint')" + v-model="mode" + name="mode" + :label="$t('pages.database.subpages.create.visibility.label')" + :hint="$t('pages.database.subpages.create.visibility.hint')" persistent-hint :variant="inputVariant" :items="visibilityOptions" @@ -86,6 +68,19 @@ :rules="[v => !!v || $t('validation.required')]" return-object required> + <template + v-slot:append-inner> + <v-tooltip + location="bottom"> + <template + v-slot:activator="{ props }"> + <v-icon + v-bind="props" + icon="mdi-help-circle-outline" /> + </template> + {{ mode.hint }} + </v-tooltip> + </template> </v-select> </v-col> </v-row> @@ -125,14 +120,17 @@ export default { engines: [], visibilityOptions: [ { - name: this.$t('toolbars.database.public'), + name: this.$t('pages.database.subpages.create.visibility.public.label'), + hint: this.$t('pages.database.subpages.create.visibility.public.hint'), value: true }, { - name: this.$t('toolbars.database.private'), + name: this.$t('pages.database.subpages.create.visibility.private.label'), + hint: this.$t('pages.database.subpages.create.visibility.private.hint'), value: false } ], + mode: true, payload: { name: null, is_public: true, @@ -151,6 +149,7 @@ export default { } }, mounted () { + this.mode = this.visibilityOptions[0] this.fetchContainers() }, methods: { @@ -186,6 +185,8 @@ export default { create () { this.loading = true this.payload.container_id = this.engine.id + this.payload.is_public = this.mode.value + this.payload.is_schema_public = this.mode.value const databaseService = useDatabaseService() databaseService.create(this.payload) .then(async (database) => { diff --git a/dbrepo-ui/locales/de-AT.json b/dbrepo-ui/locales/de-AT.json index 3cf6c0dfc11e86a397c605c76c7a316fa30d5e8f..0d74629dfc8afa41969353abc66560e27f95fee4 100644 --- a/dbrepo-ui/locales/de-AT.json +++ b/dbrepo-ui/locales/de-AT.json @@ -1,11 +1,13 @@ { "navigation": { + "logo": "Logo", "information": "Information", "search": "Suchen", + "container": "Engine", "ontologies": "Ontologien", - "logout": "Ausloggen", - "login": "Anmelden", - "signup": "Registrieren", + "logout": "Abmelden", + "login": "Login", + "signup": "Melden Sie sich an", "databases": "Datenbanken", "identifiers": "Identifikatoren", "tables": "Tabellen", @@ -16,22 +18,26 @@ "assign": "Zuordnen", "back": "Zurück", "schema": "Schema", - "persist": "Persistieren", + "persist": "Speichern", "cancel": "Abbrechen", "user": "Benutzer", - "import": "Importieren", + "import": "Daten importieren", "delete": "Löschen", "recommend": "Empfehlen", "now": "Jetzt", "settings": "Einstellungen", "views": "Ansichten", - "create": "Erstelle", + "create": "Erstellen", "semantics": "Semantik", "yes": "Ja", "no": "Nein", - "mine": "(Meine)", - "loading": "Lade", - "view": "Ansicht" + "mine": "(meins)", + "loading": "Laden", + "view": "Sicht", + "modify": "Ändern", + "help": "Helfen", + "visibility": "Sichtbarkeit", + "update": "Aktualisieren" }, "pages": { "identifier": { @@ -47,10 +53,10 @@ }, "titles": { "title": "Titel", - "none": "(Kein Titel)" + "none": "(kein Titel)" }, "creators": { - "title": "Ersteller" + "title": "Schöpfer" }, "language": { "title": "Sprache" @@ -72,7 +78,7 @@ }, "descriptions": { "title": "Beschreibungen", - "none": "(Keine Beschreibung)" + "none": "(keine Beschreibung)" }, "publisher": { "title": "Herausgeber" @@ -120,7 +126,7 @@ "subtitle": "Haben Sie bereits einen DOI für diesen Datensatz?", "label": "Geben Sie hier Ihren bestehenden DOI an", "hint": "Ein DOI ermöglicht die einfache und eindeutige Zitierung Ihres Uploads. ", - "mint": "Nach dem Speichern wird ein PID erstellt" + "mint": "Nach dem Speichern wird eine PID erstellt" }, "doi": { "mint": "Nach dem Speichern wird ein DOI erstellt" @@ -153,7 +159,7 @@ "hint": "Erforderlich" }, "related-identifiers": { - "title": "Verwandter Bezeichner", + "title": "Zugehöriger Bezeichner", "subtitle": "Bezeichner verwandter Ressourcen. ", "identifier": { "label": "Kennung", @@ -194,7 +200,7 @@ "subtitle": "Informationen zur finanziellen Unterstützung (Finanzierung) für den zu registrierenden Datensatz", "identifier": { "label": "Kennung des Geldgebers", - "hint": "Verwenden Sie eine Namenskennung, ausgedrückt als URL von ORCID*, ROR*, DOI*, ISNI, GND (Schemata mit * unterstützen den automatischen Metadatenabruf)" + "hint": "Verwenden Sie eine Namenskennung, ausgedrückt als URL von ORCID*, ROR*, DOI*, ISNI, GND (Schemata mit * unterstützen den automatischen Metadatenabruf)." }, "name": { "label": "Name des Geldgebers", @@ -219,7 +225,7 @@ "subtitle": "Die wichtigsten Forscher, die an der Erstellung der Daten beteiligt waren, in der Reihenfolge ihrer Priorität", "identifier": { "label": "Namensbezeichner", - "hint": "Verwenden Sie eine Namenskennung, ausgedrückt als URL von ORCID*, ROR*, DOI*, ISNI, GND (Schemata mit * unterstützen den automatischen Metadatenabruf)" + "hint": "Verwenden Sie eine Namenskennung, ausgedrückt als URL von ORCID*, ROR*, DOI*, ISNI, GND (Schemata mit * unterstützen den automatischen Metadatenabruf)." }, "insert": { "text": "Füge mich ein" @@ -238,7 +244,7 @@ "hint": "" }, "family-name": { - "label": "Familienname", + "label": "Nachname", "hint": "" }, "name": { @@ -247,7 +253,7 @@ }, "affiliation-identifier": { "label": "Zugehörigkeitskennung", - "hint": "Verwenden Sie eine Zugehörigkeitskennung, ausgedrückt als URL von ORCID*, ROR*, DOI*, ISNI, GND (Schemata mit * unterstützen den automatischen Metadatenabruf)" + "hint": "Verwenden Sie eine Zugehörigkeitskennung, ausgedrückt als URL von ORCID*, ROR*, DOI*, ISNI, GND (Schemata mit * unterstützen den automatischen Metadatenabruf)." }, "affiliation": { "label": "Zugehörigkeitsname", @@ -270,31 +276,37 @@ } }, "table": { - "title": "Tabelle", + "title": "Tisch", "id": { - "title": "ID" + "title": "AUSWEIS" }, "broker": { - "title": "Broker" + "title": "Erweiterte Datenimportdetails" }, "connection": { - "title": "Verbindungsdetails", - "secure": "sicher", - "insecure": "unsicher", + "title": "Verbindung(en)", + "secure": "verschlüsselt", "permissions": { "write": "Sie können in diese Tabelle schreiben", "read": "Sie können den gesamten Inhalt dieser Tabelle lesen" } }, + "visibility": { + "title": "Sichtweite", + "open": "Offen", + "data": "Daten sind öffentlich", + "schema": "Schema ist öffentlich", + "closed": "Geschlossen" + }, "description": { "title": "Beschreibung", - "empty": "(Keine Beschreibung)" + "empty": "(keine Beschreibung)" }, "exchange": { - "title": "Exchange" + "title": "Exchange-Name" }, "queue": { - "title": "Queue" + "title": "Warteschlangenname" }, "routing-key": { "title": "Routing-Schlüssel" @@ -309,8 +321,8 @@ "size": { "title": "Größe" }, - "result-rows": { - "title": "Reihen" + "rows": { + "title": "Ergebniszeilen" }, "owner": { "title": "Eigentümer" @@ -324,13 +336,16 @@ "subpages": { "import": { "title": "Erstellen Sie eine Tabelle aus einem CSV-/TSV-Datensatz", - "text": "Importieren", + "text": "Import", "metadata": { "title": "Tabellenmetadaten" }, "schema": { "title": "Datensatzstruktur", - "text": "das Tabellenschema manuell." + "text": "das Tabellenschema manuell.", + "primary": { + "warn": "Keine Primärschlüsselspalte(n) ausgewählt. " + } }, "dataset": { "title": "Datensatz importieren", @@ -359,18 +374,18 @@ } }, "skip": { - "label": "Zeilen überspringen", - "hint": "Optional. " + "label": "Spaltenüberschriften", + "hint": "Erforderlich. " }, "storage": { - "text": "Datensatz vom Speicherdienst" + "text": "Hochgeladener Datensatz" }, "quote": { "label": "Angebotskodierung", "hint": "Optional. " }, "terminator": { - "label": "Codierung des Leitungsabschlusses", + "label": "Kodierung des Leitungsabschlusses", "hint": "Optional. ", "warn": { "prefix": "Wir haben Ihren .csv/.tsv-Datensatz analysiert und festgestellt, dass die von Ihnen angegebene Leitungsabschlusscodierung vorliegt", @@ -400,8 +415,7 @@ }, "summary": { "title": "Zusammenfassung", - "prefix": "Importiert", - "suffix": "Zeilen aus dem Datensatz" + "text": "Datensatz erfolgreich importiert" }, "analyse": { "text": "Hochladen und analysieren" @@ -434,7 +448,7 @@ } }, "drop": { - "title": "Tabelle Löschen", + "title": "Drop-Tisch", "warning": { "prefix": "Diese Aktion kann nicht rückgängig gemacht werden! ", "suffix": "unten, wenn Sie es wirklich mit allen gespeicherten Daten löschen möchten" @@ -445,7 +459,7 @@ } }, "schema": { - "title": "Systemversioniert", + "title": "Schema", "subtitle": "Tabellenbeschränkungen", "bullet": "●", "assign": "Zuordnen", @@ -459,7 +473,7 @@ "title": "Spaltentyp" }, "extra": { - "title": "Zusatzinformation" + "title": "Zusätzliche Informationen" }, "concept": { "title": "Konzept" @@ -471,7 +485,7 @@ "title": "Nullbar" }, "sequence": { - "title": "Reihenfolge" + "title": "Sequenz" }, "description": { "title": "Beschreibung" @@ -497,7 +511,7 @@ "label": "Primärschlüssel" }, "foreign-key": { - "label": "Unbekannter Schlüssel" + "label": "Fremdschlüssel" }, "references": { "label": "Ausländische Referenzen" @@ -540,8 +554,9 @@ "subtitle": "Wählen Sie einen Zeitstempel aus, um die Daten für diese bestimmte Tageszeit anzuzeigen", "chart": { "title": "Datenereignisse", - "ylabel": "# Veranstaltungen", - "xlabel": "Zeitstempel" + "legend": "Diagrammlegende: Grüne Farbe markiert Dateneinfügungen, rote Farbe markiert Datenlöschungen (=Datenaktualisierungen in manchen Fällen)", + "ylabel": "# Ereignisse", + "xlabel": "Datenzeitstempel (UTC)" }, "timestamp": { "label": "Zeitstempel", @@ -558,14 +573,14 @@ "hint": "Der Wert ist ein Primärschlüssel" }, "format": { - "hint": "Der Wert muss im Format vorliegen" + "hint": "Formathinweis:" }, "required": { "hint": "Erforderlich. " }, "float": { "max": "max", - "min": "Mindest", + "min": "min", "before": "Ziffer(n) vor dem Punkt", "after": "Ziffer(n) nach dem Punkt" } @@ -575,8 +590,8 @@ "database": { "title": "Datenbank", "image": { - "title": "Datenbankbild", - "alt": "Datenbanklogo/Standardbild" + "title": "Vorschaubild", + "alt": "Datenbankvorschaubild, das den Datensatz darstellt" }, "name": { "title": "Name" @@ -585,7 +600,11 @@ "title": "Interner Name" }, "visibility": { - "title": "Sichtweite" + "title": "Sichtweite", + "open": "Offen", + "data": "Daten sind öffentlich", + "schema": "Schema ist öffentlich", + "closed": "Geschlossen" }, "size": { "title": "Größe" @@ -598,7 +617,7 @@ }, "connection": { "title": "Verbindung", - "username": "Nutzername", + "username": "Benutzername", "password": "Passwort" }, "contact": { @@ -608,21 +627,18 @@ "access": { "title": "Datenbankzugriff", "subtitle": "Übersicht über Benutzer mit ihrem Zugriff auf die Datenbank", - "read": "Sie können alle Inhalte lesen", - "write-own": "Sie können eigene Tabellen schreiben und alle Inhalte lesen", - "write-all": "Sie können eigene Tabellen schreiben und alle Inhalte lesen", - "revoke": "Widerrufen", + "read": "Lesen Sie alle Inhalte", + "write-own": "Lesen Sie alle Inhalte und schreiben Sie eigene Tabellen", + "write-all": "Lesen Sie alle Inhalte und schreiben Sie alle Tabellen", + "revoke": "Kein Zugriff", "action": "Aktion", "username": { - "label": "Nutzername", + "label": "Benutzername", "hint": "Erforderlich" }, "type": { - "label": "Zugangsart", + "label": "Zugriffstyp", "hint": "Erforderlich" - }, - "submit": { - "text": "Ändern" } }, "create": { @@ -637,8 +653,23 @@ "label": "Motor", "hint": "Erforderlich" }, + "visibility": { + "label": "Sichtweite", + "hint": "Erforderlich", + "public": { + "label": "Öffentlich", + "hint": "Alles ist für die Öffentlichkeit sichtbar, z.B. " + }, + "private": { + "label": "Privat", + "hint": "Ohne dedizierten Lesezugriff ist für niemanden etwas sichtbar, z.B. " + } + }, "submit": { "text": "Erstellen" + }, + "utilization": { + "label": "Verwendung" } }, "tables": { @@ -670,13 +701,13 @@ "text": "Bild ändern" }, "image-remove": { - "text": "Entferne Bild" + "text": "Bild entfernen" }, "scheme": { "title": "Schema", "subtitle": "Aktualisieren Sie die Metadaten im Datenbankschema, um systemversionierte Tabellen und Ansichten in der Benutzeroberfläche anzuzeigen", "submit": { - "text": "Aktualisierung" + "text": "Aktualisieren" } }, "ownership": { @@ -690,10 +721,16 @@ }, "visibility": { "title": "Sichtweite", - "subtitle": "Private Datenbanken verbergen die Daten, während Metadaten weiterhin sichtbar sind. ", - "visibility": { - "label": "Datenbanksichtbarkeit", - "hint": "Erforderlich" + "subtitle": "", + "data": { + "label": "Datensichtbarkeit", + "hint": "Erforderlich", + "help": "Öffentlich = für jeden sichtbar, Privat = nur für bestimmte Benutzer sichtbar" + }, + "schema": { + "label": "Schema-Sichtbarkeit", + "hint": "Erforderlich", + "help": "Öffentlich = für jeden sichtbar, Privat = nur für bestimmte Benutzer sichtbar" }, "submit": { "text": "Ändern" @@ -709,7 +746,7 @@ "hint": "Erforderlich" }, "username": { - "label": "Nutzername", + "label": "Benutzername", "hint": "Erforderlich" }, "password": { @@ -717,7 +754,7 @@ "hint": "Erforderlich" }, "confirm": { - "label": "Bestätige das Passwort", + "label": "Passwort bestätigen", "hint": "Erforderlich" }, "submit": { @@ -725,9 +762,9 @@ } }, "login": { - "name": "Anmeldung", + "name": "Login", "username": { - "label": "Nutzername", + "label": "Benutzername", "hint": "Erforderlich" }, "password": { @@ -750,14 +787,14 @@ "label": "AUSWEIS" }, "username": { - "label": "Nutzername" + "label": "Benutzername" }, "firstname": { "label": "Vorname", "hint": "" }, "lastname": { - "label": "Familienname", + "label": "Nachname", "hint": "" }, "affiliation": { @@ -784,7 +821,7 @@ "dark": "Dunkel", "dark-contrast": "Dunkel – hoher Kontrast", "light": "Licht", - "light-contrast": "Licht – hoher Kontrast", + "light-contrast": "Hell – hoher Kontrast", "submit": { "text": "Aktualisieren" } @@ -794,14 +831,14 @@ "settings": { "subpages": { "authentication": { - "title": "Benutzer-Passwort", + "title": "Benutzerpasswort", "subtitle": "Aktualisieren Sie das Benutzerkennwort, das für die Basisauthentifizierung bei allen Schnittstellen verwendet wird", "password": { "label": "Passwort", "hint": "Erforderlich" }, "confirm": { - "label": "Bestätige das Passwort", + "label": "Passwort bestätigen", "hint": "Erforderlich" }, "submit": { @@ -814,14 +851,14 @@ "subtitle": "Sehen Sie sich Ihre Token-Geheimnisse zu Debugging-Zwecken an", "expiry": "Läuft ab", "access": { - "label": "Zugangstoken" + "label": "Zugriffstoken" }, "refresh": { "label": "Aktualisierungstoken" } }, "maintenance": { - "title": "Mitteilungen", + "title": "Nachrichten", "active": "Aktiv", "type": "Typ", "message": "Text", @@ -862,7 +899,7 @@ "view": { "title": "Sicht", "tabs": { - "info": "Die Info", + "info": "Info", "data": "Daten" }, "name": { @@ -871,8 +908,8 @@ "query": { "title": "Stellungnahme" }, - "creator": { - "title": "Schöpfer" + "owner": { + "title": "Eigentümer" }, "creation": { "title": "Schaffung" @@ -894,11 +931,6 @@ "columns": { "label": "Datenspalten", "hint": "Erforderlich" - }, - "visibility": { - "label": "Datensichtbarkeit", - "warn": "Nur Personen mit mindestens Leserechten können die Daten einsehen", - "hint": "Erforderlich. " } } } @@ -914,21 +946,21 @@ "query": { "title": "Abfrage" }, - "query-hash": { - "prefix": "sha256", - "title": "Abfrage-Hash" + "hash": { + "title": "Hash", + "prefix": "sha256" }, "executed": { "title": "Erstellt" }, - "result-hash": { - "title": "Ergebnis-Hash" + "result": { + "title": "Ergebnis" }, - "result-rows": { + "rows": { "title": "Ergebniszeilen" }, "tabs": { - "info": "Die Info", + "info": "Info", "data": "Daten" }, "subpages": { @@ -940,7 +972,7 @@ }, "expert": { "text": "Experte", - "warn": "Von der Verwendung von Kommentaren, Aggregationsfunktionen und den folgenden Vorgängen wird abgeraten" + "warn": "Von der Verwendung von Kommentaren, Aggregationsfunktionen, dem Semikolon und den folgenden Operationen wird abgeraten" }, "name": { "label": "" @@ -1031,10 +1063,13 @@ } }, "container": { - "title": "Container", + "title": "Motoren", "name": { "title": "Name" }, + "subtitle": { + "text": "Motor" + }, "internal-name": { "title": "Interner Name" }, @@ -1042,7 +1077,7 @@ "title": "Bild" }, "image-tag": { - "title": "Ausführung" + "title": "Version" } }, "semantics": { @@ -1066,20 +1101,22 @@ }, "axios": { "connection": "Kontakt zum Backend fehlgeschlagen", - "timeout": "Zeitüberschreitung der Verbindung" + "malformed": "Fehlerhafte Anfrage", + "timeout": "Zeitüberschreitung bei der Verbindung" }, "concept": { "missing": "Das Konzept konnte in der Metadatendatenbank nicht gefunden werden" }, "container": { "exists": "Der Container ist bereits in der Metadatendatenbank vorhanden", - "missing": "Der Container konnte in der Metadatendatenbank nicht gefunden werden" + "missing": "Der Container konnte in der Metadatendatenbank nicht gefunden werden", + "quota": "Das Datenbankkontingent in der Engine wurde überschritten" }, "data": { "connection": "Kontaktaufnahme zum Datendienst fehlgeschlagen", "invalid": "Die Kommunikation mit dem Datendienst ist fehlgeschlagen", "value": "Spaltenwert konnte nicht festgelegt werden", - "drift": "Die Uhr Ihres Browsers ist nicht mit UTC synchronisiert und scheint um 16:00 Uhr verschoben zu sein" + "drift": "Die Uhr Ihres Browsers ist nicht mit der UTC-Zeit synchronisiert und scheint um 16 Uhr verschoben zu sein" }, "database": { "connection": "Kontakt zur Datenbank konnte nicht hergestellt werden", @@ -1111,7 +1148,8 @@ "image": { "exists": "Das Bild ist bereits in der Metadatendatenbank vorhanden", "missing": "Das Bild konnte nicht in der Metadatendatenbank gefunden werden", - "invalid": "Bildmetadaten sind fehlerhaft" + "invalid": "Bildmetadaten sind fehlerhaft", + "size": "Die Bildgröße ist zu groß" }, "license": { "missing": "Die Lizenz konnte in der Metadatendatenbank nicht gefunden werden" @@ -1134,8 +1172,8 @@ "query": { "missing": "Die Abfrage konnte im Datendienst nicht gefunden werden", "invalid": "Die Abfrage ist ungültig", - "type.exists": "Abfrage konnte nicht erstellt werden: Kein solcher Spaltentyp", - "type.build": "Abfrage konnte nicht erstellt werden: Derzeit gibt es keine Abfrageerstellungsunterstützung für den Spaltentyp", + "exists": "Abfrage konnte nicht erstellt werden: Kein solcher Spaltentyp", + "build": "Abfrage konnte nicht erstellt werden: Derzeit gibt es keine Abfrageerstellungsunterstützung für den Spaltentyp", "column.exists": "Abfrage konnte nicht erstellt werden: In den Datenspalten fehlt die Spalte mit dem Namen" }, "store": { @@ -1173,7 +1211,7 @@ "user": { "exists": "Benutzer mit Benutzername ist in der Authentifizierungsdatenbank vorhanden", "missing": "Benutzer konnte in der Authentifizierungsdatenbank nicht gefunden werden", - "credentials": "Ungültige Benutzername und Passwort Kombination", + "credentials": "Ungültige Kombination aus Benutzername und Passwort", "email-exists": "Das Konto mit dieser E-Mail-Adresse existiert bereits", "setup": "Bitte ändern Sie Ihr Passwort" }, @@ -1245,7 +1283,8 @@ }, "table": { "created": "Tabelle erfolgreich erstellt", - "semantics": "Semantische Instanz erfolgreich zugewiesen" + "semantics": "Semantische Instanz erfolgreich zugewiesen", + "updated": "Tabelle erfolgreich aktualisiert" }, "schema": { "tables": "Die Metadaten der Datenbanktabellen wurden erfolgreich aktualisiert.", @@ -1263,7 +1302,7 @@ "pid": { "saved": "Kennung erfolgreich gespeichert", "created": "Kennung erfolgreich erstellt", - "published": "Erfolgreich veröffentlichte Kennung", + "published": "Identifikator erfolgreich veröffentlicht", "updated": "Kennung erfolgreich aktualisiert", "deleted": "Kennung erfolgreich gelöscht" }, @@ -1275,7 +1314,8 @@ }, "view": { "create": "Ansicht erfolgreich erstellt", - "delete": "Ansicht erfolgreich gelöscht" + "delete": "Ansicht erfolgreich gelöscht", + "modified": "Die Sichtbarkeit der Ansicht wurde erfolgreich geändert" }, "subset": { "create": "Teilmenge erfolgreich erstellt" @@ -1283,7 +1323,7 @@ }, "toolbars": { "user": { - "info": "Die Info", + "info": "Info", "authentication": "Authentifizierung", "developer": "Entwickler" }, @@ -1313,8 +1353,8 @@ "text": "Datenbank" }, "import-csv": { - "permanent": "Importieren", - "xl": "CSV" + "permanent": "Import", + "xl": "Datensatz" }, "dashboard": { "permanent": "Visualisieren", @@ -1328,6 +1368,10 @@ "permanent": "Sicht", "xl": "Erstellen" }, + "update-table": { + "permanent": "Tisch", + "xl": "Aktualisieren" + }, "create-table": { "permanent": "Tisch", "xl": "Erstellen" @@ -1337,7 +1381,7 @@ "xl": "Erhalten" }, "info": { - "tab": "Die Info" + "tab": "Info" }, "tables": { "tab": "Tische" @@ -1379,7 +1423,7 @@ }, "subset": { "save": { - "permanent": "Speichern" + "permanent": "Stern" }, "export": { "data": { @@ -1396,7 +1440,7 @@ "permanent": "PID" }, "unsave": { - "permanent": "Nicht speichern" + "permanent": "Unstar" } }, "view": { @@ -1407,7 +1451,7 @@ }, "table": { "data": { - "refresh": "Aktualisierung", + "refresh": "Aktualisieren", "add": "Hinzufügen", "edit": "Aktualisieren", "delete": "Löschen", @@ -1419,10 +1463,12 @@ } }, "validation": { - "required": "Pflichtfeld", + "required": "Erforderliches Feld", "integer": "Größer oder gleich Null", "max-length": "Die maximale Länge beträgt: ", "day": "Ungültiger Tag", + "min": "Wert zu klein", + "max": "Wert zu groß", "matching": "Nicht passend!", "doi": { "invalid": "Ungültiger DOI. " @@ -1432,6 +1478,9 @@ "pattern": "Ungültiger URI", "exists": "URI existiert" }, + "column": { + "exists": "Es existiert eine Spalte mit diesem Namen" + }, "user": { "pattern": "Nur Kleinbuchstaben, min. ", "exists": "Dieser Benutzername ist bereits vergeben" @@ -1440,7 +1489,7 @@ "exists": "Der Ansichtsname existiert bereits" }, "table": { - "exists": "Der Tabellenname existiert bereits" + "exists": "Tabellenname existiert bereits" }, "prefix": { "pattern": "Ungültiges Präfixmuster", @@ -1449,6 +1498,9 @@ }, "pattern": { "timestamp": "Muss im Format jjjj-MM-tt HH:mm:ss vorliegen" + }, + "image": { + "size": "Die Bildgröße ist zu groß" } } } diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index 162f4c09d2aa873820e8f4c84e6b73182825aa69..655ec2a345b98294cf6512c531f83a67c9196d3c 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -653,13 +653,17 @@ "label": "Engine", "hint": "Required" }, - "data": { - "label": "Data Visibility", - "hint": "Required" - }, - "schema": { - "label": "Schema Visibility", - "hint": "Required" + "visibility": { + "label": "Visibility", + "hint": "Required", + "public": { + "label": "Public", + "hint": "Everything is visible to the public, e.g. to publish data used in a open-access paper. You can later update the visibility of data." + }, + "private": { + "label": "Private", + "hint": "Nothing is visible to anyone without dedicated read-access, e.g. to work on a dataset. You can later update the visibility of data." + } }, "submit": { "text": "Create" diff --git a/docker-compose.yml b/docker-compose.yml index 3135784b164a04231ab92936b14d21e0855121d4..7159ff58cbb59eec4d114603c71c5ea4c52d51b1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: restart: "no" container_name: dbrepo-metadata-db hostname: metadata-db - image: docker.io/bitnami/mariadb-galera:11.1.3-debian-11-r8 + image: docker.io/bitnami/mariadb-galera:11.3.2-debian-12-r9 volumes: - metadata-db-data:/bitnami/mariadb - ./dbrepo-metadata-db/1_setup-schema.sql:/docker-entrypoint-initdb.d/1_setup-schema.sql @@ -37,7 +37,7 @@ services: restart: "no" container_name: dbrepo-data-db hostname: data-db - image: docker.io/bitnami/mariadb-galera:11.1.3-debian-11-r8 + image: docker.io/bitnami/mariadb-galera:11.3.2-debian-12-r9 volumes: - data-db-data:/bitnami/mariadb - "${SHARED_VOLUME:-/tmp}:/tmp" @@ -112,6 +112,7 @@ services: init: true restart: "no" image: dbrepo-auth-service-init:latest + container_name: dbrepo-auth-service-init build: context: ./dbrepo-auth-service/init network: host @@ -119,6 +120,9 @@ services: AUTH_SERVICE_ADMIN: ${AUTH_SERVICE_ADMIN:-admin} AUTH_SERVICE_ADMIN_PASSWORD: ${AUTH_SERVICE_ADMIN_PASSWORD:-admin} AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} + METADATA_DB: "${METADATA_DB:-dbrepo}" + METADATA_DB_PASSWORD: "${METADATA_DB_PASSWORD:-dbrepo}" + METADATA_USERNAME: "root" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" depends_on: dbrepo-auth-service: @@ -487,8 +491,10 @@ services: context: ./dbrepo-storage-service/init network: host environment: - WEED_CLUSTER_SW_MASTER: "${STORAGE_SERVICE_MASTER_ENDPOINT:-storage-service:9333}" + S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin} S3_BUCKET: "${S3_BUCKET:-dbrepo}" + S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} + STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} depends_on: dbrepo-storage-service: condition: service_healthy diff --git a/helm/dbrepo/.gitignore b/helm/dbrepo/.gitignore index 263466553fa9ea8ea06e946b496cbd5a2d5e699f..254a36c04f538e9d22a51a5a818f8d8c3253f6de 100644 --- a/helm/dbrepo/.gitignore +++ b/helm/dbrepo/.gitignore @@ -4,4 +4,3 @@ *.srl *.csr build/ -charts/ \ No newline at end of file diff --git a/helm/dbrepo/Chart.lock b/helm/dbrepo/Chart.lock index 4c46609c7e8bd9cf972aefd9a47df09c88f9c8e1..f452f870386be707d92e9f19498b4c24f004e6c1 100644 --- a/helm/dbrepo/Chart.lock +++ b/helm/dbrepo/Chart.lock @@ -7,24 +7,24 @@ dependencies: version: 21.6.1 - name: mariadb-galera repository: https://charts.bitnami.com/bitnami - version: 10.1.3 + version: 13.2.7 - name: mariadb-galera repository: https://charts.bitnami.com/bitnami - version: 10.1.3 + version: 13.2.7 - name: rabbitmq repository: https://charts.bitnami.com/bitnami version: 14.0.0 - name: seaweedfs repository: file://../seaweedfs - version: 1.0.2 + version: 4.2.1 - name: grafana repository: https://charts.bitnami.com/bitnami - version: 10.1.1 + version: 11.4.2 - name: prometheus repository: https://charts.bitnami.com/bitnami version: 1.3.22 - name: nginx repository: https://charts.bitnami.com/bitnami - version: 18.2.6 -digest: sha256:9a391d16aa051b7d5410f1167d633a2e072151a4bb8d7e26f9febea34ca63d19 -generated: "2024-12-28T18:13:12.053296401+01:00" + version: 18.3.1 +digest: sha256:414c043a3751945d7bd5b02fa00ee0464bee7f08efb469e00a5f059cdbff03b5 +generated: "2025-01-01T15:06:18.720941571+01:00" diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index 0d0358cc65d3f5e597c1caa6406e98b9e5c21f67..2145c0461e025784e1664f6b537a15456a37f86d 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -14,7 +14,7 @@ keywords: maintainers: - name: Martin Weise email: martin.weise@tuwien.ac.at -home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/ +home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/ icon: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo-ui/public/favicon.png dependencies: - name: opensearch @@ -29,12 +29,12 @@ dependencies: condition: authservice.enabled - name: mariadb-galera alias: datadb - version: 10.1.3 # app version: 11.1.3 + version: 13.2.7 repository: https://charts.bitnami.com/bitnami condition: datadb.enabled - name: mariadb-galera alias: metadatadb - version: 10.1.3 # app version: 11.1.3 + version: 13.2.7 repository: https://charts.bitnami.com/bitnami condition: metadatadb.enabled - name: rabbitmq @@ -44,12 +44,12 @@ dependencies: condition: brokerservice.enabled - name: seaweedfs alias: storageservice - version: 1.0.2 + version: 4.2.1 repository: file://../seaweedfs condition: storageservice.enabled - name: grafana alias: dashboardservice - version: 10.1.1 + version: 11.4.2 repository: https://charts.bitnami.com/bitnami condition: dashboardservice.enabled - name: prometheus @@ -59,6 +59,6 @@ dependencies: condition: metricdb.enabled - name: nginx alias: gatewayservice - version: 18.2.6 + version: 18.3.1 repository: https://charts.bitnami.com/bitnami condition: gatewayservice.enabled \ No newline at end of file diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index b995791a15e5f32cf7a860d5ec519529b1228852..ead25253597ec98f167ed0ebc892f09c692969a4 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -81,17 +81,19 @@ The command removes all the Kubernetes components associated with the chart and ### Auth Service -| Name | Description | Value | -| -------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `authservice.enabled` | Enable the Auth Service. | `true` | -| `authservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | -| `authservice.endpoint` | The hostname for the microservices. | `http://auth-service` | -| `authservice.resourcesPreset` | The container resource presets | `small` | -| `authservice.jwt.pubkey` | The JWT public key from the `dbrepo-client`. | `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB` | -| `authservice.tls.enabled` | Enable TLS/SSL communication. Required for HTTPS. | `true` | -| `authservice.tls.existingSecret` | The secret containing the `tls.crt`, `tls.key` and `ca.crt`. | `ingress-cert` | -| `authservice.client.id` | The client id for the microservices. | `dbrepo-client` | -| `authservice.client.secret` | The client secret for the microservices. | `MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG` | +| Name | Description | Value | +| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `authservice.enabled` | Enable the Auth Service. | `true` | +| `authservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | +| `authservice.endpoint` | The hostname for the microservices. | `http://auth-service` | +| `authservice.resourcesPreset` | The container resource presets | `small` | +| `authservice.jwt.pubkey` | The JWT public key from the `dbrepo-client`. | `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB` | +| `authservice.tls.enabled` | Enable TLS/SSL communication. Required for HTTPS. | `true` | +| `authservice.tls.existingSecret` | The secret containing the `tls.crt`, `tls.key` and `ca.crt`. | `ingress-cert` | +| `authservice.client.id` | The client id for the microservices. | `dbrepo-client` | +| `authservice.client.secret` | The client secret for the microservices. | `MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG` | +| `authservice.init.resourcesPreset` | The container resource preset | `nano` | +| `authservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | ### Data Database @@ -306,20 +308,21 @@ mqtt.prefetch = 10 ### Storage Service -| Name | Description | Value | -| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------- | -| `storageservice.enabled` | Enable the Storage Service. | `true` | -| `storageservice.mariadb.enabled` | Enables the MariaDB database needed for the filer. | `true` | -| `storageservice.mariadb.auth.rootPassword` | The password for the root user. | `seaweedfsfiler` | -| `storageservice.filer.enabled` | Cannot use the filer in the standard component since it's incompatible with OpenShift | `true` | -| `storageservice.s3.bucket` | The S3-bucket name. | `dbrepo` | -| `storageservice.s3.auth.enabled` | Enable the S3 service. | `true` | -| `storageservice.s3.auth.adminAccessKeyId` | The S3 access key id for the admin user. In some systems this is named `username`. | `seaweedfsadmin` | -| `storageservice.s3.auth.adminSecretAccessKey` | The S3 secret access key for the admin user. In some systems this is named `password`. | `seaweedfsadmin` | -| `storageservice.s3.auth.readAccessKeyId` | The S3 access key id for the read only user. | `seaweedfsuser` | -| `storageservice.s3.auth.readSecretAccessKey` | The S3 secret access key for the read only user. | `seaweedfsuser` | -| `storageservice.init.resourcesPreset` | The container resource preset | `nano` | -| `storageservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| Name | Description | Value | +| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------- | +| `storageservice.enabled` | Enable the Storage Service. | `true` | +| `storageservice.mariadb.enabled` | Enables the MariaDB database needed for the filer. | `true` | +| `storageservice.mariadb.auth.rootPassword` | The password for the root user. | `seaweedfsfiler` | +| `storageservice.filer.enabled` | Cannot use the filer in the standard component since it's incompatible with OpenShift | `true` | +| `storageservice.s3.bucket` | The S3-bucket name. | `dbrepo` | +| `storageservice.s3.auth.enabled` | Enable the S3 service. | `true` | +| `storageservice.s3.auth.adminAccessKeyId` | The S3 access key id for the admin user. In some systems this is named `username`. | `seaweedfsadmin` | +| `storageservice.s3.auth.adminSecretAccessKey` | The S3 secret access key for the admin user. In some systems this is named `password`. | `seaweedfsadmin` | +| `storageservice.s3.auth.readAccessKeyId` | The S3 access key id for the read only user. | `seaweedfsuser` | +| `storageservice.s3.auth.readSecretAccessKey` | The S3 secret access key for the read only user. | `seaweedfsuser` | +| `storageservice.init.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storage-service-s3:8333` | +| `storageservice.init.resourcesPreset` | The container resource preset | `nano` | +| `storageservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | ### Identity Service @@ -403,179 +406,13 @@ mqtt.prefetch = 10 ### Gateway Service -| Name | Description | Value | -| ----------------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `gatewayservice.enabled` | Enable the Gateway Service. | `true` | -| `gatewayservice.serverBlock` | The extra configuration for the reverse proxy | `# This is required to proxy Grafana Live WebSocket connections. -map $http_upgrade $connection_upgrade { - default upgrade; - '' close; -} - -upstream analyse { - server analyse-service; -} - -upstream data { - server data-service; -} - -upstream metadata { - server metadata-service; -} - -upstream search { - server search-service; -} - -upstream ui { - server ui; -} - -upstream upload { - server upload-service; -} - -upstream dashboard-service { - server dashboard-service:3000; -} - -server { - listen 8080 default_server; - server_name _; - - location /assets/ { - root /etc/nginx/assets; - expires max; - access_log off; - autoindex on; - autoindex_exact_size off; - autoindex_format html; - autoindex_localtime on; - } - - location /dashboard/ { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - # Proxy Grafana Live WebSocket connections. - location /dashboard/api/live/ { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_http_version 1.1; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - location /api/search { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://search; - proxy_read_timeout 90; - } - - location /api/upload { -# allow 128.130.0.0/16; -# deny all; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; - proxy_pass http://upload; - proxy_read_timeout 90; - # Disable request and response buffering - proxy_request_buffering off; - proxy_buffering off; - proxy_http_version 1.1; - } - - location /api/analyse { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://analyse; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export|statistic) { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/view/([0-9]+)/(data|export) { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/view { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/subset { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data; - proxy_read_timeout 600; - } - - location ~ /api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user) { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata; - proxy_read_timeout 90; - } - - location ~ /pid/([0-9]+) { - rewrite /pid/(.*) /api/identifier/$1 break; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata; - proxy_read_timeout 90; - } - - location / { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://ui; - proxy_read_timeout 90; - } -} -` | -| `gatewayservice.replicaCount` | The number of replicas. | `3` | +| Name | Description | Value | +| --------------------------------------------- | --------------------------------------------- | ----------------------- | +| `gatewayservice.enabled` | Enable the Gateway Service. | `true` | +| `gatewayservice.service.type` | The service type. | `ClusterIP` | +| `gatewayservice.metrics.enabled` | Enable the Prometheus metrics sidecar. | `false` | +| `gatewayservice.existingServerBlockConfigmap` | The extra configuration for the reverse proxy | `gateway-service-setup` | +| `gatewayservice.replicaCount` | The number of replicas. | `3` | ### Analytics Service diff --git a/helm/dbrepo/charts/grafana-11.4.2.tgz b/helm/dbrepo/charts/grafana-11.4.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..efc2fb1e6b01aa2fc4f73e268fa33ac4ee0b65d8 Binary files /dev/null and b/helm/dbrepo/charts/grafana-11.4.2.tgz differ diff --git a/helm/dbrepo/charts/keycloak-21.6.1.tgz b/helm/dbrepo/charts/keycloak-21.6.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6479f5943846dee589d3ec90bbda649a8d7b72fe Binary files /dev/null and b/helm/dbrepo/charts/keycloak-21.6.1.tgz differ diff --git a/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz b/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..377afe25d2435c5788c26592b39797aa1378e966 Binary files /dev/null and b/helm/dbrepo/charts/mariadb-galera-13.2.7.tgz differ diff --git a/helm/dbrepo/charts/nginx-18.3.1.tgz b/helm/dbrepo/charts/nginx-18.3.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..66ed8e26a1578edede247ba67dc160133d3bc93f Binary files /dev/null and b/helm/dbrepo/charts/nginx-18.3.1.tgz differ diff --git a/helm/dbrepo/charts/opensearch-1.4.0.tgz b/helm/dbrepo/charts/opensearch-1.4.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f63fa3c969d7f299e12718b4a0ab7dfc6be9dfca Binary files /dev/null and b/helm/dbrepo/charts/opensearch-1.4.0.tgz differ diff --git a/helm/dbrepo/charts/prometheus-1.3.22.tgz b/helm/dbrepo/charts/prometheus-1.3.22.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3d81a5e625af76257c1a7bc032e889005bc66607 Binary files /dev/null and b/helm/dbrepo/charts/prometheus-1.3.22.tgz differ diff --git a/helm/dbrepo/charts/rabbitmq-14.0.0.tgz b/helm/dbrepo/charts/rabbitmq-14.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..39ea3aaef2a94fe507a08242bbfe37209eb9fa53 Binary files /dev/null and b/helm/dbrepo/charts/rabbitmq-14.0.0.tgz differ diff --git a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..480c5468d22ef48a84068eb63029f0b45a4d8873 Binary files /dev/null and b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz differ diff --git a/helm/dbrepo/files/01-setup-schema.sql b/helm/dbrepo/files/01-setup-schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..0a43ef604460e8deb4e4fee4f457c0ca833fc6a2 --- /dev/null +++ b/helm/dbrepo/files/01-setup-schema.sql @@ -0,0 +1,684 @@ +BEGIN; + +CREATE TABLE IF NOT EXISTS `mdb_users` +( + id character varying(36) NOT NULL, + username character varying(255) NOT NULL, + firstname character varying(255), + lastname character varying(255), + email character varying(255) NOT NULL, + orcid character varying(255), + affiliation character varying(255), + mariadb_password character varying(255) NOT NULL, + theme character varying(255) NOT NULL default ('light'), + language character varying(3) NOT NULL default ('en'), + PRIMARY KEY (id), + UNIQUE (username), + UNIQUE (email) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_images` +( + id SERIAL, + registry character varying(255) NOT NULL DEFAULT 'docker.io', + name character varying(255) NOT NULL, + version character varying(255) NOT NULL, + default_port integer NOT NULL, + dialect character varying(255) NOT NULL, + driver_class character varying(255) NOT NULL, + jdbc_method character varying(255) NOT NULL, + is_default BOOLEAN NOT NULL DEFAULT FALSE, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + UNIQUE (name, version), + UNIQUE (is_default) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_containers` +( + id SERIAL, + internal_name character varying(255) NOT NULL, + name character varying(255) NOT NULL, + host character varying(255) NOT NULL, + port integer NOT NULL default 3306, + ui_host character varying(255) NOT NULL default host, + ui_port integer NOT NULL default port, + ui_additional_flags text, + sidecar_host character varying(255), + sidecar_port integer, + image_id bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + privileged_username character varying(255) NOT NULL, + privileged_password character varying(255) NOT NULL, + quota integer NOT NULL DEFAULT 50, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_data` +( + ID SERIAL, + PROVENANCE text, + FileEncoding text, + FileType character varying(100), + Version text, + Seperator text, + PRIMARY KEY (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_licenses` +( + identifier character varying(255) NOT NULL, + uri text NOT NULL, + description text NOT NULL, + PRIMARY KEY (identifier), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_databases` +( + id SERIAL, + cid BIGINT UNSIGNED NOT NULL, + name character varying(255) NOT NULL, + internal_name character varying(255) NOT NULL, + exchange_name character varying(255) NOT NULL, + description text, + engine character varying(20), + is_public boolean NOT NULL DEFAULT TRUE, + is_schema_public boolean NOT NULL DEFAULT TRUE, + image longblob, + owned_by character varying(36), + contact_person character varying(36), + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + FOREIGN KEY (cid) REFERENCES mdb_containers (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), + FOREIGN KEY (contact_person) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` +( + dbid BIGINT NOT NULL, + subjects character varying(255) NOT NULL, + PRIMARY KEY (dbid, subjects) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_tables` +( + ID SERIAL, + tDBID BIGINT UNSIGNED NOT NULL, + tName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + queue_name VARCHAR(255) NOT NULL, + routing_key VARCHAR(255), + tDescription VARCHAR(2048), + num_rows BIGINT, + data_length BIGINT, + max_data_length BIGINT, + avg_row_length BIGINT, + `separator` CHAR(1), + quote CHAR(1), + element_null VARCHAR(50), + skip_lines BIGINT, + element_true VARCHAR(50), + element_false VARCHAR(50), + Version TEXT, + created timestamp NOT NULL DEFAULT NOW(), + versioned boolean not null default true, + is_public boolean not null default true, + is_schema_public boolean not null default true, + owned_by character varying(36) NOT NULL, + last_modified timestamp, + PRIMARY KEY (ID), + UNIQUE (tDBID, internal_name), + FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns` +( + ID SERIAL, + tID BIGINT UNSIGNED NOT NULL, + cName VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','SERIAL','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + length BIGINT UNSIGNED NULL, + ordinal_position INTEGER NOT NULL, + index_length BIGINT UNSIGNED NULL, + description VARCHAR(2048), + size BIGINT UNSIGNED, + d BIGINT UNSIGNED, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + val_min NUMERIC NULL, + val_max NUMERIC NULL, + mean NUMERIC NULL, + median NUMERIC NULL, + std_dev Numeric NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, + PRIMARY KEY (ID), + UNIQUE (tID, internal_name) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_enums` +( + id SERIAL, + column_id BIGINT UNSIGNED NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_sets` +( + id SERIAL, + column_id BIGINT UNSIGNED NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_nom` +( + cID BIGINT UNSIGNED, + tID BIGINT UNSIGNED, + maxlength INTEGER, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (cID), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_cat` +( + cID BIGINT UNSIGNED, + tID BIGINT UNSIGNED, + num_cat INTEGER, + -- cat_array TEXT[], + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (cID), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key` +( + fkid SERIAL, + tid BIGINT UNSIGNED NOT NULL, + rtid BIGINT UNSIGNED NOT NULL, + name VARCHAR(255) NOT NULL, + on_update VARCHAR(50) NULL, + on_delete VARCHAR(50) NULL, + position INT NULL, + PRIMARY KEY (fkid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (rtid) REFERENCES mdb_tables (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_primary_key` +( + pkid SERIAL, + tID BIGINT UNSIGNED NOT NULL, + cid BIGINT UNSIGNED NOT NULL, + PRIMARY KEY (pkid), + FOREIGN KEY (tID) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key_reference` +( + id SERIAL, + fkid BIGINT UNSIGNED NOT NULL, + cid BIGINT UNSIGNED NOT NULL, + rcid BIGINT UNSIGNED NOT NULL, + PRIMARY KEY (id), + UNIQUE (fkid, cid, rcid), + FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid) ON UPDATE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id), + FOREIGN KEY (rcid) REFERENCES mdb_columns (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_unique` +( + uid SERIAL, + name VARCHAR(255) NOT NULL, + tid BIGINT UNSIGNED NOT NULL, + position INT NULL, + PRIMARY KEY (uid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `mdb_constraints_unique_columns` +( + id SERIAL, + uid BIGINT UNSIGNED NOT NULL, + cid BIGINT UNSIGNED NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (uid) REFERENCES mdb_constraints_unique (uid), + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_checks` +( + id SERIAL, + tid BIGINT UNSIGNED NOT NULL, + checks VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + + +CREATE TABLE IF NOT EXISTS `mdb_concepts` +( + id SERIAL, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_units` +( + id SERIAL, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_concepts` +( + id BIGINT UNSIGNED NOT NULL, + cID BIGINT UNSIGNED NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cid), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_units` +( + id BIGINT UNSIGNED NOT NULL, + cID BIGINT UNSIGNED NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cID), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_view` +( + id SERIAL, + vdbid BIGINT UNSIGNED NOT NULL, + vName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + Query TEXT NOT NULL, + query_hash VARCHAR(255) NOT NULL, + Public BOOLEAN NOT NULL DEFAULT TRUE, + is_schema_public boolean NOT NULL DEFAULT TRUE, + InitialView BOOLEAN NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + owned_by character varying(36) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (vdbid) REFERENCES mdb_databases (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_banner_messages` +( + id SERIAL, + type ENUM ('ERROR', 'WARNING', 'INFO') NOT NULL default 'INFO', + message TEXT NOT NULL, + link TEXT NULL, + link_text VARCHAR(255) NULL, + display_start timestamp NULL, + display_end timestamp NULL, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_ontologies` +( + id SERIAL, + prefix VARCHAR(8) NOT NULL, + uri TEXT NOT NULL, + uri_pattern TEXT, + sparql_endpoint TEXT NULL, + rdf_path TEXT NULL, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + UNIQUE (prefix), + UNIQUE (uri(200)), + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_view_columns` +( + id SERIAL, + view_id BIGINT UNSIGNED NOT NULL, + name VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + column_type ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + ordinal_position INTEGER NOT NULL, + size BIGINT UNSIGNED, + d BIGINT UNSIGNED, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + PRIMARY KEY (id), + FOREIGN KEY (view_id) REFERENCES mdb_view (id) ON DELETE CASCADE, + UNIQUE (view_id, internal_name) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifiers` +( + id SERIAL, + dbid BIGINT UNSIGNED NOT NULL, + qid BIGINT UNSIGNED, + vid BIGINT UNSIGNED, + tid BIGINT UNSIGNED, + publisher VARCHAR(255) NOT NULL, + language VARCHAR(2), + publication_year INTEGER NOT NULL, + publication_month INTEGER, + publication_day INTEGER, + identifier_type ENUM ('DATABASE', 'SUBSET', 'VIEW', 'TABLE') NOT NULL, + status ENUM ('DRAFT', 'PUBLISHED') NOT NULL DEFAULT ('PUBLISHED'), + query TEXT, + query_normalized TEXT, + query_hash VARCHAR(255), + execution TIMESTAMP, + result_hash VARCHAR(255), + result_number BIGINT, + doi VARCHAR(255), + created TIMESTAMP NOT NULL DEFAULT NOW(), + owned_by VARCHAR(36) NOT NULL, + last_modified TIMESTAMP, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (dbid) REFERENCES mdb_databases (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` +( + pid BIGINT UNSIGNED NOT NULL, + license_id VARCHAR(255) NOT NULL, + PRIMARY KEY (pid, license_id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + FOREIGN KEY (license_id) REFERENCES mdb_licenses (identifier) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` +( + id SERIAL, + pid BIGINT UNSIGNED NOT NULL, + title text NOT NULL, + title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` +( + id SERIAL, + pid BIGINT UNSIGNED NOT NULL, + funder_name VARCHAR(255) NOT NULL, + funder_identifier TEXT, + funder_identifier_type ENUM ('CROSSREF_FUNDER_ID', 'GRID', 'ISNI', 'ROR', 'OTHER'), + scheme_uri text, + award_number VARCHAR(255), + award_title text, + language VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` +( + id SERIAL, + pid BIGINT UNSIGNED NOT NULL, + description text NOT NULL, + description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_related_identifiers` +( + id SERIAL, + pid BIGINT UNSIGNED NOT NULL, + value varchar(255) NOT NULL, + type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, + relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + UNIQUE (pid, value) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` +( + id SERIAL, + pid BIGINT UNSIGNED NOT NULL, + given_names text, + family_name text, + creator_name VARCHAR(255) NOT NULL, + name_type ENUM ('PERSONAL', 'ORGANIZATIONAL') default 'PERSONAL', + name_identifier text, + name_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI', 'ORCID'), + name_identifier_scheme_uri text, + affiliation VARCHAR(255), + affiliation_identifier text, + affiliation_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI'), + affiliation_identifier_scheme_uri text, + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_update` +( + uUserID character varying(255) NOT NULL, + uDBID BIGINT UNSIGNED NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (uUserID, uDBID), + FOREIGN KEY (uDBID) REFERENCES mdb_databases (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_access` +( + aUserID character varying(255) NOT NULL, + aDBID BIGINT UNSIGNED REFERENCES mdb_databases (id), + attime TIMESTAMP, + download BOOLEAN, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (aUserID, aDBID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_have_access` +( + user_id character varying(36) NOT NULL, + database_id BIGINT UNSIGNED REFERENCES mdb_databases (id), + access_type ENUM ('READ', 'WRITE_OWN', 'WRITE_ALL') NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, database_id), + FOREIGN KEY (user_id) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_image_types` +( + id SERIAL, + image_id BIGINT UNSIGNED NOT NULL, + display_name varchar(255) NOT NULL, + value varchar(255) NOT NULL, + size_min INT UNSIGNED, + size_max INT UNSIGNED, + size_default INT UNSIGNED, + size_required BOOLEAN COMMENT 'When setting NULL, the service assumes the data type has no size', + size_step INT UNSIGNED, + d_min INT UNSIGNED, + d_max INT UNSIGNED, + d_default INT UNSIGNED, + d_required BOOLEAN COMMENT 'When setting NULL, the service assumes the data type has no d', + d_step INT UNSIGNED, + type_hint TEXT, + data_hint TEXT, + documentation TEXT NOT NULL, + is_generated BOOLEAN NOT NULL, + is_quoted BOOLEAN NOT NULL, + is_buildable BOOLEAN NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (image_id) REFERENCES `mdb_images` (`id`), + UNIQUE (value) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_image_operators` +( + id SERIAL, + image_id BIGINT UNSIGNED NOT NULL, + display_name varchar(255) NOT NULL, + value varchar(255) NOT NULL, + documentation TEXT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (image_id) REFERENCES `mdb_images` (`id`), + UNIQUE (value) +) WITH SYSTEM VERSIONING; + +COMMIT; + +BEGIN; + +INSERT INTO `mdb_licenses` (identifier, uri, description) +VALUES ('CC0-1.0', 'https://creativecommons.org/publicdomain/zero/1.0/legalcode', + 'CC0 waives copyright interest in a work you''ve created and dedicates it to the world-wide public domain. Use CC0 to opt out of copyright entirely and ensure your work has the widest reach.'), + ('CC-BY-4.0', 'https://creativecommons.org/licenses/by/4.0/legalcode', + 'The Creative Commons Attribution license allows re-distribution and re-use of a licensed work on the condition that the creator is appropriately credited.'); + +INSERT INTO `mdb_images` (name, registry, version, default_port, dialect, driver_class, jdbc_method) +VALUES ('mariadb', 'docker.io', '11.1.3', 3306, 'org.hibernate.dialect.MariaDBDialect', 'org.mariadb.jdbc.Driver', + 'mariadb'); + +INSERT INTO `mdb_image_types` (image_id, display_name, value, size_min, size_max, size_default, size_required, + size_step, d_min, d_max, d_default, d_required, d_step, type_hint, data_hint, + documentation, is_quoted, is_buildable, is_generated) +VALUES (1, 'BIGINT(size)', 'bigint', 0, null, null, false, 1, null, null, null, null, null, null, null, + 'https://mariadb.com/kb/en/bigint/', false, true, false), + (1, 'BINARY(size)', 'binary', 0, 255, 255, true, 1, null, null, null, null, null, 'size in Bytes', null, + 'https://mariadb.com/kb/en/binary/', false, true, false), + (1, 'BIT(size)', 'bit', 0, 64, null, false, 1, null, null, null, null, null, null, null, + 'https://mariadb.com/kb/en/bit/', false, true, false), + (1, 'BLOB(size)', 'blob', 0, 65535, null, false, 1, null, null, null, null, null, 'size in Bytes', null, + 'https://mariadb.com/kb/en/blob/', false, false, false), + (1, 'BOOL', 'bool', null, null, null, null, null, null, null, null, null, null, null, null, + 'https://mariadb.com/kb/en/bool/', false, true, false), + (1, 'CHAR(size)', 'char', 0, 255, 255, false, 1, null, null, null, null, null, null, null, + 'https://mariadb.com/kb/en/char/', false, true, false), + (1, 'DATE', 'date', null, null, null, null, null, null, null, null, null, null, + 'min. 1000-01-01, max. 9999-12-31', 'e.g. YYYY-MM-DD, YY-MM-DD, YYMMDD, YYYY/MM/DD', + 'https://mariadb.com/kb/en/date/', true, true, false), + (1, 'DATETIME(fsp)', 'datetime', 0, 6, null, null, 1, null, null, null, null, null, + 'fsp=microsecond precision, min. 1000-01-01 00:00:00.0, max. 9999-12-31 23:59:59.9', + 'e.g. YYYY-MM-DD HH:MM:SS, YY-MM-DD HH:MM:SS, YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, YYMMDD', + 'https://mariadb.com/kb/en/datetime/', true, true, false), + (1, 'DECIMAL(size, d)', 'decimal', 0, 65, null, false, 1, 0, 38, null, false, null, null, null, + 'https://mariadb.com/kb/en/decimal/', false, true, false), + (1, 'DOUBLE(size, d)', 'double', null, null, null, false, null, null, null, null, false, null, null, null, + 'https://mariadb.com/kb/en/double/', false, true, false), + (1, 'ENUM(v1,v2,...)', 'enum', null, null, null, null, null, null, null, null, null, null, null, + 'e.g. value1, value2, ...', 'https://mariadb.com/kb/en/enum/', true, true, false), + (1, 'FLOAT(size)', 'float', null, null, null, false, null, null, null, null, null, null, null, null, + 'https://mariadb.com/kb/en/float/', false, true, false), + (1, 'INT(size)', 'int', null, null, null, false, null, null, null, null, null, null, 'size in Bytes', null, + 'https://mariadb.com/kb/en/int/', false, true, false), + (1, 'LONGBLOB', 'longblob', null, null, null, null, null, null, null, null, null, null, 'max. 3.999 GiB', null, + 'https://mariadb.com/kb/en/longblob/', false, true, false), + (1, 'LONGTEXT', 'longtext', null, null, null, null, null, null, null, null, null, null, 'max. 3.999 GiB', null, + 'https://mariadb.com/kb/en/longtext/', true, true, false), + (1, 'MEDIUMBLOB', 'mediumblob', null, null, null, null, null, null, null, null, null, null, 'max. 15.999 MiB', + null, 'https://mariadb.com/kb/en/mediumblob/', false, true, false), + (1, 'MEDIUMINT', 'mediumint', null, null, null, null, null, null, null, null, null, null, 'size in Bytes', null, + 'https://mariadb.com/kb/en/mediumint/', false, true, false), + (1, 'MEDIUMTEXT', 'mediumtext', null, null, null, null, null, null, null, null, null, null, 'size in Bytes', + null, 'https://mariadb.com/kb/en/mediumtext/', true, true, false), + (1, 'SERIAL', 'serial', null, null, null, null, null, null, null, null, null, null, null, + null, 'https://mariadb.com/kb/en/bigint/', true, true, true), + (1, 'SET(v1,v2,...)', 'set', null, null, null, null, null, null, null, null, null, null, null, + 'e.g. value1, value2, ...', 'https://mariadb.com/kb/en/set/', true, true, false), + (1, 'SMALLINT(size)', 'smallint', 0, null, null, false, null, null, null, null, null, null, 'size in Bytes', + null, 'https://mariadb.com/kb/en/smallint/', false, true, false), + (1, 'TEXT(size)', 'text', 0, null, null, false, null, null, null, null, null, null, 'size in Bytes', null, + 'https://mariadb.com/kb/en/text/', true, true, false), + (1, 'TIME(fsp)', 'time', 0, 6, 0, false, null, null, null, null, null, null, + 'fsp=microsecond precision, min. 0, max. 6', 'e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S', + 'https://mariadb.com/kb/en/time/', true, true, false), + (1, 'TIMESTAMP(fsp)', 'timestamp', 0, 6, 0, false, null, null, null, null, null, null, + 'fsp=microsecond precision, min. 0, max. 6', + 'e.g. YYYY-MM-DD HH:MM:SS, YY-MM-DD HH:MM:SS, YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, YYMMDD', + 'https://mariadb.com/kb/en/timestamp/', true, true, false), + (1, 'TINYBLOB', 'tinyblob', null, null, null, null, null, null, null, null, null, null, null, + 'fsp=microsecond precision, min. 0, max. 6', 'https://mariadb.com/kb/en/timestamp/', false, true, false), + (1, 'TINYINT(size)', 'tinyint', 0, null, null, false, null, null, null, null, null, null, null, + 'size in Bytes', 'https://mariadb.com/kb/en/tinyint/', false, true, false), + (1, 'TINYTEXT', 'tinytext', null, null, null, null, null, null, null, null, null, null, null, + 'max. 255 characters', 'https://mariadb.com/kb/en/tinytext/', true, true, false), + (1, 'YEAR', 'year', 2, 4, null, false, 2, null, null, null, null, null, 'min. 1901, max. 2155', 'e.g. YYYY, YY', + 'https://mariadb.com/kb/en/year/', false, true, false), + (1, 'VARBINARY(size)', 'varbinary', 0, null, null, true, null, null, null, null, null, null, null, + null, 'https://mariadb.com/kb/en/varbinary/', false, true, false), + (1, 'VARCHAR(size)', 'varchar', 0, 65532, 255, true, null, null, null, null, null, null, null, + null, 'https://mariadb.com/kb/en/varchar/', false, true, false); + +INSERT INTO `mdb_image_operators` (image_id, display_name, value, documentation) +VALUES (1, 'Equal operator', '=', 'https://mariadb.com/kb/en/assignment-operators-assignment-operator/'), + (1, 'NULL-safe equal operator', '<=>', 'https://mariadb.com/kb/en/null-safe-equal/'), + (1, 'Less-than operator', '<', 'https://mariadb.com/kb/en/less-than/'), + (1, 'Less than or equal operator', '<=', 'https://mariadb.com/kb/en/less-than-or-equal/'), + (1, 'Greater-than operator', '>', 'https://mariadb.com/kb/en/greater-than/'), + (1, 'Greater than or equal operator', '>=', 'https://mariadb.com/kb/en/greater-than-or-equal/'), + (1, 'Not equal operator', '!=', 'https://mariadb.com/kb/en/not-equal/'), + (1, 'Addition operator', '+', 'https://mariadb.com/kb/en/addition-operator/'), + (1, 'Division operator', '/', 'https://mariadb.com/kb/en/division-operator/'), + (1, 'Modulo operator', '%', 'https://mariadb.com/kb/en/modulo-operator/'), + (1, 'Multiplication operator', '*', 'https://mariadb.com/kb/en/multiplication-operator/'), + (1, 'Subtraction operator', '-', 'https://mariadb.com/kb/en/subtraction-operator-/'), + (1, 'LIKE', 'LIKE', 'https://mariadb.com/kb/en/like/'), + (1, 'NOT LIKE', 'NOT LIKE', 'https://mariadb.com/kb/en/not-like/'), + (1, 'IN', 'IN', 'https://mariadb.com/kb/en/in/'), + (1, 'NOT IN', 'NOT IN', 'https://mariadb.com/kb/en/not-in/'), + (1, 'IS', 'IS', 'https://mariadb.com/kb/en/is/'), + (1, 'IS NOT', 'IS NOT', 'https://mariadb.com/kb/en/is-not/'), + (1, 'IS NOT NULL', 'IS NOT NULL', 'https://mariadb.com/kb/en/is-not-null/'), + (1, 'IS NULL', 'IS NULL', 'https://mariadb.com/kb/en/is-null/'), + (1, 'ISNULL', 'ISNULL', 'https://mariadb.com/kb/en/isnull/'), + (1, 'REGEXP', 'REGEXP', 'https://mariadb.com/kb/en/regexp/'), + (1, 'NOT REGEXP', 'NOT REGEXP', 'https://mariadb.com/kb/en/not-regexp/'), + (1, 'Bitwise AND', '&', 'https://mariadb.com/kb/en/bitwise_and/'), + (1, 'Bitwise OR', '|', 'https://mariadb.com/kb/en/bitwise-or/'), + (1, 'Bitwise XOR', '^', 'https://mariadb.com/kb/en/bitwise-xor/'), + (1, 'Bitwise NOT', '~', 'https://mariadb.com/kb/en/bitwise-not/'), + (1, 'Left shift', '<<', 'https://mariadb.com/kb/en/shift-left/'), + (1, 'Right shift', '>>', 'https://mariadb.com/kb/en/shift-right/'); + +INSERT +INTO `mdb_ontologies` (prefix, uri, uri_pattern, sparql_endpoint, rdf_path) +VALUES ('om', 'http://www.ontology-of-units-of-measure.org/resource/om-2/', + 'http://www.ontology-of-units-of-measure.org/resource/om-2/.*', null, 'rdf/om-2.0.rdf'), + ('wd', 'http://www.wikidata.org/', 'http://www.wikidata.org/entity/.*', 'https://query.wikidata.org/sparql', + null), + ('mo', 'http://purl.org/ontology/mo/', 'http://purl.org/ontology/mo/.*', null, null), + ('dc', 'http://purl.org/dc/elements/1.1/', null, null, null), + ('xsd', 'http://www.w3.org/2001/XMLSchema#', null, null, null), + ('tl', 'http://purl.org/NET/c4dm/timeline.owl#', null, null, null), + ('foaf', 'http://xmlns.com/foaf/0.1/', null, null, null), + ('schema', 'http://schema.org/', null, null, null), + ('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', null, null, null), + ('rdfs', 'http://www.w3.org/2000/01/rdf-schema#', null, null, null), + ('owl', 'http://www.w3.org/2002/07/owl#', null, null, null), + ('prov', 'http://www.w3.org/ns/prov#', null, null, null), + ('db', 'http://dbpedia.org', 'http://dbpedia.org/ontology/.*', 'http://dbpedia.org/sparql', null); +COMMIT; \ No newline at end of file diff --git a/helm/dbrepo/templates/auth-job.yaml b/helm/dbrepo/templates/auth-job.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d107dde3dbfedcb484545691fa5e2ece07f53bcc --- /dev/null +++ b/helm/dbrepo/templates/auth-job.yaml @@ -0,0 +1,39 @@ +{{- if .Values.authservice.enabled }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: auth-service-setup-job + namespace: {{ include "common.names.namespace" . | quote }} +spec: + template: + metadata: + name: auth-service-setup-job + spec: + restartPolicy: OnFailure + containers: + - name: init + image: {{ .Values.authservice.init.image.name }} + imagePullPolicy: {{ .Values.authservice.init.image.pullPolicy | default "IfNotPresent" }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + envFrom: + - secretRef: + name: auth-service-secret + {{- if .Values.authservice.init.resources }} + resources: {{- toYaml .Values.authservice.init.resources | nindent 12 }} + {{- else if ne .Values.authservice.init.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.authservice.init.resourcesPreset) | nindent 12 }} + {{- end }} +{{- end }} diff --git a/helm/dbrepo/templates/auth-secret.yaml b/helm/dbrepo/templates/auth-secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a568ef25007e51d70bf4ad1ac186645e57499015 --- /dev/null +++ b/helm/dbrepo/templates/auth-secret.yaml @@ -0,0 +1,16 @@ +{{- if .Values.authservice.enabled }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: auth-service-secret + namespace: {{ include "common.names.namespace" . | quote }} +stringData: + AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}" + AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}" + AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}" + METADATA_DB: "{{ .Values.metadatadb.db.name }}" + METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}" + METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}" + SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-secret.yaml b/helm/dbrepo/templates/dashboard-secret.yaml index c224c1d17b2352b228b7ed3f8946eaec0366b595..7fdb1fed8d3d17f7a86dc5cabd3f83bff464f010 100644 --- a/helm/dbrepo/templates/dashboard-secret.yaml +++ b/helm/dbrepo/templates/dashboard-secret.yaml @@ -7,8 +7,8 @@ metadata: namespace: {{ include "common.names.namespace" . | quote }} stringData: GF_SERVER_PROTOCOL: "http" - GF_SERVER_DOMAIN: "dashboard-service" - GF_SERVER_ROOT_URL: "http://%(domain)s/dashboard/" + GF_SERVER_DOMAIN: "{{ .Values.hostname }}" + GF_SERVER_ROOT_URL: "https://%(domain)s/dashboard/" GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" GF_SERVER_SERVE_FROM_SUB_PATH: "true" diff --git a/helm/dbrepo/templates/data-secret.yaml b/helm/dbrepo/templates/data-secret.yaml index 114c42d28d00270d450d5732b853741f39e36765..0ced27ac04a566a9079d60d9457d7393a18863d1 100644 --- a/helm/dbrepo/templates/data-secret.yaml +++ b/helm/dbrepo/templates/data-secret.yaml @@ -1,3 +1,4 @@ +{{- if .Values.dataservice.enabled }} --- apiVersion: v1 kind: Secret @@ -42,3 +43,4 @@ stringData: S3_BUCKET: "{{ .Values.dataservice.s3.bucket }}" SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" +{{- end }} diff --git a/helm/dbrepo/templates/gateway-configmap.yaml b/helm/dbrepo/templates/gateway-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..aa314d3c65948076a4e7eaf977bf47b8735b153d --- /dev/null +++ b/helm/dbrepo/templates/gateway-configmap.yaml @@ -0,0 +1,144 @@ +{{- if .Values.gatewayservice.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: gateway-service-setup + namespace: {{ include "common.names.namespace" . | quote }} +data: + dbrepo.conf: | + # This is required to proxy Grafana Live WebSocket connections. + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + listen 8080 default_server; + server_name _; + + location /dashboard/ { + rewrite ^/dashboard/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-service:3000; + proxy_read_timeout 90; + } + + # Proxy Grafana Live WebSocket connections. + location /dashboard/api/live/ { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_http_version 1.1; + proxy_pass http://dashboard-service:3000; + proxy_read_timeout 90; + } + + location /api/search { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://search-service; + proxy_read_timeout 90; + } + + location /api/upload { + # allow 128.130.0.0/16; + # deny all; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_pass http://upload-service; + proxy_read_timeout 90; + # Disable request and response buffering + proxy_request_buffering off; + proxy_buffering off; + proxy_http_version 1.1; + } + + location /api/analyse { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://analyse-service; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/view/([0-9]+)/(data|export) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/view { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/subset { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 600; + } + + location ~ /api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ /pid/([0-9]+) { + rewrite /pid/(.*) /api/identifier/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location /assets { + root /etc/nginx/assets; + } + + location / { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://ui; + proxy_read_timeout 90; + } + } +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/metadata-configmap.yaml b/helm/dbrepo/templates/metadata-configmap.yaml index 28db3e26c9dd7f00493b94f65521e4310e63b90a..feba6b312f9529ea9c1563066b053168fc41e7e3 100644 --- a/helm/dbrepo/templates/metadata-configmap.yaml +++ b/helm/dbrepo/templates/metadata-configmap.yaml @@ -12,689 +12,7 @@ data: 02-setup-data.sql: | BEGIN; INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, privileged_username, privileged_password) - VALUES ('mariadb:11.4.4-debian-12-r0', 'mariadb_11_4_4', 1, 'data-db', 3306, '{{ .Values.datadb.rootUser.user }}', '{{ .Values.datadb.rootUser.password }}'); - COMMIT; - 01-setup-schema.sql: | - BEGIN; - - CREATE TABLE IF NOT EXISTS `mdb_users` - ( - id character varying(36) NOT NULL, - username character varying(255) NOT NULL, - firstname character varying(255), - lastname character varying(255), - email character varying(255) NOT NULL, - orcid character varying(255), - affiliation character varying(255), - mariadb_password character varying(255) NOT NULL, - theme character varying(255) NOT NULL default ('light'), - language character varying(3) NOT NULL default ('en'), - PRIMARY KEY (id), - UNIQUE (username), - UNIQUE (email) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_images` - ( - id SERIAL, - registry character varying(255) NOT NULL DEFAULT 'docker.io', - name character varying(255) NOT NULL, - version character varying(255) NOT NULL, - default_port integer NOT NULL, - dialect character varying(255) NOT NULL, - driver_class character varying(255) NOT NULL, - jdbc_method character varying(255) NOT NULL, - is_default BOOLEAN NOT NULL DEFAULT FALSE, - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, - PRIMARY KEY (id), - UNIQUE (name, version), - UNIQUE (is_default) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_containers` - ( - id SERIAL, - internal_name character varying(255) NOT NULL, - name character varying(255) NOT NULL, - host character varying(255) NOT NULL, - port integer NOT NULL default 3306, - ui_host character varying(255) NOT NULL default host, - ui_port integer NOT NULL default port, - ui_additional_flags text, - sidecar_host character varying(255), - sidecar_port integer, - image_id bigint NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, - privileged_username character varying(255) NOT NULL, - privileged_password character varying(255) NOT NULL, - quota integer NOT NULL DEFAULT 50, - PRIMARY KEY (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_data` - ( - ID SERIAL, - PROVENANCE text, - FileEncoding text, - FileType character varying(100), - Version text, - Seperator text, - PRIMARY KEY (ID) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_licenses` - ( - identifier character varying(255) NOT NULL, - uri text NOT NULL, - description text NOT NULL, - PRIMARY KEY (identifier), - UNIQUE (uri(200)) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_databases` - ( - id SERIAL, - cid BIGINT UNSIGNED NOT NULL, - name character varying(255) NOT NULL, - internal_name character varying(255) NOT NULL, - exchange_name character varying(255) NOT NULL, - description text, - engine character varying(20), - is_public boolean NOT NULL DEFAULT TRUE, - image longblob, - created_by character varying(36), - owned_by character varying(36), - contact_person character varying(36), - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, - PRIMARY KEY (id), - FOREIGN KEY (cid) REFERENCES mdb_containers (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id), - FOREIGN KEY (owned_by) REFERENCES mdb_users (id), - FOREIGN KEY (contact_person) REFERENCES mdb_users (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` - ( - dbid BIGINT NOT NULL, - subjects character varying(255) NOT NULL, - PRIMARY KEY (dbid, subjects) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_tables` - ( - ID SERIAL, - tDBID BIGINT UNSIGNED NOT NULL, - tName VARCHAR(64) NOT NULL, - internal_name VARCHAR(64) NOT NULL, - queue_name VARCHAR(255) NOT NULL, - routing_key VARCHAR(255), - tDescription VARCHAR(2048), - num_rows BIGINT, - data_length BIGINT, - max_data_length BIGINT, - avg_row_length BIGINT, - `separator` CHAR(1), - quote CHAR(1), - element_null VARCHAR(50), - skip_lines BIGINT, - element_true VARCHAR(50), - element_false VARCHAR(50), - Version TEXT, - created timestamp NOT NULL DEFAULT NOW(), - versioned boolean not null default true, - created_by character varying(36) NOT NULL, - owned_by character varying(36) NOT NULL, - last_modified timestamp, - PRIMARY KEY (ID), - UNIQUE (tDBID, internal_name), - FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id), - FOREIGN KEY (owned_by) REFERENCES mdb_users (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns` - ( - ID SERIAL, - tID BIGINT UNSIGNED NOT NULL, - cName VARCHAR(64), - internal_name VARCHAR(64) NOT NULL, - Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','SERIAL','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), - length BIGINT UNSIGNED NULL, - ordinal_position INTEGER NOT NULL, - index_length BIGINT UNSIGNED NULL, - description VARCHAR(2048), - size BIGINT UNSIGNED, - d BIGINT UNSIGNED, - is_null_allowed BOOLEAN NOT NULL DEFAULT true, - val_min NUMERIC NULL, - val_max NUMERIC NULL, - mean NUMERIC NULL, - median NUMERIC NULL, - std_dev Numeric NULL, - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, - FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, - PRIMARY KEY (ID), - UNIQUE (tID, internal_name) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns_enums` - ( - id SERIAL, - column_id BIGINT UNSIGNED NOT NULL, - value CHARACTER VARYING(255) NOT NULL, - FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, - PRIMARY KEY (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns_sets` - ( - id SERIAL, - column_id BIGINT UNSIGNED NOT NULL, - value CHARACTER VARYING(255) NOT NULL, - FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, - PRIMARY KEY (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns_nom` - ( - cID BIGINT UNSIGNED, - tID BIGINT UNSIGNED, - maxlength INTEGER, - last_modified timestamp, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (cID), - FOREIGN KEY (cID) REFERENCES mdb_columns (ID) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns_cat` - ( - cID BIGINT UNSIGNED, - tID BIGINT UNSIGNED, - num_cat INTEGER, - -- cat_array TEXT[], - last_modified timestamp, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (cID), - FOREIGN KEY (cID) REFERENCES mdb_columns (ID) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key` - ( - fkid SERIAL, - tid BIGINT UNSIGNED NOT NULL, - rtid BIGINT UNSIGNED NOT NULL, - name VARCHAR(255) NOT NULL, - on_update VARCHAR(50) NULL, - on_delete VARCHAR(50) NULL, - position INT NULL, - PRIMARY KEY (fkid), - FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE, - FOREIGN KEY (rtid) REFERENCES mdb_tables (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_constraints_primary_key` - ( - pkid SERIAL, - tID BIGINT UNSIGNED NOT NULL, - cid BIGINT UNSIGNED NOT NULL, - PRIMARY KEY (pkid), - FOREIGN KEY (tID) REFERENCES mdb_tables (id) ON DELETE CASCADE, - FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key_reference` - ( - id SERIAL, - fkid BIGINT UNSIGNED NOT NULL, - cid BIGINT UNSIGNED NOT NULL, - rcid BIGINT UNSIGNED NOT NULL, - PRIMARY KEY (id), - UNIQUE (fkid, cid, rcid), - FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid) ON UPDATE CASCADE, - FOREIGN KEY (cid) REFERENCES mdb_columns (id), - FOREIGN KEY (rcid) REFERENCES mdb_columns (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_constraints_unique` - ( - uid SERIAL, - name VARCHAR(255) NOT NULL, - tid BIGINT UNSIGNED NOT NULL, - position INT NULL, - PRIMARY KEY (uid), - FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE - ); - - CREATE TABLE IF NOT EXISTS `mdb_constraints_unique_columns` - ( - id SERIAL, - uid BIGINT UNSIGNED NOT NULL, - cid BIGINT UNSIGNED NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (uid) REFERENCES mdb_constraints_unique (uid), - FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_constraints_checks` - ( - id SERIAL, - tid BIGINT UNSIGNED NOT NULL, - checks VARCHAR(255) NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE - ) WITH SYSTEM VERSIONING; - - - CREATE TABLE IF NOT EXISTS `mdb_concepts` - ( - id SERIAL, - uri text not null, - name VARCHAR(255) null, - description TEXT null, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (id), - UNIQUE (uri(200)) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_units` - ( - id SERIAL, - uri text not null, - name VARCHAR(255) null, - description TEXT null, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (id), - UNIQUE (uri(200)) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns_concepts` - ( - id BIGINT UNSIGNED NOT NULL, - cID BIGINT UNSIGNED NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (id, cid), - FOREIGN KEY (cID) REFERENCES mdb_columns (ID) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_columns_units` - ( - id BIGINT UNSIGNED NOT NULL, - cID BIGINT UNSIGNED NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (id, cID), - FOREIGN KEY (cID) REFERENCES mdb_columns (ID) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_view` - ( - id SERIAL, - vdbid BIGINT UNSIGNED NOT NULL, - vName VARCHAR(64) NOT NULL, - internal_name VARCHAR(64) NOT NULL, - Query TEXT NOT NULL, - query_hash VARCHAR(255) NOT NULL, - Public BOOLEAN NOT NULL, - InitialView BOOLEAN NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, - created_by character varying(36) NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (vdbid) REFERENCES mdb_databases (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_banner_messages` - ( - id SERIAL, - type ENUM ('ERROR', 'WARNING', 'INFO') NOT NULL default 'INFO', - message TEXT NOT NULL, - link TEXT NULL, - link_text VARCHAR(255) NULL, - display_start timestamp NULL, - display_end timestamp NULL, - PRIMARY KEY (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_ontologies` - ( - id SERIAL, - prefix VARCHAR(8) NOT NULL, - uri TEXT NOT NULL, - uri_pattern TEXT, - sparql_endpoint TEXT NULL, - rdf_path TEXT NULL, - last_modified timestamp, - created timestamp NOT NULL DEFAULT NOW(), - UNIQUE (prefix), - UNIQUE (uri(200)), - PRIMARY KEY (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_view_columns` - ( - id SERIAL, - view_id BIGINT UNSIGNED NOT NULL, - name VARCHAR(64), - internal_name VARCHAR(64) NOT NULL, - column_type ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), - ordinal_position INTEGER NOT NULL, - size BIGINT UNSIGNED, - d BIGINT UNSIGNED, - is_null_allowed BOOLEAN NOT NULL DEFAULT true, - PRIMARY KEY (id), - FOREIGN KEY (view_id) REFERENCES mdb_view (id) ON DELETE CASCADE, - UNIQUE (view_id, internal_name) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_identifiers` - ( - id SERIAL, - dbid BIGINT UNSIGNED NOT NULL, - qid BIGINT UNSIGNED, - vid BIGINT UNSIGNED, - tid BIGINT UNSIGNED, - publisher VARCHAR(255) NOT NULL, - language VARCHAR(2), - publication_year INTEGER NOT NULL, - publication_month INTEGER, - publication_day INTEGER, - identifier_type ENUM ('DATABASE', 'SUBSET', 'VIEW', 'TABLE') NOT NULL, - status ENUM ('DRAFT', 'PUBLISHED') NOT NULL DEFAULT ('PUBLISHED'), - query TEXT, - query_normalized TEXT, - query_hash VARCHAR(255), - execution TIMESTAMP, - result_hash VARCHAR(255), - result_number BIGINT, - doi VARCHAR(255), - created TIMESTAMP NOT NULL DEFAULT NOW(), - created_by VARCHAR(36) NOT NULL, - last_modified TIMESTAMP, - PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ - FOREIGN KEY (dbid) REFERENCES mdb_databases (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` - ( - pid BIGINT UNSIGNED NOT NULL, - license_id VARCHAR(255) NOT NULL, - PRIMARY KEY (pid, license_id), - FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), - FOREIGN KEY (license_id) REFERENCES mdb_licenses (identifier) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` - ( - id SERIAL, - pid BIGINT UNSIGNED NOT NULL, - title text NOT NULL, - title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), - language VARCHAR(2), - PRIMARY KEY (id), - FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` - ( - id SERIAL, - pid BIGINT UNSIGNED NOT NULL, - funder_name VARCHAR(255) NOT NULL, - funder_identifier TEXT, - funder_identifier_type ENUM ('CROSSREF_FUNDER_ID', 'GRID', 'ISNI', 'ROR', 'OTHER'), - scheme_uri text, - award_number VARCHAR(255), - award_title text, - language VARCHAR(255), - PRIMARY KEY (id), - FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` - ( - id SERIAL, - pid BIGINT UNSIGNED NOT NULL, - description text NOT NULL, - description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), - language VARCHAR(2), - PRIMARY KEY (id), - FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_related_identifiers` - ( - id SERIAL, - pid BIGINT UNSIGNED NOT NULL, - value varchar(255) NOT NULL, - type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, - relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, - PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ - FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), - UNIQUE (pid, value) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` - ( - id SERIAL, - pid BIGINT UNSIGNED NOT NULL, - given_names text, - family_name text, - creator_name VARCHAR(255) NOT NULL, - name_type ENUM ('PERSONAL', 'ORGANIZATIONAL') default 'PERSONAL', - name_identifier text, - name_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI', 'ORCID'), - name_identifier_scheme_uri text, - affiliation VARCHAR(255), - affiliation_identifier text, - affiliation_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI'), - affiliation_identifier_scheme_uri text, - PRIMARY KEY (id), - FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_update` - ( - uUserID character varying(255) NOT NULL, - uDBID BIGINT UNSIGNED NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (uUserID, uDBID), - FOREIGN KEY (uDBID) REFERENCES mdb_databases (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_access` - ( - aUserID character varying(255) NOT NULL, - aDBID BIGINT UNSIGNED REFERENCES mdb_databases (id), - attime TIMESTAMP, - download BOOLEAN, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (aUserID, aDBID) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_have_access` - ( - user_id character varying(36) NOT NULL, - database_id BIGINT UNSIGNED REFERENCES mdb_databases (id), - access_type ENUM ('READ', 'WRITE_OWN', 'WRITE_ALL') NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (user_id, database_id), - FOREIGN KEY (user_id) REFERENCES mdb_users (id) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_image_types` - ( - id SERIAL, - image_id BIGINT UNSIGNED NOT NULL, - display_name varchar(255) NOT NULL, - value varchar(255) NOT NULL, - size_min INT UNSIGNED, - size_max INT UNSIGNED, - size_default INT UNSIGNED, - size_required BOOLEAN COMMENT 'When setting NULL, the service assumes the data type has no size', - size_step INT UNSIGNED, - d_min INT UNSIGNED, - d_max INT UNSIGNED, - d_default INT UNSIGNED, - d_required BOOLEAN COMMENT 'When setting NULL, the service assumes the data type has no d', - d_step INT UNSIGNED, - type_hint TEXT, - data_hint TEXT, - documentation TEXT NOT NULL, - is_generated BOOLEAN NOT NULL, - is_quoted BOOLEAN NOT NULL, - is_buildable BOOLEAN NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (image_id) REFERENCES `mdb_images` (`id`), - UNIQUE (value) - ) WITH SYSTEM VERSIONING; - - CREATE TABLE IF NOT EXISTS `mdb_image_operators` - ( - id SERIAL, - image_id BIGINT UNSIGNED NOT NULL, - display_name varchar(255) NOT NULL, - value varchar(255) NOT NULL, - documentation TEXT NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (image_id) REFERENCES `mdb_images` (`id`), - UNIQUE (value) - ) WITH SYSTEM VERSIONING; - - COMMIT; - - BEGIN; - - INSERT INTO `mdb_licenses` (identifier, uri, description) - VALUES ('CC0-1.0', 'https://creativecommons.org/publicdomain/zero/1.0/legalcode', - 'CC0 waives copyright interest in a work you''ve created and dedicates it to the world-wide public domain. Use CC0 to opt out of copyright entirely and ensure your work has the widest reach.'), - ('CC-BY-4.0', 'https://creativecommons.org/licenses/by/4.0/legalcode', - 'The Creative Commons Attribution license allows re-distribution and re-use of a licensed work on the condition that the creator is appropriately credited.'); - - INSERT INTO `mdb_images` (name, registry, version, default_port, dialect, driver_class, jdbc_method) - VALUES ('mariadb', 'docker.io', '11.1.3', 3306, 'org.hibernate.dialect.MariaDBDialect', 'org.mariadb.jdbc.Driver', - 'mariadb'); - - INSERT INTO `mdb_image_types` (image_id, display_name, value, size_min, size_max, size_default, size_required, - size_step, d_min, d_max, d_default, d_required, d_step, type_hint, data_hint, - documentation, is_quoted, is_buildable, is_generated) - VALUES (1, 'BIGINT(size)', 'bigint', 0, null, null, false, 1, null, null, null, null, null, null, null, - 'https://mariadb.com/kb/en/bigint/', false, true, false), - (1, 'BINARY(size)', 'binary', 0, 255, 255, true, 1, null, null, null, null, null, 'size in Bytes', null, - 'https://mariadb.com/kb/en/binary/', false, true, false), - (1, 'BIT(size)', 'bit', 0, 64, null, false, 1, null, null, null, null, null, null, null, - 'https://mariadb.com/kb/en/bit/', false, true, false), - (1, 'BLOB(size)', 'blob', 0, 65535, null, false, 1, null, null, null, null, null, 'size in Bytes', null, - 'https://mariadb.com/kb/en/blob/', false, false, false), - (1, 'BOOL', 'bool', null, null, null, null, null, null, null, null, null, null, null, null, - 'https://mariadb.com/kb/en/bool/', false, true, false), - (1, 'CHAR(size)', 'char', 0, 255, 255, false, 1, null, null, null, null, null, null, null, - 'https://mariadb.com/kb/en/char/', false, true, false), - (1, 'DATE', 'date', null, null, null, null, null, null, null, null, null, null, - 'min. 1000-01-01, max. 9999-12-31', 'e.g. YYYY-MM-DD, YY-MM-DD, YYMMDD, YYYY/MM/DD', - 'https://mariadb.com/kb/en/date/', true, true, false), - (1, 'DATETIME(fsp)', 'datetime', 0, 6, null, null, 1, null, null, null, null, null, - 'fsp=microsecond precision, min. 1000-01-01 00:00:00.0, max. 9999-12-31 23:59:59.9', - 'e.g. YYYY-MM-DD HH:MM:SS, YY-MM-DD HH:MM:SS, YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, YYMMDD', - 'https://mariadb.com/kb/en/datetime/', true, true, false), - (1, 'DECIMAL(size, d)', 'decimal', 0, 65, null, false, 1, 0, 38, null, false, null, null, null, - 'https://mariadb.com/kb/en/decimal/', false, true, false), - (1, 'DOUBLE(size, d)', 'double', null, null, null, false, null, null, null, null, false, null, null, null, - 'https://mariadb.com/kb/en/double/', false, true, false), - (1, 'ENUM(v1,v2,...)', 'enum', null, null, null, null, null, null, null, null, null, null, null, - 'e.g. value1, value2, ...', 'https://mariadb.com/kb/en/enum/', true, true, false), - (1, 'FLOAT(size)', 'float', null, null, null, false, null, null, null, null, null, null, null, null, - 'https://mariadb.com/kb/en/float/', false, true, false), - (1, 'INT(size)', 'int', null, null, null, false, null, null, null, null, null, null, 'size in Bytes', null, - 'https://mariadb.com/kb/en/int/', false, true, false), - (1, 'LONGBLOB', 'longblob', null, null, null, null, null, null, null, null, null, null, 'max. 3.999 GiB', null, - 'https://mariadb.com/kb/en/longblob/', false, true, false), - (1, 'LONGTEXT', 'longtext', null, null, null, null, null, null, null, null, null, null, 'max. 3.999 GiB', null, - 'https://mariadb.com/kb/en/longtext/', true, true, false), - (1, 'MEDIUMBLOB', 'mediumblob', null, null, null, null, null, null, null, null, null, null, 'max. 15.999 MiB', - null, 'https://mariadb.com/kb/en/mediumblob/', false, true, false), - (1, 'MEDIUMINT', 'mediumint', null, null, null, null, null, null, null, null, null, null, 'size in Bytes', null, - 'https://mariadb.com/kb/en/mediumint/', false, true, false), - (1, 'MEDIUMTEXT', 'mediumtext', null, null, null, null, null, null, null, null, null, null, 'size in Bytes', - null, 'https://mariadb.com/kb/en/mediumtext/', true, true, false), - (1, 'SERIAL', 'serial', null, null, null, null, null, null, null, null, null, null, null, - null, 'https://mariadb.com/kb/en/bigint/', true, true, true), - (1, 'SET(v1,v2,...)', 'set', null, null, null, null, null, null, null, null, null, null, null, - 'e.g. value1, value2, ...', 'https://mariadb.com/kb/en/set/', true, true, false), - (1, 'SMALLINT(size)', 'smallint', 0, null, null, false, null, null, null, null, null, null, 'size in Bytes', - null, 'https://mariadb.com/kb/en/smallint/', false, true, false), - (1, 'TEXT(size)', 'text', 0, null, null, false, null, null, null, null, null, null, 'size in Bytes', null, - 'https://mariadb.com/kb/en/text/', true, true, false), - (1, 'TIME(fsp)', 'time', 0, 6, 0, false, null, null, null, null, null, null, - 'fsp=microsecond precision, min. 0, max. 6', 'e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S', - 'https://mariadb.com/kb/en/time/', true, true, false), - (1, 'TIMESTAMP(fsp)', 'timestamp', 0, 6, 0, false, null, null, null, null, null, null, - 'fsp=microsecond precision, min. 0, max. 6', - 'e.g. YYYY-MM-DD HH:MM:SS, YY-MM-DD HH:MM:SS, YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, YYMMDD', - 'https://mariadb.com/kb/en/timestamp/', true, true, false), - (1, 'TINYBLOB', 'tinyblob', null, null, null, null, null, null, null, null, null, null, null, - 'fsp=microsecond precision, min. 0, max. 6', 'https://mariadb.com/kb/en/timestamp/', false, true, false), - (1, 'TINYINT(size)', 'tinyint', 0, null, null, false, null, null, null, null, null, null, null, - 'size in Bytes', 'https://mariadb.com/kb/en/tinyint/', false, true, false), - (1, 'TINYTEXT', 'tinytext', null, null, null, null, null, null, null, null, null, null, null, - 'max. 255 characters', 'https://mariadb.com/kb/en/tinytext/', true, true, false), - (1, 'YEAR', 'year', 2, 4, null, false, 2, null, null, null, null, null, 'min. 1901, max. 2155', 'e.g. YYYY, YY', - 'https://mariadb.com/kb/en/year/', false, true, false), - (1, 'VARBINARY(size)', 'varbinary', 0, null, null, true, null, null, null, null, null, null, null, - null, 'https://mariadb.com/kb/en/varbinary/', false, true, false), - (1, 'VARCHAR(size)', 'varchar', 0, 65532, 255, true, null, null, null, null, null, null, null, - null, 'https://mariadb.com/kb/en/varchar/', false, true, false); - - INSERT INTO `mdb_image_operators` (image_id, display_name, value, documentation) - VALUES (1, 'Equal operator', '=', 'https://mariadb.com/kb/en/assignment-operators-assignment-operator/'), - (1, 'NULL-safe equal operator', '<=>', 'https://mariadb.com/kb/en/null-safe-equal/'), - (1, 'Less-than operator', '<', 'https://mariadb.com/kb/en/less-than/'), - (1, 'Less than or equal operator', '<=', 'https://mariadb.com/kb/en/less-than-or-equal/'), - (1, 'Greater-than operator', '>', 'https://mariadb.com/kb/en/greater-than/'), - (1, 'Greater than or equal operator', '>=', 'https://mariadb.com/kb/en/greater-than-or-equal/'), - (1, 'Not equal operator', '!=', 'https://mariadb.com/kb/en/not-equal/'), - (1, 'Addition operator', '+', 'https://mariadb.com/kb/en/addition-operator/'), - (1, 'Division operator', '/', 'https://mariadb.com/kb/en/division-operator/'), - (1, 'Modulo operator', '%', 'https://mariadb.com/kb/en/modulo-operator/'), - (1, 'Multiplication operator', '*', 'https://mariadb.com/kb/en/multiplication-operator/'), - (1, 'Subtraction operator', '-', 'https://mariadb.com/kb/en/subtraction-operator-/'), - (1, 'LIKE', 'LIKE', 'https://mariadb.com/kb/en/like/'), - (1, 'NOT LIKE', 'NOT LIKE', 'https://mariadb.com/kb/en/not-like/'), - (1, 'IN', 'IN', 'https://mariadb.com/kb/en/in/'), - (1, 'NOT IN', 'NOT IN', 'https://mariadb.com/kb/en/not-in/'), - (1, 'IS', 'IS', 'https://mariadb.com/kb/en/is/'), - (1, 'IS NOT', 'IS NOT', 'https://mariadb.com/kb/en/is-not/'), - (1, 'IS NOT NULL', 'IS NOT NULL', 'https://mariadb.com/kb/en/is-not-null/'), - (1, 'IS NULL', 'IS NULL', 'https://mariadb.com/kb/en/is-null/'), - (1, 'ISNULL', 'ISNULL', 'https://mariadb.com/kb/en/isnull/'), - (1, 'REGEXP', 'REGEXP', 'https://mariadb.com/kb/en/regexp/'), - (1, 'NOT REGEXP', 'NOT REGEXP', 'https://mariadb.com/kb/en/not-regexp/'), - (1, 'Bitwise AND', '&', 'https://mariadb.com/kb/en/bitwise_and/'), - (1, 'Bitwise OR', '|', 'https://mariadb.com/kb/en/bitwise-or/'), - (1, 'Bitwise XOR', '^', 'https://mariadb.com/kb/en/bitwise-xor/'), - (1, 'Bitwise NOT', '~', 'https://mariadb.com/kb/en/bitwise-not/'), - (1, 'Left shift', '<<', 'https://mariadb.com/kb/en/shift-left/'), - (1, 'Right shift', '>>', 'https://mariadb.com/kb/en/shift-right/'); - - INSERT - INTO `mdb_ontologies` (prefix, uri, uri_pattern, sparql_endpoint, rdf_path) - VALUES ('om', 'http://www.ontology-of-units-of-measure.org/resource/om-2/', - 'http://www.ontology-of-units-of-measure.org/resource/om-2/.*', null, 'rdf/om-2.0.rdf'), - ('wd', 'http://www.wikidata.org/', 'http://www.wikidata.org/entity/.*', 'https://query.wikidata.org/sparql', - null), - ('mo', 'http://purl.org/ontology/mo/', 'http://purl.org/ontology/mo/.*', null, null), - ('dc', 'http://purl.org/dc/elements/1.1/', null, null, null), - ('xsd', 'http://www.w3.org/2001/XMLSchema#', null, null, null), - ('tl', 'http://purl.org/NET/c4dm/timeline.owl#', null, null, null), - ('foaf', 'http://xmlns.com/foaf/0.1/', null, null, null), - ('schema', 'http://schema.org/', null, null, null), - ('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', null, null, null), - ('rdfs', 'http://www.w3.org/2000/01/rdf-schema#', null, null, null), - ('owl', 'http://www.w3.org/2002/07/owl#', null, null, null), - ('prov', 'http://www.w3.org/ns/prov#', null, null, null), - ('db', 'http://dbpedia.org', 'http://dbpedia.org/ontology/.*', 'http://dbpedia.org/sparql', null); + VALUES ('mariadb-galera:11.3.2-debian-12-r9', 'mariadb-galera:11.3.2-debian-12-r9', 1, 'data-db', 3306, '{{ .Values.datadb.rootUser.user }}', '{{ .Values.datadb.rootUser.password }}'); COMMIT; + {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} {{- end }} diff --git a/helm/dbrepo/templates/metadata-secret.yaml b/helm/dbrepo/templates/metadata-secret.yaml index 558246a6eb6e42408aeac0e03adf16b24258cb92..84b0b614e35bd0833b0ff81ab21f94f7b4c66dbb 100644 --- a/helm/dbrepo/templates/metadata-secret.yaml +++ b/helm/dbrepo/templates/metadata-secret.yaml @@ -1,3 +1,4 @@ +{{- if .Values.metadataservice.enabled }} {{ $pidBase := printf "https://%s/pid/" .Values.hostname }} --- apiVersion: v1 @@ -53,3 +54,4 @@ stringData: S3_SECRET_ACCESS_KEY: "{{ .Values.storageservice.s3.auth.adminSecretAccessKey }}" SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" +{{- end }} diff --git a/helm/dbrepo/templates/storage-job.yaml b/helm/dbrepo/templates/storage-job.yaml index c48255493e029dcdca594999145e17f68ab5cc9a..92174539affea89bf1890e673755917d7d15f43f 100644 --- a/helm/dbrepo/templates/storage-job.yaml +++ b/helm/dbrepo/templates/storage-job.yaml @@ -3,12 +3,12 @@ apiVersion: batch/v1 kind: Job metadata: - name: storage-service-create-buckets-job + name: storage-service-setup-job namespace: {{ include "common.names.namespace" . | quote }} spec: template: metadata: - name: storage-service-create-buckets-job + name: storage-service-setup-job spec: restartPolicy: OnFailure containers: @@ -16,12 +16,6 @@ spec: image: {{ .Values.storageservice.init.image.name }} imagePullPolicy: {{ .Values.storageservice.init.image.pullPolicy | default "IfNotPresent" }} env: - - name: WEED_CLUSTER_DEFAULT - value: "sw" - - name: WEED_CLUSTER_SW_MASTER - value: "storage-service-master:9333" - - name: WEED_CLUSTER_SW_FILER - value: "storage-service-filer:8888" - name: POD_IP valueFrom: fieldRef: @@ -34,30 +28,35 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace + - name: S3_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: storage-service-secret + key: admin_access_key_id - name: S3_BUCKET valueFrom: secretKeyRef: name: storage-service-secret key: S3_BUCKET - - name: SEAWEEDFS_FULLNAME - value: "storage-service" + - name: S3_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: storage-service-secret + key: admin_secret_access_key + - name: STORAGE_ENDPOINT + valueFrom: + secretKeyRef: + name: storage-service-secret + key: STORAGE_ENDPOINT volumeMounts: - - name: config-users - mountPath: /etc/sw - readOnly: true - ports: - - containerPort: 9333 - name: swfs-master - - containerPort: 19333 - #name: swfs-master-grpc + - name: app-cache + mountPath: /app/config {{- if .Values.storageservice.init.resources }} resources: {{- toYaml .Values.storageservice.init.resources | nindent 12 }} {{- else if ne .Values.storageservice.init.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.init.resourcesPreset) | nindent 12 }} {{- end }} volumes: - - name: config-users - secret: - defaultMode: 420 - secretName: storage-service-secret + - name: app-cache + emptyDir: {} {{- end }} diff --git a/helm/dbrepo/templates/storage-secret.yaml b/helm/dbrepo/templates/storage-secret.yaml index dc8e107e799a31c9748a6dd0641dd04d8a01fe58..452baecbf9480295e86fcc3975ab62996431f52c 100644 --- a/helm/dbrepo/templates/storage-secret.yaml +++ b/helm/dbrepo/templates/storage-secret.yaml @@ -7,6 +7,7 @@ metadata: namespace: {{ include "common.names.namespace" . | quote }} stringData: S3_BUCKET: "{{ .Values.storageservice.s3.bucket }}" + STORAGE_ENDPOINT: "{{ .Values.storageservice.init.s3.endpoint }}" admin_access_key_id: "{{ .Values.storageservice.s3.auth.adminAccessKeyId }}" admin_secret_access_key: "{{ .Values.storageservice.s3.auth.adminSecretAccessKey }}" read_access_key_id: "{{ .Values.storageservice.s3.auth.readAccessKeyId }}" diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index 67f1c5c2b653527cb1fd4b7a790e5f12e69dfe12..09268112eba7823bb0f91eb2691649bd23b66c3e 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -176,6 +176,26 @@ }, "type": "object" }, + "init": { + "properties": { + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resources": { + "properties": {}, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + } + }, + "type": "object" + }, "jwt": { "properties": { "pubkey": { @@ -751,14 +771,30 @@ "enabled": { "type": "boolean" }, + "existingServerBlockConfigmap": { + "type": "string" + }, "fullnameOverride": { "type": "string" }, + "metrics": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, "replicaCount": { "type": "integer" }, - "serverBlock": { - "type": "string" + "service": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" @@ -1506,6 +1542,14 @@ }, "resourcesPreset": { "type": "string" + }, + "s3": { + "properties": { + "endpoint": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index b4f253a1821ffd9bba732890e33930ad40e8bf26..6955830aaf0a3262a97cadebd1d59f547be4ee41 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -33,7 +33,7 @@ metadatadb: fullnameOverride: metadata-db ## @param metadatadb.host The hostname for the microservices. host: metadata-db - ## @param metadatadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/data-db/#data + ## @param metadatadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" rootUser: ## @param metadatadb.rootUser.user The root username. @@ -109,6 +109,20 @@ authservice: id: dbrepo-client ## @param authservice.client.secret The client secret for the microservices. secret: MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG + init: + image: + ## @skip authservice.init.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.6.0rc1 + ## @param authservice.init.resourcesPreset The container resource preset + resourcesPreset: "nano" + ## @param authservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + resources: { } + ## requests: + ## cpu: 250m + ## memory: 64Mi + ## limits: + ## cpu: 500m + ## memory: 1024Mi ## @skip authservice.extraEnvVarsCM extraEnvVarsCM: auth-service-config ## @skip authservice.extraVolumes @@ -130,7 +144,7 @@ datadb: fullnameOverride: data-db ## @param datadb.host The hostname for the microservices. host: data-db - ## @param datadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/data-db/#data + ## @param datadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" rootUser: ## @param datadb.rootUser.user The root username. @@ -430,7 +444,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.0 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.0rc6 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context @@ -465,7 +479,7 @@ metadataservice: ## @param metadataservice.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile type: "RuntimeDefault" ## @param metadataservice.resourcesPreset The container resource preset - resourcesPreset: "micro" + resourcesPreset: "small" ## @param metadataservice.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: @@ -527,7 +541,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.0 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.0rc3 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context @@ -721,7 +735,10 @@ storageservice: init: image: ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.0 + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.0rc6 + s3: + ## @param storageservice.init.s3.endpoint The S3-capable endpoint the microservice connects to. + endpoint: http://storage-service-s3:8333 ## @param storageservice.init.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -1010,176 +1027,14 @@ gatewayservice: enabled: true ## @skip gatewayservice.fullnameOverride fullnameOverride: gateway-service - ## @param gatewayservice.serverBlock The extra configuration for the reverse proxy - serverBlock: | - # This is required to proxy Grafana Live WebSocket connections. - map $http_upgrade $connection_upgrade { - default upgrade; - '' close; - } - - upstream analyse { - server analyse-service; - } - - upstream data { - server data-service; - } - - upstream metadata { - server metadata-service; - } - - upstream search { - server search-service; - } - - upstream ui { - server ui; - } - - upstream upload { - server upload-service; - } - - upstream dashboard-service { - server dashboard-service:3000; - } - - server { - listen 8080 default_server; - server_name _; - - location /assets/ { - root /etc/nginx/assets; - expires max; - access_log off; - autoindex on; - autoindex_exact_size off; - autoindex_format html; - autoindex_localtime on; - } - - location /dashboard/ { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - # Proxy Grafana Live WebSocket connections. - location /dashboard/api/live/ { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_http_version 1.1; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - location /api/search { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://search; - proxy_read_timeout 90; - } - - location /api/upload { - # allow 128.130.0.0/16; - # deny all; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; - proxy_pass http://upload; - proxy_read_timeout 90; - # Disable request and response buffering - proxy_request_buffering off; - proxy_buffering off; - proxy_http_version 1.1; - } - - location /api/analyse { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://analyse; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export|statistic) { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/view/([0-9]+)/(data|export) { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/view { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata; - proxy_read_timeout 90; - } - - location ~ /api/database/([0-9]+)/subset { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data; - proxy_read_timeout 600; - } - - location ~ /api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user) { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata; - proxy_read_timeout 90; - } - - location ~ /pid/([0-9]+) { - rewrite /pid/(.*) /api/identifier/$1 break; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata; - proxy_read_timeout 90; - } - - location / { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://ui; - proxy_read_timeout 90; - } - } + service: + ## @param gatewayservice.service.type The service type. + type: ClusterIP + metrics: + ## @param gatewayservice.metrics.enabled Enable the Prometheus metrics sidecar. + enabled: false + ## @param gatewayservice.existingServerBlockConfigmap The extra configuration for the reverse proxy + existingServerBlockConfigmap: gateway-service-setup ## @param gatewayservice.replicaCount The number of replicas. replicaCount: 3 diff --git a/helm/seaweedfs/.gitignore b/helm/seaweedfs/.gitignore deleted file mode 100644 index 711a39c541afc04f86b51e268b350d204f48c875..0000000000000000000000000000000000000000 --- a/helm/seaweedfs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -charts/ \ No newline at end of file diff --git a/helm/seaweedfs/CHANGELOG.md b/helm/seaweedfs/CHANGELOG.md index 33dfaba2218a152cd9e5ec072a2cb2bc19582f0c..e880917876b0c345b35c2706b379a006bc41de99 100644 --- a/helm/seaweedfs/CHANGELOG.md +++ b/helm/seaweedfs/CHANGELOG.md @@ -1,8 +1,133 @@ # Changelog -## 1.0.2 (2024-07-22) +## 4.2.0 (2024-12-10) -* [bitnami/seaweedfs] Release 1.0.2 ([#28194](https://github.com/bitnami/charts/pull/28194)) +* [bitnami/seaweedfs] Detect non-standard images ([#30967](https://github.com/bitnami/charts/pull/30967)) + +## <small>4.1.2 (2024-12-04)</small> + +* [bitnami/*] docs: :memo: Add "Backup & Restore" section (#30711) ([35ab536](https://github.com/bitnami/charts/commit/35ab5363741e7548f4076f04da6e62d10153c60c)), closes [#30711](https://github.com/bitnami/charts/issues/30711) +* [bitnami/*] docs: :memo: Add "Prometheus metrics" (batch 6) (#30675) ([7b9cd04](https://github.com/bitnami/charts/commit/7b9cd04c2ffc730a0d62da787f2d4967c0ede47c)), closes [#30675](https://github.com/bitnami/charts/issues/30675) +* [bitnami/*] docs: :memo: Add "Update Credentials" (batch 3) (#30688) ([10a49f9](https://github.com/bitnami/charts/commit/10a49f9ff2db1d9d11a6edd1c40a9f61803241bc)), closes [#30688](https://github.com/bitnami/charts/issues/30688) +* [bitnami/seaweedfs] Release 4.1.2 (#30778) ([7342074](https://github.com/bitnami/charts/commit/7342074fd2562d7a024407a0275c62affee0181a)), closes [#30778](https://github.com/bitnami/charts/issues/30778) + +## <small>4.1.1 (2024-11-18)</small> + +* [bitnami/seaweedfs] Release 4.1.1 (#30510) ([990d46e](https://github.com/bitnami/charts/commit/990d46e857dbca7ff3181675cebb1f7509f7e698)), closes [#30510](https://github.com/bitnami/charts/issues/30510) + +## 4.1.0 (2024-11-18) + +* [bitnami/seaweedfs] feat: add support for customizing PVC retention policies (#30495) ([8a54fb8](https://github.com/bitnami/charts/commit/8a54fb8b17818a6237d3cadbe55fe956a0bc8c6c)), closes [#30495](https://github.com/bitnami/charts/issues/30495) + +## 4.0.0 (2024-11-12) + +* [bitnami/seaweedfs] chore!: :arrow_up: :boom: Bump MariaDB subchart to 20 (#30358) ([1d471fd](https://github.com/bitnami/charts/commit/1d471fd9fae99cf2e3b9a6e2230b0102046193e7)), closes [#30358](https://github.com/bitnami/charts/issues/30358) + +## 3.2.0 (2024-11-08) + +* [bitnami/seaweedfs] Support configuring volume size limit on Master (#30315) ([0dc86e0](https://github.com/bitnami/charts/commit/0dc86e09237ecaabf57d6c7b66d53dd461256e69)), closes [#30315](https://github.com/bitnami/charts/issues/30315) + +## 3.1.0 (2024-11-07) + +* [bitnami/seaweedfs] Support configuring max number of volumes per disk (#30294) ([c87c282](https://github.com/bitnami/charts/commit/c87c2825e8c1c4e4f1f6ee0ae678f999f76890e1)), closes [#30294](https://github.com/bitnami/charts/issues/30294) + +## <small>3.0.7 (2024-11-07)</small> + +* [bitnami/seaweedfs] Release 3.0.7 (#30292) ([cc3cbf6](https://github.com/bitnami/charts/commit/cc3cbf69cc6523de1b28de138cbe38afda75a00f)), closes [#30292](https://github.com/bitnami/charts/issues/30292) + +## <small>3.0.6 (2024-11-06)</small> + +* [bitnami/seaweedfs] Mount security.toml regardless security enhancements are enabled (#30235) ([2ec7ec9](https://github.com/bitnami/charts/commit/2ec7ec965a444558f5e74edba80d12b8c9420f5a)), closes [#30235](https://github.com/bitnami/charts/issues/30235) + +## <small>3.0.5 (2024-10-31)</small> + +* [bitnami/*] Remove wrong comment about imagePullPolicy (#30107) ([a51f9e4](https://github.com/bitnami/charts/commit/a51f9e4bb0fbf77199512d35de7ac8abe055d026)), closes [#30107](https://github.com/bitnami/charts/issues/30107) +* [bitnami/seaweedfs] Release 3.0.5 (#30149) ([86395d9](https://github.com/bitnami/charts/commit/86395d98966d8ed6bd4a445e96ca112f7c0b0709)), closes [#30149](https://github.com/bitnami/charts/issues/30149) + +## <small>3.0.4 (2024-10-28)</small> + +* [bitnami/seaweedfs] Release 3.0.4 (#30097) ([f6a1c6f](https://github.com/bitnami/charts/commit/f6a1c6f46a5af99b8307b8b05ca1a2e61497ae03)), closes [#30097](https://github.com/bitnami/charts/issues/30097) + +## <small>3.0.3 (2024-10-16)</small> + +* [bitnami/seaweedfs] Release 3.0.3 (#29944) ([1dea08b](https://github.com/bitnami/charts/commit/1dea08b301bf082f6a32cf98332ebde411bb9f2b)), closes [#29944](https://github.com/bitnami/charts/issues/29944) +* Update documentation links to techdocs.broadcom.com (#29931) ([f0d9ad7](https://github.com/bitnami/charts/commit/f0d9ad78f39f633d275fc576d32eae78ded4d0b8)), closes [#29931](https://github.com/bitnami/charts/issues/29931) + +## <small>3.0.2 (2024-10-07)</small> + +* [bitnami/seaweedfs] Release 3.0.2 (#29792) ([fb96676](https://github.com/bitnami/charts/commit/fb9667635ba7b4dea74d1f9df7ba2b30c1c0ee83)), closes [#29792](https://github.com/bitnami/charts/issues/29792) + +## <small>3.0.1 (2024-10-03)</small> + +* [bitnami/seaweedfs] Release 3.0.1 (#29767) ([47ffa78](https://github.com/bitnami/charts/commit/47ffa783266d4633b4a8f749fc7291e84b9d176b)), closes [#29767](https://github.com/bitnami/charts/issues/29767) + +## 3.0.0 (2024-10-03) + +* [bitnami/seaweedfs] feat!: :arrow_up: :boom: Bump PostgreSQL to 17.x (#29744) ([024f9e6](https://github.com/bitnami/charts/commit/024f9e6d9faad1a6616ea0145b9bf64a10232c40)), closes [#29744](https://github.com/bitnami/charts/issues/29744) + +## <small>2.0.4 (2024-10-02)</small> + +* [bitnami/seaweedfs] Release 2.0.4 (#29719) ([36de636](https://github.com/bitnami/charts/commit/36de636d89b745738f1426126f67bfc7f5cca0e9)), closes [#29719](https://github.com/bitnami/charts/issues/29719) + +## <small>2.0.3 (2024-09-30)</small> + +* [bitnami/seaweedfs] Release 2.0.3 (#29675) ([c077c83](https://github.com/bitnami/charts/commit/c077c839da01b34acd5ffb7b370f542b50fecf20)), closes [#29675](https://github.com/bitnami/charts/issues/29675) + +## <small>2.0.2 (2024-09-19)</small> + +* [bitnami/seaweedfs] Release 2.0.2 (#29537) ([2c05061](https://github.com/bitnami/charts/commit/2c050617c8d43da601117f7c8fd1945e00962da0)), closes [#29537](https://github.com/bitnami/charts/issues/29537) + +## <small>2.0.1 (2024-09-17)</small> + +* [bitnami/seaweedfs] test: :white_check_mark: Improve reliability of ginkgo tests (#29473) ([ef52e0d](https://github.com/bitnami/charts/commit/ef52e0d1992e16bed6d9726028b81b917c52bc41)), closes [#29473](https://github.com/bitnami/charts/issues/29473) + +## 2.0.0 (2024-09-16) + +* [bitnami/seaweedfs] Add support for PostgreSQL as alternative db (#29400) ([c43d3ba](https://github.com/bitnami/charts/commit/c43d3bac08541808d8b0d4f0e86f7870ed7a5411)), closes [#29400](https://github.com/bitnami/charts/issues/29400) + +## <small>1.1.2 (2024-09-13)</small> + +* [bitnami/seaweedfs] Release 1.1.2 (#29392) ([7df7650](https://github.com/bitnami/charts/commit/7df7650db97c60e5f447e5f18efc06764629d351)), closes [#29392](https://github.com/bitnami/charts/issues/29392) + +## <small>1.1.1 (2024-09-12)</small> + +* [bitnami/seaweedfs] fix: add apiVersion and kind to volumeClaimTemplates (#29357) ([ed8879b](https://github.com/bitnami/charts/commit/ed8879b066c604f95bde4c08f13d7eb8dc6f2d3f)), closes [#29357](https://github.com/bitnami/charts/issues/29357) + +## 1.1.0 (2024-09-10) + +* bitnami/seaweedfs external postgres database support (#29216) ([dc9b740](https://github.com/bitnami/charts/commit/dc9b7402d1ea788f806e42b7fc7e5c025e003e2a)), closes [#29216](https://github.com/bitnami/charts/issues/29216) + +## <small>1.0.9 (2024-08-19)</small> + +* [bitnami/seaweedfs] Release 1.0.9 (#28920) ([28916ca](https://github.com/bitnami/charts/commit/28916ca487e16f1626580f21c2ae8acb443a2e39)), closes [#28920](https://github.com/bitnami/charts/issues/28920) + +## <small>1.0.8 (2024-08-07)</small> + +* [bitnami/seaweedfs] Release 1.0.8 (#28750) ([c4ee2ee](https://github.com/bitnami/charts/commit/c4ee2ee425e92559b05a554fdae3fd0191614fb0)), closes [#28750](https://github.com/bitnami/charts/issues/28750) + +## <small>1.0.7 (2024-07-31)</small> + +* [bitnami/seaweedfs] Fix mounting the S3 auth config.json from secret (#28583) ([40d557a](https://github.com/bitnami/charts/commit/40d557addf28bc8c253fb99f3060220e43499632)), closes [#28583](https://github.com/bitnami/charts/issues/28583) + +## <small>1.0.6 (2024-07-30)</small> + +* [bitnami/seaweedfs] Fix tests (#28572) ([ef36337](https://github.com/bitnami/charts/commit/ef36337c5ffeedf577bb6fcadabbb3a92cf5d8e6)), closes [#28572](https://github.com/bitnami/charts/issues/28572) + +## <small>1.0.5 (2024-07-25)</small> + +* [bitnami/seaweedfs] Release 1.0.5 (#28483) ([f8b7481](https://github.com/bitnami/charts/commit/f8b7481b1c4b5cb35adf6c82e78f132592fe3335)), closes [#28483](https://github.com/bitnami/charts/issues/28483) + +## <small>1.0.4 (2024-07-24)</small> + +* [bitnami/seaweedfs] Release 1.0.4 (#28373) ([0aba72d](https://github.com/bitnami/charts/commit/0aba72d38fd247366717c98540c33b7306f3cc4d)), closes [#28373](https://github.com/bitnami/charts/issues/28373) + +## <small>1.0.3 (2024-07-23)</small> + +* [bitnami/seaweedfs] Release 1.0.3 (#28217) ([4746541](https://github.com/bitnami/charts/commit/4746541360d52a6a2f4c7742b922035326f30a27)), closes [#28217](https://github.com/bitnami/charts/issues/28217) + +## <small>1.0.2 (2024-07-22)</small> + +* [bitnami/seaweedfs] Release 1.0.2 (#28194) ([f1e0b37](https://github.com/bitnami/charts/commit/f1e0b37ed9860efa6ecc05dcda4ab501b0d7e505)), closes [#28194](https://github.com/bitnami/charts/issues/28194) ## <small>1.0.1 (2024-07-18)</small> diff --git a/helm/seaweedfs/Chart.lock b/helm/seaweedfs/Chart.lock index ae4ad47bb64e7849f30c61055cd0ae55c4ab700f..c973082620a92115ed6d4b5f96147ed8ab5d7984 100644 --- a/helm/seaweedfs/Chart.lock +++ b/helm/seaweedfs/Chart.lock @@ -1,9 +1,12 @@ dependencies: - name: mariadb repository: oci://registry-1.docker.io/bitnamicharts - version: 19.1.2 + version: 20.2.1 +- name: postgresql + repository: oci://registry-1.docker.io/bitnamicharts + version: 16.3.4 - name: common repository: oci://registry-1.docker.io/bitnamicharts version: 2.28.0 -digest: sha256:cb5ef9761fc335713b8908c3e264dfdda602839b400ede4ce6d648348dd9343c -generated: "2024-12-27T11:44:41.064882892+01:00" +digest: sha256:98a68ef67facda82298174f5bae4e07abd0998e0440002390583a1be97b17aee +generated: "2025-01-01T15:05:43.198633687+01:00" diff --git a/helm/seaweedfs/Chart.yaml b/helm/seaweedfs/Chart.yaml index 7d520821315084481c6be1f7df9ad1276b5bd453..0c7bf3c684c6c3bcee0ebe2d521a9794c4634c59 100644 --- a/helm/seaweedfs/Chart.yaml +++ b/helm/seaweedfs/Chart.yaml @@ -5,19 +5,29 @@ annotations: category: Infrastructure licenses: Apache-2.0 images: | + - name: mariadb + image: docker.io/bitnami/mariadb:11.4.4-debian-12-r1 - name: os-shell - image: docker.io/bitnami/os-shell:12-debian-12-r25 + image: docker.io/bitnami/os-shell:12-debian-12-r33 + - name: postgresql + image: docker.io/bitnami/postgresql:17.2.0-debian-12-r2 - name: seaweedfs - image: docker.io/bitnami/seaweedfs:3.71.0-debian-12-r0 + image: docker.io/bitnami/seaweedfs:3.80.0-debian-12-r1 apiVersion: v2 -appVersion: 3.71.0 +appVersion: 3.80.0 dependencies: - condition: mariadb.enabled name: mariadb repository: oci://registry-1.docker.io/bitnamicharts tags: - seaweedfs-database - version: 19.x.x + version: 20.x.x +- condition: postgresql.enabled + name: postgresql + repository: oci://registry-1.docker.io/bitnamicharts + tags: + - seaweedfs-database + version: 16.x.x - name: common repository: oci://registry-1.docker.io/bitnamicharts tags: @@ -40,4 +50,4 @@ name: seaweedfs sources: - https://github.com/bitnami/charts/tree/main/bitnami/seawwedfs - https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs -version: 1.0.2 +version: 4.2.1 diff --git a/helm/seaweedfs/README.md b/helm/seaweedfs/README.md index 54f07c7a5963d4c86828608ae6690af32bbddae6..7506718dc1087f1ede7d95d9ebb28f40632a0b86 100644 --- a/helm/seaweedfs/README.md +++ b/helm/seaweedfs/README.md @@ -51,9 +51,38 @@ The command deploys SeaweedFS on the Kubernetes cluster in the default configura Bitnami charts allow setting resource requests and limits for all containers inside the chart deployment. These are inside the `resources` values (check parameter table). Setting requests is essential for production workloads and these should be adapted to your specific use case. -To make this process easier, the chart contains the `resourcesPreset` values, which automatically sets the `resources` section according to different presets. Check these presets in [the bitnami/common chart](https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15). However, in production workloads using `resourcePreset` is discouraged as it may not fully adapt to your specific needs. Find more information on container resource management in the [official Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/). +To make this process easier, the chart contains the `resourcesPreset` values, which automatically sets the `resources` section according to different presets. Check these presets in [the bitnami/common chart](https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15). However, in production workloads using `resourcesPreset` is discouraged as it may not fully adapt to your specific needs. Find more information on container resource management in the [official Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/). -### [Rolling VS Immutable tags](https://docs.vmware.com/en/VMware-Tanzu-Application-Catalog/services/tutorials/GUID-understand-rolling-tags-containers-index.html) +### Prometheus metrics + +This chart can be integrated with Prometheus by setting `*.metrics.enabled` (under the `master`, `volume`, `filer` and `s3` sections) to `true`. This will expose the SeaweedFS native Prometheus ports in the containers. Additionally, it will deploy several `metrics` services, which can be configured under the `*.metrics.service` section (under the `master`, `volume`, `filer` and `s3` sections). These `metrics` services will have the necessary annotations to be automatically scraped by Prometheus. + +#### Prometheus requirements + +It is necessary to have a working installation of Prometheus or Prometheus Operator for the integration to work. Install the [Bitnami Prometheus helm chart](https://github.com/bitnami/charts/tree/main/bitnami/prometheus) or the [Bitnami Kube Prometheus helm chart](https://github.com/bitnami/charts/tree/main/bitnami/kube-prometheus) to easily have a working Prometheus in your cluster. + +#### Integration with Prometheus Operator + +The chart can deploy `ServiceMonitor` objects for integration with Prometheus Operator installations. To do so, set the value `*.metrics.serviceMonitor.enabled=true` (under the `master`, `volume`, `filer` and `s3` sections). Ensure that the Prometheus Operator `CustomResourceDefinitions` are installed in the cluster or it will fail with the following error: + +```text +no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1" +``` + +Install the [Bitnami Kube Prometheus helm chart](https://github.com/bitnami/charts/tree/main/bitnami/kube-prometheus) for having the necessary CRDs and the Prometheus Operator. + +### Update credentials + +Bitnami charts configure credentials at first boot. Any further change in the secrets or credentials require manual intervention. Follow these instructions: + +- Update the user password following [the upstream documentation](https://github.com/seaweedfs/seaweedfs/wiki) +- Update the password secret with the new values (replace the SECRET_NAME, ADMIN_ACCESS_KEY_ID, ADMIN_SECRET_KEY_ID, READ_ACCESS_KEY_ID and READ_SECRET_ACCESS_KEY placeholders) + +```shell +kubectl create secret generic SECRET_NAME --from-literal=admin_access_key_id=ADMIN_ACCESS_KEY_ID --from-literal=admin_secret_access_key=ADMIN_SECRET_KEY_ID --from-literal=read_access_key_id=READ_ACCESS_KEY_ID --from-literal=read_secret_access_key=READ_SECRET_KEY_ID --dry-run -o yaml | kubectl apply -f - +``` + +### [Rolling VS Immutable tags](https://techdocs.broadcom.com/us/en/vmware-tanzu/application-catalog/tanzu-application-catalog/services/tac-doc/apps-tutorials-understand-rolling-tags-containers-index.html) It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. @@ -65,6 +94,8 @@ You may want to have SeaweedFS Filer Server connect to an external database rath ```console mariadb.enabled=false +externalDatabase.enabled=true +externalDatabase.store=mariadb externalDatabase.host=myexternalhost externalDatabase.user=myuser externalDatabase.password=mypassword @@ -72,6 +103,38 @@ externalDatabase.database=mydatabase externalDatabase.port=3306 ``` +In addition, the "filemeta" table must be created in the external database before starting SeaweedFS. + +- For MariaDB, the following should be performed: + +```sql +USE DATABASE_NAME; +CREATE TABLE IF NOT EXISTS filemeta ( + `dirhash` BIGINT NOT NULL COMMENT 'first 64 bits of MD5 hash value of directory field', + `name` VARCHAR(766) NOT NULL COMMENT 'directory or file name', + `directory` TEXT NOT NULL COMMENT 'full path to parent directory', + `meta` LONGBLOB, + PRIMARY KEY (`dirhash`, `name`) +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +``` + +- For PostgreSQL, the following should be performed: + +```sql +\c DATABASE_NAME; +CREATE TABLE IF NOT EXISTS filemeta ( + dirhash BIGINT, + name VARCHAR(65535), + directory VARCHAR(65535), + meta bytea, + PRIMARY KEY (dirhash, name) +); +``` + +> Note: You need to substitute the placeholder `DATABASE_NAME` with the actual database name. + +You can also rely on a K8s job to create the table during the Helm chart installation. To do so, set the `externalDatabase.initDatabaseJob.enabled` parameter to `true`. + ### Ingress This chart provides support for Ingress resources. If you have an ingress controller installed on your cluster, such as [nginx-ingress-controller](https://github.com/bitnami/charts/tree/main/bitnami/nginx-ingress-controller) or [contour](https://github.com/bitnami/charts/tree/main/bitnami/contour) you can utilize the ingress controller to serve your application. @@ -165,6 +228,10 @@ This chart allows you to set your custom affinity using the `affinity` parameter As an alternative, use one of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/main/bitnami/common#affinities) chart. To do so, set the `podAffinityPreset`, `podAntiAffinityPreset`, or `nodeAffinityPreset` parameters. +### Backup and restore + +To back up and restore Helm chart deployments on Kubernetes, you need to back up the persistent volumes from the source deployment and attach them to a new deployment using [Velero](https://velero.io/), a Kubernetes backup/restore tool. Find the instructions for using Velero in [this guide](https://techdocs.broadcom.com/us/en/vmware-tanzu/application-catalog/tanzu-application-catalog/services/tac-doc/apps-tutorials-backup-restore-deployments-velero-index.html). + ## Persistence The [Bitnami SeaweedFS](https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs) image stores the data and configurations at the `/bitnami` path of the container. Persistent Volume Claims are used to keep the data across deployments. @@ -175,13 +242,13 @@ If you encounter errors when working with persistent volumes, refer to our [trou ### Global parameters -| Name | Description | Value | -| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -| `global.imageRegistry` | Global Docker image registry | `""` | -| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.defaultStorageClass` | Global default StorageClass for Persistent Volume(s) | `""` | -| `global.storageClass` | DEPRECATED: use global.defaultStorageClass instead | `""` | -| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | +| Name | Description | Value | +| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `global.imageRegistry` | Global Docker image registry | `""` | +| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | +| `global.defaultStorageClass` | Global default StorageClass for Persistent Volume(s) | `""` | +| `global.security.allowInsecureImages` | Allows skipping image verification | `false` | +| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | ### Common parameters @@ -284,13 +351,14 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `master.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Master Server container | `RuntimeDefault` | | `master.logLevel` | Master Server log level [0|1|2|3|4] | `1` | | `master.bindAddress` | Master Server bind address | `0.0.0.0` | +| `master.volumeSizeLimitMB` | Limit (in MB) to stop directing writes to oversized volumes | `1000` | | `master.config` | Master Server configuration | `""` | | `master.existingConfigmap` | The name of an existing ConfigMap with your custom configuration for Master Server | `""` | | `master.command` | Override default Master Server container command (useful when using custom images) | `[]` | | `master.args` | Override default Master Server container args (useful when using custom images) | `[]` | | `master.automountServiceAccountToken` | Mount Service Account token in Master Server pods | `false` | | `master.hostAliases` | Master Server pods host aliases | `[]` | -| `master.statefulsetAnnotations` | Annotations for Master Server statefulset | `{}` | +| `master.statefulsetAnnotations` | Annotations for Master Server StatefulSet | `{}` | | `master.podLabels` | Extra labels for Master Server pods | `{}` | | `master.podAnnotations` | Annotations for Master Server pods | `{}` | | `master.podAffinityPreset` | Pod affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `""` | @@ -301,8 +369,8 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `master.affinity` | Affinity for Master Server pods assignment | `{}` | | `master.nodeSelector` | Node labels for Master Server pods assignment | `{}` | | `master.tolerations` | Tolerations for Master Server pods assignment | `[]` | -| `master.updateStrategy.type` | Master Server statefulset strategy type | `RollingUpdate` | -| `master.podManagementPolicy` | Pod management policy for Master Server statefulset | `Parallel` | +| `master.updateStrategy.type` | Master Server StatefulSet strategy type | `RollingUpdate` | +| `master.podManagementPolicy` | Pod management policy for Master Server StatefulSet | `Parallel` | | `master.priorityClassName` | Master Server pods' priorityClassName | `""` | | `master.topologySpreadConstraints` | Topology Spread Constraints for Master Server pod assignment spread across your cluster among failure-domains | `[]` | | `master.schedulerName` | Name of the k8s scheduler (other than default) for Master Server pods | `""` | @@ -366,18 +434,21 @@ If you encounter errors when working with persistent volumes, refer to our [trou ### Master Server Persistence Parameters -| Name | Description | Value | -| ---------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | -| `master.persistence.enabled` | Enable persistence on Master Server using Persistent Volume Claims | `true` | -| `master.persistence.mountPath` | Path to mount the volume at. | `/data` | -| `master.persistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | -| `master.persistence.storageClass` | Storage class of backing PVC | `""` | -| `master.persistence.annotations` | Persistent Volume Claim annotations | `{}` | -| `master.persistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | -| `master.persistence.size` | Size of data volume | `8Gi` | -| `master.persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | -| `master.persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | -| `master.persistence.dataSource` | Custom PVC data source | `{}` | +| Name | Description | Value | +| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | +| `master.persistence.enabled` | Enable persistence on Master Server using Persistent Volume Claims | `true` | +| `master.persistence.mountPath` | Path to mount the volume at. | `/data` | +| `master.persistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `master.persistence.storageClass` | Storage class of backing PVC | `""` | +| `master.persistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `master.persistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `master.persistence.size` | Size of data volume | `8Gi` | +| `master.persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | +| `master.persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | +| `master.persistence.dataSource` | Custom PVC data source | `{}` | +| `master.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet | `false` | +| `master.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `master.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | ### Master Server Metrics Parameters @@ -454,7 +525,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `volume.args` | Override default Volume Server container args (useful when using custom images) | `[]` | | `volume.automountServiceAccountToken` | Mount Service Account token in Volume Server pods | `false` | | `volume.hostAliases` | Volume Server pods host aliases | `[]` | -| `volume.statefulsetAnnotations` | Annotations for Volume Server statefulset | `{}` | +| `volume.statefulsetAnnotations` | Annotations for Volume Server StatefulSet | `{}` | | `volume.podLabels` | Extra labels for Volume Server pods | `{}` | | `volume.podAnnotations` | Annotations for Volume Server pods | `{}` | | `volume.podAffinityPreset` | Pod affinity preset. Ignored if `volume.affinity` is set. Allowed values: `soft` or `hard` | `""` | @@ -465,8 +536,8 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `volume.affinity` | Affinity for Volume Server pods assignment | `{}` | | `volume.nodeSelector` | Node labels for Volume Server pods assignment | `{}` | | `volume.tolerations` | Tolerations for Volume Server pods assignment | `[]` | -| `volume.updateStrategy.type` | Volume Server statefulset strategy type | `RollingUpdate` | -| `volume.podManagementPolicy` | Pod management policy for Volume Server statefulset | `Parallel` | +| `volume.updateStrategy.type` | Volume Server StatefulSet strategy type | `RollingUpdate` | +| `volume.podManagementPolicy` | Pod management policy for Volume Server StatefulSet | `Parallel` | | `volume.priorityClassName` | Volume Server pods' priorityClassName | `""` | | `volume.topologySpreadConstraints` | Topology Spread Constraints for Volume Server pod assignment spread across your cluster among failure-domains | `[]` | | `volume.schedulerName` | Name of the k8s scheduler (other than default) for Volume Server pods | `""` | @@ -530,19 +601,23 @@ If you encounter errors when working with persistent volumes, refer to our [trou ### Volume Server Persistence Parameters -| Name | Description | Value | -| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | -| `volume.dataVolumes[0].name` | Name of the data volume | `data-0` | -| `volume.dataVolumes[0].mountPath` | Path to mount the volume at. | `/data-0` | -| `volume.dataVolumes[0].subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | -| `volume.dataVolumes[0].persistence.enabled` | Enable persistence on Volume Server using Persistent Volume Claims | `true` | -| `volume.dataVolumes[0].persistence.storageClass` | Storage class of backing PVC | `""` | -| `volume.dataVolumes[0].persistence.annotations` | Persistent Volume Claim annotations | `{}` | -| `volume.dataVolumes[0].persistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | -| `volume.dataVolumes[0].persistence.size` | Size of data volume | `8Gi` | -| `volume.dataVolumes[0].persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | -| `volume.dataVolumes[0].persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | -| `volume.dataVolumes[0].persistence.dataSource` | Custom PVC data source | `{}` | +| Name | Description | Value | +| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | +| `volume.dataVolumes[0].name` | Name of the data volume | `data-0` | +| `volume.dataVolumes[0].mountPath` | Path to mount the volume at. | `/data-0` | +| `volume.dataVolumes[0].subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `volume.dataVolumes[0].maxVolumes` | Max number of SeaweedFS volumes this data volume can be divided into. If set to 0, the limit will be auto configured as free disk space divided by default volume size (30GB) | `8` | +| `volume.dataVolumes[0].persistence.enabled` | Enable persistence on Volume Server using Persistent Volume Claims | `true` | +| `volume.dataVolumes[0].persistence.storageClass` | Storage class of backing PVC | `""` | +| `volume.dataVolumes[0].persistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `volume.dataVolumes[0].persistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `volume.dataVolumes[0].persistence.size` | Size of data volume | `8Gi` | +| `volume.dataVolumes[0].persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | +| `volume.dataVolumes[0].persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | +| `volume.dataVolumes[0].persistence.dataSource` | Custom PVC data source | `{}` | +| `volume.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet | `false` | +| `volume.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `volume.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | ### Volume Server Metrics Parameters @@ -621,7 +696,7 @@ enabled = false | `filer.args` | Override default Filer Server container args (useful when using custom images) | `[]` | | `filer.automountServiceAccountToken` | Mount Service Account token in Filer Server pods | `false` | | `filer.hostAliases` | Filer Server pods host aliases | `[]` | -| `filer.statefulsetAnnotations` | Annotations for Filer Server statefulset | `{}` | +| `filer.statefulsetAnnotations` | Annotations for Filer Server StatefulSet | `{}` | | `filer.podLabels` | Extra labels for Filer Server pods | `{}` | | `filer.podAnnotations` | Annotations for Filer Server pods | `{}` | | `filer.podAffinityPreset` | Pod affinity preset. Ignored if `filer.affinity` is set. Allowed values: `soft` or `hard` | `""` | @@ -632,8 +707,8 @@ enabled = false | `filer.affinity` | Affinity for Filer Server pods assignment | `{}` | | `filer.nodeSelector` | Node labels for Filer Server pods assignment | `{}` | | `filer.tolerations` | Tolerations for Filer Server pods assignment | `[]` | -| `filer.updateStrategy.type` | Filer Server statefulset strategy type | `RollingUpdate` | -| `filer.podManagementPolicy` | Pod management policy for Filer Server statefulset | `Parallel` | +| `filer.updateStrategy.type` | Filer Server StatefulSet strategy type | `RollingUpdate` | +| `filer.podManagementPolicy` | Pod management policy for Filer Server StatefulSet | `Parallel` | | `filer.priorityClassName` | Filer Server pods' priorityClassName | `""` | | `filer.topologySpreadConstraints` | Topology Spread Constraints for Filer Server pod assignment spread across your cluster among failure-domains | `[]` | | `filer.schedulerName` | Name of the k8s scheduler (other than default) for Filer Server pods | `""` | @@ -1018,38 +1093,86 @@ enabled = false ### Other Parameters -| Name | Description | Value | -| --------------------------------------------- | ---------------------------------------------------------------- | ------ | -| `serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | -| `serviceAccount.name` | The name of the ServiceAccount to use. | `""` | -| `serviceAccount.annotations` | Additional Service Account annotations (evaluated as a template) | `{}` | -| `serviceAccount.automountServiceAccountToken` | Automount service account token for the server service account | `true` | +| Name | Description | Value | +| --------------------------------------------- | ---------------------------------------------------------------- | ------- | +| `serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | +| `serviceAccount.name` | The name of the ServiceAccount to use. | `""` | +| `serviceAccount.annotations` | Additional Service Account annotations (evaluated as a template) | `{}` | +| `serviceAccount.automountServiceAccountToken` | Automount service account token for the server service account | `false` | ### Database Parameters -| Name | Description | Value | -| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | -| `mariadb.enabled` | Deploy a MariaDB server to satisfy the Filer server database requirements | `true` | -| `mariadb.architecture` | MariaDB architecture. Allowed values: `standalone` or `replication` | `standalone` | -| `mariadb.auth.rootPassword` | MariaDB root password | `""` | -| `mariadb.auth.database` | MariaDB custom database | `bitnami_seaweedfs` | -| `mariadb.auth.username` | MariaDB custom user name | `bn_seaweedfs` | -| `mariadb.auth.password` | MariaDB custom user password | `""` | -| `mariadb.auth.usePasswordFiles` | Mount credentials as a file instead of using an environment variable | `false` | -| `mariadb.initdbScripts` | Specify dictionary of scripts to be run at first boot | `{}` | -| `mariadb.primary.persistence.enabled` | Enable persistence on MariaDB using PVC(s) | `true` | -| `mariadb.primary.persistence.storageClass` | Persistent Volume storage class | `""` | -| `mariadb.primary.persistence.accessModes` | Persistent Volume access modes | `[]` | -| `mariadb.primary.persistence.size` | Persistent Volume size | `8Gi` | -| `mariadb.primary.resourcesPreset` | Set container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if primary.resources is set (primary.resources is recommended for production). | `micro` | -| `mariadb.primary.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | -| `externalDatabase.enabled` | Enable secret with external mariadb database credentials | `false` | -| `externalDatabase.host` | External Database server host | `localhost` | -| `externalDatabase.port` | External Database server port | `3306` | -| `externalDatabase.user` | External Database username | `bn_seaweedfs` | -| `externalDatabase.password` | External Database user password | `""` | -| `externalDatabase.database` | External Database database name | `bitnami_seaweedfs` | -| `externalDatabase.existingSecret` | The name of an existing secret with database credentials. Evaluated as a template | `""` | +| Name | Description | Value | +| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| `mariadb.enabled` | Deploy a MariaDB server to satisfy the Filer server database requirements | `true` | +| `mariadb.image.registry` | MariaDB image registry | `REGISTRY_NAME` | +| `mariadb.image.repository` | MariaDB image repository | `REPOSITORY_NAME/mariadb` | +| `mariadb.image.digest` | MariaDB image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `mariadb.image.pullPolicy` | MariaDB image pull policy | `IfNotPresent` | +| `mariadb.image.pullSecrets` | Specify docker-registry secret names as an array | `[]` | +| `mariadb.architecture` | MariaDB architecture. Allowed values: `standalone` or `replication` | `standalone` | +| `mariadb.auth.rootPassword` | MariaDB root password | `""` | +| `mariadb.auth.database` | MariaDB custom database | `bitnami_seaweedfs` | +| `mariadb.auth.username` | MariaDB custom user name | `bn_seaweedfs` | +| `mariadb.auth.password` | MariaDB custom user password | `""` | +| `mariadb.auth.usePasswordFiles` | Mount credentials as a file instead of using an environment variable | `false` | +| `mariadb.initdbScripts` | Specify dictionary of scripts to be run at first boot | `{}` | +| `mariadb.primary.persistence.enabled` | Enable persistence on MariaDB using PVC(s) | `true` | +| `mariadb.primary.persistence.storageClass` | Persistent Volume storage class | `""` | +| `mariadb.primary.persistence.accessModes` | Persistent Volume access modes | `[]` | +| `mariadb.primary.persistence.size` | Persistent Volume size | `8Gi` | +| `mariadb.primary.resourcesPreset` | Set container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if primary.resources is set (primary.resources is recommended for production). | `micro` | +| `mariadb.primary.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `postgresql.enabled` | Deploy a PostgresSQL server to satisfy the Filer server database requirements | `false` | +| `postgresql.image.registry` | PostgreSQL image registry | `REGISTRY_NAME` | +| `postgresql.image.repository` | PostgreSQL image repository | `REPOSITORY_NAME/postgresql` | +| `postgresql.image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `postgresql.image.pullPolicy` | PostgreSQL image pull policy | `IfNotPresent` | +| `postgresql.image.pullSecrets` | Specify image pull secrets | `[]` | +| `postgresql.architecture` | PostgreSQL architecture (`standalone` or `replication`) | `standalone` | +| `postgresql.auth.postgresPassword` | Password for the "postgres" admin user. Ignored if `auth.existingSecret` with key `postgres-password` is provided | `""` | +| `postgresql.auth.database` | Name for a custom database to create | `bitnami_seaweedfs` | +| `postgresql.auth.username` | Name for a custom user to create | `bn_seaweedfs` | +| `postgresql.auth.password` | Password for the custom user to create | `some-password` | +| `postgresql.auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials | `""` | +| `postgresql.auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `password` | +| `postgresql.primary.resourcesPreset` | Set container resources according to one common preset (allowed values: none, nano, micro, small, medium, large, xlarge, 2xlarge). This is ignored if postgresql.primary.resources is set (postgresql.primary.resources is recommended for production). | `nano` | +| `postgresql.primary.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `postgresql.primary.initdb.scripts` | Dictionary of initdb scripts | `{}` | +| `postgresql.primary.persistence.enabled` | Enable PostgreSQL Primary data persistence using PVC(s) | `true` | +| `postgresql.primary.persistence.storageClass` | Persistent Volume storage class | `""` | +| `postgresql.primary.persistence.accessModes` | Persistent Volume access modes | `[]` | +| `postgresql.primary.persistence.size` | Persistent Volume size | `8Gi` | +| `externalDatabase.enabled` | Enable external database support | `false` | +| `externalDatabase.store` | Database store (mariadb, postgresql) | `mariadb` | +| `externalDatabase.host` | External Database server host | `localhost` | +| `externalDatabase.port` | External Database server port | `3306` | +| `externalDatabase.user` | External Database username | `bn_seaweedfs` | +| `externalDatabase.password` | External Database user password | `""` | +| `externalDatabase.database` | External Database database name | `bitnami_seaweedfs` | +| `externalDatabase.existingSecret` | The name of an existing secret with database credentials. Evaluated as a template | `""` | +| `externalDatabase.initDatabaseJob.enabled` | Enable the init external database job | `false` | +| `externalDatabase.initDatabaseJob.labels` | Extra labels for the init external database job | `{}` | +| `externalDatabase.initDatabaseJob.annotations` | Extra annotations for the init external database job | `{}` | +| `externalDatabase.initDatabaseJob.backoffLimit` | Set backoff limit of the init external database job | `10` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.enabled` | Enabled init external database job containers' Security Context | `true` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `{}` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.runAsUser` | Set init external database job containers' Security Context runAsUser | `1001` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.runAsGroup` | Set init external database job containers' Security Context runAsGroup | `1001` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.runAsNonRoot` | Set init external database job containers' Security Context runAsNonRoot | `true` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.privileged` | Set init external database job containers' Security Context privileged | `false` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.readOnlyRootFilesystem` | Set init external database job containers' Security Context readOnlyRootFilesystem | `true` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.allowPrivilegeEscalation` | Set init external database job containers' Security Context allowPrivilegeEscalation | `false` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | +| `externalDatabase.initDatabaseJob.containerSecurityContext.seccompProfile.type` | Set init external database job containers' Security Context seccomp profile | `RuntimeDefault` | +| `externalDatabase.initDatabaseJob.podSecurityContext.enabled` | Enabled init external database job pods' Security Context | `true` | +| `externalDatabase.initDatabaseJob.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `externalDatabase.initDatabaseJob.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `externalDatabase.initDatabaseJob.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `externalDatabase.initDatabaseJob.podSecurityContext.fsGroup` | Set init external database job pod's Security Context fsGroup | `1001` | +| `externalDatabase.initDatabaseJob.resourcesPreset` | Set init external database job container resources according to one common preset (allowed values: none, nano, micro, small, medium, large, xlarge, 2xlarge). This is ignored if externalDatabase.initDatabaseJob.resources is set (externalDatabase.initDatabaseJob.resources is recommended for production). | `micro` | +| `externalDatabase.initDatabaseJob.resources` | Set init external database job container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `externalDatabase.initDatabaseJob.automountServiceAccountToken` | Mount Service Account token in external database job pod | `false` | The above parameters map to the env variables defined in [bitnami/seaweedfs](https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs). For more information please refer to the [bitnami/seaweedfs](https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs) image documentation. @@ -1077,6 +1200,28 @@ helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/seawe ## Upgrading +### To 4.2.0 + +This version introduces image verification for security purposes. To disable it, set `global.security.allowInsecureImages` to `true`. More details at [GitHub issue](https://github.com/bitnami/charts/issues/30850). + +### To 4.0.0 + +This major bump updates the MariaDB subchart to version 20.0.0. This subchart updates the StatefulSet objects `serviceName` to use a headless service, as the current non-headless service attached to it was not providing DNS entries. This will cause an upgrade issue because it changes "immutable fields". To workaround it, delete the StatefulSet objects as follows (replace the RELEASE_NAME placeholder): + +```shell +kubectl delete sts RELEASE_NAME-mariadb --cascade=false +``` + +Then execute `helm upgrade` as usual. + +### To 3.0.0 + +This major updates the PostgreSQL subchart to its newest major, 16.0.0, which uses PostgreSQL 17.x. Follow the [official instructions](https://www.postgresql.org/docs/17/upgrading.html) to upgrade to 17.x. + +### To 2.0.0 + +This major version adds support for using PostgreSQL as an alternative for MariaDB to comply with Filer database requirements. No breaking changes are expected when upgrading to this version if MariaDB is used. + ### To 1.0.0 This major release bumps the MariaDB version to 11.4. Follow the [upstream instructions](https://mariadb.com/kb/en/upgrading-from-mariadb-11-3-to-mariadb-11-4/) for upgrading from MariaDB 11.3 to 11.4. No major issues are expected during the upgrade. diff --git a/helm/seaweedfs/charts/common-2.28.0.tgz b/helm/seaweedfs/charts/common-2.28.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..21c0e76d36a29f77c0b874d747424dfa653b4971 Binary files /dev/null and b/helm/seaweedfs/charts/common-2.28.0.tgz differ diff --git a/helm/seaweedfs/charts/mariadb-20.2.1.tgz b/helm/seaweedfs/charts/mariadb-20.2.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2f55cc750ba3907eebca3545636e8f9c8afd19d2 Binary files /dev/null and b/helm/seaweedfs/charts/mariadb-20.2.1.tgz differ diff --git a/helm/seaweedfs/charts/postgresql-16.3.4.tgz b/helm/seaweedfs/charts/postgresql-16.3.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..66db70566af3bfd481f39e80e83ff61e22b9d493 Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.3.4.tgz differ diff --git a/helm/seaweedfs/templates/NOTES.txt b/helm/seaweedfs/templates/NOTES.txt index df098c41a1045331e3113ee269601e5efa72281c..341587f4d2e23e967b69ae0f81c2849fec8fb90d 100644 --- a/helm/seaweedfs/templates/NOTES.txt +++ b/helm/seaweedfs/templates/NOTES.txt @@ -1,6 +1,8 @@ -CHART NAME: {{ .Chart.Name }} -CHART VERSION: {{ .Chart.Version }} -APP VERSION: {{ .Chart.AppVersion }} +CHART NAME: {{ .Chart.Name }} +CHART VERSION: {{ .Chart.Version }} +APP VERSION: {{ .Chart.AppVersion }} + +Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami for more information. ** Please be patient while the chart is being deployed ** @@ -166,5 +168,8 @@ The chart was deployed enabling WebDAV, to access it from outside the cluster fo {{- include "common.warnings.rollingTag" .Values.image }} {{- include "common.warnings.rollingTag" .Values.volumePermissions.image }} +{{- include "common.warnings.rollingTag" .Values.mariadb.image }} +{{- include "common.warnings.rollingTag" .Values.postgresql.image }} {{- include "seaweedfs.validateValues" . }} -{{- include "common.warnings.modifiedImages" (dict "images" (list .Values.image .Values.volumePermissions.image) "context" $) }} \ No newline at end of file +{{- include "common.warnings.modifiedImages" (dict "images" (list .Values.image .Values.volumePermissions.image .Values.mariadb.image .Values.postgresql.image) "context" $) }} +{{- include "common.errors.insecureImages" (dict "images" (list .Values.image .Values.volumePermissions.image .Values.mariadb.image .Values.postgresql.image) "context" $) }} diff --git a/helm/seaweedfs/templates/_helpers.tpl b/helm/seaweedfs/templates/_helpers.tpl index 0c7e2361b969c13395a8187437455b243939db69..9f76dc6966ce3d40ec3337b4822f67a55702f52e 100644 --- a/helm/seaweedfs/templates/_helpers.tpl +++ b/helm/seaweedfs/templates/_helpers.tpl @@ -45,6 +45,13 @@ Return the proper SeaweedFS MariaDB database fullname {{- include "common.names.dependency.fullname" (dict "chartName" "mariadb" "chartValues" .Values.mariadb "context" $) -}} {{- end -}} +{{/* +Return the proper SeaweedFS PostgreSQL database fullname +*/}} +{{- define "seaweedfs.postgresql.fullname" -}} +{{- include "common.names.dependency.fullname" (dict "chartName" "postgresql" "chartValues" .Values.postgresql "context" $) -}} +{{- end -}} + {{/* Return the proper SeaweedFS image name */}} @@ -59,11 +66,22 @@ Return the proper image name (for the init container volume-permissions image) {{- include "common.images.image" ( dict "imageRoot" .Values.volumePermissions.image "global" .Values.global ) -}} {{- end -}} +{{/* +Return the proper init external database job image name +*/}} +{{- define "seaweedfs.initDatabaseJob.image" -}} +{{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }} + {{- include "common.images.image" (dict "imageRoot" .Values.mariadb.image "global" .Values.global) -}} + {{- else if or .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "postgresql") ) }} + {{- include "common.images.image" (dict "imageRoot" .Values.postgresql.image "global" .Values.global) -}} +{{- end -}} +{{- end -}} + {{/* Return the proper Docker Image Registry Secret Names */}} {{- define "seaweedfs.imagePullSecrets" -}} -{{- include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.volumePermissions.image) "context" $) -}} +{{- include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.volumePermissions.image .Values.mariadb.image .Values.postgresql.image) "context" $) -}} {{- end -}} {{/* @@ -223,11 +241,17 @@ Return the database hostname */}} {{- define "seaweedfs.database.host" -}} {{- if .Values.mariadb.enabled }} - {{- if eq .Values.mariadb.architecture "replication" }} + {{- if eq .Values.mariadb.architecture "replication" -}} {{- printf "%s-primary" (include "seaweedfs.mariadb.fullname" .) | trunc 63 | trimSuffix "-" -}} {{- else -}} {{- print (include "seaweedfs.mariadb.fullname" .) -}} {{- end -}} +{{- else if .Values.postgresql.enabled -}} + {{- if eq .Values.postgresql.architecture "replication" -}} + {{- printf "%s-primary" (include "seaweedfs.postgresql.fullname" .) | trunc 63 | trimSuffix "-" -}} + {{- else -}} + {{- print (include "seaweedfs.postgresql.fullname" .) -}} + {{- end -}} {{- else -}} {{- print .Values.externalDatabase.host -}} {{- end -}} @@ -239,6 +263,8 @@ Return the database port {{- define "seaweedfs.database.port" -}} {{- if .Values.mariadb.enabled }} {{- print "3306" -}} +{{- else if .Values.postgresql.enabled -}} + {{- print "5432" -}} {{- else -}} {{- printf "%d" (.Values.externalDatabase.port | int ) -}} {{- end -}} @@ -250,6 +276,8 @@ Return the database name {{- define "seaweedfs.database.name" -}} {{- if .Values.mariadb.enabled }} {{- print .Values.mariadb.auth.database -}} +{{- else if .Values.postgresql.enabled -}} + {{- coalesce (((.Values.global.postgresql).auth).database) .Values.postgresql.auth.database -}} {{- else -}} {{- print .Values.externalDatabase.database -}} {{- end -}} @@ -261,6 +289,8 @@ Return the database user {{- define "seaweedfs.database.user" -}} {{- if .Values.mariadb.enabled }} {{- print .Values.mariadb.auth.username -}} +{{- else if .Values.postgresql.enabled -}} + {{- coalesce (((.Values.global.postgresql).auth).username) .Values.postgresql.auth.username -}} {{- else -}} {{- print .Values.externalDatabase.user -}} {{- end -}} @@ -276,6 +306,13 @@ Return the database secret name {{- else -}} {{- print (include "seaweedfs.mariadb.fullname" .) -}} {{- end -}} +{{- else if .Values.postgresql.enabled -}} + {{- $existingSecret := coalesce (((.Values.global.postgresql).auth).existingSecret) .Values.postgresql.auth.existingSecret -}} + {{- if $existingSecret -}} + {{- print (tpl $existingSecret .) -}} + {{- else -}} + {{- print (include "seaweedfs.postgresql.fullname" .) -}} + {{- end -}} {{- else if .Values.externalDatabase.existingSecret -}} {{- print (tpl .Values.externalDatabase.existingSecret .) -}} {{- else -}} @@ -283,13 +320,32 @@ Return the database secret name {{- end -}} {{- end -}} +{{/* +Return the database secret key name +*/}} +{{- define "seaweedfs.database.keyName" -}} +{{- if .Values.mariadb.enabled }} + {{- print "mariadb-password" -}} +{{- else if .Values.postgresql.enabled -}} + {{- print .Values.postgresql.auth.secretKeys.userPasswordKey -}} +{{- else if .Values.externalDatabase.existingSecret -}} + {{- printf "%s-password" .Values.externalDatabase.store -}} +{{- else -}} + {{- print "password" -}} +{{- end -}} +{{- end -}} + {{/* Returns an init-container that waits for the database to be ready */}} {{- define "seaweedfs.filer.waitForDBInitContainer" -}} - name: wait-for-db - image: {{ include "common.images.image" (dict "imageRoot" .Values.mariadb.image "global" .Values.global) }} + image: {{ include "seaweedfs.initDatabaseJob.image" . }} + {{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }} imagePullPolicy: {{ .Values.mariadb.image.pullPolicy }} + {{- else if or .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "postgresql") ) }} + imagePullPolicy: {{ .Values.postgresql.image.pullPolicy }} + {{- end }} {{- if .Values.filer.containerSecurityContext.enabled }} securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.filer.containerSecurityContext "context" $) | nindent 4 }} {{- end }} @@ -298,21 +354,20 @@ Returns an init-container that waits for the database to be ready args: - -ec - | - #!/bin/bash - set -o errexit set -o nounset set -o pipefail . /opt/bitnami/scripts/liblog.sh - . /opt/bitnami/scripts/libvalidations.sh + [[ -f $DATABASE_PASSWORD_FILE ]] && export DATABASE_PASSWORD="$(< "${DATABASE_PASSWORD_FILE}")" + {{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }} . /opt/bitnami/scripts/libmariadb.sh . /opt/bitnami/scripts/mariadb-env.sh info "Waiting for host $DATABASE_HOST" mariadb_is_ready() { if ! echo "select 1" | mysql_remote_execute "$DATABASE_HOST" "$DATABASE_PORT_NUMBER" "$DATABASE_NAME" "$DATABASE_USER" "$DATABASE_PASSWORD"; then - return 1 + return 1 fi return 0 } @@ -320,10 +375,24 @@ Returns an init-container that waits for the database to be ready error "Database not ready" exit 1 fi + {{- else if or .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "postgresql") ) }} + . /opt/bitnami/scripts/libpostgresql.sh + . /opt/bitnami/scripts/postgresql-env.sh + + info "Waiting for host $DATABASE_HOST" + postgresql_is_ready() { + if ! echo "SELECT 1" | postgresql_remote_execute "$DATABASE_HOST" "$DATABASE_PORT_NUMBER" "$DATABASE_NAME" "$DATABASE_USER" "$DATABASE_PASSWORD"; then + return 1 + fi + return 0 + } + if ! retry_while "postgresql_is_ready"; then + error "Database not ready" + exit 1 + fi + {{- end }} info "Database is ready" env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.mariadb.image.debug .Values.diagnosticMode.enabled) | quote }} - name: DATABASE_HOST value: {{ include "seaweedfs.database.host" . | quote }} - name: DATABASE_PORT_NUMBER @@ -332,24 +401,19 @@ Returns an init-container that waits for the database to be ready value: {{ include "seaweedfs.database.name" . | quote }} - name: DATABASE_USER value: {{ include "seaweedfs.database.user" . | quote }} - - name: DATABASE_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "seaweedfs.database.secretName" . }} - key: mariadb-password - resources: - requests: - cpu: 100m - memory: 128Mi - ephemeral-storage: 50Mi - limits: - cpu: 150m - memory: 192Mi - ephemeral-storage: 2Gi + - name: DATABASE_PASSWORD_FILE + value: "/secrets/password" + {{- if .Values.filer.resources }} + resources: {{- toYaml .Values.filer.resources | nindent 12 }} + {{- else if ne .Values.filer.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.filer.resourcesPreset) | nindent 12 }} + {{- end }} volumeMounts: - name: empty-dir mountPath: /tmp subPath: tmp-dir + - name: db-credentials + mountPath: /secrets {{- end -}} {{/* @@ -424,15 +488,11 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP secretKeyRef: name: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }} key: read_secret_access_key - resources: - requests: - cpu: 100m - memory: 128Mi - ephemeral-storage: 50Mi - limits: - cpu: 150m - memory: 192Mi - ephemeral-storage: 2Gi + {{- if .Values.s3.resources }} + resources: {{- toYaml .Values.s3.resources | nindent 12 }} + {{- else if ne .Values.s3.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.s3.resourcesPreset) | nindent 12 }} + {{- end }} volumeMounts: - name: empty-dir mountPath: /auth @@ -555,11 +615,29 @@ volume.dataVolumes[] Validate values of SeaweedFS - Filer server database */}} {{- define "seaweedfs.validateValues.filer.database" -}} -{{- if and (not .Values.filer.enabled) .Values.mariadb.enabled -}} +{{- if not .Values.filer.enabled -}} + {{- if .Values.mariadb.enabled -}} mariadb.enabled The Filer Server is disabled, but the MariaDB dependency is enabled. Please enable the Filer Server (--set filer.enabled=true) or disable the MariaDB dependency (--set mariadb.enabled=false). + {{- end -}} + {{- if .Values.postgresql.enabled -}} +postgresql.enabled + The Filer Server is disabled, but the PostgreSQL dependency is enabled. + Please enable the Filer Server (--set filer.enabled=true) or + disable the PostgreSQL dependency (--set postgresql.enabled=false). + {{- end -}} +{{- else -}} + {{- if and .Values.mariadb.enabled .Values.postgresql.enabled -}} +mariadb.enabled, postgresql.enabled + Both MariaDB and PostgreSQL dependencies are enabled. Only one database dependency can be enabled. + Please disable one of them (--set mariadb.enabled=false) or (--set postgresql.enabled=false). + {{- else if and (not .Values.mariadb.enabled) (not .Values.postgresql.enabled) (not .Values.externalDatabase.enabled) -}} +mariadb.enabled, postgresql.enabled, externalDatabase.enabled + No database for Filer Server. Please provide a database dependency (--set mariadb.enabled=true), + (--set postgresql.enabled=true) or (--set externalDatabase.enabled=true). + {{- end -}} {{- end -}} {{- end -}} diff --git a/helm/seaweedfs/templates/externaldb-secrets.yaml b/helm/seaweedfs/templates/externaldb-secrets.yaml index 9c8c53bc2c3244c7df7633772979b23989270f04..e319218e0a7f458eb2410a26119aa96959fd0cb4 100644 --- a/helm/seaweedfs/templates/externaldb-secrets.yaml +++ b/helm/seaweedfs/templates/externaldb-secrets.yaml @@ -15,5 +15,5 @@ metadata: {{- end }} type: Opaque data: - mariadb-password: {{ .Values.externalDatabase.password | b64enc | quote }} + password: {{ .Values.externalDatabase.password | b64enc | quote }} {{- end }} diff --git a/helm/seaweedfs/templates/filer/statefulset.yaml b/helm/seaweedfs/templates/filer/statefulset.yaml index d1ddf3809a912854c970b99d56d76a23be2d7029..8a9c8b442a0dc5b4a2a5f400669d02469d92a7f9 100644 --- a/helm/seaweedfs/templates/filer/statefulset.yaml +++ b/helm/seaweedfs/templates/filer/statefulset.yaml @@ -34,9 +34,7 @@ spec: {{- if and .Values.filer.config (empty .Values.filer.existingConfigmap) }} checksum/config: {{ include (print $.Template.BasePath "/filer/configmap.yaml") . | sha256sum }} {{- end }} - {{- if .Values.security.enabled }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} - {{- end }} {{- if .Values.filer.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.podAnnotations "context" $) | nindent 8 }} {{- end }} @@ -85,9 +83,7 @@ spec: terminationGracePeriodSeconds: {{ .Values.filer.terminationGracePeriodSeconds }} {{- end }} initContainers: - {{- if .Values.mariadb.enabled }} {{- include "seaweedfs.filer.waitForDBInitContainer" . | nindent 8 }} - {{- end }} {{- if .Values.filer.initContainers }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.initContainers "context" $) | nindent 8 }} {{- end }} @@ -111,9 +107,7 @@ spec: args: - -logtostderr=true - -v={{ .Values.filer.logLevel }} - {{- if or .Values.security.enabled .Values.filer.config .Values.filer.existingConfigmap }} - -config_dir=/etc/seaweedfs - {{- end }} - filer - -ip.bind={{ .Values.filer.bindAddress }} - -ip=$(POD_NAME).{{ printf "%s-headless" (include "seaweedfs.filer.fullname" .) }}.$(NAMESPACE).svc.{{ .Values.clusterDomain }} @@ -137,7 +131,7 @@ spec: fieldPath: metadata.namespace - name: WEED_CLUSTER_DEFAULT value: {{ .Values.clusterDefault | quote }} - {{- if .Values.mariadb.enabled }} + {{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }} - name: WEED_MYSQL_ENABLED value: "true" - name: WEED_MYSQL_HOSTNAME @@ -152,7 +146,7 @@ spec: valueFrom: secretKeyRef: name: {{ include "seaweedfs.database.secretName" . }} - key: mariadb-password + key: {{ include "seaweedfs.database.keyName" . }} - name: WEED_MYSQL_CONNECTION_MAX_IDLE value: "5" - name: WEED_MYSQL_CONNECTION_MAX_OPEN @@ -162,6 +156,25 @@ spec: - name: WEED_MYSQL_INTERPOLATEPARAMS value: "true" {{- end }} + {{- if or .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "postgresql") ) }} + - name: WEED_POSTGRES_ENABLED + value: "true" + - name: WEED_POSTGRES_HOSTNAME + value: {{ include "seaweedfs.database.host" . | quote }} + - name: WEED_POSTGRES_PORT + value: {{ include "seaweedfs.database.port" . | quote }} + - name: WEED_POSTGRES_DATABASE + value: {{ include "seaweedfs.database.name" . | quote }} + - name: WEED_POSTGRES_USERNAME + value: {{ include "seaweedfs.database.user" . | quote }} + - name: WEED_POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "seaweedfs.database.secretName" . }} + key: {{ include "seaweedfs.database.keyName" . }} + - name: WEED_POSTGRES_SSLMODE + value: "disable" + {{- end }} {{- if .Values.filer.extraEnvVars }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.extraEnvVars "context" $) | nindent 12 }} {{- end }} @@ -231,7 +244,6 @@ spec: subPath: filer.toml readOnly: true {{- end }} - {{- if .Values.security.enabled }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -253,7 +265,6 @@ spec: readOnly: true mountPath: /certs/client {{- end }} - {{- end }} {{- if .Values.filer.extraVolumeMounts }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.extraVolumeMounts "context" $) | nindent 12 }} {{- end }} @@ -263,12 +274,17 @@ spec: volumes: - name: empty-dir emptyDir: {} + - name: db-credentials + secret: + secretName: {{ include "seaweedfs.database.secretName" . }} + items: + - key: {{ include "seaweedfs.database.keyName" . }} + path: password {{- if or .Values.filer.config .Values.filer.existingConfigmap }} - name: config configMap: name: {{ template "seaweedfs.filer.configmapName" . }} {{- end }} - {{- if .Values.security.enabled }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -292,7 +308,6 @@ spec: secret: secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} {{- end }} - {{- end }} {{- if .Values.filer.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.extraVolumes "context" $) | nindent 8 }} {{- end }} diff --git a/helm/seaweedfs/templates/master/statefulset.yaml b/helm/seaweedfs/templates/master/statefulset.yaml index c7e5a02e6804ac3304f17ab327d4ed70fe0e2859..22aa1180e8a0757bb55c4a63c52dfcb8f00e4284 100644 --- a/helm/seaweedfs/templates/master/statefulset.yaml +++ b/helm/seaweedfs/templates/master/statefulset.yaml @@ -33,9 +33,7 @@ spec: {{- if and .Values.master.config (empty .Values.master.existingConfigmap) }} checksum/config: {{ include (print $.Template.BasePath "/master/configmap.yaml") . | sha256sum }} {{- end }} - {{- if .Values.security.enabled }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} - {{- end }} {{- if .Values.master.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.master.podAnnotations "context" $) | nindent 8 }} {{- end }} @@ -134,9 +132,7 @@ spec: args: - -logtostderr=true - -v={{ .Values.master.logLevel }} - {{- if or .Values.security.enabled .Values.master.config .Values.master.existingConfigmap }} - -config_dir=/etc/seaweedfs - {{- end }} - master - -mdir={{ .Values.master.persistence.mountPath }} - -ip.bind={{ .Values.master.bindAddress }} @@ -147,6 +143,7 @@ spec: {{- if .Values.master.metrics.enabled }} - -metricsPort={{ .Values.master.containerPorts.metrics }} {{- end }} + - -volumeSizeLimitMB={{ .Values.master.volumeSizeLimitMB }} {{- end }} env: - name: BITNAMI_DEBUG @@ -235,7 +232,6 @@ spec: subPath: master.toml readOnly: true {{- end }} - {{- if .Values.security.enabled }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -259,7 +255,6 @@ spec: readOnly: true mountPath: /certs/client {{- end }} - {{- end }} {{- if .Values.master.extraVolumeMounts }} {{- include "common.tplvalues.render" (dict "value" .Values.master.extraVolumeMounts "context" $) | nindent 12 }} {{- end }} @@ -274,7 +269,6 @@ spec: configMap: name: {{ template "seaweedfs.master.configmapName" . }} {{- end }} - {{- if .Values.security.enabled }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -300,7 +294,6 @@ spec: secret: secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} {{- end }} - {{- end }} {{- if .Values.master.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.master.extraVolumes "context" $) | nindent 8 }} {{- end }} @@ -312,8 +305,15 @@ spec: persistentVolumeClaim: claimName: {{ .Values.master.persistence.existingClaim }} {{- else }} + {{- if .Values.master.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} volumeClaimTemplates: - - metadata: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: name: data {{- if or .Values.master.persistence.annotations .Values.commonAnnotations }} {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.master.persistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} diff --git a/helm/seaweedfs/templates/s3/deployment.yaml b/helm/seaweedfs/templates/s3/deployment.yaml index 7d3888720085c9cdf7409724cb24c44f19ed38d6..94bdbe54fab4adc521c59352652da45eb1f35e00 100644 --- a/helm/seaweedfs/templates/s3/deployment.yaml +++ b/helm/seaweedfs/templates/s3/deployment.yaml @@ -32,9 +32,7 @@ spec: {{- if and .Values.s3.auth.enabled (not .Values.s3.auth.existingSecret) }} checksum/auth-secret: {{ include (print $.Template.BasePath "/s3/auth-secret.yaml") . | sha256sum }} {{- end }} - {{- if .Values.security.enabled }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} - {{- end }} {{- if .Values.s3.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.s3.podAnnotations "context" $) | nindent 8 }} {{- end }} @@ -190,17 +188,18 @@ spec: mountPath: /tmp subPath: tmp-dir {{- if .Values.s3.auth.enabled }} - - mountPath: /auth - readOnly: true {{- if .Values.s3.auth.existingSecret }} + - mountPath: {{ printf "/auth/%s" (default "config.json" .Values.s3.auth.existingSecretConfigKey) }} + readOnly: true name: auth subPath: {{ default "config.json" .Values.s3.auth.existingSecretConfigKey }} {{- else }} + - mountPath: /auth + readOnly: true name: empty-dir subPath: auth-dir {{- end }} {{- end }} - {{- if .Values.security.enabled }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -222,7 +221,6 @@ spec: readOnly: true mountPath: /certs/client {{- end }} - {{- end }} {{- if .Values.s3.extraVolumeMounts }} {{- include "common.tplvalues.render" (dict "value" .Values.s3.extraVolumeMounts "context" $) | nindent 12 }} {{- end }} @@ -237,7 +235,6 @@ spec: secret: secretName: {{ print (tpl .Values.s3.auth.existingSecret .) }} {{- end }} - {{- if .Values.security.enabled }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -261,7 +258,6 @@ spec: secret: secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} {{- end }} - {{- end }} {{- if .Values.s3.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.s3.extraVolumes "context" $) | nindent 8 }} {{- end }} diff --git a/helm/seaweedfs/templates/security-configmap.yaml b/helm/seaweedfs/templates/security-configmap.yaml index bc3fa2e1ad57e2912acf5bd536539ca6427a5170..9c6d1bcc1d98444d9e6c63802d13c1752530d246 100644 --- a/helm/seaweedfs/templates/security-configmap.yaml +++ b/helm/seaweedfs/templates/security-configmap.yaml @@ -3,7 +3,6 @@ Copyright Broadcom, Inc. All Rights Reserved. SPDX-License-Identifier: APACHE-2.0 */}} -{{- if .Values.security.enabled }} apiVersion: v1 kind: ConfigMap metadata: @@ -17,7 +16,7 @@ data: security.toml: |- # Security configuration # Shared between master, volume and filer servers - + {{- if .Values.security.enabled }} # comma separated origins allowed to make requests to the filer and s3 gateway. # enter in this format: https://domain.com, or http://localhost:port [cors.allowed_origins] @@ -86,4 +85,9 @@ data: cert = "/certs/client/tls.crt" key = "/certs/client/tls.key" {{- end }} -{{- end }} + {{- else }} + # comma separated origins allowed to make requests to the filer and s3 gateway. + # enter in this format: https://domain.com, or http://localhost:port + [cors.allowed_origins] + values = "*" + {{- end }} diff --git a/helm/seaweedfs/templates/volume/statefulset.yaml b/helm/seaweedfs/templates/volume/statefulset.yaml index 42c268d2f3f3c1a38fc98c2295ad76c6a4c07605..3ba977a7724c8c8c460f7dee623a906b72bf5695 100644 --- a/helm/seaweedfs/templates/volume/statefulset.yaml +++ b/helm/seaweedfs/templates/volume/statefulset.yaml @@ -33,9 +33,7 @@ spec: {{- if and .Values.volume.config (empty .Values.volume.existingConfigmap) }} checksum/config: {{ include (print $.Template.BasePath "/volume/configmap.yaml") . | sha256sum }} {{- end }} - {{- if .Values.security.enabled }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} - {{- end }} {{- if .Values.volume.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.volume.podAnnotations "context" $) | nindent 8 }} {{- end }} @@ -139,15 +137,20 @@ spec: args: - -logtostderr=true - -v={{ .Values.volume.logLevel }} - {{- if or .Values.security.enabled .Values.volume.config .Values.volume.existingConfigmap }} - -config_dir=/etc/seaweedfs - {{- end }} - volume {{- $dataDirs := list }} + {{- $maxVolumes := list }} {{- range .Values.volume.dataVolumes }} {{- $dataDirs = append $dataDirs .mountPath }} + {{- if eq (.maxVolumes | toString) "0" }} + {{- $maxVolumes = append $maxVolumes 0 }} + {{- else }} + {{- $maxVolumes = append $maxVolumes (default 8 .maxVolumes) }} + {{- end }} {{- end }} - -dir={{ join "," $dataDirs }} + - -max={{ join "," $maxVolumes }} - -ip.bind={{ .Values.volume.bindAddress }} - -ip=$(POD_NAME).{{ printf "%s-headless" (include "seaweedfs.volume.fullname" .) }}.$(NAMESPACE).svc.{{ .Values.clusterDomain }} - -port={{ .Values.volume.containerPorts.http }} @@ -248,7 +251,6 @@ spec: subPath: volume.toml readOnly: true {{- end }} - {{- if .Values.security.enabled }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -272,7 +274,6 @@ spec: readOnly: true mountPath: /certs/client {{- end }} - {{- end }} {{- if .Values.volume.extraVolumeMounts }} {{- include "common.tplvalues.render" (dict "value" .Values.volume.extraVolumeMounts "context" $) | nindent 12 }} {{- end }} @@ -287,7 +288,6 @@ spec: configMap: name: {{ template "seaweedfs.volume.configmapName" . }} {{- end }} - {{- if .Values.security.enabled }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -313,7 +313,6 @@ spec: secret: secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} {{- end }} - {{- end }} {{- if .Values.volume.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.volume.extraVolumes "context" $) | nindent 8 }} {{- end }} @@ -327,10 +326,17 @@ spec: claimName: {{ .persistence.existingClaim }} {{- end }} {{- end }} + {{- if .Values.volume.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} volumeClaimTemplates: {{- range .Values.volume.dataVolumes }} {{- if and .persistence.enabled (not .persistence.existingClaim) }} - - metadata: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: name: {{ .name }} {{- if or .persistence.annotations $.Values.commonAnnotations }} {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .persistence.annotations $.Values.commonAnnotations "context" $) | fromYaml }} diff --git a/helm/seaweedfs/templates/webadv/deployment.yaml b/helm/seaweedfs/templates/webadv/deployment.yaml index aec31081bf24fe9a0f35439b8aea090aa515b972..f698cef1641b21391df33354ef35e4ff6b9b237d 100644 --- a/helm/seaweedfs/templates/webadv/deployment.yaml +++ b/helm/seaweedfs/templates/webadv/deployment.yaml @@ -29,9 +29,7 @@ spec: template: metadata: annotations: - {{- if .Values.security.enabled }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} - {{- end }} {{- if .Values.webdav.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.webdav.podAnnotations "context" $) | nindent 8 }} {{- end }} @@ -183,7 +181,6 @@ spec: mountPath: /certs/tls readOnly: true {{- end }} - {{- if .Values.security.enabled }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -205,7 +202,6 @@ spec: readOnly: true mountPath: /certs/client {{- end }} - {{- end }} {{- if .Values.webdav.extraVolumeMounts }} {{- include "common.tplvalues.render" (dict "value" .Values.webdav.extraVolumeMounts "context" $) | nindent 12 }} {{- end }} @@ -220,7 +216,6 @@ spec: secret: secretName: {{ template "seaweedfs.webdav.tls.secretName" . }} {{- end }} - {{- if .Values.security.enabled }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -244,7 +239,6 @@ spec: secret: secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} {{- end }} - {{- end }} {{- if .Values.webdav.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.webdav.extraVolumes "context" $) | nindent 8 }} {{- end }} diff --git a/helm/seaweedfs/values.yaml b/helm/seaweedfs/values.yaml index 1b03bda9907ecf3a2a5d97f5b6c1f8483d8f540b..cbe833459d19a54b31f90cbfe31fc1e7569f695e 100644 --- a/helm/seaweedfs/values.yaml +++ b/helm/seaweedfs/values.yaml @@ -10,7 +10,6 @@ ## @param global.imageRegistry Global Docker image registry ## @param global.imagePullSecrets Global Docker registry secret names as an array ## @param global.defaultStorageClass Global default StorageClass for Persistent Volume(s) -## @param global.storageClass DEPRECATED: use global.defaultStorageClass instead ## global: imageRegistry: "" @@ -20,7 +19,11 @@ global: ## imagePullSecrets: [] defaultStorageClass: "" - storageClass: "" + ## Security parameters + ## + security: + ## @param global.security.allowInsecureImages Allows skipping image verification + allowInsecureImages: false ## Compatibility adaptations for Kubernetes platforms ## compatibility: @@ -82,10 +85,9 @@ diagnosticMode: image: registry: docker.io repository: bitnami/seaweedfs - tag: 3.71.0-debian-12-r0 + tag: 3.80.0-debian-12-r1 digest: "" ## Specify a imagePullPolicy - ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images ## pullPolicy: IfNotPresent @@ -318,6 +320,9 @@ master: ## @param master.bindAddress Master Server bind address ## bindAddress: 0.0.0.0 + ## @param master.volumeSizeLimitMB Limit (in MB) to stop directing writes to oversized volumes + ## + volumeSizeLimitMB: 1000 ## @param master.config Master Server configuration ## Specify content for master.yml ## @@ -338,7 +343,7 @@ master: ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ ## hostAliases: [] - ## @param master.statefulsetAnnotations Annotations for Master Server statefulset + ## @param master.statefulsetAnnotations Annotations for Master Server StatefulSet ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ ## statefulsetAnnotations: {} @@ -388,14 +393,14 @@ master: ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ ## tolerations: [] - ## @param master.updateStrategy.type Master Server statefulset strategy type + ## @param master.updateStrategy.type Master Server StatefulSet strategy type ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies ## updateStrategy: ## Can be set to RollingUpdate or OnDelete ## type: RollingUpdate - ## @param master.podManagementPolicy Pod management policy for Master Server statefulset + ## @param master.podManagementPolicy Pod management policy for Master Server StatefulSet ## Ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies ## podManagementPolicy: Parallel @@ -756,6 +761,16 @@ master: ## @param master.persistence.dataSource Custom PVC data source ## dataSource: {} + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param master.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet + ## @param master.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param master.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain ## @section Master Server Metrics Parameters ## @@ -978,7 +993,7 @@ volume: ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ ## hostAliases: [] - ## @param volume.statefulsetAnnotations Annotations for Volume Server statefulset + ## @param volume.statefulsetAnnotations Annotations for Volume Server StatefulSet ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ ## statefulsetAnnotations: {} @@ -1028,14 +1043,14 @@ volume: ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ ## tolerations: [] - ## @param volume.updateStrategy.type Volume Server statefulset strategy type + ## @param volume.updateStrategy.type Volume Server StatefulSet strategy type ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies ## updateStrategy: ## Can be set to RollingUpdate or OnDelete ## type: RollingUpdate - ## @param volume.podManagementPolicy Pod management policy for Volume Server statefulset + ## @param volume.podManagementPolicy Pod management policy for Volume Server StatefulSet ## Ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies ## podManagementPolicy: Parallel @@ -1362,6 +1377,11 @@ volume: ## @param volume.dataVolumes[0].subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services ## subPath: "" + ## @param volume.dataVolumes[0].maxVolumes Max number of SeaweedFS volumes this data volume can be divided into. If set to 0, the limit will be auto configured as free disk space divided by default volume size (30GB) + ## ref: https://github.com/seaweedfs/seaweedfs/wiki/FAQ#how-many-volumes-do-i-need + ## ref: https://github.com/seaweedfs/seaweedfs/blob/master/weed/util/constants_4bytes.go#L8 + ## + maxVolumes: 8 ## Enable persistence using Persistent Volume Claims ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ ## @@ -1401,6 +1421,16 @@ volume: ## @param volume.dataVolumes[0].persistence.dataSource Custom PVC data source ## dataSource: {} + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param volume.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet + ## @param volume.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param volume.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain ## @section Volume Server Metrics Parameters ## @@ -1625,7 +1655,7 @@ filer: ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ ## hostAliases: [] - ## @param filer.statefulsetAnnotations Annotations for Filer Server statefulset + ## @param filer.statefulsetAnnotations Annotations for Filer Server StatefulSet ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ ## statefulsetAnnotations: {} @@ -1675,14 +1705,14 @@ filer: ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ ## tolerations: [] - ## @param filer.updateStrategy.type Filer Server statefulset strategy type + ## @param filer.updateStrategy.type Filer Server StatefulSet strategy type ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies ## updateStrategy: ## Can be set to RollingUpdate or OnDelete ## type: RollingUpdate - ## @param filer.podManagementPolicy Pod management policy for Filer Server statefulset + ## @param filer.podManagementPolicy Pod management policy for Filer Server StatefulSet ## Ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies ## podManagementPolicy: Parallel @@ -3215,7 +3245,7 @@ volumePermissions: image: registry: docker.io repository: bitnami/os-shell - tag: 12-debian-12-r25 + tag: 12-debian-12-r33 pullPolicy: IfNotPresent ## Optionally specify an array of imagePullSecrets. ## Secrets must be manually created in the namespace. @@ -3274,7 +3304,7 @@ serviceAccount: annotations: {} ## @param serviceAccount.automountServiceAccountToken Automount service account token for the server service account ## - automountServiceAccountToken: true + automountServiceAccountToken: false ## @section Database Parameters ## @@ -3287,6 +3317,31 @@ mariadb: ## To use an external database set this to false and configure the `externalDatabase.*` parameters ## enabled: true + ## Bitnami MariaDB image + ## ref: https://github.com/bitnami/containers/tree/main/bitnami/mariadb + ## @param mariadb.image.registry [default: REGISTRY_NAME] MariaDB image registry + ## @param mariadb.image.repository [default: REPOSITORY_NAME/mariadb] MariaDB image repository + ## @skip mariadb.image.tag MariaDB image tag (immutable tags are recommended) + ## @param mariadb.image.digest MariaDB image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param mariadb.image.pullPolicy MariaDB image pull policy + ## @param mariadb.image.pullSecrets Specify docker-registry secret names as an array + ## + image: + registry: docker.io + repository: bitnami/mariadb + tag: 11.4.4-debian-12-r1 + digest: "" + ## Specify a imagePullPolicy + ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets (secrets must be manually created in the namespace) + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Example: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] ## @param mariadb.architecture MariaDB architecture. Allowed values: `standalone` or `replication` ## architecture: standalone @@ -3311,7 +3366,7 @@ mariadb: initdbScripts: create_table.sql: | USE bitnami_seaweedfs; - CREATE TABLE IF NOT EXISTS `filemeta` ( + CREATE TABLE IF NOT EXISTS filemeta ( `dirhash` BIGINT NOT NULL COMMENT 'first 64 bits of MD5 hash value of directory field', `name` VARCHAR(766) NOT NULL COMMENT 'directory or file name', `directory` TEXT NOT NULL COMMENT 'full path to parent directory', @@ -3355,13 +3410,114 @@ mariadb: ## memory: 1024Mi ## resources: {} +## PostgresSQL chart configuration +## ref: https://github.com/bitnami/charts/blob/main/bitnami/postgresql/values.yaml +## +postgresql: + ## @param postgresql.enabled Deploy a PostgresSQL server to satisfy the Filer server database requirements + ## To use an external database set this to false and configure the `externalDatabase.*` parameters + ## + enabled: false + ## Bitnami PostgreSQL image version + ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql + ## @param postgresql.image.registry [default: REGISTRY_NAME] PostgreSQL image registry + ## @param postgresql.image.repository [default: REPOSITORY_NAME/postgresql] PostgreSQL image repository + ## @skip postgresql.image.tag PostgreSQL image tag (immutable tags are recommended) + ## @param postgresql.image.digest PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param postgresql.image.pullPolicy PostgreSQL image pull policy + ## @param postgresql.image.pullSecrets Specify image pull secrets + ## + image: + registry: docker.io + repository: bitnami/postgresql + tag: 17.2.0-debian-12-r2 + digest: "" + ## Specify a imagePullPolicy + ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Example: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## @param postgresql.architecture PostgreSQL architecture (`standalone` or `replication`) + ## + architecture: standalone + ## @param postgresql.auth.postgresPassword Password for the "postgres" admin user. Ignored if `auth.existingSecret` with key `postgres-password` is provided + ## @param postgresql.auth.database Name for a custom database to create + ## @param postgresql.auth.username Name for a custom user to create + ## @param postgresql.auth.password Password for the custom user to create + ## @param postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials + ## @param postgresql.auth.secretKeys.userPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. + auth: + postgresPassword: "" + database: bitnami_seaweedfs + username: bn_seaweedfs + password: some-password + existingSecret: "" + secretKeys: + userPasswordKey: password + ## PostgreSQL Primary configuration + ## + primary: + ## PostgreSQL Primary resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param postgresql.primary.resourcesPreset Set container resources according to one common preset (allowed values: none, nano, micro, small, medium, large, xlarge, 2xlarge). This is ignored if postgresql.primary.resources is set (postgresql.primary.resources is recommended for production). + ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15 + ## + resourcesPreset: "nano" + ## @param postgresql.primary.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## Example: + ## resources: + ## requests: + ## cpu: 2 + ## memory: 512Mi + ## limits: + ## cpu: 3 + ## memory: 1024Mi + ## + resources: {} + ## @param postgresql.primary.initdb.scripts [object] Dictionary of initdb scripts + ## + initdb: + scripts: + create_table.sql: | + \c bitnami_seaweedfs; + CREATE TABLE IF NOT EXISTS filemeta ( + dirhash BIGINT, + name VARCHAR(65535), + directory VARCHAR(65535), + meta bytea, + PRIMARY KEY (dirhash, name) + ); + ## PostgreSQL Primary Persistence parameters + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## @param postgresql.primary.persistence.enabled Enable PostgreSQL Primary data persistence using PVC(s) + ## @param postgresql.primary.persistence.storageClass Persistent Volume storage class + ## @param postgresql.primary.persistence.accessModes [array] Persistent Volume access modes + ## @param postgresql.primary.persistence.size Persistent Volume size + ## + persistence: + enabled: true + storageClass: "" + accessModes: + - ReadWriteOnce + size: 8Gi + ## External Database Configuration -## All of these values are only used if `mariadb.enabled=false` +## All of these values are only used if `mariadb.enabled=false` and `externalDatabase.enabled=true`. ## externalDatabase: - ## @param externalDatabase.enabled Enable secret with external mariadb database credentials + ## @param externalDatabase.enabled Enable external database support ## enabled: false + ## @param externalDatabase.store Database store (mariadb, postgresql) + ## + store: mariadb ## @param externalDatabase.host External Database server host ## host: localhost @@ -3378,7 +3534,84 @@ externalDatabase: ## database: bitnami_seaweedfs ## @param externalDatabase.existingSecret The name of an existing secret with database credentials. Evaluated as a template - ## NOTE: Must contain key `mariadb-password` + ## NOTE: Must contain key `mariadb-password` for mariadb or 'postgres-password' for postgres ## NOTE: When it's set, the `externalDatabase.password` parameter is ignored ## existingSecret: "" + ## Init external database job + ## + initDatabaseJob: + ## @param externalDatabase.initDatabaseJob.enabled Enable the init external database job + ## + enabled: false + ## @param externalDatabase.initDatabaseJob.labels Extra labels for the init external database job + ## + labels: {} + ## @param externalDatabase.initDatabaseJob.annotations [object] Extra annotations for the init external database job + ## + annotations: + helm.sh/hook: post-install + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + ## @param externalDatabase.initDatabaseJob.backoffLimit Set backoff limit of the init external database job + ## + backoffLimit: 10 + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.enabled Enabled init external database job containers' Security Context + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.runAsUser Set init external database job containers' Security Context runAsUser + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.runAsGroup Set init external database job containers' Security Context runAsGroup + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.runAsNonRoot Set init external database job containers' Security Context runAsNonRoot + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.privileged Set init external database job containers' Security Context privileged + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.readOnlyRootFilesystem Set init external database job containers' Security Context readOnlyRootFilesystem + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.allowPrivilegeEscalation Set init external database job containers' Security Context allowPrivilegeEscalation + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.capabilities.drop List of capabilities to be dropped + ## @param externalDatabase.initDatabaseJob.containerSecurityContext.seccompProfile.type Set init external database job containers' Security Context seccomp profile + ## + containerSecurityContext: + enabled: true + seLinuxOptions: {} + runAsUser: 1001 + runAsGroup: 1001 + runAsNonRoot: true + privileged: false + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## Configure Pods Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param externalDatabase.initDatabaseJob.podSecurityContext.enabled Enabled init external database job pods' Security Context + ## @param externalDatabase.initDatabaseJob.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy + ## @param externalDatabase.initDatabaseJob.podSecurityContext.sysctls Set kernel settings using the sysctl interface + ## @param externalDatabase.initDatabaseJob.podSecurityContext.supplementalGroups Set filesystem extra groups + ## @param externalDatabase.initDatabaseJob.podSecurityContext.fsGroup Set init external database job pod's Security Context fsGroup + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Container resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param externalDatabase.initDatabaseJob.resourcesPreset Set init external database job container resources according to one common preset (allowed values: none, nano, micro, small, medium, large, xlarge, 2xlarge). This is ignored if externalDatabase.initDatabaseJob.resources is set (externalDatabase.initDatabaseJob.resources is recommended for production). + ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15 + ## + resourcesPreset: "micro" + ## @param externalDatabase.initDatabaseJob.resources Set init external database job container requests and limits for different resources like CPU or memory (essential for production workloads) + ## Example: + ## resources: + ## requests: + ## cpu: 2 + ## memory: 512Mi + ## limits: + ## cpu: 3 + ## memory: 1024Mi + ## + resources: {} + ## @param externalDatabase.initDatabaseJob.automountServiceAccountToken Mount Service Account token in external database job pod + ## + automountServiceAccountToken: false diff --git a/lib/python/Pipfile b/lib/python/Pipfile index 9a500073bf20f6de26d5107639596f75aa5a5cb2..b54561e5f8ff11eb4706050946f23f4a4004fdb5 100644 --- a/lib/python/Pipfile +++ b/lib/python/Pipfile @@ -19,6 +19,7 @@ coverage = "*" pytest = "*" requests-mock = "*" furo = "*" +pytest-ordering = "*" [requires] python_version = "3.11" diff --git a/lib/python/Pipfile.lock b/lib/python/Pipfile.lock index 9e3fffe667c09d15c41fb0f67f93430642958bf4..836140fd7bff162440f0e8fdd3ab3ef5d2c4a316 100644 --- a/lib/python/Pipfile.lock +++ b/lib/python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0d68aff443d441814f16f7d184c560ebfa95c4ca18ecc6fcb52856078ce9bf9c" + "sha256": "4fc272b993d5091dc8d60aee49575f17cd1de3145d916dc6aa82c09f7cefe4ee" }, "pipfile-spec": 6, "requires": { @@ -26,93 +26,93 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f", + "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33", + "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1", + "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665", + "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9", + "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e", + "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350", + "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226", + "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d", + "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a", + "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6", + "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add", + "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e", + "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8", + "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03", + "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e", + "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2", + "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1", + "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c", + "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538", + "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5", + "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e", + "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9", + "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3", + "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438", + "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12", + "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3", + "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853", + "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287", + "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2", + "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9", + "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c", + "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55", + "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c", + "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e", + "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1", + "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c", + "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194", + "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773", + "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e", + "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1", + "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d", + "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600", + "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34", + "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3", + "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8", + "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8", + "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2", + "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff", + "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62", + "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac", + "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef", + "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28", + "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab", + "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104", + "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76", + "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e", + "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d", + "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a", + "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5", + "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745", + "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4", + "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99", + "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43", + "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da", + "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231", + "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd", + "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d", + "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87", + "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886", + "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2", + "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b", + "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d", + "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f", + "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204", + "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.11" }, "aiosignal": { "hashes": [ - "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", - "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" + "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", + "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" ], - "markers": "python_version >= '3.7'", - "version": "==1.3.1" + "markers": "python_version >= '3.9'", + "version": "==1.3.2" }, "annotated-types": { "hashes": [ @@ -124,130 +124,117 @@ }, "attrs": { "hashes": [ - "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", - "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" + "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", + "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308" ], - "markers": "python_version >= '3.7'", - "version": "==24.2.0" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "frozenlist": { "hashes": [ @@ -455,64 +442,64 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" - ], - "markers": "python_version >= '3.10'", - "version": "==2.1.3" + "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2", + "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", + "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", + "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", + "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", + "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8", + "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", + "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16", + "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", + "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591", + "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964", + "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", + "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484", + "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957", + "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800", + "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", + "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95", + "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0", + "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", + "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", + "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73", + "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", + "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", + "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", + "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", + "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e", + "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440", + "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675", + "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", + "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", + "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", + "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", + "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308", + "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", + "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3", + "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", + "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5", + "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", + "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", + "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", + "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf", + "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab", + "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd", + "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf", + "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", + "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb", + "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", + "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", + "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", + "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", + "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", + "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528", + "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", + "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7", + "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51" + ], + "markers": "python_version == '3.11'", + "version": "==2.2.1" }, "paho-mqtt": { "hashes": [ @@ -520,7 +507,6 @@ "sha256:6db9ba9b34ed5bc6b6e3812718c7e06e2fd7444540df2455d2c51bd58808feee" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==2.1.0" }, "pandas": { @@ -569,7 +555,6 @@ "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==2.2.3" }, "pika": { @@ -578,7 +563,6 @@ "sha256:b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.3.2" }, "propcache": { @@ -671,125 +655,124 @@ }, "pydantic": { "hashes": [ - "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa", - "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e" + "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", + "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.10.2" + "version": "==2.10.4" }, "pydantic-core": { "hashes": [ - "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9", - "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b", - "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c", - "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", - "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", - "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854", - "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d", - "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278", - "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a", - "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", - "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f", - "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27", - "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f", - "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", - "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", - "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97", - "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", - "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", - "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", - "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4", - "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", - "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131", - "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", - "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd", - "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", - "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", - "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6", - "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60", - "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", - "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", - "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08", - "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05", - "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2", - "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", - "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c", - "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17", - "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62", - "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", - "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be", - "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067", - "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", - "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f", - "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", - "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840", - "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5", - "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807", - "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", - "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", - "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864", - "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e", - "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a", - "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", - "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", - "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a", - "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3", - "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", - "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", - "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31", - "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", - "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", - "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6", - "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36", - "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c", - "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154", - "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", - "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", - "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd", - "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3", - "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", - "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78", - "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", - "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618", - "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", - "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4", - "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", - "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c", - "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", - "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", - "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792", - "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", - "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9", - "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f", - "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01", - "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", - "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", - "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f", - "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd", - "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", - "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab", - "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", - "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676", - "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", - "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed", - "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", - "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967", - "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", - "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", - "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c", - "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206", - "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b" + "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", + "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", + "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", + "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", + "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", + "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", + "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", + "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", + "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", + "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", + "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", + "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", + "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", + "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", + "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", + "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", + "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", + "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", + "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", + "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", + "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", + "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", + "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", + "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", + "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", + "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", + "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", + "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", + "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", + "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", + "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", + "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", + "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", + "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", + "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", + "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", + "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", + "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", + "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320", + "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", + "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", + "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", + "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046", + "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", + "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", + "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", + "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", + "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", + "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", + "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", + "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", + "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", + "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", + "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", + "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", + "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", + "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", + "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145", + "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", + "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", + "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", + "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", + "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", + "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", + "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5", + "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", + "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", + "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", + "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", + "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da", + "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", + "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", + "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", + "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", + "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", + "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", + "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", + "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d", + "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", + "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", + "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", + "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", + "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a", + "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9", + "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506", + "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", + "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1", + "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", + "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", + "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", + "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", + "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", + "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", + "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", + "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", + "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", + "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228", + "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b", + "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", + "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad" ], "markers": "python_version >= '3.8'", - "version": "==2.27.1" + "version": "==2.27.2" }, "python-dateutil": { "hashes": [ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytz": { @@ -805,16 +788,15 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.17.0" }, "tinydb": { "hashes": [ @@ -830,7 +812,6 @@ "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" ], "index": "pypi", - "markers": "python_full_version >= '3.5.3'", "version": "==1.1.0" }, "typing-extensions": { @@ -851,11 +832,11 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" + "markers": "python_version >= '3.9'", + "version": "==2.3.0" }, "yarl": { "hashes": [ @@ -968,7 +949,7 @@ "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.12'", "version": "==1.2.0" }, "beautifulsoup4": { @@ -985,16 +966,15 @@ "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.2.2.post1" }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "cffi": { "hashes": [ @@ -1066,188 +1046,174 @@ "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], - "markers": "python_version >= '3.8'", + "markers": "platform_python_implementation != 'PyPy'", "version": "==1.17.1" }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", + "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", + "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", + "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", + "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", + "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", + "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", + "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", + "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", + "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", + "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", + "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", + "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", + "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", + "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", + "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", + "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", + "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", + "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", + "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", + "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", + "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", + "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", + "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", + "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", + "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", + "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", + "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", + "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", + "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", + "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", + "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", + "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", + "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", + "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", + "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", + "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", + "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", + "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", + "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", + "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", + "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", + "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", + "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", + "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", + "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", + "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", + "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", + "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", + "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", + "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", + "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", + "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", + "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", + "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", + "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", + "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", + "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", + "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", + "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", + "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", + "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.10" }, "cryptography": { "hashes": [ @@ -1298,7 +1264,6 @@ "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2024.8.6" }, "idna": { @@ -1322,7 +1287,7 @@ "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.12'", "version": "==8.5.0" }, "iniconfig": { @@ -1362,24 +1327,24 @@ "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" ], - "markers": "python_version >= '3.7'", + "markers": "sys_platform == 'linux'", "version": "==0.8.0" }, "jinja2": { "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb" ], "markers": "python_version >= '3.7'", - "version": "==3.1.4" + "version": "==3.1.5" }, "keyring": { "hashes": [ - "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6", - "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741" + "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", + "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" ], - "markers": "python_version >= '3.8'", - "version": "==25.5.0" + "markers": "platform_machine != 'ppc64le' and platform_machine != 's390x'", + "version": "==25.6.0" }, "markdown-it-py": { "hashes": [ @@ -1474,32 +1439,33 @@ }, "nh3": { "hashes": [ - "sha256:00810cd5275f5c3f44b9eb0e521d1a841ee2f8023622de39ffc7d88bd533d8e0", - "sha256:0b6820fc64f2ff7ef3e7253a093c946a87865c877b3889149a6d21d322ed8dbd", - "sha256:11270b16c1b012677e3e2dd166c1aa273388776bf99a3e3677179db5097ee16a", - "sha256:2b926f179eb4bce72b651bfdf76f8aa05d167b2b72bc2f3657fd319f40232adc", - "sha256:2eb021804e9df1761abeb844bb86648d77aa118a663c82f50ea04110d87ed707", - "sha256:3805161c4e12088bd74752ba69630e915bc30fe666034f47217a2f16b16efc37", - "sha256:5d4f5e2189861b352b73acb803b5f4bb409c2f36275d22717e27d4e0c217ae55", - "sha256:75c7cafb840f24430b009f7368945cb5ca88b2b54bb384ebfba495f16bc9c121", - "sha256:790056b54c068ff8dceb443eaefb696b84beff58cca6c07afd754d17692a4804", - "sha256:7e98621856b0a911c21faa5eef8f8ea3e691526c2433f9afc2be713cb6fbdb48", - "sha256:833b3b5f1783ce95834a13030300cea00cbdfd64ea29260d01af9c4821da0aa9", - "sha256:a7b928862daddb29805a1010a0282f77f4b8b238a37b5f76bc6c0d16d930fd22", - "sha256:ac536a4b5c073fdadd8f5f4889adabe1cbdae55305366fb870723c96ca7f49c3", - "sha256:b8eb7affc590e542fa7981ef508cd1644f62176bcd10d4429890fc629b47f0bc", - "sha256:c2e3f0d18cc101132fe10ab7ef5c4f41411297e639e23b64b5e888ccaad63f41", - "sha256:d0adf00e2b2026fa10a42537b60d161e516f206781c7515e4e97e09f72a8c5d0", - "sha256:d53a4577b6123ca1d7e8483fad3e13cb7eda28913d516bd0a648c1a473aa21a9", - "sha256:d8325d51e47cb5b11f649d55e626d56c76041ba508cd59e0cb1cf687cc7612f1", - "sha256:df8eac98fec80bd6f5fd0ae27a65de14f1e1a65a76d8e2237eb695f9cd1121d9", - "sha256:e3dedd7858a21312f7675841529941035a2ac91057db13402c8fe907aa19205a", - "sha256:ec9c8bf86e397cb88c560361f60fdce478b5edb8b93f04ead419b72fbe937ea6", - "sha256:ed06ed78f6b69d57463b46a04f68f270605301e69d80756a8adf7519002de57d", - "sha256:fc483dd8d20f8f8c010783a25a84db3bebeadced92d24d34b40d687f8043ac69", - "sha256:fdb20740d24ab9f2a1341458a00a11205294e97e905de060eeab1ceca020c09c" - ], - "version": "==0.2.19" + "sha256:09f037c02fc2c43b211ff1523de32801dcfb0918648d8e651c36ef890f1731ec", + "sha256:0ae9cbd713524cdb81e64663d0d6aae26f678db9f2cd9db0bf162606f1f9f20c", + "sha256:10317cd96fe4bbd4eb6b95f3920b71c902157ad44fed103fdcde43e3b8ee8be6", + "sha256:181063c581defe683bd4bb78188ac9936d208aebbc74c7f7c16b6a32ae2ebb38", + "sha256:1b9a8340a0aab991c68a5ca938d35ef4a8a3f4bf1b455da8855a40bee1fa0ace", + "sha256:231addb7643c952cd6d71f1c8702d703f8fe34afcb20becb3efb319a501a12d7", + "sha256:3eb04b9c3deb13c3a375ea39fd4a3c00d1f92e8fb2349f25f1e3e4506751774b", + "sha256:47b2946c0e13057855209daeffb45dc910bd0c55daf10190bb0b4b60e2999784", + "sha256:4fd2e9248725ebcedac3997a8d3da0d90a12a28c9179c6ba51f1658938ac30d0", + "sha256:6ed834c68452a600f517dd3e1534dbfaff1f67f98899fecf139a055a25d99150", + "sha256:76e2f603b30c02ff6456b233a83fc377dedab6a50947b04e960a6b905637b776", + "sha256:813f1c8012dd64c990514b795508abb90789334f76a561fa0fd4ca32d2275330", + "sha256:8698db4c04b140800d1a1cd3067fda399e36e1e2b8fc1fe04292a907350a3e9b", + "sha256:92f3f1c4f47a2c6f3ca7317b1d5ced05bd29556a75d3a4e2715652ae9d15c05d", + "sha256:9705c42d7ff88a0bea546c82d7fe5e59135e3d3f057e485394f491248a1f8ed5", + "sha256:ac4d27dc836a476efffc6eb661994426b8b805c951b29c9cf2ff36bc9ad58bc5", + "sha256:ce3731c8f217685d33d9268362e5b4f770914e922bba94d368ab244a59a6c397", + "sha256:d2a176fd4306b6f0f178a3f67fac91bd97a3a8d8fafb771c9b9ef675ba5c8886", + "sha256:da87573f03084edae8eb87cfe811ec338606288f81d333c07d2a9a0b9b976c0b", + "sha256:ddefa9fd6794a87e37d05827d299d4b53a3ec6f23258101907b96029bfef138a", + "sha256:e1061a4ab6681f6bdf72b110eea0c4e1379d57c9de937db3be4202f7ad6043db", + "sha256:e1f7370b4e14cc03f5ae141ef30a1caf81fa5787711f80be9081418dd9eb79d2", + "sha256:eb4254b1dac4a1ee49919a5b3f1caf9803ea8dada1816d9e8289e63d3cd0dd9a", + "sha256:f7d564871833ddbe54df3aa59053b1110729d3a800cb7628ae8f42adb3d75208" + ], + "markers": "python_version >= '3.8'", + "version": "==0.2.20" }, "packaging": { "hashes": [ @@ -1555,9 +1521,17 @@ "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==8.3.4" }, + "pytest-ordering": { + "hashes": [ + "sha256:27fba3fc265f5d0f8597e7557885662c1bdc1969497cd58aff6ed21c3b617de2", + "sha256:3f314a178dbeb6777509548727dc69edf22d6d9a2867bf2d310ab85c403380b6", + "sha256:561ad653626bb171da78e682f6d39ac33bb13b3e272d406cd555adb6b006bda6" + ], + "index": "pypi", + "version": "==0.6" + }, "readme-renderer": { "hashes": [ "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", @@ -1572,7 +1546,6 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "requests-mock": { @@ -1581,7 +1554,6 @@ "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==1.12.1" }, "requests-toolbelt": { @@ -1613,7 +1585,7 @@ "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" ], - "markers": "python_version >= '3.6'", + "markers": "sys_platform == 'linux'", "version": "==3.3.3" }, "setuptools": { @@ -1622,7 +1594,6 @@ "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==75.6.0" }, "snowballstemmer": { @@ -1710,16 +1681,15 @@ "sha256:9c6025b203b51521d53e200f4a08b116dee7500a38591668c6a6033117bdc218" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.0.1" }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" + "markers": "python_version >= '3.9'", + "version": "==2.3.0" }, "zipp": { "hashes": [ diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py index 31c83fa55ef35ae76ca7d45e6ab0a0de0d094aac..f10cfdc0fb66b1a25fd92f92b2737d4a9dae73a8 100644 --- a/lib/python/dbrepo/RestClient.py +++ b/lib/python/dbrepo/RestClient.py @@ -522,7 +522,7 @@ class RestClient: :raises ServiceError: If something went wrong with obtaining the information in the search service. :raises ResponseCodeError: If something went wrong with the update. """ - url = f'/api/database/{database_id}' + url = f'/api/database/{database_id}/visibility' response = self._wrapper(method="put", url=url, force_auth=True, payload=ModifyVisibility(is_public=is_public, is_schema_public=is_schema_public)) if response.status_code == 202: diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py index fabb834647e5c450c31134c97ce6baea8565881f..5100a7ae4e7c84ba16e51750a88b15ae5406d381 100644 --- a/lib/python/dbrepo/api/dto.py +++ b/lib/python/dbrepo/api/dto.py @@ -970,7 +970,8 @@ class Database(BaseModel): exchange_name: str internal_name: str is_public: bool - container: Container + is_schema_public: bool + container: ContainerBrief identifiers: Optional[List[Identifier]] = field(default_factory=list) subsets: Optional[List[Identifier]] = field(default_factory=list) description: Optional[str] = None diff --git a/lib/python/docs/index.rst b/lib/python/docs/index.rst index dba4e9ce2a0f6fd18a5c3f6b1f11361545e1e180..9c2ec5c590f65d75bcc2a2570146b8bb3e68cbcd 100644 --- a/lib/python/docs/index.rst +++ b/lib/python/docs/index.rst @@ -6,13 +6,13 @@ Pandas `DataFrame <https://pandas.pydata.org/docs/reference/api/pandas.DataFrame provides an object-oriented API as well as low-level access to DBRepo services. .. note:: - The SDK has been implemented and documented for DBRepo version 1.4.2, earlier versions are not supported. + The SDK has been implemented and documented for DBRepo version 1.6.0, earlier versions may be supported but are not tested for compatibility. Quickstart ---------- Find numerous quickstart examples on -the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/>`_. +the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/>`_. AMQP API Client ----------- diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index d6c33c6d01e4a937d0f1fe36af12300ad7d441bc..382134d4df17fb712fb1c76b03bd47abf43625a8 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -34,7 +34,7 @@ requires = [ build-backend = "setuptools.build_meta" [project.urls] -Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/" -Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/python/" +Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/" +Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/python/" Issues = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues" Source = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/" \ No newline at end of file diff --git a/lib/python/setup.py b/lib/python/setup.py index fadd15e30eab6719c88027e3d107f137d5c32bd9..705a48f08a84210af724a50c48acf174f041411b 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -4,7 +4,7 @@ from distutils.core import setup setup(name="dbrepo", version="1.6.0", description="A library for communicating with DBRepo", - url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/", + url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/", author="Martin Weise", license="Apache-2.0", author_email="martin.weise@tuwien.ac.at", diff --git a/lib/python/tests/conftest.py b/lib/python/tests/conftest.py new file mode 100644 index 0000000000000000000000000000000000000000..5270a5bfba0c614fc3e16b559879dd6209f440dc --- /dev/null +++ b/lib/python/tests/conftest.py @@ -0,0 +1,37 @@ +import logging +import uuid + +import pytest + +from dbrepo.RestClient import RestClient +from dbrepo.api.dto import Database + +logging.basicConfig(level=logging.DEBUG) + + +def pytest_configure(config): + TestKeyValue.username = str(uuid.uuid4()).replace("-", "")[0:10] + TestKeyValue.password = str(uuid.uuid4()).replace("-", "")[0:10] + + +@pytest.fixture(scope='session', name='rest_client') +def user_rest_client() -> RestClient: + TestKeyValue.user_id = RestClient().create_user(username=f'{TestKeyValue.username}', + password=f'{TestKeyValue.password}', + email=f'{TestKeyValue.username}@example.com').id + return RestClient(username=TestKeyValue.username, password=TestKeyValue.password) + + +@pytest.fixture(scope='session', name='database') +def database() -> Database: + name = str(uuid.uuid4()).replace("-", "")[0:10] + return RestClient(username=TestKeyValue.username, + password=TestKeyValue.password).create_database(name=name, container_id=1, is_public=True, + is_schema_public=True) + + +class TestKeyValue: + user_id: str = None + username: str = None + password: str = None + database_name: str = None diff --git a/lib/python/tests/test_system_database.py b/lib/python/tests/test_system_database.py new file mode 100644 index 0000000000000000000000000000000000000000..902b95435b09c755fa33cd592fbd7a9c9ddc81ee --- /dev/null +++ b/lib/python/tests/test_system_database.py @@ -0,0 +1,34 @@ +import unittest +import uuid + +import pytest + + +class UserUnitTest(unittest.TestCase): + + @pytest.fixture(autouse=True) + def prepare_fixture(self, rest_client, database): + self.rest_client = rest_client + self.database = database + + @pytest.mark.usefixtures("rest_client") + def test_create_database_succeeds(self): + name = str(uuid.uuid4()).replace("-", "")[0:10] + # test + response = self.rest_client.create_database(name=name, container_id=1, + is_public=True, is_schema_public=True) + self.assertEqual(True, response.is_public) + self.assertEqual(True, response.is_schema_public) + self.assertEqual(None, response.description) + + @pytest.mark.usefixtures("rest_client", "database") + def test_update_database_visibility_succeeds(self): + # test + response = self.rest_client.update_database_visibility(database_id=self.database.id, is_public=False, + is_schema_public=False) + self.assertEqual(False, response.is_public) + self.assertEqual(False, response.is_schema_public) + + +if __name__ == "__main__": + unittest.main() diff --git a/lib/python/tests/test_system_user.py b/lib/python/tests/test_system_user.py new file mode 100644 index 0000000000000000000000000000000000000000..350b34110274b4697f58cf6ce96168fb6682315c --- /dev/null +++ b/lib/python/tests/test_system_user.py @@ -0,0 +1,42 @@ +import unittest +import uuid + +import pytest + +from conftest import TestKeyValue +from dbrepo.RestClient import RestClient + + +class UserUnitTest(unittest.TestCase): + + @pytest.fixture(autouse=True) + def prepare_fixture(self, rest_client): + self.rest_client = rest_client + + def test_get_users_succeeds(self): + # test + response = RestClient().get_users() + + def test_create_user_succeeds(self): + username = str(uuid.uuid4()).replace("-", "")[0:10] + password = str(uuid.uuid4()).replace("-", "")[0:10] + # test + response = RestClient().create_user(username=f'{username}', password=f'{password}', + email=f'{username}@example.com') + self.assertEqual(username, response.username) + + @pytest.mark.usefixtures("rest_client") + def test_update_user_succeeds(self): + # test + response = self.rest_client.update_user(user_id=TestKeyValue.user_id, theme='dark', language='de', + firstname='Foo', lastname='Bar', affiliation='TU Wien', + orcid='https://orcid.org/0000-0003-4216-302X') + self.assertEqual('dark', response.attributes.theme) + self.assertEqual('Foo', response.given_name) + self.assertEqual('Bar', response.family_name) + self.assertEqual('TU Wien', response.attributes.affiliation) + self.assertEqual('https://orcid.org/0000-0003-4216-302X', response.attributes.orcid) + + +if __name__ == "__main__": + unittest.main() diff --git a/lib/python/tests/test_unit_database.py b/lib/python/tests/test_unit_database.py index c1f3014436320547849fa227c674926266a7d7fd..affa94b496b1a8bf104fb12264256ad91e6fc8fb 100644 --- a/lib/python/tests/test_unit_database.py +++ b/lib/python/tests/test_unit_database.py @@ -1,11 +1,11 @@ import unittest import requests_mock - from pydantic_core import ValidationError from dbrepo.RestClient import RestClient -from dbrepo.api.dto import Database, Container, Image, DatabaseAccess, AccessType, DatabaseBrief, UserBrief, DataType +from dbrepo.api.dto import Database, Container, Image, DatabaseAccess, AccessType, DatabaseBrief, UserBrief, \ + ContainerBrief, ImageBrief from dbrepo.api.exceptions import ResponseCodeError, NotExistsError, ForbiddenError, MalformedError, AuthenticationError @@ -45,27 +45,16 @@ class DatabaseUnitTest(unittest.TestCase): exchange_name='dbrepo', internal_name='test_abcd', is_public=True, - container=Container( + is_schema_public=True, + container=ContainerBrief( id=1, name='MariaDB Galera 11.1.3', internal_name='mariadb', - host='data-db', - port=3306, - sidecar_host='data-db-sidecar', - sidecar_port=3305, - image=Image( + image=ImageBrief( id=1, - registry='docker.io', name='mariadb', version='11.2.2', - dialect='org.hibernate.dialect.MariaDBDialect', - driver_class='org.mariadb.jdbc.Driver', - jdbc_method='mariadb', - default_port=3306, - data_types=[ - DataType(display_name="SERIAL", value="serial", - documentation="https://mariadb.com/kb/en/bigint/", - is_quoted=False, is_buildable=True)] + jdbc_method='mariadb' ) ) ) @@ -111,23 +100,16 @@ class DatabaseUnitTest(unittest.TestCase): exchange_name='dbrepo', internal_name='test_abcd', is_public=True, - container=Container( + is_schema_public=True, + container=ContainerBrief( id=1, name='MariaDB Galera 11.1.3', internal_name='mariadb', - host='data-db', - port=3306, - sidecar_host='data-db-sidecar', - sidecar_port=3305, - image=Image( + image=ImageBrief( id=1, - registry='docker.io', name='mariadb', version='11.2.2', - dialect='org.hibernate.dialect.MariaDBDialect', - driver_class='org.mariadb.jdbc.Driver', - jdbc_method='mariadb', - default_port=3306 + jdbc_method='mariadb' ) ) ) @@ -180,29 +162,22 @@ class DatabaseUnitTest(unittest.TestCase): exchange_name='dbrepo', internal_name='test_abcd', is_public=True, - container=Container( + is_schema_public=True, + container=ContainerBrief( id=1, name='MariaDB Galera 11.1.3', internal_name='mariadb', - host='data-db', - port=3306, - sidecar_host='data-db-sidecar', - sidecar_port=3305, - image=Image( + image=ImageBrief( id=1, - registry='docker.io', name='mariadb', version='11.2.2', - dialect='org.hibernate.dialect.MariaDBDialect', - driver_class='org.mariadb.jdbc.Driver', - jdbc_method='mariadb', - default_port=3306 + jdbc_method='mariadb' ) ) ) with requests_mock.Mocker() as mock: # mock - mock.put('/api/database/1', json=exp.model_dump(), status_code=202) + mock.put('/api/database/1/visibility', json=exp.model_dump(), status_code=202) # test client = RestClient(username="a", password="b") response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True) @@ -211,7 +186,7 @@ class DatabaseUnitTest(unittest.TestCase): def test_update_database_visibility_not_allowed_fails(self): with requests_mock.Mocker() as mock: # mock - mock.put('/api/database/1', status_code=403) + mock.put('/api/database/1/visibility', status_code=403) # test try: client = RestClient(username="a", password="b") @@ -222,7 +197,7 @@ class DatabaseUnitTest(unittest.TestCase): def test_update_database_visibility_not_found_fails(self): with requests_mock.Mocker() as mock: # mock - mock.put('/api/database/1', status_code=404) + mock.put('/api/database/1/visibility', status_code=404) # test try: client = RestClient(username="a", password="b") @@ -244,28 +219,21 @@ class DatabaseUnitTest(unittest.TestCase): exp = Database( id=1, name='test', - owner=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other'), + owner=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='mweise'), contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), exchange_name='dbrepo', internal_name='test_abcd', is_public=True, - container=Container( + is_schema_public=True, + container=ContainerBrief( id=1, name='MariaDB Galera 11.1.3', internal_name='mariadb', - host='data-db', - port=3306, - sidecar_host='data-db-sidecar', - sidecar_port=3305, - image=Image( + image=ImageBrief( id=1, - registry='docker.io', name='mariadb', version='11.2.2', - dialect='org.hibernate.dialect.MariaDBDialect', - driver_class='org.mariadb.jdbc.Driver', - jdbc_method='mariadb', - default_port=3306 + jdbc_method='mariadb' ) ) ) diff --git a/make/build.mk b/make/build.mk index 64a85fc21f0c00236b93989471d4335b0d310cd1..7311ed27167f72e4ffa4b8b7659127b90679d471 100644 --- a/make/build.mk +++ b/make/build.mk @@ -20,6 +20,9 @@ build-ui: ## Build the UI. .PHONY: build-lib build-lib: ## Build the Python Library. + rm -f ./dbrepo-analyse-service/lib/dbrepo-${APP_VERSION}.tar.gz + rm -f ./dbrepo-search-service/lib/dbrepo-${APP_VERSION}.tar.gz + rm -f ./dbrepo-search-service/init/lib/dbrepo-${APP_VERSION}.tar.gz python3 -m build --sdist ./lib/python python3 -m build --wheel ./lib/python cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-analyse-service/lib/dbrepo-${APP_VERSION}.tar.gz diff --git a/make/dev.mk b/make/dev.mk index 1d9b179df8adc4fe69e811e336f651da69a28480..0282dbbce287356e207822fdc9dbf1be7e26e0b8 100644 --- a/make/dev.mk +++ b/make/dev.mk @@ -32,3 +32,9 @@ package-config: ## Package the config files cp ./dbrepo-storage-service/s3_config.json ./.docker/config cp ./dbrepo-upload-service/pre-create.sh ./.docker/config cd ./.docker && tar czf ./dist.tar.gz ./docker-compose.yml ./.env ./config + +.PHONY: install-staging +install-staging: build-helm ## Install on staging server + helm -n dbrepo uninstall dbrepo --ignore-not-found --wait + kubectl -n dbrepo delete pvc --all + helm -n dbrepo install dbrepo ./build/dbrepo-${CHART_VERSION}.tgz --create-namespace -f ./.gitlab/agents/dev/values.yaml