Skip to content
Snippets Groups Projects
Verified Commit b085520d authored by Martin Weise's avatar Martin Weise
Browse files
parent 4259ebcd
Branches
No related tags found
1 merge request!406Draft: WIP
Showing
with 888 additions and 457 deletions
...@@ -16,9 +16,9 @@ author: Martin Weise ...@@ -16,9 +16,9 @@ author: Martin Weise
Documentation for version: [v1.9.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). Documentation for version: [v1.9.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases).
DBRepo is a repository for data in databases that cover the entire data life cycle supporting data evolution, -citation DBRepo is an open-source research database repository that cover the data life cycle supporting data evolution,
and -versioning. It implements the query store of the [RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on precisely -citation and -versioning. It implements the query store of the [RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on
identifying arbitrary subsets of data. precisely identifying arbitrary subsets of data.
## Why use DBRepo? ## Why use DBRepo?
......
...@@ -11,3 +11,4 @@ POSTGRES_VERSION=17.0.0 ...@@ -11,3 +11,4 @@ POSTGRES_VERSION=17.0.0
PROMETHEUS_VERSION=2.54.1 PROMETHEUS_VERSION=2.54.1
RABBITMQ_VERSION=3.13.1 RABBITMQ_VERSION=3.13.1
SEAWEEDFS_VERSION=3.87.0 SEAWEEDFS_VERSION=3.87.0
LOG_LEVEL=trace
This diff is collapsed.
No preview for this file type
No preview for this file type
No preview for this file type
This diff is collapsed.
...@@ -247,8 +247,18 @@ def update_dashboard(uid: str): ...@@ -247,8 +247,18 @@ def update_dashboard(uid: str):
code='error.database.malformed').model_dump_json(), 400, headers) code='error.database.malformed').model_dump_json(), 400, headers)
try: try:
dashboard_client().update(database) dashboard_client().update(database)
except DashboardNotFound as e: except DashboardNotFound:
return Response(ApiError(status='NOT_FOUND', message=f"Failed to update dashboard: not found", return Response(ApiError(status='NOT_FOUND', message=f"Failed to update dashboard: not found",
code="error.dashboard.missing").model_dump_json(), 404, headers) code="error.dashboard.missing").model_dump_json(), 404, headers)
dashboard_client().update_anonymous_read_access(uid, database.is_public, database.is_schema_public) dashboard_client().update_anonymous_read_access(uid, database.is_public, database.is_schema_public)
return Response(), 202, headers return Response(), 202, headers
@app.route("/api/dashboard/<string:uid>/access/<string:username>", methods=["PUT"], endpoint="update_dashboard_access")
@metrics.gauge(name='dbrepo_update_dashboard_access', description='Time needed to update dashboard access')
@swag_from("/app/ds-yml/update_dashboard_access.yml")
@auth.login_required(role=['system'])
def update_dashboard(uid: str, username: str):
logging.debug(f'endpoint update dashboard access, uid={uid}, username={username}')
# not implemented
return Response(), 202, headers
tags:
- dashboard-endpoint
summary: "Update dashboard access"
operationId: update_dashboard_access
description: "Updates a dashboard access in the Dashboard UI. Requires role `system`."
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- name: uid
in: path
required: true
schema:
type: string
format: uuid
- name: username
in: path
required: true
schema:
type: string
responses:
202:
description: Updated dashboard access successfully
content:
application/json:
schema:
type: object
security:
- bearerAuth: [ ]
- basicAuth: [ ]
No preview for this file type
No preview for this file type
FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21
LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
RUN apk add --no-cache \
curl \
bash \
jq
COPY Pipfile Pipfile.lock ./
COPY ./lib ./lib
RUN pip install pipenv && \
pipenv install gunicorn && \
pipenv install --system --deploy
RUN adduser -D dbrepo --uid 1001
WORKDIR /app
RUN mkdir -p /var/log/app/service/data && \
chown -R 1001:1001 /var/log/app
USER 1001
COPY --chown=1001 ./init.py ./init.py
ENTRYPOINT [ "python", "./init.py" ]
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
python-dotenv = "~=1.0"
#dbrepo = {path = "./lib/dbrepo-1.9.0.tar.gz"}
[dev-packages]
coverage = "*"
pytest = "*"
requests-mock = "*"
mariadb = "*"
[requires]
python_version = "3.11"
{
"_meta": {
"hash": {
"sha256": "26240970f10615644f20a600978f7db5bacd83a7297197e83d66b515444ecd21"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.11"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"python-dotenv": {
"hashes": [
"sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5",
"sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"
],
"index": "pypi",
"version": "==1.1.0"
}
},
"develop": {
"certifi": {
"hashes": [
"sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6",
"sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"
],
"markers": "python_version >= '3.6'",
"version": "==2025.4.26"
},
"charset-normalizer": {
"hashes": [
"sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4",
"sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45",
"sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7",
"sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0",
"sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7",
"sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d",
"sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d",
"sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0",
"sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184",
"sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db",
"sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b",
"sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64",
"sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b",
"sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8",
"sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff",
"sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344",
"sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58",
"sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e",
"sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471",
"sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148",
"sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a",
"sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836",
"sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e",
"sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63",
"sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c",
"sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1",
"sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01",
"sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366",
"sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58",
"sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5",
"sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c",
"sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2",
"sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a",
"sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597",
"sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b",
"sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5",
"sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb",
"sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f",
"sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0",
"sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941",
"sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0",
"sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86",
"sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7",
"sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7",
"sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455",
"sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6",
"sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4",
"sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0",
"sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3",
"sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1",
"sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6",
"sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981",
"sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c",
"sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980",
"sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645",
"sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7",
"sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12",
"sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa",
"sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd",
"sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef",
"sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f",
"sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2",
"sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d",
"sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5",
"sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02",
"sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3",
"sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd",
"sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e",
"sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214",
"sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd",
"sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a",
"sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c",
"sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681",
"sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba",
"sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f",
"sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a",
"sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28",
"sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691",
"sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82",
"sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a",
"sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027",
"sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7",
"sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518",
"sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf",
"sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b",
"sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9",
"sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544",
"sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da",
"sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509",
"sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f",
"sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a",
"sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"
],
"markers": "python_version >= '3.7'",
"version": "==3.4.2"
},
"coverage": {
"hashes": [
"sha256:0034ceec8e91fdaf77350901cc48f47efd00f23c220a3f9fc1187774ddf307cb",
"sha256:061a3bf679dc38fe34d3822f10a9977d548de86b440010beb1e3b44ba93d20f7",
"sha256:07fff2f2ce465fae27447432d39ce733476fbf8478de51fb4034c201e0c5da6d",
"sha256:11e5ea0acd8cc5d23030c34dfb2eb6638ad886328df18cc69f8eefab73d1ece5",
"sha256:12950b6373dc9dfe1ce22a8506ec29c82bfc5b38146ced0a222f38cf5d99a56d",
"sha256:173e16969f990688aae4b4487717c44330bc57fd8b61a6216ce8eeb827eb5c0d",
"sha256:1cc6bebc15c3b275174c66cf4e1c949a94c5c2a3edaa2f193a1225548c52c771",
"sha256:21645788c5c2afa3df2d4b607638d86207b84cb495503b71e80e16b4c6b44e80",
"sha256:2d8f844e837374a9497e11722d9eb9dfeb33b1b5d31136786c39a4c1a3073c6d",
"sha256:35dd5d405a1d378c39f3f30f628a25b0b99f1b8e5bdd78275df2e7b0404892d7",
"sha256:3763b9a4bc128f72da5dcfd7fcc7c7d6644ed28e8f2db473ce1ef0dd37a43fa9",
"sha256:3bd8e3753257e95e94f38c058627aba1581d51f674e3badf226283b2bdb8f8ca",
"sha256:41d142eefbc0bb3be160a77b2c0fbec76f345387676265052e224eb6c67b7af3",
"sha256:452f3831c64f5f50260e18a89e613594590d6ceac5206a9b7d76ba43586b01b3",
"sha256:4fc4f7cff2495d6d112353c33a439230a6de0b7cd0c2578f1e8d75326f63d783",
"sha256:62a13b372b65fa6e11685df9ca924bed23bab1d0f277f9b67be7536f253aaf17",
"sha256:6ce2606a171f9cf7c15a77ca61f979ffc0e0d92cd2fb18767cead58c1d19f58e",
"sha256:6f24a1e2c373a77afae21bc512466a91e31251685c271c5309ee3e557f6e3e03",
"sha256:76a4e1d62505a21971968be61ae17cbdc5e0c483265a37f7ddbbc050f9c0b8ec",
"sha256:82db9344a07dd9106796b9fe8805425633146a7ea7fed5ed07c65a64d0bb79e1",
"sha256:87284f272746e31919302ab6211b16b41135109822c498f6e7b40a2f828e7836",
"sha256:87b86a87f8de2e1bd0bcd45faf1b1edf54f988c8857157300e0336efcfb8ede6",
"sha256:8bcfafb2809cd01be8ffe5f962e01b0fbe4cc1d74513434c52ff2dd05b86d492",
"sha256:9296df6a33b8539cd753765eb5b47308602263a14b124a099cbcf5f770d7cf90",
"sha256:958b513e23286178b513a6b4d975fe9e7cddbcea6e5ebe8d836e4ef067577154",
"sha256:9772c9e266b2ca4999180c12b90c8efb4c5c9ad3e55f301d78bc579af6467ad9",
"sha256:9b31756ea647b6ef53190f6b708ad0c4c2ea879bc17799ba5b0699eee59ecf7b",
"sha256:9cd54a762667c32112df5d6f059c5d61fa532ee06460948cc5bcbf60c502f5c9",
"sha256:9dabc70012fd7b58a8040a7bc1b5f71fd0e62e2138aefdd8367d3d24bf82c349",
"sha256:adafe9d71a940927dd3ad8d487f521f11277f133568b7da622666ebd08923191",
"sha256:ae5e557aa92565d72f6d3196e878e7cbd6a6380e02a15eafe0af781bd767c10d",
"sha256:af6b8cdf0857fd4e6460dd6639c37c3f82163127f6112c1942b5e6a52a477676",
"sha256:b37729ba34c116a3b2b6fb99df5c37a4ca40e96f430070488fd7a1077ad44907",
"sha256:b6424c716f4c38ff8f62b602e6b94cde478dadda542a1cb3fe2fe2520cc2aae3",
"sha256:b8f105631835fdf191c971c4da93d27e732e028d73ecaa1a88f458d497d026cf",
"sha256:be2b1a455b3ecfee20638289bb091a95216887d44924a41c28a601efac0916e8",
"sha256:c04a7903644ccea8fa07c3e76db43ca31c8d453f93c5c94c0f9b82efca225543",
"sha256:c0d6290a466a6f3fadf6add2dd4ec11deba4e1a6e3db2dd284edd497aadf802f",
"sha256:c5757a7b25fe48040fa120ba6597f5f885b01e323e0d13fe21ff95a70c0f76b7",
"sha256:ccad4e29ac1b6f75bfeedb2cac4860fe5bd9e0a2f04c3e3218f661fa389ab101",
"sha256:cd21de85aa0e247b79c6c41f8b5541b54285550f2da6a9448d82b53234d3611b",
"sha256:ce4553a573edb363d5db12be1c044826878bec039159d6d4eafe826ef773396d",
"sha256:d074380f587360d2500f3b065232c67ae248aaf739267807adbcd29b88bdf864",
"sha256:d41d4da5f2871b1782c6b74948d2d37aac3a5b39b43a6ba31d736b97a02ae1f1",
"sha256:d5102e17b81158de17d4b5bc363fcffd15231a38ef3f50b8e6fa01f0c6911194",
"sha256:d52d79dfd3b410b153b6d65b0e3afe834eca2b969377f55ad73c67156d35af0d",
"sha256:d591f2ddad432b794f77dc1e94334a80015a3fc7fa07fd6aed8f40362083be5b",
"sha256:d616b5a543c7d4deffa25eb8d8ae3d0d95097f08ac8b131600bb7fbf967ea0e2",
"sha256:d7af3990490982fbd2437156c69edbe82b7edf99bc60302cceeeaf79afb886b8",
"sha256:d8a6c35afd5b912101fabf42975d92d750cfce33c571508a82ff334a133c40d5",
"sha256:db181a1896e0bad75b3bf4916c49fd3cf6751f9cc203fe0e0ecbee1fc43590fa",
"sha256:dd5c305faa2e69334a53061b3168987847dadc2449bab95735242a9bde92fde8",
"sha256:e1f8e96455907496b3e4ea16f63bb578da31e17d2805278b193525e7714f17f2",
"sha256:e233a56bbf99e4cb134c4f8e63b16c77714e3987daf2c5aa10c3ba8c4232d730",
"sha256:e3f65da9701648d226b6b24ded3e2528b72075e48d7540968cd857c3bd4c5321",
"sha256:e4e893c7f7fb12271a667d5c1876710fae06d7580343afdb5f3fc4488b73209e",
"sha256:e54b80885b0e61d346accc5709daf8762471a452345521cc9281604a907162c2",
"sha256:e93f36a5c9d995f40e9c4cd9bbabd83fd78705792fa250980256c93accd07bb6",
"sha256:ebdf212e1ed85af63fa1a76d556c0a3c7b34348ffba6e145a64b15f003ad0a2b",
"sha256:f7a95b0dce364535a63fde0ec1b1ca36400037175d3b62ce04d85dbca5e33832",
"sha256:f82c1a1c1897d2293cb6c50f20fe8a9ea2add1a228eff479380917a1fe7bbb68",
"sha256:fe4877c24711458f7990392181be30166cc3ae72158036ecb48a73c30c99fb6f",
"sha256:ff619c58322d9d6df0a859dc76c3532d7bdbc125cb040f7cd642141446b4f654"
],
"index": "pypi",
"version": "==7.8.1"
},
"idna": {
"hashes": [
"sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
"sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
],
"markers": "python_version >= '3.6'",
"version": "==3.10"
},
"iniconfig": {
"hashes": [
"sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7",
"sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"
],
"markers": "python_version >= '3.8'",
"version": "==2.1.0"
},
"mariadb": {
"hashes": [
"sha256:194045d2f59b2c9100dad210dbd8ba3008120f8a434e792dae15b711e5449022",
"sha256:50b02ff2c78b1b4f4628a054e3c8c7dd92972137727a5cc309a64c9ed20c878c",
"sha256:5ae99af48ba92e3e2edad1dcda293f352c1b65e335007943b9def4cdde622fab",
"sha256:69b284ed12e6ef8dda6314cb1ca9d20d53b8a32a07bed2924beb25488e7d9502",
"sha256:8b49fc1e8c38bf5a779d46f8cea61c99660adb08d5d15cb7dbc7911a6439ffc2",
"sha256:8cc4068bdd14f4907746ec3bb37005682e47f84438cf56bdc6d901c2587f792a",
"sha256:992064971e0ff4b4154b80b16589ec86237ce4bd33debe1be5212141c056858a",
"sha256:b69bc18418e72fcf359d17736cdc3f601a271203aff13ef7c57a415c8fd52ab0",
"sha256:ba43c42130d41352f32a5786c339cc931d05472ef7640fa3764d428dc294b88e",
"sha256:dd9d0ca112eb670dfa99a2fb7c4398bcc2a8c452dbf5507a8e4b5c4ae991bb2a",
"sha256:e3ce7c47be58897822d07f119461b2aa6aa41a53f3505bec517b14fc6c3611a6"
],
"index": "pypi",
"version": "==1.1.12"
},
"packaging": {
"hashes": [
"sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
"sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
],
"markers": "python_version >= '3.8'",
"version": "==25.0"
},
"pluggy": {
"hashes": [
"sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3",
"sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"
],
"markers": "python_version >= '3.9'",
"version": "==1.6.0"
},
"pytest": {
"hashes": [
"sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820",
"sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
],
"index": "pypi",
"version": "==8.3.5"
},
"requests": {
"hashes": [
"sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
"sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
],
"markers": "python_version >= '3.8'",
"version": "==2.32.3"
},
"requests-mock": {
"hashes": [
"sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563",
"sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
],
"index": "pypi",
"version": "==1.12.1"
},
"urllib3": {
"hashes": [
"sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",
"sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"
],
"markers": "python_version >= '3.9'",
"version": "==2.4.0"
}
}
}
import mariadb
from mariadb.connections import Connection
class DatabaseClient:
def __init__(self, username: str, password: str):
self.username = username
self.password = password
def connect(self, hostname: str, port: int, database: str | None = None) -> Connection:
"""
:param hostname: The database hostname
:param port: The database port
:param database: The database name
:return: Connection The database connection.
:raises mariadb.Error If the connection cannot be established.
"""
return mariadb.connect(user=self.username, password=self.password, host=hostname, port=port, database=database)
def get_users(self, hostname: str, port: int, database: str) -> [str]:
connection = self.connect(hostname, port, database)
cur = connection.cursor()
cur.execute(f'SELECT user FROM mysql.user;')
users = []
for (user,) in cur:
users.append(user)
connection.close()
return users
import logging
from database import DatabaseClient
from dbrepo.RestClient import RestClient
from dbrepo.api.exceptions import AccessExistsError
rest_client = RestClient("http://127.0.0.1", "admin", "admin")
database_client = DatabaseClient(username='root', password='dbrepo')
for db in rest_client.get_databases():
database = rest_client.get_database(db.id)
# create query store if necessary
if not rest_client.exists_query_store(db.id):
rest_client.create_query_store(db.id)
logging.info(f'Created query store in database: {db.internal_name}', extra={'database_id': db.id})
# check if user exist
for access in database.accesses:
print(f'User {access.user.username} has no grant(s) in database: {database.internal_name}')
try:
rest_client.create_database_access(database.id, access.user.id, access.type)
print(f'Created access grant(s) for user {access.user.username} in database: {database.internal_name}')
except AccessExistsError:
pass
print(f'update permission {access.type} for user {access.user.username} in database: {database.internal_name}')
rest_client.update_database_access(database.id, access.user.id, access.type)
import logging
import os
from logging.config import dictConfig
from dbrepo.RestClient import RestClient
from database import DatabaseClient
level = os.getenv("LOG_LEVEL", "DEBUG").upper()
logging.basicConfig(level=level)
# logging configuration
dictConfig({
'version': 1,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
},
'simple': {
'format': '[%(asctime)s] [%(levelname)s] %(message)s',
},
"ecs": {
"()": "ecs_logging.StdlibFormatter"
},
},
'handlers': {
'stream': {
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
'formatter': 'simple'
},
'file': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'ecs',
'filename': '/var/log/app/worker/airquality/app.log',
'when': 'midnight',
'interval': 1,
'backupCount': 7,
'encoding': 'utf8'
},
},
'root': {
'level': 'DEBUG',
'handlers': ['stream', 'file']
}
})
rest_client = RestClient(endpoint=os.getenv("METADATA_SERVICE_ENDPOINT", "http://metadata-service:8080"),
username=os.getenv("SYSTEM_USERNAME", "admin"),
password=os.getenv("SYSTEM_PASSWORD", "admin"))
database_client = DatabaseClient(username=os.getenv("SYSTEM_USERNAME", "admin"),
password=os.getenv("SYSTEM_PASSWORD", "admin"))
if __name__ == "__main__":
for db in rest_client.get_databases():
database = rest_client.get_database(db.id)
# create query store if necessary
if not rest_client.exists_query_store(db.id):
rest_client.create_query_store(db.id)
logging.info(f'Created query store in database: {db.internal_name}', extra={'database_id': db.id})
# check if user exist
users = database_client.get_users(db.host, db.port, db.internal_name)
missing = [access.user.username in [u for u in users] for access in database.accesses]
print(f'===> {missing}')
# database.accesses
# check all users exist in data-db and have correct grants
# remove queries from query store older than x days
logging.info("Finished. Exiting.")
File added
File added
package at.ac.tuwien.ifs.dbrepo; package at.ac.tuwien.ifs.dbrepo;
import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto;
import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto;
import at.ac.tuwien.ifs.dbrepo.core.exception.*;
import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway;
import at.ac.tuwien.ifs.dbrepo.service.CacheService;
import at.ac.tuwien.ifs.dbrepo.service.ContainerService;
import at.ac.tuwien.ifs.dbrepo.service.DatabaseService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.sql.SQLException;
import java.util.List;
@Slf4j @Slf4j
@EnableScheduling
@SpringBootApplication @SpringBootApplication
public class DataServiceApplication implements CommandLineRunner { public class DataServiceApplication {
private final CacheService cacheService;
private final DatabaseService databaseService;
private final ContainerService containerService;
private final ApplicationContext applicationContext;
private final MetadataServiceGateway metadataServiceGateway;
@Autowired
public DataServiceApplication(CacheService cacheService, DatabaseService databaseService,
ContainerService containerService, ApplicationContext applicationContext,
MetadataServiceGateway metadataServiceGateway) {
this.cacheService = cacheService;
this.databaseService = databaseService;
this.containerService = containerService;
this.applicationContext = applicationContext;
this.metadataServiceGateway = metadataServiceGateway;
}
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DataServiceApplication.class, args); SpringApplication.run(DataServiceApplication.class, args);
} }
@Override
public void run(String... args) throws MetadataServiceException, RemoteUnavailableException, SQLException,
DatabaseNotFoundException, QueryStoreCreateException, TableNotFoundException, DatabaseMalformedException,
ViewNotFoundException {
if (args.length == 0) {
return;
}
for (DatabaseBriefDto d : metadataServiceGateway.getDatabases()) {
final DatabaseDto database = cacheService.getDatabase(d.getId());
containerService.createQueryStore(database.getContainer(), database.getInternalName());
final List<TableDto> tables = databaseService.exploreTables(database);
if (database.getTables().size() != tables.size()) {
final List<TableDto> missingTables = tables.stream()
.filter(table -> database.getTables()
.stream()
.noneMatch(t -> table.getInternalName().equals(t.getInternalName())))
.toList();
if (!missingTables.isEmpty()) {
log.warn("Failed to obtain metadata on table(s): {}", missingTables);
metadataServiceGateway.updateTableSchemas(d.getId());
}
}
final List<ViewDto> views = databaseService.exploreViews(database);
if (database.getViews().size() != views.size()) {
final List<ViewDto> missingViews = views.stream()
.filter(view -> database.getTables()
.stream()
.noneMatch(v -> view.getInternalName().equals(v.getInternalName())))
.toList();
if (!missingViews.isEmpty()) {
log.warn("Failed to obtain metadata on view(s): {}", missingViews);
metadataServiceGateway.updateViewSchemas(d.getId());
}
}
}
log.info("Finished initialization");
SpringApplication.exit(applicationContext, () -> 0);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment