From 5970446d4efb27c3530c3d50cf0cbed91ac3d4af Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 18 Dec 2024 13:05:36 +0000 Subject: [PATCH] Documentation autoupdate --- 404.html | 4 +- about_our_contributors/index.html | 6 +- assets/js/03a88bad.28366822.js | 1 - assets/js/03a88bad.d585f12a.js | 1 + assets/js/093ddf2f.379398f9.js | 1 + assets/js/093ddf2f.7fac349a.js | 1 - assets/js/0aef9821.bcf38d9c.js | 1 - assets/js/0aef9821.d61de1ba.js | 1 + assets/js/0c78ace3.c64cef6d.js | 1 + assets/js/0c78ace3.c9f5c3c1.js | 1 - assets/js/1220bf94.286cc694.js | 1 + assets/js/1220bf94.b58dc93a.js | 1 - assets/js/138181e0.0287dff2.js | 1 - assets/js/138181e0.76599c35.js | 1 + assets/js/16a6bed5.5fe84808.js | 1 - assets/js/16a6bed5.9e4c26ff.js | 1 + assets/js/1705cd3e.09d2b1b8.js | 1 + assets/js/1705cd3e.e564c3e7.js | 1 - assets/js/171dad78.1b83b3ab.js | 1 - assets/js/171dad78.8cdfdfb4.js | 1 + assets/js/1a726a41.e19f7c47.js | 1 + assets/js/1a726a41.f926c85c.js | 1 - assets/js/1ae78d49.2bc92216.js | 1 - assets/js/1ae78d49.40c39d80.js | 1 + assets/js/1b18b8b2.1da8b5ae.js | 1 - assets/js/1b18b8b2.79a3d46e.js | 1 + assets/js/1baa3d0c.e4dea5c2.js | 1 - assets/js/1baa3d0c.ff6f16b9.js | 1 + assets/js/1f6323a9.52121db8.js | 1 + assets/js/1f6323a9.621bd53f.js | 1 - assets/js/1f6484bf.8a08af6e.js | 1 + assets/js/1f6484bf.c3ddfcb7.js | 1 - assets/js/26c807fc.b53652d7.js | 1 + assets/js/26c807fc.e121bfc2.js | 1 - assets/js/31b36657.e036b0f1.js | 1 - assets/js/31b36657.f84575a4.js | 1 + assets/js/3c621cea.b8045bd4.js | 1 + assets/js/3c621cea.f1eec229.js | 1 - assets/js/3e04ff1b.67d4ed39.js | 1 - assets/js/3e04ff1b.e46ec295.js | 1 + assets/js/46c53b39.2c420eb9.js | 1 - assets/js/46c53b39.6ea7e8a0.js | 1 + assets/js/49aea3c1.16d4f42f.js | 1 - assets/js/49aea3c1.4cd35d0d.js | 1 + assets/js/4b43413c.91f401b6.js | 1 - assets/js/4b43413c.9e2e278f.js | 1 + assets/js/4dae639c.921d2a00.js | 1 - assets/js/4dae639c.d2ea5709.js | 1 + assets/js/5a310bfb.4dce21e6.js | 1 - assets/js/5a310bfb.d89d1a01.js | 1 + assets/js/5a5d0baa.1f882012.js | 1 + assets/js/5a5d0baa.f304d9f4.js | 1 - assets/js/5d96f1d3.81511df5.js | 1 - assets/js/5d96f1d3.e921a0bb.js | 1 + assets/js/61c44338.93775d62.js | 1 + assets/js/61c44338.e1cd39d2.js | 1 - assets/js/641fb65d.a36fc77b.js | 1 + assets/js/641fb65d.c101240c.js | 1 - assets/js/64778c2e.b54f8c47.js | 1 + assets/js/64778c2e.fa9e523b.js | 1 - assets/js/6530bd8c.351dea10.js | 1 + assets/js/6530bd8c.b8c0ba80.js | 1 - assets/js/65d5ae35.13cca70b.js | 1 + assets/js/65d5ae35.e91a3192.js | 1 - assets/js/68a6ce58.5b291b6d.js | 1 - assets/js/68a6ce58.5c3d785f.js | 1 + assets/js/6998db83.192aadac.js | 1 + assets/js/6998db83.40612748.js | 1 - assets/js/6a365d02.ea8b94c5.js | 1 + assets/js/6a365d02.fb93a420.js | 1 - assets/js/6e97e9ae.09234901.js | 1 - assets/js/6e97e9ae.753dbd84.js | 1 + assets/js/754bb2f2.17c82ec7.js | 1 + assets/js/754bb2f2.81230c0f.js | 1 - assets/js/84743230.257af96d.js | 1 + assets/js/84743230.85da485f.js | 1 - assets/js/88ee25e8.9f518d59.js | 1 + assets/js/88ee25e8.faeccf4b.js | 1 - assets/js/89d2be03.057facd1.js | 1 + assets/js/89d2be03.79f757df.js | 1 - assets/js/8dadf37b.7a47799c.js | 1 + assets/js/8dadf37b.ee1cf979.js | 1 - assets/js/8df61e40.0e878f08.js | 1 + assets/js/8df61e40.edacb8ca.js | 1 - assets/js/90fd0081.6913ff13.js | 1 - assets/js/90fd0081.d93a69bd.js | 1 + assets/js/93b9e5e5.094eb0ac.js | 1 - assets/js/93b9e5e5.a9091abd.js | 1 + assets/js/a3f525c1.781650a7.js | 1 + assets/js/a3f525c1.c71eacbf.js | 1 - assets/js/aca47106.1edef0c5.js | 1 + assets/js/aca47106.6820cbc6.js | 1 - assets/js/ad1c34e1.ac4cbd90.js | 1 - assets/js/ad1c34e1.b7c087b2.js | 1 + assets/js/af2db750.59b8870e.js | 1 + assets/js/af2db750.68f9df9c.js | 1 - assets/js/b080ce4d.b016e9d7.js | 1 - assets/js/b080ce4d.e8a3b4f3.js | 1 + assets/js/b0e04a76.ccfc8a5e.js | 1 - assets/js/b0e04a76.ded87bf1.js | 1 + assets/js/b829f644.265e2f08.js | 1 + assets/js/b829f644.acaafb33.js | 1 - assets/js/bc02b268.0148e676.js | 1 + assets/js/bc02b268.1e6e50af.js | 1 - assets/js/bca094e1.be9716aa.js | 1 - assets/js/bca094e1.e48d3fc2.js | 1 + assets/js/c09fddfc.4ca46eaa.js | 1 + assets/js/c09fddfc.c9ea88fa.js | 1 - assets/js/c0dfaf66.1eaebdca.js | 1 - assets/js/c0dfaf66.99eeac0b.js | 1 + assets/js/c671c501.1daf3bad.js | 1 + assets/js/c671c501.49bf1a79.js | 1 - assets/js/c71713af.b56ad583.js | 1 + assets/js/c975ff2c.e1d75169.js | 1 - assets/js/c975ff2c.e33d3efb.js | 1 + assets/js/d2127834.06bfd6d6.js | 1 + assets/js/d2127834.1121262e.js | 1 - assets/js/d31db992.171d6e5d.js | 1 - assets/js/d31db992.22bb4084.js | 1 + assets/js/d472238c.a0ac2b98.js | 1 + assets/js/d472238c.bb538d7a.js | 1 - assets/js/d6025e9f.4487eb0e.js | 1 - assets/js/d6025e9f.8a87530b.js | 1 + assets/js/d6ce5df9.274f9428.js | 1 - assets/js/d6ce5df9.b9310b51.js | 1 + ...8b43d.b2f3ab88.js => d918b43d.78c4c61c.js} | 2 +- assets/js/db4eceea.06c9ed37.js | 1 - assets/js/db4eceea.290abe11.js | 1 + assets/js/e114bd53.3e2ab3fd.js | 1 - assets/js/e114bd53.c050b4ce.js | 1 + assets/js/e7f8a1a7.a2fde79b.js | 1 + assets/js/e7f8a1a7.b419a781.js | 1 - assets/js/eb73b352.041bed6b.js | 1 - assets/js/eb73b352.eef991c3.js | 1 + assets/js/ecfe08ed.8ee19090.js | 1 + assets/js/ecfe08ed.d1490bec.js | 1 - assets/js/f1846c1f.b6a5ffb1.js | 1 - assets/js/f1846c1f.d00d8396.js | 1 + assets/js/f4c0b6c3.2c9be0f0.js | 1 - assets/js/f4c0b6c3.392561c5.js | 1 + assets/js/f664dab4.4066c8c3.js | 1 - assets/js/f664dab4.9d29700c.js | 1 + assets/js/f7637249.ac7514f8.js | 1 - assets/js/f7637249.db7a1032.js | 1 + assets/js/main.a559a5fc.js | 2 + ...CENSE.txt => main.a559a5fc.js.LICENSE.txt} | 0 assets/js/main.bf4192f6.js | 2 - assets/js/runtime~main.1d7bc27d.js | 1 + assets/js/runtime~main.c0b1c4b0.js | 1 - bin/rucio-abacus-account/index.html | 4 +- .../index.html | 4 +- bin/rucio-abacus-rse/index.html | 4 +- bin/rucio-admin/index.html | 4 +- bin/rucio-atropos/index.html | 4 +- bin/rucio-auditor/index.html | 4 +- bin/rucio-automatix/index.html | 4 +- bin/rucio-bb8/index.html | 4 +- bin/rucio-c3po/index.html | 4 +- bin/rucio-cache-client/index.html | 4 +- bin/rucio-cache-consumer/index.html | 4 +- bin/rucio-conveyor-finisher/index.html | 4 +- bin/rucio-conveyor-poller/index.html | 4 +- bin/rucio-conveyor-preparer/index.html | 4 +- bin/rucio-conveyor-receiver/index.html | 4 +- bin/rucio-conveyor-stager/index.html | 4 +- bin/rucio-conveyor-submitter/index.html | 4 +- bin/rucio-conveyor-throttler/index.html | 4 +- bin/rucio-dark-reaper/index.html | 4 +- bin/rucio-dumper/index.html | 4 +- bin/rucio-follower/index.html | 4 +- bin/rucio-hermes/index.html | 4 +- bin/rucio-judge-cleaner/index.html | 4 +- bin/rucio-judge-evaluator/index.html | 4 +- bin/rucio-judge-injector/index.html | 4 +- bin/rucio-judge-repairer/index.html | 4 +- bin/rucio-kronos/index.html | 4 +- .../index.html | 4 +- bin/rucio-minos/index.html | 4 +- bin/rucio-necromancer/index.html | 4 +- bin/rucio-oauth-manager/index.html | 4 +- bin/rucio-reaper/index.html | 4 +- bin/rucio-replica-recoverer/index.html | 4 +- bin/rucio-rse-decommissioner/index.html | 4 +- .../index.html | 4 +- bin/rucio-transmogrifier/index.html | 4 +- bin/rucio-undertaker/index.html | 4 +- bin/rucio/index.html | 4 +- component_leads/index.html | 6 +- contact_us/index.html | 6 +- contributing/index.html | 6 +- developer/dependency_management/index.html | 6 +- developer/dev_style_guide/index.html | 6 +- developer/project_structure/index.html | 6 +- developer/rest_api_doc/index.html | 6 +- .../setting_up_intellij_dev_env/index.html | 6 +- .../setting_up_mac_apple_silicon/index.html | 6 +- .../setting_up_vscode_dev_env/index.html | 6 +- developer/type_annotation_guide/index.html | 6 +- developer/webui/streamedtables/index.html | 6 +- developer/webui/webui_frontend/index.html | 6 +- .../webui_frontend_vscode_dev_env/index.html | 6 +- html/rest_api_doc.html | 446 ++-- index.html | 6 +- join_rucio_mattermost/index.html | 6 +- operator/administration/index.html | 6 +- operator/configuration/index.html | 6 +- operator/configuration_parameters/index.html | 6 +- operator/database/index.html | 6 +- operator/did_meta/index.html | 6 +- operator/installing_daemons/index.html | 6 +- operator/installing_server/index.html | 6 +- operator/k8s_guide/index.html | 6 +- operator/kubernetes/index.html | 6 +- operator/monitoring/index.html | 6 +- operator/multi_vo_rucio/index.html | 6 +- operator/notifications/index.html | 6 +- operator/policy_packages/index.html | 6 +- operator/qos_rse_config/index.html | 6 +- operator/s3_rse_config/index.html | 6 +- operator/setting_up_demo/index.html | 6 +- .../configure-rucio-fts3-plugins/index.html | 6 +- .../configure-rucio-globus/index.html | 6 +- .../transfers/transfers-overview/index.html | 6 +- .../transfers/transfers-preparer/index.html | 6 +- .../transfers/transfers-submitter/index.html | 6 +- .../transfers/transfers-throttler/index.html | 6 +- project_organisation/index.html | 6 +- release-notes/1.13.3/index.html | 4 +- release-notes/1.14.0.post1/index.html | 4 +- release-notes/1.14.1.post1/index.html | 4 +- release-notes/1.14.10/index.html | 4 +- release-notes/1.14.11/index.html | 4 +- release-notes/1.14.2/index.html | 4 +- release-notes/1.14.3/index.html | 4 +- release-notes/1.14.4/index.html | 4 +- release-notes/1.14.5/index.html | 4 +- release-notes/1.14.6/index.html | 4 +- release-notes/1.14.7/index.html | 4 +- release-notes/1.14.8.post1/index.html | 4 +- release-notes/1.14.8.post2/index.html | 4 +- release-notes/1.14.8/index.html | 4 +- release-notes/1.14.9.post1/index.html | 4 +- release-notes/1.14.9/index.html | 4 +- release-notes/1.15.0.post1/index.html | 4 +- release-notes/1.15.0/index.html | 4 +- release-notes/1.15.1/index.html | 4 +- release-notes/1.15.2/index.html | 4 +- release-notes/1.15.3.post1/index.html | 4 +- release-notes/1.15.3/index.html | 4 +- release-notes/1.15.4.post1/index.html | 4 +- release-notes/1.15.4/index.html | 4 +- release-notes/1.15.5/index.html | 4 +- release-notes/1.16.0.post1/index.html | 4 +- release-notes/1.16.0/index.html | 4 +- release-notes/1.16.1/index.html | 4 +- release-notes/1.16.2/index.html | 4 +- release-notes/1.16.3/index.html | 4 +- release-notes/1.16.4/index.html | 4 +- release-notes/1.17.0/index.html | 4 +- release-notes/1.17.1/index.html | 4 +- release-notes/1.17.2.post1/index.html | 4 +- release-notes/1.17.2/index.html | 4 +- release-notes/1.17.3/index.html | 4 +- release-notes/1.17.4/index.html | 4 +- release-notes/1.17.5/index.html | 4 +- release-notes/1.17.6.post1/index.html | 4 +- release-notes/1.17.6.post2/index.html | 4 +- release-notes/1.17.6/index.html | 4 +- release-notes/1.17.7/index.html | 4 +- release-notes/1.17.8.post1/index.html | 4 +- release-notes/1.17.8.post2/index.html | 4 +- release-notes/1.17.8/index.html | 4 +- release-notes/1.18.0/index.html | 4 +- release-notes/1.18.1/index.html | 4 +- release-notes/1.18.2/index.html | 4 +- release-notes/1.18.3/index.html | 4 +- release-notes/1.18.4/index.html | 4 +- release-notes/1.18.5.post1/index.html | 4 +- release-notes/1.18.5/index.html | 4 +- release-notes/1.18.6.post1/index.html | 4 +- release-notes/1.18.6/index.html | 4 +- release-notes/1.18.7/index.html | 4 +- release-notes/1.18.8.post1/index.html | 4 +- release-notes/1.18.8/index.html | 4 +- release-notes/1.18.9/index.html | 4 +- release-notes/1.19.0.post2/index.html | 4 +- release-notes/1.19.1/index.html | 4 +- release-notes/1.19.2/index.html | 4 +- release-notes/1.19.3/index.html | 4 +- release-notes/1.19.4.post1/index.html | 4 +- release-notes/1.19.4.post2/index.html | 4 +- release-notes/1.19.4/index.html | 4 +- release-notes/1.19.5/index.html | 4 +- release-notes/1.19.6/index.html | 4 +- release-notes/1.19.7.post1/index.html | 4 +- release-notes/1.19.7/index.html | 4 +- release-notes/1.19.8/index.html | 4 +- release-notes/1.20.0/index.html | 4 +- release-notes/1.20.0rc1/index.html | 4 +- release-notes/1.20.1.post1/index.html | 4 +- release-notes/1.20.1/index.html | 4 +- release-notes/1.20.10/index.html | 4 +- release-notes/1.20.11/index.html | 4 +- release-notes/1.20.12/index.html | 4 +- release-notes/1.20.13/index.html | 4 +- release-notes/1.20.14/index.html | 4 +- release-notes/1.20.15/index.html | 4 +- release-notes/1.20.16/index.html | 4 +- release-notes/1.20.2/index.html | 4 +- release-notes/1.20.3/index.html | 4 +- release-notes/1.20.3rc1/index.html | 4 +- release-notes/1.20.3rc2/index.html | 4 +- release-notes/1.20.4.post1/index.html | 4 +- release-notes/1.20.4.post2/index.html | 4 +- release-notes/1.20.4/index.html | 4 +- release-notes/1.20.4rc1/index.html | 4 +- release-notes/1.20.4rc2/index.html | 4 +- release-notes/1.20.4rc3/index.html | 4 +- release-notes/1.20.5/index.html | 4 +- release-notes/1.20.6/index.html | 4 +- release-notes/1.20.7/index.html | 4 +- release-notes/1.20.8/index.html | 4 +- release-notes/1.20.9/index.html | 4 +- release-notes/1.21.0.post1/index.html | 4 +- release-notes/1.21.0.post2/index.html | 4 +- release-notes/1.21.0/index.html | 4 +- release-notes/1.21.0rc1/index.html | 4 +- release-notes/1.21.0rc2/index.html | 4 +- release-notes/1.21.0rc3/index.html | 4 +- release-notes/1.21.1/index.html | 4 +- release-notes/1.21.10.post1/index.html | 4 +- release-notes/1.21.10/index.html | 4 +- release-notes/1.21.11/index.html | 4 +- release-notes/1.21.12/index.html | 4 +- release-notes/1.21.2/index.html | 4 +- release-notes/1.21.3/index.html | 4 +- release-notes/1.21.4/index.html | 4 +- release-notes/1.21.5/index.html | 4 +- release-notes/1.21.6/index.html | 4 +- release-notes/1.21.7/index.html | 4 +- release-notes/1.21.8/index.html | 4 +- release-notes/1.21.9/index.html | 4 +- release-notes/1.22.0.dev2/index.html | 4 +- release-notes/1.22.0.dev3/index.html | 4 +- release-notes/1.22.0/index.html | 4 +- release-notes/1.22.0rc1/index.html | 4 +- release-notes/1.22.0rc2/index.html | 4 +- release-notes/1.22.1/index.html | 4 +- release-notes/1.22.2/index.html | 4 +- release-notes/1.22.3.post1/index.html | 4 +- release-notes/1.22.3/index.html | 4 +- release-notes/1.22.4.dev1/index.html | 4 +- release-notes/1.22.4/index.html | 4 +- release-notes/1.22.5/index.html | 4 +- release-notes/1.22.6.post1/index.html | 4 +- release-notes/1.22.6/index.html | 4 +- release-notes/1.22.7/index.html | 4 +- release-notes/1.22.8.post1/index.html | 4 +- release-notes/1.22.8/index.html | 4 +- release-notes/1.23.0/index.html | 4 +- release-notes/1.23.0rc1/index.html | 4 +- release-notes/1.23.0rc2/index.html | 4 +- release-notes/1.23.1/index.html | 4 +- release-notes/1.23.10/index.html | 4 +- release-notes/1.23.11.post1/index.html | 4 +- release-notes/1.23.11.post2/index.html | 4 +- release-notes/1.23.11.post3/index.html | 4 +- release-notes/1.23.11.post4/index.html | 4 +- release-notes/1.23.11/index.html | 4 +- release-notes/1.23.12/index.html | 4 +- release-notes/1.23.13/index.html | 4 +- release-notes/1.23.14/index.html | 4 +- release-notes/1.23.15/index.html | 4 +- release-notes/1.23.16/index.html | 4 +- release-notes/1.23.17/index.html | 4 +- release-notes/1.23.18/index.html | 4 +- release-notes/1.23.19/index.html | 4 +- release-notes/1.23.2.post1/index.html | 4 +- release-notes/1.23.2.post2/index.html | 4 +- release-notes/1.23.2/index.html | 4 +- release-notes/1.23.20/index.html | 4 +- release-notes/1.23.3/index.html | 4 +- release-notes/1.23.4/index.html | 4 +- release-notes/1.23.5.post1/index.html | 4 +- release-notes/1.23.5/index.html | 4 +- release-notes/1.23.6.post1/index.html | 4 +- release-notes/1.23.6/index.html | 4 +- release-notes/1.23.7.post1/index.html | 4 +- release-notes/1.23.7/index.html | 4 +- release-notes/1.23.8/index.html | 4 +- release-notes/1.23.9.post1/index.html | 4 +- release-notes/1.23.9.post2/index.html | 4 +- release-notes/1.23.9.post3/index.html | 4 +- release-notes/1.23.9.post4/index.html | 4 +- release-notes/1.23.9/index.html | 4 +- release-notes/1.24.0/index.html | 4 +- release-notes/1.24.0rc1/index.html | 4 +- release-notes/1.24.1.post1/index.html | 4 +- release-notes/1.24.1.post2/index.html | 4 +- release-notes/1.24.1.post3/index.html | 4 +- release-notes/1.24.1.post4/index.html | 4 +- release-notes/1.24.1/index.html | 4 +- release-notes/1.24.2.post1/index.html | 4 +- release-notes/1.24.2/index.html | 4 +- release-notes/1.24.3.post1/index.html | 4 +- release-notes/1.24.3/index.html | 4 +- release-notes/1.24.4/index.html | 4 +- release-notes/1.24.5.post1/index.html | 4 +- release-notes/1.24.5/index.html | 4 +- release-notes/1.25.0/index.html | 4 +- release-notes/1.25.0rc1/index.html | 4 +- release-notes/1.25.0rc2/index.html | 4 +- release-notes/1.25.1.post1/index.html | 4 +- release-notes/1.25.1.post2/index.html | 4 +- release-notes/1.25.1/index.html | 4 +- release-notes/1.25.2/index.html | 4 +- release-notes/1.25.3.post1/index.html | 4 +- release-notes/1.25.3.post2/index.html | 4 +- release-notes/1.25.3/index.html | 4 +- release-notes/1.25.4.post1/index.html | 4 +- release-notes/1.25.4/index.html | 4 +- release-notes/1.25.5/index.html | 4 +- release-notes/1.25.6/index.html | 4 +- release-notes/1.25.7/index.html | 4 +- release-notes/1.26.0/index.html | 4 +- release-notes/1.26.0rc1/index.html | 4 +- release-notes/1.26.0rc2/index.html | 4 +- release-notes/1.26.1.post1/index.html | 4 +- release-notes/1.26.1/index.html | 4 +- release-notes/1.26.10/index.html | 4 +- release-notes/1.26.11/index.html | 4 +- release-notes/1.26.12/index.html | 4 +- release-notes/1.26.13/index.html | 4 +- release-notes/1.26.14/index.html | 4 +- release-notes/1.26.15/index.html | 4 +- release-notes/1.26.16/index.html | 4 +- release-notes/1.26.17/index.html | 4 +- release-notes/1.26.18/index.html | 4 +- release-notes/1.26.2/index.html | 4 +- release-notes/1.26.3/index.html | 4 +- release-notes/1.26.4/index.html | 4 +- release-notes/1.26.5/index.html | 4 +- release-notes/1.26.6/index.html | 4 +- release-notes/1.26.7.post1/index.html | 4 +- release-notes/1.26.7/index.html | 4 +- release-notes/1.26.8.post1/index.html | 4 +- release-notes/1.26.8/index.html | 4 +- release-notes/1.26.9/index.html | 4 +- release-notes/1.27.0.post1/index.html | 4 +- release-notes/1.27.0/index.html | 4 +- release-notes/1.27.0rc1/index.html | 4 +- release-notes/1.27.0rc2/index.html | 4 +- release-notes/1.27.1/index.html | 4 +- release-notes/1.27.10/index.html | 4 +- release-notes/1.27.11/index.html | 4 +- release-notes/1.27.12/index.html | 4 +- release-notes/1.27.2/index.html | 4 +- release-notes/1.27.3/index.html | 4 +- release-notes/1.27.4.post1/index.html | 4 +- release-notes/1.27.4/index.html | 4 +- release-notes/1.27.5/index.html | 4 +- release-notes/1.27.6/index.html | 4 +- release-notes/1.27.7/index.html | 4 +- release-notes/1.27.8/index.html | 4 +- release-notes/1.27.9/index.html | 4 +- release-notes/1.28.0/index.html | 4 +- release-notes/1.28.0rc1/index.html | 4 +- release-notes/1.28.0rc2/index.html | 4 +- release-notes/1.28.1/index.html | 4 +- release-notes/1.28.2/index.html | 4 +- release-notes/1.28.3/index.html | 4 +- release-notes/1.28.4/index.html | 4 +- release-notes/1.28.5/index.html | 4 +- release-notes/1.28.6/index.html | 4 +- release-notes/1.28.7/index.html | 4 +- release-notes/1.29.0/index.html | 4 +- release-notes/1.29.0rc1/index.html | 4 +- release-notes/1.29.0rc2/index.html | 4 +- release-notes/1.29.1/index.html | 4 +- release-notes/1.29.10/index.html | 4 +- release-notes/1.29.11/index.html | 4 +- release-notes/1.29.12/index.html | 4 +- release-notes/1.29.13/index.html | 4 +- release-notes/1.29.14/index.html | 4 +- release-notes/1.29.15/index.html | 4 +- release-notes/1.29.16/index.html | 4 +- release-notes/1.29.17/index.html | 4 +- release-notes/1.29.18/index.html | 4 +- release-notes/1.29.19/index.html | 4 +- release-notes/1.29.2.post1/index.html | 4 +- release-notes/1.29.2.post2/index.html | 4 +- release-notes/1.29.2/index.html | 4 +- release-notes/1.29.3.post1/index.html | 4 +- release-notes/1.29.3/index.html | 4 +- release-notes/1.29.4/index.html | 4 +- release-notes/1.29.5/index.html | 4 +- release-notes/1.29.6/index.html | 4 +- release-notes/1.29.7.post1/index.html | 4 +- release-notes/1.29.7/index.html | 4 +- release-notes/1.29.8/index.html | 4 +- release-notes/1.29.9/index.html | 4 +- release-notes/1.30.0/index.html | 4 +- release-notes/1.30.0rc1/index.html | 4 +- release-notes/1.30.0rc2/index.html | 4 +- release-notes/1.30.0rc3/index.html | 4 +- release-notes/1.30.1/index.html | 4 +- release-notes/1.30.2/index.html | 4 +- release-notes/1.30.3/index.html | 4 +- release-notes/1.30.4/index.html | 4 +- release-notes/1.30.5/index.html | 4 +- release-notes/1.30.6/index.html | 4 +- release-notes/1.30.7/index.html | 4 +- release-notes/1.30.8/index.html | 4 +- release-notes/1.31.0/index.html | 4 +- release-notes/1.31.0rc1/index.html | 4 +- release-notes/1.31.0rc2/index.html | 4 +- release-notes/1.31.0rc3/index.html | 4 +- release-notes/1.31.1/index.html | 4 +- release-notes/1.31.2/index.html | 4 +- release-notes/1.31.3/index.html | 4 +- release-notes/1.31.4/index.html | 4 +- release-notes/1.31.5/index.html | 4 +- release-notes/1.31.6/index.html | 4 +- release-notes/1.31.7/index.html | 4 +- release-notes/32.0.0/index.html | 4 +- release-notes/32.0.0rc1/index.html | 4 +- release-notes/32.0.0rc2/index.html | 4 +- release-notes/32.1.0/index.html | 4 +- release-notes/32.2.0/index.html | 4 +- release-notes/32.3.0/index.html | 4 +- release-notes/32.3.1/index.html | 4 +- release-notes/32.4.0/index.html | 4 +- release-notes/32.5.0.post1/index.html | 4 +- release-notes/32.5.0/index.html | 4 +- release-notes/32.5.1/index.html | 4 +- release-notes/32.6.0.post1/index.html | 4 +- release-notes/32.6.0/index.html | 4 +- release-notes/32.7.0/index.html | 4 +- release-notes/32.8.0/index.html | 4 +- release-notes/32.8.1/index.html | 4 +- release-notes/32.8.2/index.html | 4 +- release-notes/32.8.3/index.html | 4 +- release-notes/32.8.4/index.html | 18 + release-notes/33.0.0/index.html | 4 +- release-notes/33.0.0rc1/index.html | 4 +- release-notes/33.0.0rc2/index.html | 4 +- release-notes/33.0.0rc3/index.html | 4 +- release-notes/33.1.0/index.html | 4 +- release-notes/33.2.0/index.html | 4 +- release-notes/33.2.1/index.html | 4 +- release-notes/33.3.0/index.html | 4 +- release-notes/33.4.0.post1/index.html | 4 +- release-notes/33.4.0/index.html | 4 +- release-notes/33.5.0/index.html | 4 +- release-notes/33.6.0/index.html | 4 +- release-notes/33.6.1/index.html | 4 +- release-notes/34.0.0/index.html | 4 +- release-notes/34.0.0rc1/index.html | 4 +- release-notes/34.0.0rc2/index.html | 4 +- release-notes/34.1.0/index.html | 4 +- release-notes/34.2.0/index.html | 4 +- release-notes/34.3.0/index.html | 4 +- release-notes/34.4.0/index.html | 4 +- release-notes/34.4.1/index.html | 4 +- release-notes/34.4.2/index.html | 4 +- release-notes/34.4.3/index.html | 4 +- release-notes/34.5.0/index.html | 4 +- release-notes/34.6.0/index.html | 4 +- release-notes/35.0.0/index.html | 4 +- release-notes/35.0.0rc1/index.html | 4 +- release-notes/35.0.0rc2/index.html | 4 +- release-notes/35.0.1/index.html | 4 +- release-notes/35.1.0/index.html | 4 +- release-notes/35.1.1/index.html | 4 +- release-notes/35.2.0/index.html | 4 +- release-notes/35.2.1/index.html | 4 +- release-notes/35.3.0/index.html | 4 +- release-notes/35.4.0/index.html | 4 +- release-notes/35.4.1/index.html | 4 +- release-notes/35.5.0/index.html | 4 +- release-notes/35.6.0/index.html | 4 +- release-notes/36.0.0.post1/index.html | 4 +- release-notes/36.0.0.post2/index.html | 4 +- release-notes/36.0.0/index.html | 4 +- release-notes/36.0.0rc1/index.html | 4 +- release-notes/36.0.0rc2/index.html | 4 +- release-notes/36.0.0rc3/index.html | 4 +- release-notes/36.0.0rc4/index.html | 4 +- release-notes/36.0.0rc5/index.html | 4 +- release-notes/index.html | 5 +- rucio_advisory_board/index.html | 6 +- search/index.html | 4 +- sig_metadata/index.html | 6 +- sig_qualityofservice/index.html | 6 +- sig_tokens/index.html | 6 +- sitemap.xml | 2 +- special_interest_groups/index.html | 6 +- .../index.html | 6 +- started/before_you_get_started/index.html | 6 +- .../concepts/accounting_and_quota/index.html | 6 +- .../file_dataset_container/index.html | 6 +- .../concepts/metadata_attributes/index.html | 6 +- started/concepts/notifications/index.html | 6 +- started/concepts/permission_model/index.html | 6 +- .../concepts/replica_management/index.html | 6 +- started/concepts/replica_workflow/index.html | 6 +- .../replication_rules_examples/index.html | 6 +- started/concepts/rse_expressions/index.html | 6 +- started/concepts/rucio_account/index.html | 6 +- .../concepts/rucio_storage_element/index.html | 6 +- started/concepts/subscriptions/index.html | 6 +- started/daemons/index.html | 6 +- started/main_components/index.html | 6 +- started/releasepolicy/index.html | 6 +- started/requirements/index.html | 6 +- started/what_is_rucio/index.html | 6 +- user/configuring_the_client/index.html | 6 +- user/developing_with_rucio/index.html | 6 +- user/setting_up_the_rucio_client/index.html | 6 +- user/using_the_admin_client/index.html | 6 +- user/using_the_client/index.html | 6 +- yaml/rest_api_doc_spec.yaml | 1954 ++++++++--------- 622 files changed, 2306 insertions(+), 2286 deletions(-) delete mode 100644 assets/js/03a88bad.28366822.js create mode 100644 assets/js/03a88bad.d585f12a.js create mode 100644 assets/js/093ddf2f.379398f9.js delete mode 100644 assets/js/093ddf2f.7fac349a.js delete mode 100644 assets/js/0aef9821.bcf38d9c.js create mode 100644 assets/js/0aef9821.d61de1ba.js create mode 100644 assets/js/0c78ace3.c64cef6d.js delete mode 100644 assets/js/0c78ace3.c9f5c3c1.js create mode 100644 assets/js/1220bf94.286cc694.js delete mode 100644 assets/js/1220bf94.b58dc93a.js delete mode 100644 assets/js/138181e0.0287dff2.js create mode 100644 assets/js/138181e0.76599c35.js delete mode 100644 assets/js/16a6bed5.5fe84808.js create mode 100644 assets/js/16a6bed5.9e4c26ff.js create mode 100644 assets/js/1705cd3e.09d2b1b8.js delete mode 100644 assets/js/1705cd3e.e564c3e7.js delete mode 100644 assets/js/171dad78.1b83b3ab.js create mode 100644 assets/js/171dad78.8cdfdfb4.js create mode 100644 assets/js/1a726a41.e19f7c47.js delete mode 100644 assets/js/1a726a41.f926c85c.js delete mode 100644 assets/js/1ae78d49.2bc92216.js create mode 100644 assets/js/1ae78d49.40c39d80.js delete mode 100644 assets/js/1b18b8b2.1da8b5ae.js create mode 100644 assets/js/1b18b8b2.79a3d46e.js delete mode 100644 assets/js/1baa3d0c.e4dea5c2.js create mode 100644 assets/js/1baa3d0c.ff6f16b9.js create mode 100644 assets/js/1f6323a9.52121db8.js delete mode 100644 assets/js/1f6323a9.621bd53f.js create mode 100644 assets/js/1f6484bf.8a08af6e.js delete mode 100644 assets/js/1f6484bf.c3ddfcb7.js create mode 100644 assets/js/26c807fc.b53652d7.js delete mode 100644 assets/js/26c807fc.e121bfc2.js delete mode 100644 assets/js/31b36657.e036b0f1.js create mode 100644 assets/js/31b36657.f84575a4.js create mode 100644 assets/js/3c621cea.b8045bd4.js delete mode 100644 assets/js/3c621cea.f1eec229.js delete mode 100644 assets/js/3e04ff1b.67d4ed39.js create mode 100644 assets/js/3e04ff1b.e46ec295.js delete mode 100644 assets/js/46c53b39.2c420eb9.js create mode 100644 assets/js/46c53b39.6ea7e8a0.js delete mode 100644 assets/js/49aea3c1.16d4f42f.js create mode 100644 assets/js/49aea3c1.4cd35d0d.js delete mode 100644 assets/js/4b43413c.91f401b6.js create mode 100644 assets/js/4b43413c.9e2e278f.js delete mode 100644 assets/js/4dae639c.921d2a00.js create mode 100644 assets/js/4dae639c.d2ea5709.js delete mode 100644 assets/js/5a310bfb.4dce21e6.js create mode 100644 assets/js/5a310bfb.d89d1a01.js create mode 100644 assets/js/5a5d0baa.1f882012.js delete mode 100644 assets/js/5a5d0baa.f304d9f4.js delete mode 100644 assets/js/5d96f1d3.81511df5.js create mode 100644 assets/js/5d96f1d3.e921a0bb.js create mode 100644 assets/js/61c44338.93775d62.js delete mode 100644 assets/js/61c44338.e1cd39d2.js create mode 100644 assets/js/641fb65d.a36fc77b.js delete mode 100644 assets/js/641fb65d.c101240c.js create mode 100644 assets/js/64778c2e.b54f8c47.js delete mode 100644 assets/js/64778c2e.fa9e523b.js create mode 100644 assets/js/6530bd8c.351dea10.js delete mode 100644 assets/js/6530bd8c.b8c0ba80.js create mode 100644 assets/js/65d5ae35.13cca70b.js delete mode 100644 assets/js/65d5ae35.e91a3192.js delete mode 100644 assets/js/68a6ce58.5b291b6d.js create mode 100644 assets/js/68a6ce58.5c3d785f.js create mode 100644 assets/js/6998db83.192aadac.js delete mode 100644 assets/js/6998db83.40612748.js create mode 100644 assets/js/6a365d02.ea8b94c5.js delete mode 100644 assets/js/6a365d02.fb93a420.js delete mode 100644 assets/js/6e97e9ae.09234901.js create mode 100644 assets/js/6e97e9ae.753dbd84.js create mode 100644 assets/js/754bb2f2.17c82ec7.js delete mode 100644 assets/js/754bb2f2.81230c0f.js create mode 100644 assets/js/84743230.257af96d.js delete mode 100644 assets/js/84743230.85da485f.js create mode 100644 assets/js/88ee25e8.9f518d59.js delete mode 100644 assets/js/88ee25e8.faeccf4b.js create mode 100644 assets/js/89d2be03.057facd1.js delete mode 100644 assets/js/89d2be03.79f757df.js create mode 100644 assets/js/8dadf37b.7a47799c.js delete mode 100644 assets/js/8dadf37b.ee1cf979.js create mode 100644 assets/js/8df61e40.0e878f08.js delete mode 100644 assets/js/8df61e40.edacb8ca.js delete mode 100644 assets/js/90fd0081.6913ff13.js create mode 100644 assets/js/90fd0081.d93a69bd.js delete mode 100644 assets/js/93b9e5e5.094eb0ac.js create mode 100644 assets/js/93b9e5e5.a9091abd.js create mode 100644 assets/js/a3f525c1.781650a7.js delete mode 100644 assets/js/a3f525c1.c71eacbf.js create mode 100644 assets/js/aca47106.1edef0c5.js delete mode 100644 assets/js/aca47106.6820cbc6.js delete mode 100644 assets/js/ad1c34e1.ac4cbd90.js create mode 100644 assets/js/ad1c34e1.b7c087b2.js create mode 100644 assets/js/af2db750.59b8870e.js delete mode 100644 assets/js/af2db750.68f9df9c.js delete mode 100644 assets/js/b080ce4d.b016e9d7.js create mode 100644 assets/js/b080ce4d.e8a3b4f3.js delete mode 100644 assets/js/b0e04a76.ccfc8a5e.js create mode 100644 assets/js/b0e04a76.ded87bf1.js create mode 100644 assets/js/b829f644.265e2f08.js delete mode 100644 assets/js/b829f644.acaafb33.js create mode 100644 assets/js/bc02b268.0148e676.js delete mode 100644 assets/js/bc02b268.1e6e50af.js delete mode 100644 assets/js/bca094e1.be9716aa.js create mode 100644 assets/js/bca094e1.e48d3fc2.js create mode 100644 assets/js/c09fddfc.4ca46eaa.js delete mode 100644 assets/js/c09fddfc.c9ea88fa.js delete mode 100644 assets/js/c0dfaf66.1eaebdca.js create mode 100644 assets/js/c0dfaf66.99eeac0b.js create mode 100644 assets/js/c671c501.1daf3bad.js delete mode 100644 assets/js/c671c501.49bf1a79.js create mode 100644 assets/js/c71713af.b56ad583.js delete mode 100644 assets/js/c975ff2c.e1d75169.js create mode 100644 assets/js/c975ff2c.e33d3efb.js create mode 100644 assets/js/d2127834.06bfd6d6.js delete mode 100644 assets/js/d2127834.1121262e.js delete mode 100644 assets/js/d31db992.171d6e5d.js create mode 100644 assets/js/d31db992.22bb4084.js create mode 100644 assets/js/d472238c.a0ac2b98.js delete mode 100644 assets/js/d472238c.bb538d7a.js delete mode 100644 assets/js/d6025e9f.4487eb0e.js create mode 100644 assets/js/d6025e9f.8a87530b.js delete mode 100644 assets/js/d6ce5df9.274f9428.js create mode 100644 assets/js/d6ce5df9.b9310b51.js rename assets/js/{d918b43d.b2f3ab88.js => d918b43d.78c4c61c.js} (85%) delete mode 100644 assets/js/db4eceea.06c9ed37.js create mode 100644 assets/js/db4eceea.290abe11.js delete mode 100644 assets/js/e114bd53.3e2ab3fd.js create mode 100644 assets/js/e114bd53.c050b4ce.js create mode 100644 assets/js/e7f8a1a7.a2fde79b.js delete mode 100644 assets/js/e7f8a1a7.b419a781.js delete mode 100644 assets/js/eb73b352.041bed6b.js create mode 100644 assets/js/eb73b352.eef991c3.js create mode 100644 assets/js/ecfe08ed.8ee19090.js delete mode 100644 assets/js/ecfe08ed.d1490bec.js delete mode 100644 assets/js/f1846c1f.b6a5ffb1.js create mode 100644 assets/js/f1846c1f.d00d8396.js delete mode 100644 assets/js/f4c0b6c3.2c9be0f0.js create mode 100644 assets/js/f4c0b6c3.392561c5.js delete mode 100644 assets/js/f664dab4.4066c8c3.js create mode 100644 assets/js/f664dab4.9d29700c.js delete mode 100644 assets/js/f7637249.ac7514f8.js create mode 100644 assets/js/f7637249.db7a1032.js create mode 100644 assets/js/main.a559a5fc.js rename assets/js/{main.bf4192f6.js.LICENSE.txt => main.a559a5fc.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.bf4192f6.js create mode 100644 assets/js/runtime~main.1d7bc27d.js delete mode 100644 assets/js/runtime~main.c0b1c4b0.js create mode 100644 release-notes/32.8.4/index.html diff --git a/404.html b/404.html index 38ba7d19bf..a06aea4574 100644 --- a/404.html +++ b/404.html @@ -9,8 +9,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/about_our_contributors/index.html b/about_our_contributors/index.html index 3adb6d30d2..2955c09037 100644 --- a/about_our_contributors/index.html +++ b/about_our_contributors/index.html @@ -9,8 +9,8 @@ - - + +
Skip to main content

Below is a list of contibutors who have contributed to the @@ -106,6 +106,6 @@

Organisations employing contributors

  • Institut Teknologi Bandung (Indonesia)
  • Universität Hamburg (Germany)
  • Brazilian Center for Research in Physics (Brazil)
  • -
    + \ No newline at end of file diff --git a/assets/js/03a88bad.28366822.js b/assets/js/03a88bad.28366822.js deleted file mode 100644 index cb881fb981..0000000000 --- a/assets/js/03a88bad.28366822.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8078],{57699:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"index","title":"Welcome to Rucio\'s documentation","description":"Rucio is a project that provides services and associated libraries for allowing","source":"@site/../docs/index.md","sourceDirName":".","slug":"/","permalink":"/documentation/","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/index.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"index","title":"Welcome to Rucio\'s documentation","sidebar_label":"Welcome","slug":"/"},"sidebar":"docs","next":{"title":"Before you get started","permalink":"/documentation/started/before_you_get_started"}}');var o=n(74848),s=n(28453);const r={id:"index",title:"Welcome to Rucio's documentation",sidebar_label:"Welcome",slug:"/"},a=void 0,c={},l=[{value:"Getting Started",id:"getting-started",level:2},{value:"Client",id:"client",level:2},{value:"Administration",id:"administration",level:2},{value:"Developer Documentation",id:"developer-documentation",level:2},{value:"Contributing to the Documentation",id:"contributing-to-the-documentation",level:2},{value:"About Us",id:"about-us",level:2}];function d(e){const t={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["Rucio is a project that provides services and associated libraries for allowing\nscientific collaborations to manage large volumes of data spread across\nfacilities at multiple institutions and organisations. Rucio was originally\ndeveloped to meet the requirements of the high-energy physics experiment\n",(0,o.jsx)(t.a,{href:"https://atlas.cern/",children:"ATLAS"}),", and now is continuously extended to support the\nLHC experiments and other diverse scientific communities."]}),"\n",(0,o.jsx)(t.p,{children:"Rucio offers advanced features, is highly scalable, and modular. It is a data\nmanagement solution that covers the needs of different communities in the\nscientific domain (e.g., HEP, astronomy, biology)."}),"\n",(0,o.jsx)(t.p,{children:"Below are some resources to help you get you started on your journey."}),"\n",(0,o.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,o.jsx)(t.p,{children:"What exactly is Rucio? What were the motivations behind developing such a\nsystem? Who uses it? What powers these systems? Answers to all these questions\nand more can be found by browsing through the sub-sections of this topic."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional Layers and Resources"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/daemons",children:"About Rucio Daemons"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"client",children:"Client"}),"\n",(0,o.jsx)(t.p,{children:"The rucio client enables users to interact with the system and access the\ndistributed data. The client can upload, download, manage and delete everything\nfrom single files up to Petabyte sized datasets."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/user/setting_up_the_rucio_client",children:"Setting Up the Rucio Client"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/user/using_the_client",children:"Using the Client"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/user/using_the_admin_client",children:"Using the Admin Client"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"administration",children:"Administration"}),"\n",(0,o.jsx)(t.p,{children:"This section of the documentation deals with some of the material that an\noperator or administrator of a Rucio environment would require. For example, how\nto install a server or some quick tips for working with the administrative\nCLI. Take a deep dive, but not before you ensure you've read through the\npre-requisites section under each of the topics!"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/setting_up_demo",children:"Setting up a Rucio demo environment"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/installing_server",children:"Installing Rucio Server"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/installing_daemons",children:"Installing Rucio Daemons"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/monitoring",children:"Monitoring"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"operator/database",children:"Database"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/configuration_parameters",children:"Configuration parameters"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"developer-documentation",children:"Developer Documentation"}),"\n",(0,o.jsx)(t.p,{children:"Whether you want to develop with Rucio or contribute to the project, the\nDeveloper documentation will help you get started. Peruse some common REST API &\nClient API references that are directly derived from Rucio's python\nlibraries. We also have a contribution guide for those who wish to pitch in."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"pathname:///html/site/client.html",children:"Client API Documentation"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"pathname:///html/rest_api_doc.html",children:"REST API Documentation"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"contributing",children:"Contributing guide"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"contributing-to-the-documentation",children:"Contributing to the Documentation"}),"\n",(0,o.jsxs)(t.p,{children:["Documentation is always a work in progress and we welcome both, qualitative and\ntechnical contributions, from the community. Make sure you look into the\n",(0,o.jsx)(t.a,{href:"https://github.com/rucio/documentation",children:"documentations GitHub repository"})," and\nunderstand the pre-requisites before you submit your first PR!"]}),"\n",(0,o.jsx)(t.h2,{id:"about-us",children:"About Us"}),"\n",(0,o.jsxs)(t.p,{children:["Learn more about the brilliant minds pioneering the development and maintenance\nof Rucio in this section. Should you wish to get in touch with us, we've also\nincluded several ways of doing so in the ",(0,o.jsx)(t.strong,{children:"Contact Us"})," section."]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/project_organisation",children:"Project Organisation"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/about_our_contributors",children:"About Our Contributors"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/contact_us",children:"Contact Us"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03a88bad.d585f12a.js b/assets/js/03a88bad.d585f12a.js new file mode 100644 index 0000000000..1e0df488d7 --- /dev/null +++ b/assets/js/03a88bad.d585f12a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8078],{57699:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"index","title":"Welcome to Rucio\'s documentation","description":"Rucio is a project that provides services and associated libraries for allowing","source":"@site/../docs/index.md","sourceDirName":".","slug":"/","permalink":"/documentation/","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/index.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"index","title":"Welcome to Rucio\'s documentation","sidebar_label":"Welcome","slug":"/"},"sidebar":"docs","next":{"title":"Before you get started","permalink":"/documentation/started/before_you_get_started"}}');var o=n(74848),s=n(28453);const r={id:"index",title:"Welcome to Rucio's documentation",sidebar_label:"Welcome",slug:"/"},a=void 0,c={},l=[{value:"Getting Started",id:"getting-started",level:2},{value:"Client",id:"client",level:2},{value:"Administration",id:"administration",level:2},{value:"Developer Documentation",id:"developer-documentation",level:2},{value:"Contributing to the Documentation",id:"contributing-to-the-documentation",level:2},{value:"About Us",id:"about-us",level:2}];function d(e){const t={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["Rucio is a project that provides services and associated libraries for allowing\nscientific collaborations to manage large volumes of data spread across\nfacilities at multiple institutions and organisations. Rucio was originally\ndeveloped to meet the requirements of the high-energy physics experiment\n",(0,o.jsx)(t.a,{href:"https://atlas.cern/",children:"ATLAS"}),", and now is continuously extended to support the\nLHC experiments and other diverse scientific communities."]}),"\n",(0,o.jsx)(t.p,{children:"Rucio offers advanced features, is highly scalable, and modular. It is a data\nmanagement solution that covers the needs of different communities in the\nscientific domain (e.g., HEP, astronomy, biology)."}),"\n",(0,o.jsx)(t.p,{children:"Below are some resources to help you get you started on your journey."}),"\n",(0,o.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,o.jsx)(t.p,{children:"What exactly is Rucio? What were the motivations behind developing such a\nsystem? Who uses it? What powers these systems? Answers to all these questions\nand more can be found by browsing through the sub-sections of this topic."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional Layers and Resources"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/started/daemons",children:"About Rucio Daemons"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"client",children:"Client"}),"\n",(0,o.jsx)(t.p,{children:"The rucio client enables users to interact with the system and access the\ndistributed data. The client can upload, download, manage and delete everything\nfrom single files up to Petabyte sized datasets."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/user/setting_up_the_rucio_client",children:"Setting Up the Rucio Client"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/user/using_the_client",children:"Using the Client"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/user/using_the_admin_client",children:"Using the Admin Client"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"administration",children:"Administration"}),"\n",(0,o.jsx)(t.p,{children:"This section of the documentation deals with some of the material that an\noperator or administrator of a Rucio environment would require. For example, how\nto install a server or some quick tips for working with the administrative\nCLI. Take a deep dive, but not before you ensure you've read through the\npre-requisites section under each of the topics!"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/setting_up_demo",children:"Setting up a Rucio demo environment"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/installing_server",children:"Installing Rucio Server"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/installing_daemons",children:"Installing Rucio Daemons"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/monitoring",children:"Monitoring"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"operator/database",children:"Database"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/operator/configuration_parameters",children:"Configuration parameters"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"developer-documentation",children:"Developer Documentation"}),"\n",(0,o.jsx)(t.p,{children:"Whether you want to develop with Rucio or contribute to the project, the\nDeveloper documentation will help you get started. Peruse some common REST API &\nClient API references that are directly derived from Rucio's python\nlibraries. We also have a contribution guide for those who wish to pitch in."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"pathname:///html/site/client.html",children:"Client API Documentation"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"pathname:///html/rest_api_doc.html",children:"REST API Documentation"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"contributing",children:"Contributing guide"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"contributing-to-the-documentation",children:"Contributing to the Documentation"}),"\n",(0,o.jsxs)(t.p,{children:["Documentation is always a work in progress and we welcome both, qualitative and\ntechnical contributions, from the community. Make sure you look into the\n",(0,o.jsx)(t.a,{href:"https://github.com/rucio/documentation",children:"documentations GitHub repository"})," and\nunderstand the pre-requisites before you submit your first PR!"]}),"\n",(0,o.jsx)(t.h2,{id:"about-us",children:"About Us"}),"\n",(0,o.jsxs)(t.p,{children:["Learn more about the brilliant minds pioneering the development and maintenance\nof Rucio in this section. Should you wish to get in touch with us, we've also\nincluded several ways of doing so in the ",(0,o.jsx)(t.strong,{children:"Contact Us"})," section."]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/project_organisation",children:"Project Organisation"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/about_our_contributors",children:"About Our Contributors"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/documentation/contact_us",children:"Contact Us"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/093ddf2f.379398f9.js b/assets/js/093ddf2f.379398f9.js new file mode 100644 index 0000000000..5ab5eebe83 --- /dev/null +++ b/assets/js/093ddf2f.379398f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2985],{14817:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"special_interest_groups","title":"Special Interest Groups","description":"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,","source":"@site/../docs/special_interest_groups.md","sourceDirName":".","slug":"/special_interest_groups","permalink":"/documentation/special_interest_groups","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/special_interest_groups.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"special_interest_groups","title":"Special Interest Groups"},"sidebar":"docs","previous":{"title":"Component leads","permalink":"/documentation/component_leads"},"next":{"title":"About Our Contributors","permalink":"/documentation/about_our_contributors"}}');var s=n(74848),i=n(28453);const o={id:"special_interest_groups",title:"Special Interest Groups"},c=void 0,l={},d=[{value:"Structure",id:"structure",level:2},{value:"Current Special Interest Groups",id:"current-special-interest-groups",level:2},{value:"Past Special Interest Groups",id:"past-special-interest-groups",level:2}];function a(e){const t={a:"a",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,s.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,s.jsx)(t.p,{children:"Each SIG must define"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"A well-defined objective of the group (Creation of a report, Development of\na functionality, ...)"}),"\n",(0,s.jsx)(t.li,{children:"An expected end-date"}),"\n",(0,s.jsx)(t.li,{children:"Means to achieve the objective, such as regular meetings, a mailing-list, mattermost\nchannel, a workshop, ..."}),"\n",(0,s.jsx)(t.li,{children:"A convener"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"current-special-interest-groups",children:"Current Special Interest Groups"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Start"}),(0,s.jsx)(t.th,{children:"est. End"}),(0,s.jsx)(t.th,{children:"Convener"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/documentation/sig_metadata",children:"Metadata"})}),(0,s.jsx)(t.td,{children:"Jul-2021"}),(0,s.jsx)(t.td,{children:"Dec-2024"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/robbarnsley",children:"Rob Barnsley"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/documentation/sig_tokens",children:"Tokens"})}),(0,s.jsx)(t.td,{children:"Sep-2023"}),(0,s.jsx)(t.td,{children:"Mar-2026"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/dchristidis",children:"Dimitrios Christidis"})})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"past-special-interest-groups",children:"Past Special Interest Groups"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Start"}),(0,s.jsx)(t.th,{children:"End"}),(0,s.jsx)(t.th,{children:"Convener"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/documentation/sig_qualityofservice",children:"Quality of Service"})}),(0,s.jsx)(t.td,{children:"Jul-2021"}),(0,s.jsx)(t.td,{children:"Dec-2023"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"mailto:douglas.benjamin@cern.ch",children:"Doug Benjamin"})})]})})]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(96540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/093ddf2f.7fac349a.js b/assets/js/093ddf2f.7fac349a.js deleted file mode 100644 index 70cad1dada..0000000000 --- a/assets/js/093ddf2f.7fac349a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2985],{14817:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"special_interest_groups","title":"Special Interest Groups","description":"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,","source":"@site/../docs/special_interest_groups.md","sourceDirName":".","slug":"/special_interest_groups","permalink":"/documentation/special_interest_groups","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/special_interest_groups.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"special_interest_groups","title":"Special Interest Groups"},"sidebar":"docs","previous":{"title":"Component leads","permalink":"/documentation/component_leads"},"next":{"title":"About Our Contributors","permalink":"/documentation/about_our_contributors"}}');var s=n(74848),i=n(28453);const o={id:"special_interest_groups",title:"Special Interest Groups"},c=void 0,l={},d=[{value:"Structure",id:"structure",level:2},{value:"Current Special Interest Groups",id:"current-special-interest-groups",level:2},{value:"Past Special Interest Groups",id:"past-special-interest-groups",level:2}];function a(e){const t={a:"a",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,s.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,s.jsx)(t.p,{children:"Each SIG must define"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"A well-defined objective of the group (Creation of a report, Development of\na functionality, ...)"}),"\n",(0,s.jsx)(t.li,{children:"An expected end-date"}),"\n",(0,s.jsx)(t.li,{children:"Means to achieve the objective, such as regular meetings, a mailing-list, mattermost\nchannel, a workshop, ..."}),"\n",(0,s.jsx)(t.li,{children:"A convener"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"current-special-interest-groups",children:"Current Special Interest Groups"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Start"}),(0,s.jsx)(t.th,{children:"est. End"}),(0,s.jsx)(t.th,{children:"Convener"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/documentation/sig_metadata",children:"Metadata"})}),(0,s.jsx)(t.td,{children:"Jul-2021"}),(0,s.jsx)(t.td,{children:"Dec-2024"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/robbarnsley",children:"Rob Barnsley"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/documentation/sig_tokens",children:"Tokens"})}),(0,s.jsx)(t.td,{children:"Sep-2023"}),(0,s.jsx)(t.td,{children:"Mar-2026"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/dchristidis",children:"Dimitrios Christidis"})})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"past-special-interest-groups",children:"Past Special Interest Groups"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Name"}),(0,s.jsx)(t.th,{children:"Start"}),(0,s.jsx)(t.th,{children:"End"}),(0,s.jsx)(t.th,{children:"Convener"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/documentation/sig_qualityofservice",children:"Quality of Service"})}),(0,s.jsx)(t.td,{children:"Jul-2021"}),(0,s.jsx)(t.td,{children:"Dec-2023"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"mailto:douglas.benjamin@cern.ch",children:"Doug Benjamin"})})]})})]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(96540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0aef9821.bcf38d9c.js b/assets/js/0aef9821.bcf38d9c.js deleted file mode 100644 index c81c8a0d60..0000000000 --- a/assets/js/0aef9821.bcf38d9c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[3103],{51602:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"started/concepts/rucio_storage_element","title":"Rucio Storage Element","description":"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for","source":"@site/../docs/started/concepts/rucio_storage_element.md","sourceDirName":"started/concepts","slug":"/started/concepts/rucio_storage_element","permalink":"/documentation/started/concepts/rucio_storage_element","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/rucio_storage_element.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"title":"Rucio Storage Element"},"sidebar":"docs","previous":{"title":"Files, Datasets, and Containers","permalink":"/documentation/started/concepts/file_dataset_container"},"next":{"title":"Metadata attributes","permalink":"/documentation/started/concepts/metadata_attributes"}}');var a=n(74848),o=n(28453);const i={title:"Rucio Storage Element"},r=void 0,c={},l=[{value:"Rucio Cache RSE",id:"rucio-cache-rse",level:2},{value:"Distances between RSEs",id:"distances-between-rses",level:2}];function d(e){const t={a:"a",h2:"h2",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for\nphysical files. It is the smallest unit of storage space addressable within\nRucio. It has a unique identifier and a set of meta attributes describing\nproperties such as supported protocols (https, srm, s3, ...), host/port\naddress, quality of service, storage type (disk, tape, ...), physical space\nproperties (used-, available-, non-pledged space), and geographical zone."}),"\n",(0,a.jsxs)(t.p,{children:["Rucio Storage Elements can be grouped in many logical ways, e.g. the UK RSEs,\nthe Tier-1 RSEs, or the 'good' RSEs. One can reference groups of RSEs by\nmetadata attributes or by explicit enumeration of RSEs. See the section about\n",(0,a.jsx)(t.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expressions"})," for more information."]}),"\n",(0,a.jsx)(t.p,{children:"RSE tags are expanded at transfer time to enumerate target sites. Post-facto\nchanges to the sites in an RSE tag list will not affect currently replicated\nfiles."}),"\n",(0,a.jsx)(t.h2,{id:"rucio-cache-rse",children:"Rucio Cache RSE"}),"\n",(0,a.jsxs)(t.p,{children:["A cache is storage service which keeps additional copies of files to reduce\nresponse time and bandwidth usage. In Rucio, a cache is an RSE, tagged as\nvolatile. The control of the cache content is usually handled by an external\nprocess or applications (e.g. the Workflow management systems) and not by\nRucio. Thus, as Rucio doesn't control all file movements on these RSEs, the\napplication populating the cache must register and unregister these file\nreplicas in Rucio. The information about replica location on volatile RSEs can\nhave a lifetime. Replicas registered on volatile RSEs are excluded from the\nRucio replica management system (replication rules, quota, replication locks)\ndescribed in the section ",(0,a.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"Replica management"}),". Explicit\ntransfer requests can be made to Rucio in order to populate the cache."]}),"\n",(0,a.jsx)(t.h2,{id:"distances-between-rses",children:"Distances between RSEs"}),"\n",(0,a.jsxs)(t.p,{children:["When configuring transfers between RSEs, distances must be defined for that link.\nDistances are unidirectional. To allow transfers in both directions, a distance\nhas to be defined separately in each direction. Refer to the section\n",(0,a.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-overview",children:"Transfers Overview"})," for more details."]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var s=n(96540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0aef9821.d61de1ba.js b/assets/js/0aef9821.d61de1ba.js new file mode 100644 index 0000000000..89193b4cd3 --- /dev/null +++ b/assets/js/0aef9821.d61de1ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[3103],{51602:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"started/concepts/rucio_storage_element","title":"Rucio Storage Element","description":"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for","source":"@site/../docs/started/concepts/rucio_storage_element.md","sourceDirName":"started/concepts","slug":"/started/concepts/rucio_storage_element","permalink":"/documentation/started/concepts/rucio_storage_element","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/rucio_storage_element.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"title":"Rucio Storage Element"},"sidebar":"docs","previous":{"title":"Files, Datasets, and Containers","permalink":"/documentation/started/concepts/file_dataset_container"},"next":{"title":"Metadata attributes","permalink":"/documentation/started/concepts/metadata_attributes"}}');var a=n(74848),o=n(28453);const i={title:"Rucio Storage Element"},r=void 0,c={},l=[{value:"Rucio Cache RSE",id:"rucio-cache-rse",level:2},{value:"Distances between RSEs",id:"distances-between-rses",level:2}];function d(e){const t={a:"a",h2:"h2",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for\nphysical files. It is the smallest unit of storage space addressable within\nRucio. It has a unique identifier and a set of meta attributes describing\nproperties such as supported protocols (https, srm, s3, ...), host/port\naddress, quality of service, storage type (disk, tape, ...), physical space\nproperties (used-, available-, non-pledged space), and geographical zone."}),"\n",(0,a.jsxs)(t.p,{children:["Rucio Storage Elements can be grouped in many logical ways, e.g. the UK RSEs,\nthe Tier-1 RSEs, or the 'good' RSEs. One can reference groups of RSEs by\nmetadata attributes or by explicit enumeration of RSEs. See the section about\n",(0,a.jsx)(t.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expressions"})," for more information."]}),"\n",(0,a.jsx)(t.p,{children:"RSE tags are expanded at transfer time to enumerate target sites. Post-facto\nchanges to the sites in an RSE tag list will not affect currently replicated\nfiles."}),"\n",(0,a.jsx)(t.h2,{id:"rucio-cache-rse",children:"Rucio Cache RSE"}),"\n",(0,a.jsxs)(t.p,{children:["A cache is storage service which keeps additional copies of files to reduce\nresponse time and bandwidth usage. In Rucio, a cache is an RSE, tagged as\nvolatile. The control of the cache content is usually handled by an external\nprocess or applications (e.g. the Workflow management systems) and not by\nRucio. Thus, as Rucio doesn't control all file movements on these RSEs, the\napplication populating the cache must register and unregister these file\nreplicas in Rucio. The information about replica location on volatile RSEs can\nhave a lifetime. Replicas registered on volatile RSEs are excluded from the\nRucio replica management system (replication rules, quota, replication locks)\ndescribed in the section ",(0,a.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"Replica management"}),". Explicit\ntransfer requests can be made to Rucio in order to populate the cache."]}),"\n",(0,a.jsx)(t.h2,{id:"distances-between-rses",children:"Distances between RSEs"}),"\n",(0,a.jsxs)(t.p,{children:["When configuring transfers between RSEs, distances must be defined for that link.\nDistances are unidirectional. To allow transfers in both directions, a distance\nhas to be defined separately in each direction. Refer to the section\n",(0,a.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-overview",children:"Transfers Overview"})," for more details."]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var s=n(96540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c78ace3.c64cef6d.js b/assets/js/0c78ace3.c64cef6d.js new file mode 100644 index 0000000000..53d0c69cee --- /dev/null +++ b/assets/js/0c78ace3.c64cef6d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4885],{94178:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"developer/webui/webui_frontend_vscode_dev_env","title":"Setting up a WebUI Developer Environment using Visual Studio Code","description":"Different Usecases","source":"@site/../docs/developer/webui/webui_frontend_vscode_dev_env.md","sourceDirName":"developer/webui","slug":"/developer/webui/webui_frontend_vscode_dev_env","permalink":"/documentation/developer/webui/webui_frontend_vscode_dev_env","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/webui_frontend_vscode_dev_env.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"webui_frontend_vscode_dev_env","title":"Setting up a WebUI Developer Environment using Visual Studio Code"},"sidebar":"docs","previous":{"title":"Style Guide","permalink":"/documentation/developer/dev_style_guide"},"next":{"title":"Using the WebUI StreamedTable Component","permalink":"/documentation/developer/webui/streamedtables"}}');var i=o(74848),s=o(28453);const r={id:"webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code"},c=void 0,d={},l=[{value:"Different Usecases",id:"different-usecases",level:2},{value:"UI Only",id:"ui-only",level:2},{value:"Connecting to a Rucio instance",id:"connecting-to-a-rucio-instance",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"different-usecases",children:"Different Usecases"}),"\n",(0,i.jsx)(n.p,{children:"There are different usecases when developing for the WebUI, this leads to\nvarying requirements for the development environment. This guide will cover two\nusecases:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"UI development only (i.e. using Storybook)."}),"\n",(0,i.jsx)(n.li,{children:"Full WebUI development, requiring the connection to a Rucio server."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:'In both cases, the proposed development environment is run fully local. Visual\nStudio Code is more than just an editor, and we attempt to make use of its "Dev\nContainer"-tooling as much as possible.'}),"\n",(0,i.jsx)(n.h2,{id:"ui-only",children:"UI Only"}),"\n",(0,i.jsxs)(n.p,{children:["Remember that the WebUI frontend is composed of ",(0,i.jsx)(n.em,{children:"Components"}),", which are\ndeveloped with the help of a tool called ",(0,i.jsx)(n.a,{href:"https://storybook.js.org/",children:"Storybook"}),'.\nStorybook is, in its own words, a "frontend workshop for building UI components\nand pages in isolation". To us, it is a viewer which allows us to inspect\nindividual components and interactively manipulate the inputs to these\ncomponents. An example would be viewing a clickable button and manipulating the\n"disabled" attribute, noticing that the colour changes from blue to gray, etc.\nStorybook is also very helpful when testing accessibility and design.']}),"\n",(0,i.jsxs)(n.p,{children:["For a developer whose only intent is to add to or edit these components (found\nunder ",(0,i.jsx)(n.code,{children:"webui/src/component-library"}),"), it is helpful to run a docker container\nwith NPM and TypeScript."]}),"\n",(0,i.jsxs)(n.p,{children:["Open the editor commands with ",(0,i.jsx)(n.code,{children:"Ctrl"}),"-",(0,i.jsx)(n.code,{children:"Shift"}),"-",(0,i.jsx)(n.code,{children:"P"})," and run ",(0,i.jsx)(n.code,{children:"Dev containers: reopen in dev container"}),". Select ",(0,i.jsx)(n.code,{children:"Node.js & Typescript"})," in the follow-up menu. Go with\nthe default values in the following menus."]}),"\n",(0,i.jsxs)(n.p,{children:["You can close the remote connection via the editor commands. From now on, you\ncan reopen the same dev container by opening the folder locally and selecting\n",(0,i.jsx)(n.code,{children:"reopen in dev container"})," from the editor commands. You can also directly open\nthe folder in the dev container, for example using ",(0,i.jsx)(n.code,{children:"File"})," > ",(0,i.jsx)(n.code,{children:"Open Recent"})," and\nthen selecting an element such as ",(0,i.jsx)(n.code,{children:"~/foo/bar [Dev Container]"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"It makes sense to install some extensions for a better dev experience:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Tailwind CSS Intellisense"}),"\n",(0,i.jsx)(n.li,{children:"ESLint"}),"\n",(0,i.jsx)(n.li,{children:"Jest"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"These extensions are specific to the project at hand. Of course, extensions such\nas Github Copilot and GitLens are still helpful."}),"\n",(0,i.jsxs)(n.p,{children:["An further extension that is extremely important is ",(0,i.jsx)(n.em,{children:"Run on Save"})," by\nemeraldwalk. This will need to be configured: enter the settings with ",(0,i.jsx)(n.code,{children:"Ctrl"}),"-",(0,i.jsx)(n.code,{children:","}),"\nand search ",(0,i.jsx)(n.code,{children:"Emeraldwalk: Runonsave"}),". Click on ",(0,i.jsx)(n.code,{children:"Edit in settings.json"}),". Add the\nfollowing configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'"emeraldwalk.runonsave": {\n "commands": [\n {\n "match": "\\\\.tsx$",\n "cmd": "npm run build-tailwind"\n }\n ]\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["to ensure that the ",(0,i.jsx)(n.code,{children:"build-tailwind"})," command will be run each time you save a\n",(0,i.jsx)(n.code,{children:"*.tsx"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["You can now run Storybook using ",(0,i.jsx)(n.code,{children:"npm run storybook"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-a-rucio-instance",children:"Connecting to a Rucio instance"}),"\n",(0,i.jsx)(n.p,{children:"When testing the full WebUI stack, it will be necessary to connect to a Rucio\nbackend. This can be done by running a Rucio instance locally."}),"\n",(0,i.jsx)(n.p,{children:"We begin by starting all the Docker containers required."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Start the dev container as described above."}),"\n",(0,i.jsxs)(n.li,{children:["Clone Rucio from the ",(0,i.jsx)(n.a,{href:"https://github.com/rucio/rucio",children:"Github Repository"})]}),"\n",(0,i.jsx)(n.li,{children:"Open the folder in VS Code."}),"\n",(0,i.jsxs)(n.li,{children:["Open the editor commands and run ",(0,i.jsx)(n.code,{children:"Docker Compose Up"})," and select\n",(0,i.jsx)(n.code,{children:"docker-compose-storage.yml"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Starting the docker containers using ",(0,i.jsx)(n.code,{children:"docker-compose-storage.yml"})," will also\ncreate several RSEs, DIDs, etc. on the rucio instance which are quite helpful\nwhen running tests."]})}),"\n",(0,i.jsx)(n.p,{children:"We must now connect the dev container to the rucio container network."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Figure out the docker name of the dev container. Run ",(0,i.jsx)(n.code,{children:"docker ps"})," and search\nfor name which does not contain the string ",(0,i.jsx)(n.code,{children:"rucio"})]}),"\n",(0,i.jsxs)(n.li,{children:["Connect using ",(0,i.jsx)(n.code,{children:"docker network connect dev_default "}),".\n",(0,i.jsx)(n.code,{children:"dev_default"})," is the name of the network shared by the docker containers spun\nup using ",(0,i.jsx)(n.code,{children:"docker-compose-storage.yml"})," from earlier."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Finally, we must change the ",(0,i.jsx)(n.code,{children:"RUCIO_AUTH_HOST"})," and ",(0,i.jsx)(n.code,{children:"RUCIO_HOST"})," in the\n",(0,i.jsx)(n.code,{children:".env.development.local"})," file at the root level of the WebUI repository to point\nto the rucio container. By default, this should be ",(0,i.jsx)(n.code,{children:"https://dev-rucio-1:443"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Test the setup by logging in using the credentials username ",(0,i.jsx)(n.code,{children:"ddmlab"}),"/ password\n",(0,i.jsx)(n.code,{children:"secret"}),"/ account ",(0,i.jsx)(n.code,{children:"root"})," under the VO ",(0,i.jsx)(n.code,{children:"Default"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c78ace3.c9f5c3c1.js b/assets/js/0c78ace3.c9f5c3c1.js deleted file mode 100644 index c8eca78ad7..0000000000 --- a/assets/js/0c78ace3.c9f5c3c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4885],{94178:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"developer/webui/webui_frontend_vscode_dev_env","title":"Setting up a WebUI Developer Environment using Visual Studio Code","description":"Different Usecases","source":"@site/../docs/developer/webui/webui_frontend_vscode_dev_env.md","sourceDirName":"developer/webui","slug":"/developer/webui/webui_frontend_vscode_dev_env","permalink":"/documentation/developer/webui/webui_frontend_vscode_dev_env","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/webui_frontend_vscode_dev_env.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"webui_frontend_vscode_dev_env","title":"Setting up a WebUI Developer Environment using Visual Studio Code"},"sidebar":"docs","previous":{"title":"Style Guide","permalink":"/documentation/developer/dev_style_guide"},"next":{"title":"Using the WebUI StreamedTable Component","permalink":"/documentation/developer/webui/streamedtables"}}');var i=o(74848),s=o(28453);const r={id:"webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code"},c=void 0,d={},l=[{value:"Different Usecases",id:"different-usecases",level:2},{value:"UI Only",id:"ui-only",level:2},{value:"Connecting to a Rucio instance",id:"connecting-to-a-rucio-instance",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"different-usecases",children:"Different Usecases"}),"\n",(0,i.jsx)(n.p,{children:"There are different usecases when developing for the WebUI, this leads to\nvarying requirements for the development environment. This guide will cover two\nusecases:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"UI development only (i.e. using Storybook)."}),"\n",(0,i.jsx)(n.li,{children:"Full WebUI development, requiring the connection to a Rucio server."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:'In both cases, the proposed development environment is run fully local. Visual\nStudio Code is more than just an editor, and we attempt to make use of its "Dev\nContainer"-tooling as much as possible.'}),"\n",(0,i.jsx)(n.h2,{id:"ui-only",children:"UI Only"}),"\n",(0,i.jsxs)(n.p,{children:["Remember that the WebUI frontend is composed of ",(0,i.jsx)(n.em,{children:"Components"}),", which are\ndeveloped with the help of a tool called ",(0,i.jsx)(n.a,{href:"https://storybook.js.org/",children:"Storybook"}),'.\nStorybook is, in its own words, a "frontend workshop for building UI components\nand pages in isolation". To us, it is a viewer which allows us to inspect\nindividual components and interactively manipulate the inputs to these\ncomponents. An example would be viewing a clickable button and manipulating the\n"disabled" attribute, noticing that the colour changes from blue to gray, etc.\nStorybook is also very helpful when testing accessibility and design.']}),"\n",(0,i.jsxs)(n.p,{children:["For a developer whose only intent is to add to or edit these components (found\nunder ",(0,i.jsx)(n.code,{children:"webui/src/component-library"}),"), it is helpful to run a docker container\nwith NPM and TypeScript."]}),"\n",(0,i.jsxs)(n.p,{children:["Open the editor commands with ",(0,i.jsx)(n.code,{children:"Ctrl"}),"-",(0,i.jsx)(n.code,{children:"Shift"}),"-",(0,i.jsx)(n.code,{children:"P"})," and run ",(0,i.jsx)(n.code,{children:"Dev containers: reopen in dev container"}),". Select ",(0,i.jsx)(n.code,{children:"Node.js & Typescript"})," in the follow-up menu. Go with\nthe default values in the following menus."]}),"\n",(0,i.jsxs)(n.p,{children:["You can close the remote connection via the editor commands. From now on, you\ncan reopen the same dev container by opening the folder locally and selecting\n",(0,i.jsx)(n.code,{children:"reopen in dev container"})," from the editor commands. You can also directly open\nthe folder in the dev container, for example using ",(0,i.jsx)(n.code,{children:"File"})," > ",(0,i.jsx)(n.code,{children:"Open Recent"})," and\nthen selecting an element such as ",(0,i.jsx)(n.code,{children:"~/foo/bar [Dev Container]"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"It makes sense to install some extensions for a better dev experience:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Tailwind CSS Intellisense"}),"\n",(0,i.jsx)(n.li,{children:"ESLint"}),"\n",(0,i.jsx)(n.li,{children:"Jest"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"These extensions are specific to the project at hand. Of course, extensions such\nas Github Copilot and GitLens are still helpful."}),"\n",(0,i.jsxs)(n.p,{children:["An further extension that is extremely important is ",(0,i.jsx)(n.em,{children:"Run on Save"})," by\nemeraldwalk. This will need to be configured: enter the settings with ",(0,i.jsx)(n.code,{children:"Ctrl"}),"-",(0,i.jsx)(n.code,{children:","}),"\nand search ",(0,i.jsx)(n.code,{children:"Emeraldwalk: Runonsave"}),". Click on ",(0,i.jsx)(n.code,{children:"Edit in settings.json"}),". Add the\nfollowing configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'"emeraldwalk.runonsave": {\n "commands": [\n {\n "match": "\\\\.tsx$",\n "cmd": "npm run build-tailwind"\n }\n ]\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["to ensure that the ",(0,i.jsx)(n.code,{children:"build-tailwind"})," command will be run each time you save a\n",(0,i.jsx)(n.code,{children:"*.tsx"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["You can now run Storybook using ",(0,i.jsx)(n.code,{children:"npm run storybook"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-a-rucio-instance",children:"Connecting to a Rucio instance"}),"\n",(0,i.jsx)(n.p,{children:"When testing the full WebUI stack, it will be necessary to connect to a Rucio\nbackend. This can be done by running a Rucio instance locally."}),"\n",(0,i.jsx)(n.p,{children:"We begin by starting all the Docker containers required."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Start the dev container as described above."}),"\n",(0,i.jsxs)(n.li,{children:["Clone Rucio from the ",(0,i.jsx)(n.a,{href:"https://github.com/rucio/rucio",children:"Github Repository"})]}),"\n",(0,i.jsx)(n.li,{children:"Open the folder in VS Code."}),"\n",(0,i.jsxs)(n.li,{children:["Open the editor commands and run ",(0,i.jsx)(n.code,{children:"Docker Compose Up"})," and select\n",(0,i.jsx)(n.code,{children:"docker-compose-storage.yml"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Starting the docker containers using ",(0,i.jsx)(n.code,{children:"docker-compose-storage.yml"})," will also\ncreate several RSEs, DIDs, etc. on the rucio instance which are quite helpful\nwhen running tests."]})}),"\n",(0,i.jsx)(n.p,{children:"We must now connect the dev container to the rucio container network."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Figure out the docker name of the dev container. Run ",(0,i.jsx)(n.code,{children:"docker ps"})," and search\nfor name which does not contain the string ",(0,i.jsx)(n.code,{children:"rucio"})]}),"\n",(0,i.jsxs)(n.li,{children:["Connect using ",(0,i.jsx)(n.code,{children:"docker network connect dev_default "}),".\n",(0,i.jsx)(n.code,{children:"dev_default"})," is the name of the network shared by the docker containers spun\nup using ",(0,i.jsx)(n.code,{children:"docker-compose-storage.yml"})," from earlier."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Finally, we must change the ",(0,i.jsx)(n.code,{children:"RUCIO_AUTH_HOST"})," and ",(0,i.jsx)(n.code,{children:"RUCIO_HOST"})," in the\n",(0,i.jsx)(n.code,{children:".env.development.local"})," file at the root level of the WebUI repository to point\nto the rucio container. By default, this should be ",(0,i.jsx)(n.code,{children:"https://dev-rucio-1:443"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Test the setup by logging in using the credentials username ",(0,i.jsx)(n.code,{children:"ddmlab"}),"/ password\n",(0,i.jsx)(n.code,{children:"secret"}),"/ account ",(0,i.jsx)(n.code,{children:"root"})," under the VO ",(0,i.jsx)(n.code,{children:"Default"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1220bf94.286cc694.js b/assets/js/1220bf94.286cc694.js new file mode 100644 index 0000000000..85bac05ed8 --- /dev/null +++ b/assets/js/1220bf94.286cc694.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2815],{8805:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"started/concepts/replica_workflow","title":"Typical Replica Workflow","description":"This section gives an overview of what happens within Rucio, for a typical","source":"@site/../docs/started/concepts/replica_workflow.md","sourceDirName":"started/concepts","slug":"/started/concepts/replica_workflow","permalink":"/documentation/started/concepts/replica_workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_workflow.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"replica_workflow","title":"Typical Replica Workflow"},"sidebar":"docs","previous":{"title":"Subscriptions","permalink":"/documentation/started/concepts/subscriptions"},"next":{"title":"Release Policy","permalink":"/documentation/started/releasepolicy"}}');var s=i(74848),a=i(28453);const r={id:"replica_workflow",title:"Typical Replica Workflow"},o=void 0,c={},d=[{value:"Replica paths on storage",id:"replica-paths-on-storage",level:2},{value:"Deterministic algorithm based on hashes",id:"deterministic-algorithm-based-on-hashes",level:2},{value:"Deterministic algorithm based on naming convention",id:"deterministic-algorithm-based-on-naming-convention",level:2},{value:"Non-Deterministic algorithm based on parent dataset",id:"non-deterministic-algorithm-based-on-parent-dataset",level:2},{value:"Replica is uploaded with the command line client",id:"replica-is-uploaded-with-the-command-line-client",level:2},{value:"Replica is created by a replication rule",id:"replica-is-created-by-a-replication-rule",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["This section gives an overview of what happens within Rucio, for a typical\nreplica workflow. Two workflows are described: When a replica is uploaded to\nRucio via a client and when a replica is created by a site to site transfer due\nto the creation of a ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"replication rule"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"replica-paths-on-storage",children:"Replica paths on storage"}),"\n",(0,s.jsxs)(t.p,{children:["Rucio has two basic paradigms in deciding the path for a replica on a specific\nstorage system. ",(0,s.jsx)(t.strong,{children:"Deterministic"})," and ",(0,s.jsx)(t.strong,{children:"Non-deterministic"})," paths. If we assume\na file whose data identifier is ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"}),", thus the scope is\n",(0,s.jsx)(t.code,{children:"user.jdoe"})," and the name is ",(0,s.jsx)(t.code,{children:"test.file.1"}),". In Rucio a deterministically created\npath is a path which can be generated solely knowing the scope and name of a\ndata identifier (Ignoring the static prefix of the storage endpoint). For a\nnon-deterministic path additional information describing the file is necessary,\nsuch as meta-data, the dataset the file belongs to, etc."]}),"\n",(0,s.jsx)(t.p,{children:"Rucio supports pluggable algorithms for both deterministic and non-deterministic\nalgorithms. This section explains a few of them."}),"\n",(0,s.jsx)(t.h2,{id:"deterministic-algorithm-based-on-hashes",children:"Deterministic algorithm based on hashes"}),"\n",(0,s.jsx)(t.p,{children:"The hash deterministic algorithm is an algorithm commonly used in Rucio. The\nadvantage of this algorithm is that, due to the characteristics of cryptographic\nhash functions, the files are evenly distributed to directories. This can be an\nimportant characteristic for storage systems whose access performance degrades\nbased on the number of files in a directory."}),"\n",(0,s.jsxs)(t.p,{children:["For a data identifier, e.g. ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"})," a md5-hashsum is calculated\n",(0,s.jsx)(t.code,{children:"077c8119053bebb168d125034bff64ac"}),". The generated path is then based on the\nfirst four characters of the hashsum. e.g. ",(0,s.jsx)(t.code,{children:"/user/jdoe/07/7c/test.file.1"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"deterministic-algorithm-based-on-naming-convention",children:"Deterministic algorithm based on naming convention"}),"\n",(0,s.jsx)(t.p,{children:"If a specific naming convention is enforced on the filenames, a possible\ndeterministic algorithm can be based on it."}),"\n",(0,s.jsxs)(t.p,{children:["For the data identifier ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"})," the first part of the filename\n(",(0,s.jsx)(t.code,{children:"test"}),") is extracted and used to generate the path: ",(0,s.jsx)(t.code,{children:"/test/user.jdoe/file.1"})]}),"\n",(0,s.jsx)(t.h2,{id:"non-deterministic-algorithm-based-on-parent-dataset",children:"Non-Deterministic algorithm based on parent dataset"}),"\n",(0,s.jsxs)(t.p,{children:["If the file is part of a dataset, e.g. ",(0,s.jsx)(t.code,{children:"data:dataset1234"})," the dataset can be\nused in the path of the filename. This is useful for e.g. tape storage systems,\nto keep the files belonging to the same dataset on the same tape."]}),"\n",(0,s.jsxs)(t.p,{children:["For the data identifier ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"})," which is part of the dataset\n",(0,s.jsx)(t.code,{children:"data:dataset1234"})," the generated path is:\n",(0,s.jsx)(t.code,{children:"/data/dataset1234/user.jdoe/test.file.1"})]}),"\n",(0,s.jsx)(t.h2,{id:"replica-is-uploaded-with-the-command-line-client",children:"Replica is uploaded with the command line client"}),"\n",(0,s.jsx)(t.p,{children:"This is a typical workflow when a user uploads multiple files, which are part of\na dataset, via the command line client."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The dataset ",(0,s.jsx)(t.code,{children:"test.dataset"})," is being registered at the server. All files, or\ndatasets are associated to a ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/file_dataset_container",children:"scope"}),", if not\nspecifically mentioned the client will assume the default scope of the user,\nsuch as ",(0,s.jsx)(t.code,{children:"user.jdoe"}),". Thus the full data identifier for the dataset is\n",(0,s.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The client queries the RSE information from the server. This not only gives a\nlist of prioritized write protocols to use but also the information if the\nRSE is a deterministic or non-deterministic one."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The file replica is registered as ",(0,s.jsx)(t.code,{children:"COPYING"})," on the RSE."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Based on the identified naming algorithm of the RSE and the list of\nprioritized write protocols, the file URL is calculated. e.g. using the hash\nalgorithm from above:\n",(0,s.jsx)(t.code,{children:"https://storageserver.organization.org/VO/data/user/jdoe/07/7c/test.file.1"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The file upload is done with the first prioritized protocol. If the upload\nfails, step 4 is repeated with the second prioritized protocol, etc."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Once the upload is successfully finished, the replica state is changed to\n",(0,s.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Step 3-6 are repeated (done in parallel) with all other files part of the\nuploaded dataset."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"replica-is-created-by-a-replication-rule",children:"Replica is created by a replication rule"}),"\n",(0,s.jsx)(t.p,{children:"This is a typical workflow if a file already exists in Rucio but the user wants\nto replicate it to a different RSE."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The user creates a replication rule for the dataset ",(0,s.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"\nat the server."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The Rucio server creates internal requests for each single file in the\ndataset and puts them in a queue to be read by the data transfer service."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The data transfer submitter picks these requests up and queries the\ndestination RSE information for each file."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Based on the identified naming algorithm of the destination RSE it creates\nthe destination URLs and creates the file replicas in ",(0,s.jsx)(t.code,{children:"COPYING"})," state."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The transfer service then submits the transfer job to the connected transfer\ntool (e.g. FTS)"}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Once the transfers are finished the transfer tool notifies Rucio about the\ntransfer success and the transfer services mark the replicas as ",(0,s.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1220bf94.b58dc93a.js b/assets/js/1220bf94.b58dc93a.js deleted file mode 100644 index 885523589f..0000000000 --- a/assets/js/1220bf94.b58dc93a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2815],{8805:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"started/concepts/replica_workflow","title":"Typical Replica Workflow","description":"This section gives an overview of what happens within Rucio, for a typical","source":"@site/../docs/started/concepts/replica_workflow.md","sourceDirName":"started/concepts","slug":"/started/concepts/replica_workflow","permalink":"/documentation/started/concepts/replica_workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_workflow.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"replica_workflow","title":"Typical Replica Workflow"},"sidebar":"docs","previous":{"title":"Subscriptions","permalink":"/documentation/started/concepts/subscriptions"},"next":{"title":"Release Policy","permalink":"/documentation/started/releasepolicy"}}');var s=i(74848),a=i(28453);const r={id:"replica_workflow",title:"Typical Replica Workflow"},o=void 0,c={},d=[{value:"Replica paths on storage",id:"replica-paths-on-storage",level:2},{value:"Deterministic algorithm based on hashes",id:"deterministic-algorithm-based-on-hashes",level:2},{value:"Deterministic algorithm based on naming convention",id:"deterministic-algorithm-based-on-naming-convention",level:2},{value:"Non-Deterministic algorithm based on parent dataset",id:"non-deterministic-algorithm-based-on-parent-dataset",level:2},{value:"Replica is uploaded with the command line client",id:"replica-is-uploaded-with-the-command-line-client",level:2},{value:"Replica is created by a replication rule",id:"replica-is-created-by-a-replication-rule",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["This section gives an overview of what happens within Rucio, for a typical\nreplica workflow. Two workflows are described: When a replica is uploaded to\nRucio via a client and when a replica is created by a site to site transfer due\nto the creation of a ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"replication rule"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"replica-paths-on-storage",children:"Replica paths on storage"}),"\n",(0,s.jsxs)(t.p,{children:["Rucio has two basic paradigms in deciding the path for a replica on a specific\nstorage system. ",(0,s.jsx)(t.strong,{children:"Deterministic"})," and ",(0,s.jsx)(t.strong,{children:"Non-deterministic"})," paths. If we assume\na file whose data identifier is ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"}),", thus the scope is\n",(0,s.jsx)(t.code,{children:"user.jdoe"})," and the name is ",(0,s.jsx)(t.code,{children:"test.file.1"}),". In Rucio a deterministically created\npath is a path which can be generated solely knowing the scope and name of a\ndata identifier (Ignoring the static prefix of the storage endpoint). For a\nnon-deterministic path additional information describing the file is necessary,\nsuch as meta-data, the dataset the file belongs to, etc."]}),"\n",(0,s.jsx)(t.p,{children:"Rucio supports pluggable algorithms for both deterministic and non-deterministic\nalgorithms. This section explains a few of them."}),"\n",(0,s.jsx)(t.h2,{id:"deterministic-algorithm-based-on-hashes",children:"Deterministic algorithm based on hashes"}),"\n",(0,s.jsx)(t.p,{children:"The hash deterministic algorithm is an algorithm commonly used in Rucio. The\nadvantage of this algorithm is that, due to the characteristics of cryptographic\nhash functions, the files are evenly distributed to directories. This can be an\nimportant characteristic for storage systems whose access performance degrades\nbased on the number of files in a directory."}),"\n",(0,s.jsxs)(t.p,{children:["For a data identifier, e.g. ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"})," a md5-hashsum is calculated\n",(0,s.jsx)(t.code,{children:"077c8119053bebb168d125034bff64ac"}),". The generated path is then based on the\nfirst four characters of the hashsum. e.g. ",(0,s.jsx)(t.code,{children:"/user/jdoe/07/7c/test.file.1"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"deterministic-algorithm-based-on-naming-convention",children:"Deterministic algorithm based on naming convention"}),"\n",(0,s.jsx)(t.p,{children:"If a specific naming convention is enforced on the filenames, a possible\ndeterministic algorithm can be based on it."}),"\n",(0,s.jsxs)(t.p,{children:["For the data identifier ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"})," the first part of the filename\n(",(0,s.jsx)(t.code,{children:"test"}),") is extracted and used to generate the path: ",(0,s.jsx)(t.code,{children:"/test/user.jdoe/file.1"})]}),"\n",(0,s.jsx)(t.h2,{id:"non-deterministic-algorithm-based-on-parent-dataset",children:"Non-Deterministic algorithm based on parent dataset"}),"\n",(0,s.jsxs)(t.p,{children:["If the file is part of a dataset, e.g. ",(0,s.jsx)(t.code,{children:"data:dataset1234"})," the dataset can be\nused in the path of the filename. This is useful for e.g. tape storage systems,\nto keep the files belonging to the same dataset on the same tape."]}),"\n",(0,s.jsxs)(t.p,{children:["For the data identifier ",(0,s.jsx)(t.code,{children:"user.jdoe:test.file.1"})," which is part of the dataset\n",(0,s.jsx)(t.code,{children:"data:dataset1234"})," the generated path is:\n",(0,s.jsx)(t.code,{children:"/data/dataset1234/user.jdoe/test.file.1"})]}),"\n",(0,s.jsx)(t.h2,{id:"replica-is-uploaded-with-the-command-line-client",children:"Replica is uploaded with the command line client"}),"\n",(0,s.jsx)(t.p,{children:"This is a typical workflow when a user uploads multiple files, which are part of\na dataset, via the command line client."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The dataset ",(0,s.jsx)(t.code,{children:"test.dataset"})," is being registered at the server. All files, or\ndatasets are associated to a ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/file_dataset_container",children:"scope"}),", if not\nspecifically mentioned the client will assume the default scope of the user,\nsuch as ",(0,s.jsx)(t.code,{children:"user.jdoe"}),". Thus the full data identifier for the dataset is\n",(0,s.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The client queries the RSE information from the server. This not only gives a\nlist of prioritized write protocols to use but also the information if the\nRSE is a deterministic or non-deterministic one."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The file replica is registered as ",(0,s.jsx)(t.code,{children:"COPYING"})," on the RSE."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Based on the identified naming algorithm of the RSE and the list of\nprioritized write protocols, the file URL is calculated. e.g. using the hash\nalgorithm from above:\n",(0,s.jsx)(t.code,{children:"https://storageserver.organization.org/VO/data/user/jdoe/07/7c/test.file.1"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The file upload is done with the first prioritized protocol. If the upload\nfails, step 4 is repeated with the second prioritized protocol, etc."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Once the upload is successfully finished, the replica state is changed to\n",(0,s.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Step 3-6 are repeated (done in parallel) with all other files part of the\nuploaded dataset."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"replica-is-created-by-a-replication-rule",children:"Replica is created by a replication rule"}),"\n",(0,s.jsx)(t.p,{children:"This is a typical workflow if a file already exists in Rucio but the user wants\nto replicate it to a different RSE."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["The user creates a replication rule for the dataset ",(0,s.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"\nat the server."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The Rucio server creates internal requests for each single file in the\ndataset and puts them in a queue to be read by the data transfer service."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The data transfer submitter picks these requests up and queries the\ndestination RSE information for each file."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Based on the identified naming algorithm of the destination RSE it creates\nthe destination URLs and creates the file replicas in ",(0,s.jsx)(t.code,{children:"COPYING"})," state."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"The transfer service then submits the transfer job to the connected transfer\ntool (e.g. FTS)"}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Once the transfers are finished the transfer tool notifies Rucio about the\ntransfer success and the transfer services mark the replicas as ",(0,s.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/138181e0.0287dff2.js b/assets/js/138181e0.0287dff2.js deleted file mode 100644 index 697319165e..0000000000 --- a/assets/js/138181e0.0287dff2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5152],{5640:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>r,contentTitle:()=>c,default:()=>l,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"started/concepts/notifications","title":"Notifications","description":"External applications can require synchronisation on events relative to","source":"@site/../docs/started/concepts/notifications.md","sourceDirName":"started/concepts","slug":"/started/concepts/notifications","permalink":"/documentation/started/concepts/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/notifications.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"notifications","title":"Notifications","sidebar_label":"Notifications"},"sidebar":"docs","previous":{"title":"Accounting and quota","permalink":"/documentation/started/concepts/accounting_and_quota"},"next":{"title":"Subscriptions","permalink":"/documentation/started/concepts/subscriptions"}}');var i=n(74848),s=n(28453);const a={id:"notifications",title:"Notifications",sidebar_label:"Notifications"},c=void 0,r={},d=[];function p(t){const e={a:"a",p:"p",...(0,s.R)(),...t.components};return(0,i.jsxs)(e.p,{children:["External applications can require synchronisation on events relative to\ndata availability and can subscribe to particular events, e.g., dataset\nstate changes, replication rule state changes, etc. Rucio publishes\nmessages via the ",(0,i.jsx)(e.a,{href:"https://stomp.github.io",children:"STOMP"})," protocol (to e.g.\n",(0,i.jsx)(e.a,{href:"https://activemq.apache.org",children:"ActiveMQ"}),") when these events happen."]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(p,{...t})}):p(t)}},28453:(t,e,n)=>{n.d(e,{R:()=>a,x:()=>c});var o=n(96540);const i={},s=o.createContext(i);function a(t){const e=o.useContext(s);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:a(t.components),o.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/138181e0.76599c35.js b/assets/js/138181e0.76599c35.js new file mode 100644 index 0000000000..9d6932a8bd --- /dev/null +++ b/assets/js/138181e0.76599c35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5152],{5640:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"started/concepts/notifications","title":"Notifications","description":"External applications can require synchronisation on events relative to","source":"@site/../docs/started/concepts/notifications.md","sourceDirName":"started/concepts","slug":"/started/concepts/notifications","permalink":"/documentation/started/concepts/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/notifications.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"notifications","title":"Notifications","sidebar_label":"Notifications"},"sidebar":"docs","previous":{"title":"Accounting and quota","permalink":"/documentation/started/concepts/accounting_and_quota"},"next":{"title":"Subscriptions","permalink":"/documentation/started/concepts/subscriptions"}}');var o=n(74848),s=n(28453);const a={id:"notifications",title:"Notifications",sidebar_label:"Notifications"},c=void 0,r={},d=[];function p(t){const e={a:"a",p:"p",...(0,s.R)(),...t.components};return(0,o.jsxs)(e.p,{children:["External applications can require synchronisation on events relative to\ndata availability and can subscribe to particular events, e.g., dataset\nstate changes, replication rule state changes, etc. Rucio publishes\nmessages via the ",(0,o.jsx)(e.a,{href:"https://stomp.github.io",children:"STOMP"})," protocol (to e.g.\n",(0,o.jsx)(e.a,{href:"https://activemq.apache.org",children:"ActiveMQ"}),") when these events happen."]})}function u(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(p,{...t})}):p(t)}},28453:(t,e,n)=>{n.d(e,{R:()=>a,x:()=>c});var i=n(96540);const o={},s=i.createContext(o);function a(t){const e=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),i.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/16a6bed5.5fe84808.js b/assets/js/16a6bed5.5fe84808.js deleted file mode 100644 index 8008ecdd9c..0000000000 --- a/assets/js/16a6bed5.5fe84808.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7101],{31173:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"developer/project_structure","title":"Project Structure","description":"The Rucio code structure is broken into multiple modules, to allow it to be grouped into packages without requiring code duplication.","source":"@site/../docs/developer/project_structure.md","sourceDirName":"developer","slug":"/developer/project_structure","permalink":"/documentation/developer/project_structure","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/project_structure.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"project_structure","title":"Project Structure"},"sidebar":"docs","previous":{"title":"Dependency management","permalink":"/documentation/developer/dependency_management"},"next":{"title":"REST API Documentation","permalink":"/documentation/developer/rest_api_doc"}}');var i=n(74848),s=n(28453);const r={id:"project_structure",title:"Project Structure"},a=void 0,c={},l=[{value:"Core",id:"core",level:2},{value:"Common",id:"common",level:2},{value:"Client",id:"client",level:2},{value:"Daemons",id:"daemons",level:2},{value:"Gateway",id:"gateway",level:2},{value:"Web",id:"web",level:2},{value:"Other",id:"other",level:2},{value:"DB",id:"db",level:3},{value:"RSE",id:"rse",level:3},{value:"Tests",id:"tests",level:3},{value:"Transfertool",id:"transfertool",level:3}];function d(e){const t={code:"code",h2:"h2",h3:"h3",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The Rucio code structure is broken into multiple modules, to allow it to be grouped into packages without requiring code duplication.\nBefore making a change, it is important to consider how your change will be used across different releases.\nThis will greatly impact the structure of your change."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"A simplified diagram of Rucio's code structure. It is broken into 3 boxes labeled "Rucio", "Rucio Web" and "Rucio Client". The "Rucio" box contains the web and client boxes.",src:n(17066).A+"",width:"2980",height:"1407"})}),"\n",(0,i.jsx)(t.h2,{id:"core",children:"Core"}),"\n",(0,i.jsx)(t.p,{children:"Core contains the main functionality of the project, it can be conceptualized as rucio's central logic.\nAny changes that need to impact all of rucio should be made in core.\nFor example: if a new feature introduces a new type of DID, the logic for this is included in the core, and then the ways for users and operators to use this logic is included in different parts of the code (namely, in client, gateway, and web)."}),"\n",(0,i.jsx)(t.h2,{id:"common",children:"Common"}),"\n",(0,i.jsx)(t.p,{children:"Common contains code used across client and server modules.\nCode in common is distributed with server and client releases, so if the functionality is required in both releases, it is included in common.\nThis includes things like configuration parsing, logging, and generalized utility/helper functions."}),"\n",(0,i.jsx)(t.h2,{id:"client",children:"Client"}),"\n",(0,i.jsx)(t.p,{children:"Client is a standalone module which sends requests to a server.\nIt can make calls to the Common module, but does not require direct knowledge of core's operation.\nIt contacts the Rest API hosted in web."}),"\n",(0,i.jsx)(t.p,{children:"bin/rucio and bin/rucio-admin utilize functionality hosted in client."}),"\n",(0,i.jsx)(t.p,{children:"If your change impacts how the user interacts with rucio, (the name of calls, arguments), this change should be made in client."}),"\n",(0,i.jsx)(t.h2,{id:"daemons",children:"Daemons"}),"\n",(0,i.jsx)(t.p,{children:"Daemons are auxiliary server side code to run asynchronous work without direct user interaction.\nThey do not need to be run, but are included with server releases.\nChanges impacting daemons are generally self-contained in the daemons."}),"\n",(0,i.jsx)(t.h2,{id:"gateway",children:"Gateway"}),"\n",(0,i.jsx)(t.p,{children:"Gateway is a series of recipes for basic operations using core functionality.\nIt allows for functionality of the core to be used with correct database sessions, authentication parameters.\nIt is an intermediate layer between the core and the Rest API - the Rest API utilizes the gateway to make calls to core."}),"\n",(0,i.jsx)(t.p,{children:"All public core methods should have a corresponding gateway method to handle sessions and authentication."}),"\n",(0,i.jsx)(t.h2,{id:"web",children:"Web"}),"\n",(0,i.jsxs)(t.p,{children:["Web contains the flask-based Rest API for the client to contact the server.\n(Found at ",(0,i.jsx)(t.code,{children:"/lib/rucio/web/rest/flaskapi/v1"}),").\nIt also contains the routing for a Web UI front end.\nWhen adding new functionality, or modifying the arguments of an existing function, it is imperative to update the Rest API."]}),"\n",(0,i.jsx)(t.h2,{id:"other",children:"Other"}),"\n",(0,i.jsx)(t.h3,{id:"db",children:"DB"}),"\n",(0,i.jsx)(t.p,{children:"As the name implies, DB contains database schema and connection utilities.\nIt is included in server releases of rucio.\nChanges in the database dramatically impact all other parts of the code, such as core's database queries.\nA migration instruction script must be included with DB changes to ensure data is not lost during upgrade or downgrades."}),"\n",(0,i.jsx)(t.h3,{id:"rse",children:"RSE"}),"\n",(0,i.jsx)(t.p,{children:"RSE provides different protocols to access RSEs (ex: ssh, srm.)\nIt is included client distributions, and all RSE protocols must be able to run without direct access to core."}),"\n",(0,i.jsx)(t.h3,{id:"tests",children:"Tests"}),"\n",(0,i.jsx)(t.p,{children:"Tests contains utilities for testing."}),"\n",(0,i.jsx)(t.h3,{id:"transfertool",children:"Transfertool"}),"\n",(0,i.jsx)(t.p,{children:"Similar to RSE, transfertool contains protocols for executing file transfers.\nIt can include calls to core, as transfer protocols sit server side."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},17066:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/code_structure-0ffa3c51952bfcec2e40267dc1343fb7.png"},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(96540);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/16a6bed5.9e4c26ff.js b/assets/js/16a6bed5.9e4c26ff.js new file mode 100644 index 0000000000..f41ee372d7 --- /dev/null +++ b/assets/js/16a6bed5.9e4c26ff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7101],{31173:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"developer/project_structure","title":"Project Structure","description":"The Rucio code structure is broken into multiple modules, to allow it to be grouped into packages without requiring code duplication.","source":"@site/../docs/developer/project_structure.md","sourceDirName":"developer","slug":"/developer/project_structure","permalink":"/documentation/developer/project_structure","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/project_structure.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"project_structure","title":"Project Structure"},"sidebar":"docs","previous":{"title":"Dependency management","permalink":"/documentation/developer/dependency_management"},"next":{"title":"REST API Documentation","permalink":"/documentation/developer/rest_api_doc"}}');var i=n(74848),s=n(28453);const r={id:"project_structure",title:"Project Structure"},a=void 0,c={},l=[{value:"Core",id:"core",level:2},{value:"Common",id:"common",level:2},{value:"Client",id:"client",level:2},{value:"Daemons",id:"daemons",level:2},{value:"Gateway",id:"gateway",level:2},{value:"Web",id:"web",level:2},{value:"Other",id:"other",level:2},{value:"DB",id:"db",level:3},{value:"RSE",id:"rse",level:3},{value:"Tests",id:"tests",level:3},{value:"Transfertool",id:"transfertool",level:3}];function d(e){const t={code:"code",h2:"h2",h3:"h3",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The Rucio code structure is broken into multiple modules, to allow it to be grouped into packages without requiring code duplication.\nBefore making a change, it is important to consider how your change will be used across different releases.\nThis will greatly impact the structure of your change."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"A simplified diagram of Rucio's code structure. It is broken into 3 boxes labeled "Rucio", "Rucio Web" and "Rucio Client". The "Rucio" box contains the web and client boxes.",src:n(17066).A+"",width:"2980",height:"1407"})}),"\n",(0,i.jsx)(t.h2,{id:"core",children:"Core"}),"\n",(0,i.jsx)(t.p,{children:"Core contains the main functionality of the project, it can be conceptualized as rucio's central logic.\nAny changes that need to impact all of rucio should be made in core.\nFor example: if a new feature introduces a new type of DID, the logic for this is included in the core, and then the ways for users and operators to use this logic is included in different parts of the code (namely, in client, gateway, and web)."}),"\n",(0,i.jsx)(t.h2,{id:"common",children:"Common"}),"\n",(0,i.jsx)(t.p,{children:"Common contains code used across client and server modules.\nCode in common is distributed with server and client releases, so if the functionality is required in both releases, it is included in common.\nThis includes things like configuration parsing, logging, and generalized utility/helper functions."}),"\n",(0,i.jsx)(t.h2,{id:"client",children:"Client"}),"\n",(0,i.jsx)(t.p,{children:"Client is a standalone module which sends requests to a server.\nIt can make calls to the Common module, but does not require direct knowledge of core's operation.\nIt contacts the Rest API hosted in web."}),"\n",(0,i.jsx)(t.p,{children:"bin/rucio and bin/rucio-admin utilize functionality hosted in client."}),"\n",(0,i.jsx)(t.p,{children:"If your change impacts how the user interacts with rucio, (the name of calls, arguments), this change should be made in client."}),"\n",(0,i.jsx)(t.h2,{id:"daemons",children:"Daemons"}),"\n",(0,i.jsx)(t.p,{children:"Daemons are auxiliary server side code to run asynchronous work without direct user interaction.\nThey do not need to be run, but are included with server releases.\nChanges impacting daemons are generally self-contained in the daemons."}),"\n",(0,i.jsx)(t.h2,{id:"gateway",children:"Gateway"}),"\n",(0,i.jsx)(t.p,{children:"Gateway is a series of recipes for basic operations using core functionality.\nIt allows for functionality of the core to be used with correct database sessions, authentication parameters.\nIt is an intermediate layer between the core and the Rest API - the Rest API utilizes the gateway to make calls to core."}),"\n",(0,i.jsx)(t.p,{children:"All public core methods should have a corresponding gateway method to handle sessions and authentication."}),"\n",(0,i.jsx)(t.h2,{id:"web",children:"Web"}),"\n",(0,i.jsxs)(t.p,{children:["Web contains the flask-based Rest API for the client to contact the server.\n(Found at ",(0,i.jsx)(t.code,{children:"/lib/rucio/web/rest/flaskapi/v1"}),").\nIt also contains the routing for a Web UI front end.\nWhen adding new functionality, or modifying the arguments of an existing function, it is imperative to update the Rest API."]}),"\n",(0,i.jsx)(t.h2,{id:"other",children:"Other"}),"\n",(0,i.jsx)(t.h3,{id:"db",children:"DB"}),"\n",(0,i.jsx)(t.p,{children:"As the name implies, DB contains database schema and connection utilities.\nIt is included in server releases of rucio.\nChanges in the database dramatically impact all other parts of the code, such as core's database queries.\nA migration instruction script must be included with DB changes to ensure data is not lost during upgrade or downgrades."}),"\n",(0,i.jsx)(t.h3,{id:"rse",children:"RSE"}),"\n",(0,i.jsx)(t.p,{children:"RSE provides different protocols to access RSEs (ex: ssh, srm.)\nIt is included client distributions, and all RSE protocols must be able to run without direct access to core."}),"\n",(0,i.jsx)(t.h3,{id:"tests",children:"Tests"}),"\n",(0,i.jsx)(t.p,{children:"Tests contains utilities for testing."}),"\n",(0,i.jsx)(t.h3,{id:"transfertool",children:"Transfertool"}),"\n",(0,i.jsx)(t.p,{children:"Similar to RSE, transfertool contains protocols for executing file transfers.\nIt can include calls to core, as transfer protocols sit server side."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},17066:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/code_structure-0ffa3c51952bfcec2e40267dc1343fb7.png"},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(96540);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1705cd3e.09d2b1b8.js b/assets/js/1705cd3e.09d2b1b8.js new file mode 100644 index 0000000000..5f9fca784d --- /dev/null +++ b/assets/js/1705cd3e.09d2b1b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8015],{71673:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>o,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>t});const r=JSON.parse('{"id":"about_our_contributors","title":"About Our Contributors","description":"Below is a list of contibutors who have contributed to the","source":"@site/../docs/about_our_contributors.md","sourceDirName":".","slug":"/about_our_contributors","permalink":"/documentation/about_our_contributors","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/about_our_contributors.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"about_our_contributors","title":"About Our Contributors"},"sidebar":"docs","previous":{"title":"Special Interest Groups","permalink":"/documentation/special_interest_groups"},"next":{"title":"Contact us","permalink":"/documentation/contact_us"}}');var a=n(74848),l=n(28453);const s={id:"about_our_contributors",title:"About Our Contributors"},c="Individual contributors to the source code",o={},t=[];function h(i){const e={a:"a",h1:"h1",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...i.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.p,{children:"Below is a list of contibutors who have contributed to the\nsource code & their employers."}),"\n",(0,a.jsxs)(e.p,{children:["Should you wish to contribute to the Rucio source code or the documentation,\nplease ensure you go through the guidelines listed in the ",(0,a.jsx)(e.a,{href:"contributing",children:(0,a.jsx)(e.strong,{children:"contribution guide\nfor developers"})})," and look into the ",(0,a.jsx)(e.a,{href:"https://github.com/rucio/documentation",children:"documentation GitHub\nrepository"})," before making a submission."]}),"\n",(0,a.jsx)(e.header,{children:(0,a.jsx)(e.h1,{id:"individual-contributors-to-the-source-code",children:"Individual contributors to the source code"})}),"\n",(0,a.jsx)(e.hr,{}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Mario Lassnig ",(0,a.jsx)(e.a,{href:"mailto:mario.lassnig@cern.ch",children:"mario.lassnig@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Vincent Garonne ",(0,a.jsx)(e.a,{href:"mailto:vgaronne@gmail.com",children:"vgaronne@gmail.com"}),", 2012-2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Angelos Molfetas ",(0,a.jsx)(e.a,{href:"mailto:Angelos.Molfetas@cern.ch",children:"Angelos.Molfetas@cern.c"}),", 2012"]}),"\n",(0,a.jsxs)(e.li,{children:["Martin Barisits ",(0,a.jsx)(e.a,{href:"mailto:martin.barisits@cern.ch",children:"martin.barisits@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Thomas Beermann ",(0,a.jsx)(e.a,{href:"mailto:thomas.beermann@cern.ch",children:"thomas.beermann@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Ralph Vigne ",(0,a.jsx)(e.a,{href:"mailto:ralph.vigne@cern.ch",children:"ralph.vigne@cern.ch"}),", 2012-2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Graeme Stewart ",(0,a.jsx)(e.a,{href:"mailto:graeme.andrew.stewart@cern.ch",children:"graeme.andrew.stewart@cern.ch"}),", 2012"]}),"\n",(0,a.jsxs)(e.li,{children:["Yun-Pin Sun ",(0,a.jsx)(e.a,{href:"mailto:winter0128@gmail.com",children:"winter0128@gmail.com"}),", 2012-2013"]}),"\n",(0,a.jsxs)(e.li,{children:["Cedric Serfon ",(0,a.jsx)(e.a,{href:"mailto:cedric.serfon@cern.ch",children:"cedric.serfon@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Luis Rodrigues ",(0,a.jsx)(e.a,{href:"mailto:lfrodrigues@gmail.com",children:"lfrodrigues@gmail.com"}),", 2013"]}),"\n",(0,a.jsxs)(e.li,{children:["WeiJen Chang ",(0,a.jsx)(e.a,{href:"mailto:e4523744@gmail.com",children:"e4523744@gmail.com"}),", 2013-2014"]}),"\n",(0,a.jsxs)(e.li,{children:["Gancho Dimitrov ",(0,a.jsx)(e.a,{href:"mailto:gancho.dimitrov@cern.ch",children:"gancho.dimitrov@cern.ch"}),", 2013"]}),"\n",(0,a.jsxs)(e.li,{children:["Wen Guan ",(0,a.jsx)(e.a,{href:"mailto:wguan.icedew@gmail.com",children:"wguan.icedew@gmail.co"}),", 2014-2017"]}),"\n",(0,a.jsxs)(e.li,{children:["David Cameron ",(0,a.jsx)(e.a,{href:"mailto:d.g.cameron@gmail.com",children:"d.g.cameron@gmail.com"}),", 2014-2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Tom\xe1\u0161 Kouba ",(0,a.jsx)(e.a,{href:"mailto:tomas.kouba@cern.ch",children:"tomas.kouba@cern.ch"}),", 2014-2015"]}),"\n",(0,a.jsxs)(e.li,{children:["Cheng-Hsi Chao ",(0,a.jsx)(e.a,{href:"mailto:cheng-hsi.chao@cern.ch",children:"cheng-hsi.chao@cern.ch"}),", 2014"]}),"\n",(0,a.jsxs)(e.li,{children:["Evangelia Liotiri ",(0,a.jsx)(e.a,{href:"mailto:evangelia.liotiri@cern.ch",children:"evangelia.liotiri@cern.ch"}),", 2014-2015"]}),"\n",(0,a.jsxs)(e.li,{children:["Joaqu\xedn Bogado ",(0,a.jsx)(e.a,{href:"mailto:jbogado@linti.unlp.edu.ar",children:"jbogado@linti.unlp.edu.ar"}),", 2014-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Fernando L\xf3pez ",(0,a.jsx)(e.a,{href:"mailto:fernando.e.lopez@gmail.com",children:"fernando.e.lopez@gmail.com"}),", 2015-2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Sylvain Blunier ",(0,a.jsx)(e.a,{href:"mailto:sylvain.blunier@cern.ch",children:"sylvain.blunier@cern.ch"}),", 2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Tomas Javurek ",(0,a.jsx)(e.a,{href:"mailto:tomas.javurek@cern.ch",children:"tomas.javurek@cern.ch"}),", 2016-2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Brian Bockelman ",(0,a.jsx)(e.a,{href:"mailto:bbockelm@cse.unl.edu",children:"bbockelm@cse.unl.edu"}),", 2016-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Tobias Wegner ",(0,a.jsx)(e.a,{href:"mailto:twegner@cern.ch",children:"twegner@cern.ch"}),", 2017-2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Frank Berghaus ",(0,a.jsx)(e.a,{href:"mailto:frank.berghaus@cern.ch",children:"frank.berghaus@cern.ch)"}),", 2017"]}),"\n",(0,a.jsxs)(e.li,{children:["Vitjan Zavrtanik ",(0,a.jsx)(e.a,{href:"mailto:vitjan.zavrtanik@cern.ch",children:"vitjan.zavrtanik@cern.ch"}),", 2017"]}),"\n",(0,a.jsxs)(e.li,{children:["Stefan Prenner ",(0,a.jsx)(e.a,{href:"mailto:stefan.prenner@cern.ch",children:"stefan.prenner@cern.ch"}),", 2017-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Nicolo Magini ",(0,a.jsx)(e.a,{href:"mailto:Nicolo.Magini@cern.ch",children:"Nicolo.Magini@cern.ch"}),", 2017-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Oliver Freyermuth ",(0,a.jsx)(e.a,{href:"mailto:o.freyermuth@googlemail.com",children:"o.freyermuth@googlemail.co"}),", 2017"]}),"\n",(0,a.jsxs)(e.li,{children:["Eric Vaandering ",(0,a.jsx)(e.a,{href:"mailto:ericvaandering@gmail.com",children:"ericvaandering@gmail.co"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Dimitrios Christidis ",(0,a.jsx)(e.a,{href:"mailto:dimitrios.christidis@cern.ch",children:"dimitrios.christidis@cern.ch"}),", 2018-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Igor Mandrichenko ",(0,a.jsx)(e.a,{href:"mailto:ivm@fnal.gov",children:"ivm@fnal.gov"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Shreyansh Khajanchi ",(0,a.jsx)(e.a,{href:"mailto:shreyansh_k@live.com",children:"shreyansh_k@live.com"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Robert Illingworth ",(0,a.jsx)(e.a,{href:"mailto:illingwo@fnal.gov",children:"illingwo@fnal.gov"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Hannes Hansen ",(0,a.jsx)(e.a,{href:"mailto:hannes.jakob.hansen@cern.ch",children:"hannes.jakob.hansen@cern.c"}),", 2018-2019"]}),"\n",(0,a.jsxs)(e.li,{children:["James Perry ",(0,a.jsx)(e.a,{href:"mailto:j.perry@epcc.ed.ac.uk",children:"j.perry@epcc.ed.ac.uk"}),", 2019-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Vivek Nigam ",(0,a.jsx)(e.a,{href:"mailto:viveknigam.nigam3@gmail.com",children:"viveknigam.nigam3@gmail.com"}),", 2019 - 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Kaustubh Hiware ",(0,a.jsx)(e.a,{href:"mailto:hiwarekaustubh@gmail.com",children:"hiwarekaustubh@gmail.co"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Florido Paganelli ",(0,a.jsx)(e.a,{href:"mailto:florido.paganelli@hep.lu.se",children:"florido.paganelli@hep.lu.se"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Boris Bauermeister ",(0,a.jsx)(e.a,{href:"mailto:Boris.Bauermeister@gmail.com",children:"Boris.Bauermeister@gmail.com"})," 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Ruturaj Gujar ",(0,a.jsx)(e.a,{href:"mailto:ruturaj.gujar23@gmail.com",children:"ruturaj.gujar23@gmail.com"})," 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Andrew Lister ",(0,a.jsx)(e.a,{href:"mailto:andrew.lister@stfc.ac.uk",children:"andrew.lister@stfc.ac.uk"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Aristeidis Fkiaras ",(0,a.jsx)(e.a,{href:"mailto:aristeidis.fkiaras@cern.ch",children:"aristeidis.fkiaras@cern.ch"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Benedikt Ziemons ",(0,a.jsx)(e.a,{href:"mailto:benedikt.ziemons@cern.ch",children:"benedikt.ziemons@cern.ch"}),", 2020-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Muhammad Aditya Hilmy ",(0,a.jsx)(e.a,{href:"mailto:mhilmy@hey.com",children:"mhilmy@hey.com"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Eli Chadwick ",(0,a.jsx)(e.a,{href:"mailto:eli.chadwick@stfc.ac.uk",children:"eli.chadwick@stfc.ac.uk"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Patrick Austin ",(0,a.jsxs)(e.a,{href:"mailto:patrick.austin@stfc.ac.uk",children:[":patrick",".austin@stfc.ac.uk"]}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Rob Barnsley ",(0,a.jsx)(e.a,{href:"mailto:R.Barnsley@skatelescope.org",children:"R.Barnsley@skatelescope.org"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Alan Malta Rodrigues ",(0,a.jsx)(e.a,{href:"mailto:alan.malta@cern.ch",children:"alan.malta@cern.ch"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Rizart Dona ",(0,a.jsx)(e.a,{href:"mailto:rizart.dona@gmail.com",children:"rizart.dona@gmail.com"}),", 2021-2022"]}),"\n",(0,a.jsxs)(e.li,{children:["Aksel Lunde Aase ",(0,a.jsx)(e.a,{href:"mailto:aksel.lunde.aase@gmail.com",children:"aksel.lunde.aase@gmail.co"}),", 2022"]}),"\n",(0,a.jsxs)(e.li,{children:["Anton Schwarz ",(0,a.jsx)(e.a,{href:"mailto:anton.schwarz@cern.ch",children:"anton.schwarz@cern.ch"}),", 2022"]}),"\n",(0,a.jsxs)(e.li,{children:["Johannes Lange ",(0,a.jsx)(e.a,{href:"mailto:johannes.lange@uni-hamburg.de",children:"johannes.lange@uni-hamburg.de"}),", 2022-2023"]}),"\n",(0,a.jsxs)(e.li,{children:["Domenic Gosein ",(0,a.jsx)(e.a,{href:"mailto:domenic.gosein@cern.ch",children:"domenic.gosein@cern.ch"}),", 2023"]}),"\n",(0,a.jsxs)(e.li,{children:["Eraldo Junior ",(0,a.jsx)(e.a,{href:"mailto:esilvaju@cern.ch",children:"esilvaju@cern.ch"}),", 2021-2024"]}),"\n",(0,a.jsxs)(e.li,{children:["Dimitris Xenakis ",(0,a.jsx)(e.a,{href:"mailto:d.xenakis@ieee.org",children:"d.xenakis@ieee.org"}),", 2024"]}),"\n",(0,a.jsxs)(e.li,{children:["Fabio Luchetti ",(0,a.jsx)(e.a,{href:"mailto:fabio.luchetti@cern.ch",children:"fabio.luchetti@cern.ch"}),", 2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Giovanni Guerrieri ",(0,a.jsx)(e.a,{href:"mailto:giovanni.guerrieri@cern.ch",children:"giovanni.guerrieri@cern.ch"}),", 2024"]}),"\n"]}),"\n",(0,a.jsx)(e.h1,{id:"organisations-employing-contributors",children:"Organisations employing contributors"}),"\n",(0,a.jsx)(e.hr,{}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"European Organisation for Nuclear Research (Switzerland)"}),"\n",(0,a.jsx)(e.li,{children:"University of Oslo (Norway)"}),"\n",(0,a.jsx)(e.li,{children:"University of Wisconsin Madison (USA)"}),"\n",(0,a.jsx)(e.li,{children:"National University of La Plata (Argentina)"}),"\n",(0,a.jsx)(e.li,{children:"Albert Ludwigs Universit\xe4t Freiburg (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"University of Nebraska Lincoln (USA)"}),"\n",(0,a.jsx)(e.li,{children:"Bergische Universit\xe4t Wuppertal (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"University of Victoria (Canada)"}),"\n",(0,a.jsx)(e.li,{children:"INFN e Universita Genova (Italy)"}),"\n",(0,a.jsx)(e.li,{children:"University of Bonn (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"Fermi National Accelerator Laboratory (USA)"}),"\n",(0,a.jsx)(e.li,{children:"Leopold-Franzens Universit\xe4t Innsbruck (Austria)"}),"\n",(0,a.jsx)(e.li,{children:"Academia Sinica (Taiwan)"}),"\n",(0,a.jsx)(e.li,{children:"University of Edinburgh (UK)"}),"\n",(0,a.jsx)(e.li,{children:"Birla Institute of Technology, Mesra (India)"}),"\n",(0,a.jsx)(e.li,{children:"Indian Institute of Technology, Kharagpur (India)"}),"\n",(0,a.jsx)(e.li,{children:"Stockholm University, Stockholm (Sweden)"}),"\n",(0,a.jsx)(e.li,{children:"Dwarkadas J. Sanghvi College of Engineering (India)"}),"\n",(0,a.jsx)(e.li,{children:"Science and Technology Facilities Council (UK)"}),"\n",(0,a.jsx)(e.li,{children:"Brookhaven National Laboratory (USA)"}),"\n",(0,a.jsx)(e.li,{children:"Institut Teknologi Bandung (Indonesia)"}),"\n",(0,a.jsx)(e.li,{children:"Universit\xe4t Hamburg (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"Brazilian Center for Research in Physics (Brazil)"}),"\n"]})]})}function d(i={}){const{wrapper:e}={...(0,l.R)(),...i.components};return e?(0,a.jsx)(e,{...i,children:(0,a.jsx)(h,{...i})}):h(i)}},28453:(i,e,n)=>{n.d(e,{R:()=>s,x:()=>c});var r=n(96540);const a={},l=r.createContext(a);function s(i){const e=r.useContext(l);return r.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function c(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(a):i.components||a:s(i.components),r.createElement(l.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/1705cd3e.e564c3e7.js b/assets/js/1705cd3e.e564c3e7.js deleted file mode 100644 index 0bd03bf30b..0000000000 --- a/assets/js/1705cd3e.e564c3e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8015],{71673:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>o,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>t});const r=JSON.parse('{"id":"about_our_contributors","title":"About Our Contributors","description":"Below is a list of contibutors who have contributed to the","source":"@site/../docs/about_our_contributors.md","sourceDirName":".","slug":"/about_our_contributors","permalink":"/documentation/about_our_contributors","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/about_our_contributors.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"about_our_contributors","title":"About Our Contributors"},"sidebar":"docs","previous":{"title":"Special Interest Groups","permalink":"/documentation/special_interest_groups"},"next":{"title":"Contact us","permalink":"/documentation/contact_us"}}');var a=n(74848),l=n(28453);const s={id:"about_our_contributors",title:"About Our Contributors"},c="Individual contributors to the source code",o={},t=[];function h(i){const e={a:"a",h1:"h1",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...i.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.p,{children:"Below is a list of contibutors who have contributed to the\nsource code & their employers."}),"\n",(0,a.jsxs)(e.p,{children:["Should you wish to contribute to the Rucio source code or the documentation,\nplease ensure you go through the guidelines listed in the ",(0,a.jsx)(e.a,{href:"contributing",children:(0,a.jsx)(e.strong,{children:"contribution guide\nfor developers"})})," and look into the ",(0,a.jsx)(e.a,{href:"https://github.com/rucio/documentation",children:"documentation GitHub\nrepository"})," before making a submission."]}),"\n",(0,a.jsx)(e.header,{children:(0,a.jsx)(e.h1,{id:"individual-contributors-to-the-source-code",children:"Individual contributors to the source code"})}),"\n",(0,a.jsx)(e.hr,{}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Mario Lassnig ",(0,a.jsx)(e.a,{href:"mailto:mario.lassnig@cern.ch",children:"mario.lassnig@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Vincent Garonne ",(0,a.jsx)(e.a,{href:"mailto:vgaronne@gmail.com",children:"vgaronne@gmail.com"}),", 2012-2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Angelos Molfetas ",(0,a.jsx)(e.a,{href:"mailto:Angelos.Molfetas@cern.ch",children:"Angelos.Molfetas@cern.c"}),", 2012"]}),"\n",(0,a.jsxs)(e.li,{children:["Martin Barisits ",(0,a.jsx)(e.a,{href:"mailto:martin.barisits@cern.ch",children:"martin.barisits@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Thomas Beermann ",(0,a.jsx)(e.a,{href:"mailto:thomas.beermann@cern.ch",children:"thomas.beermann@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Ralph Vigne ",(0,a.jsx)(e.a,{href:"mailto:ralph.vigne@cern.ch",children:"ralph.vigne@cern.ch"}),", 2012-2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Graeme Stewart ",(0,a.jsx)(e.a,{href:"mailto:graeme.andrew.stewart@cern.ch",children:"graeme.andrew.stewart@cern.ch"}),", 2012"]}),"\n",(0,a.jsxs)(e.li,{children:["Yun-Pin Sun ",(0,a.jsx)(e.a,{href:"mailto:winter0128@gmail.com",children:"winter0128@gmail.com"}),", 2012-2013"]}),"\n",(0,a.jsxs)(e.li,{children:["Cedric Serfon ",(0,a.jsx)(e.a,{href:"mailto:cedric.serfon@cern.ch",children:"cedric.serfon@cern.ch"}),", 2012-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Luis Rodrigues ",(0,a.jsx)(e.a,{href:"mailto:lfrodrigues@gmail.com",children:"lfrodrigues@gmail.com"}),", 2013"]}),"\n",(0,a.jsxs)(e.li,{children:["WeiJen Chang ",(0,a.jsx)(e.a,{href:"mailto:e4523744@gmail.com",children:"e4523744@gmail.com"}),", 2013-2014"]}),"\n",(0,a.jsxs)(e.li,{children:["Gancho Dimitrov ",(0,a.jsx)(e.a,{href:"mailto:gancho.dimitrov@cern.ch",children:"gancho.dimitrov@cern.ch"}),", 2013"]}),"\n",(0,a.jsxs)(e.li,{children:["Wen Guan ",(0,a.jsx)(e.a,{href:"mailto:wguan.icedew@gmail.com",children:"wguan.icedew@gmail.co"}),", 2014-2017"]}),"\n",(0,a.jsxs)(e.li,{children:["David Cameron ",(0,a.jsx)(e.a,{href:"mailto:d.g.cameron@gmail.com",children:"d.g.cameron@gmail.com"}),", 2014-2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Tom\xe1\u0161 Kouba ",(0,a.jsx)(e.a,{href:"mailto:tomas.kouba@cern.ch",children:"tomas.kouba@cern.ch"}),", 2014-2015"]}),"\n",(0,a.jsxs)(e.li,{children:["Cheng-Hsi Chao ",(0,a.jsx)(e.a,{href:"mailto:cheng-hsi.chao@cern.ch",children:"cheng-hsi.chao@cern.ch"}),", 2014"]}),"\n",(0,a.jsxs)(e.li,{children:["Evangelia Liotiri ",(0,a.jsx)(e.a,{href:"mailto:evangelia.liotiri@cern.ch",children:"evangelia.liotiri@cern.ch"}),", 2014-2015"]}),"\n",(0,a.jsxs)(e.li,{children:["Joaqu\xedn Bogado ",(0,a.jsx)(e.a,{href:"mailto:jbogado@linti.unlp.edu.ar",children:"jbogado@linti.unlp.edu.ar"}),", 2014-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Fernando L\xf3pez ",(0,a.jsx)(e.a,{href:"mailto:fernando.e.lopez@gmail.com",children:"fernando.e.lopez@gmail.com"}),", 2015-2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Sylvain Blunier ",(0,a.jsx)(e.a,{href:"mailto:sylvain.blunier@cern.ch",children:"sylvain.blunier@cern.ch"}),", 2016"]}),"\n",(0,a.jsxs)(e.li,{children:["Tomas Javurek ",(0,a.jsx)(e.a,{href:"mailto:tomas.javurek@cern.ch",children:"tomas.javurek@cern.ch"}),", 2016-2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Brian Bockelman ",(0,a.jsx)(e.a,{href:"mailto:bbockelm@cse.unl.edu",children:"bbockelm@cse.unl.edu"}),", 2016-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Tobias Wegner ",(0,a.jsx)(e.a,{href:"mailto:twegner@cern.ch",children:"twegner@cern.ch"}),", 2017-2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Frank Berghaus ",(0,a.jsx)(e.a,{href:"mailto:frank.berghaus@cern.ch",children:"frank.berghaus@cern.ch)"}),", 2017"]}),"\n",(0,a.jsxs)(e.li,{children:["Vitjan Zavrtanik ",(0,a.jsx)(e.a,{href:"mailto:vitjan.zavrtanik@cern.ch",children:"vitjan.zavrtanik@cern.ch"}),", 2017"]}),"\n",(0,a.jsxs)(e.li,{children:["Stefan Prenner ",(0,a.jsx)(e.a,{href:"mailto:stefan.prenner@cern.ch",children:"stefan.prenner@cern.ch"}),", 2017-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Nicolo Magini ",(0,a.jsx)(e.a,{href:"mailto:Nicolo.Magini@cern.ch",children:"Nicolo.Magini@cern.ch"}),", 2017-2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Oliver Freyermuth ",(0,a.jsx)(e.a,{href:"mailto:o.freyermuth@googlemail.com",children:"o.freyermuth@googlemail.co"}),", 2017"]}),"\n",(0,a.jsxs)(e.li,{children:["Eric Vaandering ",(0,a.jsx)(e.a,{href:"mailto:ericvaandering@gmail.com",children:"ericvaandering@gmail.co"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Dimitrios Christidis ",(0,a.jsx)(e.a,{href:"mailto:dimitrios.christidis@cern.ch",children:"dimitrios.christidis@cern.ch"}),", 2018-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Igor Mandrichenko ",(0,a.jsx)(e.a,{href:"mailto:ivm@fnal.gov",children:"ivm@fnal.gov"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Shreyansh Khajanchi ",(0,a.jsx)(e.a,{href:"mailto:shreyansh_k@live.com",children:"shreyansh_k@live.com"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Robert Illingworth ",(0,a.jsx)(e.a,{href:"mailto:illingwo@fnal.gov",children:"illingwo@fnal.gov"}),", 2018"]}),"\n",(0,a.jsxs)(e.li,{children:["Hannes Hansen ",(0,a.jsx)(e.a,{href:"mailto:hannes.jakob.hansen@cern.ch",children:"hannes.jakob.hansen@cern.c"}),", 2018-2019"]}),"\n",(0,a.jsxs)(e.li,{children:["James Perry ",(0,a.jsx)(e.a,{href:"mailto:j.perry@epcc.ed.ac.uk",children:"j.perry@epcc.ed.ac.uk"}),", 2019-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Vivek Nigam ",(0,a.jsx)(e.a,{href:"mailto:viveknigam.nigam3@gmail.com",children:"viveknigam.nigam3@gmail.com"}),", 2019 - 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Kaustubh Hiware ",(0,a.jsx)(e.a,{href:"mailto:hiwarekaustubh@gmail.com",children:"hiwarekaustubh@gmail.co"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Florido Paganelli ",(0,a.jsx)(e.a,{href:"mailto:florido.paganelli@hep.lu.se",children:"florido.paganelli@hep.lu.se"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Boris Bauermeister ",(0,a.jsx)(e.a,{href:"mailto:Boris.Bauermeister@gmail.com",children:"Boris.Bauermeister@gmail.com"})," 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Ruturaj Gujar ",(0,a.jsx)(e.a,{href:"mailto:ruturaj.gujar23@gmail.com",children:"ruturaj.gujar23@gmail.com"})," 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Andrew Lister ",(0,a.jsx)(e.a,{href:"mailto:andrew.lister@stfc.ac.uk",children:"andrew.lister@stfc.ac.uk"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Aristeidis Fkiaras ",(0,a.jsx)(e.a,{href:"mailto:aristeidis.fkiaras@cern.ch",children:"aristeidis.fkiaras@cern.ch"}),", 2019"]}),"\n",(0,a.jsxs)(e.li,{children:["Benedikt Ziemons ",(0,a.jsx)(e.a,{href:"mailto:benedikt.ziemons@cern.ch",children:"benedikt.ziemons@cern.ch"}),", 2020-2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Muhammad Aditya Hilmy ",(0,a.jsx)(e.a,{href:"mailto:mhilmy@hey.com",children:"mhilmy@hey.com"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Eli Chadwick ",(0,a.jsx)(e.a,{href:"mailto:eli.chadwick@stfc.ac.uk",children:"eli.chadwick@stfc.ac.uk"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Patrick Austin ",(0,a.jsxs)(e.a,{href:"mailto:patrick.austin@stfc.ac.uk",children:[":patrick",".austin@stfc.ac.uk"]}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Rob Barnsley ",(0,a.jsx)(e.a,{href:"mailto:R.Barnsley@skatelescope.org",children:"R.Barnsley@skatelescope.org"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Alan Malta Rodrigues ",(0,a.jsx)(e.a,{href:"mailto:alan.malta@cern.ch",children:"alan.malta@cern.ch"}),", 2020"]}),"\n",(0,a.jsxs)(e.li,{children:["Rizart Dona ",(0,a.jsx)(e.a,{href:"mailto:rizart.dona@gmail.com",children:"rizart.dona@gmail.com"}),", 2021-2022"]}),"\n",(0,a.jsxs)(e.li,{children:["Aksel Lunde Aase ",(0,a.jsx)(e.a,{href:"mailto:aksel.lunde.aase@gmail.com",children:"aksel.lunde.aase@gmail.co"}),", 2022"]}),"\n",(0,a.jsxs)(e.li,{children:["Anton Schwarz ",(0,a.jsx)(e.a,{href:"mailto:anton.schwarz@cern.ch",children:"anton.schwarz@cern.ch"}),", 2022"]}),"\n",(0,a.jsxs)(e.li,{children:["Johannes Lange ",(0,a.jsx)(e.a,{href:"mailto:johannes.lange@uni-hamburg.de",children:"johannes.lange@uni-hamburg.de"}),", 2022-2023"]}),"\n",(0,a.jsxs)(e.li,{children:["Domenic Gosein ",(0,a.jsx)(e.a,{href:"mailto:domenic.gosein@cern.ch",children:"domenic.gosein@cern.ch"}),", 2023"]}),"\n",(0,a.jsxs)(e.li,{children:["Eraldo Junior ",(0,a.jsx)(e.a,{href:"mailto:esilvaju@cern.ch",children:"esilvaju@cern.ch"}),", 2021-2024"]}),"\n",(0,a.jsxs)(e.li,{children:["Dimitris Xenakis ",(0,a.jsx)(e.a,{href:"mailto:d.xenakis@ieee.org",children:"d.xenakis@ieee.org"}),", 2024"]}),"\n",(0,a.jsxs)(e.li,{children:["Fabio Luchetti ",(0,a.jsx)(e.a,{href:"mailto:fabio.luchetti@cern.ch",children:"fabio.luchetti@cern.ch"}),", 2021"]}),"\n",(0,a.jsxs)(e.li,{children:["Giovanni Guerrieri ",(0,a.jsx)(e.a,{href:"mailto:giovanni.guerrieri@cern.ch",children:"giovanni.guerrieri@cern.ch"}),", 2024"]}),"\n"]}),"\n",(0,a.jsx)(e.h1,{id:"organisations-employing-contributors",children:"Organisations employing contributors"}),"\n",(0,a.jsx)(e.hr,{}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"European Organisation for Nuclear Research (Switzerland)"}),"\n",(0,a.jsx)(e.li,{children:"University of Oslo (Norway)"}),"\n",(0,a.jsx)(e.li,{children:"University of Wisconsin Madison (USA)"}),"\n",(0,a.jsx)(e.li,{children:"National University of La Plata (Argentina)"}),"\n",(0,a.jsx)(e.li,{children:"Albert Ludwigs Universit\xe4t Freiburg (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"University of Nebraska Lincoln (USA)"}),"\n",(0,a.jsx)(e.li,{children:"Bergische Universit\xe4t Wuppertal (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"University of Victoria (Canada)"}),"\n",(0,a.jsx)(e.li,{children:"INFN e Universita Genova (Italy)"}),"\n",(0,a.jsx)(e.li,{children:"University of Bonn (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"Fermi National Accelerator Laboratory (USA)"}),"\n",(0,a.jsx)(e.li,{children:"Leopold-Franzens Universit\xe4t Innsbruck (Austria)"}),"\n",(0,a.jsx)(e.li,{children:"Academia Sinica (Taiwan)"}),"\n",(0,a.jsx)(e.li,{children:"University of Edinburgh (UK)"}),"\n",(0,a.jsx)(e.li,{children:"Birla Institute of Technology, Mesra (India)"}),"\n",(0,a.jsx)(e.li,{children:"Indian Institute of Technology, Kharagpur (India)"}),"\n",(0,a.jsx)(e.li,{children:"Stockholm University, Stockholm (Sweden)"}),"\n",(0,a.jsx)(e.li,{children:"Dwarkadas J. Sanghvi College of Engineering (India)"}),"\n",(0,a.jsx)(e.li,{children:"Science and Technology Facilities Council (UK)"}),"\n",(0,a.jsx)(e.li,{children:"Brookhaven National Laboratory (USA)"}),"\n",(0,a.jsx)(e.li,{children:"Institut Teknologi Bandung (Indonesia)"}),"\n",(0,a.jsx)(e.li,{children:"Universit\xe4t Hamburg (Germany)"}),"\n",(0,a.jsx)(e.li,{children:"Brazilian Center for Research in Physics (Brazil)"}),"\n"]})]})}function d(i={}){const{wrapper:e}={...(0,l.R)(),...i.components};return e?(0,a.jsx)(e,{...i,children:(0,a.jsx)(h,{...i})}):h(i)}},28453:(i,e,n)=>{n.d(e,{R:()=>s,x:()=>c});var r=n(96540);const a={},l=r.createContext(a);function s(i){const e=r.useContext(l);return r.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function c(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(a):i.components||a:s(i.components),r.createElement(l.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/171dad78.1b83b3ab.js b/assets/js/171dad78.1b83b3ab.js deleted file mode 100644 index 3370969b56..0000000000 --- a/assets/js/171dad78.1b83b3ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5874],{95148:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"started/before_you_get_started","title":"Before you get started","description":"A great starting point for those absolutely new to Rucio, this section aims to","source":"@site/../docs/started/before_you_get_started.md","sourceDirName":"started","slug":"/started/before_you_get_started","permalink":"/documentation/started/before_you_get_started","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/before_you_get_started.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"before_you_get_started","title":"Before you get started"},"sidebar":"docs","previous":{"title":"Welcome","permalink":"/documentation/"},"next":{"title":"What is Rucio?","permalink":"/documentation/started/what_is_rucio"}}');var s=o(74848),r=o(28453);const a={id:"before_you_get_started",title:"Before you get started"},i=void 0,d={},c=[];function u(t){const e={a:"a",li:"li",p:"p",ul:"ul",...(0,r.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"A great starting point for those absolutely new to Rucio, this section aims to\nhelps you understand the basics of our Data Management system. The motivations\nbehind this project, what we are looking to achieve, & what we have done so far\nare some of the points covered in this section."}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio?"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional layers and Resources"})}),"\n"]})]})}function l(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},28453:(t,e,o)=>{o.d(e,{R:()=>a,x:()=>i});var n=o(96540);const s={},r=n.createContext(s);function a(t){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),n.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/171dad78.8cdfdfb4.js b/assets/js/171dad78.8cdfdfb4.js new file mode 100644 index 0000000000..5c3e2cf9ae --- /dev/null +++ b/assets/js/171dad78.8cdfdfb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5874],{95148:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"started/before_you_get_started","title":"Before you get started","description":"A great starting point for those absolutely new to Rucio, this section aims to","source":"@site/../docs/started/before_you_get_started.md","sourceDirName":"started","slug":"/started/before_you_get_started","permalink":"/documentation/started/before_you_get_started","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/before_you_get_started.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"before_you_get_started","title":"Before you get started"},"sidebar":"docs","previous":{"title":"Welcome","permalink":"/documentation/"},"next":{"title":"What is Rucio?","permalink":"/documentation/started/what_is_rucio"}}');var s=o(74848),r=o(28453);const a={id:"before_you_get_started",title:"Before you get started"},i=void 0,d={},c=[];function u(t){const e={a:"a",li:"li",p:"p",ul:"ul",...(0,r.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"A great starting point for those absolutely new to Rucio, this section aims to\nhelps you understand the basics of our Data Management system. The motivations\nbehind this project, what we are looking to achieve, & what we have done so far\nare some of the points covered in this section."}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio?"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional layers and Resources"})}),"\n"]})]})}function l(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},28453:(t,e,o)=>{o.d(e,{R:()=>a,x:()=>i});var n=o(96540);const s={},r=n.createContext(s);function a(t){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),n.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a726a41.e19f7c47.js b/assets/js/1a726a41.e19f7c47.js new file mode 100644 index 0000000000..a880458961 --- /dev/null +++ b/assets/js/1a726a41.e19f7c47.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[9252],{90218:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"started/main_components","title":"Main Components","description":"Rucio is based on a distributed system architecture & can be sectioned into four","source":"@site/../docs/started/main_components.md","sourceDirName":"started","slug":"/started/main_components","permalink":"/documentation/started/main_components","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/main_components.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"main_components","title":"Main Components"},"sidebar":"docs","previous":{"title":"What is Rucio?","permalink":"/documentation/started/what_is_rucio"},"next":{"title":"Additional Layers and Resources","permalink":"/documentation/started/additional_layers_and_resources"}}');var i=t(74848),o=t(28453);const a={id:"main_components",title:"Main Components"},r=void 0,c={},d=[{value:"Clients",id:"clients",level:2},{value:"Server",id:"server",level:2},{value:"Core",id:"core",level:2},{value:"Daemons",id:"daemons",level:2}];function l(e){const n={a:"a",h2:"h2",img:"img",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Rucio is based on a distributed system architecture & can be sectioned into four\nmajor layers:"}),"\n",(0,i.jsx)(n.h2,{id:"clients",children:"Clients"}),"\n",(0,i.jsx)(n.p,{children:"The clients layer consists of components such as the command line clients (CLI),\nPython clients, and the Javascript-based web user interface and configuration."}),"\n",(0,i.jsx)(n.h2,{id:"server",children:"Server"}),"\n",(0,i.jsx)(n.p,{children:"The server layer serves the purpose of authentication & provides a common API\nfor interaction with clients & other external application, as also the Web UI."}),"\n",(0,i.jsx)(n.h2,{id:"core",children:"Core"}),"\n",(0,i.jsx)(n.p,{children:"This layer consists of all the Rucio-level abstractions that are explained at\nlength in the Concepts section."}),"\n",(0,i.jsx)(n.h2,{id:"daemons",children:"Daemons"}),"\n",(0,i.jsx)(n.p,{children:"The daemons layer takes care of all the asynchronous & continuous workflows in\nthe background."}),"\n",(0,i.jsx)(n.p,{children:"A diagrammatic representation of the 4 layers is as shown below"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image",src:t(81966).A+"",width:"513",height:"452"})}),"\n",(0,i.jsxs)(n.p,{children:["To learn more about each of these layers in detail, download our ",(0,i.jsx)(n.a,{href:"https://link.springer.com/article/10.1007/s41781-019-0026-3",children:"peer reviewed\nscientific paper"}),"."]})]})}function m(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},81966:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/architecture-a407801cb690fc1a73a930e2691f761f.png"},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var s=t(96540);const i={},o=s.createContext(i);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a726a41.f926c85c.js b/assets/js/1a726a41.f926c85c.js deleted file mode 100644 index 9a74626367..0000000000 --- a/assets/js/1a726a41.f926c85c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[9252],{90218:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"started/main_components","title":"Main Components","description":"Rucio is based on a distributed system architecture & can be sectioned into four","source":"@site/../docs/started/main_components.md","sourceDirName":"started","slug":"/started/main_components","permalink":"/documentation/started/main_components","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/main_components.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"main_components","title":"Main Components"},"sidebar":"docs","previous":{"title":"What is Rucio?","permalink":"/documentation/started/what_is_rucio"},"next":{"title":"Additional Layers and Resources","permalink":"/documentation/started/additional_layers_and_resources"}}');var o=t(74848),i=t(28453);const a={id:"main_components",title:"Main Components"},r=void 0,c={},d=[{value:"Clients",id:"clients",level:2},{value:"Server",id:"server",level:2},{value:"Core",id:"core",level:2},{value:"Daemons",id:"daemons",level:2}];function l(e){const n={a:"a",h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"Rucio is based on a distributed system architecture & can be sectioned into four\nmajor layers:"}),"\n",(0,o.jsx)(n.h2,{id:"clients",children:"Clients"}),"\n",(0,o.jsx)(n.p,{children:"The clients layer consists of components such as the command line clients (CLI),\nPython clients, and the Javascript-based web user interface and configuration."}),"\n",(0,o.jsx)(n.h2,{id:"server",children:"Server"}),"\n",(0,o.jsx)(n.p,{children:"The server layer serves the purpose of authentication & provides a common API\nfor interaction with clients & other external application, as also the Web UI."}),"\n",(0,o.jsx)(n.h2,{id:"core",children:"Core"}),"\n",(0,o.jsx)(n.p,{children:"This layer consists of all the Rucio-level abstractions that are explained at\nlength in the Concepts section."}),"\n",(0,o.jsx)(n.h2,{id:"daemons",children:"Daemons"}),"\n",(0,o.jsx)(n.p,{children:"The daemons layer takes care of all the asynchronous & continuous workflows in\nthe background."}),"\n",(0,o.jsx)(n.p,{children:"A diagrammatic representation of the 4 layers is as shown below"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"image",src:t(81966).A+"",width:"513",height:"452"})}),"\n",(0,o.jsxs)(n.p,{children:["To learn more about each of these layers in detail, download our ",(0,o.jsx)(n.a,{href:"https://link.springer.com/article/10.1007/s41781-019-0026-3",children:"peer reviewed\nscientific paper"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},81966:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/architecture-a407801cb690fc1a73a930e2691f761f.png"},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var s=t(96540);const o={},i=s.createContext(o);function a(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ae78d49.2bc92216.js b/assets/js/1ae78d49.2bc92216.js deleted file mode 100644 index 681f468a68..0000000000 --- a/assets/js/1ae78d49.2bc92216.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6552],{78760:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>d,frontMatter:()=>c,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"contact_us","title":"Contact us","description":"We know getting started can be difficult, which is why","source":"@site/../docs/contact_us.md","sourceDirName":".","slug":"/contact_us","permalink":"/documentation/contact_us","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/contact_us.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"contact_us","title":"Contact us"},"sidebar":"docs","previous":{"title":"About Our Contributors","permalink":"/documentation/about_our_contributors"}}');var o=n(74848),s=n(28453);const c={id:"contact_us",title:"Contact us"},a=void 0,r={},u=[{value:"Chat with us",id:"chat-with-us",level:2},{value:"Weekly Rucio meeting",id:"weekly-rucio-meeting",level:2},{value:"Rucio news mailing list",id:"rucio-news-mailing-list",level:2},{value:"Email us",id:"email-us",level:2},{value:"Social Media",id:"social-media",level:2}];function l(e){const t={a:"a",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"We know getting started can be difficult, which is why\nour developers are always happy to help out! Reach out\nto us on any of the below channels for any assistance\nwith Rucio."}),"\n",(0,o.jsx)(t.h2,{id:"chat-with-us",children:"Chat with us"}),"\n",(0,o.jsxs)(t.p,{children:["We have a dedicated Mattermost team for questions, support, news, development\nupdates and all things Rucio and you can be a part of it too!\nClick ",(0,o.jsx)(t.a,{href:"/documentation/join_rucio_mattermost",children:"here"})]}),"\n",(0,o.jsx)(t.h2,{id:"weekly-rucio-meeting",children:"Weekly Rucio meeting"}),"\n",(0,o.jsxs)(t.p,{children:["The Rucio community gathers for a meeting every Thursday at 3 PM CEST to discuss\ncommunity news, operational issues and questions, as well as ongoing & further\ncontributions by the development team. The meeting is open to the public\nand you can view the schedule ",(0,o.jsx)(t.a,{href:"https://indico.cern.ch/category/10588/",children:"here"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"rucio-news-mailing-list",children:"Rucio news mailing list"}),"\n",(0,o.jsxs)(t.p,{children:["We have a dedicated news mailing list for general announcements (<10 eMails per\nyear) for the Rucio community. You can subscribe to ",(0,o.jsx)(t.a,{href:"https://e-groups.cern.ch/e-groups/Egroup.do?egroupId=10586148",children:"rucio-news@cern.ch"}),"\ndirectly with a CERN account, for external subscribers please send an eMail\nto ",(0,o.jsx)(t.a,{href:"mailto:rucio-news-subscribe@cern.ch?subject=Subscribe",children:"rucio-news-subscribe@cern.ch"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"email-us",children:"Email us"}),"\n",(0,o.jsxs)(t.p,{children:["We'd love to hear from you! Get in contact with us\ndirectly via ",(0,o.jsx)(t.a,{href:"mailto:rucio-contact@cern.ch",children:"email"})]}),"\n",(0,o.jsx)(t.h2,{id:"social-media",children:"Social Media"}),"\n",(0,o.jsxs)(t.p,{children:["Follow us on ",(0,o.jsx)(t.a,{href:"https://fosstodon.org/@rucio",children:"Mastodon"})," to stay updated\nwith the latest on Rucio!"]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function c(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ae78d49.40c39d80.js b/assets/js/1ae78d49.40c39d80.js new file mode 100644 index 0000000000..2a3a553738 --- /dev/null +++ b/assets/js/1ae78d49.40c39d80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6552],{78760:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>d,frontMatter:()=>c,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"contact_us","title":"Contact us","description":"We know getting started can be difficult, which is why","source":"@site/../docs/contact_us.md","sourceDirName":".","slug":"/contact_us","permalink":"/documentation/contact_us","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/contact_us.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"contact_us","title":"Contact us"},"sidebar":"docs","previous":{"title":"About Our Contributors","permalink":"/documentation/about_our_contributors"}}');var o=n(74848),s=n(28453);const c={id:"contact_us",title:"Contact us"},a=void 0,r={},u=[{value:"Chat with us",id:"chat-with-us",level:2},{value:"Weekly Rucio meeting",id:"weekly-rucio-meeting",level:2},{value:"Rucio news mailing list",id:"rucio-news-mailing-list",level:2},{value:"Email us",id:"email-us",level:2},{value:"Social Media",id:"social-media",level:2}];function l(e){const t={a:"a",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"We know getting started can be difficult, which is why\nour developers are always happy to help out! Reach out\nto us on any of the below channels for any assistance\nwith Rucio."}),"\n",(0,o.jsx)(t.h2,{id:"chat-with-us",children:"Chat with us"}),"\n",(0,o.jsxs)(t.p,{children:["We have a dedicated Mattermost team for questions, support, news, development\nupdates and all things Rucio and you can be a part of it too!\nClick ",(0,o.jsx)(t.a,{href:"/documentation/join_rucio_mattermost",children:"here"})]}),"\n",(0,o.jsx)(t.h2,{id:"weekly-rucio-meeting",children:"Weekly Rucio meeting"}),"\n",(0,o.jsxs)(t.p,{children:["The Rucio community gathers for a meeting every Thursday at 3 PM CEST to discuss\ncommunity news, operational issues and questions, as well as ongoing & further\ncontributions by the development team. The meeting is open to the public\nand you can view the schedule ",(0,o.jsx)(t.a,{href:"https://indico.cern.ch/category/10588/",children:"here"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"rucio-news-mailing-list",children:"Rucio news mailing list"}),"\n",(0,o.jsxs)(t.p,{children:["We have a dedicated news mailing list for general announcements (<10 eMails per\nyear) for the Rucio community. You can subscribe to ",(0,o.jsx)(t.a,{href:"https://e-groups.cern.ch/e-groups/Egroup.do?egroupId=10586148",children:"rucio-news@cern.ch"}),"\ndirectly with a CERN account, for external subscribers please send an eMail\nto ",(0,o.jsx)(t.a,{href:"mailto:rucio-news-subscribe@cern.ch?subject=Subscribe",children:"rucio-news-subscribe@cern.ch"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"email-us",children:"Email us"}),"\n",(0,o.jsxs)(t.p,{children:["We'd love to hear from you! Get in contact with us\ndirectly via ",(0,o.jsx)(t.a,{href:"mailto:rucio-contact@cern.ch",children:"email"})]}),"\n",(0,o.jsx)(t.h2,{id:"social-media",children:"Social Media"}),"\n",(0,o.jsxs)(t.p,{children:["Follow us on ",(0,o.jsx)(t.a,{href:"https://fosstodon.org/@rucio",children:"Mastodon"})," to stay updated\nwith the latest on Rucio!"]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function c(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b18b8b2.1da8b5ae.js b/assets/js/1b18b8b2.1da8b5ae.js deleted file mode 100644 index f9df7a1a45..0000000000 --- a/assets/js/1b18b8b2.1da8b5ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8939],{78780:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"started/requirements","title":"Requirements","description":"Rucio relies on several dependencies, some of them being a hard requirement,","source":"@site/../docs/started/requirements.md","sourceDirName":"started","slug":"/started/requirements","permalink":"/documentation/started/requirements","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/requirements.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"requirements","title":"Requirements","sidebar_label":"Requirements"},"sidebar":"docs","previous":{"title":"Additional Layers and Resources","permalink":"/documentation/started/additional_layers_and_resources"},"next":{"title":"Rucio account","permalink":"/documentation/started/concepts/rucio_account"}}');var s=n(74848),i=n(28453);const d={id:"requirements",title:"Requirements",sidebar_label:"Requirements"},o=void 0,c={},a=[{value:"Python",id:"python",level:2},{value:"Database",id:"database",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Rucio relies on several dependencies, some of them being a hard requirement,\nothers being optional depending on the used Rucio functionality."}),"\n",(0,s.jsxs)(t.p,{children:["To install Rucio, we generally recommend a Kubernetes-based deployment based on\nour ",(0,s.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"helm-charts"}),". A direct deployment\nusing Rucio ",(0,s.jsx)(t.a,{href:"https://hub.docker.com/u/rucio",children:"docker containers"}),", or Rucio\n",(0,s.jsx)(t.a,{href:"https://pypi.org/project/rucio/",children:"pip"})," packages is also possible."]}),"\n",(0,s.jsx)(t.h2,{id:"python",children:"Python"}),"\n",(0,s.jsx)(t.p,{children:"Rucio server, daemons and clients are written in Python and thus depend on an\ninstalled Python interpreter."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Rucio release"}),(0,s.jsx)(t.th,{children:"Supported python versions"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/release-notes/1.29.0",children:"1.29 LTS"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:">=3.6, <=3.9"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["from ",(0,s.jsx)(t.a,{href:"/release-notes/32.0.0",children:"32 LTS"})]}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:">=3.9, <=3.10"})})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"database",children:"Database"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Database"}),(0,s.jsx)(t.th,{children:"Supported version"}),(0,s.jsx)(t.th,{children:"Note"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SQLite"}),(0,s.jsx)(t.td,{children:"3+"}),(0,s.jsx)(t.td,{children:"For testing only"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"MySQL"}),(0,s.jsx)(t.td,{children:"8"}),(0,s.jsx)(t.td,{children:"No support for SSH public key authentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PostgreSQL"}),(0,s.jsx)(t.td,{children:"12 and higher"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Oracle"}),(0,s.jsx)(t.td,{children:"19c"}),(0,s.jsx)(t.td,{})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>o});var r=n(96540);const s={},i=r.createContext(s);function d(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b18b8b2.79a3d46e.js b/assets/js/1b18b8b2.79a3d46e.js new file mode 100644 index 0000000000..0abd7f14e3 --- /dev/null +++ b/assets/js/1b18b8b2.79a3d46e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8939],{78780:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"started/requirements","title":"Requirements","description":"Rucio relies on several dependencies, some of them being a hard requirement,","source":"@site/../docs/started/requirements.md","sourceDirName":"started","slug":"/started/requirements","permalink":"/documentation/started/requirements","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/requirements.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"requirements","title":"Requirements","sidebar_label":"Requirements"},"sidebar":"docs","previous":{"title":"Additional Layers and Resources","permalink":"/documentation/started/additional_layers_and_resources"},"next":{"title":"Rucio account","permalink":"/documentation/started/concepts/rucio_account"}}');var s=n(74848),i=n(28453);const d={id:"requirements",title:"Requirements",sidebar_label:"Requirements"},o=void 0,c={},a=[{value:"Python",id:"python",level:2},{value:"Database",id:"database",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Rucio relies on several dependencies, some of them being a hard requirement,\nothers being optional depending on the used Rucio functionality."}),"\n",(0,s.jsxs)(t.p,{children:["To install Rucio, we generally recommend a Kubernetes-based deployment based on\nour ",(0,s.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"helm-charts"}),". A direct deployment\nusing Rucio ",(0,s.jsx)(t.a,{href:"https://hub.docker.com/u/rucio",children:"docker containers"}),", or Rucio\n",(0,s.jsx)(t.a,{href:"https://pypi.org/project/rucio/",children:"pip"})," packages is also possible."]}),"\n",(0,s.jsx)(t.h2,{id:"python",children:"Python"}),"\n",(0,s.jsx)(t.p,{children:"Rucio server, daemons and clients are written in Python and thus depend on an\ninstalled Python interpreter."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Rucio release"}),(0,s.jsx)(t.th,{children:"Supported python versions"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"/release-notes/1.29.0",children:"1.29 LTS"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:">=3.6, <=3.9"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["from ",(0,s.jsx)(t.a,{href:"/release-notes/32.0.0",children:"32 LTS"})]}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:">=3.9, <=3.10"})})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"database",children:"Database"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Database"}),(0,s.jsx)(t.th,{children:"Supported version"}),(0,s.jsx)(t.th,{children:"Note"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SQLite"}),(0,s.jsx)(t.td,{children:"3+"}),(0,s.jsx)(t.td,{children:"For testing only"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"MySQL"}),(0,s.jsx)(t.td,{children:"8"}),(0,s.jsx)(t.td,{children:"No support for SSH public key authentication"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PostgreSQL"}),(0,s.jsx)(t.td,{children:"12 and higher"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Oracle"}),(0,s.jsx)(t.td,{children:"19c"}),(0,s.jsx)(t.td,{})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>o});var r=n(96540);const s={},i=r.createContext(s);function d(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1baa3d0c.e4dea5c2.js b/assets/js/1baa3d0c.e4dea5c2.js deleted file mode 100644 index a821435be4..0000000000 --- a/assets/js/1baa3d0c.e4dea5c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4390],{1469:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"operator/administration","title":"Rucio Administration Tricks","description":"Rucio container code hot-patching","source":"@site/../docs/operator/administration.md","sourceDirName":"operator","slug":"/operator/administration","permalink":"/documentation/operator/administration","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/administration.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"administration","title":"Rucio Administration Tricks","sidebar_label":"Administration Tricks"},"sidebar":"docs","previous":{"title":"Database Operations","permalink":"/documentation/operator/database"},"next":{"title":"Configuration parameters","permalink":"/documentation/operator/configuration_parameters"}}');var r=n(74848),i=n(28453);const a={id:"administration",title:"Rucio Administration Tricks",sidebar_label:"Administration Tricks"},c=void 0,s={},l=[{value:"Rucio container code hot-patching",id:"rucio-container-code-hot-patching",level:2},{value:"Creating a patch from existing pull request",id:"creating-a-patch-from-existing-pull-request",level:3},{value:"Mounting a patch in a kubernetes cluster",id:"mounting-a-patch-in-a-kubernetes-cluster",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"rucio-container-code-hot-patching",children:"Rucio container code hot-patching"}),"\n",(0,r.jsx)(t.p,{children:"The rucio official containers provide a way to hotpatch the source code\nbefore running rucio. This behavior may be used to rapidly fix a production\ndeployment without having to wait for the change to be merged and released by\nthe rucio team."}),"\n",(0,r.jsxs)(t.p,{children:["The behavior is very simple: any file found in the ",(0,r.jsx)(t.code,{children:"/patch/*"})," directory inside\nthe containers will be fed to the ",(0,r.jsx)(t.code,{children:"patch"})," command-line tool in the order\nreturned by this glob matching."]}),"\n",(0,r.jsx)(t.p,{children:"The procedures described bellow are only intended for temporary fixes. If a\npermanent change is needed, we highly encourage you to open a pull request\nin rucio to spare you the toil related to maintaining your own local patch set."}),"\n",(0,r.jsx)(t.h3,{id:"creating-a-patch-from-existing-pull-request",children:"Creating a patch from existing pull request"}),"\n",(0,r.jsxs)(t.p,{children:["Lets assume you run rucio ",(0,r.jsx)(t.code,{children:"1.27.3"})," in production, and you realize there is\na bug in the ",(0,r.jsx)(t.code,{children:"conveyor-poller"})," daemon. You contact the rucio team and are\ntold that a fix was already done in the pull request\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/rucio/pull/5246/commits",children:"#5246"}),"\nand will be released next week. Follow\nthe following steps to create a patch file from this pull request without\nhaving to wait for the next rucio release to fix your issue:"]}),"\n",(0,r.jsx)(t.p,{children:"Clone the main rucio repository:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/rucio/rucio.git\ncd rucio\n# Create a new branch from the 1.27.3 release tag\ngit checkout 1.27.3 -b patch-0-hotfix_conveyor_poller_on_1.27.3\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The #5246 pull request was submitted by the user ",(0,r.jsx)(t.code,{children:"rcarpa"})," from his rucio\nfork ",(0,r.jsx)(t.a,{href:"https://github.com/rcarpa/rucio",children:"rcarpa/rucio"}),". You'll have to add\nthis fork repository as a git remote:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git remote add rcarpa https://github.com/rcarpa/rucio.git\ngit fetch rcarpa\n# Cherry-pick the commit from the #5246 pull request.\n# Beware, some PR can have multiple commits\ngit cherry-pick 47d36345469ac9c1391cacd09487d4ec6ced627f\n"})}),"\n",(0,r.jsx)(t.p,{children:"Now you can create the patch with the differences between the rucio 1.27.3\nrelease and the current state of the repository:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git diff 1.27.3 > hotfix_conveyor_poller.patch\n"})}),"\n",(0,r.jsx)(t.h3,{id:"mounting-a-patch-in-a-kubernetes-cluster",children:"Mounting a patch in a kubernetes cluster"}),"\n",(0,r.jsxs)(t.p,{children:["If you deploy rucio in a kubernetes cluster using the official rucio\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts/",children:"helm charts"})," and want to hotfix\nrucio using a patch file created in the previous section, follow these steps:"]}),"\n",(0,r.jsx)(t.p,{children:"Create a kubernetes secret from the hotfix patch:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"kubectl -n rucio create secret generic hotfix-conveyor-poller-patch --from-file=hotfix_conveyor_poller.patch\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.em,{children:"Note:"})," if you have more than one cluster, don't forget to create the\nsecrets in each cluster to be patched."]}),"\n",(0,r.jsxs)(t.p,{children:["Now you'll have to update the helm ",(0,r.jsx)(t.code,{children:"values"})," file for each helm release and\nadd the following"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:" secretMounts:\n - secretFullName: hotfix-conveyor-poller-patch\n mountPath: /patch/hotfix_conveyor_poller.patch\n subPath: hotfix_conveyor_poller.patch\n"})})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var o=n(96540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1baa3d0c.ff6f16b9.js b/assets/js/1baa3d0c.ff6f16b9.js new file mode 100644 index 0000000000..ff77754c88 --- /dev/null +++ b/assets/js/1baa3d0c.ff6f16b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4390],{1469:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"operator/administration","title":"Rucio Administration Tricks","description":"Rucio container code hot-patching","source":"@site/../docs/operator/administration.md","sourceDirName":"operator","slug":"/operator/administration","permalink":"/documentation/operator/administration","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/administration.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"administration","title":"Rucio Administration Tricks","sidebar_label":"Administration Tricks"},"sidebar":"docs","previous":{"title":"Database Operations","permalink":"/documentation/operator/database"},"next":{"title":"Configuration parameters","permalink":"/documentation/operator/configuration_parameters"}}');var o=n(74848),i=n(28453);const a={id:"administration",title:"Rucio Administration Tricks",sidebar_label:"Administration Tricks"},c=void 0,s={},l=[{value:"Rucio container code hot-patching",id:"rucio-container-code-hot-patching",level:2},{value:"Creating a patch from existing pull request",id:"creating-a-patch-from-existing-pull-request",level:3},{value:"Mounting a patch in a kubernetes cluster",id:"mounting-a-patch-in-a-kubernetes-cluster",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"rucio-container-code-hot-patching",children:"Rucio container code hot-patching"}),"\n",(0,o.jsx)(t.p,{children:"The rucio official containers provide a way to hotpatch the source code\nbefore running rucio. This behavior may be used to rapidly fix a production\ndeployment without having to wait for the change to be merged and released by\nthe rucio team."}),"\n",(0,o.jsxs)(t.p,{children:["The behavior is very simple: any file found in the ",(0,o.jsx)(t.code,{children:"/patch/*"})," directory inside\nthe containers will be fed to the ",(0,o.jsx)(t.code,{children:"patch"})," command-line tool in the order\nreturned by this glob matching."]}),"\n",(0,o.jsx)(t.p,{children:"The procedures described bellow are only intended for temporary fixes. If a\npermanent change is needed, we highly encourage you to open a pull request\nin rucio to spare you the toil related to maintaining your own local patch set."}),"\n",(0,o.jsx)(t.h3,{id:"creating-a-patch-from-existing-pull-request",children:"Creating a patch from existing pull request"}),"\n",(0,o.jsxs)(t.p,{children:["Lets assume you run rucio ",(0,o.jsx)(t.code,{children:"1.27.3"})," in production, and you realize there is\na bug in the ",(0,o.jsx)(t.code,{children:"conveyor-poller"})," daemon. You contact the rucio team and are\ntold that a fix was already done in the pull request\n",(0,o.jsx)(t.a,{href:"https://github.com/rucio/rucio/pull/5246/commits",children:"#5246"}),"\nand will be released next week. Follow\nthe following steps to create a patch file from this pull request without\nhaving to wait for the next rucio release to fix your issue:"]}),"\n",(0,o.jsx)(t.p,{children:"Clone the main rucio repository:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/rucio/rucio.git\ncd rucio\n# Create a new branch from the 1.27.3 release tag\ngit checkout 1.27.3 -b patch-0-hotfix_conveyor_poller_on_1.27.3\n"})}),"\n",(0,o.jsxs)(t.p,{children:["The #5246 pull request was submitted by the user ",(0,o.jsx)(t.code,{children:"rcarpa"})," from his rucio\nfork ",(0,o.jsx)(t.a,{href:"https://github.com/rcarpa/rucio",children:"rcarpa/rucio"}),". You'll have to add\nthis fork repository as a git remote:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git remote add rcarpa https://github.com/rcarpa/rucio.git\ngit fetch rcarpa\n# Cherry-pick the commit from the #5246 pull request.\n# Beware, some PR can have multiple commits\ngit cherry-pick 47d36345469ac9c1391cacd09487d4ec6ced627f\n"})}),"\n",(0,o.jsx)(t.p,{children:"Now you can create the patch with the differences between the rucio 1.27.3\nrelease and the current state of the repository:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git diff 1.27.3 > hotfix_conveyor_poller.patch\n"})}),"\n",(0,o.jsx)(t.h3,{id:"mounting-a-patch-in-a-kubernetes-cluster",children:"Mounting a patch in a kubernetes cluster"}),"\n",(0,o.jsxs)(t.p,{children:["If you deploy rucio in a kubernetes cluster using the official rucio\n",(0,o.jsx)(t.a,{href:"https://github.com/rucio/helm-charts/",children:"helm charts"})," and want to hotfix\nrucio using a patch file created in the previous section, follow these steps:"]}),"\n",(0,o.jsx)(t.p,{children:"Create a kubernetes secret from the hotfix patch:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"kubectl -n rucio create secret generic hotfix-conveyor-poller-patch --from-file=hotfix_conveyor_poller.patch\n"})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.em,{children:"Note:"})," if you have more than one cluster, don't forget to create the\nsecrets in each cluster to be patched."]}),"\n",(0,o.jsxs)(t.p,{children:["Now you'll have to update the helm ",(0,o.jsx)(t.code,{children:"values"})," file for each helm release and\nadd the following"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:" secretMounts:\n - secretFullName: hotfix-conveyor-poller-patch\n mountPath: /patch/hotfix_conveyor_poller.patch\n subPath: hotfix_conveyor_poller.patch\n"})})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var r=n(96540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6323a9.52121db8.js b/assets/js/1f6323a9.52121db8.js new file mode 100644 index 0000000000..cc660649b9 --- /dev/null +++ b/assets/js/1f6323a9.52121db8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6068],{34369:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"developer/webui/streamedtables","title":"Using the WebUI StreamedTable Component","description":"Data presentation in the WebUI","source":"@site/../docs/developer/webui/streamedtables.md","sourceDirName":"developer/webui","slug":"/developer/webui/streamedtables","permalink":"/documentation/developer/webui/streamedtables","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/streamedtables.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"streamedtables","title":"Using the WebUI StreamedTable Component"},"sidebar":"docs","previous":{"title":"Setting up a WebUI Developer Environment using Visual Studio Code","permalink":"/documentation/developer/webui/webui_frontend_vscode_dev_env"},"next":{"title":"Developing the WebUI Frontend","permalink":"/documentation/developer/webui/webui_frontend"}}');var s=t(74848),a=t(28453);const l={id:"streamedtables",title:"Using the WebUI StreamedTable Component"},o=void 0,r={},c=[{value:"Data presentation in the WebUI",id:"data-presentation-in-the-webui",level:2},{value:"StreamedTable",id:"streamedtable",level:2},{value:"TableColumns",id:"tablecolumns",level:3},{value:"Common components for column headers",id:"common-components-for-column-headers",level:3},{value:"TableSortUpDown",id:"tablesortupdown",level:4},{value:"TableFilterDiscrete",id:"tablefilterdiscrete",level:4},{value:"TableFilterBoolean",id:"tablefilterboolean",level:4},{value:"TableFilterString",id:"tablefilterstring",level:4},{value:"Common components for column cells",id:"common-components-for-column-cells",level:3},{value:"TableStyling",id:"tablestyling",level:3},{value:"Setting column widths",id:"setting-column-widths",level:3},{value:"TableSelecting",id:"tableselecting",level:3},{value:"NormalTable",id:"normaltable",level:3},{value:"StreamedTable in the context of NextJS",id:"streamedtable-in-the-context-of-nextjs",level:2},{value:"QueryClientProvider",id:"queryclientprovider",level:4},{value:"Route",id:"route",level:4}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"data-presentation-in-the-webui",children:"Data presentation in the WebUI"}),"\n",(0,s.jsx)(n.p,{children:'An issue we encountered in the process of developing the WebUI which is\nparticularly relevant in the context of writing a Rucio frontend is streaming.\nThe "old" web frontend (which we want to replace) had the issue that it would\nfreeze on starting larger queries, with no indication as to the progress made or\npotential errors encountered. Even when everything worked well, these "freezes"\ncould last for up to several minutes in which the page was effectively unusable.'}),"\n",(0,s.jsx)(n.p,{children:"The reason for this was the fact that any responses from the Rucio server (which\nsupports streaming) were stored in a WebUI intermediary, before being forwarded\nto the client in one batch. Since Rucio responses can be huge (and often, there\nis no prior indication of the size which a query will take), this could lead to\nfreezing of unknown duration."}),"\n",(0,s.jsxs)(n.p,{children:["The solution would be to pass the stream from Rucio through the WebUI\nbackend/core to the frontend. This required special software engineering on the\nbackend, which shall not be covered here. The frontend accesses the streams via\na system called the ",(0,s.jsx)(n.code,{children:"ComDOM"}),", short for ",(0,s.jsx)(n.code,{children:"Communication Document Object Model"}),".\nIt accesses the streams provided by the backend API layer (and NOT the Rucio\nserver itself) and wraps the data with further tooling (to start/pause/stop the\nstream, inspect the state, etc.)."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["Streamed data is unavoidable in the WebUI. The UI accesses this data in the form\nof the ",(0,s.jsx)(n.code,{children:"ComDOM"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["The generic component when dealing with streamed data is the ",(0,s.jsx)(n.code,{children:"StreamedTable"}),",\nwhich is a custom HTML table framework based on ",(0,s.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/introduction",children:"Tanstack\nTable"})," and optimized for\nuse with the streams fed in via the ComDOM. A StreamedTable is defined by a set\nof react props passed into the component (which will be described below). The\nframework is completed by a plethora of ready-to-use components which solve the\nmajority of required usecases when it comes to streamed tables."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"StreamedTable Example",src:t(2119).A+"",width:"892",height:"456"})}),"\n",(0,s.jsx)(n.h2,{id:"streamedtable",children:"StreamedTable"}),"\n",(0,s.jsxs)(n.p,{children:["The StreamedTable is a fully typed react component based on the HTML ",(0,s.jsx)(n.code,{children:"table"})," element. The props it takes are defined in the codeblock below."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'type StreamedTableProps = JSX.IntrinsicElements["table"] & {\n tablecomdom: UseComDOM\n tablecolumns: any[]\n tablestyling?: TableStyling\n tableselecting?: TableSelecting\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The table expects a stream of elements of type ",(0,s.jsx)(n.code,{children:"T"}),", where ",(0,s.jsx)(n.code,{children:"T"})," extends the\n",(0,s.jsx)(n.code,{children:"BaseViewModel"}),". In practice, this means that an entity is wrapped in an object\nproviding status and an optional errormessage."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The data shown by the table is passed into the ",(0,s.jsx)(n.code,{children:"tablecomdom"})," prop as an\n",(0,s.jsx)(n.code,{children:"UseComDOM"})," object. This object also provides functions to inspect and control\nthe stream. The generic ",(0,s.jsx)(n.code,{children:"UseComDOM"})," type is bound to type ",(0,s.jsx)(n.code,{children:"T"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The table structure (i.e. the way data is structured into columns) is defined\nby the ",(0,s.jsx)(n.code,{children:"tablecolumns"})," prop. This is essentially an array of column definition\nobjects (which are taken from Tanstack Table), but there are exceptions, which\nmake typing this prop difficult. Most of your time building a streamedtable is\nspent writing this definition."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The first optional prop, ",(0,s.jsx)(n.code,{children:"tablestyling"})," is a structure containing style\ncommands for the table. The definition of the ",(0,s.jsx)(n.code,{children:"TableStyling"})," type is given\nbelow."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"tableselecting"}),' optionally defines how the user can select (single- or\nmulti-select) elements from the table. It also controls the "breakout"\nfunctionality. This is discussed later.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'JSX.IntrinsicElements["table"]'})," means that the StreamedTable component will\nreturn a react component with the HTML ",(0,s.jsx)(n.code,{children:""})," tag as its top-level component,\nwhich in turn means that any valid HTML table-properties can be passed to the\nStreamedTable, and these will be passed on to the top-level component. This\nspecifically also includes styling the top-level ",(0,s.jsx)(n.code,{children:"
    "})," via ",(0,s.jsx)(n.code,{children:"className"})," but\nalso ARIA-properties."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"tablecolumns",children:"TableColumns"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"When creating a new component or editing a new one, it is very useful to view the table in Storybook."})}),"\n",(0,s.jsxs)(n.p,{children:["The definition of the tablecolumns can be taken from the\n",(0,s.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/guide/column-defs",children:"Tanstack Table Documentation"}),".\nA simple example shall be discussed here nonetheless. The following code snippet\nhas been adapted from ",(0,s.jsx)(n.code,{children:"PageDIDMetadata"}),", with custom styles and most custom\ncomponents removed for clarity."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'// imports and type definitions\nimport { createColumnHelper } from "@tanstack/react-table"\ntype DIDKeyValuePairViewModel = {\n // from DIDKeyValuePair entity\n key: string;\n value: string;\n\n // from BaseViewModel\n status: \'success\' | \'error\' | \'pending\';\n message?: string;\n}\n\n// the streamedtable receives a stream of `DIDKeyValuePairViewModel`\n// each element is converted into a row\n// initialise the columnHelper to this type\nconst columnHelper = createColumnHelper()\n\n\n// define the tablecolumns array\nconst tablecolumns: any[] = [\n // Accessor columns have an underlying data model which means they can be\n // sorted, filtered, grouped, etc.\n columnHelper.accessor("key", { // this column accesses the "key" attribute\n id: "key",\n // function to render each body cell of the column, return JSX object\n // "info" contains the value but also other useful context -> read docs\n cell: info => {\n return (\n \n {info.getValue()}\n \n )\n },\n // funxtion to render header cell of column, return JSX object\n // "info": context useful for the creation of a header cell -> read docs\n header: info => {\n return (\n // this is a custom component that can be placed into the header\n // they are discussed further below\n \n )\n }\n }\n ),\n columnHelper.accessor("value", { // column accesses the "value" attribute\n id: "value",\n cell: info => {\n return (\n {info.getValue()}\n )\n },\n header: info => {\n return (\n // must not use a custom component, a simple

    tag is fine!\n

    Value

    \n )\n }\n })\n]\n'})}),"\n",(0,s.jsx)(n.p,{children:"Passing this column definition into a StreamedTable together with the ComDOM supplying the data like so"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"\n tablecomdom={comdom}\n tablecolumns={tablecolumns}\n/>\n"})}),"\n",(0,s.jsx)(n.p,{children:"will return a fully functional StreamedTable. This can be expanded upon to\ncreate much complex tables with multiple columns."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The StreamedTable is a wrapper for Tanstack Table. In particular, the column\ndefinitions have been taken over unchanged. This means that the documentation\nand examples provided by Tanstack are also valid in the StreamedTables, check\nthem out."})}),"\n",(0,s.jsx)(n.h3,{id:"common-components-for-column-headers",children:"Common components for column headers"}),"\n",(0,s.jsxs)(n.p,{children:["A number of reusable components have been added to the StreamedTable package\nwhich can be used to implement frequently-needed functionality such as sorting\nand filtering. An example of this has already been given in the code above, in\nwhich a ",(0,s.jsx)(n.code,{children:"TableFilterString"})," component used."]}),"\n",(0,s.jsxs)(n.p,{children:["These components are added in the column header definitions within the\n",(0,s.jsx)(n.code,{children:"tablecolumns"})," definition, i.e."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n header: info => ,\n ...\n})\n'})}),"\n",(0,s.jsx)(n.p,{children:"The remainder of this section will introduce each of the common table\ncomponents."}),"\n",(0,s.jsx)(n.h4,{id:"tablesortupdown",children:"TableSortUpDown"}),"\n",(0,s.jsx)(n.p,{children:"This component toggles the Tanstack Table sorting mechanism on mouseclick and\ncycles between no sorting, sorting in ascending order and sorting in descending\norder. Examples of column entries which can be sorted are numeric data and\ndates."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"TableSortUpDown Dirty",src:t(12603).A+"",width:"154",height:"400"})," ",(0,s.jsx)(n.img,{alt:"TableFilterBoolean Clean",src:t(37624).A+"",width:"161",height:"401"})]}),"\n",(0,s.jsx)(n.p,{children:"It takes the following props:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'props: JSX.IntrinsicElements["div"] & {\n name: string\n column: Column\n element?: JSX.Element\n stack?: boolean\n nocollapse?: boolean\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"name"})," is the string which will be used as the column header with a default\nstyle if no ",(0,s.jsx)(n.code,{children:"element"})," is defined"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"column"})," is the table column the header belongs to."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"element"})," is the JSX element which overrides ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"stack"})," determines whether the icon signifying the sorting state and the name\nelement are stacked vertically instead of horizontally. The example picture\nabove uses vertical stacking."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"nocollapse"})," will force the ",(0,s.jsx)(n.code,{children:"name"})," (or ",(0,s.jsx)(n.code,{children:"element"}),") to remain visible even on\nsmall screen widths (below 768px)."]}),"\n",(0,s.jsxs)(n.li,{children:["any props valid for a ",(0,s.jsx)(n.code,{children:"div"})," element will also work."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"tablefilterdiscrete",children:"TableFilterDiscrete"}),"\n",(0,s.jsx)(n.p,{children:"On mouseclick, it cycles through a list of keys and only displays the rows in\nwhich the column entry matches the key. Used when the column data is restricted\nto a small number of options, such as the Rucio enums."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"TableFilterDiscrete Dirty",src:t(52959).A+"",width:"236",height:"371"})," ",(0,s.jsx)(n.img,{alt:"TableFilterDiscrete Clean",src:t(52004).A+"",width:"232",height:"364"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type TableFilterDiscrete = JSX.IntrinsicElements["div"] & {\n name: string, // see TableSortUpDown\n keys: T[],\n renderFunc: (key: T | undefined) => JSX.Element,\n column: Column, // see TableSortUpDown\n stack?: boolean // see TableSortUpDown\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"keys"})," is a list of type ",(0,s.jsx)(n.code,{children:"T"})," where ",(0,s.jsx)(n.code,{children:"T"})," is the tyoe of the column entries.\nUsually a string enum."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"renderFunc"})," is the function used to render the icon to the side or below the\ntext (depending on whether ",(0,s.jsx)(n.code,{children:"state"})," is set)."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"tablefilterboolean",children:"TableFilterBoolean"}),"\n",(0,s.jsxs)(n.p,{children:["A special form of ",(0,s.jsx)(n.code,{children:"TableFilterDiscrete"})," in which the values are booleans. This\nmeans that no ",(0,s.jsx)(n.code,{children:"renderFunc"})," needs to be supplied."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"TableFilterBoolean in Action",src:t(18479).A+"",width:"430",height:"185"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'// see TableFilterDiscrete\ntype TableFilterBoolean = JSX.IntrinsicElements["div"] & {\n name: string,\n column: Column,\n stack?: boolean\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"tablefilterstring",children:"TableFilterString"}),"\n",(0,s.jsx)(n.p,{children:"A filter in which the column entries are strings."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"TableFilterString Dirty",src:t(86965).A+"",width:"828",height:"370"})," ",(0,s.jsx)(n.img,{alt:"TableFilterString Clean",src:t(22174).A+"",width:"825",height:"114"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type TableFilterString = JSX.IntrinsicElements["form"] & {\n column: Column, // see TableFilterDiscrete\n name: string, // see TableFilterDiscrete\n placeholder?: string,\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"placeholder"})," is the placeholder string for the textbox"]}),"\n",(0,s.jsxs)(n.li,{children:["this component is not derived from ",(0,s.jsx)(n.code,{children:"div"})," but from ",(0,s.jsx)(n.code,{children:"form"}),". Any attributes valid\nin ",(0,s.jsx)(n.code,{children:"form"})," are also valid here."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"These common StreamedTable components are very helpful in reducing the\ncomplexity of the column definitions you write. They also ensure a common design\nlanguage throughout the project. We encourage you to use them as much as\npossible."})}),"\n",(0,s.jsx)(n.h3,{id:"common-components-for-column-cells",children:"Common components for column cells"}),"\n",(0,s.jsx)(n.p,{children:"The selection here is quite limited right now, but shall be extended in order to\nkeep a common design language. It is also much easier to keep the project\naccessible if the total number of unique components is kept low."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"TableInternalLink"})," for links within the rucio webui"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"TableExternalLink"})," for links pointing outside of the rucio webui."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"tablestyling",children:"TableStyling"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["As with the rest of the Rucio WebUI, the StreamedTable is styled via ",(0,s.jsx)(n.a,{href:"https://tailwindcss.com/",children:"Tailwind\nCSS"}),". This means that styles are constructed by\nassigning various classes to an element. Tailwind will then compile a minimal\nset of CSS."]})}),"\n",(0,s.jsx)(n.p,{children:"This optional StreamedTable attribute itself only contains optional members. It\nis used to add to or override table styling settings."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"type TableStyling = Partial<{\n visibility?: Record\n tableHeadRowStyle?: string\n tableBodyRowStyle?: string\n pageSize?: number\n tableFooterStack?: boolean\n}>\n"})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"visibility"})," maps a column's visibility (boolean) to the column id (string)."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tableHeadRowStyle"}),": the classes which shall get passed to the ",(0,s.jsx)(n.code,{children:"tr"})," in the\n",(0,s.jsx)(n.code,{children:"thead"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tableBodyRowStyle"}),": the classes which shall get passed to each ",(0,s.jsx)(n.code,{children:"tr"})," in the\n",(0,s.jsx)(n.code,{children:"tbody"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pageSize"})," is how many rows are shown per page at maximum."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tableFooterStack"})," will stack table footer components in order to save\nhorizontal space."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"setting-column-widths",children:"Setting column widths"}),"\n",(0,s.jsx)(n.p,{children:"Column widths are set automatically, but they can be styled individually. This\nis done by adding a string of class names to the column definition in the\nfollowing way:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n meta: {\n style: "w-28 md:w-56" // see tailwind documentation for an explanation\n },\n ...\n})\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The Tailwind compiler has been configured to consider these styles as well when\nputting together the minimal set of CSS. Internally, the styles defined here are\napplied to the header cell. Since the StreamedTable ",(0,s.jsx)(n.code,{children:"table"})," element uses\n",(0,s.jsx)(n.code,{children:"table-layout: fixed"}),", the column widths of the first row will be applied to\neach of the following rows as well."]}),"\n",(0,s.jsx)(n.h3,{id:"tableselecting",children:"TableSelecting"}),"\n",(0,s.jsx)(n.p,{children:'This optional table attribute handles selecting rows and the "breakout". The\nbreakout is an infopanel placed under the table which shows columns for a single\nselected row (these columns would otherwise be hidden due to lack of horizontal\nspace), see the image below for an example.'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"type TableSelecting = { // where T is the type of the table rows\n handleChange: (data: T[]) => void,\n enableRowSelection: boolean,\n enableMultiRowSelection?: boolean,\n breakOut?: {\n breakoutVisibility: boolean,\n keys: Record, // column id, displayname\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"handleChange"})," is the function which is run each time the selection state\nchanges."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"enableRowSelection"}),": whether to enable row selection"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"enableMultiRowSelection"}),": whether to allow row multi-select (only valid if\nrow selection is enabled)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"breakout.breakoutVisibility"}),": whether to allow showing the breakout when a\nrow is selected. Often coupled to the horizontal window size."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"breakout.keys"}),": matching column id to the name under which it is to be\ndisplayed. The column ids determine which columns are going to be added to the\nbreakout. Usually, these columns end up being the columns that were hidden due\nto lack of horizontal space."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Table Breakout",src:t(45955).A+"",width:"889",height:"588"})}),"\n",(0,s.jsx)(n.h3,{id:"normaltable",children:"NormalTable"}),"\n",(0,s.jsxs)(n.p,{children:["The StreamedTable design is part of the design language of the Rucio WebUI, and\nwe intend for all tables (even if they are non-streaming) to follow this design.\nIt follows that we created the ",(0,s.jsx)(n.code,{children:"NormalTable"}),", which keeps the same design as the\nStreamedTable but without the streaming capabilities."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type NormalTableProps = JSX.IntrinsicElements["table"] & {\n tablecolumns: any[] // see StreamedTable\n tablestyling?: TableStyling // see StreamedTable\n tableselecting?: TableSelecting // see StreamedTable\n tabledata: T[]\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tabledata"}),": instead of passing a comdom which wraps the streamed data, we pas\nthe data directly in the form of an array."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"streamedtable-in-the-context-of-nextjs",children:"StreamedTable in the context of NextJS"}),"\n",(0,s.jsx)(n.p,{children:"The StreamedTable relies on streams, which are rapped in the ComDOM. Until now,\nwe have taken the existence of a functioning ComDOM as given. In this section,\nwe will discuss how to properly embed the StreamedTable in the wider context of\nthe NextJS web application."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["The frontend uses the NextJS app router. ",(0,s.jsx)(n.a,{href:"https://nextjs.org/docs",children:"Look at their\ndocs"})," to learn more."]})}),"\n",(0,s.jsx)(n.h4,{id:"queryclientprovider",children:"QueryClientProvider"}),"\n",(0,s.jsx)(n.p,{children:"On a layout-file affecting the route containing the StreamedTable, include the\nfollowing code:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"'use client';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\n\nconst queryClient = new QueryClient();\n\nexport default function RootLayout({children}) {\n return (\n \n {children}\n \n )\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["where ",(0,s.jsx)(n.code,{children:"children"})," is a ",(0,s.jsx)(n.code,{children:"React.ReactNode"})," containing the StreamedTable."]}),"\n",(0,s.jsx)(n.h4,{id:"route",children:"Route"}),"\n",(0,s.jsxs)(n.p,{children:["On the route which returns the page including the StreamedTable, you must\ninitialise the ComDOM. You can optionally auto-start the ComDOM query or wait\nfor the user to trigger it manually -- this will not be covered in-depth here,\nsince this is more closely related to the ComDOM itself than to the\nStreamedTable. An example, taken and adapted from the ",(0,s.jsx)(n.code,{children:"ListSubscription"})," route,\nwould be:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'\'use client\';\nimport { ListSubscription as ListSubscriptionStory } from "@/component-library/Pages/Subscriptions/ListSubscription";\nimport { useEffect } from "react";\nimport useComDOM from "@/lib/infrastructure/hooks/useComDOM";\nimport { SubscriptionRuleStatesViewModel } from "@/lib/infrastructure/data/view-model/subscriptions";\n\nexport default function ListSubscription({ params }: { params: { account: string }}) {\n // initialise ComDOM\n const ComDOM = useComDOM(\n "subscription-rule-states-query",\n [],\n false,\n Infinity,\n 50,\n true\n )\n // auto-start query, GET data from /api/list-subscription, use param account\n useEffect(() => {\n const runQuery = async () => {\n await ComDOM.start({\n url: new URL("http://localhost:3000/api/list-subscription"),\n method: "GET",\n headers: new Headers({\n \'Content-Type\': \'application/json\'\n } as HeadersInit),\n params: {\n "account": params.account,\n }\n })\n }\n runQuery()\n }, [])\n // * return a react component\n // * in this case the StreamedTable is wrapped by a Storybook Page\n // * we pass the ComDOM to this page so that it may be passed further down\n // to the StreamedTable\n return (\n
    \n \n
    \n )\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},45955:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/breakout-bb5c25810ca88b4c2af415335d3d7d57.png"},18479:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-boolean-all-22de7b045ffd375da711fbeb0e3bfd63.png"},52004:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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"},52959:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-discrete-dirty-0910e099615f469d47dede0b1ab14040.png"},22174:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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OlqxQ3z81ri4uMTEhBMnvps5c6aRkdHkyZNZ15Url1nx58/Y5jTXrFm7efOmvn37fvrpulmzZr/77rs9e/YkoosX83meX7o08ubNm998838ZTiQSsY158+bv3bt34cKF77479Ny5c//617/EYt2QkJA2vwEAAAB4C3E8zyt/rqurJaKUlJSwsOlXr14xNzcnopiYmLi4DbduFWtra8vlclvbPnZ2dt9++z/skEOH0idPnnzp0q+WlpaspVcv86ampsLC37p3765cPCxsemZm5vXr17S0tIjo4MFDkyZNOnw43cfHp/VRyuVyPb0ea9eumT9/fptTio6O3rx5y717d4no6dOnYrHesGHDjh49wnqnT59x4cKF/PwLyof4+fmJxXopKf9WPmMr0/zpp5+GDft/n322bt68eURUUlJibd179+5d48ePV55sUVHRjz+eUj7R1atXXV3dli9f9s9//pO1LFy48NixzMuXC9qcFwAAALyFWl7QGjlylJaW1sGDB9nHAwdSR47019bWJqIrV66UlJQEB/9xPdTT892mpqZLly4pVxgxYnizoEZEFy6c9/DwYEGN7UNEP//8s2KH2tra6mcU1zGJSCgU2tvbb9u2PSEh4bfffmtqalIuW11dvWLFSldXN2PjnhKJ/mefRVdWVrKVPMbNzU2x7erqWlRU1NDQ0Pr30p5p9uvXj20YGRkJBIIHDx60XpOIvvsuh4gmTvyj7Lvvet66dUtxhRQAAABAWctZrXt3nf/6L7/U1DQiKioqunLlSlBQEOt6+PAhEc2dO08i0Wd/Nja2RCST/a5cwcTE9Pmy1dWPJBKJ0lm6q6urV1X9EVOCg0NMTEzZX2pqqvKx33yzf+jQoVFRawYOdLW27q38OoyQkEn79u2LiJh//Hjm2bNnIiIiiEg5q+nqihTbYrEuEZWWlrb+vbRnmiy8MhzHKYfL1su6uAxUlA0NDSUimUzW5rEAAADwFnrhc6DjxgUFBwffvn37wIEDYrF4+PDhrJ2FrS+//GLIkCHK+xsaGip/FAqFz9cUi3UrKioUH2tqahobG/X0xIqW6OjPKiuXsu0+fWyVjzU3N9++fRsRFRYWrlz5yfz5EcOGDbOysiotLc3JydmxY3twcDDbUzmlMeXlD5ttS6XSF038pab5siQSCcdxJ09+361bN+V2CwuLP1MWAAAAuqoX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"},86965:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-string-dirty-dadee973219a779404cf2c4443cc5ee3.png"},37624:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-clean-18a717b9686dfecb04d47a3f794daf68.png"},12603:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-dirty-2148a91f5adf2a2c0272b096834b8c98.png"},2119:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/streamedtable-4cf5d169c74626898e013335a0a4d34a.png"},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6323a9.621bd53f.js b/assets/js/1f6323a9.621bd53f.js deleted file mode 100644 index 65e48a9229..0000000000 --- a/assets/js/1f6323a9.621bd53f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6068],{34369:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"developer/webui/streamedtables","title":"Using the WebUI StreamedTable Component","description":"Data presentation in the WebUI","source":"@site/../docs/developer/webui/streamedtables.md","sourceDirName":"developer/webui","slug":"/developer/webui/streamedtables","permalink":"/documentation/developer/webui/streamedtables","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/streamedtables.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"streamedtables","title":"Using the WebUI StreamedTable Component"},"sidebar":"docs","previous":{"title":"Setting up a WebUI Developer Environment using Visual Studio Code","permalink":"/documentation/developer/webui/webui_frontend_vscode_dev_env"},"next":{"title":"Developing the WebUI Frontend","permalink":"/documentation/developer/webui/webui_frontend"}}');var s=t(74848),a=t(28453);const l={id:"streamedtables",title:"Using the WebUI StreamedTable Component"},o=void 0,r={},c=[{value:"Data presentation in the WebUI",id:"data-presentation-in-the-webui",level:2},{value:"StreamedTable",id:"streamedtable",level:2},{value:"TableColumns",id:"tablecolumns",level:3},{value:"Common components for column headers",id:"common-components-for-column-headers",level:3},{value:"TableSortUpDown",id:"tablesortupdown",level:4},{value:"TableFilterDiscrete",id:"tablefilterdiscrete",level:4},{value:"TableFilterBoolean",id:"tablefilterboolean",level:4},{value:"TableFilterString",id:"tablefilterstring",level:4},{value:"Common components for column cells",id:"common-components-for-column-cells",level:3},{value:"TableStyling",id:"tablestyling",level:3},{value:"Setting column widths",id:"setting-column-widths",level:3},{value:"TableSelecting",id:"tableselecting",level:3},{value:"NormalTable",id:"normaltable",level:3},{value:"StreamedTable in the context of NextJS",id:"streamedtable-in-the-context-of-nextjs",level:2},{value:"QueryClientProvider",id:"queryclientprovider",level:4},{value:"Route",id:"route",level:4}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"data-presentation-in-the-webui",children:"Data presentation in the WebUI"}),"\n",(0,s.jsx)(n.p,{children:'An issue we encountered in the process of developing the WebUI which is\nparticularly relevant in the context of writing a Rucio frontend is streaming.\nThe "old" web frontend (which we want to replace) had the issue that it would\nfreeze on starting larger queries, with no indication as to the progress made or\npotential errors encountered. Even when everything worked well, these "freezes"\ncould last for up to several minutes in which the page was effectively unusable.'}),"\n",(0,s.jsx)(n.p,{children:"The reason for this was the fact that any responses from the Rucio server (which\nsupports streaming) were stored in a WebUI intermediary, before being forwarded\nto the client in one batch. Since Rucio responses can be huge (and often, there\nis no prior indication of the size which a query will take), this could lead to\nfreezing of unknown duration."}),"\n",(0,s.jsxs)(n.p,{children:["The solution would be to pass the stream from Rucio through the WebUI\nbackend/core to the frontend. This required special software engineering on the\nbackend, which shall not be covered here. The frontend accesses the streams via\na system called the ",(0,s.jsx)(n.code,{children:"ComDOM"}),", short for ",(0,s.jsx)(n.code,{children:"Communication Document Object Model"}),".\nIt accesses the streams provided by the backend API layer (and NOT the Rucio\nserver itself) and wraps the data with further tooling (to start/pause/stop the\nstream, inspect the state, etc.)."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["Streamed data is unavoidable in the WebUI. The UI accesses this data in the form\nof the ",(0,s.jsx)(n.code,{children:"ComDOM"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["The generic component when dealing with streamed data is the ",(0,s.jsx)(n.code,{children:"StreamedTable"}),",\nwhich is a custom HTML table framework based on ",(0,s.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/introduction",children:"Tanstack\nTable"})," and optimized for\nuse with the streams fed in via the ComDOM. A StreamedTable is defined by a set\nof react props passed into the component (which will be described below). The\nframework is completed by a plethora of ready-to-use components which solve the\nmajority of required usecases when it comes to streamed tables."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"StreamedTable Example",src:t(2119).A+"",width:"892",height:"456"})}),"\n",(0,s.jsx)(n.h2,{id:"streamedtable",children:"StreamedTable"}),"\n",(0,s.jsxs)(n.p,{children:["The StreamedTable is a fully typed react component based on the HTML ",(0,s.jsx)(n.code,{children:"table"})," element. The props it takes are defined in the codeblock below."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'type StreamedTableProps = JSX.IntrinsicElements["table"] & {\n tablecomdom: UseComDOM\n tablecolumns: any[]\n tablestyling?: TableStyling\n tableselecting?: TableSelecting\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The table expects a stream of elements of type ",(0,s.jsx)(n.code,{children:"T"}),", where ",(0,s.jsx)(n.code,{children:"T"})," extends the\n",(0,s.jsx)(n.code,{children:"BaseViewModel"}),". In practice, this means that an entity is wrapped in an object\nproviding status and an optional errormessage."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The data shown by the table is passed into the ",(0,s.jsx)(n.code,{children:"tablecomdom"})," prop as an\n",(0,s.jsx)(n.code,{children:"UseComDOM"})," object. This object also provides functions to inspect and control\nthe stream. The generic ",(0,s.jsx)(n.code,{children:"UseComDOM"})," type is bound to type ",(0,s.jsx)(n.code,{children:"T"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The table structure (i.e. the way data is structured into columns) is defined\nby the ",(0,s.jsx)(n.code,{children:"tablecolumns"})," prop. This is essentially an array of column definition\nobjects (which are taken from Tanstack Table), but there are exceptions, which\nmake typing this prop difficult. Most of your time building a streamedtable is\nspent writing this definition."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The first optional prop, ",(0,s.jsx)(n.code,{children:"tablestyling"})," is a structure containing style\ncommands for the table. The definition of the ",(0,s.jsx)(n.code,{children:"TableStyling"})," type is given\nbelow."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"tableselecting"}),' optionally defines how the user can select (single- or\nmulti-select) elements from the table. It also controls the "breakout"\nfunctionality. This is discussed later.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:'JSX.IntrinsicElements["table"]'})," means that the StreamedTable component will\nreturn a react component with the HTML ",(0,s.jsx)(n.code,{children:"
    "})," tag as its top-level component,\nwhich in turn means that any valid HTML table-properties can be passed to the\nStreamedTable, and these will be passed on to the top-level component. This\nspecifically also includes styling the top-level ",(0,s.jsx)(n.code,{children:"
    "})," via ",(0,s.jsx)(n.code,{children:"className"})," but\nalso ARIA-properties."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"tablecolumns",children:"TableColumns"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"When creating a new component or editing a new one, it is very useful to view the table in Storybook."})}),"\n",(0,s.jsxs)(n.p,{children:["The definition of the tablecolumns can be taken from the\n",(0,s.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/guide/column-defs",children:"Tanstack Table Documentation"}),".\nA simple example shall be discussed here nonetheless. The following code snippet\nhas been adapted from ",(0,s.jsx)(n.code,{children:"PageDIDMetadata"}),", with custom styles and most custom\ncomponents removed for clarity."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'// imports and type definitions\nimport { createColumnHelper } from "@tanstack/react-table"\ntype DIDKeyValuePairViewModel = {\n // from DIDKeyValuePair entity\n key: string;\n value: string;\n\n // from BaseViewModel\n status: \'success\' | \'error\' | \'pending\';\n message?: string;\n}\n\n// the streamedtable receives a stream of `DIDKeyValuePairViewModel`\n// each element is converted into a row\n// initialise the columnHelper to this type\nconst columnHelper = createColumnHelper()\n\n\n// define the tablecolumns array\nconst tablecolumns: any[] = [\n // Accessor columns have an underlying data model which means they can be\n // sorted, filtered, grouped, etc.\n columnHelper.accessor("key", { // this column accesses the "key" attribute\n id: "key",\n // function to render each body cell of the column, return JSX object\n // "info" contains the value but also other useful context -> read docs\n cell: info => {\n return (\n \n {info.getValue()}\n \n )\n },\n // funxtion to render header cell of column, return JSX object\n // "info": context useful for the creation of a header cell -> read docs\n header: info => {\n return (\n // this is a custom component that can be placed into the header\n // they are discussed further below\n \n )\n }\n }\n ),\n columnHelper.accessor("value", { // column accesses the "value" attribute\n id: "value",\n cell: info => {\n return (\n {info.getValue()}\n )\n },\n header: info => {\n return (\n // must not use a custom component, a simple

    tag is fine!\n

    Value

    \n )\n }\n })\n]\n'})}),"\n",(0,s.jsx)(n.p,{children:"Passing this column definition into a StreamedTable together with the ComDOM supplying the data like so"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"\n tablecomdom={comdom}\n tablecolumns={tablecolumns}\n/>\n"})}),"\n",(0,s.jsx)(n.p,{children:"will return a fully functional StreamedTable. This can be expanded upon to\ncreate much complex tables with multiple columns."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The StreamedTable is a wrapper for Tanstack Table. In particular, the column\ndefinitions have been taken over unchanged. This means that the documentation\nand examples provided by Tanstack are also valid in the StreamedTables, check\nthem out."})}),"\n",(0,s.jsx)(n.h3,{id:"common-components-for-column-headers",children:"Common components for column headers"}),"\n",(0,s.jsxs)(n.p,{children:["A number of reusable components have been added to the StreamedTable package\nwhich can be used to implement frequently-needed functionality such as sorting\nand filtering. An example of this has already been given in the code above, in\nwhich a ",(0,s.jsx)(n.code,{children:"TableFilterString"})," component used."]}),"\n",(0,s.jsxs)(n.p,{children:["These components are added in the column header definitions within the\n",(0,s.jsx)(n.code,{children:"tablecolumns"})," definition, i.e."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n header: info => ,\n ...\n})\n'})}),"\n",(0,s.jsx)(n.p,{children:"The remainder of this section will introduce each of the common table\ncomponents."}),"\n",(0,s.jsx)(n.h4,{id:"tablesortupdown",children:"TableSortUpDown"}),"\n",(0,s.jsx)(n.p,{children:"This component toggles the Tanstack Table sorting mechanism on mouseclick and\ncycles between no sorting, sorting in ascending order and sorting in descending\norder. Examples of column entries which can be sorted are numeric data and\ndates."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"TableSortUpDown Dirty",src:t(12603).A+"",width:"154",height:"400"})," ",(0,s.jsx)(n.img,{alt:"TableFilterBoolean Clean",src:t(37624).A+"",width:"161",height:"401"})]}),"\n",(0,s.jsx)(n.p,{children:"It takes the following props:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'props: JSX.IntrinsicElements["div"] & {\n name: string\n column: Column\n element?: JSX.Element\n stack?: boolean\n nocollapse?: boolean\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"name"})," is the string which will be used as the column header with a default\nstyle if no ",(0,s.jsx)(n.code,{children:"element"})," is defined"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"column"})," is the table column the header belongs to."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"element"})," is the JSX element which overrides ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"stack"})," determines whether the icon signifying the sorting state and the name\nelement are stacked vertically instead of horizontally. The example picture\nabove uses vertical stacking."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"nocollapse"})," will force the ",(0,s.jsx)(n.code,{children:"name"})," (or ",(0,s.jsx)(n.code,{children:"element"}),") to remain visible even on\nsmall screen widths (below 768px)."]}),"\n",(0,s.jsxs)(n.li,{children:["any props valid for a ",(0,s.jsx)(n.code,{children:"div"})," element will also work."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"tablefilterdiscrete",children:"TableFilterDiscrete"}),"\n",(0,s.jsx)(n.p,{children:"On mouseclick, it cycles through a list of keys and only displays the rows in\nwhich the column entry matches the key. Used when the column data is restricted\nto a small number of options, such as the Rucio enums."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"TableFilterDiscrete Dirty",src:t(52959).A+"",width:"236",height:"371"})," ",(0,s.jsx)(n.img,{alt:"TableFilterDiscrete Clean",src:t(52004).A+"",width:"232",height:"364"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type TableFilterDiscrete = JSX.IntrinsicElements["div"] & {\n name: string, // see TableSortUpDown\n keys: T[],\n renderFunc: (key: T | undefined) => JSX.Element,\n column: Column, // see TableSortUpDown\n stack?: boolean // see TableSortUpDown\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"keys"})," is a list of type ",(0,s.jsx)(n.code,{children:"T"})," where ",(0,s.jsx)(n.code,{children:"T"})," is the tyoe of the column entries.\nUsually a string enum."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"renderFunc"})," is the function used to render the icon to the side or below the\ntext (depending on whether ",(0,s.jsx)(n.code,{children:"state"})," is set)."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"tablefilterboolean",children:"TableFilterBoolean"}),"\n",(0,s.jsxs)(n.p,{children:["A special form of ",(0,s.jsx)(n.code,{children:"TableFilterDiscrete"})," in which the values are booleans. This\nmeans that no ",(0,s.jsx)(n.code,{children:"renderFunc"})," needs to be supplied."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"TableFilterBoolean in Action",src:t(18479).A+"",width:"430",height:"185"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'// see TableFilterDiscrete\ntype TableFilterBoolean = JSX.IntrinsicElements["div"] & {\n name: string,\n column: Column,\n stack?: boolean\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"tablefilterstring",children:"TableFilterString"}),"\n",(0,s.jsx)(n.p,{children:"A filter in which the column entries are strings."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"TableFilterString Dirty",src:t(86965).A+"",width:"828",height:"370"})," ",(0,s.jsx)(n.img,{alt:"TableFilterString Clean",src:t(22174).A+"",width:"825",height:"114"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type TableFilterString = JSX.IntrinsicElements["form"] & {\n column: Column, // see TableFilterDiscrete\n name: string, // see TableFilterDiscrete\n placeholder?: string,\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"placeholder"})," is the placeholder string for the textbox"]}),"\n",(0,s.jsxs)(n.li,{children:["this component is not derived from ",(0,s.jsx)(n.code,{children:"div"})," but from ",(0,s.jsx)(n.code,{children:"form"}),". Any attributes valid\nin ",(0,s.jsx)(n.code,{children:"form"})," are also valid here."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"These common StreamedTable components are very helpful in reducing the\ncomplexity of the column definitions you write. They also ensure a common design\nlanguage throughout the project. We encourage you to use them as much as\npossible."})}),"\n",(0,s.jsx)(n.h3,{id:"common-components-for-column-cells",children:"Common components for column cells"}),"\n",(0,s.jsx)(n.p,{children:"The selection here is quite limited right now, but shall be extended in order to\nkeep a common design language. It is also much easier to keep the project\naccessible if the total number of unique components is kept low."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"TableInternalLink"})," for links within the rucio webui"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"TableExternalLink"})," for links pointing outside of the rucio webui."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"tablestyling",children:"TableStyling"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["As with the rest of the Rucio WebUI, the StreamedTable is styled via ",(0,s.jsx)(n.a,{href:"https://tailwindcss.com/",children:"Tailwind\nCSS"}),". This means that styles are constructed by\nassigning various classes to an element. Tailwind will then compile a minimal\nset of CSS."]})}),"\n",(0,s.jsx)(n.p,{children:"This optional StreamedTable attribute itself only contains optional members. It\nis used to add to or override table styling settings."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"type TableStyling = Partial<{\n visibility?: Record\n tableHeadRowStyle?: string\n tableBodyRowStyle?: string\n pageSize?: number\n tableFooterStack?: boolean\n}>\n"})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"visibility"})," maps a column's visibility (boolean) to the column id (string)."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tableHeadRowStyle"}),": the classes which shall get passed to the ",(0,s.jsx)(n.code,{children:"tr"})," in the\n",(0,s.jsx)(n.code,{children:"thead"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tableBodyRowStyle"}),": the classes which shall get passed to each ",(0,s.jsx)(n.code,{children:"tr"})," in the\n",(0,s.jsx)(n.code,{children:"tbody"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pageSize"})," is how many rows are shown per page at maximum."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tableFooterStack"})," will stack table footer components in order to save\nhorizontal space."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"setting-column-widths",children:"Setting column widths"}),"\n",(0,s.jsx)(n.p,{children:"Column widths are set automatically, but they can be styled individually. This\nis done by adding a string of class names to the column definition in the\nfollowing way:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n meta: {\n style: "w-28 md:w-56" // see tailwind documentation for an explanation\n },\n ...\n})\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The Tailwind compiler has been configured to consider these styles as well when\nputting together the minimal set of CSS. Internally, the styles defined here are\napplied to the header cell. Since the StreamedTable ",(0,s.jsx)(n.code,{children:"table"})," element uses\n",(0,s.jsx)(n.code,{children:"table-layout: fixed"}),", the column widths of the first row will be applied to\neach of the following rows as well."]}),"\n",(0,s.jsx)(n.h3,{id:"tableselecting",children:"TableSelecting"}),"\n",(0,s.jsx)(n.p,{children:'This optional table attribute handles selecting rows and the "breakout". The\nbreakout is an infopanel placed under the table which shows columns for a single\nselected row (these columns would otherwise be hidden due to lack of horizontal\nspace), see the image below for an example.'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"type TableSelecting = { // where T is the type of the table rows\n handleChange: (data: T[]) => void,\n enableRowSelection: boolean,\n enableMultiRowSelection?: boolean,\n breakOut?: {\n breakoutVisibility: boolean,\n keys: Record, // column id, displayname\n }\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"handleChange"})," is the function which is run each time the selection state\nchanges."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"enableRowSelection"}),": whether to enable row selection"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"enableMultiRowSelection"}),": whether to allow row multi-select (only valid if\nrow selection is enabled)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"breakout.breakoutVisibility"}),": whether to allow showing the breakout when a\nrow is selected. Often coupled to the horizontal window size."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"breakout.keys"}),": matching column id to the name under which it is to be\ndisplayed. The column ids determine which columns are going to be added to the\nbreakout. Usually, these columns end up being the columns that were hidden due\nto lack of horizontal space."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Table Breakout",src:t(45955).A+"",width:"889",height:"588"})}),"\n",(0,s.jsx)(n.h3,{id:"normaltable",children:"NormalTable"}),"\n",(0,s.jsxs)(n.p,{children:["The StreamedTable design is part of the design language of the Rucio WebUI, and\nwe intend for all tables (even if they are non-streaming) to follow this design.\nIt follows that we created the ",(0,s.jsx)(n.code,{children:"NormalTable"}),", which keeps the same design as the\nStreamedTable but without the streaming capabilities."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type NormalTableProps = JSX.IntrinsicElements["table"] & {\n tablecolumns: any[] // see StreamedTable\n tablestyling?: TableStyling // see StreamedTable\n tableselecting?: TableSelecting // see StreamedTable\n tabledata: T[]\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Explanation:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tabledata"}),": instead of passing a comdom which wraps the streamed data, we pas\nthe data directly in the form of an array."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"streamedtable-in-the-context-of-nextjs",children:"StreamedTable in the context of NextJS"}),"\n",(0,s.jsx)(n.p,{children:"The StreamedTable relies on streams, which are rapped in the ComDOM. Until now,\nwe have taken the existence of a functioning ComDOM as given. In this section,\nwe will discuss how to properly embed the StreamedTable in the wider context of\nthe NextJS web application."}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["The frontend uses the NextJS app router. ",(0,s.jsx)(n.a,{href:"https://nextjs.org/docs",children:"Look at their\ndocs"})," to learn more."]})}),"\n",(0,s.jsx)(n.h4,{id:"queryclientprovider",children:"QueryClientProvider"}),"\n",(0,s.jsx)(n.p,{children:"On a layout-file affecting the route containing the StreamedTable, include the\nfollowing code:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"'use client';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\n\nconst queryClient = new QueryClient();\n\nexport default function RootLayout({children}) {\n return (\n \n {children}\n \n )\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["where ",(0,s.jsx)(n.code,{children:"children"})," is a ",(0,s.jsx)(n.code,{children:"React.ReactNode"})," containing the StreamedTable."]}),"\n",(0,s.jsx)(n.h4,{id:"route",children:"Route"}),"\n",(0,s.jsxs)(n.p,{children:["On the route which returns the page including the StreamedTable, you must\ninitialise the ComDOM. You can optionally auto-start the ComDOM query or wait\nfor the user to trigger it manually -- this will not be covered in-depth here,\nsince this is more closely related to the ComDOM itself than to the\nStreamedTable. An example, taken and adapted from the ",(0,s.jsx)(n.code,{children:"ListSubscription"})," route,\nwould be:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'\'use client\';\nimport { ListSubscription as ListSubscriptionStory } from "@/component-library/Pages/Subscriptions/ListSubscription";\nimport { useEffect } from "react";\nimport useComDOM from "@/lib/infrastructure/hooks/useComDOM";\nimport { SubscriptionRuleStatesViewModel } from "@/lib/infrastructure/data/view-model/subscriptions";\n\nexport default function ListSubscription({ params }: { params: { account: string }}) {\n // initialise ComDOM\n const ComDOM = useComDOM(\n "subscription-rule-states-query",\n [],\n false,\n Infinity,\n 50,\n true\n )\n // auto-start query, GET data from /api/list-subscription, use param account\n useEffect(() => {\n const runQuery = async () => {\n await ComDOM.start({\n url: new URL("http://localhost:3000/api/list-subscription"),\n method: "GET",\n headers: new Headers({\n \'Content-Type\': \'application/json\'\n } as HeadersInit),\n params: {\n "account": params.account,\n }\n })\n }\n runQuery()\n }, [])\n // * return a react component\n // * in this case the StreamedTable is wrapped by a Storybook Page\n // * we pass the ComDOM to this page so that it may be passed further down\n // to the StreamedTable\n return (\n
    \n \n
    \n )\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},45955:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/breakout-bb5c25810ca88b4c2af415335d3d7d57.png"},18479:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-boolean-all-22de7b045ffd375da711fbeb0e3bfd63.png"},52004:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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"},52959:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-discrete-dirty-0910e099615f469d47dede0b1ab14040.png"},22174:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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OlqxQ3z81ri4uMTEhBMnvps5c6aRkdHkyZNZ15Url1nx58/Y5jTXrFm7efOmvn37fvrpulmzZr/77rs9e/YkoosX83meX7o08ubNm998838ZTiQSsY158+bv3bt34cKF77479Ny5c//617/EYt2QkJA2vwEAAAB4C3E8zyt/rqurJaKUlJSwsOlXr14xNzcnopiYmLi4DbduFWtra8vlclvbPnZ2dt9++z/skEOH0idPnnzp0q+WlpaspVcv86ampsLC37p3765cPCxsemZm5vXr17S0tIjo4MFDkyZNOnw43cfHp/VRyuVyPb0ea9eumT9/fptTio6O3rx5y717d4no6dOnYrHesGHDjh49wnqnT59x4cKF/PwLyof4+fmJxXopKf9WPmMr0/zpp5+GDft/n322bt68eURUUlJibd179+5d48ePV55sUVHRjz+eUj7R1atXXV3dli9f9s9//pO1LFy48NixzMuXC9qcFwAAALyFWl7QGjlylJaW1sGDB9nHAwdSR47019bWJqIrV66UlJQEB/9xPdTT892mpqZLly4pVxgxYnizoEZEFy6c9/DwYEGN7UNEP//8s2KH2tra6mcU1zGJSCgU2tvbb9u2PSEh4bfffmtqalIuW11dvWLFSldXN2PjnhKJ/mefRVdWVrKVPMbNzU2x7erqWlRU1NDQ0Pr30p5p9uvXj20YGRkJBIIHDx60XpOIvvsuh4gmTvyj7Lvvet66dUtxhRQAAABAWctZrXt3nf/6L7/U1DQiKioqunLlSlBQEOt6+PAhEc2dO08i0Wd/Nja2RCST/a5cwcTE9Pmy1dWPJBKJ0lm6q6urV1X9EVOCg0NMTEzZX2pqqvKx33yzf+jQoVFRawYOdLW27q38OoyQkEn79u2LiJh//Hjm2bNnIiIiiEg5q+nqihTbYrEuEZWWlrb+vbRnmiy8MhzHKYfL1su6uAxUlA0NDSUimUzW5rEAAADwFnrhc6DjxgUFBwffvn37wIEDYrF4+PDhrJ2FrS+//GLIkCHK+xsaGip/FAqFz9cUi3UrKioUH2tqahobG/X0xIqW6OjPKiuXsu0+fWyVjzU3N9++fRsRFRYWrlz5yfz5EcOGDbOysiotLc3JydmxY3twcDDbUzmlMeXlD5ttS6XSF038pab5siQSCcdxJ09+361bN+V2CwuLP1MWAAAAuqoX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"},86965:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-string-dirty-dadee973219a779404cf2c4443cc5ee3.png"},37624:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-clean-18a717b9686dfecb04d47a3f794daf68.png"},12603:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-dirty-2148a91f5adf2a2c0272b096834b8c98.png"},2119:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/streamedtable-4cf5d169c74626898e013335a0a4d34a.png"},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6484bf.8a08af6e.js b/assets/js/1f6484bf.8a08af6e.js new file mode 100644 index 0000000000..910d8d09ab --- /dev/null +++ b/assets/js/1f6484bf.8a08af6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5680],{47369:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"developer/setting_up_vscode_dev_env","title":"Setting up a Rucio Developer environment using Visual Studio Code","description":"Local Setup vs Remote Setup","source":"@site/../docs/developer/setting_up_vscode_dev_env.md","sourceDirName":"developer","slug":"/developer/setting_up_vscode_dev_env","permalink":"/documentation/developer/setting_up_vscode_dev_env","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/setting_up_vscode_dev_env.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"setting_up_vscode_dev_env","title":"Setting up a Rucio Developer environment using Visual Studio Code"},"sidebar":"docs","previous":{"title":"Setting up a Rucio Developer environment using IntelliJ Ultimate","permalink":"/documentation/developer/setting_up_intellij_dev_env"},"next":{"title":"Contributing Guide","permalink":"/documentation/contributing"}}');var o=i(74848),t=i(28453);const r={id:"setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code"},c=void 0,d={},l=[{value:"Local Setup vs Remote Setup",id:"local-setup-vs-remote-setup",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"VSCode",id:"vscode",level:3},{value:"Remote Only: Additional Setup VSCode",id:"remote-only-additional-setup-vscode",level:3},{value:"VSCode Extensions",id:"vscode-extensions",level:3},{value:"Docker and Docker Compose",id:"docker-and-docker-compose",level:3},{value:"If you get a docker-compose: command not found error",id:"if-you-get-a-docker-compose-command-not-found-error",level:4},{value:"SSL Certificates",id:"ssl-certificates",level:3},{value:"Setting up Rucio and Configuring VSCode",id:"setting-up-rucio-and-configuring-vscode",level:2},{value:"VSCode Tasks",id:"vscode-tasks",level:2},{value:"Starting Rucio",id:"starting-rucio",level:3},{value:"Stopping Rucio",id:"stopping-rucio",level:3},{value:"Debugging Overview",id:"debugging-overview",level:2},{value:"Debugging Rucio Server",id:"debugging-rucio-server",level:3},{value:"Debugging Rucio WebUI",id:"debugging-rucio-webui",level:3},{value:"Debugging Rucio CLI Clients ( rucio-admin and rucio)",id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",level:3},{value:"Debug rucio cli client",id:"debug-rucio-cli-client",level:4},{value:"Debug rucio-admin client",id:"debug-rucio-admin-client",level:4},{value:"Debugging Rucio Tests",id:"debugging-rucio-tests",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"local-setup-vs-remote-setup",children:"Local Setup vs Remote Setup"}),"\n",(0,o.jsx)(n.p,{children:"It is possible to run the containers for rucio development locally or on a remote VM."}),"\n",(0,o.jsxs)(n.p,{children:["For local development machines with limited resources ",(0,o.jsx)(n.code,{children:"(<16 GB RAM, < 4 Cores)"}),", it is recommended to run the containers on a remote VM. This will allow you to use your local machine for other tasks while the containers are running on the remote VM."]}),"\n",(0,o.jsxs)(n.p,{children:["Local development has been tested only on Linux hosts.\nRemote development has been tested on Linux(for the remote VM) and Linux/MacOS(for the local instance of vscode).\nThe additional steps required for setting up a remote development environment are described in the sections begininng with ",(0,o.jsx)(n.code,{children:"Remote Only: "}),". These sections can be ignored if you are setting up a local development environment."]}),"\n",(0,o.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,o.jsx)(n.h3,{id:"vscode",children:"VSCode"}),"\n",(0,o.jsxs)(n.p,{children:["Install ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/Download",children:"Visual Studio Code"})]}),"\n",(0,o.jsx)(n.h3,{id:"remote-only-additional-setup-vscode",children:"Remote Only: Additional Setup VSCode"}),"\n",(0,o.jsxs)(n.p,{children:["For development on a remote VM, you will need to install the ",(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack",children:"Remote Development Extension Pack"})]}),"\n",(0,o.jsxs)(n.p,{children:["You should setup SSH access to your remote VM. For more information, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Remote-SSH: Open SSH Configuration File"}),"\n",(0,o.jsx)(n.img,{alt:"Open SSH Configuration File",src:i(67403).A+"",width:"609",height:"270"})]}),"\n",(0,o.jsxs)(n.p,{children:["You will be asked to create a new SSH configuration file or select an existing one. If you have an existing SSH configuration file, select it. If you do not have an existing SSH configuration file, select ",(0,o.jsx)(n.code,{children:"Create New File"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Update the SSH configuration file:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host \n HostName \n User \n"})}),"\n",(0,o.jsxs)(n.p,{children:["Additionally, you can use the ",(0,o.jsx)(n.code,{children:"IdentityFile"})," option to specify the SSH key to use for authentication. For example:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host \n HostName \n User \n IdentityFile ~/.ssh/\n"})}),"\n",(0,o.jsx)(n.p,{children:"If your remote VM is behind a firewall, you will need to setup a proxy. For example, at CERN, we can use lxplus as a ssh proxy to connect to the remote VMs, which are not accessible outside the CERN network. The following is an example of an SSH configuration file that uses lxplus as a proxy:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host lxplus\n HostName lxplus.cern.ch\n User \n\nHost \n HostName \n User \n ProxyCommand ssh -q -W %h:%p lxplus\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Test connection to Remote VM"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Remote-SSH: Connect to Host..."})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Select the remote VM from the list of hosts"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Depending on your SSH Configuration, you may be prompted for the password/s in the following order:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"remote user on the proxy host"}),"\n",(0,o.jsx)(n.li,{children:"ssh key password or the password of the remote VMs user."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["The bottom right corner of VS Code will show the status of the connection. If the connection is successful, you will see ",(0,o.jsx)(n.code,{children:"SSH: "})," in the bottom right corner:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Successful Connection",src:i(76587).A+"",width:"354",height:"108"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["For troubleshooting and Tips/Tricks, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/troubleshooting",children:"Troubleshooting"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"NOTE for remote development"}),": From hereon out, all the instructions should be run in the VSCode instance connected to your remote VM. ( i.e. the VSCode instance that shows ",(0,o.jsx)(n.code,{children:"SSH: "})," in the bottom right corner)\nYou can use the terminal in the VSCode instance to run commands on the remote VM directly. To do so, open the terminal in VSCode instance connected to your remote VM by clicking on ",(0,o.jsx)(n.code,{children:"Terminal"})," in the menu bar and then clicking on ",(0,o.jsx)(n.code,{children:"New Terminal"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"vscode-extensions",children:"VSCode Extensions"}),"\n",(0,o.jsx)(n.p,{children:"Install the following extensions:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.python",children:"Python"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance",children:"Pylance"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker",children:"Docker"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote - Containers"})}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["VSCode comes with a plethora of extensions that can significantly improve your development experience. For more information, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/editor/extension-gallery",children:"Extensions"})]}),"\n",(0,o.jsx)(n.h3,{id:"docker-and-docker-compose",children:"Docker and Docker Compose"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})]}),"\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})]}),"\n"]}),"\n",(0,o.jsxs)(n.h4,{id:"if-you-get-a-docker-compose-command-not-found-error",children:["If you get a ",(0,o.jsx)(n.code,{children:"docker-compose: command not found"})," error"]}),"\n",(0,o.jsxs)(n.p,{children:["Docker has deprecated the ",(0,o.jsx)(n.code,{children:"docker-compose"})," command in favour of ",(0,o.jsx)(n.code,{children:"docker compose"}),".\nTo turn on ",(0,o.jsx)(n.code,{children:"docker compose"})," support in ",(0,o.jsx)(n.code,{children:"docker"})," command, please make sure you have installed the ",(0,o.jsx)(n.code,{children:"docker-compose-plugin"})," package from the ",(0,o.jsx)(n.code,{children:"docker-ce-stable"})," repository."]}),"\n",(0,o.jsxs)(n.p,{children:["The full command to install ",(0,o.jsx)(n.code,{children:"docker"})," and ",(0,o.jsx)(n.code,{children:"docker compose"})," on RPM-based installations is:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"yum install docker-ce docker-compose-plugin\n"})}),"\n",(0,o.jsx)(n.h3,{id:"ssl-certificates",children:"SSL Certificates"}),"\n",(0,o.jsxs)(n.p,{children:["If you would like to debug the rucio webui and x509 authentication capabilities of the rucio server, you will need to obtain SSL certificates for your development environment. For remote VMs, you can request them from your IT department or you can use letsencrypt to generate a certificate. For local development machines, you can use ",(0,o.jsx)(n.a,{href:"https://github.com/FiloSottile/mkcert",children:"mkcert"})," to generate a certificate."]}),"\n",(0,o.jsxs)(n.p,{children:["Whatever route you go, you should have a ",(0,o.jsx)(n.code,{children:"hostcert.pem"})," and a ",(0,o.jsx)(n.code,{children:"hostkey.pem"})," file accessible for your development environment."]}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-rucio-and-configuring-vscode",children:"Setting up Rucio and Configuring VSCode"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clone the rucio repository"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"gh repo clone rucio/rucio\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clone the vscode configuration repository"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"gh repo clone maany/rucio-vscode-dev-env\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Move the vscode repo inside the rucio repo"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"mv rucio-vscode-dev-env rucio/.vscode\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Copy the SSL certificates to the ",(0,o.jsx)(n.code,{children:"rucio/.vscode/certs"})," directory"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open VSCode. If you are using a remote VM, open the VSCode instance connected to your remote VM."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Go to ",(0,o.jsx)(n.code,{children:"File"})," -> ",(0,o.jsx)(n.code,{children:"Open Folder"})," and select the ",(0,o.jsx)(n.code,{children:"rucio"})," folder"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Edit the rucio/.vscode/docker-compose.yml and change the ",(0,o.jsx)(n.code,{children:"RUCIO_HOST"})," environment variable for the rucio-dev container to ",(0,o.jsx)(n.code,{children:"http://localhost"})," if you are using a local development environment or to the fqdn and port of your remote VM if you are using a remote development environment.\n",(0,o.jsx)(n.img,{alt:"RUCIO_HOST",src:i(75253).A+"",width:"1092",height:"520"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Add the default url for webui in ",(0,o.jsx)(n.code,{children:"rucio.cfg.template"}),", which is required to handle Cross Origin Requests (CORS) in the webui. Add the following line to the ",(0,o.jsx)(n.code,{children:"[webui]"})," section of ",(0,o.jsx)(n.code,{children:"rucio.cfg.template"}),":\n",(0,o.jsx)(n.code,{children:" urls = "})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If your server is running on a remote VM, but webui will be running locally, then the requests originating from webui to the server will have the origin ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If both the server and webui are running locally, then the requests originating from webui to the server will have the origin ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),". In this case, you can set the ",(0,o.jsx)(n.code,{children:"urls"})," to ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If both the server and webui are running on the same remote VM, then the requests originating from webui to the server will have the origin ",(0,o.jsx)(n.code,{children:"http://:3000"}),". In this case, you can set the ",(0,o.jsx)(n.code,{children:"urls"})," to ",(0,o.jsx)(n.code,{children:"http://:3000"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"vscode-tasks",children:"VSCode Tasks"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsx)(n.li,{children:"You should see a list of pre-configured tasks"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"tasks",src:i(46399).A+"",width:"599",height:"334"})}),"\n",(0,o.jsx)(n.p,{children:"These tasks are helpful utilities for your to quickly start/stop rucio containers and to setup different types of debuggers ( server, webui, pytest, clients, ...)."}),"\n",(0,o.jsx)(n.h3,{id:"starting-rucio",children:"Starting Rucio"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"start-rucio"})]}),"\n",(0,o.jsx)(n.li,{children:"This will start and initialize the rucio development environment. The first time you run this task, it will take a while to fetch and build the docker images. Subsequent runs will be much faster."}),"\n"]}),"\n",(0,o.jsx)("video",{width:"100%",controls:!0,children:(0,o.jsx)("source",{src:"/documentation/img/vscode/start_rucio_task.mp4"})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["After the command has finished, you can run ",(0,o.jsx)(n.code,{children:"docker ps -a"})," to check if all the containers are up and running. You should see something like this:\n",(0,o.jsx)(n.img,{alt:"docker ps -a",src:i(49962).A+"",width:"1515",height:"453"})]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"stopping-rucio",children:"Stopping Rucio"}),"\n",(0,o.jsxs)(n.p,{children:["To take down all the containers, run the ",(0,o.jsx)(n.code,{children:"stop-rucio"})," task. This is equivalent to a ",(0,o.jsx)(n.code,{children:"docker-compose down"})," command."]}),"\n",(0,o.jsx)(n.h2,{id:"debugging-overview",children:"Debugging Overview"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server, webui, clients, etc."]}),"\n",(0,o.jsx)(n.p,{children:"The debugging process for Rucio in VSCode is broken down into 3 steps:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Start the process inside the ",(0,o.jsx)(n.code,{children:"rucio-dev"})," container that you want to debug"]}),"\n",(0,o.jsx)(n.li,{children:"Attach the debugger to the process"}),"\n",(0,o.jsx)(n.li,{children:"Insert breakpoints in the code and start debugging"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"After you are done debugging, you should remember to"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"detach the debugger from the process"}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"debugging-rucio-server",children:"Debugging Rucio Server"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server:debug"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Attach the debugger to the rucio server by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"Server: Debug"})," from the dropdown menu."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"attach to rucio-server",src:i(80759).A+"",width:"393",height:"514"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio server."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You can now set breakpoints in the rucio server code and debug the server."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["After you have finished debugging, you can detach the debugger from the rucio server by clicking on the ",(0,o.jsx)(n.code,{children:"Stop"})," button in the debug toolbar."]}),"\n",(0,o.jsxs)(n.p,{children:["**NOTE: ** After detaching the debugger, run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n",(0,o.jsx)("video",{width:"100%",controls:!0,children:(0,o.jsx)("source",{src:"/documentation/img/vscode/rucio-vscode-server-debug.mp4"})}),"\n",(0,o.jsx)(n.h3,{id:"debugging-rucio-webui",children:"Debugging Rucio WebUI"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio webui."]}),"\n",(0,o.jsx)(n.p,{children:"To debug the rucio webui, you will need to start the rucio server in non-debug mode and the rucio webui in debug mode."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-ui:debug"})]}),"\n",(0,o.jsxs)(n.li,{children:["Attach the debugger to the rucio webui by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"UI: Debug"})," from the dropdown menu."]}),"\n",(0,o.jsxs)(n.li,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio webui."]}),"\n"]}),"\n",(0,o.jsxs)(n.h3,{id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",children:["Debugging Rucio CLI Clients ( ",(0,o.jsx)(n.code,{children:"rucio-admin"})," and ",(0,o.jsx)(n.code,{children:"rucio"}),")"]}),"\n",(0,o.jsx)(n.h4,{id:"debug-rucio-cli-client",children:"Debug rucio cli client"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio cli clients."]}),"\n",(0,o.jsx)(n.p,{children:"To debug the rucio cli clients, you will need to start the rucio server in non-debug mode"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Then, you need to start the ",(0,o.jsx)(n.code,{children:"rucio-cli:pre-debug"})," task to inject the debug configuration into the rucio cli clients."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-cli:pre-debug"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the ",(0,o.jsx)(n.code,{children:"Rucio:CLI Debug"})," launch configuration by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"Rucio:CLI Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio cli clients."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["After that, you should open a shell inside the ",(0,o.jsx)(n.code,{children:"rucio-dev"})," container"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"docker exec -it rucio-dev bash\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Insert breakpoints in the rucio cli clients code."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Run a rucio cli command to trigger the breakpoint."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"rucio-cli:post-debug"})," task to remove the debug configuration from the rucio cli clients."]}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"debug-rucio-admin-client",children:"Debug rucio-admin client"}),"\n",(0,o.jsxs)(n.p,{children:["The instructions are the same as for the ",(0,o.jsx)(n.code,{children:"rucio"})," client, except that you need to start the ",(0,o.jsx)(n.code,{children:"rucio-admin:pre-debug"})," task to inject the debug configuration into the rucio-admin client."]}),"\n",(0,o.jsxs)(n.p,{children:["After debugging, you should run the ",(0,o.jsx)(n.code,{children:"rucio-admin:post-debug"})," task to remove the debug configuration from the rucio-admin client."]}),"\n",(0,o.jsx)(n.h3,{id:"debugging-rucio-tests",children:"Debugging Rucio Tests"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio tests."]}),"\n",(0,o.jsx)(n.p,{children:"To debug the rucio tests, you will need to start the rucio server in non-debug mode"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Then, you should open the file containing the test you want to debug in VSCode."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Insert breakpoints in the test code."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the ",(0,o.jsx)(n.code,{children:"rucio-pytest:debug"})," to start the test in debug mode"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Attach the debugger to the test by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"Pytest: Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio tests."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},75253:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-compose-rucio-host-465a74fa33e82533f549c7342c5942e2.jpg"},49962:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-ps-7e66472c5b3eaab849aed2e0fe06e354.jpg"},67403:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/remote_ssh-b59c7e945ebcc026fee6dd82cfebe0ab.jpg"},76587:(e,n,i)=>{i.d(n,{A:()=>s});const s="data:image/jpeg;base64,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"},80759:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-server-debug-98c2ec8a56860d6718e4da5bf97bc709.jpeg"},46399:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-tasks-a9f11e37004c47a3ee27c6549b968aee.jpg"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>c});var s=i(96540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6484bf.c3ddfcb7.js b/assets/js/1f6484bf.c3ddfcb7.js deleted file mode 100644 index ef58da0282..0000000000 --- a/assets/js/1f6484bf.c3ddfcb7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5680],{47369:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"developer/setting_up_vscode_dev_env","title":"Setting up a Rucio Developer environment using Visual Studio Code","description":"Local Setup vs Remote Setup","source":"@site/../docs/developer/setting_up_vscode_dev_env.md","sourceDirName":"developer","slug":"/developer/setting_up_vscode_dev_env","permalink":"/documentation/developer/setting_up_vscode_dev_env","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/setting_up_vscode_dev_env.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"setting_up_vscode_dev_env","title":"Setting up a Rucio Developer environment using Visual Studio Code"},"sidebar":"docs","previous":{"title":"Setting up a Rucio Developer environment using IntelliJ Ultimate","permalink":"/documentation/developer/setting_up_intellij_dev_env"},"next":{"title":"Contributing Guide","permalink":"/documentation/contributing"}}');var o=i(74848),t=i(28453);const r={id:"setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code"},c=void 0,d={},l=[{value:"Local Setup vs Remote Setup",id:"local-setup-vs-remote-setup",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"VSCode",id:"vscode",level:3},{value:"Remote Only: Additional Setup VSCode",id:"remote-only-additional-setup-vscode",level:3},{value:"VSCode Extensions",id:"vscode-extensions",level:3},{value:"Docker and Docker Compose",id:"docker-and-docker-compose",level:3},{value:"If you get a docker-compose: command not found error",id:"if-you-get-a-docker-compose-command-not-found-error",level:4},{value:"SSL Certificates",id:"ssl-certificates",level:3},{value:"Setting up Rucio and Configuring VSCode",id:"setting-up-rucio-and-configuring-vscode",level:2},{value:"VSCode Tasks",id:"vscode-tasks",level:2},{value:"Starting Rucio",id:"starting-rucio",level:3},{value:"Stopping Rucio",id:"stopping-rucio",level:3},{value:"Debugging Overview",id:"debugging-overview",level:2},{value:"Debugging Rucio Server",id:"debugging-rucio-server",level:3},{value:"Debugging Rucio WebUI",id:"debugging-rucio-webui",level:3},{value:"Debugging Rucio CLI Clients ( rucio-admin and rucio)",id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",level:3},{value:"Debug rucio cli client",id:"debug-rucio-cli-client",level:4},{value:"Debug rucio-admin client",id:"debug-rucio-admin-client",level:4},{value:"Debugging Rucio Tests",id:"debugging-rucio-tests",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"local-setup-vs-remote-setup",children:"Local Setup vs Remote Setup"}),"\n",(0,o.jsx)(n.p,{children:"It is possible to run the containers for rucio development locally or on a remote VM."}),"\n",(0,o.jsxs)(n.p,{children:["For local development machines with limited resources ",(0,o.jsx)(n.code,{children:"(<16 GB RAM, < 4 Cores)"}),", it is recommended to run the containers on a remote VM. This will allow you to use your local machine for other tasks while the containers are running on the remote VM."]}),"\n",(0,o.jsxs)(n.p,{children:["Local development has been tested only on Linux hosts.\nRemote development has been tested on Linux(for the remote VM) and Linux/MacOS(for the local instance of vscode).\nThe additional steps required for setting up a remote development environment are described in the sections begininng with ",(0,o.jsx)(n.code,{children:"Remote Only: "}),". These sections can be ignored if you are setting up a local development environment."]}),"\n",(0,o.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,o.jsx)(n.h3,{id:"vscode",children:"VSCode"}),"\n",(0,o.jsxs)(n.p,{children:["Install ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/Download",children:"Visual Studio Code"})]}),"\n",(0,o.jsx)(n.h3,{id:"remote-only-additional-setup-vscode",children:"Remote Only: Additional Setup VSCode"}),"\n",(0,o.jsxs)(n.p,{children:["For development on a remote VM, you will need to install the ",(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack",children:"Remote Development Extension Pack"})]}),"\n",(0,o.jsxs)(n.p,{children:["You should setup SSH access to your remote VM. For more information, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Remote-SSH: Open SSH Configuration File"}),"\n",(0,o.jsx)(n.img,{alt:"Open SSH Configuration File",src:i(67403).A+"",width:"609",height:"270"})]}),"\n",(0,o.jsxs)(n.p,{children:["You will be asked to create a new SSH configuration file or select an existing one. If you have an existing SSH configuration file, select it. If you do not have an existing SSH configuration file, select ",(0,o.jsx)(n.code,{children:"Create New File"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Update the SSH configuration file:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host \n HostName \n User \n"})}),"\n",(0,o.jsxs)(n.p,{children:["Additionally, you can use the ",(0,o.jsx)(n.code,{children:"IdentityFile"})," option to specify the SSH key to use for authentication. For example:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host \n HostName \n User \n IdentityFile ~/.ssh/\n"})}),"\n",(0,o.jsx)(n.p,{children:"If your remote VM is behind a firewall, you will need to setup a proxy. For example, at CERN, we can use lxplus as a ssh proxy to connect to the remote VMs, which are not accessible outside the CERN network. The following is an example of an SSH configuration file that uses lxplus as a proxy:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host lxplus\n HostName lxplus.cern.ch\n User \n\nHost \n HostName \n User \n ProxyCommand ssh -q -W %h:%p lxplus\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Test connection to Remote VM"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Remote-SSH: Connect to Host..."})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Select the remote VM from the list of hosts"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Depending on your SSH Configuration, you may be prompted for the password/s in the following order:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"remote user on the proxy host"}),"\n",(0,o.jsx)(n.li,{children:"ssh key password or the password of the remote VMs user."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["The bottom right corner of VS Code will show the status of the connection. If the connection is successful, you will see ",(0,o.jsx)(n.code,{children:"SSH: "})," in the bottom right corner:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Successful Connection",src:i(76587).A+"",width:"354",height:"108"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["For troubleshooting and Tips/Tricks, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/troubleshooting",children:"Troubleshooting"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"NOTE for remote development"}),": From hereon out, all the instructions should be run in the VSCode instance connected to your remote VM. ( i.e. the VSCode instance that shows ",(0,o.jsx)(n.code,{children:"SSH: "})," in the bottom right corner)\nYou can use the terminal in the VSCode instance to run commands on the remote VM directly. To do so, open the terminal in VSCode instance connected to your remote VM by clicking on ",(0,o.jsx)(n.code,{children:"Terminal"})," in the menu bar and then clicking on ",(0,o.jsx)(n.code,{children:"New Terminal"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"vscode-extensions",children:"VSCode Extensions"}),"\n",(0,o.jsx)(n.p,{children:"Install the following extensions:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.python",children:"Python"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance",children:"Pylance"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker",children:"Docker"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote - Containers"})}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["VSCode comes with a plethora of extensions that can significantly improve your development experience. For more information, see ",(0,o.jsx)(n.a,{href:"https://code.visualstudio.com/docs/editor/extension-gallery",children:"Extensions"})]}),"\n",(0,o.jsx)(n.h3,{id:"docker-and-docker-compose",children:"Docker and Docker Compose"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})]}),"\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})]}),"\n"]}),"\n",(0,o.jsxs)(n.h4,{id:"if-you-get-a-docker-compose-command-not-found-error",children:["If you get a ",(0,o.jsx)(n.code,{children:"docker-compose: command not found"})," error"]}),"\n",(0,o.jsxs)(n.p,{children:["Docker has deprecated the ",(0,o.jsx)(n.code,{children:"docker-compose"})," command in favour of ",(0,o.jsx)(n.code,{children:"docker compose"}),".\nTo turn on ",(0,o.jsx)(n.code,{children:"docker compose"})," support in ",(0,o.jsx)(n.code,{children:"docker"})," command, please make sure you have installed the ",(0,o.jsx)(n.code,{children:"docker-compose-plugin"})," package from the ",(0,o.jsx)(n.code,{children:"docker-ce-stable"})," repository."]}),"\n",(0,o.jsxs)(n.p,{children:["The full command to install ",(0,o.jsx)(n.code,{children:"docker"})," and ",(0,o.jsx)(n.code,{children:"docker compose"})," on RPM-based installations is:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"yum install docker-ce docker-compose-plugin\n"})}),"\n",(0,o.jsx)(n.h3,{id:"ssl-certificates",children:"SSL Certificates"}),"\n",(0,o.jsxs)(n.p,{children:["If you would like to debug the rucio webui and x509 authentication capabilities of the rucio server, you will need to obtain SSL certificates for your development environment. For remote VMs, you can request them from your IT department or you can use letsencrypt to generate a certificate. For local development machines, you can use ",(0,o.jsx)(n.a,{href:"https://github.com/FiloSottile/mkcert",children:"mkcert"})," to generate a certificate."]}),"\n",(0,o.jsxs)(n.p,{children:["Whatever route you go, you should have a ",(0,o.jsx)(n.code,{children:"hostcert.pem"})," and a ",(0,o.jsx)(n.code,{children:"hostkey.pem"})," file accessible for your development environment."]}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-rucio-and-configuring-vscode",children:"Setting up Rucio and Configuring VSCode"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clone the rucio repository"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"gh repo clone rucio/rucio\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clone the vscode configuration repository"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"gh repo clone maany/rucio-vscode-dev-env\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Move the vscode repo inside the rucio repo"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"mv rucio-vscode-dev-env rucio/.vscode\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Copy the SSL certificates to the ",(0,o.jsx)(n.code,{children:"rucio/.vscode/certs"})," directory"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open VSCode. If you are using a remote VM, open the VSCode instance connected to your remote VM."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Go to ",(0,o.jsx)(n.code,{children:"File"})," -> ",(0,o.jsx)(n.code,{children:"Open Folder"})," and select the ",(0,o.jsx)(n.code,{children:"rucio"})," folder"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Edit the rucio/.vscode/docker-compose.yml and change the ",(0,o.jsx)(n.code,{children:"RUCIO_HOST"})," environment variable for the rucio-dev container to ",(0,o.jsx)(n.code,{children:"http://localhost"})," if you are using a local development environment or to the fqdn and port of your remote VM if you are using a remote development environment.\n",(0,o.jsx)(n.img,{alt:"RUCIO_HOST",src:i(75253).A+"",width:"1092",height:"520"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Add the default url for webui in ",(0,o.jsx)(n.code,{children:"rucio.cfg.template"}),", which is required to handle Cross Origin Requests (CORS) in the webui. Add the following line to the ",(0,o.jsx)(n.code,{children:"[webui]"})," section of ",(0,o.jsx)(n.code,{children:"rucio.cfg.template"}),":\n",(0,o.jsx)(n.code,{children:" urls = "})]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If your server is running on a remote VM, but webui will be running locally, then the requests originating from webui to the server will have the origin ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If both the server and webui are running locally, then the requests originating from webui to the server will have the origin ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),". In this case, you can set the ",(0,o.jsx)(n.code,{children:"urls"})," to ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If both the server and webui are running on the same remote VM, then the requests originating from webui to the server will have the origin ",(0,o.jsx)(n.code,{children:"http://:3000"}),". In this case, you can set the ",(0,o.jsx)(n.code,{children:"urls"})," to ",(0,o.jsx)(n.code,{children:"http://:3000"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"vscode-tasks",children:"VSCode Tasks"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsx)(n.li,{children:"You should see a list of pre-configured tasks"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"tasks",src:i(46399).A+"",width:"599",height:"334"})}),"\n",(0,o.jsx)(n.p,{children:"These tasks are helpful utilities for your to quickly start/stop rucio containers and to setup different types of debuggers ( server, webui, pytest, clients, ...)."}),"\n",(0,o.jsx)(n.h3,{id:"starting-rucio",children:"Starting Rucio"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"start-rucio"})]}),"\n",(0,o.jsx)(n.li,{children:"This will start and initialize the rucio development environment. The first time you run this task, it will take a while to fetch and build the docker images. Subsequent runs will be much faster."}),"\n"]}),"\n",(0,o.jsx)("video",{width:"100%",controls:!0,children:(0,o.jsx)("source",{src:"/documentation/img/vscode/start_rucio_task.mp4"})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["After the command has finished, you can run ",(0,o.jsx)(n.code,{children:"docker ps -a"})," to check if all the containers are up and running. You should see something like this:\n",(0,o.jsx)(n.img,{alt:"docker ps -a",src:i(49962).A+"",width:"1515",height:"453"})]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"stopping-rucio",children:"Stopping Rucio"}),"\n",(0,o.jsxs)(n.p,{children:["To take down all the containers, run the ",(0,o.jsx)(n.code,{children:"stop-rucio"})," task. This is equivalent to a ",(0,o.jsx)(n.code,{children:"docker-compose down"})," command."]}),"\n",(0,o.jsx)(n.h2,{id:"debugging-overview",children:"Debugging Overview"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server, webui, clients, etc."]}),"\n",(0,o.jsx)(n.p,{children:"The debugging process for Rucio in VSCode is broken down into 3 steps:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Start the process inside the ",(0,o.jsx)(n.code,{children:"rucio-dev"})," container that you want to debug"]}),"\n",(0,o.jsx)(n.li,{children:"Attach the debugger to the process"}),"\n",(0,o.jsx)(n.li,{children:"Insert breakpoints in the code and start debugging"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"After you are done debugging, you should remember to"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"detach the debugger from the process"}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"debugging-rucio-server",children:"Debugging Rucio Server"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server:debug"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Attach the debugger to the rucio server by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"Server: Debug"})," from the dropdown menu."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"attach to rucio-server",src:i(80759).A+"",width:"393",height:"514"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio server."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You can now set breakpoints in the rucio server code and debug the server."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["After you have finished debugging, you can detach the debugger from the rucio server by clicking on the ",(0,o.jsx)(n.code,{children:"Stop"})," button in the debug toolbar."]}),"\n",(0,o.jsxs)(n.p,{children:["**NOTE: ** After detaching the debugger, run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n",(0,o.jsx)("video",{width:"100%",controls:!0,children:(0,o.jsx)("source",{src:"/documentation/img/vscode/rucio-vscode-server-debug.mp4"})}),"\n",(0,o.jsx)(n.h3,{id:"debugging-rucio-webui",children:"Debugging Rucio WebUI"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio webui."]}),"\n",(0,o.jsx)(n.p,{children:"To debug the rucio webui, you will need to start the rucio server in non-debug mode and the rucio webui in debug mode."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-ui:debug"})]}),"\n",(0,o.jsxs)(n.li,{children:["Attach the debugger to the rucio webui by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"UI: Debug"})," from the dropdown menu."]}),"\n",(0,o.jsxs)(n.li,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio webui."]}),"\n"]}),"\n",(0,o.jsxs)(n.h3,{id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",children:["Debugging Rucio CLI Clients ( ",(0,o.jsx)(n.code,{children:"rucio-admin"})," and ",(0,o.jsx)(n.code,{children:"rucio"}),")"]}),"\n",(0,o.jsx)(n.h4,{id:"debug-rucio-cli-client",children:"Debug rucio cli client"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio cli clients."]}),"\n",(0,o.jsx)(n.p,{children:"To debug the rucio cli clients, you will need to start the rucio server in non-debug mode"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Then, you need to start the ",(0,o.jsx)(n.code,{children:"rucio-cli:pre-debug"})," task to inject the debug configuration into the rucio cli clients."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-cli:pre-debug"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the ",(0,o.jsx)(n.code,{children:"Rucio:CLI Debug"})," launch configuration by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"Rucio:CLI Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio cli clients."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["After that, you should open a shell inside the ",(0,o.jsx)(n.code,{children:"rucio-dev"})," container"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"docker exec -it rucio-dev bash\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Insert breakpoints in the rucio cli clients code."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Run a rucio cli command to trigger the breakpoint."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"rucio-cli:post-debug"})," task to remove the debug configuration from the rucio cli clients."]}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"debug-rucio-admin-client",children:"Debug rucio-admin client"}),"\n",(0,o.jsxs)(n.p,{children:["The instructions are the same as for the ",(0,o.jsx)(n.code,{children:"rucio"})," client, except that you need to start the ",(0,o.jsx)(n.code,{children:"rucio-admin:pre-debug"})," task to inject the debug configuration into the rucio-admin client."]}),"\n",(0,o.jsxs)(n.p,{children:["After debugging, you should run the ",(0,o.jsx)(n.code,{children:"rucio-admin:post-debug"})," task to remove the debug configuration from the rucio-admin client."]}),"\n",(0,o.jsx)(n.h3,{id:"debugging-rucio-tests",children:"Debugging Rucio Tests"}),"\n",(0,o.jsxs)(n.p,{children:["After you have run the ",(0,o.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio tests."]}),"\n",(0,o.jsx)(n.p,{children:"To debug the rucio tests, you will need to start the rucio server in non-debug mode"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,o.jsxs)(n.li,{children:["Run the command ",(0,o.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Then, you should open the file containing the test you want to debug in VSCode."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Insert breakpoints in the test code."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the ",(0,o.jsx)(n.code,{children:"rucio-pytest:debug"})," to start the test in debug mode"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Attach the debugger to the test by clicking on the ",(0,o.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,o.jsx)(n.code,{children:"Pytest: Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)(n.code,{children:"F5"})," to start debugging the rucio tests."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,o.jsxs)(n.li,{children:["run the ",(0,o.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},75253:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-compose-rucio-host-465a74fa33e82533f549c7342c5942e2.jpg"},49962:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-ps-7e66472c5b3eaab849aed2e0fe06e354.jpg"},67403:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/remote_ssh-b59c7e945ebcc026fee6dd82cfebe0ab.jpg"},76587:(e,n,i)=>{i.d(n,{A:()=>s});const s="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAWIAAABsCAYAAABQIbi+AAAAAXNSR0IArs4c6QAAH3dJREFUeF7tnQ1UVWW6gJ/Gw4+KQB3/TopgIKZIJsfRQA3FxFKupU465hrF8ZqOS6Ep5TYTeLth5UWnBmt5/ZkmdFLT/BsHKRlRUQN1Oo4GaP4lioUplAoSf83c9W1+PCDIYXNU1Hev5Vpy2N93vu/Zm2e/5/3evc8DRqPx315eXtzN26VLl+7m4cvYhYAQuM8JPCAivs/PAJm+EBACd5yA/UXsYsTzYS8eNrnQxqkNjo6VcywtpaCkgMLcb8n+9iz5hfabu0TE9mMpPQkBIXD7CdhPxC4mevn74mVsUzGL0gLy8wsppYQSnHDCERejkTaVYi7Iz+ZERia5dhCyiPj2nzjyjkJACNiPgF1E7OJpJsjfhCOl5Gcf50T2TSJeFTF7+dLdy6jtn5uRhuVs02wsIrbfCSE9CQEhcPsJNFnExl7BBHq1gYJsLJZGRLgqgjabqWiaTmpmvu7Zi4h1o5OGQkAINAMCTRKxi2cgg/2NlOZmkGY5i3Vc62g04eX1MEZHFy3yLSzI59vsbHILS62m7YKnOQh/kyP5GbtJ1xkZi4ibwZkkQxACQkA3Af0idvEleLAvbQpOsDv1hJWEXTCZzZhNlblilS4GqtbsCrItpGfmaq9VbC74Bg/Gt00BJ3anckJHlkJErPv4S0MhIASaAQGdInbEMzAUf2MBGbtTsQ5kr6cqcsnIzOBsfoVyHY2e+PfyR/n5hlSEiyfBg/1pk59BcvpZK0nbRkhEbBsn2UsICIHmSUCfiF16ETzYC6fsdJKtc7vVUXI26amZ3Jj1NdIrOBCvOqJfY69QAr1KdEXFIuLmeXLJqISAELCNgC4Ru/QKZrAXN0jTpVcog70cybUkYsmtZwAmM2FmEwXZu0nNtMpDVEqc2q/bMA8RsQ2QZBchIASaLQEdInbENzgUX2rnhsEUGIbZmE9GcjpnrdfkrKfv6ElgqD/GXAuJNWztQq/gwXiRQXJq49ITIuJme37JwISAELCBgA4RGzGHBmLKry1SMJnDMJsKOJGcyombiDg41B+n3HSSLTWTF1p7Yy7pyZY60hr1z0ZEbMORll2EgBBotgR0iNhEYJiZNrXzw2pBzjOYUP82FGTsJrWeUjQXz2AGa/skk1orbK7IExdgSUynvsxGXSRFxM32/JKBCQEhYAMBXSI2h5kx1iFiHE2YQ82YqKcUrWoxj3wsyenk1oqaK0ScjyXRIiK24eDJLkJACNwbBHSIuP7UhELiaDIz2Fx1u3MG2bkFFNAGo8nr+m3Nlt1YaluYytSGpCbujTNLZiEEhIDNBHSI2BHP4FD8yWZ3amaNu+mq3tVoDiXQVHULR82xlOZa2G2xvqGj6veyWGfzUZMdhYAQuKcI6BAxuPgGM9j3xvI1MOIbaMbXWCHhgoJ8CitvaXZ0MWKsfvRaNpb0zJqpiarytRO7SW3k7XWSI76nzkmZjBC47wjoEjGV0qxZ+VB1swaU5p7AknGCypvqrkN1NOLp3wt/dXtdaS6W3ZZqGddXm2zLERER20JJ9hECQqC5EtAnYhwxmUMrStW050OonwdjNjlqty+nZ+bf9Dblioi6DVTd0uziSeDgitri5DrTFjfHJyJurqeXjEsICAFbCOgUsXpWT+XzIQpOkJ4JvQLregBQfUOoelZFKdnpaZT2qnjoT+3nVtgyAbWPiNhWUrKfEBACzZGAfhFrLg4kyF894F1tpeRakuu/tbn27I1mQgNVdUXFJo/BbI6nh4xJCAiB20GgSSJWA6xOM1BAdnoqNj/fvbqmWB4MfzsOtLyHEBACzZdAk0Wsydhkxmw20YZSCnKzOXH8RP3fRVfjq5IKyM2wyFclNd/zQ0YmBITAbSBgFxFr43Q04uvfC9+qB8I39OWhuSfIrKuyQsekJUesA5o0EQJCoNkQsJ+Iq6akIt6HvWhrcsHo1AbHqiRwaSkFJfkU5uaR/e1NvlxUBxoRsQ5o0kQICIFmQ8D+Ir4DUxMR3wHo8pZCQAjYjYCI2G4opSMhIASEgD4CImJ93KSVEBACQsBuBETEdkMpHQkBISAE9BEQEevjJq2EgBAQAnYjICK2G0rpSAgIASGgj4CIWB83aSUEhIAQsBsBEbHdUEpHQkAICAF9BETE+rhJKyEgBISA3QiIiO2GUjoSAkJACOgjICLWx01aCQEhIATsRkBEbDeU0pEQEAJCQB8BEbE+btJKCAgBIWA3AiJiu6GUjoSAEBAC+giIiPVxk1ZCQAgIAbsREBHbDaV0JASEgBDQR0BErI+btBICQkAI2I2AiNhuKKUjISAEhIA+AiJifdyklRAQAkLAbgRExHZDKR0JASEgBPQREBHr4yathIAQEAJ2IyAithtK6UgICAEhoI+AiFgfN2klBISAELAbARGx3VBKR0JACAgBfQRumYh9fHzw9/evMaozZ85w+PBhfSO9SatLly7ZvU/pUAgIASFwuwjYTcQODg6UlZVVj7tfv3506tSJH374gX/961+4u7tz9epVdu/eXb2PwWCgvLy8yXMVETcZoXQgBITAHSRgFxE/+uijqAj4yJEj5OTkaNN5+umnUXL+29/+pv08YMAA2rVrx9atWzUxm0wm+vTpw7lz58jMzGwSAhFxk/BJYyEgBO4wgSaLuHv37vTs2bN6Grm5uRw9epShQ4eSl5fH3r17td/5+fnh6+vLvn378PDwwNPTs7rNyZMnmyRjEfEdPovk7YWAEGgSgSaJuFu3bvTq1Ysff/yRAwcO4O3trUlWRbw/+9nPsBasSlOodEXV71TKQuWLVVSs0hYnTpwgKytL12RExLqwSSMhIASaCQHdIlaiDQ0NpWXLlqSnp3PhwgVtSirl8Pjjj+Pk5MT+/furX1f7DRs2TBP0V199pf1Tm6urqxY9q/zy9u3ba+SZbWUkIraVlOwnBIRAcySgW8RqMh07diQwMFBbkLNehFO5YfWvqKioxpzV4pyzszOFhYXVr1ct6v3jH//g/PnzuhiJiHVhk0ZCQAg0EwJNErGag9lspkuXLhw7dqw6yrV1blUi//bbb7XUht5NRKyXnLQTAkKgORBosohVfjc4OJgHHniAXbt2ceXKlep5qai4Q4cO2s9q4a64uLj6dyo6fuqpp7QIWUXTly9f1s1DRKwbnTQUAkKgGRDQJWJVrvbggw/y0EMP4ejoWD2NHTt2UFBQoP2sStWeeOIJlHDV9tNPP2nlbWfPntV+VuJWJW5KxGorKSnRUhzqX1X+2FY+ImJbScl+QkAINEcCukQ8evRobS4qwlXizM/P1/59//332ustWrTQJFu1MKdu2lDyVtJOSUmpzhG7uLhowjYajZrUW7durbXfvHlzo1iJiBuFS3YWAkKgmRHQLWIV+aoIuK6tbdu2DBo0SKsNViVsauvcuTM///nPtaj466+/rrOdiqBV1YWIuJmdJTIcISAEbimBWypiVRes6oNFxLf0GErnQkAI3OUEdIv43//+t5YPVqkJtdBWld+tSk0MHz5cS00oEZeWltKjRw8tNfH3v/+9uqxNpSZUWkLlm9Win5ubm9ZGIuK7/KyS4QsBIdAoArpErKSq5Kn+1bdYp6olVCpCVU6oTd1RZ7FYqmuFay/WqRs6lMxVnlmVwjVmkxxxY2jJvkJACDQ3ArpEbD2Jm5WvKUm3b99e2/3ixYtaZFy1WZevqedRqMU+vZuIWC85aScEhEBzINBkEcsNHc3hMMoYhIAQuJsJNEnEN7vFWUW86mFA1pt6TT2D4tq1a9Uvyy3Od/PpI2MXAkLAHgR0i7i+h/4oOasnqtX10B/1cB9VY6xu2Dh+/Lg2fnnojz0Oo/QhBITA3UxAt4jVpGs/BvORRx7RnjuhKirUYlxdj8Gs+l3tx2AqMavnGOvZJEesh5q0EQJCoLkQaJKI1STqejC8qnoICQmp88Hwn3/+ufYVSl5eXtUMVITc2EoJa4Ai4uZyOsk4hIAQ0EOgySJWb1r1VUkZGRnVz5Jo6KuSVDVFQEAA2dnZjX62RO2Jioj1HHppIwSEQHMhYBcRq8no+fJQlWdW9cVN3UTETSUo7YWAELiTBOwm4tqTUF8m6u/vX+PlM2fOaF+PZO9NRGxvotKfEBACt5PALRPx7ZyEiPh20pb3EgJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUATcYvIEY1sJrsLgXuHwJgPPe6dychM7koCIuK78rDJoO1JQERsT5rSlx4CImI91KTNPUVARHxPHc67cjIi4rvysMmg7UlARGxPmtKXHgIiYj3U9LRp0QoPZ8i5VqSntbS5CQFXt7Y4FeZx6Sd9mPSJ2EDLTi60pJir3xRTru+tbWpleKQrvk65HD1WbNP+t34nZx7qBN9/U994DLh2MmhcZLONgP1F3DqAuHGDyNwUz6ortg2iOe/V7rFIdg64wvTlCaTp/EMHB4JGLCCh9Wr8PzlESXOe8N02ttahbIp4gl1L3uA9nedbY0Rs6NSNJyOfZNATD+JQUk5RCbi2M/BdahqJcWmczLM3wI6EJs4gzOkg745M4kypvftvfH8PjZ3My2NP8l54Gt/VNZ62/kzf1I+T4R+w8+vG938/trCviDUJh0FaPFHH6/mrcPJm2qhwInw8aW8o5WLeaZYnLeK9s2V49Awnfmh/zO6tofgSp46vJ3zrAVxDFpDUaTt9/7KLS5VHycl7Gl+McmDu4iV8pluQDR9ypw4DifYuYnnaIXIa3r2ePUTEutE11PA2irhl/1Bmze/Kd0uT2LIxh6tVY3NsS+/IkTz/HwZ2Rqxk5+G64mMDHcY+y9Qofzq6FpOz4a98EHOM7xuYn2vYRH4bdpLtJUEEHkjg3TWXGyKC4fEgpi4Mwa8zXP3nQVZOT+ZkQYPNbNvBsSsTtoWSPzcZ15ggvpu+mr1WFx9D/1HMfiGHLYcDmPp4Gm9GHuPHGj270zt6PM9PNOF6NY8v4j5mzca8W/qJwraJ3dm97CdiWyQMBIQuYHP3XGK2biat0AGPTiY4u49dxQNZGzERtyMJRFvOUeJiwtw6j3VHz+FzB0Vsn8MjIrYPxzp6uV0i7tSPWWv7cD7iA7bUKVp4KGwiL0cVs2bkRo7WFt8jTzJ3Uz++j11H4nkPnl8cAnF/5P2NhfWjcezKLzaFUj53GVtKgvjtMhPbx9TRt3UPjh78YttU/Pav44M15fSdP54nzm/kf24Qor4jokT7WuQFlm7sxuxhXxI3I4OWw0IZPgyylu7E8nVbnkt8FqIP0mGxL/ufWscRq6jZdexk/jsKtkVs40znoUyNcWfPmGUk3+eRsz4RuwUwqeM5Vh2vvBS28Oa1SeG4pS2qPxLWjrsDzz3/f8T+tIS+m2p9RO8wjn2/fpR1dXzE9GtAxLs6h5MyzptP18Tw5jfXTzCnTiNJGDWcIHd3nDnL4tWrcXt2Jq7JrzDjeBm0CGDpy+O4uiaGqG/KoPWjzB4Rzos+D+NafolPt79BZHk4GcF5/PL/VnMIB/weC2ehitqdyzh3fh8xW1fzWV3BfwsT40dOI9rPR+srp9iN9heWVKQmWph4bng4r/l5054rWCwJTN+ZgVtQLCl++xm6YhunACfPcPaNc+PNd1bj9Owc5ni3pYuzI8WXj7HleB7dugfg5+7A1fP7mLs+gc+uqUb9WfpiOM+oTxWFZ/k0dQWRh85RgolJE35HtJc7blzGkrWa6VsPkENbxo+x6lu1SVlCZJaJ+IhpkBRRwQoTr02LxWx5hTGHrCfsgM9j4SwODsDs7sDFC8lM/vN6Djn789qoifzSqy2uxedYt30JUUfzwMmf2BfCea5jO9obrvH59hgmfBfC5lED8XNRx+ka587vImrTenap+dTY2vJ06DRie3vTxVDGySMrGJralrUR4+hWXIariwMleRks3LqEFep42rg1nJow0DPuJUZ+/RELl+bRYZg/xqP/5GjluWZ43J++nGT/YQPmpbMIOfwnbT/rrcOMWbw27EteH7tHi4I7R79EVM80ol84eD2yrjXeh6ZMZfbjacRpEjXQLXYWz139mIULL9Q7MyXK15c9SOKglewvAMOTY5m/2JlP+q3GYoe0Rsuxk4l6PI01jCTs2J94d4MHU3c8SVkq+Lru4fXIk3SNncXww3/lwpQQvlfpiWoULgxaM4eQox/wP/PV50t3Qja+xBP73+ethXbP6dh49JvHbvpE7PQor42biIclnhnqj0v7I5/JM6cTCD94+qY5UI+AOaQMN5GWupqFlkNkVSVMWzxK3ItzeK54H/N3JrLubF51Pw2J+DP3ISwN9eGzpBVssXKEU89IMoaWEbVmPRYcKC5wY+70+kTcivHPxxLrso+IpL2cwg2n4q841SmyWsRZnSaSMimAzG1LWPSNA0NCZzLXOZERHyZr4rTe/EJiSfLLY/7W9ewqNzE5dBrjC1doIvYImkeS+QrzN60mzXk4y8YEkLn+VSLLx7Fvkonlixex6hr4qD467GTA2tO8+Jt5mI/EEJnlgDl4JvHdr7BoUwJbLpuYPW4mQaffZmDyacANv06tuHi5jG69p5EwoIioxfFsKXHAo0MXbVGrpGMYCeP6k7n+FSJPm3jtN/MYcOQNpmeV4eEXzrIBZcxfsoSSEX/gtZJ4Bm79ihKnIax9OYTMP8fw5nfWF7tKJttXsOj0FVxd4NQ3RTwzYQHRbGZ68iHoPo1lA4qIUeMwqJxuCKfWx6P+9tzKc8nxVMepiKg1m8l09mb2qGmYT7/N0OSa55JPv3kkDSjiva3r2XLZAQ9DHmmF/bX+cjYtYVGeA0HBM4lz28nQDysuZrZsDYrYsQdTdwRxYswH7M1TKYbxzJhSzJbwjWS1C2LGMn8uzF3JhgPFmvhej7rEe2F7uI7JQO/4V5nERv4r8pj2MdwwdjLvRP7Ae09t5WRdgmzTg0mbgjg/fSU5U2Yx2Wk7r8c5M2NtT76YsJr99Xir5QtT+d8Zl3j3qa0V+eROQczdEcDJke+zxQ5RpyFsIq8/eYgPLg1lAht4a2ExoRtfYnQf+Dr2jyz8sJDe8bPo+/dtFEUGcX7MSvZWfTpQaY0dkzHGL+D9jWohT13g5jDVdRv/NSPjvk5P6BOxOrtry7hFFyaNm8ZzZxMITztd71UeWuH32GiiBwwkyL0Ii2U9USkHOKXyvG7+zB46mkndu+CWd4iFyQmsOFuEEvHOAQ9TXG59xjriXL6fye/UnyPWRFwdzQJK9jPrEfHlgWyKGE7WqleJsY6qq/tYj7NacHPbTN+1+yrmZxxJyotPsGX521wJXcxCH0fgGpvXv0XOk//NgKxXGZGm/mKsUxO5zJkWa/W7VoyfsJjZ+W8wMKUVcTMjaZ/yCuFHWzHtV7E8czyGMQdbabLs9flvmPBlGU7qgvBCWxa9E8+WnyrTPcZEfNfuq3kRdBrI2peHk7k8hjfzrZVkYvaUWIYciWDMobY1+q74lDCRkvWvEtN6Jl8MvUL4kgQsPjP5IrSI6UusFy0r52XNRL1N6yE1Wao+I8Ip2foKkRfU72ourtU+Tj7qk4H3zhprAupiP3taLM9UM62cT63UxPVPERVsbNkaFHGPUH6/0MDasCTOaB0a6PzCRGZMMXDFqSXnoxNYu6cyxdCmH7/d0ZWdg6w/khswfxjN6EsreT3qTIWIwybyvzHlrKqx3/XRdp47SxPUmzE5dI19Sft/dOQxOla/XtFP7e2hKdN5/YUzxA1L5rz6pRrPwSByJvyRDYdtodHAPirFstiFDdEwaXFLtkzPYVBCHy5sKOdx74PExT/I1GUm9kT8QMh8AxuqmQGO3Zi0dzwtYxewLFGjQLfYl5jdOYWXp/xTRKz7FmfdMlYH2wEP71DiR42mfVat6MepC+OHzySuex5RSxaR2X8BSZ6HmJC0n+qAt9NoPg4uu+liXaNEXD6alF978/Hit1lh9ZH4eh/r6fL84usRoppCi/4kvDyOi+tfZX5hF3yc1YtlXPqhFXOmRuKWEkH4UfUR2UrEm4qIm/l7fule84Q/d2ShFnkGjVrAYsNq+m53Y+3MQXy6/A1WXOlSU5bGcaS86M3Kd95mVQlUicv/L7soMQ4kbtRonunohlN5GTjnsVyJ+LI300aG86K3ifaGMkpwIHO7SjO41RKx1cUqO4CEmeO4uOlVtvgtIN6QwMCtGVayV6mmWkzUtDqo8YXRq8YUr/HpxgjCzzYsYteA35HR+0sGfrjt+gKpdhFVF6kqpnWLGI1NF5bHLWKdvURcKR8lYk1uSiGP9GPG2hF0vXqIpWO2Xl8M00TcjZ2DVlvlRhsZEbftw/S1PTmiRb4VsqoScXmbHkzdFMQZ9ZHfKmCoQn2rI2KVThi05j/pvfEjtmPC2GMAz3X+nLfmljNhRxBnIvZw1fUHysJ+ScixilRO9SYRcb1XOf0RcVWXbqFsmuTD8iWVkamKjJ8dTknKCtY1WE7kQMCIBWzusJ2BHybXrErQojkluVdY7hmrq2riBhHThdjfzMPn8wgmfFlUM0fcpIg4hvdqRZwqnxqSFcPQtNxaEXEec6bNqyPXWgFUi+jGtGLR527Edrcw9C+KS0MinkeK9178/3KAZyb8gTnlq5mwdR+nUAugw8lcFcMqz3nsM+cyfU0Cn11xY/aUBQw50oCIj6OV3S1z3smnHYbjlKxSGda515tFxCFYaqUxtAnWsbhW+zjVKWLFYNo8q08St1HENVIT6uN+H6YmBFMW9xF7vZ9l6rAcVoZXVCZoi1kxxSwNS7ZKTUBVjvjNsRUpi/pzxBW54OevfsxblbngDmGhDHL6kg0bK3LDHaZMZUZ17rjm37aWI054kMR+tyZHXHERCmJyZDmJ0T8wfMdEelOMdlY4OVP+t5W8Hu/M8/PbsT9iT61yu+s54jfn51AuOeLqg9c0EWsR8TjaW5YQqeWKG9ocCHgslF4lp7HkXQEXtTg2kQHfLaFvCkzya8Wps6fJKW6FT+9xLO7fiveWx7CzdwPla5U54l1JNeV/o4gdeHrMH1jsdoCIpO1k4U/cpOHkaIt1bkyaEEu08z4ikreTVexGO3LJ6jCtVo7Yn8xtKxrMEVfkM8tYmbSaVRfKMA/9HXEtErQcsZb71fLHm/nschGu7m5cVfPW8HkT+5s5jHeBzJRXKxfGGiPixcwpTyA86RCnUBFtLRGvX03aZTcmT1KpiYZEXFYR3f46FJ/iA4QvXsGun9DKDOP8vmX+J8mcUheOF/zJ2r6C+afzcHJvxdWzRQz5VSxzSWRu8gGyilvh4VKG5ZtcShol4l34hMzkxeJEwtO+0iL/pP5XWKRyxHlltHMpI+tyAGutUx23IiLGWct7jjz/EXEL8+gaPZHAw39lVaIqJXOm29zxhHzzV5atKdb2Cz2WcMNiHSqq3taP76PXkXjag+eX1VM18YiqjvBg55h1HKnMrXYIG0GI0yHWVooYrYRsJD9GvM+WY7X+5qyrJj4sp+9C+1ZNWL+b6wuT+f3YM7xbeXFBjT2hG+ljVtabw76hamK+O3tGStWEfhG39id23DhcD8TbKGF1CN0YEqIqCbzxcW+Nc/llMk/tY37Sena5DGHpiDAGdHSjvQGuXD7Hp6kJRH3ZcPnars4TSRn36I1VE7VzxNoQ+hM3ZiLjO7vjXH6Ni5e/YuH6eFapiLZ1xUr/ZK+HKyoLUuMZfTms7qoJlzLOZd+kagK1wh9OdO9H6aYqHYovYbGsYMLOr2pUTXRxVnM9RNSfl7ClMiWipRoG5BGpLbKpQdsq4l2UdApl2ajRDGmr+JZypTCD+aviWVWsLprTmNy5HW4G9XpeRVXI0do54lp5dNyY9Ks/MDv/bQYmVSye+QXNY7OKrpcoMTvgFxDOwuD+mF0q57J8CVsM1iyvcS57PRPW7uJUo0R8gCETYplbnkDIJwe4ZFVtorhdPLWaEVsdiL/lIgZNMmv7cWHun67ng2s58KGw8cyO/JFPxmy9sXyN63XEHq7FfF1nHbES/gxCDn/Eux9eD2xa9uhGV3Vn3eHrpW5KaFFa+dg/b1iPqa4j9jZwdX8aayKSsSlOaiiOqvH7jjyXOINBTjmcOV+VrTZg7ONB2eql1dH8jV260zt2PBN+0YVWV3M5EvcxK6WOGH0irpRwuwNVVRONOoKy811BoBWuTuDWeTTLRnXh4z+/fU/cKVkX+gYX6yobuQ4bxaz5vlzdsI1P4o9dv6us6oaO0HK2R6xj7zGdNzyrFMje8fQsKax1E0Rdozbg6prLmsoytdt9SlVUh/zIJ9EZNS8Erj34RUwbtqlaajuUy93ued2p99MnYrcAxnc8x7qqOuI7NXp531tHwDiSpBfH41d86noN8K17tzvas60irsiP+hMWFUzfPs6UXSqgiJa4ucKF1DS2xR/kjC0ZugZma3A02MSjvFSn8G3q/eY7uQ57kidKDpK8p/bzJJzpOeVJHJKTOVLHYqId3vqe7EKfiO9JFDKp+5VAY0RczcjRGdd2LhhKCrmad2sf+nO/Hpf7ad4i4vvpaMtc6ySgS8TCUgjYkYCI2I4wpau7k4CI+O48bvfSqEXE99LRlLnoIiAi1oVNGtmRgIjYjjClq7uTgIj47jxu99Ko/x/HmHxRljJAeAAAAABJRU5ErkJggg=="},80759:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-server-debug-98c2ec8a56860d6718e4da5bf97bc709.jpeg"},46399:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-tasks-a9f11e37004c47a3ee27c6549b968aee.jpg"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>c});var s=i(96540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26c807fc.b53652d7.js b/assets/js/26c807fc.b53652d7.js new file mode 100644 index 0000000000..fe49786495 --- /dev/null +++ b/assets/js/26c807fc.b53652d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1788],{2621:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"started/concepts/metadata_attributes","title":"Metadata attributes","description":"Meta-data associated with a dataset/file is represented using","source":"@site/../docs/started/concepts/metadata_attributes.md","sourceDirName":"started/concepts","slug":"/started/concepts/metadata_attributes","permalink":"/documentation/started/concepts/metadata_attributes","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/metadata_attributes.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"metadata_attributes","title":"Metadata attributes"},"sidebar":"docs","previous":{"title":"Rucio Storage Element","permalink":"/documentation/started/concepts/rucio_storage_element"},"next":{"title":"Permission model","permalink":"/documentation/started/concepts/permission_model"}}');var n=a(74848),i=a(28453);const o={id:"metadata_attributes",title:"Metadata attributes"},r=void 0,c={},d=[];function u(t){const e={code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:"Meta-data associated with a dataset/file is represented using\nattribute/value pairs. Meta-data attributes are classified into four\ncategories:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"System-defined attributes"}),": size (bytes), checksums (adler32, md5),\ncreationtime, modificationtime, status, length (datasets/containers)"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Physics attributes"}),": GUID, number of events, project, datatype, run_number,\nstream_name, prod_step, version, campaign, lumiblocknr"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Workflow management attributes"}),": storing information like which task\n(task_id) or job (panda_id) produced the file"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Data management attributes"}),": necessary for the organisation of data on the\ngrid (see Replica Management section)"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"For datasets, it is possible that the value of a meta-data attribute is\na function of the meta-data of its constituents, e.g. the total size is\nthe sum of the sizes of the constituents. In this case it is not\npossible to assign a value to it."})]})}function l(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(u,{...t})}):u(t)}},28453:(t,e,a)=>{a.d(e,{R:()=>o,x:()=>r});var s=a(96540);const n={},i=s.createContext(n);function o(t){const e=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:o(t.components),s.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/26c807fc.e121bfc2.js b/assets/js/26c807fc.e121bfc2.js deleted file mode 100644 index 9b25389393..0000000000 --- a/assets/js/26c807fc.e121bfc2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1788],{2621:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"started/concepts/metadata_attributes","title":"Metadata attributes","description":"Meta-data associated with a dataset/file is represented using","source":"@site/../docs/started/concepts/metadata_attributes.md","sourceDirName":"started/concepts","slug":"/started/concepts/metadata_attributes","permalink":"/documentation/started/concepts/metadata_attributes","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/metadata_attributes.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"metadata_attributes","title":"Metadata attributes"},"sidebar":"docs","previous":{"title":"Rucio Storage Element","permalink":"/documentation/started/concepts/rucio_storage_element"},"next":{"title":"Permission model","permalink":"/documentation/started/concepts/permission_model"}}');var n=a(74848),i=a(28453);const o={id:"metadata_attributes",title:"Metadata attributes"},r=void 0,c={},d=[];function u(t){const e={code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:"Meta-data associated with a dataset/file is represented using\nattribute/value pairs. Meta-data attributes are classified into four\ncategories:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"System-defined attributes"}),": size (bytes), checksums (adler32, md5),\ncreationtime, modificationtime, status, length (datasets/containers)"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Physics attributes"}),": GUID, number of events, project, datatype, run_number,\nstream_name, prod_step, version, campaign, lumiblocknr"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Workflow management attributes"}),": storing information like which task\n(task_id) or job (panda_id) produced the file"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Data management attributes"}),": necessary for the organisation of data on the\ngrid (see Replica Management section)"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"For datasets, it is possible that the value of a meta-data attribute is\na function of the meta-data of its constituents, e.g. the total size is\nthe sum of the sizes of the constituents. In this case it is not\npossible to assign a value to it."})]})}function l(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(u,{...t})}):u(t)}},28453:(t,e,a)=>{a.d(e,{R:()=>o,x:()=>r});var s=a(96540);const n={},i=s.createContext(n);function o(t){const e=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:o(t.components),s.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/31b36657.e036b0f1.js b/assets/js/31b36657.e036b0f1.js deleted file mode 100644 index 0999939411..0000000000 --- a/assets/js/31b36657.e036b0f1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8610],{89349:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"operator/transfers/transfers-overview","title":"Transfers Overview","description":"Rucio has a set of daemons in charge of transfers between rucio storage elements","source":"@site/../docs/operator/transfers/transfers_overview.md","sourceDirName":"operator/transfers","slug":"/operator/transfers/transfers-overview","permalink":"/documentation/operator/transfers/transfers-overview","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/transfers/transfers_overview.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"transfers-overview","title":"Transfers Overview"},"sidebar":"docs","previous":{"title":"Configuration parameters","permalink":"/documentation/operator/configuration_parameters"},"next":{"title":"Transfers Preparer","permalink":"/documentation/operator/transfers/transfers-preparer"}}');var s=n(74848),o=n(28453);const i={id:"transfers-overview",title:"Transfers Overview"},a=void 0,l={},c=[{value:"Daemon overview",id:"daemon-overview",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Rucio has a set of daemons in charge of transfers between rucio storage elements\n(RSE). Historically, these daemons were grouped under the name of ",(0,s.jsx)(t.code,{children:"conveyor"}),",\nso a big part of the documentation and source code still uses this naming\nwhen referring to the transfer machinery."]}),"\n",(0,s.jsxs)(t.p,{children:["Rucio doesn't execute the actual physical data movement between storage\nelements. It relies on external tools for this scope. Currently, rucio supports\n",(0,s.jsx)(t.a,{href:"https://fts3-docs.web.cern.ch/fts3-docs/docs/overview.html",children:"fts3"})," and\n",(0,s.jsx)(t.a,{href:"https://www.globus.org/data-transfer",children:"globus"}),'. Rucio builds on top of these\n"TransferTools" and provides additional services like recovery from a transfer\nfailure by using another copy from another storage element, multi-hopping\nusing multiple transfertools (or multiple instances of the same transfertool\ntype) and others.']}),"\n",(0,s.jsx)(t.h2,{id:"daemon-overview",children:"Daemon overview"}),"\n",(0,s.jsx)(t.p,{children:"The following transfer-related daemons exist in rucio, presented in the order\nthey intervene in a transfer lifecycle:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"preparer"}),": a strongly recommended optional daemon which is required for\nmany advanced usages, like multiple transfertools together.\nIt is also required to be able to use throttler. If active, performs part\nof the source selection and path computation work instead of the submitter.\nFor all new rucio installation, it is recommended to run this daemon and\nactivate it by setting the ",(0,s.jsx)(t.code,{children:"conveyor/use_preparer = True"})," configuration\noption."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"throttler"}),": an optional daemon which can throttle request submissions\nto/from an RSE"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"submitter"}),", ",(0,s.jsx)(t.strong,{children:"stager"}),": perform the actual submission of transfers to the\nexternal transfertool. If used without preparer, also perform path computation\nand source replica selection. Stager is a specialized submitter for issuing\nstagein operations to tape archives."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"receiver"}),": optional daemons which listens for events published into a\nqueueing system (activemq) by the external transfertool and reacts to those\nevents to mark transfers as successful or failed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"poller"}),": regularly polls the external transfertool for the status of\npending transfers and marks them as successful/failed"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"finisher"}),": acts on successful or failed transfers. For example, by\nre-scheduling a new attempt."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The minimal list of daemons needed for transfer execution is:\n",(0,s.jsx)(t.code,{children:"submitter"}),", ",(0,s.jsx)(t.code,{children:"poller"})," and ",(0,s.jsx)(t.code,{children:"finisher"}),"."]}),"\n",(0,s.jsx)(t.h1,{id:"lifecycle-of-transfer-requests",children:"Lifecycle of transfer requests"}),"\n",(0,s.jsx)(t.p,{children:"There is no user-facing way to schedule a transfer. All transfer requests are\ncreated internally by rucio as result of rule evaluations. The lifetime of a\nrucio transfer is thus strongly bound to the rule which created it.\nHereafter is a simple example which gives the intuition of how rucio proceeds\nwith a replication/transfer of a file as part of a rule."}),"\n",(0,s.jsx)(t.p,{children:"In the rest of this example we'll assume the following 4 rucio storage\nelements:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 5 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2502 RSE1 \u2502 \u2502 RSE2 \u2502\n\u2502 \u2502 \u250c\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u25b2 \u2502\n \u2502100 \u25023\n \u25bc \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2518 \u2502 \u2502\n\u2502 RSE3 \u2502 \u2502 RSE4 \u2502\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 2 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(t.p,{children:"The numbers on the arrows represent the administrative cost which is set\nby the rucio administrator. Cost is unidirectional, but, in this example,\nwe assume that the cost was configured identical in both directions.\nFor example:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",children:"rucio-admin rse add-distance --distance 5 RSE1 RSE2\nrucio-admin rse add-distance --distance 5 RSE2 RSE1\n# Note: before rucio 1.30 (as a consequence: also in the current LTS release 1.29),\n# the --ranking option was used for the same purpose. The --distance option\n# could still be set and was mentioned in documentation alongside --ranking\n# but was completely ignored by rucio.\n# On 1.29, you'll have to use the following command:\nrucio-admin rse add-distance --ranking 5 RSE1 RSE2\nrucio-admin rse add-distance --ranking 5 RSE2 RSE1\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Assume a certain dataset ",(0,s.jsx)(t.code,{children:"someScope:dsName"}),", which has two files\n",(0,s.jsx)(t.code,{children:"someScope:file1"})," and ",(0,s.jsx)(t.code,{children:"someScope:file2"}),", and both files are located on ",(0,s.jsx)(t.code,{children:"RSE1"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The destination of the transfer will be decided on the rule evaluation phase,\nFor example the user adds a rule to ensure that rucio maintains two copies\nfor each of the files on any of the RSEs."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",children:"rucio add-rule someScope:dsName 2 '*'\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The rule evaluation mechanism detects that a copy is already available\non RSE1, but one additional copy is needed to respect the rule requirements of\n2 copies. It will thus create a transfer request to one of the other 3 rses.\nAs of time of writing, the selection of the destination is random as\nlong as it respects the RSE expression. Here, ",(0,s.jsx)(t.code,{children:"*"})," matches any RSE.\nFor the seek of the example, lets assume that RSE4 was selected."]}),"\n",(0,s.jsxs)(t.p,{children:["The rule evaluation mechanism will then create two transfer requests, which\nwill be picked by the transfer machinery. Depending on the configuration value\n",(0,s.jsx)(t.code,{children:"conveyor/use_preparer"}),", the transfer will be either handled by the ",(0,s.jsx)(t.code,{children:"preparer"}),"\nor by the ",(0,s.jsx)(t.code,{children:"submitter"})," directly."]}),"\n",(0,s.jsxs)(t.p,{children:["At this stage, the transfer machinery finds all the possible sources. It\nfilters out the ones which don't match different rule criterias (for example:\nsource RSE expression) and administrative constraints (for example:\nskip blocklisted RSEs). It then computes the paths. In the previous example,\nthe path ",(0,s.jsx)(t.code,{children:"RSE1 -> RSE2 -> RSE3 -> RSE4"})," will be picked due to cost constraints.\nNote that it's possible to make rucio prefer shorter parts by setting the RSE\nattribute ",(0,s.jsx)(t.code,{children:"hop_penalty"}),", or the global configuration value with the same name.\nFor more details about how a source is selected, refer to the ",(0,s.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-preparer",children:"Preparer"}),"\ndocumentation."]}),"\n",(0,s.jsx)(t.p,{children:"The path will be then submitted to the transfertool either in its integrity,\nif transfertool supports multi-hopping, or in multiple iterations."}),"\n",(0,s.jsxs)(t.p,{children:["The final steps are for the ",(0,s.jsx)(t.code,{children:"reciver"})," or ",(0,s.jsx)(t.code,{children:"poller"})," to monitor the transfer's\ncompletion in transfertool and ",(0,s.jsx)(t.code,{children:"finisher"})," to mark the transfers as completed.\nWe only described here a simple case, when the transfer is successful on the\nfirst try. In case of errors, multiple transitions are possible between\ndifferent daemons. Check the following request state transition diagram\nfor a more detailed view:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Request State Transition Chart",src:n(77756).A+"",width:"3131",height:"7564"})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},77756:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/request_state_transition_chart-ac293c9924265950b36ebc9d9ddf8895.svg"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(96540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/31b36657.f84575a4.js b/assets/js/31b36657.f84575a4.js new file mode 100644 index 0000000000..e60fb4ec15 --- /dev/null +++ b/assets/js/31b36657.f84575a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8610],{89349:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"operator/transfers/transfers-overview","title":"Transfers Overview","description":"Rucio has a set of daemons in charge of transfers between rucio storage elements","source":"@site/../docs/operator/transfers/transfers_overview.md","sourceDirName":"operator/transfers","slug":"/operator/transfers/transfers-overview","permalink":"/documentation/operator/transfers/transfers-overview","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/transfers/transfers_overview.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"transfers-overview","title":"Transfers Overview"},"sidebar":"docs","previous":{"title":"Configuration parameters","permalink":"/documentation/operator/configuration_parameters"},"next":{"title":"Transfers Preparer","permalink":"/documentation/operator/transfers/transfers-preparer"}}');var s=n(74848),o=n(28453);const i={id:"transfers-overview",title:"Transfers Overview"},a=void 0,l={},c=[{value:"Daemon overview",id:"daemon-overview",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Rucio has a set of daemons in charge of transfers between rucio storage elements\n(RSE). Historically, these daemons were grouped under the name of ",(0,s.jsx)(t.code,{children:"conveyor"}),",\nso a big part of the documentation and source code still uses this naming\nwhen referring to the transfer machinery."]}),"\n",(0,s.jsxs)(t.p,{children:["Rucio doesn't execute the actual physical data movement between storage\nelements. It relies on external tools for this scope. Currently, rucio supports\n",(0,s.jsx)(t.a,{href:"https://fts3-docs.web.cern.ch/fts3-docs/docs/overview.html",children:"fts3"})," and\n",(0,s.jsx)(t.a,{href:"https://www.globus.org/data-transfer",children:"globus"}),'. Rucio builds on top of these\n"TransferTools" and provides additional services like recovery from a transfer\nfailure by using another copy from another storage element, multi-hopping\nusing multiple transfertools (or multiple instances of the same transfertool\ntype) and others.']}),"\n",(0,s.jsx)(t.h2,{id:"daemon-overview",children:"Daemon overview"}),"\n",(0,s.jsx)(t.p,{children:"The following transfer-related daemons exist in rucio, presented in the order\nthey intervene in a transfer lifecycle:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"preparer"}),": a strongly recommended optional daemon which is required for\nmany advanced usages, like multiple transfertools together.\nIt is also required to be able to use throttler. If active, performs part\nof the source selection and path computation work instead of the submitter.\nFor all new rucio installation, it is recommended to run this daemon and\nactivate it by setting the ",(0,s.jsx)(t.code,{children:"conveyor/use_preparer = True"})," configuration\noption."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"throttler"}),": an optional daemon which can throttle request submissions\nto/from an RSE"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"submitter"}),", ",(0,s.jsx)(t.strong,{children:"stager"}),": perform the actual submission of transfers to the\nexternal transfertool. If used without preparer, also perform path computation\nand source replica selection. Stager is a specialized submitter for issuing\nstagein operations to tape archives."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"receiver"}),": optional daemons which listens for events published into a\nqueueing system (activemq) by the external transfertool and reacts to those\nevents to mark transfers as successful or failed."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"poller"}),": regularly polls the external transfertool for the status of\npending transfers and marks them as successful/failed"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"finisher"}),": acts on successful or failed transfers. For example, by\nre-scheduling a new attempt."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The minimal list of daemons needed for transfer execution is:\n",(0,s.jsx)(t.code,{children:"submitter"}),", ",(0,s.jsx)(t.code,{children:"poller"})," and ",(0,s.jsx)(t.code,{children:"finisher"}),"."]}),"\n",(0,s.jsx)(t.h1,{id:"lifecycle-of-transfer-requests",children:"Lifecycle of transfer requests"}),"\n",(0,s.jsx)(t.p,{children:"There is no user-facing way to schedule a transfer. All transfer requests are\ncreated internally by rucio as result of rule evaluations. The lifetime of a\nrucio transfer is thus strongly bound to the rule which created it.\nHereafter is a simple example which gives the intuition of how rucio proceeds\nwith a replication/transfer of a file as part of a rule."}),"\n",(0,s.jsx)(t.p,{children:"In the rest of this example we'll assume the following 4 rucio storage\nelements:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 5 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2502 RSE1 \u2502 \u2502 RSE2 \u2502\n\u2502 \u2502 \u250c\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u25b2 \u2502\n \u2502100 \u25023\n \u25bc \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2518 \u2502 \u2502\n\u2502 RSE3 \u2502 \u2502 RSE4 \u2502\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 2 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsx)(t.p,{children:"The numbers on the arrows represent the administrative cost which is set\nby the rucio administrator. Cost is unidirectional, but, in this example,\nwe assume that the cost was configured identical in both directions.\nFor example:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",children:"rucio-admin rse add-distance --distance 5 RSE1 RSE2\nrucio-admin rse add-distance --distance 5 RSE2 RSE1\n# Note: before rucio 1.30 (as a consequence: also in the current LTS release 1.29),\n# the --ranking option was used for the same purpose. The --distance option\n# could still be set and was mentioned in documentation alongside --ranking\n# but was completely ignored by rucio.\n# On 1.29, you'll have to use the following command:\nrucio-admin rse add-distance --ranking 5 RSE1 RSE2\nrucio-admin rse add-distance --ranking 5 RSE2 RSE1\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Assume a certain dataset ",(0,s.jsx)(t.code,{children:"someScope:dsName"}),", which has two files\n",(0,s.jsx)(t.code,{children:"someScope:file1"})," and ",(0,s.jsx)(t.code,{children:"someScope:file2"}),", and both files are located on ",(0,s.jsx)(t.code,{children:"RSE1"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The destination of the transfer will be decided on the rule evaluation phase,\nFor example the user adds a rule to ensure that rucio maintains two copies\nfor each of the files on any of the RSEs."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-shell",children:"rucio add-rule someScope:dsName 2 '*'\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The rule evaluation mechanism detects that a copy is already available\non RSE1, but one additional copy is needed to respect the rule requirements of\n2 copies. It will thus create a transfer request to one of the other 3 rses.\nAs of time of writing, the selection of the destination is random as\nlong as it respects the RSE expression. Here, ",(0,s.jsx)(t.code,{children:"*"})," matches any RSE.\nFor the seek of the example, lets assume that RSE4 was selected."]}),"\n",(0,s.jsxs)(t.p,{children:["The rule evaluation mechanism will then create two transfer requests, which\nwill be picked by the transfer machinery. Depending on the configuration value\n",(0,s.jsx)(t.code,{children:"conveyor/use_preparer"}),", the transfer will be either handled by the ",(0,s.jsx)(t.code,{children:"preparer"}),"\nor by the ",(0,s.jsx)(t.code,{children:"submitter"})," directly."]}),"\n",(0,s.jsxs)(t.p,{children:["At this stage, the transfer machinery finds all the possible sources. It\nfilters out the ones which don't match different rule criterias (for example:\nsource RSE expression) and administrative constraints (for example:\nskip blocklisted RSEs). It then computes the paths. In the previous example,\nthe path ",(0,s.jsx)(t.code,{children:"RSE1 -> RSE2 -> RSE3 -> RSE4"})," will be picked due to cost constraints.\nNote that it's possible to make rucio prefer shorter parts by setting the RSE\nattribute ",(0,s.jsx)(t.code,{children:"hop_penalty"}),", or the global configuration value with the same name.\nFor more details about how a source is selected, refer to the ",(0,s.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-preparer",children:"Preparer"}),"\ndocumentation."]}),"\n",(0,s.jsx)(t.p,{children:"The path will be then submitted to the transfertool either in its integrity,\nif transfertool supports multi-hopping, or in multiple iterations."}),"\n",(0,s.jsxs)(t.p,{children:["The final steps are for the ",(0,s.jsx)(t.code,{children:"reciver"})," or ",(0,s.jsx)(t.code,{children:"poller"})," to monitor the transfer's\ncompletion in transfertool and ",(0,s.jsx)(t.code,{children:"finisher"})," to mark the transfers as completed.\nWe only described here a simple case, when the transfer is successful on the\nfirst try. In case of errors, multiple transitions are possible between\ndifferent daemons. Check the following request state transition diagram\nfor a more detailed view:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Request State Transition Chart",src:n(77756).A+"",width:"3131",height:"7564"})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},77756:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/request_state_transition_chart-ac293c9924265950b36ebc9d9ddf8895.svg"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(96540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3c621cea.b8045bd4.js b/assets/js/3c621cea.b8045bd4.js new file mode 100644 index 0000000000..2e2f70d9bc --- /dev/null +++ b/assets/js/3c621cea.b8045bd4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[283],{32070:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>t,frontMatter:()=>s,metadata:()=>l,toc:()=>d});const l=JSON.parse('{"id":"operator/installing_daemons","title":"Installing Rucio Daemons","description":"Prerequisites","source":"@site/../docs/operator/installing_daemons.md","sourceDirName":"operator","slug":"/operator/installing_daemons","permalink":"/documentation/operator/installing_daemons","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/installing_daemons.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"installing_daemons","title":"Installing Rucio Daemons"},"sidebar":"docs","previous":{"title":"Installing Rucio Server","permalink":"/documentation/operator/installing_server"},"next":{"title":"Configuration","permalink":"/documentation/operator/configuration"}}');var r=i(74848),_=i(28453);const s={id:"installing_daemons",title:"Installing Rucio Daemons"},c=void 0,a={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install via pip",id:"install-via-pip",level:2},{value:"Install via Docker",id:"install-via-docker",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"RUCIO_DAEMON",id:"rucio_daemon",level:3},{value:"RUCIO_DAEMON_ARGS",id:"rucio_daemon_args",level:3},{value:"RUCIO_ENABLE_LOGS",id:"rucio_enable_logs",level:3},{value:"RUCIO_CFG configuration parameters",id:"rucio_cfg-configuration-parameters",level:3}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,_.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"The Rucio daemons run on Python 2.7, 3.6 and 3.7 on any Unix-like\nplatform."}),"\n",(0,r.jsx)(n.h2,{id:"install-via-pip",children:"Install via pip"}),"\n",(0,r.jsx)(n.p,{children:"Heads up: We recommend to use the docker-based install (see next\nsection) as it will configure many things for you automatically. Only\nuse the pip-based install if you have a good reason and know how to\nconfigure your web service manually:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pip install rucio\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This will pull the latest release from\n",(0,r.jsx)(n.a,{href:"https://pypi.python.org/pypi/rucio/",children:(0,r.jsx)(n.strong,{children:"PyPi"})}),". The Rucio server also needs\nseveral Python dependencies. These are all listed in the file\n",(0,r.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/requirements/requirements.server.txt",children:(0,r.jsx)(n.code,{children:"requirements.server.txt"})}),"\nand will be pulled in as necessary."]}),"\n",(0,r.jsx)(n.h2,{id:"install-via-docker",children:"Install via Docker"}),"\n",(0,r.jsx)(n.p,{children:"This image provides the Rucio daemons. Each daemon has to be run in a\nseparate container. It supports MySQL, PostgreSQL, Oracle, and SQLite as\ndatabase backends."}),"\n",(0,r.jsxs)(n.p,{children:["This image expects that there is an already initialised Rucio DB. To\nstart a simple ",(0,r.jsx)(n.code,{children:"judge-cleaner"})," daemon using a database on\n",(0,r.jsx)(n.code,{children:"mysql.db"})," without any additional parameters just run this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --name=rucio-judge-cleaner \\\n -e RUCIO_CFG_DATABASE_DEFAULT="mysql+pymysql://rucio:rucio@mysql.db/rucio" \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"RUCIO_DAEMON"})," environment variable gives the name of\nthe rucio daemon."]}),"\n",(0,r.jsxs)(n.p,{children:["Rucio can be configured fully using environment variables like\n",(0,r.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". If you want to instead use a\ncomplete rucio.cfg it can also be mounted. This will then ignore the\n",(0,r.jsx)(n.code,{children:"RUCIO_CFG"})," environment variables:"]}),"\n",(0,r.jsx)(n.p,{children:"The rucio.cfg is used to configure the database backend and the daemons:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n"})}),"\n",(0,r.jsxs)(n.p,{children:["By default the daemon logs are written to stdout and stderr if you want\nto write to a file you can use ",(0,r.jsx)(n.code,{children:"RUCIO_ENABLE_LOGS"})," like\nthis:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -v /tmp/logs:/var/log/rucio -e RUCIO_DAEMON=judge-cleaner \\\n -e RUCIO_ENABLE_LOGS=True \\\n rucio/rucio-daemons\n"})}),"\n",(0,r.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,r.jsxs)(n.p,{children:["As shown in the examples above the rucio-daemon image can be configured\nusing environment variables that are passed with ",(0,r.jsx)(n.code,{children:"docker run"}),".\nBelow is a list of all available variables and their behaviour:"]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_daemon",children:"RUCIO_DAEMON"}),"\n",(0,r.jsxs)(n.p,{children:["This variable is mandatory and it specifies the name of the daemon,\ne.g., ",(0,r.jsx)(n.code,{children:"hermes"}),", ",(0,r.jsx)(n.code,{children:"kronos"}),",\n",(0,r.jsx)(n.code,{children:"judge-evaluator"}),", etc."]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_daemon_args",children:"RUCIO_DAEMON_ARGS"}),"\n",(0,r.jsxs)(n.p,{children:["Any additional command line parameter can be specified here, e.g.,\n",(0,r.jsx)(n.code,{children:"\\--run-once"})," This field is optional."]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_enable_logs",children:"RUCIO_ENABLE_LOGS"}),"\n",(0,r.jsxs)(n.p,{children:["By default, the log output of the daemon is written to stdout and\nstderr. If you set this variable to ",(0,r.jsx)(n.code,{children:"True"})," the output will\nbe written to ",(0,r.jsx)(n.code,{children:"access_log"})," and ",(0,r.jsx)(n.code,{children:"error_log"})," under\n",(0,r.jsx)(n.code,{children:"/var/log/rucio"})]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_cfg-configuration-parameters",children:"RUCIO_CFG configuration parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Environment variables can be used to set values for the auto-generated\nrucio.cfg. The names are derived from the actual names in the\nconfiguration file prefixed by ",(0,r.jsx)(n.code,{children:"RUCIO_CFG"}),", e.g., the\n",(0,r.jsx)(n.code,{children:"default"})," value in the ",(0,r.jsx)(n.code,{children:"database"})," section\nbecomes ",(0,r.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". All available\nenvironment variables are:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_ACCOUNTS_SPECIAL_ACCOUNTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGDIR"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGLEVEL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_COMMON_MAILTEMPLATEDIR"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RESET_ON_RETURN"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_ECHO"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RECYCLE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_SIZE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_TIMEOUT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_MAX_OVERFLOW"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERACCOUNT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERPASSWORD"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_SERVER"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_USER_SCOPE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_POLICY"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_LFN2PFN_ALGORITHM_DEFAULT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT_RUCIO"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SITES"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SLEEP_TIME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_DATASET_LIFETIME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SET_METADATA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_RESULTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_CACHE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SCHEME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_TRANSFERTOOL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSHOSTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACERT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USERCERT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACHE_TIME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USE_DETERMINISTIC_ID"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_POLL_TIMEOUT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SUBMIT_TIMEOUT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_BRING_ONLINE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_QUEUE_MODE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USING_MEMCACHE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSMONHOSTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_DESTINATION"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_VONAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USERNAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PASSWORD"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_NONSSL_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USE_SSL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_DESTINATION"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_VONAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_FROM"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_TEST"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_QUEUE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_PREFETCH_SIZE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_CHUNKSIZE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SUBSCRIPTION_ID"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_USE_SSL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_RECONNECT_ATTEMPTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_EXCLUDED_USRDNS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_USERNAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PASSWORD"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_DATASET_WAIT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_DESTINATION"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_VONAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_ACCOUNT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_GCS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_SIGNATURE_LIFETIME"}),"\n"]})]})}function t(e={}){const{wrapper:n}={...(0,_.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var l=i(96540);const r={},_=l.createContext(r);function s(e){const n=l.useContext(_);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(_.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3c621cea.f1eec229.js b/assets/js/3c621cea.f1eec229.js deleted file mode 100644 index 391ae5bd4e..0000000000 --- a/assets/js/3c621cea.f1eec229.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[283],{32070:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>t,frontMatter:()=>s,metadata:()=>l,toc:()=>d});const l=JSON.parse('{"id":"operator/installing_daemons","title":"Installing Rucio Daemons","description":"Prerequisites","source":"@site/../docs/operator/installing_daemons.md","sourceDirName":"operator","slug":"/operator/installing_daemons","permalink":"/documentation/operator/installing_daemons","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/installing_daemons.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"installing_daemons","title":"Installing Rucio Daemons"},"sidebar":"docs","previous":{"title":"Installing Rucio Server","permalink":"/documentation/operator/installing_server"},"next":{"title":"Configuration","permalink":"/documentation/operator/configuration"}}');var r=i(74848),_=i(28453);const s={id:"installing_daemons",title:"Installing Rucio Daemons"},c=void 0,a={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install via pip",id:"install-via-pip",level:2},{value:"Install via Docker",id:"install-via-docker",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"RUCIO_DAEMON",id:"rucio_daemon",level:3},{value:"RUCIO_DAEMON_ARGS",id:"rucio_daemon_args",level:3},{value:"RUCIO_ENABLE_LOGS",id:"rucio_enable_logs",level:3},{value:"RUCIO_CFG configuration parameters",id:"rucio_cfg-configuration-parameters",level:3}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,_.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"The Rucio daemons run on Python 2.7, 3.6 and 3.7 on any Unix-like\nplatform."}),"\n",(0,r.jsx)(n.h2,{id:"install-via-pip",children:"Install via pip"}),"\n",(0,r.jsx)(n.p,{children:"Heads up: We recommend to use the docker-based install (see next\nsection) as it will configure many things for you automatically. Only\nuse the pip-based install if you have a good reason and know how to\nconfigure your web service manually:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pip install rucio\n"})}),"\n",(0,r.jsxs)(n.p,{children:["This will pull the latest release from\n",(0,r.jsx)(n.a,{href:"https://pypi.python.org/pypi/rucio/",children:(0,r.jsx)(n.strong,{children:"PyPi"})}),". The Rucio server also needs\nseveral Python dependencies. These are all listed in the file\n",(0,r.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/requirements/requirements.server.txt",children:(0,r.jsx)(n.code,{children:"requirements.server.txt"})}),"\nand will be pulled in as necessary."]}),"\n",(0,r.jsx)(n.h2,{id:"install-via-docker",children:"Install via Docker"}),"\n",(0,r.jsx)(n.p,{children:"This image provides the Rucio daemons. Each daemon has to be run in a\nseparate container. It supports MySQL, PostgreSQL, Oracle, and SQLite as\ndatabase backends."}),"\n",(0,r.jsxs)(n.p,{children:["This image expects that there is an already initialised Rucio DB. To\nstart a simple ",(0,r.jsx)(n.code,{children:"judge-cleaner"})," daemon using a database on\n",(0,r.jsx)(n.code,{children:"mysql.db"})," without any additional parameters just run this:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --name=rucio-judge-cleaner \\\n -e RUCIO_CFG_DATABASE_DEFAULT="mysql+pymysql://rucio:rucio@mysql.db/rucio" \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"RUCIO_DAEMON"})," environment variable gives the name of\nthe rucio daemon."]}),"\n",(0,r.jsxs)(n.p,{children:["Rucio can be configured fully using environment variables like\n",(0,r.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". If you want to instead use a\ncomplete rucio.cfg it can also be mounted. This will then ignore the\n",(0,r.jsx)(n.code,{children:"RUCIO_CFG"})," environment variables:"]}),"\n",(0,r.jsx)(n.p,{children:"The rucio.cfg is used to configure the database backend and the daemons:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n"})}),"\n",(0,r.jsxs)(n.p,{children:["By default the daemon logs are written to stdout and stderr if you want\nto write to a file you can use ",(0,r.jsx)(n.code,{children:"RUCIO_ENABLE_LOGS"})," like\nthis:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -v /tmp/logs:/var/log/rucio -e RUCIO_DAEMON=judge-cleaner \\\n -e RUCIO_ENABLE_LOGS=True \\\n rucio/rucio-daemons\n"})}),"\n",(0,r.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,r.jsxs)(n.p,{children:["As shown in the examples above the rucio-daemon image can be configured\nusing environment variables that are passed with ",(0,r.jsx)(n.code,{children:"docker run"}),".\nBelow is a list of all available variables and their behaviour:"]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_daemon",children:"RUCIO_DAEMON"}),"\n",(0,r.jsxs)(n.p,{children:["This variable is mandatory and it specifies the name of the daemon,\ne.g., ",(0,r.jsx)(n.code,{children:"hermes"}),", ",(0,r.jsx)(n.code,{children:"kronos"}),",\n",(0,r.jsx)(n.code,{children:"judge-evaluator"}),", etc."]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_daemon_args",children:"RUCIO_DAEMON_ARGS"}),"\n",(0,r.jsxs)(n.p,{children:["Any additional command line parameter can be specified here, e.g.,\n",(0,r.jsx)(n.code,{children:"\\--run-once"})," This field is optional."]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_enable_logs",children:"RUCIO_ENABLE_LOGS"}),"\n",(0,r.jsxs)(n.p,{children:["By default, the log output of the daemon is written to stdout and\nstderr. If you set this variable to ",(0,r.jsx)(n.code,{children:"True"})," the output will\nbe written to ",(0,r.jsx)(n.code,{children:"access_log"})," and ",(0,r.jsx)(n.code,{children:"error_log"})," under\n",(0,r.jsx)(n.code,{children:"/var/log/rucio"})]}),"\n",(0,r.jsx)(n.h3,{id:"rucio_cfg-configuration-parameters",children:"RUCIO_CFG configuration parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Environment variables can be used to set values for the auto-generated\nrucio.cfg. The names are derived from the actual names in the\nconfiguration file prefixed by ",(0,r.jsx)(n.code,{children:"RUCIO_CFG"}),", e.g., the\n",(0,r.jsx)(n.code,{children:"default"})," value in the ",(0,r.jsx)(n.code,{children:"database"})," section\nbecomes ",(0,r.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". All available\nenvironment variables are:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_ACCOUNTS_SPECIAL_ACCOUNTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGDIR"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGLEVEL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_COMMON_MAILTEMPLATEDIR"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RESET_ON_RETURN"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_ECHO"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RECYCLE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_SIZE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_TIMEOUT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_MAX_OVERFLOW"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERACCOUNT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERPASSWORD"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_SERVER"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_USER_SCOPE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_POLICY"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_LFN2PFN_ALGORITHM_DEFAULT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT_RUCIO"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SITES"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SLEEP_TIME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_DATASET_LIFETIME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SET_METADATA"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_RESULTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_CACHE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SCHEME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_TRANSFERTOOL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSHOSTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACERT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USERCERT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACHE_TIME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USE_DETERMINISTIC_ID"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_POLL_TIMEOUT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SUBMIT_TIMEOUT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_BRING_ONLINE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_QUEUE_MODE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USING_MEMCACHE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSMONHOSTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_DESTINATION"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_VONAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USERNAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PASSWORD"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_NONSSL_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USE_SSL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_DESTINATION"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_VONAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_FROM"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_TEST"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_QUEUE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_PREFETCH_SIZE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_CHUNKSIZE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SUBSCRIPTION_ID"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_USE_SSL"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_RECONNECT_ATTEMPTS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_EXCLUDED_USRDNS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_USERNAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PASSWORD"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_TRACER_DATASET_WAIT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_PORT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_KEY_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_CERT_FILE"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_DESTINATION"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_BROKERS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_VONAME"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_ACCOUNT"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_GCS"}),"\n",(0,r.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_SIGNATURE_LIFETIME"}),"\n"]})]})}function t(e={}){const{wrapper:n}={...(0,_.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var l=i(96540);const r={},_=l.createContext(r);function s(e){const n=l.useContext(_);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(_.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e04ff1b.67d4ed39.js b/assets/js/3e04ff1b.67d4ed39.js deleted file mode 100644 index ebcaf71950..0000000000 --- a/assets/js/3e04ff1b.67d4ed39.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[586],{10470:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"started/concepts/replica_management","title":"Replica management with replication rules","description":"Replica management is based on replication rules defined on data identifiers","source":"@site/../docs/started/concepts/replica_management.md","sourceDirName":"started/concepts","slug":"/started/concepts/replica_management","permalink":"/documentation/started/concepts/replica_management","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_management.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"title":"Replica management with replication rules"},"sidebar":"docs","previous":{"title":"Permission model","permalink":"/documentation/started/concepts/permission_model"},"next":{"title":"Replication rule examples","permalink":"/documentation/started/concepts/replication_rules_examples"}}');var s=n(74848),r=n(28453);const l={title:"Replica management with replication rules"},o=void 0,a={},d=[{value:"Rule grouping and replica storage",id:"rule-grouping-and-replica-storage",level:2},{value:"Footnotes",id:"footnotes",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",section:"section",strong:"strong",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Replica management is based on replication rules defined on data identifiers\n(files, datasets, containers). A replication rule is owned by an account and\ndefines the minimum number of replicas to be available on a list of RSEs,\ndenoted by an ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expression"}),". Accounts are allowed to set\nmultiple rules",(0,s.jsx)(t.sup,{children:(0,s.jsx)(t.a,{href:"#user-content-fn-1",id:"user-content-fnref-1","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})}),". Rules may optionally have a limited lifetime and can be\nadded, removed or modified at any time."]}),"\n",(0,s.jsx)(t.p,{children:"An example listing of replication rules is given below:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"prod: 1x replica @ CERN, no lifetime"}),"\n",(0,s.jsx)(t.li,{children:"barisits: 1x replica @ US-T2, until 2019-01-01"}),"\n",(0,s.jsx)(t.li,{children:"vgaronne: 2x replica @ T1, no lifetime"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"A rule engine validates the rules and creates transfer primitives to fulfil all\nrules, e.g. transfer a file from RSE A to RSE B. The rule engine is triggered\nwhen a new rule is defined on an existing data identifier, or when a file is\nadded to a dataset with existing rules. The rule engine will only create the\nminimum set of necessary transfer primitives to satisfy all rules."}),"\n",(0,s.jsx)(t.p,{children:"Notifications can be provided for rules and their underlying transfer\nrequests. All transfer requests are transient."}),"\n",(0,s.jsx)(t.p,{children:"The deletion service supports two different modes: greedy and non-greedy. Greedy\nmeans that the service tries to immediately delete all replicas which are not\nprotected by a replication rule. Non-greedy deletion is triggered when storage\npolicy dictates that space must be freed. The deletion service will look for\nreplicas on that RSE which can be deleted without violating any replication\nrule. The deletion service will use a Least Recently Used (LRU) algorithm to\nselect replicas for deletion. The deletion service will also immediately delete\nall replicas of any file which is declared obsolete."}),"\n",(0,s.jsxs)(t.p,{children:["Some examples of replication rules are listed\n",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/replication_rules_examples",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"rule-grouping-and-replica-storage",children:"Rule grouping and replica storage"}),"\n",(0,s.jsx)(t.p,{children:"The following two parameters determine the way the files to be replicated\nare assigned to suitable RSEs:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The ",(0,s.jsx)(t.strong,{children:"rule grouping"}),": ",(0,s.jsx)(t.code,{children:"ALL"}),", ",(0,s.jsx)(t.code,{children:"DATASET"}),", ",(0,s.jsx)(t.code,{children:"NONE"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["The ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/file_dataset_container",children:"DID type"}),": ",(0,s.jsx)(t.code,{children:"FILE"}),", ",(0,s.jsx)(t.code,{children:"DATASET"}),", ",(0,s.jsx)(t.code,{children:"CONTAINER"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The table below describes the resulting replication logic\ndepending on the combination of rule grouping (header row) and DID type (left column)."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"ALL"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"DATASET"})}),(0,s.jsx)(t.th,{children:(0,s.jsx)(t.strong,{children:"NONE"})})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"FILE"})}),(0,s.jsx)(t.td,{children:"All files must be on the same RSE"}),(0,s.jsx)(t.td,{children:"N/A"}),(0,s.jsx)(t.td,{children:"No restrictions"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"DATASET"})}),(0,s.jsx)(t.td,{children:"All files must be on the same RSE"}),(0,s.jsx)(t.td,{children:"N/A"}),(0,s.jsx)(t.td,{children:"No restrictions"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"CONTAINER"})}),(0,s.jsx)(t.td,{children:"All files must be on the same RSE"}),(0,s.jsx)(t.td,{children:"All files in a dataset must be on the same RSE, but different datasets can be on different RSEs"}),(0,s.jsx)(t.td,{children:"No restrictions"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"footnotes",children:"Footnotes"}),"\n","\n",(0,s.jsxs)(t.section,{"data-footnotes":!0,className:"footnotes",children:[(0,s.jsx)(t.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{id:"user-content-fn-1",children:["\n",(0,s.jsxs)(t.p,{children:["The system may reject rules if these violate other policies, e.g., only\nspecific accounts are allowed to request replication rules for tape systems. ",(0,s.jsx)(t.a,{href:"#user-content-fnref-1","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var i=n(96540);const s={},r=i.createContext(s);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e04ff1b.e46ec295.js b/assets/js/3e04ff1b.e46ec295.js new file mode 100644 index 0000000000..2469888ed7 --- /dev/null +++ b/assets/js/3e04ff1b.e46ec295.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[586],{10470:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"started/concepts/replica_management","title":"Replica management with replication rules","description":"Replica management is based on replication rules defined on data identifiers","source":"@site/../docs/started/concepts/replica_management.md","sourceDirName":"started/concepts","slug":"/started/concepts/replica_management","permalink":"/documentation/started/concepts/replica_management","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_management.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"title":"Replica management with replication rules"},"sidebar":"docs","previous":{"title":"Permission model","permalink":"/documentation/started/concepts/permission_model"},"next":{"title":"Replication rule examples","permalink":"/documentation/started/concepts/replication_rules_examples"}}');var s=t(74848),r=t(28453);const l={title:"Replica management with replication rules"},o=void 0,a={},d=[{value:"Rule grouping and replica storage",id:"rule-grouping-and-replica-storage",level:2},{value:"Footnotes",id:"footnotes",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",section:"section",strong:"strong",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Replica management is based on replication rules defined on data identifiers\n(files, datasets, containers). A replication rule is owned by an account and\ndefines the minimum number of replicas to be available on a list of RSEs,\ndenoted by an ",(0,s.jsx)(n.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expression"}),". Accounts are allowed to set\nmultiple rules",(0,s.jsx)(n.sup,{children:(0,s.jsx)(n.a,{href:"#user-content-fn-1",id:"user-content-fnref-1","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})}),". Rules may optionally have a limited lifetime and can be\nadded, removed or modified at any time."]}),"\n",(0,s.jsx)(n.p,{children:"An example listing of replication rules is given below:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"prod: 1x replica @ CERN, no lifetime"}),"\n",(0,s.jsx)(n.li,{children:"barisits: 1x replica @ US-T2, until 2019-01-01"}),"\n",(0,s.jsx)(n.li,{children:"vgaronne: 2x replica @ T1, no lifetime"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"A rule engine validates the rules and creates transfer primitives to fulfil all\nrules, e.g. transfer a file from RSE A to RSE B. The rule engine is triggered\nwhen a new rule is defined on an existing data identifier, or when a file is\nadded to a dataset with existing rules. The rule engine will only create the\nminimum set of necessary transfer primitives to satisfy all rules."}),"\n",(0,s.jsx)(n.p,{children:"Notifications can be provided for rules and their underlying transfer\nrequests. All transfer requests are transient."}),"\n",(0,s.jsx)(n.p,{children:"The deletion service supports two different modes: greedy and non-greedy. Greedy\nmeans that the service tries to immediately delete all replicas which are not\nprotected by a replication rule. Non-greedy deletion is triggered when storage\npolicy dictates that space must be freed. The deletion service will look for\nreplicas on that RSE which can be deleted without violating any replication\nrule. The deletion service will use a Least Recently Used (LRU) algorithm to\nselect replicas for deletion. The deletion service will also immediately delete\nall replicas of any file which is declared obsolete."}),"\n",(0,s.jsxs)(n.p,{children:["Some examples of replication rules are listed\n",(0,s.jsx)(n.a,{href:"/documentation/started/concepts/replication_rules_examples",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"rule-grouping-and-replica-storage",children:"Rule grouping and replica storage"}),"\n",(0,s.jsx)(n.p,{children:"The following two parameters determine the way the files to be replicated\nare assigned to suitable RSEs:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.strong,{children:"rule grouping"}),": ",(0,s.jsx)(n.code,{children:"ALL"}),", ",(0,s.jsx)(n.code,{children:"DATASET"}),", ",(0,s.jsx)(n.code,{children:"NONE"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.a,{href:"/documentation/started/concepts/file_dataset_container",children:"DID type"}),": ",(0,s.jsx)(n.code,{children:"FILE"}),", ",(0,s.jsx)(n.code,{children:"DATASET"}),", ",(0,s.jsx)(n.code,{children:"CONTAINER"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The table below describes the resulting replication logic\ndepending on the combination of rule grouping (header row) and DID type (left column)."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"ALL"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"DATASET"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"NONE"})})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"FILE"})}),(0,s.jsx)(n.td,{children:"All files must be on the same RSE"}),(0,s.jsx)(n.td,{children:"N/A"}),(0,s.jsx)(n.td,{children:"No restrictions"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"DATASET"})}),(0,s.jsx)(n.td,{children:"All files must be on the same RSE"}),(0,s.jsx)(n.td,{children:"N/A"}),(0,s.jsx)(n.td,{children:"No restrictions"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"CONTAINER"})}),(0,s.jsx)(n.td,{children:"All files must be on the same RSE"}),(0,s.jsx)(n.td,{children:"All files in a dataset must be on the same RSE, but different datasets can be on different RSEs"}),(0,s.jsx)(n.td,{children:"No restrictions"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"footnotes",children:"Footnotes"}),"\n","\n",(0,s.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,s.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{id:"user-content-fn-1",children:["\n",(0,s.jsxs)(n.p,{children:["The system may reject rules if these violate other policies, e.g., only\nspecific accounts are allowed to request replication rules for tape systems. ",(0,s.jsx)(n.a,{href:"#user-content-fnref-1","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},r=i.createContext(s);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46c53b39.2c420eb9.js b/assets/js/46c53b39.2c420eb9.js deleted file mode 100644 index 4e566da36b..0000000000 --- a/assets/js/46c53b39.2c420eb9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[406],{60011:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user/developing_with_rucio","title":"Developing with Rucio","description":"Rucio Clients","source":"@site/../docs/user/developing_with_rucio.md","sourceDirName":"user","slug":"/user/developing_with_rucio","permalink":"/documentation/user/developing_with_rucio","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/user/developing_with_rucio.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"developing_with_rucio","title":"Developing with Rucio"},"sidebar":"docs","previous":{"title":"Using the Admin Client","permalink":"/documentation/user/using_the_admin_client"},"next":{"title":"Setting up a Rucio demo environment","permalink":"/documentation/operator/setting_up_demo"}}');var i=t(74848),o=t(28453);const s={id:"developing_with_rucio",title:"Developing with Rucio"},a=void 0,l={},c=[{value:"Rucio Clients",id:"rucio-clients",level:2},{value:"Errors and Exceptions",id:"errors-and-exceptions",level:3},{value:"RESTful APIs",id:"restful-apis",level:2},{value:"Date format",id:"date-format",level:3},{value:"SSL only",id:"ssl-only",level:3},{value:"Response formats",id:"response-formats",level:3},{value:"Error handling",id:"error-handling",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"rucio-clients",children:"Rucio Clients"}),"\n",(0,i.jsx)(n.p,{children:"Rucio includes a client class to remove some of the complexity of dealing with\nraw HTTP requests against the RESTful API."}),"\n",(0,i.jsx)(n.p,{children:"All client methods are accessible through the high-level class Client. Below is\none example of using Rucio Client class:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"from rucio.client import Client\nrucio_client = Client()\nrucio_client.ping()\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The methods are separated per resource type. The API in full can be viewed\n",(0,i.jsx)(n.a,{href:"pathname:///html/site/client.html",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"errors-and-exceptions",children:"Errors and Exceptions"}),"\n",(0,i.jsxs)(n.p,{children:["In the case of an error, Rucio returns a Python Exception with the appropriate\nTraceback, a detailed error string, and a unique error number. If the error\noccurred on the server side, it will be propagated to the client. The command\nline clients will exit back to the shell with the POSIX ",(0,i.jsx)(n.code,{children:"errno"})," of\nthe unique Rucio error number. The full and up to date list can be found in the\n",(0,i.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/lib/rucio/common/exception.py",children:"Exception\ndefinition"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"restful-apis",children:"RESTful APIs"}),"\n",(0,i.jsx)(n.p,{children:"Each resource can be accessed or modified using specially formed URLs and the\nstandard HTTP methods:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"GET to read\nPOST to create\nPUT to update\nDELETE to remove\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We require that all requests are done over SSL. The API supports JSON\nformats. Rucio uses ",(0,i.jsx)(n.a,{href:"http://oauth.net/",children:"OAuth"})," to authenticate all API\nrequests. The method is to get an authentication token, and use it for the rest\nof the requests. Descriptions of the actions you may perform on each resource\ncan be found in the REST API documentation."]}),"\n",(0,i.jsx)(n.h3,{id:"date-format",children:"Date format"}),"\n",(0,i.jsxs)(n.p,{children:["All dates returned are in UTC and are strings in the following format (RFC 1123,\nex RFC 822): ",(0,i.jsx)(n.code,{children:"Mon, 13 May 2013 10:23:03 UTC"})]}),"\n",(0,i.jsx)(n.p,{children:"In code format, which can be used in all programming languages that support\nstrftime or strptime:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"%a, %d %b %Y %H:%M:%S UTC\n"})}),"\n",(0,i.jsx)(n.h3,{id:"ssl-only",children:"SSL only"}),"\n",(0,i.jsx)(n.p,{children:"We require that all requests(except for the ping) are done over SSL."}),"\n",(0,i.jsx)(n.h3,{id:"response-formats",children:"Response formats"}),"\n",(0,i.jsxs)(n.p,{children:["The currently-available response format for all REST endpoints is the\nstring-based format JavaScript Object Notation (",(0,i.jsx)(n.a,{href:"http://www.json.org/",children:"JSON"}),").\nThe server answer can be one of the following content-type in the http Header:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"Content-type: application/json\nContent-Type: application/x-json-stream\n"})}),"\n",(0,i.jsx)(n.p,{children:"In the last case, it corresponds to JSON objects delimited by newlines(streaming\nJSON for large answer), e.g.:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{ "id": 1, "foo": "bar" }\n{ "id": 2, "foo": "baz" }\n...\n'})}),"\n",(0,i.jsx)(n.h3,{id:"error-handling",children:"Error handling"}),"\n",(0,i.jsx)(n.p,{children:"Errors are returned using standard HTTP error code syntax. Additional info is\nincluded in the header or the body of the return call, JSON-formatted with the\nparameters:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"ExceptionClass\nExceptionMessage\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"ExceptionClass"})," refers to Rucio Exceptions."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46c53b39.6ea7e8a0.js b/assets/js/46c53b39.6ea7e8a0.js new file mode 100644 index 0000000000..885bf5c39b --- /dev/null +++ b/assets/js/46c53b39.6ea7e8a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[406],{60011:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user/developing_with_rucio","title":"Developing with Rucio","description":"Rucio Clients","source":"@site/../docs/user/developing_with_rucio.md","sourceDirName":"user","slug":"/user/developing_with_rucio","permalink":"/documentation/user/developing_with_rucio","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/user/developing_with_rucio.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"developing_with_rucio","title":"Developing with Rucio"},"sidebar":"docs","previous":{"title":"Using the Admin Client","permalink":"/documentation/user/using_the_admin_client"},"next":{"title":"Setting up a Rucio demo environment","permalink":"/documentation/operator/setting_up_demo"}}');var i=t(74848),o=t(28453);const s={id:"developing_with_rucio",title:"Developing with Rucio"},a=void 0,l={},c=[{value:"Rucio Clients",id:"rucio-clients",level:2},{value:"Errors and Exceptions",id:"errors-and-exceptions",level:3},{value:"RESTful APIs",id:"restful-apis",level:2},{value:"Date format",id:"date-format",level:3},{value:"SSL only",id:"ssl-only",level:3},{value:"Response formats",id:"response-formats",level:3},{value:"Error handling",id:"error-handling",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"rucio-clients",children:"Rucio Clients"}),"\n",(0,i.jsx)(n.p,{children:"Rucio includes a client class to remove some of the complexity of dealing with\nraw HTTP requests against the RESTful API."}),"\n",(0,i.jsx)(n.p,{children:"All client methods are accessible through the high-level class Client. Below is\none example of using Rucio Client class:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"from rucio.client import Client\nrucio_client = Client()\nrucio_client.ping()\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The methods are separated per resource type. The API in full can be viewed\n",(0,i.jsx)(n.a,{href:"pathname:///html/site/client.html",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"errors-and-exceptions",children:"Errors and Exceptions"}),"\n",(0,i.jsxs)(n.p,{children:["In the case of an error, Rucio returns a Python Exception with the appropriate\nTraceback, a detailed error string, and a unique error number. If the error\noccurred on the server side, it will be propagated to the client. The command\nline clients will exit back to the shell with the POSIX ",(0,i.jsx)(n.code,{children:"errno"})," of\nthe unique Rucio error number. The full and up to date list can be found in the\n",(0,i.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/lib/rucio/common/exception.py",children:"Exception\ndefinition"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"restful-apis",children:"RESTful APIs"}),"\n",(0,i.jsx)(n.p,{children:"Each resource can be accessed or modified using specially formed URLs and the\nstandard HTTP methods:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"GET to read\nPOST to create\nPUT to update\nDELETE to remove\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We require that all requests are done over SSL. The API supports JSON\nformats. Rucio uses ",(0,i.jsx)(n.a,{href:"http://oauth.net/",children:"OAuth"})," to authenticate all API\nrequests. The method is to get an authentication token, and use it for the rest\nof the requests. Descriptions of the actions you may perform on each resource\ncan be found in the REST API documentation."]}),"\n",(0,i.jsx)(n.h3,{id:"date-format",children:"Date format"}),"\n",(0,i.jsxs)(n.p,{children:["All dates returned are in UTC and are strings in the following format (RFC 1123,\nex RFC 822): ",(0,i.jsx)(n.code,{children:"Mon, 13 May 2013 10:23:03 UTC"})]}),"\n",(0,i.jsx)(n.p,{children:"In code format, which can be used in all programming languages that support\nstrftime or strptime:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"%a, %d %b %Y %H:%M:%S UTC\n"})}),"\n",(0,i.jsx)(n.h3,{id:"ssl-only",children:"SSL only"}),"\n",(0,i.jsx)(n.p,{children:"We require that all requests(except for the ping) are done over SSL."}),"\n",(0,i.jsx)(n.h3,{id:"response-formats",children:"Response formats"}),"\n",(0,i.jsxs)(n.p,{children:["The currently-available response format for all REST endpoints is the\nstring-based format JavaScript Object Notation (",(0,i.jsx)(n.a,{href:"http://www.json.org/",children:"JSON"}),").\nThe server answer can be one of the following content-type in the http Header:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"Content-type: application/json\nContent-Type: application/x-json-stream\n"})}),"\n",(0,i.jsx)(n.p,{children:"In the last case, it corresponds to JSON objects delimited by newlines(streaming\nJSON for large answer), e.g.:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{ "id": 1, "foo": "bar" }\n{ "id": 2, "foo": "baz" }\n...\n'})}),"\n",(0,i.jsx)(n.h3,{id:"error-handling",children:"Error handling"}),"\n",(0,i.jsx)(n.p,{children:"Errors are returned using standard HTTP error code syntax. Additional info is\nincluded in the header or the body of the return call, JSON-formatted with the\nparameters:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"ExceptionClass\nExceptionMessage\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"ExceptionClass"})," refers to Rucio Exceptions."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49aea3c1.16d4f42f.js b/assets/js/49aea3c1.16d4f42f.js deleted file mode 100644 index f9804fa53c..0000000000 --- a/assets/js/49aea3c1.16d4f42f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6880],{33751:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"started/what_is_rucio","title":"What is Rucio?","description":"Rucio enables centralized management of large volumes of data backed by many","source":"@site/../docs/started/what_is_rucio.md","sourceDirName":"started","slug":"/started/what_is_rucio","permalink":"/documentation/started/what_is_rucio","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/what_is_rucio.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"what_is_rucio","title":"What is Rucio?"},"sidebar":"docs","previous":{"title":"Before you get started","permalink":"/documentation/started/before_you_get_started"},"next":{"title":"Main Components","permalink":"/documentation/started/main_components"}}');var o=n(74848),i=n(28453);const s={id:"what_is_rucio",title:"What is Rucio?"},r=void 0,c={},d=[{value:"History",id:"history",level:2},{value:"What can Rucio do",id:"what-can-rucio-do",level:2},{value:"What Rucio doesn't do",id:"what-rucio-doesnt-do",level:2}];function l(e){const t={h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Rucio enables centralized management of large volumes of data backed by many\nheterogeneous storage backends."}),"\n",(0,o.jsx)(t.p,{children:"Data is physically distributed over a large number of storage servers, potentially\neach relying on different storage technologies (SSD/Disk/Tape/Object storage) and,\nfrequently, managed by different teams of system administrators."}),"\n",(0,o.jsx)(t.p,{children:"Rucio builds on top of this heterogeneous infrastructure and provides an interface\nwhich allows users to interact with the storage backends in a unified way.\nThe smallest operational unit in Rucio is a file. Rucio enables users to upload,\ndownload, and declaratively manage groups of such files."}),"\n",(0,o.jsx)(t.p,{children:'Declarative management is the power of Rucio, as it allows the user to define\nhigh-level rules such as "Keep 3 copies, on 2 different continents".\nIf one copy is lost, it will be automatically re-constructed on a different storage\nserver to enforce the configured rules.'}),"\n",(0,o.jsx)(t.h2,{id:"history",children:"History"}),"\n",(0,o.jsxs)(t.p,{children:["Rucio was developed as a replacement for the Don Quijote (DQ2) data management\nsystem. Even if DQ2 has demonstrated very large scale data management capabilities,\nthe ",(0,o.jsx)(t.strong,{children:"ATLAS Distributed Data Management System"})," used for ",(0,o.jsx)(t.strong,{children:"HEP\nexperiments at CERN"})," had reached its limits in terms of scalability. The\nprimary concerns were"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"the requirement of a large number of support staff to operate."}),"\n",(0,o.jsx)(t.li,{children:"difficulty in interfacing with new technologies"}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["To address these very scaling requirements for HEP experiments, ",(0,o.jsx)(t.strong,{children:"Rucio"})," as a\nDistributed Data Management System, was developed. Drawing benefits from\nadvances in Cloud & Big Data computations, it relies on a conceptual data model\nto ensure system stability. Dataflow autonomy and automation are the key design\nprinciples guiding the development of Rucio. To reduce the operational overheads\nof the support staff, it employs an automation framework and also accounts for\nnewer use cases & user requirements in high energy physics and beyond."]}),"\n",(0,o.jsx)(t.h2,{id:"what-can-rucio-do",children:"What can Rucio do"}),"\n",(0,o.jsx)(t.p,{children:"The capabilities of Rucio are:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Storage of detector data, simulator data, and user data"}),"\n",(0,o.jsx)(t.li,{children:"Unified interfacing of heterogenous network & storage infrastructure"}),"\n",(0,o.jsx)(t.li,{children:"Support for newer protocols in Storage & Network using plugins"}),"\n",(0,o.jsx)(t.li,{children:"Data Recovery"}),"\n",(0,o.jsx)(t.li,{children:"Adaptive Replication"}),"\n",(0,o.jsx)(t.li,{children:"Quota management"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"what-rucio-doesnt-do",children:"What Rucio doesn't do"}),"\n",(0,o.jsx)(t.p,{children:"Rucio doesn't automatically create the storage backends. The storage servers must\nbe created and configured, in advance, with one of the supported access protocols\n(webdav/s3/sftp/xrootd/...), then configured in Rucio."})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(96540);const o={},i=a.createContext(o);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49aea3c1.4cd35d0d.js b/assets/js/49aea3c1.4cd35d0d.js new file mode 100644 index 0000000000..9f0a666c56 --- /dev/null +++ b/assets/js/49aea3c1.4cd35d0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6880],{33751:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"started/what_is_rucio","title":"What is Rucio?","description":"Rucio enables centralized management of large volumes of data backed by many","source":"@site/../docs/started/what_is_rucio.md","sourceDirName":"started","slug":"/started/what_is_rucio","permalink":"/documentation/started/what_is_rucio","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/started/what_is_rucio.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"what_is_rucio","title":"What is Rucio?"},"sidebar":"docs","previous":{"title":"Before you get started","permalink":"/documentation/started/before_you_get_started"},"next":{"title":"Main Components","permalink":"/documentation/started/main_components"}}');var o=n(74848),i=n(28453);const s={id:"what_is_rucio",title:"What is Rucio?"},r=void 0,c={},d=[{value:"History",id:"history",level:2},{value:"What can Rucio do",id:"what-can-rucio-do",level:2},{value:"What Rucio doesn't do",id:"what-rucio-doesnt-do",level:2}];function l(e){const t={h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Rucio enables centralized management of large volumes of data backed by many\nheterogeneous storage backends."}),"\n",(0,o.jsx)(t.p,{children:"Data is physically distributed over a large number of storage servers, potentially\neach relying on different storage technologies (SSD/Disk/Tape/Object storage) and,\nfrequently, managed by different teams of system administrators."}),"\n",(0,o.jsx)(t.p,{children:"Rucio builds on top of this heterogeneous infrastructure and provides an interface\nwhich allows users to interact with the storage backends in a unified way.\nThe smallest operational unit in Rucio is a file. Rucio enables users to upload,\ndownload, and declaratively manage groups of such files."}),"\n",(0,o.jsx)(t.p,{children:'Declarative management is the power of Rucio, as it allows the user to define\nhigh-level rules such as "Keep 3 copies, on 2 different continents".\nIf one copy is lost, it will be automatically re-constructed on a different storage\nserver to enforce the configured rules.'}),"\n",(0,o.jsx)(t.h2,{id:"history",children:"History"}),"\n",(0,o.jsxs)(t.p,{children:["Rucio was developed as a replacement for the Don Quijote (DQ2) data management\nsystem. Even if DQ2 has demonstrated very large scale data management capabilities,\nthe ",(0,o.jsx)(t.strong,{children:"ATLAS Distributed Data Management System"})," used for ",(0,o.jsx)(t.strong,{children:"HEP\nexperiments at CERN"})," had reached its limits in terms of scalability. The\nprimary concerns were"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"the requirement of a large number of support staff to operate."}),"\n",(0,o.jsx)(t.li,{children:"difficulty in interfacing with new technologies"}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["To address these very scaling requirements for HEP experiments, ",(0,o.jsx)(t.strong,{children:"Rucio"})," as a\nDistributed Data Management System, was developed. Drawing benefits from\nadvances in Cloud & Big Data computations, it relies on a conceptual data model\nto ensure system stability. Dataflow autonomy and automation are the key design\nprinciples guiding the development of Rucio. To reduce the operational overheads\nof the support staff, it employs an automation framework and also accounts for\nnewer use cases & user requirements in high energy physics and beyond."]}),"\n",(0,o.jsx)(t.h2,{id:"what-can-rucio-do",children:"What can Rucio do"}),"\n",(0,o.jsx)(t.p,{children:"The capabilities of Rucio are:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Storage of detector data, simulator data, and user data"}),"\n",(0,o.jsx)(t.li,{children:"Unified interfacing of heterogenous network & storage infrastructure"}),"\n",(0,o.jsx)(t.li,{children:"Support for newer protocols in Storage & Network using plugins"}),"\n",(0,o.jsx)(t.li,{children:"Data Recovery"}),"\n",(0,o.jsx)(t.li,{children:"Adaptive Replication"}),"\n",(0,o.jsx)(t.li,{children:"Quota management"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"what-rucio-doesnt-do",children:"What Rucio doesn't do"}),"\n",(0,o.jsx)(t.p,{children:"Rucio doesn't automatically create the storage backends. The storage servers must\nbe created and configured, in advance, with one of the supported access protocols\n(webdav/s3/sftp/xrootd/...), then configured in Rucio."})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(96540);const o={},i=a.createContext(o);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4b43413c.91f401b6.js b/assets/js/4b43413c.91f401b6.js deleted file mode 100644 index c7f66eee95..0000000000 --- a/assets/js/4b43413c.91f401b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7541],{22355:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"operator/notifications","title":"Notifications","description":"Notifications","source":"@site/../docs/operator/notifications.md","sourceDirName":"operator","slug":"/operator/notifications","permalink":"/documentation/operator/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/notifications.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"notifications","title":"Notifications"},"sidebar":"docs","previous":{"title":"QoS RSE Configuration","permalink":"/documentation/operator/qos_rse_config"},"next":{"title":"rucio-abacus-account","permalink":"/documentation/bin/rucio-abacus-account"}}');var n=s(74848),r=s(28453);const d={id:"notifications",title:"Notifications"},a=void 0,o={},c=[{value:"Notifications",id:"notifications",level:2},{value:"Rucio Notifications",id:"rucio-notifications",level:3}];function l(e){const t={code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"notifications",children:"Notifications"}),"\n",(0,n.jsx)(t.p,{children:"Rucio generates several types of notifications, such as for rule state changes, transfer requests, etc.\nThese notifications are primarily useful to other systems for synchronisation purposes, e.g., notifying a workflow management system that a dataset has finished transferring or has been deleted."}),"\n",(0,n.jsx)(t.h3,{id:"rucio-notifications",children:"Rucio Notifications"}),"\n",(0,n.jsx)(t.p,{children:"The events generated by Rucio are categorized into different event types. Each event type has a different payload."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Context"}),(0,n.jsx)(t.th,{children:"Event Type"}),(0,n.jsx)(t.th,{children:"Payload example"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"While adding a DID, if the DID type is a Container"}),(0,n.jsx)(t.td,{children:"CREATE_CNT"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"While adding a DID, if the DID type is a DataSet"}),(0,n.jsx)(t.td,{children:"CREATE_DTS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Submit transfer requests on destination RSEs for data identifiers."}),(0,n.jsx)(t.td,{children:"transfer_status"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Schedule removal of the entry from the DIDs table"}),(0,n.jsx)(t.td,{children:"INCOMPLETE"}),(0,n.jsx)(t.td,{children:"-"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Delete empty DIDs where the DIDType is DATASET"}),(0,n.jsx)(t.td,{children:"ERASE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for DIDs which are closed"}),(0,n.jsx)(t.td,{children:"RULE_OK"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"For replication replication rule, for each 10% of progress"}),(0,n.jsx)(t.td,{children:"RULE_PROGRESS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for each DATASET covered by the rule"}),(0,n.jsx)(t.td,{children:"DATASETLOCK_OK"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a transfer has been completed"}),(0,n.jsx)(t.td,{children:"transfer-done"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a transfer has been fail"}),(0,n.jsx)(t.td,{children:"transfer-failed"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a deletion has been successful"}),(0,n.jsx)(t.td,{children:"deletion-done"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a deletion has been fail"}),(0,n.jsx)(t.td,{children:"deletion-failed"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},28453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>a});var i=s(96540);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4b43413c.9e2e278f.js b/assets/js/4b43413c.9e2e278f.js new file mode 100644 index 0000000000..7752f94322 --- /dev/null +++ b/assets/js/4b43413c.9e2e278f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7541],{22355:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"operator/notifications","title":"Notifications","description":"Notifications","source":"@site/../docs/operator/notifications.md","sourceDirName":"operator","slug":"/operator/notifications","permalink":"/documentation/operator/notifications","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/notifications.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"notifications","title":"Notifications"},"sidebar":"docs","previous":{"title":"QoS RSE Configuration","permalink":"/documentation/operator/qos_rse_config"},"next":{"title":"rucio-abacus-account","permalink":"/documentation/bin/rucio-abacus-account"}}');var n=s(74848),r=s(28453);const d={id:"notifications",title:"Notifications"},a=void 0,o={},c=[{value:"Notifications",id:"notifications",level:2},{value:"Rucio Notifications",id:"rucio-notifications",level:3}];function l(e){const t={code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"notifications",children:"Notifications"}),"\n",(0,n.jsx)(t.p,{children:"Rucio generates several types of notifications, such as for rule state changes, transfer requests, etc.\nThese notifications are primarily useful to other systems for synchronisation purposes, e.g., notifying a workflow management system that a dataset has finished transferring or has been deleted."}),"\n",(0,n.jsx)(t.h3,{id:"rucio-notifications",children:"Rucio Notifications"}),"\n",(0,n.jsx)(t.p,{children:"The events generated by Rucio are categorized into different event types. Each event type has a different payload."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Context"}),(0,n.jsx)(t.th,{children:"Event Type"}),(0,n.jsx)(t.th,{children:"Payload example"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"While adding a DID, if the DID type is a Container"}),(0,n.jsx)(t.td,{children:"CREATE_CNT"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"While adding a DID, if the DID type is a DataSet"}),(0,n.jsx)(t.td,{children:"CREATE_DTS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Submit transfer requests on destination RSEs for data identifiers."}),(0,n.jsx)(t.td,{children:"transfer_status"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Schedule removal of the entry from the DIDs table"}),(0,n.jsx)(t.td,{children:"INCOMPLETE"}),(0,n.jsx)(t.td,{children:"-"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Delete empty DIDs where the DIDType is DATASET"}),(0,n.jsx)(t.td,{children:"ERASE"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for DIDs which are closed"}),(0,n.jsx)(t.td,{children:"RULE_OK"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"For replication replication rule, for each 10% of progress"}),(0,n.jsx)(t.td,{children:"RULE_PROGRESS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for each DATASET covered by the rule"}),(0,n.jsx)(t.td,{children:"DATASETLOCK_OK"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a transfer has been completed"}),(0,n.jsx)(t.td,{children:"transfer-done"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a transfer has been fail"}),(0,n.jsx)(t.td,{children:"transfer-failed"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a deletion has been successful"}),(0,n.jsx)(t.td,{children:"deletion-done"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"When a deletion has been fail"}),(0,n.jsx)(t.td,{children:"deletion-failed"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},28453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>a});var i=s(96540);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4dae639c.921d2a00.js b/assets/js/4dae639c.921d2a00.js deleted file mode 100644 index 97219106e6..0000000000 --- a/assets/js/4dae639c.921d2a00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8236],{31392:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"project_organisation","title":"Project Organisation","description":"Rucio is organised as a community-driven, open-source, project.","source":"@site/../docs/project_organisation.md","sourceDirName":".","slug":"/project_organisation","permalink":"/documentation/project_organisation","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/project_organisation.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"project_organisation","title":"Project Organisation"},"sidebar":"docs","previous":{"title":"Developing the WebUI Frontend","permalink":"/documentation/developer/webui/webui_frontend"},"next":{"title":"Rucio Advisory Board","permalink":"/documentation/rucio_advisory_board"}}');var i=t(74848),r=t(28453);const s={id:"project_organisation",title:"Project Organisation"},a=void 0,c={},d=[{value:"Project leader",id:"project-leader",level:2},{value:"Component leads",id:"component-leads",level:2},{value:"Rucio Advisory Board",id:"rucio-advisory-board",level:2},{value:"Special Interest Groups",id:"special-interest-groups",level:2},{value:"Contributors / Developers",id:"contributors--developers",level:2}];function l(e){const o={a:"a",h2:"h2",img:"img",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.p,{children:"Rucio is organised as a community-driven, open-source, project.\nAn open development team, comprised of technical experts rooted in the scientific\ncommunity, drives the development based on expertise, technical best-practices and\ninput from their respective communities. This openness is core to the identity and\nthe success of the project."}),"\n",(0,i.jsx)(o.p,{children:"To organise the daily development work as well as the long-term strategic objectives\nof the software, the project consists of several entities described on this page."}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsx)(o.img,{alt:"Project organisation",src:t(72676).A+"",width:"936",height:"487"})}),"\n",(0,i.jsxs)(o.p,{children:['A list of members of the current "Core Team" can be seen ',(0,i.jsx)(o.a,{href:"https://rucio.cern.ch/team.html",children:"here"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"project-leader",children:"Project leader"}),"\n",(0,i.jsx)(o.p,{children:"The project leader has the overall responsibility of steering the project. This\nincludes coordinating, planning, and assessing the development activity of the\nRucio developers."}),"\n",(0,i.jsx)(o.h2,{id:"component-leads",children:"Component leads"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.a,{href:"/documentation/component_leads",children:"component leads"})," take formal responsibility in planning\nand developing contributions for their respective components. They are the\ncore experts and the point-of-contact in case of issues as well as to guide new\ndevelopments within their components."]}),"\n",(0,i.jsx)(o.h2,{id:"rucio-advisory-board",children:"Rucio Advisory Board"}),"\n",(0,i.jsx)(o.p,{children:"The primary function of the Rucio advisory board (RAB) is to provide expertise from\nrepresentatives of Rucio communities and to advise the Rucio project leader.\nLong-term priorities and plans of communities should be discussed by the RAB in order\nto advise on the alignment of Rucio project objectives and plans. This should also\nlead to the identification of common objectives to form common development efforts.\nThe resource and person-power situation within the Rucio project, the discussion and\nidentification of funding streams and collaboration on funded projects are also\nwithin the scope of the RAB. The Rucio project lead communicates the advice given by\nthe advisory board to the development team."}),"\n",(0,i.jsxs)(o.p,{children:["Detailed mandate and responsibility of the board can be found ",(0,i.jsx)(o.a,{href:"/documentation/rucio_advisory_board",children:"here"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"special-interest-groups",children:"Special Interest Groups"}),"\n",(0,i.jsx)(o.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,i.jsxs)(o.p,{children:["Detailed information for Rucio SIGs can be found ",(0,i.jsx)(o.a,{href:"/documentation/special_interest_groups",children:"here"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"contributors--developers",children:"Contributors / Developers"}),"\n",(0,i.jsxs)(o.p,{children:["Rucio could not exist without the numerous contributors who spent their valuable time\nto improve the software. A list of contributors can be seen ",(0,i.jsx)(o.a,{href:"about_our_contributors",children:"here"}),"."]})]})}function p(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},72676:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/project_organisation-9263b311a490d456ac15a99d87696b16.svg"},28453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(96540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4dae639c.d2ea5709.js b/assets/js/4dae639c.d2ea5709.js new file mode 100644 index 0000000000..a8129af91b --- /dev/null +++ b/assets/js/4dae639c.d2ea5709.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8236],{31392:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"project_organisation","title":"Project Organisation","description":"Rucio is organised as a community-driven, open-source, project.","source":"@site/../docs/project_organisation.md","sourceDirName":".","slug":"/project_organisation","permalink":"/documentation/project_organisation","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/project_organisation.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"project_organisation","title":"Project Organisation"},"sidebar":"docs","previous":{"title":"Developing the WebUI Frontend","permalink":"/documentation/developer/webui/webui_frontend"},"next":{"title":"Rucio Advisory Board","permalink":"/documentation/rucio_advisory_board"}}');var i=t(74848),r=t(28453);const s={id:"project_organisation",title:"Project Organisation"},a=void 0,c={},d=[{value:"Project leader",id:"project-leader",level:2},{value:"Component leads",id:"component-leads",level:2},{value:"Rucio Advisory Board",id:"rucio-advisory-board",level:2},{value:"Special Interest Groups",id:"special-interest-groups",level:2},{value:"Contributors / Developers",id:"contributors--developers",level:2}];function l(e){const o={a:"a",h2:"h2",img:"img",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.p,{children:"Rucio is organised as a community-driven, open-source, project.\nAn open development team, comprised of technical experts rooted in the scientific\ncommunity, drives the development based on expertise, technical best-practices and\ninput from their respective communities. This openness is core to the identity and\nthe success of the project."}),"\n",(0,i.jsx)(o.p,{children:"To organise the daily development work as well as the long-term strategic objectives\nof the software, the project consists of several entities described on this page."}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsx)(o.img,{alt:"Project organisation",src:t(72676).A+"",width:"936",height:"487"})}),"\n",(0,i.jsxs)(o.p,{children:['A list of members of the current "Core Team" can be seen ',(0,i.jsx)(o.a,{href:"https://rucio.cern.ch/team.html",children:"here"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"project-leader",children:"Project leader"}),"\n",(0,i.jsx)(o.p,{children:"The project leader has the overall responsibility of steering the project. This\nincludes coordinating, planning, and assessing the development activity of the\nRucio developers."}),"\n",(0,i.jsx)(o.h2,{id:"component-leads",children:"Component leads"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.a,{href:"/documentation/component_leads",children:"component leads"})," take formal responsibility in planning\nand developing contributions for their respective components. They are the\ncore experts and the point-of-contact in case of issues as well as to guide new\ndevelopments within their components."]}),"\n",(0,i.jsx)(o.h2,{id:"rucio-advisory-board",children:"Rucio Advisory Board"}),"\n",(0,i.jsx)(o.p,{children:"The primary function of the Rucio advisory board (RAB) is to provide expertise from\nrepresentatives of Rucio communities and to advise the Rucio project leader.\nLong-term priorities and plans of communities should be discussed by the RAB in order\nto advise on the alignment of Rucio project objectives and plans. This should also\nlead to the identification of common objectives to form common development efforts.\nThe resource and person-power situation within the Rucio project, the discussion and\nidentification of funding streams and collaboration on funded projects are also\nwithin the scope of the RAB. The Rucio project lead communicates the advice given by\nthe advisory board to the development team."}),"\n",(0,i.jsxs)(o.p,{children:["Detailed mandate and responsibility of the board can be found ",(0,i.jsx)(o.a,{href:"/documentation/rucio_advisory_board",children:"here"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"special-interest-groups",children:"Special Interest Groups"}),"\n",(0,i.jsx)(o.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,i.jsxs)(o.p,{children:["Detailed information for Rucio SIGs can be found ",(0,i.jsx)(o.a,{href:"/documentation/special_interest_groups",children:"here"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"contributors--developers",children:"Contributors / Developers"}),"\n",(0,i.jsxs)(o.p,{children:["Rucio could not exist without the numerous contributors who spent their valuable time\nto improve the software. A list of contributors can be seen ",(0,i.jsx)(o.a,{href:"about_our_contributors",children:"here"}),"."]})]})}function p(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},72676:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/project_organisation-9263b311a490d456ac15a99d87696b16.svg"},28453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(96540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a310bfb.4dce21e6.js b/assets/js/5a310bfb.4dce21e6.js deleted file mode 100644 index 8dc7ea6149..0000000000 --- a/assets/js/5a310bfb.4dce21e6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[511],{85202:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"operator/kubernetes","title":"Setting up Rucio on Kubernetes","description":"Helm charts","source":"@site/../docs/operator/kubernetes.md","sourceDirName":"operator","slug":"/operator/kubernetes","permalink":"/documentation/operator/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/kubernetes.md","tags":[],"version":"current","lastUpdatedBy":"Timothy Noble","lastUpdatedAt":1734104892000,"frontMatter":{"id":"kubernetes","title":"Setting up Rucio on Kubernetes"},"sidebar":"docs","previous":{"title":"Setting up a Rucio demo environment","permalink":"/documentation/operator/setting_up_demo"},"next":{"title":"Installing Rucio Server","permalink":"/documentation/operator/installing_server"}}');var r=n(74848),o=n(28453);const a={id:"kubernetes",title:"Setting up Rucio on Kubernetes"},s=void 0,c={},l=[{value:"Helm charts",id:"helm-charts",level:2},{value:"Tutorial",id:"tutorial",level:2},{value:"Example of Kubernetes deployment",id:"example-of-kubernetes-deployment",level:2},{value:"Bootstrapping the database",id:"bootstrapping-the-database",level:2},{value:"Upgrading the database",id:"upgrading-the-database",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"helm-charts",children:"Helm charts"}),"\n",(0,r.jsxs)(t.p,{children:["Helm charts help you define, install, and upgrade Kubernetes applications. In ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"this repository"}),", you can find Helm charts for the major different components of Rucio."]}),"\n",(0,r.jsx)(t.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(t.p,{children:["A tutorial for using Rucio with Kubernetes can be found ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"here"})]}),"\n",(0,r.jsx)(t.h2,{id:"example-of-kubernetes-deployment",children:"Example of Kubernetes deployment"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://www.km3net.org",children:"KM3NeT"})," runs Rucio on Kubernetes via ",(0,r.jsx)(t.a,{href:"https://fluxcd.io",children:"flux"}),".\nThe configuration deployed on their Rucio server can be found ",(0,r.jsx)(t.a,{href:"https://git.km3net.de/rucio/rucio-deployment",children:"here"}),".\nThe documentation of how this (specific) instance can be set up can be found in the ",(0,r.jsx)(t.a,{href:"https://rucio.pages.km3net.de/rucio-documentation/installation/",children:"docs"})]}),"\n",(0,r.jsx)(t.h2,{id:"bootstrapping-the-database",children:"Bootstrapping the database"}),"\n",(0,r.jsx)(t.p,{children:"By default, no database is initialized when a new Rucio installation is set up.\nAn init container can be used to bootstrap the database on a Kubernetes cluster:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Create a ",(0,r.jsx)(t.code,{children:"init-pod.yaml"})," file as in the snippet below, replacing the ",(0,r.jsx)(t.code,{children:""})," with the secret needed to connect to the database:"]}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Pod\nmetadata:\n name: init\n labels:\n app: rucio\nspec:\n restartPolicy: Never\n containers:\n - name: init\n image: rucio/rucio-init:latest\n imagePullPolicy: Always\n env:\n - name: RUCIO_CFG_DATABASE_DEFAULT\n value: postgresql://rucio:@postgres-postgresql/rucio\n - name: RUCIO_CFG_DATABASE_SCHEMA\n value: test\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_IDENTITY\n value: tutorial\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_PWD\n value: secret1R\n - name: RUCIO_PRINT_CFG\n value: "true"\n'})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsx)(t.li,{children:"Start the init pod:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"kubectl apply -f init-pod.yaml\n"})}),"\n",(0,r.jsx)(t.p,{children:"For more information:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"Rucio Kubernetes tutorial repository README"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/",children:"Init container documentation"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"upgrading-the-database",children:"Upgrading the database"}),"\n",(0,r.jsxs)(t.p,{children:["After the Rucio version has been upgraded, there might be database changes\nthat have to be done. These can be done on the ",(0,r.jsx)(t.code,{children:"rucio-server"})," pod of the cluster and\nare performed with the ",(0,r.jsx)(t.a,{href:"http://alembic.zzzcomputing.com/en/latest/",children:"Alembic"})," tool."]}),"\n",(0,r.jsxs)(t.p,{children:["The alembic.ini template can be found\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/rucio/blob/master/etc/alembic.ini.template",children:"here"}),".\nFill in the correct values before transferring the file to the ",(0,r.jsx)(t.code,{children:"rucio-server"})," pod:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"cat alembic.ini | kubectl exec -i rucio-server- --container rucio-server -- tee /tmp/alembic.ini\n"})}),"\n",(0,r.jsx)(t.p,{children:"Open a bash prompt on the pod"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"kubectl exec rucio-server- --container rucio-server -it -- bash\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Then perform the upgrade with the Alembic tool as described in the database ",(0,r.jsx)(t.a,{href:"./database#upgrading-and-downgrading-the-database-schema",children:"documentation"})]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(96540);const r={},o=i.createContext(r);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a310bfb.d89d1a01.js b/assets/js/5a310bfb.d89d1a01.js new file mode 100644 index 0000000000..9ddc4fb417 --- /dev/null +++ b/assets/js/5a310bfb.d89d1a01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[511],{85202:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"operator/kubernetes","title":"Setting up Rucio on Kubernetes","description":"Helm charts","source":"@site/../docs/operator/kubernetes.md","sourceDirName":"operator","slug":"/operator/kubernetes","permalink":"/documentation/operator/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/kubernetes.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"kubernetes","title":"Setting up Rucio on Kubernetes"},"sidebar":"docs","previous":{"title":"Setting up a Rucio demo environment","permalink":"/documentation/operator/setting_up_demo"},"next":{"title":"Installing Rucio Server","permalink":"/documentation/operator/installing_server"}}');var r=n(74848),o=n(28453);const a={id:"kubernetes",title:"Setting up Rucio on Kubernetes"},s=void 0,c={},l=[{value:"Helm charts",id:"helm-charts",level:2},{value:"Tutorial",id:"tutorial",level:2},{value:"Example of Kubernetes deployment",id:"example-of-kubernetes-deployment",level:2},{value:"Bootstrapping the database",id:"bootstrapping-the-database",level:2},{value:"Upgrading the database",id:"upgrading-the-database",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"helm-charts",children:"Helm charts"}),"\n",(0,r.jsxs)(t.p,{children:["Helm charts help you define, install, and upgrade Kubernetes applications. In ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"this repository"}),", you can find Helm charts for the major different components of Rucio."]}),"\n",(0,r.jsx)(t.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(t.p,{children:["A tutorial for using Rucio with Kubernetes can be found ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"here"})]}),"\n",(0,r.jsx)(t.h2,{id:"example-of-kubernetes-deployment",children:"Example of Kubernetes deployment"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://www.km3net.org",children:"KM3NeT"})," runs Rucio on Kubernetes via ",(0,r.jsx)(t.a,{href:"https://fluxcd.io",children:"flux"}),".\nThe configuration deployed on their Rucio server can be found ",(0,r.jsx)(t.a,{href:"https://git.km3net.de/rucio/rucio-deployment",children:"here"}),".\nThe documentation of how this (specific) instance can be set up can be found in the ",(0,r.jsx)(t.a,{href:"https://rucio.pages.km3net.de/rucio-documentation/installation/",children:"docs"})]}),"\n",(0,r.jsx)(t.h2,{id:"bootstrapping-the-database",children:"Bootstrapping the database"}),"\n",(0,r.jsx)(t.p,{children:"By default, no database is initialized when a new Rucio installation is set up.\nAn init container can be used to bootstrap the database on a Kubernetes cluster:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Create a ",(0,r.jsx)(t.code,{children:"init-pod.yaml"})," file as in the snippet below, replacing the ",(0,r.jsx)(t.code,{children:""})," with the secret needed to connect to the database:"]}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Pod\nmetadata:\n name: init\n labels:\n app: rucio\nspec:\n restartPolicy: Never\n containers:\n - name: init\n image: rucio/rucio-init:latest\n imagePullPolicy: Always\n env:\n - name: RUCIO_CFG_DATABASE_DEFAULT\n value: postgresql://rucio:@postgres-postgresql/rucio\n - name: RUCIO_CFG_DATABASE_SCHEMA\n value: test\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_IDENTITY\n value: tutorial\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_PWD\n value: secret1R\n - name: RUCIO_PRINT_CFG\n value: "true"\n'})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsx)(t.li,{children:"Start the init pod:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"kubectl apply -f init-pod.yaml\n"})}),"\n",(0,r.jsx)(t.p,{children:"For more information:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"Rucio Kubernetes tutorial repository README"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/",children:"Init container documentation"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"upgrading-the-database",children:"Upgrading the database"}),"\n",(0,r.jsxs)(t.p,{children:["After the Rucio version has been upgraded, there might be database changes\nthat have to be done. These can be done on the ",(0,r.jsx)(t.code,{children:"rucio-server"})," pod of the cluster and\nare performed with the ",(0,r.jsx)(t.a,{href:"http://alembic.zzzcomputing.com/en/latest/",children:"Alembic"})," tool."]}),"\n",(0,r.jsxs)(t.p,{children:["The alembic.ini template can be found\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/rucio/blob/master/etc/alembic.ini.template",children:"here"}),".\nFill in the correct values before transferring the file to the ",(0,r.jsx)(t.code,{children:"rucio-server"})," pod:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"cat alembic.ini | kubectl exec -i rucio-server- --container rucio-server -- tee /tmp/alembic.ini\n"})}),"\n",(0,r.jsx)(t.p,{children:"Open a bash prompt on the pod"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"kubectl exec rucio-server- --container rucio-server -it -- bash\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Then perform the upgrade with the Alembic tool as described in the database ",(0,r.jsx)(t.a,{href:"./database#upgrading-and-downgrading-the-database-schema",children:"documentation"})]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(96540);const r={},o=i.createContext(r);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a5d0baa.1f882012.js b/assets/js/5a5d0baa.1f882012.js new file mode 100644 index 0000000000..1e3465b29a --- /dev/null +++ b/assets/js/5a5d0baa.1f882012.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1526],{10087:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"developer/webui/webui_frontend","title":"Developing the WebUI Frontend","description":"Notes on external frameworks","source":"@site/../docs/developer/webui/webui_frontend.md","sourceDirName":"developer/webui","slug":"/developer/webui/webui_frontend","permalink":"/documentation/developer/webui/webui_frontend","draft":false,"unlisted":false,"editUrl":"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/webui_frontend.md","tags":[],"version":"current","lastUpdatedBy":"rdimaio","lastUpdatedAt":1734526830000,"frontMatter":{"id":"webui_frontend","title":"Developing the WebUI Frontend"},"sidebar":"docs","previous":{"title":"Using the WebUI StreamedTable Component","permalink":"/documentation/developer/webui/streamedtables"},"next":{"title":"Project Organisation","permalink":"/documentation/project_organisation"}}');var i=t(74848),o=t(28453);const a={id:"webui_frontend",title:"Developing the WebUI Frontend"},r=void 0,l={},d=[{value:"Notes on external frameworks",id:"notes-on-external-frameworks",level:2},{value:"React",id:"react",level:3},{value:"Components",id:"components",level:4},{value:"Attributes",id:"attributes",level:4},{value:"className",id:"classname",level:5},{value:"PageProps",id:"pageprops",level:5},{value:"aria",id:"aria",level:5},{value:"Hooks",id:"hooks",level:4},{value:"useState",id:"usestate",level:5},{value:"useEffect",id:"useeffect",level:5},{value:"useComDOM",id:"usecomdom",level:5},{value:"useResponsiveHook",id:"useresponsivehook",level:5},{value:"Tailwind",id:"tailwind",level:3},{value:"Structuring Class Names, Overriding",id:"structuring-class-names-overriding",level:4},{value:"Responsive Design",id:"responsive-design",level:4},{value:"Compiling Tailwind",id:"compiling-tailwind",level:4},{value:"Storybook",id:"storybook",level:3},{value:"Fixtures",id:"fixtures",level:5},{value:"mockUseComDOM",id:"mockusecomdom",level:5}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"notes-on-external-frameworks",children:"Notes on external frameworks"}),"\n",(0,i.jsxs)(n.p,{children:["The Rucio WebUI frontend uses two main frameworks: ",(0,i.jsx)(n.a,{href:"https://tailwindcss.com/",children:"TailwindCSS"}),"\nand ",(0,i.jsx)(n.a,{href:"https://react.dev/learn",children:"React"}),". Both have excellent documentations, which I will\nnot attempt to replace with these notes. Instead, I will extend them and concretise them\nwith the focus on the Rucio WebUI frontend and the design that it entails."]}),"\n",(0,i.jsxs)(n.p,{children:["Nonetheless, I will do a quick rundown of the most important and most frequently used\naspects of both frameworks in order to save a new developer time. In the end, I will also\nintroduce ",(0,i.jsx)(n.a,{href:"https://storybook.js.org/",children:"StorybookJS"}),", which is our tool to visualise the\nindividual tools of our website."]}),"\n",(0,i.jsx)(n.h3,{id:"react",children:"React"}),"\n",(0,i.jsx)(n.p,{children:"We use React as our frontend JavaScript framework. It is essentially a tool for building UI\ncomponents."}),"\n",(0,i.jsx)(n.h4,{id:"components",children:"Components"}),"\n",(0,i.jsx)(n.p,{children:"The building-blocks of our webpages are React Components. The webpages themselves are React\nComponents themselves. Individual components can be composed with each other to produce\nmore complex components, in the sense that a button component can be used to populate a\nwidget which is then used in a page."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The Rucio WebUI is written in TypeScript. In these docs, JavaScript and TypeScript might\nbe used interchangeably."})}),"\n",(0,i.jsxs)(n.p,{children:["These components JavaScript functions which return HTML code. We use ",(0,i.jsx)(n.code,{children:".tsx"})," files, which mean\nthat HTML markup and TypeScript code can be used in the same file. This can take the following\nshape:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'export const H1: React.FC = (\n { ...props }\n) => {\n const { children, className, ...otherprops } = props;\n return (\n \n {children}\n \n )\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Several things are going on here. The overall structure, however, is that of an\narrow function ",(0,i.jsx)(n.code,{children:"() => {}"})," returning an HTML tag of the shape\n",(0,i.jsx)(n.code,{children:"

    something

    "})," is defined and assigned to ",(0,i.jsx)(n.code,{children:"const H1"}),". The arrow function\nis typed, this will be handled later."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["In TSX, HTML markup is inserted into TypeScript after a ",(0,i.jsx)(n.code,{children:"return"})," statement.\nTypeScript is inserted into HTML when wrapped in ",(0,i.jsx)(n.code,{children:"{}"}),". VS Code does proper\nsyntax highlighting, which will help out."]})}),"\n",(0,i.jsx)(n.p,{children:"This function can now be imported and called in the following way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"

    Hello world!

    \n// more or less equal to\n

    Hello world!

    \n"})}),"\n",(0,i.jsx)(n.p,{children:"When using React components, take note of the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Custom components must start with a capital letter."}),"\n",(0,i.jsx)(n.li,{children:"You must return only one top-level HTML tag. You may nest other tags within this one."}),"\n",(0,i.jsx)(n.li,{children:"React components can nest other react components. They must ultimately resolve to HTML, though."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In our components, we usually make sure to typecast the functions as React Function Components.\nThese can in turn be cast to take the attributes of a specific HTML tag, which is chosen\nto be the top-level HTML tag returned."}),"\n",(0,i.jsxs)(n.p,{children:["In the following example, we define a type ",(0,i.jsx)(n.code,{children:"TextInputProps"})," which combines the\nattributes of the ",(0,i.jsx)(n.code,{children:""}),"-tag (all of which are optional) with the\n",(0,i.jsx)(n.code,{children:"onEnterkey?"})," attribute (the ",(0,i.jsx)(n.code,{children:"?"})," signifies that this is an optional attribute). The\nresulting component can take any of these attributes."]}),"\n",(0,i.jsxs)(n.p,{children:["Note that the ",(0,i.jsx)(n.code,{children:"...props"})," syntax simply means that any parameters ",(0,i.jsx)(n.code,{children:""}),"\npassed to the component that are not ",(0,i.jsx)(n.code,{children:"onEnterkey"})," are swallowed by the ",(0,i.jsx)(n.code,{children:"props"})," object."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type TextInputProps = JSX.IntrinsicElements["input"] & {\n onEnterkey?: (event: any) => void,\n}\n\nexport const TextInput: (\n React.FC\n) = (\n {\n onEnterkey,\n ...props\n }\n) => {\n // shown in next code example\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Typing our components this way means that we can easily extend standard HTML tags, while keeping\nall of their original functionality (i.e. the way they deal with attributes passed to them) ",(0,i.jsx)(n.em,{children:"without"}),"\nthe need to implement each attribute ourselves."]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["These attributes are referred to as ",(0,i.jsx)(n.em,{children:"content attributes"})," and it is a very good idea to get\nacquainted with the different attributes that can be assigned to the different HTML tags.\nWe will cover some examples in the next section. You can find more information here:"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://html.spec.whatwg.org/",children:"HTML Specification"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes",children:"MDN Web Docs"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.w3schools.com/tags/ref_attributes.asp",children:"W3Schools"})}),"\n"]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finally, you can pass these attributes into the component state (usually done\nwith components that render pages), or pass them into the sub-components that\nmake up the component. The latter is what happens in the following code block,\nwhich is taken from ",(0,i.jsx)(n.code,{children:"TextInput"})," again:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'// unpack props props to be handled individually and otherprops\nconst { children, onKeyDown, ...otherprops } = props\nreturn (\n {\n if (e.key === "Enter") {\n // `?.()`-syntax used because onEnterkey could be undefined\n onEnterkey?.(e)\n }\n // could also be undefined\n onKeyDown?.(e)\n }}\n {...otherprops} // unpack otherprops here\n >\n {\n // pass the content between in here\n children\n }\n \n)\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In the previous example, a native HTML tag has been enriched by the ",(0,i.jsx)(n.code,{children:"onKeyDown"})," function\nby a special ",(0,i.jsx)(n.code,{children:"onEnterkey"})," functionality. In all other ways, the new component is the same\nas the included, standard ",(0,i.jsx)(n.code,{children:""})," tag."]}),"\n",(0,i.jsx)(n.h4,{id:"attributes",children:"Attributes"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["React will rename some of the component attributes. An example of this is the\n",(0,i.jsx)(n.code,{children:"className"}),"-attribute, which replaces the native HTML keyword ",(0,i.jsx)(n.code,{children:"class"}),". This is\ndone to prevent namespace clashes."]})}),"\n",(0,i.jsx)(n.h5,{id:"classname",children:"className"}),"\n",(0,i.jsxs)(n.p,{children:["A more detailed description of how we style our components will follow in the\nTailwind-section. The important concept is that we assign classes to each component,\nand these classes are then used as selectors to apply certain styles to the the component.\nClasses are assigned to the ",(0,i.jsx)(n.code,{children:"className"})," attribute as space-separated strings."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'\n Hi\n

    \n'})}),"\n",(0,i.jsxs)(n.p,{children:["We often make use of the ",(0,i.jsx)(n.code,{children:"twMerge"})," function. This function swallows all string arguments\nand returns a single class string. Importantly, classes added later may override those added\nbefore them, which is not the case when we do not use ",(0,i.jsx)(n.code,{children:"twMerge"}),". An example of this\nis seen in the followin code-block."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'\n'})}),"\n",(0,i.jsxs)(n.p,{children:["It is a good idea to use ",(0,i.jsx)(n.code,{children:"twMerge"})," wherever the class definition contains conditionals,\noverrides, or is so long that it would span multiple lines."]}),"\n",(0,i.jsx)(n.h5,{id:"pageprops",children:"PageProps"}),"\n",(0,i.jsx)(n.p,{children:"The highest-level components produced in the frontend are the pages. Remember\nthat a component is a function that returns HTML. The input of these functions\ncan be quite complex, especially for the highest-level components, which combine\na lot of data from different sources."}),"\n",(0,i.jsxs)(n.p,{children:["In the following example, we define an interface for the ",(0,i.jsx)(n.code,{children:"ListDID"})," page. Note\nthat input to the page is given in the form of a ",(0,i.jsx)(n.code,{children:"ViewModel"})," (",(0,i.jsx)(n.code,{children:"DIDViewModel"}),",\n",(0,i.jsx)(n.code,{children:"DIDMetaViewModel"}),"), while the functions are for the page to communicate to\ndeeper-lying components."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"export interface ListDIDPageProps {\n comdom: UseComDOM, // this ViewModel comes in a stream, more later.\n didQuery: (query: string, type: DIDType) => void,\n didMetaQuery: (scope: string, name: string) => void,\n didMetaQueryResponse: DIDMetaViewModel,\n}\n\nexport const ListDID = (\n props: ListDIDPageProps\n) => {\n // ...\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We do not want the frontend to handle any fetches or streams itself, hence the\nfunctions ",(0,i.jsx)(n.code,{children:"didQuery"})," and ",(0,i.jsx)(n.code,{children:"didMetaQuery"})," (which start a stream and query\nmetadata, respectively) are defined outside of the component and only passed to\nit. It also means that the page can be run even without a backend attached to\nit, we simply replace these functions with dummies (and the ViewModels with fake\ndata)."]}),"\n",(0,i.jsx)(n.h5,{id:"aria",children:"aria"}),"\n",(0,i.jsxs)(n.p,{children:["ARIA stands for ",(0,i.jsx)(n.a,{href:"https://www.w3.org/TR/html-aria/",children:"Accessible Rich Internet Applications"}),"\nand defines the standard for how to make a web application accessible to users that\nare somehow impaired. One way of making the website more accessible is the conscious inclusion of\nARIA-attributes."]}),"\n",(0,i.jsxs)(n.p,{children:["A simple but common example would be adding an ARIA-label to an element which would\notherwise only be described by an icon/glyph. Note that screen-readers give priority\nto semantic ",(0,i.jsx)(n.code,{children:"
    ComponentLead (+Deputies)Description
    Authentication & AuthorisationDimitrios Christidis, Mario LassnigClient-server authentication, Rucio tokens, auth methods (kerberos, ssh, userpass, OIDC, ...)
    ClientsMaggie Voetberg, Mario LassnigGeneral Python Clients and Command Line interface related development, rucio download, rucio upload; Specific component related client functionality is part of the other components
    Consistency checksFabio Luchetti, Guilherme LimaDark data detection daemon: Auditor
    Core & InternalsMartin Barisits, Mario LassnigCore functionality not specifically part of other components
    DatabaseDimitrios Xenakis, Mario Lassnig, Martin BarisitsDatabase (Compatibility and optimisation) and SQLAlchemy framework specific issues
    Dataset deletionAlexander Richards, Martin BarisitsDataset deletion daemon: Undertaker
    DeletionHugo Gonzalez Labrador, Cedric SerfonFile deletion daemon: Reaper
    DIRACCedric SerfonRucio integration with Dirac
    Docker & KubernetesRiccardo Di Maio, Mario Lassnig, Eric Vaandering, Hugo Gonzalez LabradorDocker & Kubernetes deployment
    DocumentationMartin Barisits, Maggie VoetbergGeneral documentation
    Jupyterlab extensionFrancesc Torradeflot, Enrique Garcia GarciaRucio Jupyterlab extension
    Life time modelDimitrios ChristidisLife time model processing and exceptions
    MessagingAlexander Richards, Mario LassnigMessaging daemon: Hermes, Creation of eMails and ActiveMQ messages
    MetadataRob Barnsley, Dimitrios XenakisMetadata workflows
    Monitoring & TracesMayank Sharma, Mario LassnigAll things internal monitoring and traces
    Multi VOTim NobleIssues and developments related to Rucio Multi VO mode
    PoliciesJames PerryAll things related to separate settings/config/policies into community specific things
    Probes & AlarmsDimitrios Christidis, Eric VaanderingProbes and alarms for Nagios
    ProtocolsMaggie Voetberg, Mario LassnigProtocols (Upload, Download, Deletion)
    RebalancingCedric SerfonData rebalancing daemon: BB8
    RecoveryCedric SerfonData recovery daemon: Necromancer and suspicious replica recovery
    Release managementMartin Barisits, Dimitrios ChristidisPackaging of new versions, package configuration
    ReplicasRiccardo Di Maio, Alexander RichardsReplicas related workflows (list_replicas, add_replica, ...)
    REST & APIMaggie Voetberg, Martin BarisitsWeb-Framework (Web.py & Flask)
    RulesRiccardo Di Maio, Martin BarisitsReplication rules and rule daemons: Judge
    SubscriptionsCedric SerfonSubscription daemon: Transmogrifier
    TestingMayank Sharma, Riccardo Di MaioRegression and Unit tests, automatic tests of submissions
    TransfersRiccardo Di Maio, Hugo Gonzalez LabradorTransfer daemons: conveyor and functional transfer tests
    WebUIMayank Sharma, Eraldo Silva JuniorWeb user interface: Rucio Web UI
    +
    ComponentLead (+Deputies)Description
    Authentication & AuthorisationDimitrios Christidis, Mario LassnigClient-server authentication, Rucio tokens, auth methods (kerberos, ssh, userpass, OIDC, ...)
    ClientsMaggie Voetberg, Mario LassnigGeneral Python Clients and Command Line interface related development, rucio download, rucio upload; Specific component related client functionality is part of the other components
    Consistency checksFabio Luchetti, Guilherme LimaDark data detection daemon: Auditor
    Core & InternalsMartin Barisits, Mario LassnigCore functionality not specifically part of other components
    DatabaseDimitrios Xenakis, Mario Lassnig, Martin BarisitsDatabase (Compatibility and optimisation) and SQLAlchemy framework specific issues
    Dataset deletionAlexander Richards, Martin BarisitsDataset deletion daemon: Undertaker
    DeletionHugo Gonzalez Labrador, Cedric SerfonFile deletion daemon: Reaper
    DIRACCedric SerfonRucio integration with Dirac
    Docker & KubernetesRiccardo Di Maio, Mario Lassnig, Eric Vaandering, Hugo Gonzalez LabradorDocker & Kubernetes deployment
    DocumentationMartin Barisits, Maggie VoetbergGeneral documentation
    Jupyterlab extensionFrancesc Torradeflot, Enrique Garcia GarciaRucio Jupyterlab extension
    Life time modelDimitrios ChristidisLife time model processing and exceptions
    MessagingAlexander Richards, Mario LassnigMessaging daemon: Hermes, Creation of eMails and ActiveMQ messages
    MetadataRob Barnsley, Dimitrios XenakisMetadata workflows
    Monitoring & TracesMayank Sharma, Mario LassnigAll things internal monitoring and traces
    Multi VOTim NobleIssues and developments related to Rucio Multi VO mode
    PoliciesJames PerryAll things related to separate settings/config/policies into community specific things
    Probes & AlarmsDimitrios Christidis, Eric VaanderingProbes and alarms for Nagios
    ProtocolsMaggie Voetberg, Mario LassnigProtocols (Upload, Download, Deletion)
    RebalancingCedric SerfonData rebalancing daemon: BB8
    RecoveryCedric SerfonData recovery daemon: Necromancer and suspicious replica recovery
    Release managementMartin Barisits, Dimitrios ChristidisPackaging of new versions, package configuration
    ReplicasRiccardo Di Maio, Alexander RichardsReplicas related workflows (list_replicas, add_replica, ...)
    REST & APIMaggie Voetberg, Martin BarisitsWeb-Framework (Web.py & Flask)
    RulesRiccardo Di Maio, Martin BarisitsReplication rules and rule daemons: Judge
    SubscriptionsCedric SerfonSubscription daemon: Transmogrifier
    TestingMayank Sharma, Riccardo Di MaioRegression and Unit tests, automatic tests of submissions
    TransfersRiccardo Di Maio, Hugo Gonzalez LabradorTransfer daemons: conveyor and functional transfer tests
    WebUIMayank Sharma, Eraldo Silva JuniorWeb user interface: Rucio Web UI
    \ No newline at end of file diff --git a/contact_us/index.html b/contact_us/index.html index 2a031a72bb..70346864be 100644 --- a/contact_us/index.html +++ b/contact_us/index.html @@ -9,8 +9,8 @@ - - + +

    Contact us

    We know getting started can be difficult, which is why @@ -36,6 +36,6 @@

    Email usemail

    Social Media

    Follow us on Mastodon to stay updated -with the latest on Rucio!

    +with the latest on Rucio!

    \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html index 5f4db55efa..56cf89e220 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -9,8 +9,8 @@ - - + + +

    A more indepth set of coding style guidelines can be found here.

    \ No newline at end of file diff --git a/developer/dependency_management/index.html b/developer/dependency_management/index.html index d214a0704a..00c55bc6bc 100644 --- a/developer/dependency_management/index.html +++ b/developer/dependency_management/index.html @@ -9,8 +9,8 @@ - - + + +Because of this, client dependencies are left unpinned unless necessary.

    \ No newline at end of file diff --git a/developer/dev_style_guide/index.html b/developer/dev_style_guide/index.html index af198cae28..8bb8205e14 100644 --- a/developer/dev_style_guide/index.html +++ b/developer/dev_style_guide/index.html @@ -9,8 +9,8 @@ - - + +

    TL;DR - Install the provided pre-commits, follow their recommendations

    @@ -88,6 +88,6 @@

    GitHub Actions

    These checks can also be run locally using

    tools/count_missing_type_annotations_utils.sh
    tools/run_pyright.sh generate {report_output_path.json}

    The first action will raise an error if your commits introduce more un-annotated types than it solves, -and the second ensures the added types are consistent with the rest of the codebase.

    +and the second ensures the added types are consistent with the rest of the codebase.

    \ No newline at end of file diff --git a/developer/project_structure/index.html b/developer/project_structure/index.html index 68fd63da97..4b5d0a1eeb 100644 --- a/developer/project_structure/index.html +++ b/developer/project_structure/index.html @@ -9,8 +9,8 @@ - - + +

    Project Structure

    The Rucio code structure is broken into multiple modules, to allow it to be grouped into packages without requiring code duplication. @@ -58,6 +58,6 @@

    TestsTests contains utilities for testing.

    Transfertool

    Similar to RSE, transfertool contains protocols for executing file transfers. -It can include calls to core, as transfer protocols sit server side.

    +It can include calls to core, as transfer protocols sit server side.

    \ No newline at end of file diff --git a/developer/rest_api_doc/index.html b/developer/rest_api_doc/index.html index 9a2d1ae760..d88cd7658e 100644 --- a/developer/rest_api_doc/index.html +++ b/developer/rest_api_doc/index.html @@ -9,8 +9,8 @@ - - + + +input validation.

    \ No newline at end of file diff --git a/developer/setting_up_intellij_dev_env/index.html b/developer/setting_up_intellij_dev_env/index.html index fa6b831784..3ca52e622f 100644 --- a/developer/setting_up_intellij_dev_env/index.html +++ b/developer/setting_up_intellij_dev_env/index.html @@ -9,8 +9,8 @@ - - + + +

    This will allow to debug the code on server side.

    \ No newline at end of file diff --git a/developer/setting_up_mac_apple_silicon/index.html b/developer/setting_up_mac_apple_silicon/index.html index 15ed4da0d2..22aaf09887 100644 --- a/developer/setting_up_mac_apple_silicon/index.html +++ b/developer/setting_up_mac_apple_silicon/index.html @@ -9,8 +9,8 @@ - - + +

    Setting up a Rucio Developer environment on Mac with Apple Silicon

    Setting up a Rucio Developer environment on Mac with Apple Silicon

    @@ -29,6 +29,6 @@

    Docker en

    Set Docker default platform to linux/amd64:

        export DOCKER_DEFAULT_PLATFORM=linux/amd64

    Or run it as part of the command a single time:

    -
        DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f <docker-compose-file.yml>

    +
        DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f <docker-compose-file.yml>
    \ No newline at end of file diff --git a/developer/setting_up_vscode_dev_env/index.html b/developer/setting_up_vscode_dev_env/index.html index 737030c3f3..466fb8c109 100644 --- a/developer/setting_up_vscode_dev_env/index.html +++ b/developer/setting_up_vscode_dev_env/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/developer/type_annotation_guide/index.html b/developer/type_annotation_guide/index.html index 76471dacf1..fbf4d6a766 100644 --- a/developer/type_annotation_guide/index.html +++ b/developer/type_annotation_guide/index.html @@ -9,8 +9,8 @@ - - + +

    Type Annotation Guide

    The purpose of this document is to collaboratively create the developer @@ -264,6 +264,6 @@

    Best Practice

    Common Types

    To ensure a consistent use of type annotations in Rucio, here is a list of common variables with their corresponding type:

    -
    Code sectionVariableTypeDescription
    *sessionsqlalchemy.orm.session.SessionThe sqlalchemy session.
    DIDscopestrThe scope of a DID.
    DIDnamestrThe name of a DID.
    DIDaccountstrThe account name.
    DIDdid_typestrThe DID type.
    +
    Code sectionVariableTypeDescription
    *sessionsqlalchemy.orm.session.SessionThe sqlalchemy session.
    DIDscopestrThe scope of a DID.
    DIDnamestrThe name of a DID.
    DIDaccountstrThe account name.
    DIDdid_typestrThe DID type.
    \ No newline at end of file diff --git a/developer/webui/streamedtables/index.html b/developer/webui/streamedtables/index.html index 353939f6bf..4c5e8ce8b3 100644 --- a/developer/webui/streamedtables/index.html +++ b/developer/webui/streamedtables/index.html @@ -9,8 +9,8 @@ - - + +
    +
    'use client';
    import { ListSubscription as ListSubscriptionStory } from "@/component-library/Pages/Subscriptions/ListSubscription";
    import { useEffect } from "react";
    import useComDOM from "@/lib/infrastructure/hooks/useComDOM";
    import { SubscriptionRuleStatesViewModel } from "@/lib/infrastructure/data/view-model/subscriptions";

    export default function ListSubscription({ params }: { params: { account: string }}) {
    // initialise ComDOM
    const ComDOM = useComDOM<SubscriptionRuleStatesViewModel>(
    "subscription-rule-states-query",
    [],
    false,
    Infinity,
    50,
    true
    )
    // auto-start query, GET data from /api/list-subscription, use param account
    useEffect(() => {
    const runQuery = async () => {
    await ComDOM.start({
    url: new URL("http://localhost:3000/api/list-subscription"),
    method: "GET",
    headers: new Headers({
    'Content-Type': 'application/json'
    } as HeadersInit),
    params: {
    "account": params.account,
    }
    })
    }
    runQuery()
    }, [])
    // * return a react component
    // * in this case the StreamedTable is wrapped by a Storybook Page
    // * we pass the ComDOM to this page so that it may be passed further down
    // to the StreamedTable
    return (
    <div>
    <ListSubscriptionStory
    accountname={params.account}
    comdom={ComDOM}
    />
    </div>
    )
    }
    \ No newline at end of file diff --git a/developer/webui/webui_frontend/index.html b/developer/webui/webui_frontend/index.html index 34367d18ef..be08fdbb04 100644 --- a/developer/webui/webui_frontend/index.html +++ b/developer/webui/webui_frontend/index.html @@ -9,8 +9,8 @@ - - + +
    +Errors for the time being.

    \ No newline at end of file diff --git a/developer/webui/webui_frontend_vscode_dev_env/index.html b/developer/webui/webui_frontend_vscode_dev_env/index.html index 1c237c1446..d49d438bc4 100644 --- a/developer/webui/webui_frontend_vscode_dev_env/index.html +++ b/developer/webui/webui_frontend_vscode_dev_env/index.html @@ -9,8 +9,8 @@ - - + + +secret/ account root under the VO Default.

    \ No newline at end of file diff --git a/html/rest_api_doc.html b/html/rest_api_doc.html index 0d10b8df73..3c85891911 100644 --- a/html/rest_api_doc.html +++ b/html/rest_api_doc.html @@ -426,7 +426,7 @@ -
    Error handling " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string"
    }

    List identities

    Lists all identities for an account.

    -
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/accounts/{account}/identities \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • [
      ]
    ]

    Create identity

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string"
    }

    Create identity

    Grant an account identity access to an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    @@ -720,7 +706,21 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Account not found

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string",
    • "email": "string",
    • "password": "none",
    • "default": false
    }

    Response samples

    Content type
    application/json
    "Created"

    List rules

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string",
    • "email": "string",
    • "password": "none",
    • "default": false
    }

    Response samples

    Content type
    application/json
    "Created"

    List identities

    Lists all identities for an account.

    +
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/accounts/{account}/identities \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • [
      ]
    ]

    List rules

    Lists all rules for an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    @@ -808,21 +808,7 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    { }

    List account parameters

    Lists all parameters for an account.

    -
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/accounts/{account} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "account": "string",
    • "account_type": "string",
    • "status": "string",
    • "email": "string",
    • "suspended_at": "string",
    • "deleted_at": "string"
    }

    Create

    Request samples

    Content type
    application/json
    { }

    Create

    Create an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    @@ -838,7 +824,21 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    {
    • "type": "USER",
    • "email": "string"
    }

    Response samples

    Content type
    application/json
    "Created"

    List

    Request samples

    Content type
    application/json
    {
    • "type": "USER",
    • "email": "string"
    }

    Response samples

    Content type
    application/json
    "Created"

    List account parameters

    Lists all parameters for an account.

    +
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/accounts/{account} \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "account": "string",
    • "account_type": "string",
    • "status": "string",
    • "email": "string",
    • "suspended_at": "string",
    • "deleted_at": "string"
    }

    List

    List all accounts.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/accounts \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Auth

    UserPass Allow cross-site scripting

    UserPass Allow cross-site scripting. Explicit for Authentication.

    -
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/userpass \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    UserPass

    --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Auth

    UserPass

    Authenticate a Rucio account temporarily via username and password.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string

    Account identifier as a string.

    @@ -872,42 +864,42 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Partial content containing X-Rucio-Auth-Accounts header

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/userpass \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \
       --header 'X-Rucio-Password: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Username: SOME_STRING_VALUE'

    GSS Allow cross-site scripting

    GSS Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Username: SOME_STRING_VALUE'

    UserPass Allow cross-site scripting

    UserPass Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/gss \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    GSS

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/userpass \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    GSS

    Authenticate a Rucio account via GSS.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    REMOTE_USER
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/gss \
       --header 'REMOTE_USER: SOME_STRING_VALUE' \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509 Allow cross-site scripting

    x509 Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    GSS Allow cross-site scripting

    GSS Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/x509 \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/gss \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509

    Authenticate a Rucio account via x509.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string
    X-Rucio-Allow-Return-Multiple-Accounts
    boolean

    If set to true, a HTTP 206 response will be returned if the identity is associated with multiple accounts.

    @@ -917,104 +909,104 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Partial content containing X-Rucio-Auth-Accounts header

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/x509 \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-Allow-Return-Multiple-Accounts: SOME_BOOLEAN_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSH Allow cross-site scripting

    SSH Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509 Allow cross-site scripting

    x509 Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/ssh \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSH

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/x509 \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSH

    Authenticate a Rucio account via SSH.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-SSH-Signature
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/ssh \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \
    -  --header 'X-Rucio-SSH-Signature: SOME_STRING_VALUE'

    SSHChallengeToken Allow cross-site scripting

    SSHChallengeToken Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-SSH-Signature: SOME_STRING_VALUE'

    SSH Allow cross-site scripting

    SSH Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/ssh_challenge_token \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSHChallengeToken

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/ssh \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSHChallengeToken

    Authenticate a Rucio account via SSHChallengeToken.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/ssh_challenge_token \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML Allow cross-site scripting

    SAML Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSHChallengeToken Allow cross-site scripting

    SSHChallengeToken Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/saml \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/ssh_challenge_token \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML

    Authenticate a Rucio account via SAML.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/saml \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Post a SAML request

    --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Post a SAML request

    Post a SAML request

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request POST \
    +

    Request samples

    curl --request POST \
       --url http://undefinedundefined/auth/saml \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate Allow cross-site scripting

    Validate Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML Allow cross-site scripting

    SAML Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/validate \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/saml \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate

    Validate a Rucio auth token.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/validate \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC Allow cross-site scripting

    OIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate Allow cross-site scripting

    Validate Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/validate \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC

    Authenticate a Rucio account via OIDC.

    Authorizations:
    AuthToken
    header Parameters
    HTTP_X_RUCIO_ACCOUNT
    string

    Account identifier as a string.

    @@ -1022,7 +1014,7 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    OK

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc \
       --header 'HTTP_X_RUCIO_ACCOUNT: SOME_STRING_VALUE' \
       --header 'HTTP_X_RUCIO_CLIENT_AUTHORIZE_AUDIENCE: SOME_STRING_VALUE' \
    @@ -1032,49 +1024,49 @@ 

    Error handling

    --header 'HTTP_X_RUCIO_CLIENT_AUTHORIZE_REFRESH_LIFETIME: SOME_STRING_VALUE' \ --header 'HTTP_X_RUCIO_CLIENT_AUTHORIZE_SCOPE: SOME_STRING_VALUE' \ --header 'X-Forwarded-For: SOME_STRING_VALUE' \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC Allow cross-site scripting

    TokenOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC Allow cross-site scripting

    OIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_token \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC

    Authenticate a Rucio account via TokenOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_token \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC Allow cross-site scripting

    CodeOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC Allow cross-site scripting

    TokenOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_code \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_token \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC

    Authenticate a Rucio account via CodeOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_code \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RedirectOIDC Allow cross-site scripting

    RedirectOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC Allow cross-site scripting

    CodeOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_redirect \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RedirectOIDC

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_code \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RedirectOIDC

    Authenticate a Rucio account via RedirectOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Client-Fetch-Token
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_redirect \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \
    -  --header 'X-Rucio-Client-Fetch-Token: SOME_STRING_VALUE'

    RefreshOIDC Allow cross-site scripting

    RefreshOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Client-Fetch-Token: SOME_STRING_VALUE'

    RedirectOIDC Allow cross-site scripting

    RedirectOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_refresh \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RefreshOIDC

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_redirect \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RefreshOIDC

    Authenticate a Rucio account via RefreshOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-Auth-Token
    required
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_refresh \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RefreshOIDC Allow cross-site scripting

    RefreshOIDC Allow cross-site scripting. Explicit for Authentication.

    +
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_refresh \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Config

    Create value

    Create or set the value of an option.

    Authorizations:
    AuthToken
    path Parameters
    section
    required
    string
    Error handling " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    { }

    Response samples

    Content type
    application/json
    "Created"

    Credentials

    Cross-Site Scripting

    Allow cross-site scripting. Explicit for Authentication.

    -
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/credentials/signurl \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Sign URL

    Request samples

    Content type
    application/json
    { }

    Response samples

    Content type
    application/json
    "Created"

    Credentials

    Sign URL

    Sign a url for a limited lifetime for a particular srevice.

    Authorizations:
    AuthToken
    query Parameters
    rse
    required
    string

    The RSE to authenticate against.

    @@ -1214,9 +1206,17 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url 'http://undefinedundefined/credentials/signurl?rse=SOME_STRING_VALUE&lifetime=SOME_STRING_VALUE&svc=SOME_STRING_VALUE&op=SOME_STRING_VALUE&url=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Data Identifiers

    Get Data Identifier

    --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Cross-Site Scripting

    Allow cross-site scripting. Explicit for Authentication.

    +
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/credentials/signurl \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Data Identifiers

    Get Data Identifier

    Return all data identifiers in the given scope.

    Authorizations:
    AuthToken
    path Parameters
    scope
    required
    string

    The scope.

    @@ -1344,21 +1344,7 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    {
    • "dids": [
      ]
    }

    Get did

    Returns the contents of a data identifier.

    -
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/dids/{scope_name}/dids \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Add dids to did

    Request samples

    Content type
    application/json
    {
    • "dids": [
      ]
    }

    Add dids to did

    Append data identifiers to data identifiers.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    @@ -1378,7 +1364,21 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Not acceptable

    Request samples

    Content type
    application/json
    {
    • "rse": "string",
    • "account": "string",
    • "dids": {
      }
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete metadata

    Request samples

    Content type
    application/json
    {
    • "rse": "string",
    • "account": "string",
    • "dids": {
      }
    }

    Response samples

    Content type
    application/json
    "Created"

    Get did

    Returns the contents of a data identifier.

    +
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/dids/{scope_name}/dids \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Delete metadata

    Deletes the specified metadata from the did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    @@ -1398,7 +1398,23 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Feature is not in current database.

    Request samples

    curl --request DELETE \
       --url 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Get metadata

    --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Add metadata

    Add metadata to a did.

    +
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    +
    Request Body schema: application/json
    meta
    required
    object

    The metadata to add. A dictionary containing the metadata name as key and the value as value.

    +
    recursive
    boolean
    Default: false

    Flag if the metadata should be applied recirsively to children.

    +

    Responses

    Request samples

    Content type
    application/json
    {
    • "meta": { },
    • "recursive": false
    }

    Response samples

    Content type
    application/json
    "Created"

    Get metadata

    Get the metadata of a did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    @@ -1414,25 +1430,9 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Did not found

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    { }

    Add metadata

    Add metadata to a did.

    -
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    -
    Request Body schema: application/json
    meta
    required
    object

    The metadata to add. A dictionary containing the metadata name as key and the value as value.

    -
    recursive
    boolean
    Default: false

    Flag if the metadata should be applied recirsively to children.

    -

    Responses

    Request samples

    Content type
    application/json
    {
    • "meta": { },
    • "recursive": false
    }

    Response samples

    Content type
    application/json
    "Created"

    Add metadata

    --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    { }

    Add metadata

    Add metadata to a did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    @@ -1522,23 +1522,7 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Not found

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Get followers

    Get all followers for a specific did.

    -
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/dids/{scope_name}/follow \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Post follow

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Post follow

    Mark the input DID as being followed by the given account.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    @@ -1554,7 +1538,23 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Not found

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Add Dids bulk

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Get followers

    Get all followers for a specific did.

    +
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/dids/{scope_name}/follow \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Add Dids bulk

    Add new Dids in bulk.

    Authorizations:
    AuthToken
    Request Body schema: application/json
    Array
    scope
    required
    string

    The did scope.

    @@ -2419,7 +2419,23 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Not acceptable

    Request samples

    curl --request GET \
       --url 'http://undefinedundefined/subscriptions/{account}/{name}/rules?state=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • null
    ]

    Update subscription

    --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • null
    ]

    Get Subscription

    Retrieve a subscription.

    +
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    +
    name
    required
    string

    The subscription name.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/subscriptions/{account}/{name} \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Update subscription

    Update an existing subscription.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    @@ -2435,23 +2451,7 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Get Subscription

    Retrieve a subscription.

    -
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    -
    name
    required
    string

    The subscription name.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/subscriptions/{account}/{name} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Create subscription

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Create subscription

    Create a new subscription

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    @@ -2645,13 +2645,17 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Rse not found

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Get Rse Distances

    Returns the distances between a source and destination rse.

    +

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Create Rse Distance

    Post a rse distance.

    Authorizations:
    AuthToken
    path Parameters
    source
    required
    string

    The name of the source Rucio Storage Element.

    destination
    required
    string

    The name of the destination Rucio Storage Element.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/rses/{source}/distances/{destination} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Create Rse Distance

    Post a rse distance.

    +

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Get Rse Distances

    Returns the distances between a source and destination rse.

    Authorizations:
    AuthToken
    path Parameters
    source
    required
    string

    The name of the source Rucio Storage Element.

    destination
    required
    string

    The name of the destination Rucio Storage Element.

    -
    Request Body schema: application/json
    distance
    integer

    The distance between RSEs.

    -
    ranking
    integer
    Deprecated

    Same as distance.

    -

    Responses

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete Protocol Attributes

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/rses/{source}/distances/{destination} \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Delete Protocol Attributes

    Delete all protocol attributes.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    @@ -2947,21 +2947,7 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    Invalid Auth Token

    Request samples

    Content type
    application/json
    {
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true,
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "time_zone": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Get RSE

    Get details about a specific RSE.

    -
    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/rses/{rse} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": 0,
    • "availability_write": 0,
    • "availability_delete": null
    }

    Create RSE

    Request samples

    Content type
    application/json
    {
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true,
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "time_zone": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Create RSE

    Creates a RSE with all the metadata.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    @@ -3009,7 +2995,21 @@

    Error handling

    " class="sc-epnzzT sc-eMwmJz drsioI dWZUhK sc-drVZOg jtjIAv">

    RSE not found

    Request samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true
    }

    Response samples

    Content type
    application/json
    "Created"

    List RSEs

    Request samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true
    }

    Response samples

    Content type
    application/json
    "Created"

    Get RSE

    Get details about a specific RSE.

    +
    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/rses/{rse} \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": 0,
    • "availability_write": 0,
    • "availability_delete": null
    }

    List RSEs

    Lists all RSEs.

    Authorizations:
    AuthToken
    query Parameters
    expression
    string

    RSE expression to select RSEs.

    @@ -3249,7 +3249,7 @@

    Error handling

    --url http://undefinedundefined/scopes/{account}/scopes \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • "string"
    ]
    - - + +
    +
    \ No newline at end of file diff --git a/join_rucio_mattermost/index.html b/join_rucio_mattermost/index.html index 02aaa161f8..5cdfab3a13 100644 --- a/join_rucio_mattermost/index.html +++ b/join_rucio_mattermost/index.html @@ -9,8 +9,8 @@ - - + +

    How to join Rucio mattermost

    We have a dedicated Mattermost Workspace where developers, administrators, and @@ -32,6 +32,6 @@

    Open https://mattermost.web.cern.ch/rucio/ in your browser or with a mattermost client application.

    -

    +
    \ No newline at end of file diff --git a/operator/administration/index.html b/operator/administration/index.html index d6a455be6b..e2f29c4edb 100644 --- a/operator/administration/index.html +++ b/operator/administration/index.html @@ -9,8 +9,8 @@ - - + +
    +
        secretMounts:
    - secretFullName: hotfix-conveyor-poller-patch
    mountPath: /patch/hotfix_conveyor_poller.patch
    subPath: hotfix_conveyor_poller.patch
    \ No newline at end of file diff --git a/operator/configuration/index.html b/operator/configuration/index.html index b773e83ad2..b56e8a857c 100644 --- a/operator/configuration/index.html +++ b/operator/configuration/index.html @@ -9,8 +9,8 @@ - - + +
    +
      $ rucio-admin account set-limits jdoe SITE3_DISK 10000000000000
    Set account limit for account jdoe on SITE3_DISK: 10.000 TB
    $ rucio-admin account get-limits jdoe SITE3_DISK
    Quota on SITE3_DISK for jdoe : 10 TB
    \ No newline at end of file diff --git a/operator/configuration_parameters/index.html b/operator/configuration_parameters/index.html index fa16253f21..5377a0d4eb 100644 --- a/operator/configuration_parameters/index.html +++ b/operator/configuration_parameters/index.html @@ -9,8 +9,8 @@ - - + +

    Configuration parameters

    Description of the configuration parameters splitted in three different places: @@ -720,6 +720,6 @@

    RSE attribute
  • tier: Datacenter TIER. Integer (from 1 to 4). No default.
  • type: Values: {LOCALGROUPDISK, LOCALGROUPTAPE, GROUPDISK, SCRATCHDISK, MOCK, TEST, DATADISK}. Default: .
  • verify_checksum: Boolean. No default.
  • -

    +
    \ No newline at end of file diff --git a/operator/database/index.html b/operator/database/index.html index 350510bffb..de8e234e78 100644 --- a/operator/database/index.html +++ b/operator/database/index.html @@ -9,8 +9,8 @@ - - + + +3

    \ No newline at end of file diff --git a/operator/did_meta/index.html b/operator/did_meta/index.html index 25b7bd2158..962a0eac74 100644 --- a/operator/did_meta/index.html +++ b/operator/did_meta/index.html @@ -9,8 +9,8 @@ - - + +

    DID Metadata

    Rucio supports adding Metadata on the dids.

    @@ -36,6 +36,6 @@

    get_metadata(scope, name, session=None)
    """
    Returns metadata stored in Plugin for given scope:name
    """

    set_metadata(scope, name, key, value, recursive, session=None)
    """
    Sets the metadata in Plugin for given scope:name
    """

    delete_metadata(scope, name, key, session=None)
    """
    Removes the metadata from the Plugin for given scope:name
    """

    list_dids(scope, filters, type='collection', ignore_case=False, limit=None, \
    offset=None, long=False, recursive=False, session=None)
    """
    Returns a list of dids for given filters.
    For long = True return should be a list of dictionaries having the keys 'scope',
    'name', 'did_type', 'bytes', 'length'.
    For long = False return should be a list of strings containing the did names.
    """

    manages_key(key, session=None)
    """
    Returns if Plugin is willing to manage metadata with given KEY.
    Some Plugins might decide to accept only specific hardcoded keys, others might match
    against a particular regex while other might accept all possible keys.
    """

    How to configure which metadata plugin to use

    Configuration options for Metadata are:

    -
    [metadata]
    # plugins = list_of_plugins,comma_separated
    plugins = rucio.core.did_meta_plugins.did_column_meta.DidColumnMeta,escape.rucio.did_meta_plugin
    +
    [metadata]
    # plugins = list_of_plugins,comma_separated
    plugins = rucio.core.did_meta_plugins.did_column_meta.DidColumnMeta,escape.rucio.did_meta_plugin
    \ No newline at end of file diff --git a/operator/installing_daemons/index.html b/operator/installing_daemons/index.html index 19569f40ff..35b07d8d92 100644 --- a/operator/installing_daemons/index.html +++ b/operator/installing_daemons/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/operator/installing_server/index.html b/operator/installing_server/index.html index 4b0420978f..e82053350d 100644 --- a/operator/installing_server/index.html +++ b/operator/installing_server/index.html @@ -9,8 +9,8 @@ - - + +
    +
    \ No newline at end of file diff --git a/operator/k8s_guide/index.html b/operator/k8s_guide/index.html index 5df7a4ff3e..4086d401ec 100644 --- a/operator/k8s_guide/index.html +++ b/operator/k8s_guide/index.html @@ -9,8 +9,8 @@ - - + +
    +
    rucio add-dataset test:dataset3
    rucio attach test:dataset3 test:file4
    \ No newline at end of file diff --git a/operator/kubernetes/index.html b/operator/kubernetes/index.html index 76c02ecd60..1749b427f9 100644 --- a/operator/kubernetes/index.html +++ b/operator/kubernetes/index.html @@ -9,8 +9,8 @@ - - + +

    Setting up Rucio on Kubernetes

    Helm charts

    @@ -47,6 +47,6 @@

    Upgra
    cat alembic.ini | kubectl exec -i rucio-server-<pod identifier> --container rucio-server -- tee /tmp/alembic.ini

    Open a bash prompt on the pod

    kubectl exec rucio-server-<pod identifier> --container rucio-server -it -- bash
    -

    Then perform the upgrade with the Alembic tool as described in the database documentation

    +

    Then perform the upgrade with the Alembic tool as described in the database documentation

    \ No newline at end of file diff --git a/operator/monitoring/index.html b/operator/monitoring/index.html index e8916e2736..7859d90982 100644 --- a/operator/monitoring/index.html +++ b/operator/monitoring/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/operator/multi_vo_rucio/index.html b/operator/multi_vo_rucio/index.html index 18229e54b0..05f73af358 100644 --- a/operator/multi_vo_rucio/index.html +++ b/operator/multi_vo_rucio/index.html @@ -9,8 +9,8 @@ - - + + +
    $ python
    >>> from rucio.common.types import InternalAccount
    >>> from rucio.core.account import del_account
    >>> del_account(InternalAccount('super_root', vo='def'))
    \ No newline at end of file diff --git a/operator/notifications/index.html b/operator/notifications/index.html index 7d5bcb16d3..05095fb34b 100644 --- a/operator/notifications/index.html +++ b/operator/notifications/index.html @@ -9,8 +9,8 @@ - - + +

    Notifications

    Notifications

    @@ -18,6 +18,6 @@ These notifications are primarily useful to other systems for synchronisation purposes, e.g., notifying a workflow management system that a dataset has finished transferring or has been deleted.

    Rucio Notifications

    The events generated by Rucio are categorized into different event types. Each event type has a different payload.

    -
    ContextEvent TypePayload example
    While adding a DID, if the DID type is a ContainerCREATE_CNT{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    While adding a DID, if the DID type is a DataSetCREATE_DTS{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    Submit transfer requests on destination RSEs for data identifiers.transfer_status{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}
    Schedule removal of the entry from the DIDs tableINCOMPLETE-
    Delete empty DIDs where the DIDType is DATASETERASE{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}
    When the replication rule transitioning into OK_STATE for DIDs which are closedRULE_OK{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    For replication replication rule, for each 10% of progressRULE_PROGRESS{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    When the replication rule transitioning into OK_STATE for each DATASET covered by the ruleDATASETLOCK_OK{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}
    When a transfer has been completedtransfer-done{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a transfer has been failtransfer-failed{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been successfuldeletion-done{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been faildeletion-failed{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    +
    ContextEvent TypePayload example
    While adding a DID, if the DID type is a ContainerCREATE_CNT{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    While adding a DID, if the DID type is a DataSetCREATE_DTS{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    Submit transfer requests on destination RSEs for data identifiers.transfer_status{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}
    Schedule removal of the entry from the DIDs tableINCOMPLETE-
    Delete empty DIDs where the DIDType is DATASETERASE{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}
    When the replication rule transitioning into OK_STATE for DIDs which are closedRULE_OK{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    For replication replication rule, for each 10% of progressRULE_PROGRESS{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    When the replication rule transitioning into OK_STATE for each DATASET covered by the ruleDATASETLOCK_OK{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}
    When a transfer has been completedtransfer-done{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a transfer has been failtransfer-failed{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been successfuldeletion-done{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been faildeletion-failed{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    \ No newline at end of file diff --git a/operator/policy_packages/index.html b/operator/policy_packages/index.html index 767379ca26..0866d25576 100644 --- a/operator/policy_packages/index.html +++ b/operator/policy_packages/index.html @@ -9,8 +9,8 @@ - - + +
    +
    config:
    policy:
    package: packagename
    \ No newline at end of file diff --git a/operator/qos_rse_config/index.html b/operator/qos_rse_config/index.html index cf37fa14a7..cfd8236ae4 100644 --- a/operator/qos_rse_config/index.html +++ b/operator/qos_rse_config/index.html @@ -9,8 +9,8 @@ - - + +
    +
                                    .
    .
    Settings:
    =========
    rse: <RSE>
    rse_type: DISK
    .
    .
    \ No newline at end of file diff --git a/operator/s3_rse_config/index.html b/operator/s3_rse_config/index.html index 219b2afbaf..5d6cc89992 100644 --- a/operator/s3_rse_config/index.html +++ b/operator/s3_rse_config/index.html @@ -9,8 +9,8 @@ - - + +

    S3 Storage Configuration

    S3 Storage Configuration (FTS3 & GFAL2)

    @@ -74,6 +74,6 @@

    Rucio S
  • When the conveyor-submitter daemon submits a transfer to FTS3, it does not pre-sign the URL but it depends on the FTS3 server to do so (Step 5 of the configuration in the previous section), in this case the proper scheme to use for the protocol is s3s://, Rucio will automatically translate https -> s3s in order to submit the transfer properly. The approach of not pre-signing the URL is necessary since those URLs have an expiration time and there is no guarantee of when the FTS3 transfer will really happen. This way, FTS3 signs the URL just before the transfer actually starts.

  • -

    +
    \ No newline at end of file diff --git a/operator/setting_up_demo/index.html b/operator/setting_up_demo/index.html index a3703d8197..8e1323cbce 100644 --- a/operator/setting_up_demo/index.html +++ b/operator/setting_up_demo/index.html @@ -9,8 +9,8 @@ - - + +

    Setting up a Rucio demo environment

    Prerequisites

    @@ -203,6 +203,6 @@

    rucio rule-info 1aadd685d891400dba050ad43e71fea9|grep Locks
    Locks OK/REPLICATING/STUCK: 4/0/0**

    And if we look at the replicas of the dataset, we see the there are replicas of the files also in XRD3:

    -
    $ rucio list-file-replicas test:mynewdataset
    +-------+-------+-----------+----------+-----------------------------------+
    | SCOPE | NAME | FILESIZE | ADLER32 | RSE: REPLICA |
    |-------|-------|-----------|----------|-----------------------------------|
    | test | file1 | 10.486 MB | 141a641e | XRD3: root://xrd3:1096//rucio/... |
    | test | file1 | 10.486 MB | 141a641e | XRD1: root://xrd1:1094//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD3: root://xrd3:1096//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD1: root://xrd1:1094//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD2: root://xrd2:1095//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD3: root://xrd3:1096//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD2: root://xrd2:1095//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD3: root://xrd3:1096//rucio/... |
    +-------+-------+-----------+----------+-----------------------------------+
    +
    $ rucio list-file-replicas test:mynewdataset
    +-------+-------+-----------+----------+-----------------------------------+
    | SCOPE | NAME | FILESIZE | ADLER32 | RSE: REPLICA |
    |-------|-------|-----------|----------|-----------------------------------|
    | test | file1 | 10.486 MB | 141a641e | XRD3: root://xrd3:1096//rucio/... |
    | test | file1 | 10.486 MB | 141a641e | XRD1: root://xrd1:1094//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD3: root://xrd3:1096//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD1: root://xrd1:1094//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD2: root://xrd2:1095//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD3: root://xrd3:1096//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD2: root://xrd2:1095//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD3: root://xrd3:1096//rucio/... |
    +-------+-------+-----------+----------+-----------------------------------+
    \ No newline at end of file diff --git a/operator/transfers/configure-rucio-fts3-plugins/index.html b/operator/transfers/configure-rucio-fts3-plugins/index.html index 9d7fc3ffa7..745069fe20 100644 --- a/operator/transfers/configure-rucio-fts3-plugins/index.html +++ b/operator/transfers/configure-rucio-fts3-plugins/index.html @@ -9,8 +9,8 @@ - - + +

    Configure A Tool to Determine Rules For FTS3 Tape Transfers

    Rucio includes functionality to pass instructions to FTS3 that describe how the transfer should be concluded @@ -64,6 +64,6 @@

    Tape Colloc

    If the collocation wrapper is used, this format is verified and put into the collocation_hints field of the transfer parameters. This is done below, where find_level_hints is an arbitrary function written for an experiment's needs:

    -
    from rucio.transfertool.fts3_plugins import FTS3TapeMetadataPlugin

    class ExperimentCollocationFTSPlugins(FTS3TapeMetadataPlugin):
    def __init__(self, policy_algorithm="def"):
    super().__init__(policy_algorithm)
    self.register(
    "policy_collocation_algorithm",
    func= lambda x: self._collocation(self._experiment_plugin, x)
    )

    def find_level_hints(self, level, hints):
    ...

    def _experiment_plugin(self, *hints):
    return {
    "0": self.find_level_hints(level=0, hints=hints),
    "1": self.find_level_hints(level=1, hints=hints),
    "2": self.find_level_hints(level=2, hints=hints),
    "3": self.find_level_hints(level=3, hints=hints),
    }

    ExperimentCollocationFTSPlugins("def")

    +
    from rucio.transfertool.fts3_plugins import FTS3TapeMetadataPlugin

    class ExperimentCollocationFTSPlugins(FTS3TapeMetadataPlugin):
    def __init__(self, policy_algorithm="def"):
    super().__init__(policy_algorithm)
    self.register(
    "policy_collocation_algorithm",
    func= lambda x: self._collocation(self._experiment_plugin, x)
    )

    def find_level_hints(self, level, hints):
    ...

    def _experiment_plugin(self, *hints):
    return {
    "0": self.find_level_hints(level=0, hints=hints),
    "1": self.find_level_hints(level=1, hints=hints),
    "2": self.find_level_hints(level=2, hints=hints),
    "3": self.find_level_hints(level=3, hints=hints),
    }

    ExperimentCollocationFTSPlugins("def")
    \ No newline at end of file diff --git a/operator/transfers/configure-rucio-globus/index.html b/operator/transfers/configure-rucio-globus/index.html index 0b49604e69..5ea11a8076 100644 --- a/operator/transfers/configure-rucio-globus/index.html +++ b/operator/transfers/configure-rucio-globus/index.html @@ -9,8 +9,8 @@ - - + +

    Configure Rucio To Use Globus Online as a Transfer Tool

    This document walks through an example configuration of Rucio to use Globus @@ -67,6 +67,6 @@

    Gl

    The Globus configuration file ./lib/rucio/transfertool/config.yml is a file of YAML syntax and should include at minimum the registered application name, the client ID and refresh token:

    -
    globus:
    apps:
    RucioGlobusXferNativeApp:
    client_id: a758...
    refresh_token: Agjo...

    +
    globus:
    apps:
    RucioGlobusXferNativeApp:
    client_id: a758...
    refresh_token: Agjo...
    \ No newline at end of file diff --git a/operator/transfers/transfers-overview/index.html b/operator/transfers/transfers-overview/index.html index 37ba050a52..29d7eb0815 100644 --- a/operator/transfers/transfers-overview/index.html +++ b/operator/transfers/transfers-overview/index.html @@ -9,8 +9,8 @@ - - + + +

    Request State Transition Chart

    \ No newline at end of file diff --git a/operator/transfers/transfers-preparer/index.html b/operator/transfers/transfers-preparer/index.html index 453187fb0d..7413c13d1d 100644 --- a/operator/transfers/transfers-preparer/index.html +++ b/operator/transfers/transfers-preparer/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/operator/transfers/transfers-submitter/index.html b/operator/transfers/transfers-submitter/index.html index 5d2106c561..e551576a29 100644 --- a/operator/transfers/transfers-submitter/index.html +++ b/operator/transfers/transfers-submitter/index.html @@ -9,8 +9,8 @@ - - + + +consists of calling the transfertool with the correct arguments.

    \ No newline at end of file diff --git a/operator/transfers/transfers-throttler/index.html b/operator/transfers/transfers-throttler/index.html index d0037075b1..629d74c756 100644 --- a/operator/transfers/transfers-throttler/index.html +++ b/operator/transfers/transfers-throttler/index.html @@ -9,8 +9,8 @@ - - + + +The only technique we use in production is destination throttling.

    \ No newline at end of file diff --git a/project_organisation/index.html b/project_organisation/index.html index 91324c8f36..bea25a061e 100644 --- a/project_organisation/index.html +++ b/project_organisation/index.html @@ -9,8 +9,8 @@ - - + +

    Project Organisation

    Rucio is organised as a community-driven, open-source, project. @@ -53,6 +53,6 @@

    Spec

    Detailed information for Rucio SIGs can be found here.

    Contributors / Developers

    Rucio could not exist without the numerous contributors who spent their valuable time -to improve the software. A list of contributors can be seen here.

    +to improve the software. A list of contributors can be seen here.

    \ No newline at end of file diff --git a/release-notes/1.13.3/index.html b/release-notes/1.13.3/index.html index 89ca7ed63a..b0e2a43c0c 100644 --- a/release-notes/1.13.3/index.html +++ b/release-notes/1.13.3/index.html @@ -9,8 +9,8 @@ - - + +

    Bugs

    diff --git a/release-notes/1.14.0.post1/index.html b/release-notes/1.14.0.post1/index.html index da962de859..dd63e93d82 100644 --- a/release-notes/1.14.0.post1/index.html +++ b/release-notes/1.14.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.0.post1

    Rucio

    diff --git a/release-notes/1.14.1.post1/index.html b/release-notes/1.14.1.post1/index.html index 4a954ec9ba..8372bf83fe 100644 --- a/release-notes/1.14.1.post1/index.html +++ b/release-notes/1.14.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.1.post1

    Rucio

    diff --git a/release-notes/1.14.10/index.html b/release-notes/1.14.10/index.html index e76651f87b..11d0f7985f 100644 --- a/release-notes/1.14.10/index.html +++ b/release-notes/1.14.10/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/release-notes/1.14.11/index.html b/release-notes/1.14.11/index.html index 8257390fae..50f6dbc8aa 100644 --- a/release-notes/1.14.11/index.html +++ b/release-notes/1.14.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.11

    Clients

    diff --git a/release-notes/1.14.2/index.html b/release-notes/1.14.2/index.html index 2bc3d7025f..a7683e6c91 100644 --- a/release-notes/1.14.2/index.html +++ b/release-notes/1.14.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.2

    Rucio

    diff --git a/release-notes/1.14.3/index.html b/release-notes/1.14.3/index.html index 9a4e5f7f6e..6b3fb8f333 100644 --- a/release-notes/1.14.3/index.html +++ b/release-notes/1.14.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.3

    Clients

    diff --git a/release-notes/1.14.4/index.html b/release-notes/1.14.4/index.html index 9c29aa970c..c5236d4af9 100644 --- a/release-notes/1.14.4/index.html +++ b/release-notes/1.14.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.4

    Clients

    diff --git a/release-notes/1.14.5/index.html b/release-notes/1.14.5/index.html index 02d49323ab..3b6d56c0b3 100644 --- a/release-notes/1.14.5/index.html +++ b/release-notes/1.14.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.5

    Clients

    diff --git a/release-notes/1.14.6/index.html b/release-notes/1.14.6/index.html index fe055ad137..2d6553b25b 100644 --- a/release-notes/1.14.6/index.html +++ b/release-notes/1.14.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.6

    Rucio

    diff --git a/release-notes/1.14.7/index.html b/release-notes/1.14.7/index.html index c9619119f7..0e248ee97d 100644 --- a/release-notes/1.14.7/index.html +++ b/release-notes/1.14.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.7

    Rucio

    diff --git a/release-notes/1.14.8.post1/index.html b/release-notes/1.14.8.post1/index.html index fc605cea14..d545a16b4d 100644 --- a/release-notes/1.14.8.post1/index.html +++ b/release-notes/1.14.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.8.post1

    Rucio

    diff --git a/release-notes/1.14.8.post2/index.html b/release-notes/1.14.8.post2/index.html index 7853bf7a68..0e0b9c78b0 100644 --- a/release-notes/1.14.8.post2/index.html +++ b/release-notes/1.14.8.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.8.post2

    Rucio

    diff --git a/release-notes/1.14.8/index.html b/release-notes/1.14.8/index.html index 538be2dacb..e3b7dc4c49 100644 --- a/release-notes/1.14.8/index.html +++ b/release-notes/1.14.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.8

    Rucio

    diff --git a/release-notes/1.14.9.post1/index.html b/release-notes/1.14.9.post1/index.html index 7f1d0d3818..2e3ad4131d 100644 --- a/release-notes/1.14.9.post1/index.html +++ b/release-notes/1.14.9.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.9.post1

    Rucio

    diff --git a/release-notes/1.14.9/index.html b/release-notes/1.14.9/index.html index 62dabcf722..7090ca062d 100644 --- a/release-notes/1.14.9/index.html +++ b/release-notes/1.14.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.9

    Rucio

    diff --git a/release-notes/1.15.0.post1/index.html b/release-notes/1.15.0.post1/index.html index 40ed4a346d..8b8c908ed3 100644 --- a/release-notes/1.15.0.post1/index.html +++ b/release-notes/1.15.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.0.post1

    Rucio

    diff --git a/release-notes/1.15.0/index.html b/release-notes/1.15.0/index.html index 00cf787813..9ff61e5a2a 100644 --- a/release-notes/1.15.0/index.html +++ b/release-notes/1.15.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.0

    Rucio

    diff --git a/release-notes/1.15.1/index.html b/release-notes/1.15.1/index.html index 0960b73f28..18f6ed7a47 100644 --- a/release-notes/1.15.1/index.html +++ b/release-notes/1.15.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.1

    WebUI

    diff --git a/release-notes/1.15.2/index.html b/release-notes/1.15.2/index.html index 799f000291..e58966fa5f 100644 --- a/release-notes/1.15.2/index.html +++ b/release-notes/1.15.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.2

    Rucio

    diff --git a/release-notes/1.15.3.post1/index.html b/release-notes/1.15.3.post1/index.html index 4d940c7ccb..9f2e33801a 100644 --- a/release-notes/1.15.3.post1/index.html +++ b/release-notes/1.15.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.3.post1

    General

    diff --git a/release-notes/1.15.3/index.html b/release-notes/1.15.3/index.html index a6836159fc..d4f953f8b7 100644 --- a/release-notes/1.15.3/index.html +++ b/release-notes/1.15.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.3

    General

    diff --git a/release-notes/1.15.4.post1/index.html b/release-notes/1.15.4.post1/index.html index c2cbf69f59..2fef3d69f8 100644 --- a/release-notes/1.15.4.post1/index.html +++ b/release-notes/1.15.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.4.post1

    General

    diff --git a/release-notes/1.15.4/index.html b/release-notes/1.15.4/index.html index 0541e8fb05..b3b1a27bfc 100644 --- a/release-notes/1.15.4/index.html +++ b/release-notes/1.15.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.4

    Upgrade instructions

    diff --git a/release-notes/1.15.5/index.html b/release-notes/1.15.5/index.html index ac2f1be172..7beff75ef1 100644 --- a/release-notes/1.15.5/index.html +++ b/release-notes/1.15.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.5

    Clients

    diff --git a/release-notes/1.16.0.post1/index.html b/release-notes/1.16.0.post1/index.html index dd1e5a62b5..6c338431d4 100644 --- a/release-notes/1.16.0.post1/index.html +++ b/release-notes/1.16.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.0.post1

    General

    diff --git a/release-notes/1.16.0/index.html b/release-notes/1.16.0/index.html index c5a5331701..afd082a135 100644 --- a/release-notes/1.16.0/index.html +++ b/release-notes/1.16.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.0

    General

    diff --git a/release-notes/1.16.1/index.html b/release-notes/1.16.1/index.html index 1b049d7e76..9bb480408b 100644 --- a/release-notes/1.16.1/index.html +++ b/release-notes/1.16.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.1

    General

    diff --git a/release-notes/1.16.2/index.html b/release-notes/1.16.2/index.html index 5aae9ed89a..4b43679a47 100644 --- a/release-notes/1.16.2/index.html +++ b/release-notes/1.16.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.2

    General

    diff --git a/release-notes/1.16.3/index.html b/release-notes/1.16.3/index.html index cf140a06af..34ae56cd11 100644 --- a/release-notes/1.16.3/index.html +++ b/release-notes/1.16.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.3

    General

    diff --git a/release-notes/1.16.4/index.html b/release-notes/1.16.4/index.html index 764de0ffae..d43bc47ea5 100644 --- a/release-notes/1.16.4/index.html +++ b/release-notes/1.16.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.4

    Clients

    diff --git a/release-notes/1.17.0/index.html b/release-notes/1.17.0/index.html index 7ceae10a81..048e5b70fb 100644 --- a/release-notes/1.17.0/index.html +++ b/release-notes/1.17.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.0

    General

    diff --git a/release-notes/1.17.1/index.html b/release-notes/1.17.1/index.html index f5b0c2f82b..86e4900517 100644 --- a/release-notes/1.17.1/index.html +++ b/release-notes/1.17.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.1

    General

    diff --git a/release-notes/1.17.2.post1/index.html b/release-notes/1.17.2.post1/index.html index e8906f2a77..172fda96da 100644 --- a/release-notes/1.17.2.post1/index.html +++ b/release-notes/1.17.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.2.post1

    General

    diff --git a/release-notes/1.17.2/index.html b/release-notes/1.17.2/index.html index 34ed283022..14b0da04f6 100644 --- a/release-notes/1.17.2/index.html +++ b/release-notes/1.17.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.2

    General

    diff --git a/release-notes/1.17.3/index.html b/release-notes/1.17.3/index.html index 258dc695b0..c71d9c08ee 100644 --- a/release-notes/1.17.3/index.html +++ b/release-notes/1.17.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.3

    Clients

    diff --git a/release-notes/1.17.4/index.html b/release-notes/1.17.4/index.html index eac8ce2b8e..75bc748779 100644 --- a/release-notes/1.17.4/index.html +++ b/release-notes/1.17.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.4

    Clients

    diff --git a/release-notes/1.17.5/index.html b/release-notes/1.17.5/index.html index e61a95394a..c910b464f3 100644 --- a/release-notes/1.17.5/index.html +++ b/release-notes/1.17.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.5

    General

    diff --git a/release-notes/1.17.6.post1/index.html b/release-notes/1.17.6.post1/index.html index c3db72bed7..17adda3efd 100644 --- a/release-notes/1.17.6.post1/index.html +++ b/release-notes/1.17.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.6.post1

    General

    diff --git a/release-notes/1.17.6.post2/index.html b/release-notes/1.17.6.post2/index.html index b904bcd5df..cf8578949e 100644 --- a/release-notes/1.17.6.post2/index.html +++ b/release-notes/1.17.6.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.6.post2

    General

    diff --git a/release-notes/1.17.6/index.html b/release-notes/1.17.6/index.html index 44bec6e5c0..6d4847473c 100644 --- a/release-notes/1.17.6/index.html +++ b/release-notes/1.17.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.6

    General

    diff --git a/release-notes/1.17.7/index.html b/release-notes/1.17.7/index.html index 932bab7f2d..a5e0a2c562 100644 --- a/release-notes/1.17.7/index.html +++ b/release-notes/1.17.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.7

    General

    diff --git a/release-notes/1.17.8.post1/index.html b/release-notes/1.17.8.post1/index.html index c779fccad0..9e5c04f7a1 100644 --- a/release-notes/1.17.8.post1/index.html +++ b/release-notes/1.17.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.8.post1

    Clients

    diff --git a/release-notes/1.17.8.post2/index.html b/release-notes/1.17.8.post2/index.html index 85e90a2092..4ef4da39f2 100644 --- a/release-notes/1.17.8.post2/index.html +++ b/release-notes/1.17.8.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.8.post2

    Clients

    diff --git a/release-notes/1.17.8/index.html b/release-notes/1.17.8/index.html index 438ef98806..0b9612e9e2 100644 --- a/release-notes/1.17.8/index.html +++ b/release-notes/1.17.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.8

    General

    diff --git a/release-notes/1.18.0/index.html b/release-notes/1.18.0/index.html index 4ad14af801..116ed5bfda 100644 --- a/release-notes/1.18.0/index.html +++ b/release-notes/1.18.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.0

    Upgrade instructions

    diff --git a/release-notes/1.18.1/index.html b/release-notes/1.18.1/index.html index e5b5591315..aecb961d25 100644 --- a/release-notes/1.18.1/index.html +++ b/release-notes/1.18.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.1

    General

    diff --git a/release-notes/1.18.2/index.html b/release-notes/1.18.2/index.html index 1b14fd1335..8b8b6306aa 100644 --- a/release-notes/1.18.2/index.html +++ b/release-notes/1.18.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.2

    Clients

    diff --git a/release-notes/1.18.3/index.html b/release-notes/1.18.3/index.html index 59d4a71a35..ac288e769d 100644 --- a/release-notes/1.18.3/index.html +++ b/release-notes/1.18.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.3

    General

    diff --git a/release-notes/1.18.4/index.html b/release-notes/1.18.4/index.html index 3676cd1f06..e9deaa35f3 100644 --- a/release-notes/1.18.4/index.html +++ b/release-notes/1.18.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.4

    General

    diff --git a/release-notes/1.18.5.post1/index.html b/release-notes/1.18.5.post1/index.html index 1d3fd97bc5..61b124fa4e 100644 --- a/release-notes/1.18.5.post1/index.html +++ b/release-notes/1.18.5.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.5.post1

    General

    diff --git a/release-notes/1.18.5/index.html b/release-notes/1.18.5/index.html index 6fe8337a3d..c93bcc5df8 100644 --- a/release-notes/1.18.5/index.html +++ b/release-notes/1.18.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.5

    General

    diff --git a/release-notes/1.18.6.post1/index.html b/release-notes/1.18.6.post1/index.html index d96dcf73f8..cd4cbc4d4d 100644 --- a/release-notes/1.18.6.post1/index.html +++ b/release-notes/1.18.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.6.post1

    General

    diff --git a/release-notes/1.18.6/index.html b/release-notes/1.18.6/index.html index 3f9e268878..35dd2859cb 100644 --- a/release-notes/1.18.6/index.html +++ b/release-notes/1.18.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.6

    General

    diff --git a/release-notes/1.18.7/index.html b/release-notes/1.18.7/index.html index fa8fcaf765..141ff8b696 100644 --- a/release-notes/1.18.7/index.html +++ b/release-notes/1.18.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.7

    General

    diff --git a/release-notes/1.18.8.post1/index.html b/release-notes/1.18.8.post1/index.html index 969345eefe..c72db488d3 100644 --- a/release-notes/1.18.8.post1/index.html +++ b/release-notes/1.18.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.8.post1

    General

    diff --git a/release-notes/1.18.8/index.html b/release-notes/1.18.8/index.html index 325aebb7f9..d1ed5bbafc 100644 --- a/release-notes/1.18.8/index.html +++ b/release-notes/1.18.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.8

    General

    diff --git a/release-notes/1.18.9/index.html b/release-notes/1.18.9/index.html index ab92bbd58a..8fb8679b8f 100644 --- a/release-notes/1.18.9/index.html +++ b/release-notes/1.18.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.9

    General

    diff --git a/release-notes/1.19.0.post2/index.html b/release-notes/1.19.0.post2/index.html index eccf40db13..dbcabef3fb 100644 --- a/release-notes/1.19.0.post2/index.html +++ b/release-notes/1.19.0.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.0.post2

    Upgrade Instructions

    diff --git a/release-notes/1.19.1/index.html b/release-notes/1.19.1/index.html index 27e0cb53cd..dcd6d368cd 100644 --- a/release-notes/1.19.1/index.html +++ b/release-notes/1.19.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.1

    General

    diff --git a/release-notes/1.19.2/index.html b/release-notes/1.19.2/index.html index abc62fdea5..a02d47b07a 100644 --- a/release-notes/1.19.2/index.html +++ b/release-notes/1.19.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.2

    WebUI

    diff --git a/release-notes/1.19.3/index.html b/release-notes/1.19.3/index.html index 5de17ff37c..c85b9761fe 100644 --- a/release-notes/1.19.3/index.html +++ b/release-notes/1.19.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.3

    General

    diff --git a/release-notes/1.19.4.post1/index.html b/release-notes/1.19.4.post1/index.html index 0ae91ee159..ab0315cb6e 100644 --- a/release-notes/1.19.4.post1/index.html +++ b/release-notes/1.19.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.4.post1

    General

    diff --git a/release-notes/1.19.4.post2/index.html b/release-notes/1.19.4.post2/index.html index 66e769adac..603aa5bfa9 100644 --- a/release-notes/1.19.4.post2/index.html +++ b/release-notes/1.19.4.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.4.post2

    General

    diff --git a/release-notes/1.19.4/index.html b/release-notes/1.19.4/index.html index 8e386a61ae..a9f4a7c151 100644 --- a/release-notes/1.19.4/index.html +++ b/release-notes/1.19.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.4

    General

    diff --git a/release-notes/1.19.5/index.html b/release-notes/1.19.5/index.html index 8c62299dee..a9990b3702 100644 --- a/release-notes/1.19.5/index.html +++ b/release-notes/1.19.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.5

    General

    diff --git a/release-notes/1.19.6/index.html b/release-notes/1.19.6/index.html index 4116d83f73..5879567426 100644 --- a/release-notes/1.19.6/index.html +++ b/release-notes/1.19.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.6

    General

    diff --git a/release-notes/1.19.7.post1/index.html b/release-notes/1.19.7.post1/index.html index 7b78ee87a0..ed778be9c2 100644 --- a/release-notes/1.19.7.post1/index.html +++ b/release-notes/1.19.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.7.post1

    General

    diff --git a/release-notes/1.19.7/index.html b/release-notes/1.19.7/index.html index 03ecae803d..a4680613d9 100644 --- a/release-notes/1.19.7/index.html +++ b/release-notes/1.19.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.7

    General

    diff --git a/release-notes/1.19.8/index.html b/release-notes/1.19.8/index.html index b3d5dddca8..7a3692403b 100644 --- a/release-notes/1.19.8/index.html +++ b/release-notes/1.19.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.8

    General

    diff --git a/release-notes/1.20.0/index.html b/release-notes/1.20.0/index.html index 7a27fe6e78..92b5436fb6 100644 --- a/release-notes/1.20.0/index.html +++ b/release-notes/1.20.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.20.0rc1/index.html b/release-notes/1.20.0rc1/index.html index 304ac21f0f..fee5436370 100644 --- a/release-notes/1.20.0rc1/index.html +++ b/release-notes/1.20.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.0rc1

    Release Candidate

    diff --git a/release-notes/1.20.1.post1/index.html b/release-notes/1.20.1.post1/index.html index f2a9ae2163..9f65f0bcda 100644 --- a/release-notes/1.20.1.post1/index.html +++ b/release-notes/1.20.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.1.post1

    General

    diff --git a/release-notes/1.20.1/index.html b/release-notes/1.20.1/index.html index fbb7699f13..cb7718109f 100644 --- a/release-notes/1.20.1/index.html +++ b/release-notes/1.20.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.1

    General

    diff --git a/release-notes/1.20.10/index.html b/release-notes/1.20.10/index.html index 9d3b711119..df0b089b00 100644 --- a/release-notes/1.20.10/index.html +++ b/release-notes/1.20.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.10

    General

    diff --git a/release-notes/1.20.11/index.html b/release-notes/1.20.11/index.html index a3425c53cb..d57df17b3d 100644 --- a/release-notes/1.20.11/index.html +++ b/release-notes/1.20.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.11

    General

    diff --git a/release-notes/1.20.12/index.html b/release-notes/1.20.12/index.html index cf50aed239..b073f4ff47 100644 --- a/release-notes/1.20.12/index.html +++ b/release-notes/1.20.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.12

    General

    diff --git a/release-notes/1.20.13/index.html b/release-notes/1.20.13/index.html index 8357ae9c79..ec6d312e87 100644 --- a/release-notes/1.20.13/index.html +++ b/release-notes/1.20.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.13

    General

    diff --git a/release-notes/1.20.14/index.html b/release-notes/1.20.14/index.html index 0f5cdab5a6..f42c10bf90 100644 --- a/release-notes/1.20.14/index.html +++ b/release-notes/1.20.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.14

    General

    diff --git a/release-notes/1.20.15/index.html b/release-notes/1.20.15/index.html index faeb0a5076..5b7c16d419 100644 --- a/release-notes/1.20.15/index.html +++ b/release-notes/1.20.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.15

    General

    diff --git a/release-notes/1.20.16/index.html b/release-notes/1.20.16/index.html index 22d56d340e..a2ff5d2ab4 100644 --- a/release-notes/1.20.16/index.html +++ b/release-notes/1.20.16/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.16

    General

    diff --git a/release-notes/1.20.2/index.html b/release-notes/1.20.2/index.html index 375aaace62..151791b92e 100644 --- a/release-notes/1.20.2/index.html +++ b/release-notes/1.20.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.2

    General

    diff --git a/release-notes/1.20.3/index.html b/release-notes/1.20.3/index.html index f5d806c883..3fd105903b 100644 --- a/release-notes/1.20.3/index.html +++ b/release-notes/1.20.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.3

    General

    diff --git a/release-notes/1.20.3rc1/index.html b/release-notes/1.20.3rc1/index.html index 8d89e8a8c7..660a1a8526 100644 --- a/release-notes/1.20.3rc1/index.html +++ b/release-notes/1.20.3rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.3rc1

    General

    diff --git a/release-notes/1.20.3rc2/index.html b/release-notes/1.20.3rc2/index.html index 7cb4774786..7b3b429105 100644 --- a/release-notes/1.20.3rc2/index.html +++ b/release-notes/1.20.3rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.3rc2

    General

    diff --git a/release-notes/1.20.4.post1/index.html b/release-notes/1.20.4.post1/index.html index 3ed8226fde..0e391d70c7 100644 --- a/release-notes/1.20.4.post1/index.html +++ b/release-notes/1.20.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4.post1

    General

    diff --git a/release-notes/1.20.4.post2/index.html b/release-notes/1.20.4.post2/index.html index dbece7b64d..015dbfc572 100644 --- a/release-notes/1.20.4.post2/index.html +++ b/release-notes/1.20.4.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4.post2

    General

    diff --git a/release-notes/1.20.4/index.html b/release-notes/1.20.4/index.html index f8b537b7d0..245ea015f5 100644 --- a/release-notes/1.20.4/index.html +++ b/release-notes/1.20.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4

    General

    diff --git a/release-notes/1.20.4rc1/index.html b/release-notes/1.20.4rc1/index.html index f47096efb1..52098f4e87 100644 --- a/release-notes/1.20.4rc1/index.html +++ b/release-notes/1.20.4rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4rc1

    General

    diff --git a/release-notes/1.20.4rc2/index.html b/release-notes/1.20.4rc2/index.html index 919c383e33..9202645a51 100644 --- a/release-notes/1.20.4rc2/index.html +++ b/release-notes/1.20.4rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4rc2

    General

    diff --git a/release-notes/1.20.4rc3/index.html b/release-notes/1.20.4rc3/index.html index 348892189b..107eef50f5 100644 --- a/release-notes/1.20.4rc3/index.html +++ b/release-notes/1.20.4rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4rc3

    General

    diff --git a/release-notes/1.20.5/index.html b/release-notes/1.20.5/index.html index d81e36d141..8d90665c00 100644 --- a/release-notes/1.20.5/index.html +++ b/release-notes/1.20.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.5

    General

    diff --git a/release-notes/1.20.6/index.html b/release-notes/1.20.6/index.html index 8a61e45b27..8bbc5b7333 100644 --- a/release-notes/1.20.6/index.html +++ b/release-notes/1.20.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.6

    General

    diff --git a/release-notes/1.20.7/index.html b/release-notes/1.20.7/index.html index 73dca4dc15..ccba6efbc5 100644 --- a/release-notes/1.20.7/index.html +++ b/release-notes/1.20.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.7

    General

    diff --git a/release-notes/1.20.8/index.html b/release-notes/1.20.8/index.html index 4dab174234..5b0a07f8e0 100644 --- a/release-notes/1.20.8/index.html +++ b/release-notes/1.20.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.8

    General

    diff --git a/release-notes/1.20.9/index.html b/release-notes/1.20.9/index.html index a7524cfff3..997353ab8a 100644 --- a/release-notes/1.20.9/index.html +++ b/release-notes/1.20.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.9

    General

    diff --git a/release-notes/1.21.0.post1/index.html b/release-notes/1.21.0.post1/index.html index 859dc2a23a..6b569a70ef 100644 --- a/release-notes/1.21.0.post1/index.html +++ b/release-notes/1.21.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0.post1

    Clients

    diff --git a/release-notes/1.21.0.post2/index.html b/release-notes/1.21.0.post2/index.html index 91ca588f86..12f6a68e67 100644 --- a/release-notes/1.21.0.post2/index.html +++ b/release-notes/1.21.0.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0.post2

    General

    diff --git a/release-notes/1.21.0/index.html b/release-notes/1.21.0/index.html index 657db8c263..0e1d6e52c3 100644 --- a/release-notes/1.21.0/index.html +++ b/release-notes/1.21.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0

    Upgrade Instructions

    diff --git a/release-notes/1.21.0rc1/index.html b/release-notes/1.21.0rc1/index.html index 3eb7c2b0db..0f89dd0dac 100644 --- a/release-notes/1.21.0rc1/index.html +++ b/release-notes/1.21.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0rc1

    Release candidate

    diff --git a/release-notes/1.21.0rc2/index.html b/release-notes/1.21.0rc2/index.html index 81b8b5b802..0a78723be9 100644 --- a/release-notes/1.21.0rc2/index.html +++ b/release-notes/1.21.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0rc2

    Release candidate

    diff --git a/release-notes/1.21.0rc3/index.html b/release-notes/1.21.0rc3/index.html index e796e32719..0e71a18343 100644 --- a/release-notes/1.21.0rc3/index.html +++ b/release-notes/1.21.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0rc3

    Release candidate

    diff --git a/release-notes/1.21.1/index.html b/release-notes/1.21.1/index.html index a95a04b1a9..31ddf4a87d 100644 --- a/release-notes/1.21.1/index.html +++ b/release-notes/1.21.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.1

    General

    diff --git a/release-notes/1.21.10.post1/index.html b/release-notes/1.21.10.post1/index.html index f9a48b4ab8..9a26e16596 100644 --- a/release-notes/1.21.10.post1/index.html +++ b/release-notes/1.21.10.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.10.post1

    General

    diff --git a/release-notes/1.21.10/index.html b/release-notes/1.21.10/index.html index 2d8621e530..241e6923e8 100644 --- a/release-notes/1.21.10/index.html +++ b/release-notes/1.21.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.10

    General

    diff --git a/release-notes/1.21.11/index.html b/release-notes/1.21.11/index.html index 540807c57a..4d3350fc08 100644 --- a/release-notes/1.21.11/index.html +++ b/release-notes/1.21.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.11

    Clients

    diff --git a/release-notes/1.21.12/index.html b/release-notes/1.21.12/index.html index 614935b8d6..98c5343380 100644 --- a/release-notes/1.21.12/index.html +++ b/release-notes/1.21.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.12

    General

    diff --git a/release-notes/1.21.2/index.html b/release-notes/1.21.2/index.html index 1115089f6d..9c805915fa 100644 --- a/release-notes/1.21.2/index.html +++ b/release-notes/1.21.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.2

    General

    diff --git a/release-notes/1.21.3/index.html b/release-notes/1.21.3/index.html index 501d19907d..63e5fa37f8 100644 --- a/release-notes/1.21.3/index.html +++ b/release-notes/1.21.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.3

    General

    diff --git a/release-notes/1.21.4/index.html b/release-notes/1.21.4/index.html index 2943d44aff..fa472e5ce5 100644 --- a/release-notes/1.21.4/index.html +++ b/release-notes/1.21.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.4

    General

    diff --git a/release-notes/1.21.5/index.html b/release-notes/1.21.5/index.html index 40cd79b22b..2c8271d86c 100644 --- a/release-notes/1.21.5/index.html +++ b/release-notes/1.21.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.5

    General

    diff --git a/release-notes/1.21.6/index.html b/release-notes/1.21.6/index.html index a6b9e90060..78b02c599b 100644 --- a/release-notes/1.21.6/index.html +++ b/release-notes/1.21.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.6

    General

    diff --git a/release-notes/1.21.7/index.html b/release-notes/1.21.7/index.html index ac73ca06d3..80e0d76a6a 100644 --- a/release-notes/1.21.7/index.html +++ b/release-notes/1.21.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.7

    General

    diff --git a/release-notes/1.21.8/index.html b/release-notes/1.21.8/index.html index f24e712b91..077840b467 100644 --- a/release-notes/1.21.8/index.html +++ b/release-notes/1.21.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.8

    General

    diff --git a/release-notes/1.21.9/index.html b/release-notes/1.21.9/index.html index a5a448f15b..0cecb8e07e 100644 --- a/release-notes/1.21.9/index.html +++ b/release-notes/1.21.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.9

    Clients

    diff --git a/release-notes/1.22.0.dev2/index.html b/release-notes/1.22.0.dev2/index.html index ccb148edea..2aa86887ca 100644 --- a/release-notes/1.22.0.dev2/index.html +++ b/release-notes/1.22.0.dev2/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0.dev2

    General

    diff --git a/release-notes/1.22.0.dev3/index.html b/release-notes/1.22.0.dev3/index.html index 84894100f0..175bc3d011 100644 --- a/release-notes/1.22.0.dev3/index.html +++ b/release-notes/1.22.0.dev3/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0.dev3

    General

    diff --git a/release-notes/1.22.0/index.html b/release-notes/1.22.0/index.html index 05342f608b..01e1b1e54a 100644 --- a/release-notes/1.22.0/index.html +++ b/release-notes/1.22.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0

    Upgrade Instructions

    diff --git a/release-notes/1.22.0rc1/index.html b/release-notes/1.22.0rc1/index.html index a6a9244d80..8d43fa09b9 100644 --- a/release-notes/1.22.0rc1/index.html +++ b/release-notes/1.22.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0rc1

    Release Candidate

    diff --git a/release-notes/1.22.0rc2/index.html b/release-notes/1.22.0rc2/index.html index ba5ca9f367..76f11ffe0c 100644 --- a/release-notes/1.22.0rc2/index.html +++ b/release-notes/1.22.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0rc2

    Release Candidate

    diff --git a/release-notes/1.22.1/index.html b/release-notes/1.22.1/index.html index e3d270ff04..c1798d9bf8 100644 --- a/release-notes/1.22.1/index.html +++ b/release-notes/1.22.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.1

    General

    diff --git a/release-notes/1.22.2/index.html b/release-notes/1.22.2/index.html index 0a0348a5b7..861b7d7994 100644 --- a/release-notes/1.22.2/index.html +++ b/release-notes/1.22.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.2

    General

    diff --git a/release-notes/1.22.3.post1/index.html b/release-notes/1.22.3.post1/index.html index 7dc8237ac5..6f3be866d0 100644 --- a/release-notes/1.22.3.post1/index.html +++ b/release-notes/1.22.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.3.post1

    General

    diff --git a/release-notes/1.22.3/index.html b/release-notes/1.22.3/index.html index 7a1d166de5..d8b2d3117a 100644 --- a/release-notes/1.22.3/index.html +++ b/release-notes/1.22.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.3

    General

    diff --git a/release-notes/1.22.4.dev1/index.html b/release-notes/1.22.4.dev1/index.html index 8387b059fc..cc06db50cc 100644 --- a/release-notes/1.22.4.dev1/index.html +++ b/release-notes/1.22.4.dev1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.4.dev1

    General

    diff --git a/release-notes/1.22.4/index.html b/release-notes/1.22.4/index.html index 04c4ddb692..48633056b8 100644 --- a/release-notes/1.22.4/index.html +++ b/release-notes/1.22.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.4

    General

    diff --git a/release-notes/1.22.5/index.html b/release-notes/1.22.5/index.html index 9fb5b0c192..63d10658ec 100644 --- a/release-notes/1.22.5/index.html +++ b/release-notes/1.22.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.5

    Clients

    diff --git a/release-notes/1.22.6.post1/index.html b/release-notes/1.22.6.post1/index.html index ce8f45a490..77d8edeb05 100644 --- a/release-notes/1.22.6.post1/index.html +++ b/release-notes/1.22.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.6.post1

    General

    diff --git a/release-notes/1.22.6/index.html b/release-notes/1.22.6/index.html index fc4dcbd609..96dda3d9e9 100644 --- a/release-notes/1.22.6/index.html +++ b/release-notes/1.22.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.6

    General

    diff --git a/release-notes/1.22.7/index.html b/release-notes/1.22.7/index.html index 5154895066..71afac2c71 100644 --- a/release-notes/1.22.7/index.html +++ b/release-notes/1.22.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.7

    General

    diff --git a/release-notes/1.22.8.post1/index.html b/release-notes/1.22.8.post1/index.html index eec19579f3..e1bf084e6b 100644 --- a/release-notes/1.22.8.post1/index.html +++ b/release-notes/1.22.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.8.post1

    General

    diff --git a/release-notes/1.22.8/index.html b/release-notes/1.22.8/index.html index 3a87235648..683a24a99d 100644 --- a/release-notes/1.22.8/index.html +++ b/release-notes/1.22.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.8

    General

    diff --git a/release-notes/1.23.0/index.html b/release-notes/1.23.0/index.html index 2569f58620..d9507f0742 100644 --- a/release-notes/1.23.0/index.html +++ b/release-notes/1.23.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.23.0rc1/index.html b/release-notes/1.23.0rc1/index.html index b7d7604477..e38a979ccf 100644 --- a/release-notes/1.23.0rc1/index.html +++ b/release-notes/1.23.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.0rc1

    Release Candidate

    diff --git a/release-notes/1.23.0rc2/index.html b/release-notes/1.23.0rc2/index.html index 9a8a2ef8e5..accc964c5a 100644 --- a/release-notes/1.23.0rc2/index.html +++ b/release-notes/1.23.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.0rc2

    Release Candidate

    diff --git a/release-notes/1.23.1/index.html b/release-notes/1.23.1/index.html index 40bdbb4010..b1df3b83d8 100644 --- a/release-notes/1.23.1/index.html +++ b/release-notes/1.23.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.1

    General

    diff --git a/release-notes/1.23.10/index.html b/release-notes/1.23.10/index.html index 0636d0cace..ad944d5cee 100644 --- a/release-notes/1.23.10/index.html +++ b/release-notes/1.23.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.10

    General

    diff --git a/release-notes/1.23.11.post1/index.html b/release-notes/1.23.11.post1/index.html index a64175d37d..82be76ff9e 100644 --- a/release-notes/1.23.11.post1/index.html +++ b/release-notes/1.23.11.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post1

    General

    diff --git a/release-notes/1.23.11.post2/index.html b/release-notes/1.23.11.post2/index.html index 0c94fec774..db6c5f0602 100644 --- a/release-notes/1.23.11.post2/index.html +++ b/release-notes/1.23.11.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post2

    General

    diff --git a/release-notes/1.23.11.post3/index.html b/release-notes/1.23.11.post3/index.html index a785e9509d..760948df68 100644 --- a/release-notes/1.23.11.post3/index.html +++ b/release-notes/1.23.11.post3/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post3

    General

    diff --git a/release-notes/1.23.11.post4/index.html b/release-notes/1.23.11.post4/index.html index a1a5671326..c626f355db 100644 --- a/release-notes/1.23.11.post4/index.html +++ b/release-notes/1.23.11.post4/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post4

    Bugs

    diff --git a/release-notes/1.23.11/index.html b/release-notes/1.23.11/index.html index 82e6ee2979..bbdc62b9f0 100644 --- a/release-notes/1.23.11/index.html +++ b/release-notes/1.23.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11

    General

    diff --git a/release-notes/1.23.12/index.html b/release-notes/1.23.12/index.html index 613f530467..c85e955918 100644 --- a/release-notes/1.23.12/index.html +++ b/release-notes/1.23.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.12

    General

    diff --git a/release-notes/1.23.13/index.html b/release-notes/1.23.13/index.html index 3f2f471c21..5c5dc7a5fe 100644 --- a/release-notes/1.23.13/index.html +++ b/release-notes/1.23.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.13

    General

    diff --git a/release-notes/1.23.14/index.html b/release-notes/1.23.14/index.html index c8bc45e761..4f5f4cd8c8 100644 --- a/release-notes/1.23.14/index.html +++ b/release-notes/1.23.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.14

    General

    diff --git a/release-notes/1.23.15/index.html b/release-notes/1.23.15/index.html index 939e889db2..d045671935 100644 --- a/release-notes/1.23.15/index.html +++ b/release-notes/1.23.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.15

    General

    diff --git a/release-notes/1.23.16/index.html b/release-notes/1.23.16/index.html index b0b49272f6..096cd3ef21 100644 --- a/release-notes/1.23.16/index.html +++ b/release-notes/1.23.16/index.html @@ -9,8 +9,8 @@ - - + +
    diff --git a/release-notes/1.23.17/index.html b/release-notes/1.23.17/index.html index d10c641f1c..c65995fc1e 100644 --- a/release-notes/1.23.17/index.html +++ b/release-notes/1.23.17/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.17

    General

    diff --git a/release-notes/1.23.18/index.html b/release-notes/1.23.18/index.html index af133d9967..17d0ef0d49 100644 --- a/release-notes/1.23.18/index.html +++ b/release-notes/1.23.18/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.18

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.23.17 release.

    diff --git a/release-notes/1.23.19/index.html b/release-notes/1.23.19/index.html index dea53347c5..1477d9ad90 100644 --- a/release-notes/1.23.19/index.html +++ b/release-notes/1.23.19/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.19

    General

    diff --git a/release-notes/1.23.2.post1/index.html b/release-notes/1.23.2.post1/index.html index 933297f917..322efef2ac 100644 --- a/release-notes/1.23.2.post1/index.html +++ b/release-notes/1.23.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.2.post1

    General

    diff --git a/release-notes/1.23.2.post2/index.html b/release-notes/1.23.2.post2/index.html index bd56dbcf33..b8eac22207 100644 --- a/release-notes/1.23.2.post2/index.html +++ b/release-notes/1.23.2.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.2.post2

    General

    diff --git a/release-notes/1.23.2/index.html b/release-notes/1.23.2/index.html index ff766a8e98..fe0d678ff8 100644 --- a/release-notes/1.23.2/index.html +++ b/release-notes/1.23.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.2

    General

    diff --git a/release-notes/1.23.20/index.html b/release-notes/1.23.20/index.html index a1736614f5..9e845ef56b 100644 --- a/release-notes/1.23.20/index.html +++ b/release-notes/1.23.20/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.20

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.23.19 release.

    diff --git a/release-notes/1.23.3/index.html b/release-notes/1.23.3/index.html index 525df79291..fa9719bfba 100644 --- a/release-notes/1.23.3/index.html +++ b/release-notes/1.23.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.3

    Clients

    diff --git a/release-notes/1.23.4/index.html b/release-notes/1.23.4/index.html index 4eeb0ebcb6..b92f070007 100644 --- a/release-notes/1.23.4/index.html +++ b/release-notes/1.23.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.4

    General

    diff --git a/release-notes/1.23.5.post1/index.html b/release-notes/1.23.5.post1/index.html index ec419e02ff..0f456f0275 100644 --- a/release-notes/1.23.5.post1/index.html +++ b/release-notes/1.23.5.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.5.post1

    General

    diff --git a/release-notes/1.23.5/index.html b/release-notes/1.23.5/index.html index af3f5b9702..155066e007 100644 --- a/release-notes/1.23.5/index.html +++ b/release-notes/1.23.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.5

    General

    diff --git a/release-notes/1.23.6.post1/index.html b/release-notes/1.23.6.post1/index.html index 925a2d6851..7013fb5306 100644 --- a/release-notes/1.23.6.post1/index.html +++ b/release-notes/1.23.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.6.post1

    General

    diff --git a/release-notes/1.23.6/index.html b/release-notes/1.23.6/index.html index 5b621a0d78..54e8f806e9 100644 --- a/release-notes/1.23.6/index.html +++ b/release-notes/1.23.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.6

    General

    diff --git a/release-notes/1.23.7.post1/index.html b/release-notes/1.23.7.post1/index.html index b4ca1243f8..8b28bbbd9a 100644 --- a/release-notes/1.23.7.post1/index.html +++ b/release-notes/1.23.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.7.post1

    General

    diff --git a/release-notes/1.23.7/index.html b/release-notes/1.23.7/index.html index 74e0ee3876..36912ce94a 100644 --- a/release-notes/1.23.7/index.html +++ b/release-notes/1.23.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.7

    General

    diff --git a/release-notes/1.23.8/index.html b/release-notes/1.23.8/index.html index a9b392826e..6966f63aaf 100644 --- a/release-notes/1.23.8/index.html +++ b/release-notes/1.23.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.8

    General

    diff --git a/release-notes/1.23.9.post1/index.html b/release-notes/1.23.9.post1/index.html index e934729efd..a29e055aa6 100644 --- a/release-notes/1.23.9.post1/index.html +++ b/release-notes/1.23.9.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post1

    General

    diff --git a/release-notes/1.23.9.post2/index.html b/release-notes/1.23.9.post2/index.html index 68f4be3620..c3e5f15bfc 100644 --- a/release-notes/1.23.9.post2/index.html +++ b/release-notes/1.23.9.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post2

    General

    diff --git a/release-notes/1.23.9.post3/index.html b/release-notes/1.23.9.post3/index.html index 08d3f50304..f62d90111e 100644 --- a/release-notes/1.23.9.post3/index.html +++ b/release-notes/1.23.9.post3/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post3

    General

    diff --git a/release-notes/1.23.9.post4/index.html b/release-notes/1.23.9.post4/index.html index 19348111f9..a26b916139 100644 --- a/release-notes/1.23.9.post4/index.html +++ b/release-notes/1.23.9.post4/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post4

    General

    diff --git a/release-notes/1.23.9/index.html b/release-notes/1.23.9/index.html index fe86de5d3c..6ea01fb77b 100644 --- a/release-notes/1.23.9/index.html +++ b/release-notes/1.23.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9

    General

    diff --git a/release-notes/1.24.0/index.html b/release-notes/1.24.0/index.html index be016eddb0..6063dc39bd 100644 --- a/release-notes/1.24.0/index.html +++ b/release-notes/1.24.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.0

    Upgrade Instructions

    diff --git a/release-notes/1.24.0rc1/index.html b/release-notes/1.24.0rc1/index.html index ae70c45e1f..afb65a5cf8 100644 --- a/release-notes/1.24.0rc1/index.html +++ b/release-notes/1.24.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.0rc1

    Release Candidate

    diff --git a/release-notes/1.24.1.post1/index.html b/release-notes/1.24.1.post1/index.html index 7187441b94..d1c5433ded 100644 --- a/release-notes/1.24.1.post1/index.html +++ b/release-notes/1.24.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post1

    General

    diff --git a/release-notes/1.24.1.post2/index.html b/release-notes/1.24.1.post2/index.html index a8b2dda115..0b54bf93c0 100644 --- a/release-notes/1.24.1.post2/index.html +++ b/release-notes/1.24.1.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post2

    General

    diff --git a/release-notes/1.24.1.post3/index.html b/release-notes/1.24.1.post3/index.html index b489ae84a3..21e847564d 100644 --- a/release-notes/1.24.1.post3/index.html +++ b/release-notes/1.24.1.post3/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post3

    General

    diff --git a/release-notes/1.24.1.post4/index.html b/release-notes/1.24.1.post4/index.html index 61141d18b2..87c0ae46ba 100644 --- a/release-notes/1.24.1.post4/index.html +++ b/release-notes/1.24.1.post4/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post4

    General

    diff --git a/release-notes/1.24.1/index.html b/release-notes/1.24.1/index.html index 3e4008f708..49111ffd3c 100644 --- a/release-notes/1.24.1/index.html +++ b/release-notes/1.24.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1

    General

    diff --git a/release-notes/1.24.2.post1/index.html b/release-notes/1.24.2.post1/index.html index 8734115c36..6d275091be 100644 --- a/release-notes/1.24.2.post1/index.html +++ b/release-notes/1.24.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.2.post1

    Important notice

    diff --git a/release-notes/1.24.2/index.html b/release-notes/1.24.2/index.html index f8ae44e78d..59c2f11630 100644 --- a/release-notes/1.24.2/index.html +++ b/release-notes/1.24.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.2

    General

    diff --git a/release-notes/1.24.3.post1/index.html b/release-notes/1.24.3.post1/index.html index b6eca0c4a9..aa8cef721a 100644 --- a/release-notes/1.24.3.post1/index.html +++ b/release-notes/1.24.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.3.post1

    General

    diff --git a/release-notes/1.24.3/index.html b/release-notes/1.24.3/index.html index 7691cc766a..d8b4ae0daa 100644 --- a/release-notes/1.24.3/index.html +++ b/release-notes/1.24.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.3

    General

    diff --git a/release-notes/1.24.4/index.html b/release-notes/1.24.4/index.html index 8ee97c62e2..79503aca6c 100644 --- a/release-notes/1.24.4/index.html +++ b/release-notes/1.24.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.4

    General

    diff --git a/release-notes/1.24.5.post1/index.html b/release-notes/1.24.5.post1/index.html index 660bd9ac8d..6c6a254e99 100644 --- a/release-notes/1.24.5.post1/index.html +++ b/release-notes/1.24.5.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.5.post1

    General

    diff --git a/release-notes/1.24.5/index.html b/release-notes/1.24.5/index.html index a1bd6673ba..ee632b68fb 100644 --- a/release-notes/1.24.5/index.html +++ b/release-notes/1.24.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.5

    General

    diff --git a/release-notes/1.25.0/index.html b/release-notes/1.25.0/index.html index 83340f576a..934b71262a 100644 --- a/release-notes/1.25.0/index.html +++ b/release-notes/1.25.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.0

    Upgrade Instructions

    diff --git a/release-notes/1.25.0rc1/index.html b/release-notes/1.25.0rc1/index.html index f989a86f7d..26a45b94c0 100644 --- a/release-notes/1.25.0rc1/index.html +++ b/release-notes/1.25.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.0rc1

    Release Candidate

    diff --git a/release-notes/1.25.0rc2/index.html b/release-notes/1.25.0rc2/index.html index 0a76835b8e..2c59c7ac3f 100644 --- a/release-notes/1.25.0rc2/index.html +++ b/release-notes/1.25.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.0rc2

    Release Candidate

    diff --git a/release-notes/1.25.1.post1/index.html b/release-notes/1.25.1.post1/index.html index 0202b2792d..6e7f622f29 100644 --- a/release-notes/1.25.1.post1/index.html +++ b/release-notes/1.25.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.1.post1

    General

    diff --git a/release-notes/1.25.1.post2/index.html b/release-notes/1.25.1.post2/index.html index 547d28e737..70fe6e09f0 100644 --- a/release-notes/1.25.1.post2/index.html +++ b/release-notes/1.25.1.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.1.post2

    Clients

    diff --git a/release-notes/1.25.1/index.html b/release-notes/1.25.1/index.html index e4347bb93c..eae54ddd04 100644 --- a/release-notes/1.25.1/index.html +++ b/release-notes/1.25.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.1

    General

    diff --git a/release-notes/1.25.2/index.html b/release-notes/1.25.2/index.html index 05d16897e1..ed129b22cf 100644 --- a/release-notes/1.25.2/index.html +++ b/release-notes/1.25.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.2

    General

    diff --git a/release-notes/1.25.3.post1/index.html b/release-notes/1.25.3.post1/index.html index 38adae9e8c..26de16294b 100644 --- a/release-notes/1.25.3.post1/index.html +++ b/release-notes/1.25.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.3.post1

    General

    diff --git a/release-notes/1.25.3.post2/index.html b/release-notes/1.25.3.post2/index.html index e6141f4e97..552e34e3c3 100644 --- a/release-notes/1.25.3.post2/index.html +++ b/release-notes/1.25.3.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.3.post2

    General

    diff --git a/release-notes/1.25.3/index.html b/release-notes/1.25.3/index.html index ec80417ba1..4b64afa10d 100644 --- a/release-notes/1.25.3/index.html +++ b/release-notes/1.25.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.3

    General

    diff --git a/release-notes/1.25.4.post1/index.html b/release-notes/1.25.4.post1/index.html index 97f6c94b1c..eee1b76942 100644 --- a/release-notes/1.25.4.post1/index.html +++ b/release-notes/1.25.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.4.post1

    General

    diff --git a/release-notes/1.25.4/index.html b/release-notes/1.25.4/index.html index e4eb132b1f..7d14822a72 100644 --- a/release-notes/1.25.4/index.html +++ b/release-notes/1.25.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.4

    General

    diff --git a/release-notes/1.25.5/index.html b/release-notes/1.25.5/index.html index afe7370f5a..c21a5eeddb 100644 --- a/release-notes/1.25.5/index.html +++ b/release-notes/1.25.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.5

    General

    diff --git a/release-notes/1.25.6/index.html b/release-notes/1.25.6/index.html index 779a8e2ec9..fa4d4b1cd7 100644 --- a/release-notes/1.25.6/index.html +++ b/release-notes/1.25.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.6

    General

    diff --git a/release-notes/1.25.7/index.html b/release-notes/1.25.7/index.html index 33bd23eb56..2b7b8004c7 100644 --- a/release-notes/1.25.7/index.html +++ b/release-notes/1.25.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.7

    General

    diff --git a/release-notes/1.26.0/index.html b/release-notes/1.26.0/index.html index 8e9f0ddaf9..e5376f0383 100644 --- a/release-notes/1.26.0/index.html +++ b/release-notes/1.26.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.26.0rc1/index.html b/release-notes/1.26.0rc1/index.html index 5a829729a2..70472fd678 100644 --- a/release-notes/1.26.0rc1/index.html +++ b/release-notes/1.26.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.0rc1

    Release Candidate

    diff --git a/release-notes/1.26.0rc2/index.html b/release-notes/1.26.0rc2/index.html index 19fa98ba47..28e363fbee 100644 --- a/release-notes/1.26.0rc2/index.html +++ b/release-notes/1.26.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.0rc2

    Release Candidate

    diff --git a/release-notes/1.26.1.post1/index.html b/release-notes/1.26.1.post1/index.html index 499c1a0a2f..84cc5afc62 100644 --- a/release-notes/1.26.1.post1/index.html +++ b/release-notes/1.26.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.1.post1

    Bugs

    diff --git a/release-notes/1.26.1/index.html b/release-notes/1.26.1/index.html index 8620cf9456..81f6ed5614 100644 --- a/release-notes/1.26.1/index.html +++ b/release-notes/1.26.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.1

    General

    diff --git a/release-notes/1.26.10/index.html b/release-notes/1.26.10/index.html index 9b59417bee..5119e6b4c2 100644 --- a/release-notes/1.26.10/index.html +++ b/release-notes/1.26.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.10

    General

    diff --git a/release-notes/1.26.11/index.html b/release-notes/1.26.11/index.html index 07a69b5fc8..98bd16cd6c 100644 --- a/release-notes/1.26.11/index.html +++ b/release-notes/1.26.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.11

    Clients

    diff --git a/release-notes/1.26.12/index.html b/release-notes/1.26.12/index.html index e715865718..dd16466115 100644 --- a/release-notes/1.26.12/index.html +++ b/release-notes/1.26.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.12

    General

    diff --git a/release-notes/1.26.13/index.html b/release-notes/1.26.13/index.html index ebb87e6b81..b3feff669f 100644 --- a/release-notes/1.26.13/index.html +++ b/release-notes/1.26.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.13

    General

    diff --git a/release-notes/1.26.14/index.html b/release-notes/1.26.14/index.html index 088e0a0a3a..d5138308ff 100644 --- a/release-notes/1.26.14/index.html +++ b/release-notes/1.26.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.14

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.13 release.

    diff --git a/release-notes/1.26.15/index.html b/release-notes/1.26.15/index.html index b279362eb0..3d67bc4d19 100644 --- a/release-notes/1.26.15/index.html +++ b/release-notes/1.26.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.15

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.14 release.

    diff --git a/release-notes/1.26.16/index.html b/release-notes/1.26.16/index.html index b37f75b59d..bc9be1df5e 100644 --- a/release-notes/1.26.16/index.html +++ b/release-notes/1.26.16/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.16

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.15 release.

    diff --git a/release-notes/1.26.17/index.html b/release-notes/1.26.17/index.html index e8ba29bbc1..d262e527bf 100644 --- a/release-notes/1.26.17/index.html +++ b/release-notes/1.26.17/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.17

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.13 release.

    diff --git a/release-notes/1.26.18/index.html b/release-notes/1.26.18/index.html index abd980f70f..f3031a0c56 100644 --- a/release-notes/1.26.18/index.html +++ b/release-notes/1.26.18/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.18

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.17 release.

    diff --git a/release-notes/1.26.2/index.html b/release-notes/1.26.2/index.html index 92cdd0f054..200c68564f 100644 --- a/release-notes/1.26.2/index.html +++ b/release-notes/1.26.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.2

    General

    diff --git a/release-notes/1.26.3/index.html b/release-notes/1.26.3/index.html index ee50343964..a1be574897 100644 --- a/release-notes/1.26.3/index.html +++ b/release-notes/1.26.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.3

    Clients

    diff --git a/release-notes/1.26.4/index.html b/release-notes/1.26.4/index.html index 670695d13a..4c11fb98da 100644 --- a/release-notes/1.26.4/index.html +++ b/release-notes/1.26.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.4

    General

    diff --git a/release-notes/1.26.5/index.html b/release-notes/1.26.5/index.html index c0f84d9852..27d5a871e8 100644 --- a/release-notes/1.26.5/index.html +++ b/release-notes/1.26.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.5

    General

    diff --git a/release-notes/1.26.6/index.html b/release-notes/1.26.6/index.html index 14562f3cd5..2ad9642cdf 100644 --- a/release-notes/1.26.6/index.html +++ b/release-notes/1.26.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.6

    General

    diff --git a/release-notes/1.26.7.post1/index.html b/release-notes/1.26.7.post1/index.html index d39bc96043..8cc32e7dc8 100644 --- a/release-notes/1.26.7.post1/index.html +++ b/release-notes/1.26.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.7.post1

    General

    diff --git a/release-notes/1.26.7/index.html b/release-notes/1.26.7/index.html index 3d8aa10119..1b917e4d66 100644 --- a/release-notes/1.26.7/index.html +++ b/release-notes/1.26.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.7

    Bugs

    diff --git a/release-notes/1.26.8.post1/index.html b/release-notes/1.26.8.post1/index.html index fbce746cde..0460af1cf4 100644 --- a/release-notes/1.26.8.post1/index.html +++ b/release-notes/1.26.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.8.post1

    General

    diff --git a/release-notes/1.26.8/index.html b/release-notes/1.26.8/index.html index e149c88f30..02f7832da0 100644 --- a/release-notes/1.26.8/index.html +++ b/release-notes/1.26.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.8

    General

    diff --git a/release-notes/1.26.9/index.html b/release-notes/1.26.9/index.html index 6ca95592d4..067ab6fcfe 100644 --- a/release-notes/1.26.9/index.html +++ b/release-notes/1.26.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.9

    General

    diff --git a/release-notes/1.27.0.post1/index.html b/release-notes/1.27.0.post1/index.html index 82aee8998b..ac09890520 100644 --- a/release-notes/1.27.0.post1/index.html +++ b/release-notes/1.27.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0.post1

    General

    diff --git a/release-notes/1.27.0/index.html b/release-notes/1.27.0/index.html index fb19e1525d..bedaba2142 100644 --- a/release-notes/1.27.0/index.html +++ b/release-notes/1.27.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0

    Upgrade Instructions

    diff --git a/release-notes/1.27.0rc1/index.html b/release-notes/1.27.0rc1/index.html index 662b9b90a6..65f56dfbb6 100644 --- a/release-notes/1.27.0rc1/index.html +++ b/release-notes/1.27.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0rc1

    Release Candidate

    diff --git a/release-notes/1.27.0rc2/index.html b/release-notes/1.27.0rc2/index.html index 4e891318bb..3711e41fbb 100644 --- a/release-notes/1.27.0rc2/index.html +++ b/release-notes/1.27.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0rc2

    Release Candidate

    diff --git a/release-notes/1.27.1/index.html b/release-notes/1.27.1/index.html index 07b0962447..bd9abab1d6 100644 --- a/release-notes/1.27.1/index.html +++ b/release-notes/1.27.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.1

    General

    diff --git a/release-notes/1.27.10/index.html b/release-notes/1.27.10/index.html index 07fee89208..e2f8021f6c 100644 --- a/release-notes/1.27.10/index.html +++ b/release-notes/1.27.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.10

    General

    diff --git a/release-notes/1.27.11/index.html b/release-notes/1.27.11/index.html index dafea16d4d..49b655ee1e 100644 --- a/release-notes/1.27.11/index.html +++ b/release-notes/1.27.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.11

    General

    diff --git a/release-notes/1.27.12/index.html b/release-notes/1.27.12/index.html index 057522f8da..b6920bd282 100644 --- a/release-notes/1.27.12/index.html +++ b/release-notes/1.27.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.12

    General

    diff --git a/release-notes/1.27.2/index.html b/release-notes/1.27.2/index.html index 16f864b512..ce0e3ac029 100644 --- a/release-notes/1.27.2/index.html +++ b/release-notes/1.27.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.2

    General

    diff --git a/release-notes/1.27.3/index.html b/release-notes/1.27.3/index.html index 38498c7431..786f417884 100644 --- a/release-notes/1.27.3/index.html +++ b/release-notes/1.27.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.3

    General

    diff --git a/release-notes/1.27.4.post1/index.html b/release-notes/1.27.4.post1/index.html index cba715c3ce..bd0324c7d8 100644 --- a/release-notes/1.27.4.post1/index.html +++ b/release-notes/1.27.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.4.post1

    General

    diff --git a/release-notes/1.27.4/index.html b/release-notes/1.27.4/index.html index 0bee173c9f..05b9ea5ca4 100644 --- a/release-notes/1.27.4/index.html +++ b/release-notes/1.27.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.4

    General

    diff --git a/release-notes/1.27.5/index.html b/release-notes/1.27.5/index.html index 5e98c2ad96..6975e48f5f 100644 --- a/release-notes/1.27.5/index.html +++ b/release-notes/1.27.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.5

    General

    diff --git a/release-notes/1.27.6/index.html b/release-notes/1.27.6/index.html index 12d4fcb482..694266bab4 100644 --- a/release-notes/1.27.6/index.html +++ b/release-notes/1.27.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.6

    Clients

    diff --git a/release-notes/1.27.7/index.html b/release-notes/1.27.7/index.html index ae319ef2c8..d21d55e2ef 100644 --- a/release-notes/1.27.7/index.html +++ b/release-notes/1.27.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.7

    General

    diff --git a/release-notes/1.27.8/index.html b/release-notes/1.27.8/index.html index e908167f19..a1bfe8c1d1 100644 --- a/release-notes/1.27.8/index.html +++ b/release-notes/1.27.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.8

    Clients

    diff --git a/release-notes/1.27.9/index.html b/release-notes/1.27.9/index.html index 523d911a05..61a05e5fcd 100644 --- a/release-notes/1.27.9/index.html +++ b/release-notes/1.27.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.9

    General

    diff --git a/release-notes/1.28.0/index.html b/release-notes/1.28.0/index.html index f76307bffa..dce6790e63 100644 --- a/release-notes/1.28.0/index.html +++ b/release-notes/1.28.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.0

    Upgrade Instructions

    diff --git a/release-notes/1.28.0rc1/index.html b/release-notes/1.28.0rc1/index.html index 032afcafd7..4bfc5c6dbe 100644 --- a/release-notes/1.28.0rc1/index.html +++ b/release-notes/1.28.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.0rc1

    Release Candidate

    diff --git a/release-notes/1.28.0rc2/index.html b/release-notes/1.28.0rc2/index.html index 4453e39de7..823d2b4e21 100644 --- a/release-notes/1.28.0rc2/index.html +++ b/release-notes/1.28.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.0rc2

    Release Candidate

    diff --git a/release-notes/1.28.1/index.html b/release-notes/1.28.1/index.html index 153940e754..208217f6d4 100644 --- a/release-notes/1.28.1/index.html +++ b/release-notes/1.28.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.1

    General

    diff --git a/release-notes/1.28.2/index.html b/release-notes/1.28.2/index.html index 52448e8682..b7c31fff71 100644 --- a/release-notes/1.28.2/index.html +++ b/release-notes/1.28.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.2

    General

    diff --git a/release-notes/1.28.3/index.html b/release-notes/1.28.3/index.html index a5803904dc..9eba47c489 100644 --- a/release-notes/1.28.3/index.html +++ b/release-notes/1.28.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.3

    General

    diff --git a/release-notes/1.28.4/index.html b/release-notes/1.28.4/index.html index bd8d660768..ec935cf603 100644 --- a/release-notes/1.28.4/index.html +++ b/release-notes/1.28.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.4

    General

    diff --git a/release-notes/1.28.5/index.html b/release-notes/1.28.5/index.html index a90d1f4583..2958ddb368 100644 --- a/release-notes/1.28.5/index.html +++ b/release-notes/1.28.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.5

    General

    diff --git a/release-notes/1.28.6/index.html b/release-notes/1.28.6/index.html index c21949a12d..a344d713c1 100644 --- a/release-notes/1.28.6/index.html +++ b/release-notes/1.28.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.6

    General

    diff --git a/release-notes/1.28.7/index.html b/release-notes/1.28.7/index.html index e54b6d3270..b11f271234 100644 --- a/release-notes/1.28.7/index.html +++ b/release-notes/1.28.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.7

    General

    diff --git a/release-notes/1.29.0/index.html b/release-notes/1.29.0/index.html index 3decb347ca..0173b42a84 100644 --- a/release-notes/1.29.0/index.html +++ b/release-notes/1.29.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.29.0rc1/index.html b/release-notes/1.29.0rc1/index.html index 784d94c92a..d14b185566 100644 --- a/release-notes/1.29.0rc1/index.html +++ b/release-notes/1.29.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.0rc1

    Release Candidate

    diff --git a/release-notes/1.29.0rc2/index.html b/release-notes/1.29.0rc2/index.html index 4b8a96bc2d..0eab6bde0b 100644 --- a/release-notes/1.29.0rc2/index.html +++ b/release-notes/1.29.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.0rc2

    Release Candidate

    diff --git a/release-notes/1.29.1/index.html b/release-notes/1.29.1/index.html index 54ad4fc3d7..69ca1a49da 100644 --- a/release-notes/1.29.1/index.html +++ b/release-notes/1.29.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.1

    General

    diff --git a/release-notes/1.29.10/index.html b/release-notes/1.29.10/index.html index 48bed4be84..c938e6d9c4 100644 --- a/release-notes/1.29.10/index.html +++ b/release-notes/1.29.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.10

    General

    diff --git a/release-notes/1.29.11/index.html b/release-notes/1.29.11/index.html index 0f90b38c13..fb4bd4bb26 100644 --- a/release-notes/1.29.11/index.html +++ b/release-notes/1.29.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.11

    Clients

    diff --git a/release-notes/1.29.12/index.html b/release-notes/1.29.12/index.html index b61fb01a51..4a8add2663 100644 --- a/release-notes/1.29.12/index.html +++ b/release-notes/1.29.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.12

    WebUI

    diff --git a/release-notes/1.29.13/index.html b/release-notes/1.29.13/index.html index de0845b09f..4fa66226b4 100644 --- a/release-notes/1.29.13/index.html +++ b/release-notes/1.29.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.13

    General

    diff --git a/release-notes/1.29.14/index.html b/release-notes/1.29.14/index.html index 283465e57e..d077ce0766 100644 --- a/release-notes/1.29.14/index.html +++ b/release-notes/1.29.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.14

    General

    diff --git a/release-notes/1.29.15/index.html b/release-notes/1.29.15/index.html index f7162ee1ff..13dfbc2e26 100644 --- a/release-notes/1.29.15/index.html +++ b/release-notes/1.29.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.15

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.14 release.

    diff --git a/release-notes/1.29.16/index.html b/release-notes/1.29.16/index.html index afd3937d49..8957a7020e 100644 --- a/release-notes/1.29.16/index.html +++ b/release-notes/1.29.16/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.16

    General

    diff --git a/release-notes/1.29.17/index.html b/release-notes/1.29.17/index.html index f9bf49fb22..058adad13f 100644 --- a/release-notes/1.29.17/index.html +++ b/release-notes/1.29.17/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.17

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.16 release.

    diff --git a/release-notes/1.29.18/index.html b/release-notes/1.29.18/index.html index 0c4045ed4d..9983192e08 100644 --- a/release-notes/1.29.18/index.html +++ b/release-notes/1.29.18/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.18

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.17 release.

    diff --git a/release-notes/1.29.19/index.html b/release-notes/1.29.19/index.html index 483b89ec83..c82c63036f 100644 --- a/release-notes/1.29.19/index.html +++ b/release-notes/1.29.19/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.19

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.18 release.

    diff --git a/release-notes/1.29.2.post1/index.html b/release-notes/1.29.2.post1/index.html index f326d99c80..c653077210 100644 --- a/release-notes/1.29.2.post1/index.html +++ b/release-notes/1.29.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.2.post1

    Clients

    diff --git a/release-notes/1.29.2.post2/index.html b/release-notes/1.29.2.post2/index.html index aa9876c03d..27d898280f 100644 --- a/release-notes/1.29.2.post2/index.html +++ b/release-notes/1.29.2.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.2.post2

    General

    diff --git a/release-notes/1.29.2/index.html b/release-notes/1.29.2/index.html index 2946257708..0397a951bb 100644 --- a/release-notes/1.29.2/index.html +++ b/release-notes/1.29.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.2

    General

    diff --git a/release-notes/1.29.3.post1/index.html b/release-notes/1.29.3.post1/index.html index d813d7059d..861f9093a0 100644 --- a/release-notes/1.29.3.post1/index.html +++ b/release-notes/1.29.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.3.post1

    General

    diff --git a/release-notes/1.29.3/index.html b/release-notes/1.29.3/index.html index 002bb8cecf..43aa7abbc6 100644 --- a/release-notes/1.29.3/index.html +++ b/release-notes/1.29.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.3

    General

    diff --git a/release-notes/1.29.4/index.html b/release-notes/1.29.4/index.html index 7d1a68e421..ba08e788b6 100644 --- a/release-notes/1.29.4/index.html +++ b/release-notes/1.29.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.4

    General

    diff --git a/release-notes/1.29.5/index.html b/release-notes/1.29.5/index.html index 586c3271ac..f7dec96d41 100644 --- a/release-notes/1.29.5/index.html +++ b/release-notes/1.29.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.5

    General

    diff --git a/release-notes/1.29.6/index.html b/release-notes/1.29.6/index.html index 47abed8152..01d1aa0efd 100644 --- a/release-notes/1.29.6/index.html +++ b/release-notes/1.29.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.6

    General

    diff --git a/release-notes/1.29.7.post1/index.html b/release-notes/1.29.7.post1/index.html index f6144ea376..8552b082a8 100644 --- a/release-notes/1.29.7.post1/index.html +++ b/release-notes/1.29.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.7.post1

    General

    diff --git a/release-notes/1.29.7/index.html b/release-notes/1.29.7/index.html index 5f6a5119ff..7a8f7a580d 100644 --- a/release-notes/1.29.7/index.html +++ b/release-notes/1.29.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.7

    General

    diff --git a/release-notes/1.29.8/index.html b/release-notes/1.29.8/index.html index 781afe52ed..b8b0376274 100644 --- a/release-notes/1.29.8/index.html +++ b/release-notes/1.29.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.8

    General

    diff --git a/release-notes/1.29.9/index.html b/release-notes/1.29.9/index.html index 0a4b24b84f..c30bed6ca2 100644 --- a/release-notes/1.29.9/index.html +++ b/release-notes/1.29.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.9

    General

    diff --git a/release-notes/1.30.0/index.html b/release-notes/1.30.0/index.html index cd5c857a78..750c2258e2 100644 --- a/release-notes/1.30.0/index.html +++ b/release-notes/1.30.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0

    Upgrade Instructions

    diff --git a/release-notes/1.30.0rc1/index.html b/release-notes/1.30.0rc1/index.html index 94796f5952..3ce59ac34f 100644 --- a/release-notes/1.30.0rc1/index.html +++ b/release-notes/1.30.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0rc1

    Release Candidate

    diff --git a/release-notes/1.30.0rc2/index.html b/release-notes/1.30.0rc2/index.html index 2f908046f1..42fbcc87e9 100644 --- a/release-notes/1.30.0rc2/index.html +++ b/release-notes/1.30.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0rc2

    Release Candidate

    diff --git a/release-notes/1.30.0rc3/index.html b/release-notes/1.30.0rc3/index.html index b4eed5538d..15bca641d4 100644 --- a/release-notes/1.30.0rc3/index.html +++ b/release-notes/1.30.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0rc3

    Release Candidate

    diff --git a/release-notes/1.30.1/index.html b/release-notes/1.30.1/index.html index b79a995f3e..52634fbebe 100644 --- a/release-notes/1.30.1/index.html +++ b/release-notes/1.30.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.1

    General

    diff --git a/release-notes/1.30.2/index.html b/release-notes/1.30.2/index.html index 7a1893a33a..911ae22ded 100644 --- a/release-notes/1.30.2/index.html +++ b/release-notes/1.30.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.2

    General

    diff --git a/release-notes/1.30.3/index.html b/release-notes/1.30.3/index.html index 7b86fbe3cd..d105b1028b 100644 --- a/release-notes/1.30.3/index.html +++ b/release-notes/1.30.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.3

    General

    diff --git a/release-notes/1.30.4/index.html b/release-notes/1.30.4/index.html index da0d124eb9..e0425ee95f 100644 --- a/release-notes/1.30.4/index.html +++ b/release-notes/1.30.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.4

    General

    diff --git a/release-notes/1.30.5/index.html b/release-notes/1.30.5/index.html index 2defc6dbed..ef3750073b 100644 --- a/release-notes/1.30.5/index.html +++ b/release-notes/1.30.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.5

    General

    diff --git a/release-notes/1.30.6/index.html b/release-notes/1.30.6/index.html index 552a7befcc..51b9dc6f19 100644 --- a/release-notes/1.30.6/index.html +++ b/release-notes/1.30.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.6

    General

    diff --git a/release-notes/1.30.7/index.html b/release-notes/1.30.7/index.html index 20fc3ae6f6..361855dec4 100644 --- a/release-notes/1.30.7/index.html +++ b/release-notes/1.30.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.7

    General

    diff --git a/release-notes/1.30.8/index.html b/release-notes/1.30.8/index.html index 6e6eb5233c..1b3a45f345 100644 --- a/release-notes/1.30.8/index.html +++ b/release-notes/1.30.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.8

    General

    diff --git a/release-notes/1.31.0/index.html b/release-notes/1.31.0/index.html index cb9e74d840..ed932c94f0 100644 --- a/release-notes/1.31.0/index.html +++ b/release-notes/1.31.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0

    Upgrade Instructions

    diff --git a/release-notes/1.31.0rc1/index.html b/release-notes/1.31.0rc1/index.html index f853faad04..8d4d663deb 100644 --- a/release-notes/1.31.0rc1/index.html +++ b/release-notes/1.31.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0rc1

    Upgrade Instructions

    diff --git a/release-notes/1.31.0rc2/index.html b/release-notes/1.31.0rc2/index.html index dcc067f81d..a4db6bfb0b 100644 --- a/release-notes/1.31.0rc2/index.html +++ b/release-notes/1.31.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0rc2

    Upgrade Instructions

    diff --git a/release-notes/1.31.0rc3/index.html b/release-notes/1.31.0rc3/index.html index d6ccf8d827..9823961aa6 100644 --- a/release-notes/1.31.0rc3/index.html +++ b/release-notes/1.31.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0rc3

    Upgrade Instructions

    diff --git a/release-notes/1.31.1/index.html b/release-notes/1.31.1/index.html index 6361d13368..a166661cc3 100644 --- a/release-notes/1.31.1/index.html +++ b/release-notes/1.31.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.1

    General

    diff --git a/release-notes/1.31.2/index.html b/release-notes/1.31.2/index.html index 6777d605c8..840b70c20d 100644 --- a/release-notes/1.31.2/index.html +++ b/release-notes/1.31.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.2

    General

    diff --git a/release-notes/1.31.3/index.html b/release-notes/1.31.3/index.html index 528127d693..0bf5862a7f 100644 --- a/release-notes/1.31.3/index.html +++ b/release-notes/1.31.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.3

    General

    diff --git a/release-notes/1.31.4/index.html b/release-notes/1.31.4/index.html index 3dafb3c38f..9a6884c28e 100644 --- a/release-notes/1.31.4/index.html +++ b/release-notes/1.31.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.4

    General

    diff --git a/release-notes/1.31.5/index.html b/release-notes/1.31.5/index.html index 9dd9d2a7fb..d0f0f8998f 100644 --- a/release-notes/1.31.5/index.html +++ b/release-notes/1.31.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.5

    General

    diff --git a/release-notes/1.31.6/index.html b/release-notes/1.31.6/index.html index 76e489847c..9109f2ac2b 100644 --- a/release-notes/1.31.6/index.html +++ b/release-notes/1.31.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.6

    General

    diff --git a/release-notes/1.31.7/index.html b/release-notes/1.31.7/index.html index 24d5eb7193..a6bb1fc183 100644 --- a/release-notes/1.31.7/index.html +++ b/release-notes/1.31.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.7

    General

    diff --git a/release-notes/32.0.0/index.html b/release-notes/32.0.0/index.html index 4b3b3b8a68..1288dd95cd 100644 --- a/release-notes/32.0.0/index.html +++ b/release-notes/32.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.0.0

    Long Term Support (LTS)

    diff --git a/release-notes/32.0.0rc1/index.html b/release-notes/32.0.0rc1/index.html index 8b2856b0d0..0366bfb7e1 100644 --- a/release-notes/32.0.0rc1/index.html +++ b/release-notes/32.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    32.0.0rc1

    Release Candidate

    diff --git a/release-notes/32.0.0rc2/index.html b/release-notes/32.0.0rc2/index.html index 45d1be4de9..9a86cea7df 100644 --- a/release-notes/32.0.0rc2/index.html +++ b/release-notes/32.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    32.0.0rc2

    Release Candidate

    diff --git a/release-notes/32.1.0/index.html b/release-notes/32.1.0/index.html index cc5ae81df3..00d9c7ed51 100644 --- a/release-notes/32.1.0/index.html +++ b/release-notes/32.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.1.0

    General

    diff --git a/release-notes/32.2.0/index.html b/release-notes/32.2.0/index.html index 3a2e02990d..d61a3e86a2 100644 --- a/release-notes/32.2.0/index.html +++ b/release-notes/32.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.2.0

    General

    diff --git a/release-notes/32.3.0/index.html b/release-notes/32.3.0/index.html index 2b77730595..747311f54a 100644 --- a/release-notes/32.3.0/index.html +++ b/release-notes/32.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.3.0

    General

    diff --git a/release-notes/32.3.1/index.html b/release-notes/32.3.1/index.html index b7b2ba139a..a5c9a991c2 100644 --- a/release-notes/32.3.1/index.html +++ b/release-notes/32.3.1/index.html @@ -9,8 +9,8 @@ - - + +

    32.3.1

    General

    diff --git a/release-notes/32.4.0/index.html b/release-notes/32.4.0/index.html index 6193ddb863..79e745d7ca 100644 --- a/release-notes/32.4.0/index.html +++ b/release-notes/32.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.4.0

    General

    diff --git a/release-notes/32.5.0.post1/index.html b/release-notes/32.5.0.post1/index.html index 98ad936a69..19766ace71 100644 --- a/release-notes/32.5.0.post1/index.html +++ b/release-notes/32.5.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    32.5.0.post1

    Hotfix release due to rebuild of the containers.

    diff --git a/release-notes/32.5.0/index.html b/release-notes/32.5.0/index.html index 90b51910f5..4f1d0d74c4 100644 --- a/release-notes/32.5.0/index.html +++ b/release-notes/32.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.5.0

    General

    diff --git a/release-notes/32.5.1/index.html b/release-notes/32.5.1/index.html index f9c9f2f0fd..4d77d0ffdc 100644 --- a/release-notes/32.5.1/index.html +++ b/release-notes/32.5.1/index.html @@ -9,8 +9,8 @@ - - + +

    32.5.1

    General

    diff --git a/release-notes/32.6.0.post1/index.html b/release-notes/32.6.0.post1/index.html index 3865731666..337003275b 100644 --- a/release-notes/32.6.0.post1/index.html +++ b/release-notes/32.6.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    32.6.0.post1

    No functional change, trigger container rebuild for dependency-of-dependency issue

    diff --git a/release-notes/32.6.0/index.html b/release-notes/32.6.0/index.html index 1d0888a98d..7057eb5e78 100644 --- a/release-notes/32.6.0/index.html +++ b/release-notes/32.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.6.0

    General

    diff --git a/release-notes/32.7.0/index.html b/release-notes/32.7.0/index.html index a804117ab4..300195389f 100644 --- a/release-notes/32.7.0/index.html +++ b/release-notes/32.7.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.7.0

    General

    diff --git a/release-notes/32.8.0/index.html b/release-notes/32.8.0/index.html index 1717794d0b..9200e57bf2 100644 --- a/release-notes/32.8.0/index.html +++ b/release-notes/32.8.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.0

    General

    diff --git a/release-notes/32.8.1/index.html b/release-notes/32.8.1/index.html index 9b2d2d1535..07e2e46e78 100644 --- a/release-notes/32.8.1/index.html +++ b/release-notes/32.8.1/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.1

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 32.8.0 release.

    diff --git a/release-notes/32.8.2/index.html b/release-notes/32.8.2/index.html index fee1408cbf..9d429ff38a 100644 --- a/release-notes/32.8.2/index.html +++ b/release-notes/32.8.2/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.2

    Clients

    diff --git a/release-notes/32.8.3/index.html b/release-notes/32.8.3/index.html index 9793357483..cd4153517e 100644 --- a/release-notes/32.8.3/index.html +++ b/release-notes/32.8.3/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.3

    General

    diff --git a/release-notes/32.8.4/index.html b/release-notes/32.8.4/index.html new file mode 100644 index 0000000000..0e518cd936 --- /dev/null +++ b/release-notes/32.8.4/index.html @@ -0,0 +1,18 @@ + + + + + +32.8.4 | Rucio Documentation + + + + + + + + + +

    32.8.4

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 32.8.3 release.

    + + \ No newline at end of file diff --git a/release-notes/33.0.0/index.html b/release-notes/33.0.0/index.html index a540b83d81..4f7a512e1a 100644 --- a/release-notes/33.0.0/index.html +++ b/release-notes/33.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0

    Upgrade Instructions

    diff --git a/release-notes/33.0.0rc1/index.html b/release-notes/33.0.0rc1/index.html index 0ba26f1c0e..062c8e437a 100644 --- a/release-notes/33.0.0rc1/index.html +++ b/release-notes/33.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0rc1

    Release Candidate

    diff --git a/release-notes/33.0.0rc2/index.html b/release-notes/33.0.0rc2/index.html index c1fd973ed1..482eaa4145 100644 --- a/release-notes/33.0.0rc2/index.html +++ b/release-notes/33.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0rc2

    Release Candidate

    diff --git a/release-notes/33.0.0rc3/index.html b/release-notes/33.0.0rc3/index.html index b37870aa16..366063a28f 100644 --- a/release-notes/33.0.0rc3/index.html +++ b/release-notes/33.0.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0rc3

    Release Candidate

    diff --git a/release-notes/33.1.0/index.html b/release-notes/33.1.0/index.html index b9a8ef59e1..41ecc58ede 100644 --- a/release-notes/33.1.0/index.html +++ b/release-notes/33.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.1.0

    General

    diff --git a/release-notes/33.2.0/index.html b/release-notes/33.2.0/index.html index 12a804f29d..6752e7d148 100644 --- a/release-notes/33.2.0/index.html +++ b/release-notes/33.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.2.0

    General

    diff --git a/release-notes/33.2.1/index.html b/release-notes/33.2.1/index.html index a3af0867fc..8f0554d5b3 100644 --- a/release-notes/33.2.1/index.html +++ b/release-notes/33.2.1/index.html @@ -9,8 +9,8 @@ - - + +

    33.2.1

    General

    diff --git a/release-notes/33.3.0/index.html b/release-notes/33.3.0/index.html index 16c8a7a804..a88478b9cb 100644 --- a/release-notes/33.3.0/index.html +++ b/release-notes/33.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.3.0

    General

    diff --git a/release-notes/33.4.0.post1/index.html b/release-notes/33.4.0.post1/index.html index 79853dbefb..24889d4965 100644 --- a/release-notes/33.4.0.post1/index.html +++ b/release-notes/33.4.0.post1/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/release-notes/33.4.0/index.html b/release-notes/33.4.0/index.html index b71da07248..54f1a2cfc2 100644 --- a/release-notes/33.4.0/index.html +++ b/release-notes/33.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.4.0

    General

    diff --git a/release-notes/33.5.0/index.html b/release-notes/33.5.0/index.html index e97446c8f7..5dd3d2e654 100644 --- a/release-notes/33.5.0/index.html +++ b/release-notes/33.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.5.0

    General

    diff --git a/release-notes/33.6.0/index.html b/release-notes/33.6.0/index.html index 3fb88d1594..b16b926b4a 100644 --- a/release-notes/33.6.0/index.html +++ b/release-notes/33.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.6.0

    General

    diff --git a/release-notes/33.6.1/index.html b/release-notes/33.6.1/index.html index 867ec1961e..1aa641887c 100644 --- a/release-notes/33.6.1/index.html +++ b/release-notes/33.6.1/index.html @@ -9,8 +9,8 @@ - - + +

    33.6.1

    General

    diff --git a/release-notes/34.0.0/index.html b/release-notes/34.0.0/index.html index 5262f80354..b2d3106b18 100644 --- a/release-notes/34.0.0/index.html +++ b/release-notes/34.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.0.0

    Upgrade Instructions

    diff --git a/release-notes/34.0.0rc1/index.html b/release-notes/34.0.0rc1/index.html index 1cf7f18537..58baeeea3b 100644 --- a/release-notes/34.0.0rc1/index.html +++ b/release-notes/34.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    34.0.0rc1

    Release Candidate

    diff --git a/release-notes/34.0.0rc2/index.html b/release-notes/34.0.0rc2/index.html index 95646f3077..fc694551ed 100644 --- a/release-notes/34.0.0rc2/index.html +++ b/release-notes/34.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    34.0.0rc2

    Release Candidate

    diff --git a/release-notes/34.1.0/index.html b/release-notes/34.1.0/index.html index 568d399019..7ae2aaa744 100644 --- a/release-notes/34.1.0/index.html +++ b/release-notes/34.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.1.0

    General

    diff --git a/release-notes/34.2.0/index.html b/release-notes/34.2.0/index.html index 2c6c9a0394..3e5bb88e34 100644 --- a/release-notes/34.2.0/index.html +++ b/release-notes/34.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.2.0

    General

    diff --git a/release-notes/34.3.0/index.html b/release-notes/34.3.0/index.html index b953ed278e..7c02dc0d34 100644 --- a/release-notes/34.3.0/index.html +++ b/release-notes/34.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.3.0

    General

    diff --git a/release-notes/34.4.0/index.html b/release-notes/34.4.0/index.html index e9d9b716f8..dca96c1999 100644 --- a/release-notes/34.4.0/index.html +++ b/release-notes/34.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.0

    General

    diff --git a/release-notes/34.4.1/index.html b/release-notes/34.4.1/index.html index 226c952dd2..26fbb92ff3 100644 --- a/release-notes/34.4.1/index.html +++ b/release-notes/34.4.1/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.1

    General

    diff --git a/release-notes/34.4.2/index.html b/release-notes/34.4.2/index.html index 3e19c785b5..49fcf3c2e5 100644 --- a/release-notes/34.4.2/index.html +++ b/release-notes/34.4.2/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.2

    General

    diff --git a/release-notes/34.4.3/index.html b/release-notes/34.4.3/index.html index ffefec08a2..4ee7023baf 100644 --- a/release-notes/34.4.3/index.html +++ b/release-notes/34.4.3/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.3

    General

    diff --git a/release-notes/34.5.0/index.html b/release-notes/34.5.0/index.html index c97667363b..cfd0efbf65 100644 --- a/release-notes/34.5.0/index.html +++ b/release-notes/34.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.5.0

    General

    diff --git a/release-notes/34.6.0/index.html b/release-notes/34.6.0/index.html index 25fa912e47..96ffbc812f 100644 --- a/release-notes/34.6.0/index.html +++ b/release-notes/34.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.6.0

    General

    diff --git a/release-notes/35.0.0/index.html b/release-notes/35.0.0/index.html index 8345ede741..884cd4f33a 100644 --- a/release-notes/35.0.0/index.html +++ b/release-notes/35.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.0

    Long Term Support (LTS)

    diff --git a/release-notes/35.0.0rc1/index.html b/release-notes/35.0.0rc1/index.html index 390cd5b37c..eb7ea338ee 100644 --- a/release-notes/35.0.0rc1/index.html +++ b/release-notes/35.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.0rc1

    Release Candidate

    diff --git a/release-notes/35.0.0rc2/index.html b/release-notes/35.0.0rc2/index.html index 3998c70d01..1bd09879c0 100644 --- a/release-notes/35.0.0rc2/index.html +++ b/release-notes/35.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.0rc2

    Release Candidate

    diff --git a/release-notes/35.0.1/index.html b/release-notes/35.0.1/index.html index 42007fb3ec..f4032e9d79 100644 --- a/release-notes/35.0.1/index.html +++ b/release-notes/35.0.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.1

    Clients

    diff --git a/release-notes/35.1.0/index.html b/release-notes/35.1.0/index.html index 74a0348bde..5c582f7fa3 100644 --- a/release-notes/35.1.0/index.html +++ b/release-notes/35.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.1.0

    General

    diff --git a/release-notes/35.1.1/index.html b/release-notes/35.1.1/index.html index ea32e7637b..f0397aff97 100644 --- a/release-notes/35.1.1/index.html +++ b/release-notes/35.1.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.1.1

    General

    diff --git a/release-notes/35.2.0/index.html b/release-notes/35.2.0/index.html index 0a2d71c012..96be59eafc 100644 --- a/release-notes/35.2.0/index.html +++ b/release-notes/35.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.2.0

    General

    diff --git a/release-notes/35.2.1/index.html b/release-notes/35.2.1/index.html index 785e1708d6..3c7624e1a6 100644 --- a/release-notes/35.2.1/index.html +++ b/release-notes/35.2.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.2.1

    General

    diff --git a/release-notes/35.3.0/index.html b/release-notes/35.3.0/index.html index 96b5154895..ee5899e65f 100644 --- a/release-notes/35.3.0/index.html +++ b/release-notes/35.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.3.0

    General

    diff --git a/release-notes/35.4.0/index.html b/release-notes/35.4.0/index.html index 606e1225fb..7068d37b6c 100644 --- a/release-notes/35.4.0/index.html +++ b/release-notes/35.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.4.0

    General

    diff --git a/release-notes/35.4.1/index.html b/release-notes/35.4.1/index.html index cc74a42555..d0a9db1286 100644 --- a/release-notes/35.4.1/index.html +++ b/release-notes/35.4.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.4.1

    General

    diff --git a/release-notes/35.5.0/index.html b/release-notes/35.5.0/index.html index d64e4c61af..3be529be18 100644 --- a/release-notes/35.5.0/index.html +++ b/release-notes/35.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.5.0

    General

    diff --git a/release-notes/35.6.0/index.html b/release-notes/35.6.0/index.html index d9296dfd47..e3578b3902 100644 --- a/release-notes/35.6.0/index.html +++ b/release-notes/35.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.6.0

    General

    diff --git a/release-notes/36.0.0.post1/index.html b/release-notes/36.0.0.post1/index.html index 19d34437a1..dfabaeae5f 100644 --- a/release-notes/36.0.0.post1/index.html +++ b/release-notes/36.0.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0.post1

    Important changes

    diff --git a/release-notes/36.0.0.post2/index.html b/release-notes/36.0.0.post2/index.html index 27f90f6994..392ff40f15 100644 --- a/release-notes/36.0.0.post2/index.html +++ b/release-notes/36.0.0.post2/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0.post2

    Important changes

    diff --git a/release-notes/36.0.0/index.html b/release-notes/36.0.0/index.html index 94bbe3d817..10b12d348e 100644 --- a/release-notes/36.0.0/index.html +++ b/release-notes/36.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0

    Important changes

    diff --git a/release-notes/36.0.0rc1/index.html b/release-notes/36.0.0rc1/index.html index 19d7aa42d8..4b9c816d2a 100644 --- a/release-notes/36.0.0rc1/index.html +++ b/release-notes/36.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0rc1

    Release Candidate

    diff --git a/release-notes/36.0.0rc2/index.html b/release-notes/36.0.0rc2/index.html index fabbe2c90f..b528903ab6 100644 --- a/release-notes/36.0.0rc2/index.html +++ b/release-notes/36.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0rc2

    Release Candidate

    diff --git a/release-notes/36.0.0rc3/index.html b/release-notes/36.0.0rc3/index.html index adf8701a0f..cd0f26388e 100644 --- a/release-notes/36.0.0rc3/index.html +++ b/release-notes/36.0.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0rc3

    Release Candidate

    diff --git a/release-notes/36.0.0rc4/index.html b/release-notes/36.0.0rc4/index.html index 860fb72233..e0a0f84989 100644 --- a/release-notes/36.0.0rc4/index.html +++ b/release-notes/36.0.0rc4/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0rc4

    Release Candidate

    diff --git a/release-notes/36.0.0rc5/index.html b/release-notes/36.0.0rc5/index.html index ddda255c56..a557db13b7 100644 --- a/release-notes/36.0.0rc5/index.html +++ b/release-notes/36.0.0rc5/index.html @@ -9,8 +9,8 @@ - - + +

    36.0.0rc5

    Release Candidate

    diff --git a/release-notes/index.html b/release-notes/index.html index f7afa633e1..cc67ea7bf1 100644 --- a/release-notes/index.html +++ b/release-notes/index.html @@ -9,8 +9,8 @@ - - + +

    Release Notes

    We list the release notes in reverse chronological order, with the newest @@ -75,6 +75,7 @@

    32 The Good, The Bad and the Donkey

    \ No newline at end of file diff --git a/search/index.html b/search/index.html index 4d1e70f088..189a7790d9 100644 --- a/search/index.html +++ b/search/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/sig_metadata/index.html b/sig_metadata/index.html index 6783d7fdc1..2fb874aa64 100644 --- a/sig_metadata/index.html +++ b/sig_metadata/index.html @@ -9,8 +9,8 @@ - - + +
    +
    DocumentCreation
    Rucio SIG Metadata interim reportMar 25, 2024
    \ No newline at end of file diff --git a/sig_qualityofservice/index.html b/sig_qualityofservice/index.html index 8058f05801..b1b8243fb9 100644 --- a/sig_qualityofservice/index.html +++ b/sig_qualityofservice/index.html @@ -9,8 +9,8 @@ - - + +
    +

    Doug Benjamin

    \ No newline at end of file diff --git a/sig_tokens/index.html b/sig_tokens/index.html index d005ca1a4d..ae8bbc7aea 100644 --- a/sig_tokens/index.html +++ b/sig_tokens/index.html @@ -9,8 +9,8 @@ - - + +
    +
    VersionCreation
    v0.1Sep 25, 2023
    \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index c35a9148c4..9cf5ff8323 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://rucio.github.io/documentation/searchweekly0.5https://rucio.github.io/documentation/about_our_contributorsweekly0.5https://rucio.github.io/documentation/bin/rucioweekly0.5https://rucio.github.io/documentation/bin/rucio-abacus-accountweekly0.5https://rucio.github.io/documentation/bin/rucio-abacus-collection-replicaweekly0.5https://rucio.github.io/documentation/bin/rucio-abacus-rseweekly0.5https://rucio.github.io/documentation/bin/rucio-adminweekly0.5https://rucio.github.io/documentation/bin/rucio-atroposweekly0.5https://rucio.github.io/documentation/bin/rucio-auditorweekly0.5https://rucio.github.io/documentation/bin/rucio-automatixweekly0.5https://rucio.github.io/documentation/bin/rucio-bb8weekly0.5https://rucio.github.io/documentation/bin/rucio-c3poweekly0.5https://rucio.github.io/documentation/bin/rucio-cache-clientweekly0.5https://rucio.github.io/documentation/bin/rucio-cache-consumerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-finisherweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-pollerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-preparerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-receiverweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-stagerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-submitterweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-throttlerweekly0.5https://rucio.github.io/documentation/bin/rucio-dark-reaperweekly0.5https://rucio.github.io/documentation/bin/rucio-dumperweekly0.5https://rucio.github.io/documentation/bin/rucio-followerweekly0.5https://rucio.github.io/documentation/bin/rucio-hermesweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-cleanerweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-evaluatorweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-injectorweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-repairerweekly0.5https://rucio.github.io/documentation/bin/rucio-kronosweekly0.5https://rucio.github.io/documentation/bin/rucio-minosweekly0.5https://rucio.github.io/documentation/bin/rucio-minos-temporary-expirationweekly0.5https://rucio.github.io/documentation/bin/rucio-necromancerweekly0.5https://rucio.github.io/documentation/bin/rucio-oauth-managerweekly0.5https://rucio.github.io/documentation/bin/rucio-reaperweekly0.5https://rucio.github.io/documentation/bin/rucio-replica-recovererweekly0.5https://rucio.github.io/documentation/bin/rucio-rse-decommissionerweekly0.5https://rucio.github.io/documentation/bin/rucio-storage-consistency-actionsweekly0.5https://rucio.github.io/documentation/bin/rucio-transmogrifierweekly0.5https://rucio.github.io/documentation/bin/rucio-undertakerweekly0.5https://rucio.github.io/documentation/component_leadsweekly0.5https://rucio.github.io/documentation/contact_usweekly0.5https://rucio.github.io/documentation/contributingweekly0.5https://rucio.github.io/documentation/developer/dependency_managementweekly0.5https://rucio.github.io/documentation/developer/dev_style_guideweekly0.5https://rucio.github.io/documentation/developer/project_structureweekly0.5https://rucio.github.io/documentation/developer/rest_api_docweekly0.5https://rucio.github.io/documentation/developer/setting_up_intellij_dev_envweekly0.5https://rucio.github.io/documentation/developer/setting_up_mac_apple_siliconweekly0.5https://rucio.github.io/documentation/developer/setting_up_vscode_dev_envweekly0.5https://rucio.github.io/documentation/developer/type_annotation_guideweekly0.5https://rucio.github.io/documentation/developer/webui/streamedtablesweekly0.5https://rucio.github.io/documentation/developer/webui/webui_frontendweekly0.5https://rucio.github.io/documentation/developer/webui/webui_frontend_vscode_dev_envweekly0.5https://rucio.github.io/documentation/join_rucio_mattermostweekly0.5https://rucio.github.io/documentation/operator/administrationweekly0.5https://rucio.github.io/documentation/operator/configurationweekly0.5https://rucio.github.io/documentation/operator/configuration_parametersweekly0.5https://rucio.github.io/documentation/operator/databaseweekly0.5https://rucio.github.io/documentation/operator/did_metaweekly0.5https://rucio.github.io/documentation/operator/installing_daemonsweekly0.5https://rucio.github.io/documentation/operator/installing_serverweekly0.5https://rucio.github.io/documentation/operator/k8s_guideweekly0.5https://rucio.github.io/documentation/operator/kubernetesweekly0.5https://rucio.github.io/documentation/operator/monitoringweekly0.5https://rucio.github.io/documentation/operator/multi_vo_rucioweekly0.5https://rucio.github.io/documentation/operator/notificationsweekly0.5https://rucio.github.io/documentation/operator/policy_packagesweekly0.5https://rucio.github.io/documentation/operator/qos_rse_configweekly0.5https://rucio.github.io/documentation/operator/s3_rse_configweekly0.5https://rucio.github.io/documentation/operator/setting_up_demoweekly0.5https://rucio.github.io/documentation/operator/transfers/configure-rucio-fts3-pluginsweekly0.5https://rucio.github.io/documentation/operator/transfers/configure-rucio-globusweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-overviewweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-preparerweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-submitterweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-throttlerweekly0.5https://rucio.github.io/documentation/project_organisationweekly0.5https://rucio.github.io/documentation/release-notesweekly0.5https://rucio.github.io/documentation/release-notes/1.13.3weekly0.5https://rucio.github.io/documentation/release-notes/1.14.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.14.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.14.10weekly0.5https://rucio.github.io/documentation/release-notes/1.14.11weekly0.5https://rucio.github.io/documentation/release-notes/1.14.2weekly0.5https://rucio.github.io/documentation/release-notes/1.14.3weekly0.5https://rucio.github.io/documentation/release-notes/1.14.4weekly0.5https://rucio.github.io/documentation/release-notes/1.14.5weekly0.5https://rucio.github.io/documentation/release-notes/1.14.6weekly0.5https://rucio.github.io/documentation/release-notes/1.14.7weekly0.5https://rucio.github.io/documentation/release-notes/1.14.8weekly0.5https://rucio.github.io/documentation/release-notes/1.14.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.14.8.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.14.9weekly0.5https://rucio.github.io/documentation/release-notes/1.14.9.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.0weekly0.5https://rucio.github.io/documentation/release-notes/1.15.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.2weekly0.5https://rucio.github.io/documentation/release-notes/1.15.3weekly0.5https://rucio.github.io/documentation/release-notes/1.15.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.4weekly0.5https://rucio.github.io/documentation/release-notes/1.15.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.5weekly0.5https://rucio.github.io/documentation/release-notes/1.16.0weekly0.5https://rucio.github.io/documentation/release-notes/1.16.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.16.1weekly0.5https://rucio.github.io/documentation/release-notes/1.16.2weekly0.5https://rucio.github.io/documentation/release-notes/1.16.3weekly0.5https://rucio.github.io/documentation/release-notes/1.16.4weekly0.5https://rucio.github.io/documentation/release-notes/1.17.0weekly0.5https://rucio.github.io/documentation/release-notes/1.17.1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.2weekly0.5https://rucio.github.io/documentation/release-notes/1.17.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.3weekly0.5https://rucio.github.io/documentation/release-notes/1.17.4weekly0.5https://rucio.github.io/documentation/release-notes/1.17.5weekly0.5https://rucio.github.io/documentation/release-notes/1.17.6weekly0.5https://rucio.github.io/documentation/release-notes/1.17.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.6.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.17.7weekly0.5https://rucio.github.io/documentation/release-notes/1.17.8weekly0.5https://rucio.github.io/documentation/release-notes/1.17.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.8.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.18.0weekly0.5https://rucio.github.io/documentation/release-notes/1.18.1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.2weekly0.5https://rucio.github.io/documentation/release-notes/1.18.3weekly0.5https://rucio.github.io/documentation/release-notes/1.18.4weekly0.5https://rucio.github.io/documentation/release-notes/1.18.5weekly0.5https://rucio.github.io/documentation/release-notes/1.18.5.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.6weekly0.5https://rucio.github.io/documentation/release-notes/1.18.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.7weekly0.5https://rucio.github.io/documentation/release-notes/1.18.8weekly0.5https://rucio.github.io/documentation/release-notes/1.18.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.9weekly0.5https://rucio.github.io/documentation/release-notes/1.19.0.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.19.1weekly0.5https://rucio.github.io/documentation/release-notes/1.19.2weekly0.5https://rucio.github.io/documentation/release-notes/1.19.3weekly0.5https://rucio.github.io/documentation/release-notes/1.19.4weekly0.5https://rucio.github.io/documentation/release-notes/1.19.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.19.4.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.19.5weekly0.5https://rucio.github.io/documentation/release-notes/1.19.6weekly0.5https://rucio.github.io/documentation/release-notes/1.19.7weekly0.5https://rucio.github.io/documentation/release-notes/1.19.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.19.8weekly0.5https://rucio.github.io/documentation/release-notes/1.20.0weekly0.5https://rucio.github.io/documentation/release-notes/1.20.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.10weekly0.5https://rucio.github.io/documentation/release-notes/1.20.11weekly0.5https://rucio.github.io/documentation/release-notes/1.20.12weekly0.5https://rucio.github.io/documentation/release-notes/1.20.13weekly0.5https://rucio.github.io/documentation/release-notes/1.20.14weekly0.5https://rucio.github.io/documentation/release-notes/1.20.15weekly0.5https://rucio.github.io/documentation/release-notes/1.20.16weekly0.5https://rucio.github.io/documentation/release-notes/1.20.2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.3weekly0.5https://rucio.github.io/documentation/release-notes/1.20.3rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.3rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.20.5weekly0.5https://rucio.github.io/documentation/release-notes/1.20.6weekly0.5https://rucio.github.io/documentation/release-notes/1.20.7weekly0.5https://rucio.github.io/documentation/release-notes/1.20.8weekly0.5https://rucio.github.io/documentation/release-notes/1.20.9weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.21.1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.10weekly0.5https://rucio.github.io/documentation/release-notes/1.21.10.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.11weekly0.5https://rucio.github.io/documentation/release-notes/1.21.12weekly0.5https://rucio.github.io/documentation/release-notes/1.21.2weekly0.5https://rucio.github.io/documentation/release-notes/1.21.3weekly0.5https://rucio.github.io/documentation/release-notes/1.21.4weekly0.5https://rucio.github.io/documentation/release-notes/1.21.5weekly0.5https://rucio.github.io/documentation/release-notes/1.21.6weekly0.5https://rucio.github.io/documentation/release-notes/1.21.7weekly0.5https://rucio.github.io/documentation/release-notes/1.21.8weekly0.5https://rucio.github.io/documentation/release-notes/1.21.9weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0.dev2weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0.dev3weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.22.1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.2weekly0.5https://rucio.github.io/documentation/release-notes/1.22.3weekly0.5https://rucio.github.io/documentation/release-notes/1.22.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.4weekly0.5https://rucio.github.io/documentation/release-notes/1.22.4.dev1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.5weekly0.5https://rucio.github.io/documentation/release-notes/1.22.6weekly0.5https://rucio.github.io/documentation/release-notes/1.22.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.7weekly0.5https://rucio.github.io/documentation/release-notes/1.22.8weekly0.5https://rucio.github.io/documentation/release-notes/1.22.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.0weekly0.5https://rucio.github.io/documentation/release-notes/1.23.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.10weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post3weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post4weekly0.5https://rucio.github.io/documentation/release-notes/1.23.12weekly0.5https://rucio.github.io/documentation/release-notes/1.23.13weekly0.5https://rucio.github.io/documentation/release-notes/1.23.14weekly0.5https://rucio.github.io/documentation/release-notes/1.23.15weekly0.5https://rucio.github.io/documentation/release-notes/1.23.16weekly0.5https://rucio.github.io/documentation/release-notes/1.23.17weekly0.5https://rucio.github.io/documentation/release-notes/1.23.18weekly0.5https://rucio.github.io/documentation/release-notes/1.23.19weekly0.5https://rucio.github.io/documentation/release-notes/1.23.2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.2.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.20weekly0.5https://rucio.github.io/documentation/release-notes/1.23.3weekly0.5https://rucio.github.io/documentation/release-notes/1.23.4weekly0.5https://rucio.github.io/documentation/release-notes/1.23.5weekly0.5https://rucio.github.io/documentation/release-notes/1.23.5.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.6weekly0.5https://rucio.github.io/documentation/release-notes/1.23.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.7weekly0.5https://rucio.github.io/documentation/release-notes/1.23.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.8weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post3weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post4weekly0.5https://rucio.github.io/documentation/release-notes/1.24.0weekly0.5https://rucio.github.io/documentation/release-notes/1.24.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post3weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post4weekly0.5https://rucio.github.io/documentation/release-notes/1.24.2weekly0.5https://rucio.github.io/documentation/release-notes/1.24.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.3weekly0.5https://rucio.github.io/documentation/release-notes/1.24.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.4weekly0.5https://rucio.github.io/documentation/release-notes/1.24.5weekly0.5https://rucio.github.io/documentation/release-notes/1.24.5.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.0weekly0.5https://rucio.github.io/documentation/release-notes/1.25.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.1.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.3weekly0.5https://rucio.github.io/documentation/release-notes/1.25.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.3.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.4weekly0.5https://rucio.github.io/documentation/release-notes/1.25.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.5weekly0.5https://rucio.github.io/documentation/release-notes/1.25.6weekly0.5https://rucio.github.io/documentation/release-notes/1.25.7weekly0.5https://rucio.github.io/documentation/release-notes/1.26.0weekly0.5https://rucio.github.io/documentation/release-notes/1.26.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.26.1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.10weekly0.5https://rucio.github.io/documentation/release-notes/1.26.11weekly0.5https://rucio.github.io/documentation/release-notes/1.26.12weekly0.5https://rucio.github.io/documentation/release-notes/1.26.13weekly0.5https://rucio.github.io/documentation/release-notes/1.26.14weekly0.5https://rucio.github.io/documentation/release-notes/1.26.15weekly0.5https://rucio.github.io/documentation/release-notes/1.26.16weekly0.5https://rucio.github.io/documentation/release-notes/1.26.17weekly0.5https://rucio.github.io/documentation/release-notes/1.26.18weekly0.5https://rucio.github.io/documentation/release-notes/1.26.2weekly0.5https://rucio.github.io/documentation/release-notes/1.26.3weekly0.5https://rucio.github.io/documentation/release-notes/1.26.4weekly0.5https://rucio.github.io/documentation/release-notes/1.26.5weekly0.5https://rucio.github.io/documentation/release-notes/1.26.6weekly0.5https://rucio.github.io/documentation/release-notes/1.26.7weekly0.5https://rucio.github.io/documentation/release-notes/1.26.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.8weekly0.5https://rucio.github.io/documentation/release-notes/1.26.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.9weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.27.1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.10weekly0.5https://rucio.github.io/documentation/release-notes/1.27.11weekly0.5https://rucio.github.io/documentation/release-notes/1.27.12weekly0.5https://rucio.github.io/documentation/release-notes/1.27.2weekly0.5https://rucio.github.io/documentation/release-notes/1.27.3weekly0.5https://rucio.github.io/documentation/release-notes/1.27.4weekly0.5https://rucio.github.io/documentation/release-notes/1.27.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.5weekly0.5https://rucio.github.io/documentation/release-notes/1.27.6weekly0.5https://rucio.github.io/documentation/release-notes/1.27.7weekly0.5https://rucio.github.io/documentation/release-notes/1.27.8weekly0.5https://rucio.github.io/documentation/release-notes/1.27.9weekly0.5https://rucio.github.io/documentation/release-notes/1.28.0weekly0.5https://rucio.github.io/documentation/release-notes/1.28.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.28.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.28.1weekly0.5https://rucio.github.io/documentation/release-notes/1.28.2weekly0.5https://rucio.github.io/documentation/release-notes/1.28.3weekly0.5https://rucio.github.io/documentation/release-notes/1.28.4weekly0.5https://rucio.github.io/documentation/release-notes/1.28.5weekly0.5https://rucio.github.io/documentation/release-notes/1.28.6weekly0.5https://rucio.github.io/documentation/release-notes/1.28.7weekly0.5https://rucio.github.io/documentation/release-notes/1.29.0weekly0.5https://rucio.github.io/documentation/release-notes/1.29.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.29.1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.10weekly0.5https://rucio.github.io/documentation/release-notes/1.29.11weekly0.5https://rucio.github.io/documentation/release-notes/1.29.12weekly0.5https://rucio.github.io/documentation/release-notes/1.29.13weekly0.5https://rucio.github.io/documentation/release-notes/1.29.14weekly0.5https://rucio.github.io/documentation/release-notes/1.29.15weekly0.5https://rucio.github.io/documentation/release-notes/1.29.16weekly0.5https://rucio.github.io/documentation/release-notes/1.29.17weekly0.5https://rucio.github.io/documentation/release-notes/1.29.18weekly0.5https://rucio.github.io/documentation/release-notes/1.29.19weekly0.5https://rucio.github.io/documentation/release-notes/1.29.2weekly0.5https://rucio.github.io/documentation/release-notes/1.29.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.2.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.29.3weekly0.5https://rucio.github.io/documentation/release-notes/1.29.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.4weekly0.5https://rucio.github.io/documentation/release-notes/1.29.5weekly0.5https://rucio.github.io/documentation/release-notes/1.29.6weekly0.5https://rucio.github.io/documentation/release-notes/1.29.7weekly0.5https://rucio.github.io/documentation/release-notes/1.29.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.8weekly0.5https://rucio.github.io/documentation/release-notes/1.29.9weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.30.1weekly0.5https://rucio.github.io/documentation/release-notes/1.30.2weekly0.5https://rucio.github.io/documentation/release-notes/1.30.3weekly0.5https://rucio.github.io/documentation/release-notes/1.30.4weekly0.5https://rucio.github.io/documentation/release-notes/1.30.5weekly0.5https://rucio.github.io/documentation/release-notes/1.30.6weekly0.5https://rucio.github.io/documentation/release-notes/1.30.7weekly0.5https://rucio.github.io/documentation/release-notes/1.30.8weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.31.1weekly0.5https://rucio.github.io/documentation/release-notes/1.31.2weekly0.5https://rucio.github.io/documentation/release-notes/1.31.3weekly0.5https://rucio.github.io/documentation/release-notes/1.31.4weekly0.5https://rucio.github.io/documentation/release-notes/1.31.5weekly0.5https://rucio.github.io/documentation/release-notes/1.31.6weekly0.5https://rucio.github.io/documentation/release-notes/1.31.7weekly0.5https://rucio.github.io/documentation/release-notes/32.0.0weekly0.5https://rucio.github.io/documentation/release-notes/32.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/32.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/32.1.0weekly0.5https://rucio.github.io/documentation/release-notes/32.2.0weekly0.5https://rucio.github.io/documentation/release-notes/32.3.0weekly0.5https://rucio.github.io/documentation/release-notes/32.3.1weekly0.5https://rucio.github.io/documentation/release-notes/32.4.0weekly0.5https://rucio.github.io/documentation/release-notes/32.5.0weekly0.5https://rucio.github.io/documentation/release-notes/32.5.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/32.5.1weekly0.5https://rucio.github.io/documentation/release-notes/32.6.0weekly0.5https://rucio.github.io/documentation/release-notes/32.6.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/32.7.0weekly0.5https://rucio.github.io/documentation/release-notes/32.8.0weekly0.5https://rucio.github.io/documentation/release-notes/32.8.1weekly0.5https://rucio.github.io/documentation/release-notes/32.8.2weekly0.5https://rucio.github.io/documentation/release-notes/32.8.3weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/33.1.0weekly0.5https://rucio.github.io/documentation/release-notes/33.2.0weekly0.5https://rucio.github.io/documentation/release-notes/33.2.1weekly0.5https://rucio.github.io/documentation/release-notes/33.3.0weekly0.5https://rucio.github.io/documentation/release-notes/33.4.0weekly0.5https://rucio.github.io/documentation/release-notes/33.4.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/33.5.0weekly0.5https://rucio.github.io/documentation/release-notes/33.6.0weekly0.5https://rucio.github.io/documentation/release-notes/33.6.1weekly0.5https://rucio.github.io/documentation/release-notes/34.0.0weekly0.5https://rucio.github.io/documentation/release-notes/34.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/34.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/34.1.0weekly0.5https://rucio.github.io/documentation/release-notes/34.2.0weekly0.5https://rucio.github.io/documentation/release-notes/34.3.0weekly0.5https://rucio.github.io/documentation/release-notes/34.4.0weekly0.5https://rucio.github.io/documentation/release-notes/34.4.1weekly0.5https://rucio.github.io/documentation/release-notes/34.4.2weekly0.5https://rucio.github.io/documentation/release-notes/34.4.3weekly0.5https://rucio.github.io/documentation/release-notes/34.5.0weekly0.5https://rucio.github.io/documentation/release-notes/34.6.0weekly0.5https://rucio.github.io/documentation/release-notes/35.0.0weekly0.5https://rucio.github.io/documentation/release-notes/35.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/35.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/35.0.1weekly0.5https://rucio.github.io/documentation/release-notes/35.1.0weekly0.5https://rucio.github.io/documentation/release-notes/35.1.1weekly0.5https://rucio.github.io/documentation/release-notes/35.2.0weekly0.5https://rucio.github.io/documentation/release-notes/35.2.1weekly0.5https://rucio.github.io/documentation/release-notes/35.3.0weekly0.5https://rucio.github.io/documentation/release-notes/35.4.0weekly0.5https://rucio.github.io/documentation/release-notes/35.4.1weekly0.5https://rucio.github.io/documentation/release-notes/35.5.0weekly0.5https://rucio.github.io/documentation/release-notes/35.6.0weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0.post2weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc4weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc5weekly0.5https://rucio.github.io/documentation/rucio_advisory_boardweekly0.5https://rucio.github.io/documentation/sig_metadataweekly0.5https://rucio.github.io/documentation/sig_qualityofserviceweekly0.5https://rucio.github.io/documentation/sig_tokensweekly0.5https://rucio.github.io/documentation/special_interest_groupsweekly0.5https://rucio.github.io/documentation/started/additional_layers_and_resourcesweekly0.5https://rucio.github.io/documentation/started/before_you_get_startedweekly0.5https://rucio.github.io/documentation/started/concepts/accounting_and_quotaweekly0.5https://rucio.github.io/documentation/started/concepts/file_dataset_containerweekly0.5https://rucio.github.io/documentation/started/concepts/metadata_attributesweekly0.5https://rucio.github.io/documentation/started/concepts/notificationsweekly0.5https://rucio.github.io/documentation/started/concepts/permission_modelweekly0.5https://rucio.github.io/documentation/started/concepts/replica_managementweekly0.5https://rucio.github.io/documentation/started/concepts/replica_workflowweekly0.5https://rucio.github.io/documentation/started/concepts/replication_rules_examplesweekly0.5https://rucio.github.io/documentation/started/concepts/rse_expressionsweekly0.5https://rucio.github.io/documentation/started/concepts/rucio_accountweekly0.5https://rucio.github.io/documentation/started/concepts/rucio_storage_elementweekly0.5https://rucio.github.io/documentation/started/concepts/subscriptionsweekly0.5https://rucio.github.io/documentation/started/daemonsweekly0.5https://rucio.github.io/documentation/started/main_componentsweekly0.5https://rucio.github.io/documentation/started/releasepolicyweekly0.5https://rucio.github.io/documentation/started/requirementsweekly0.5https://rucio.github.io/documentation/started/what_is_rucioweekly0.5https://rucio.github.io/documentation/user/configuring_the_clientweekly0.5https://rucio.github.io/documentation/user/developing_with_rucioweekly0.5https://rucio.github.io/documentation/user/setting_up_the_rucio_clientweekly0.5https://rucio.github.io/documentation/user/using_the_admin_clientweekly0.5https://rucio.github.io/documentation/user/using_the_clientweekly0.5https://rucio.github.io/documentation/weekly0.5 \ No newline at end of file +https://rucio.github.io/documentation/searchweekly0.5https://rucio.github.io/documentation/about_our_contributorsweekly0.5https://rucio.github.io/documentation/bin/rucioweekly0.5https://rucio.github.io/documentation/bin/rucio-abacus-accountweekly0.5https://rucio.github.io/documentation/bin/rucio-abacus-collection-replicaweekly0.5https://rucio.github.io/documentation/bin/rucio-abacus-rseweekly0.5https://rucio.github.io/documentation/bin/rucio-adminweekly0.5https://rucio.github.io/documentation/bin/rucio-atroposweekly0.5https://rucio.github.io/documentation/bin/rucio-auditorweekly0.5https://rucio.github.io/documentation/bin/rucio-automatixweekly0.5https://rucio.github.io/documentation/bin/rucio-bb8weekly0.5https://rucio.github.io/documentation/bin/rucio-c3poweekly0.5https://rucio.github.io/documentation/bin/rucio-cache-clientweekly0.5https://rucio.github.io/documentation/bin/rucio-cache-consumerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-finisherweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-pollerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-preparerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-receiverweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-stagerweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-submitterweekly0.5https://rucio.github.io/documentation/bin/rucio-conveyor-throttlerweekly0.5https://rucio.github.io/documentation/bin/rucio-dark-reaperweekly0.5https://rucio.github.io/documentation/bin/rucio-dumperweekly0.5https://rucio.github.io/documentation/bin/rucio-followerweekly0.5https://rucio.github.io/documentation/bin/rucio-hermesweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-cleanerweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-evaluatorweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-injectorweekly0.5https://rucio.github.io/documentation/bin/rucio-judge-repairerweekly0.5https://rucio.github.io/documentation/bin/rucio-kronosweekly0.5https://rucio.github.io/documentation/bin/rucio-minosweekly0.5https://rucio.github.io/documentation/bin/rucio-minos-temporary-expirationweekly0.5https://rucio.github.io/documentation/bin/rucio-necromancerweekly0.5https://rucio.github.io/documentation/bin/rucio-oauth-managerweekly0.5https://rucio.github.io/documentation/bin/rucio-reaperweekly0.5https://rucio.github.io/documentation/bin/rucio-replica-recovererweekly0.5https://rucio.github.io/documentation/bin/rucio-rse-decommissionerweekly0.5https://rucio.github.io/documentation/bin/rucio-storage-consistency-actionsweekly0.5https://rucio.github.io/documentation/bin/rucio-transmogrifierweekly0.5https://rucio.github.io/documentation/bin/rucio-undertakerweekly0.5https://rucio.github.io/documentation/component_leadsweekly0.5https://rucio.github.io/documentation/contact_usweekly0.5https://rucio.github.io/documentation/contributingweekly0.5https://rucio.github.io/documentation/developer/dependency_managementweekly0.5https://rucio.github.io/documentation/developer/dev_style_guideweekly0.5https://rucio.github.io/documentation/developer/project_structureweekly0.5https://rucio.github.io/documentation/developer/rest_api_docweekly0.5https://rucio.github.io/documentation/developer/setting_up_intellij_dev_envweekly0.5https://rucio.github.io/documentation/developer/setting_up_mac_apple_siliconweekly0.5https://rucio.github.io/documentation/developer/setting_up_vscode_dev_envweekly0.5https://rucio.github.io/documentation/developer/type_annotation_guideweekly0.5https://rucio.github.io/documentation/developer/webui/streamedtablesweekly0.5https://rucio.github.io/documentation/developer/webui/webui_frontendweekly0.5https://rucio.github.io/documentation/developer/webui/webui_frontend_vscode_dev_envweekly0.5https://rucio.github.io/documentation/join_rucio_mattermostweekly0.5https://rucio.github.io/documentation/operator/administrationweekly0.5https://rucio.github.io/documentation/operator/configurationweekly0.5https://rucio.github.io/documentation/operator/configuration_parametersweekly0.5https://rucio.github.io/documentation/operator/databaseweekly0.5https://rucio.github.io/documentation/operator/did_metaweekly0.5https://rucio.github.io/documentation/operator/installing_daemonsweekly0.5https://rucio.github.io/documentation/operator/installing_serverweekly0.5https://rucio.github.io/documentation/operator/k8s_guideweekly0.5https://rucio.github.io/documentation/operator/kubernetesweekly0.5https://rucio.github.io/documentation/operator/monitoringweekly0.5https://rucio.github.io/documentation/operator/multi_vo_rucioweekly0.5https://rucio.github.io/documentation/operator/notificationsweekly0.5https://rucio.github.io/documentation/operator/policy_packagesweekly0.5https://rucio.github.io/documentation/operator/qos_rse_configweekly0.5https://rucio.github.io/documentation/operator/s3_rse_configweekly0.5https://rucio.github.io/documentation/operator/setting_up_demoweekly0.5https://rucio.github.io/documentation/operator/transfers/configure-rucio-fts3-pluginsweekly0.5https://rucio.github.io/documentation/operator/transfers/configure-rucio-globusweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-overviewweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-preparerweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-submitterweekly0.5https://rucio.github.io/documentation/operator/transfers/transfers-throttlerweekly0.5https://rucio.github.io/documentation/project_organisationweekly0.5https://rucio.github.io/documentation/release-notesweekly0.5https://rucio.github.io/documentation/release-notes/1.13.3weekly0.5https://rucio.github.io/documentation/release-notes/1.14.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.14.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.14.10weekly0.5https://rucio.github.io/documentation/release-notes/1.14.11weekly0.5https://rucio.github.io/documentation/release-notes/1.14.2weekly0.5https://rucio.github.io/documentation/release-notes/1.14.3weekly0.5https://rucio.github.io/documentation/release-notes/1.14.4weekly0.5https://rucio.github.io/documentation/release-notes/1.14.5weekly0.5https://rucio.github.io/documentation/release-notes/1.14.6weekly0.5https://rucio.github.io/documentation/release-notes/1.14.7weekly0.5https://rucio.github.io/documentation/release-notes/1.14.8weekly0.5https://rucio.github.io/documentation/release-notes/1.14.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.14.8.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.14.9weekly0.5https://rucio.github.io/documentation/release-notes/1.14.9.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.0weekly0.5https://rucio.github.io/documentation/release-notes/1.15.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.2weekly0.5https://rucio.github.io/documentation/release-notes/1.15.3weekly0.5https://rucio.github.io/documentation/release-notes/1.15.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.4weekly0.5https://rucio.github.io/documentation/release-notes/1.15.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.15.5weekly0.5https://rucio.github.io/documentation/release-notes/1.16.0weekly0.5https://rucio.github.io/documentation/release-notes/1.16.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.16.1weekly0.5https://rucio.github.io/documentation/release-notes/1.16.2weekly0.5https://rucio.github.io/documentation/release-notes/1.16.3weekly0.5https://rucio.github.io/documentation/release-notes/1.16.4weekly0.5https://rucio.github.io/documentation/release-notes/1.17.0weekly0.5https://rucio.github.io/documentation/release-notes/1.17.1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.2weekly0.5https://rucio.github.io/documentation/release-notes/1.17.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.3weekly0.5https://rucio.github.io/documentation/release-notes/1.17.4weekly0.5https://rucio.github.io/documentation/release-notes/1.17.5weekly0.5https://rucio.github.io/documentation/release-notes/1.17.6weekly0.5https://rucio.github.io/documentation/release-notes/1.17.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.6.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.17.7weekly0.5https://rucio.github.io/documentation/release-notes/1.17.8weekly0.5https://rucio.github.io/documentation/release-notes/1.17.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.17.8.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.18.0weekly0.5https://rucio.github.io/documentation/release-notes/1.18.1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.2weekly0.5https://rucio.github.io/documentation/release-notes/1.18.3weekly0.5https://rucio.github.io/documentation/release-notes/1.18.4weekly0.5https://rucio.github.io/documentation/release-notes/1.18.5weekly0.5https://rucio.github.io/documentation/release-notes/1.18.5.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.6weekly0.5https://rucio.github.io/documentation/release-notes/1.18.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.7weekly0.5https://rucio.github.io/documentation/release-notes/1.18.8weekly0.5https://rucio.github.io/documentation/release-notes/1.18.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.18.9weekly0.5https://rucio.github.io/documentation/release-notes/1.19.0.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.19.1weekly0.5https://rucio.github.io/documentation/release-notes/1.19.2weekly0.5https://rucio.github.io/documentation/release-notes/1.19.3weekly0.5https://rucio.github.io/documentation/release-notes/1.19.4weekly0.5https://rucio.github.io/documentation/release-notes/1.19.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.19.4.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.19.5weekly0.5https://rucio.github.io/documentation/release-notes/1.19.6weekly0.5https://rucio.github.io/documentation/release-notes/1.19.7weekly0.5https://rucio.github.io/documentation/release-notes/1.19.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.19.8weekly0.5https://rucio.github.io/documentation/release-notes/1.20.0weekly0.5https://rucio.github.io/documentation/release-notes/1.20.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.10weekly0.5https://rucio.github.io/documentation/release-notes/1.20.11weekly0.5https://rucio.github.io/documentation/release-notes/1.20.12weekly0.5https://rucio.github.io/documentation/release-notes/1.20.13weekly0.5https://rucio.github.io/documentation/release-notes/1.20.14weekly0.5https://rucio.github.io/documentation/release-notes/1.20.15weekly0.5https://rucio.github.io/documentation/release-notes/1.20.16weekly0.5https://rucio.github.io/documentation/release-notes/1.20.2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.3weekly0.5https://rucio.github.io/documentation/release-notes/1.20.3rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.3rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.20.4rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.20.5weekly0.5https://rucio.github.io/documentation/release-notes/1.20.6weekly0.5https://rucio.github.io/documentation/release-notes/1.20.7weekly0.5https://rucio.github.io/documentation/release-notes/1.20.8weekly0.5https://rucio.github.io/documentation/release-notes/1.20.9weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.21.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.21.1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.10weekly0.5https://rucio.github.io/documentation/release-notes/1.21.10.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.21.11weekly0.5https://rucio.github.io/documentation/release-notes/1.21.12weekly0.5https://rucio.github.io/documentation/release-notes/1.21.2weekly0.5https://rucio.github.io/documentation/release-notes/1.21.3weekly0.5https://rucio.github.io/documentation/release-notes/1.21.4weekly0.5https://rucio.github.io/documentation/release-notes/1.21.5weekly0.5https://rucio.github.io/documentation/release-notes/1.21.6weekly0.5https://rucio.github.io/documentation/release-notes/1.21.7weekly0.5https://rucio.github.io/documentation/release-notes/1.21.8weekly0.5https://rucio.github.io/documentation/release-notes/1.21.9weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0.dev2weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0.dev3weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.22.1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.2weekly0.5https://rucio.github.io/documentation/release-notes/1.22.3weekly0.5https://rucio.github.io/documentation/release-notes/1.22.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.4weekly0.5https://rucio.github.io/documentation/release-notes/1.22.4.dev1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.5weekly0.5https://rucio.github.io/documentation/release-notes/1.22.6weekly0.5https://rucio.github.io/documentation/release-notes/1.22.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.22.7weekly0.5https://rucio.github.io/documentation/release-notes/1.22.8weekly0.5https://rucio.github.io/documentation/release-notes/1.22.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.0weekly0.5https://rucio.github.io/documentation/release-notes/1.23.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.10weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post3weekly0.5https://rucio.github.io/documentation/release-notes/1.23.11.post4weekly0.5https://rucio.github.io/documentation/release-notes/1.23.12weekly0.5https://rucio.github.io/documentation/release-notes/1.23.13weekly0.5https://rucio.github.io/documentation/release-notes/1.23.14weekly0.5https://rucio.github.io/documentation/release-notes/1.23.15weekly0.5https://rucio.github.io/documentation/release-notes/1.23.16weekly0.5https://rucio.github.io/documentation/release-notes/1.23.17weekly0.5https://rucio.github.io/documentation/release-notes/1.23.18weekly0.5https://rucio.github.io/documentation/release-notes/1.23.19weekly0.5https://rucio.github.io/documentation/release-notes/1.23.2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.2.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.20weekly0.5https://rucio.github.io/documentation/release-notes/1.23.3weekly0.5https://rucio.github.io/documentation/release-notes/1.23.4weekly0.5https://rucio.github.io/documentation/release-notes/1.23.5weekly0.5https://rucio.github.io/documentation/release-notes/1.23.5.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.6weekly0.5https://rucio.github.io/documentation/release-notes/1.23.6.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.7weekly0.5https://rucio.github.io/documentation/release-notes/1.23.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.8weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post3weekly0.5https://rucio.github.io/documentation/release-notes/1.23.9.post4weekly0.5https://rucio.github.io/documentation/release-notes/1.24.0weekly0.5https://rucio.github.io/documentation/release-notes/1.24.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post3weekly0.5https://rucio.github.io/documentation/release-notes/1.24.1.post4weekly0.5https://rucio.github.io/documentation/release-notes/1.24.2weekly0.5https://rucio.github.io/documentation/release-notes/1.24.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.3weekly0.5https://rucio.github.io/documentation/release-notes/1.24.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.24.4weekly0.5https://rucio.github.io/documentation/release-notes/1.24.5weekly0.5https://rucio.github.io/documentation/release-notes/1.24.5.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.0weekly0.5https://rucio.github.io/documentation/release-notes/1.25.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.1.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.3weekly0.5https://rucio.github.io/documentation/release-notes/1.25.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.3.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.25.4weekly0.5https://rucio.github.io/documentation/release-notes/1.25.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.25.5weekly0.5https://rucio.github.io/documentation/release-notes/1.25.6weekly0.5https://rucio.github.io/documentation/release-notes/1.25.7weekly0.5https://rucio.github.io/documentation/release-notes/1.26.0weekly0.5https://rucio.github.io/documentation/release-notes/1.26.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.26.1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.1.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.10weekly0.5https://rucio.github.io/documentation/release-notes/1.26.11weekly0.5https://rucio.github.io/documentation/release-notes/1.26.12weekly0.5https://rucio.github.io/documentation/release-notes/1.26.13weekly0.5https://rucio.github.io/documentation/release-notes/1.26.14weekly0.5https://rucio.github.io/documentation/release-notes/1.26.15weekly0.5https://rucio.github.io/documentation/release-notes/1.26.16weekly0.5https://rucio.github.io/documentation/release-notes/1.26.17weekly0.5https://rucio.github.io/documentation/release-notes/1.26.18weekly0.5https://rucio.github.io/documentation/release-notes/1.26.2weekly0.5https://rucio.github.io/documentation/release-notes/1.26.3weekly0.5https://rucio.github.io/documentation/release-notes/1.26.4weekly0.5https://rucio.github.io/documentation/release-notes/1.26.5weekly0.5https://rucio.github.io/documentation/release-notes/1.26.6weekly0.5https://rucio.github.io/documentation/release-notes/1.26.7weekly0.5https://rucio.github.io/documentation/release-notes/1.26.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.8weekly0.5https://rucio.github.io/documentation/release-notes/1.26.8.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.26.9weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.27.1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.10weekly0.5https://rucio.github.io/documentation/release-notes/1.27.11weekly0.5https://rucio.github.io/documentation/release-notes/1.27.12weekly0.5https://rucio.github.io/documentation/release-notes/1.27.2weekly0.5https://rucio.github.io/documentation/release-notes/1.27.3weekly0.5https://rucio.github.io/documentation/release-notes/1.27.4weekly0.5https://rucio.github.io/documentation/release-notes/1.27.4.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.27.5weekly0.5https://rucio.github.io/documentation/release-notes/1.27.6weekly0.5https://rucio.github.io/documentation/release-notes/1.27.7weekly0.5https://rucio.github.io/documentation/release-notes/1.27.8weekly0.5https://rucio.github.io/documentation/release-notes/1.27.9weekly0.5https://rucio.github.io/documentation/release-notes/1.28.0weekly0.5https://rucio.github.io/documentation/release-notes/1.28.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.28.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.28.1weekly0.5https://rucio.github.io/documentation/release-notes/1.28.2weekly0.5https://rucio.github.io/documentation/release-notes/1.28.3weekly0.5https://rucio.github.io/documentation/release-notes/1.28.4weekly0.5https://rucio.github.io/documentation/release-notes/1.28.5weekly0.5https://rucio.github.io/documentation/release-notes/1.28.6weekly0.5https://rucio.github.io/documentation/release-notes/1.28.7weekly0.5https://rucio.github.io/documentation/release-notes/1.29.0weekly0.5https://rucio.github.io/documentation/release-notes/1.29.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.29.1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.10weekly0.5https://rucio.github.io/documentation/release-notes/1.29.11weekly0.5https://rucio.github.io/documentation/release-notes/1.29.12weekly0.5https://rucio.github.io/documentation/release-notes/1.29.13weekly0.5https://rucio.github.io/documentation/release-notes/1.29.14weekly0.5https://rucio.github.io/documentation/release-notes/1.29.15weekly0.5https://rucio.github.io/documentation/release-notes/1.29.16weekly0.5https://rucio.github.io/documentation/release-notes/1.29.17weekly0.5https://rucio.github.io/documentation/release-notes/1.29.18weekly0.5https://rucio.github.io/documentation/release-notes/1.29.19weekly0.5https://rucio.github.io/documentation/release-notes/1.29.2weekly0.5https://rucio.github.io/documentation/release-notes/1.29.2.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.2.post2weekly0.5https://rucio.github.io/documentation/release-notes/1.29.3weekly0.5https://rucio.github.io/documentation/release-notes/1.29.3.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.4weekly0.5https://rucio.github.io/documentation/release-notes/1.29.5weekly0.5https://rucio.github.io/documentation/release-notes/1.29.6weekly0.5https://rucio.github.io/documentation/release-notes/1.29.7weekly0.5https://rucio.github.io/documentation/release-notes/1.29.7.post1weekly0.5https://rucio.github.io/documentation/release-notes/1.29.8weekly0.5https://rucio.github.io/documentation/release-notes/1.29.9weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.30.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.30.1weekly0.5https://rucio.github.io/documentation/release-notes/1.30.2weekly0.5https://rucio.github.io/documentation/release-notes/1.30.3weekly0.5https://rucio.github.io/documentation/release-notes/1.30.4weekly0.5https://rucio.github.io/documentation/release-notes/1.30.5weekly0.5https://rucio.github.io/documentation/release-notes/1.30.6weekly0.5https://rucio.github.io/documentation/release-notes/1.30.7weekly0.5https://rucio.github.io/documentation/release-notes/1.30.8weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/1.31.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/1.31.1weekly0.5https://rucio.github.io/documentation/release-notes/1.31.2weekly0.5https://rucio.github.io/documentation/release-notes/1.31.3weekly0.5https://rucio.github.io/documentation/release-notes/1.31.4weekly0.5https://rucio.github.io/documentation/release-notes/1.31.5weekly0.5https://rucio.github.io/documentation/release-notes/1.31.6weekly0.5https://rucio.github.io/documentation/release-notes/1.31.7weekly0.5https://rucio.github.io/documentation/release-notes/32.0.0weekly0.5https://rucio.github.io/documentation/release-notes/32.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/32.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/32.1.0weekly0.5https://rucio.github.io/documentation/release-notes/32.2.0weekly0.5https://rucio.github.io/documentation/release-notes/32.3.0weekly0.5https://rucio.github.io/documentation/release-notes/32.3.1weekly0.5https://rucio.github.io/documentation/release-notes/32.4.0weekly0.5https://rucio.github.io/documentation/release-notes/32.5.0weekly0.5https://rucio.github.io/documentation/release-notes/32.5.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/32.5.1weekly0.5https://rucio.github.io/documentation/release-notes/32.6.0weekly0.5https://rucio.github.io/documentation/release-notes/32.6.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/32.7.0weekly0.5https://rucio.github.io/documentation/release-notes/32.8.0weekly0.5https://rucio.github.io/documentation/release-notes/32.8.1weekly0.5https://rucio.github.io/documentation/release-notes/32.8.2weekly0.5https://rucio.github.io/documentation/release-notes/32.8.3weekly0.5https://rucio.github.io/documentation/release-notes/32.8.4weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/33.0.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/33.1.0weekly0.5https://rucio.github.io/documentation/release-notes/33.2.0weekly0.5https://rucio.github.io/documentation/release-notes/33.2.1weekly0.5https://rucio.github.io/documentation/release-notes/33.3.0weekly0.5https://rucio.github.io/documentation/release-notes/33.4.0weekly0.5https://rucio.github.io/documentation/release-notes/33.4.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/33.5.0weekly0.5https://rucio.github.io/documentation/release-notes/33.6.0weekly0.5https://rucio.github.io/documentation/release-notes/33.6.1weekly0.5https://rucio.github.io/documentation/release-notes/34.0.0weekly0.5https://rucio.github.io/documentation/release-notes/34.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/34.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/34.1.0weekly0.5https://rucio.github.io/documentation/release-notes/34.2.0weekly0.5https://rucio.github.io/documentation/release-notes/34.3.0weekly0.5https://rucio.github.io/documentation/release-notes/34.4.0weekly0.5https://rucio.github.io/documentation/release-notes/34.4.1weekly0.5https://rucio.github.io/documentation/release-notes/34.4.2weekly0.5https://rucio.github.io/documentation/release-notes/34.4.3weekly0.5https://rucio.github.io/documentation/release-notes/34.5.0weekly0.5https://rucio.github.io/documentation/release-notes/34.6.0weekly0.5https://rucio.github.io/documentation/release-notes/35.0.0weekly0.5https://rucio.github.io/documentation/release-notes/35.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/35.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/35.0.1weekly0.5https://rucio.github.io/documentation/release-notes/35.1.0weekly0.5https://rucio.github.io/documentation/release-notes/35.1.1weekly0.5https://rucio.github.io/documentation/release-notes/35.2.0weekly0.5https://rucio.github.io/documentation/release-notes/35.2.1weekly0.5https://rucio.github.io/documentation/release-notes/35.3.0weekly0.5https://rucio.github.io/documentation/release-notes/35.4.0weekly0.5https://rucio.github.io/documentation/release-notes/35.4.1weekly0.5https://rucio.github.io/documentation/release-notes/35.5.0weekly0.5https://rucio.github.io/documentation/release-notes/35.6.0weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0.post1weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0.post2weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc1weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc2weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc3weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc4weekly0.5https://rucio.github.io/documentation/release-notes/36.0.0rc5weekly0.5https://rucio.github.io/documentation/rucio_advisory_boardweekly0.5https://rucio.github.io/documentation/sig_metadataweekly0.5https://rucio.github.io/documentation/sig_qualityofserviceweekly0.5https://rucio.github.io/documentation/sig_tokensweekly0.5https://rucio.github.io/documentation/special_interest_groupsweekly0.5https://rucio.github.io/documentation/started/additional_layers_and_resourcesweekly0.5https://rucio.github.io/documentation/started/before_you_get_startedweekly0.5https://rucio.github.io/documentation/started/concepts/accounting_and_quotaweekly0.5https://rucio.github.io/documentation/started/concepts/file_dataset_containerweekly0.5https://rucio.github.io/documentation/started/concepts/metadata_attributesweekly0.5https://rucio.github.io/documentation/started/concepts/notificationsweekly0.5https://rucio.github.io/documentation/started/concepts/permission_modelweekly0.5https://rucio.github.io/documentation/started/concepts/replica_managementweekly0.5https://rucio.github.io/documentation/started/concepts/replica_workflowweekly0.5https://rucio.github.io/documentation/started/concepts/replication_rules_examplesweekly0.5https://rucio.github.io/documentation/started/concepts/rse_expressionsweekly0.5https://rucio.github.io/documentation/started/concepts/rucio_accountweekly0.5https://rucio.github.io/documentation/started/concepts/rucio_storage_elementweekly0.5https://rucio.github.io/documentation/started/concepts/subscriptionsweekly0.5https://rucio.github.io/documentation/started/daemonsweekly0.5https://rucio.github.io/documentation/started/main_componentsweekly0.5https://rucio.github.io/documentation/started/releasepolicyweekly0.5https://rucio.github.io/documentation/started/requirementsweekly0.5https://rucio.github.io/documentation/started/what_is_rucioweekly0.5https://rucio.github.io/documentation/user/configuring_the_clientweekly0.5https://rucio.github.io/documentation/user/developing_with_rucioweekly0.5https://rucio.github.io/documentation/user/setting_up_the_rucio_clientweekly0.5https://rucio.github.io/documentation/user/using_the_admin_clientweekly0.5https://rucio.github.io/documentation/user/using_the_clientweekly0.5https://rucio.github.io/documentation/weekly0.5 \ No newline at end of file diff --git a/special_interest_groups/index.html b/special_interest_groups/index.html index 9657ee13a1..366ccfb12c 100644 --- a/special_interest_groups/index.html +++ b/special_interest_groups/index.html @@ -9,8 +9,8 @@ - - + +
    +
    NameStartEndConvener
    Quality of ServiceJul-2021Dec-2023Doug Benjamin
    \ No newline at end of file diff --git a/started/additional_layers_and_resources/index.html b/started/additional_layers_and_resources/index.html index 5fe02fc30a..8cae3a27a4 100644 --- a/started/additional_layers_and_resources/index.html +++ b/started/additional_layers_and_resources/index.html @@ -9,8 +9,8 @@ - - + +

    Additional Layers and Resources

    In addition to the four main layers, we have the storage @@ -36,6 +36,6 @@ database.

    The persistence layer supports many different types of transactions relational database management systems such as SQLite, MySQL, PostgreSQL, or Oracle. Both -upgrading & downgrading of the database schema are supported.

    +upgrading & downgrading of the database schema are supported.

    \ No newline at end of file diff --git a/started/before_you_get_started/index.html b/started/before_you_get_started/index.html index 4181c261d2..10adfc7021 100644 --- a/started/before_you_get_started/index.html +++ b/started/before_you_get_started/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/accounting_and_quota/index.html b/started/concepts/accounting_and_quota/index.html index 164f5d4ae2..0793174a71 100644 --- a/started/concepts/accounting_and_quota/index.html +++ b/started/concepts/accounting_and_quota/index.html @@ -9,8 +9,8 @@ - - + +

    Accounting and quota

    Accounting is the measure of how much resource, e.g. storage, an account @@ -21,6 +21,6 @@ not on the actual amount of physical replicas in the system. Thus if two different users set a replication rule for the same file on the same RSE both users are accounted for this file, although there is only one -physical copy of it.

    +physical copy of it.

    \ No newline at end of file diff --git a/started/concepts/file_dataset_container/index.html b/started/concepts/file_dataset_container/index.html index edaed854f2..e26bb7334c 100644 --- a/started/concepts/file_dataset_container/index.html +++ b/started/concepts/file_dataset_container/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/metadata_attributes/index.html b/started/concepts/metadata_attributes/index.html index 9080e88388..7bbbb37b06 100644 --- a/started/concepts/metadata_attributes/index.html +++ b/started/concepts/metadata_attributes/index.html @@ -9,8 +9,8 @@ - - + +

    Metadata attributes

    Meta-data associated with a dataset/file is represented using @@ -29,6 +29,6 @@

    For datasets, it is possible that the value of a meta-data attribute is a function of the meta-data of its constituents, e.g. the total size is the sum of the sizes of the constituents. In this case it is not -possible to assign a value to it.

    +possible to assign a value to it.

    \ No newline at end of file diff --git a/started/concepts/notifications/index.html b/started/concepts/notifications/index.html index 77ca477c48..563013d054 100644 --- a/started/concepts/notifications/index.html +++ b/started/concepts/notifications/index.html @@ -9,14 +9,14 @@ - - + +

    Notifications

    External applications can require synchronisation on events relative to data availability and can subscribe to particular events, e.g., dataset state changes, replication rule state changes, etc. Rucio publishes messages via the STOMP protocol (to e.g. -ActiveMQ) when these events happen.

    +ActiveMQ) when these events happen.

    \ No newline at end of file diff --git a/started/concepts/permission_model/index.html b/started/concepts/permission_model/index.html index f24fb5aae6..88a4dd14b4 100644 --- a/started/concepts/permission_model/index.html +++ b/started/concepts/permission_model/index.html @@ -9,8 +9,8 @@ - - + +

    Permission model

    Rucio assigns permissions to accounts. Permissions are boolean flags @@ -18,6 +18,6 @@ write, delete) on a resource (RSE, account, replica, etc.).

    Rucio comes with a generic permission policy including a typical set of permissions. This policy can be replaced with a more fitting permission -file representing the policies of the community using Rucio.

    +file representing the policies of the community using Rucio.

    \ No newline at end of file diff --git a/started/concepts/replica_management/index.html b/started/concepts/replica_management/index.html index 599b8fa848..21a92793ad 100644 --- a/started/concepts/replica_management/index.html +++ b/started/concepts/replica_management/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/replica_workflow/index.html b/started/concepts/replica_workflow/index.html index 8df6c4887f..14ab2dfcba 100644 --- a/started/concepts/replica_workflow/index.html +++ b/started/concepts/replica_workflow/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/replication_rules_examples/index.html b/started/concepts/replication_rules_examples/index.html index b6e1527b5f..e5e0aa1b27 100644 --- a/started/concepts/replication_rules_examples/index.html +++ b/started/concepts/replication_rules_examples/index.html @@ -9,8 +9,8 @@ - - + +

    Replication rule examples

    Replica management is based on replication rules defined on data identifiers. A @@ -33,6 +33,6 @@

    username@host:~$ rucio list-rses --rses 'tier=1'

    I want to have 2 replicas on whatever T2 RSEs in the UK but not in Glasgow

    -
    username@host:~$ rucio add-rule scope:first_dataset scope:second_dataset 2 'tier=2&country=uk\site=GLASGOW'
    +
    username@host:~$ rucio add-rule scope:first_dataset scope:second_dataset 2 'tier=2&country=uk\site=GLASGOW'
    \ No newline at end of file diff --git a/started/concepts/rse_expressions/index.html b/started/concepts/rse_expressions/index.html index 8c9b4c574a..c097c51b90 100644 --- a/started/concepts/rse_expressions/index.html +++ b/started/concepts/rse_expressions/index.html @@ -9,8 +9,8 @@ - - + +

    RSE Expressions

    An RSE Expression allows to select a set of RSEs, for example to @@ -90,6 +90,6 @@

    Co
    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    'cloud=IT|cloud=FR&type=SCRATCHDISK' | wc -l
    30

    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    '(cloud=IT|cloud=FR)&type=SCRATCHDISK' | wc -l
    30

    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    'type=SCRATCHDISK&(cloud=IT|cloud=FR)' | wc -l
    30

    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    'type=SCRATCHDISK&cloud=IT|cloud=FR' | wc -l
    92

    While the first three operations are equivalent, the last return sites in cloud FR but not only the SCRATCHDISKs but the GROUPDISKs and DATADISKs too, -among other types.

    +among other types.

    \ No newline at end of file diff --git a/started/concepts/rucio_account/index.html b/started/concepts/rucio_account/index.html index 87afff19c5..71b6a5d578 100644 --- a/started/concepts/rucio_account/index.html +++ b/started/concepts/rucio_account/index.html @@ -9,8 +9,8 @@ - - + +

    Rucio account

    A Rucio account is the unit of assigning privileges in Rucio. It can represent @@ -24,6 +24,6 @@ accounts (N:M mapping). The Rucio authentication system checks if the used credentials are authorized to use the supplied Rucio account. The figure below gives an example of the mapping between credentials and Rucio accounts:

    -

    Figure 1

    +

    Figure 1

    \ No newline at end of file diff --git a/started/concepts/rucio_storage_element/index.html b/started/concepts/rucio_storage_element/index.html index 4c9d1e4c14..34b9b8c1dd 100644 --- a/started/concepts/rucio_storage_element/index.html +++ b/started/concepts/rucio_storage_element/index.html @@ -9,8 +9,8 @@ - - + +

    Rucio Storage Element

    A Rucio Storage Element (RSE) is the logical abstraction of a storage system for @@ -42,6 +42,6 @@

    Dista

    When configuring transfers between RSEs, distances must be defined for that link. Distances are unidirectional. To allow transfers in both directions, a distance has to be defined separately in each direction. Refer to the section -Transfers Overview for more details.

    +Transfers Overview for more details.

    \ No newline at end of file diff --git a/started/concepts/subscriptions/index.html b/started/concepts/subscriptions/index.html index 518f9ff208..e8db49a238 100644 --- a/started/concepts/subscriptions/index.html +++ b/started/concepts/subscriptions/index.html @@ -9,8 +9,8 @@ - - + +

    Subscriptions

    Rucio Subscriptions exist for the purpose of making data placement @@ -20,6 +20,6 @@ generate rules for that account. Policies may have a lifetime, after which they will expire.

    An example of a subscription is given below:

    -
    AttributeValue
    Ownertzero
    matchproject=data11 7TeV, dataType=RAW, stream=physics*
    rule1@CERNTAPE, 1@T1TAPE
    lifetime2012-01-01 00:00
    +
    AttributeValue
    Ownertzero
    matchproject=data11 7TeV, dataType=RAW, stream=physics*
    rule1@CERNTAPE, 1@T1TAPE
    lifetime2012-01-01 00:00
    \ No newline at end of file diff --git a/started/daemons/index.html b/started/daemons/index.html index 0a70ae8ee4..7394b19d13 100644 --- a/started/daemons/index.html +++ b/started/daemons/index.html @@ -9,8 +9,8 @@ - - + +

    Rucio Daemons

    Rucio relies on several daemons (processes) to perform different logic. @@ -55,6 +55,6 @@

    What is the purpose of undertaker?

    A dataset is "never" deleted, however, when the dataset is known to be bad, there is no point having it in the catalog. The undertaker daemon takes care to remove these datasets. -An operator will set an expiration date in the past of the DIDs and this daemon will delete the dataset from the DB. If there were any replicas attached, the replicas will be deleted as well.

    +An operator will set an expiration date in the past of the DIDs and this daemon will delete the dataset from the DB. If there were any replicas attached, the replicas will be deleted as well.

    \ No newline at end of file diff --git a/started/main_components/index.html b/started/main_components/index.html index 28a08c3dbe..1aaf84eb86 100644 --- a/started/main_components/index.html +++ b/started/main_components/index.html @@ -9,8 +9,8 @@ - - + + +scientific paper.

    \ No newline at end of file diff --git a/started/releasepolicy/index.html b/started/releasepolicy/index.html index 01a88d6ff8..e6865bc800 100644 --- a/started/releasepolicy/index.html +++ b/started/releasepolicy/index.html @@ -9,8 +9,8 @@ - - + +

    Release Policy

    Rucio follows a release policy, based on semantic versioning, @@ -79,6 +79,6 @@

    Jupyter
  • For JupyterLab v3.x use the latest supported version (v0.10.0).
  • Please refer to the Rucio JupyterLab extension project for more details on -installation, requirements and release policy.

    +installation, requirements and release policy.

    \ No newline at end of file diff --git a/started/requirements/index.html b/started/requirements/index.html index fab60d7d1d..065020dab0 100644 --- a/started/requirements/index.html +++ b/started/requirements/index.html @@ -9,8 +9,8 @@ - - + +
    >=3.6, <=3.9
    from 32 LTS>=3.9, <=3.10

    Database

    -
    DatabaseSupported versionNote
    SQLite3+For testing only
    MySQL8No support for SSH public key authentication
    PostgreSQL12 and higher
    Oracle19c
    +
    DatabaseSupported versionNote
    SQLite3+For testing only
    MySQL8No support for SSH public key authentication
    PostgreSQL12 and higher
    Oracle19c
    \ No newline at end of file diff --git a/started/what_is_rucio/index.html b/started/what_is_rucio/index.html index d367d531e4..cdb334e172 100644 --- a/started/what_is_rucio/index.html +++ b/started/what_is_rucio/index.html @@ -9,8 +9,8 @@ - - + +

    What is Rucio?

    Rucio enables centralized management of large volumes of data backed by many @@ -56,6 +56,6 @@

    What can R

    What Rucio doesn't do

    Rucio doesn't automatically create the storage backends. The storage servers must be created and configured, in advance, with one of the supported access protocols -(webdav/s3/sftp/xrootd/...), then configured in Rucio.

    +(webdav/s3/sftp/xrootd/...), then configured in Rucio.

    \ No newline at end of file diff --git a/user/configuring_the_client/index.html b/user/configuring_the_client/index.html index 19403efc71..b926a8fe7d 100644 --- a/user/configuring_the_client/index.html +++ b/user/configuring_the_client/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/user/developing_with_rucio/index.html b/user/developing_with_rucio/index.html index 6bb66fde1d..e73ac8cc73 100644 --- a/user/developing_with_rucio/index.html +++ b/user/developing_with_rucio/index.html @@ -9,8 +9,8 @@ - - + +

    Developing with Rucio

    Rucio Clients

    @@ -59,6 +59,6 @@

    Error handlin included in the header or the body of the return call, JSON-formatted with the parameters:

    ExceptionClass
    ExceptionMessage
    -

    Where ExceptionClass refers to Rucio Exceptions.

    +

    Where ExceptionClass refers to Rucio Exceptions.

    \ No newline at end of file diff --git a/user/setting_up_the_rucio_client/index.html b/user/setting_up_the_rucio_client/index.html index 506842b646..2e9e7be6f6 100644 --- a/user/setting_up_the_rucio_client/index.html +++ b/user/setting_up_the_rucio_client/index.html @@ -9,8 +9,8 @@ - - + +

    Setting Up the Rucio Client

    Install via pip

    @@ -27,6 +27,6 @@

    Upgrade via

    Installing using setup.py

    Otherwise, you can install from the distribution using the setup.py script:

    -
    python setup.py install
    +
    python setup.py install
    \ No newline at end of file diff --git a/user/using_the_admin_client/index.html b/user/using_the_admin_client/index.html index fcd69f3514..cefea409a8 100644 --- a/user/using_the_admin_client/index.html +++ b/user/using_the_admin_client/index.html @@ -9,8 +9,8 @@ - - + +
    +
      $ rucio-admin replicas declare-bad --reason "File corrupted" https//path/to/lost/file
    \ No newline at end of file diff --git a/user/using_the_client/index.html b/user/using_the_client/index.html index fa1eb0c922..80302284f7 100644 --- a/user/using_the_client/index.html +++ b/user/using_the_client/index.html @@ -9,8 +9,8 @@ - - + +

    Using the Client

    Rucio provides several commands for the end-user. See executables. @@ -146,6 +146,6 @@

    Rules opera

    Accessing files

    The command to download DIDs locally is called rucio download. It supports various sets of option. You can invoke it like this:

    -
    # rucio download user.jdoe:user.jdoe.test.container.1234.1
    2018-02-02 15:13:08,450 INFO Thread 1/3 : Starting the download of user.jdoe:test.file.2
    2018-02-02 15:13:08,451 INFO Thread 2/3 : Starting the download of user.jdoe:test.file.3
    2018-02-02 15:13:08,451 INFO Thread 3/3 : Starting the download of user.jdoe:test.file.1
    2018-02-02 15:13:08,503 INFO Thread 1/3 : File user.jdoe:test.file.2 trying \
    from SITE1_DISK
    2018-02-02 15:13:08,549 INFO Thread 2/3 : File user.jdoe:test.file.3 trying \
    from SITE2_DISK
    2018-02-02 15:13:08,551 INFO Thread 3/3 : File user.jdoe:test.file.1 trying \
    from SITE1_DISK
    2018-02-02 15:13:10,399 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,415 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded from SITE2_DISK
    2018-02-02 15:13:10,420 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded. 39.247 kB in 1.85 seconds = 0.02 MBps
    2018-02-02 15:13:10,537 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded. 641.427 kB in 1.87 seconds = 0.34 MBps
    2018-02-02 15:13:10,614 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,633 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded. 636.075 kB in 2.11 seconds = 0.3 MBps
    ----------------------------------
    Download summary
    ----------------------------------------
    DID user.jdoe:user.jdoe.test.container.1234.1
    Total files : 3
    Downloaded files : 3
    Files already found locally : 0
    Files that cannot be downloaded : 0
    +
    # rucio download user.jdoe:user.jdoe.test.container.1234.1
    2018-02-02 15:13:08,450 INFO Thread 1/3 : Starting the download of user.jdoe:test.file.2
    2018-02-02 15:13:08,451 INFO Thread 2/3 : Starting the download of user.jdoe:test.file.3
    2018-02-02 15:13:08,451 INFO Thread 3/3 : Starting the download of user.jdoe:test.file.1
    2018-02-02 15:13:08,503 INFO Thread 1/3 : File user.jdoe:test.file.2 trying \
    from SITE1_DISK
    2018-02-02 15:13:08,549 INFO Thread 2/3 : File user.jdoe:test.file.3 trying \
    from SITE2_DISK
    2018-02-02 15:13:08,551 INFO Thread 3/3 : File user.jdoe:test.file.1 trying \
    from SITE1_DISK
    2018-02-02 15:13:10,399 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,415 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded from SITE2_DISK
    2018-02-02 15:13:10,420 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded. 39.247 kB in 1.85 seconds = 0.02 MBps
    2018-02-02 15:13:10,537 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded. 641.427 kB in 1.87 seconds = 0.34 MBps
    2018-02-02 15:13:10,614 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,633 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded. 636.075 kB in 2.11 seconds = 0.3 MBps
    ----------------------------------
    Download summary
    ----------------------------------------
    DID user.jdoe:user.jdoe.test.container.1234.1
    Total files : 3
    Downloaded files : 3
    Files already found locally : 0
    Files that cannot be downloaded : 0
    \ No newline at end of file diff --git a/yaml/rest_api_doc_spec.yaml b/yaml/rest_api_doc_spec.yaml index 63cbb8b9dc..0c191657f3 100644 --- a/yaml/rest_api_doc_spec.yaml +++ b/yaml/rest_api_doc_spec.yaml @@ -924,71 +924,6 @@ paths: body: '{"identity":"string","authtype":"string"}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: List identities - description: Lists all identities for an account. - tags: - - Account - parameters: - - name: account - in: path - description: The account identifier. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - content: - application/x-json-stream: - schema: - type: array - items: - type: array - minItems: 2 - maxItems: 2 - items: - type: string - '401': - description: Invalid Auth Token - '404': - description: Account not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/accounts/{account}/identities \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/accounts/{account}/identities" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/accounts/{account}/identities'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -1097,6 +1032,71 @@ paths: body: '{"identity":"string","authtype":"string","email":"string","password":"none","default":false}' }; + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + get: + summary: List identities + description: Lists all identities for an account. + tags: + - Account + parameters: + - name: account + in: path + description: The account identifier. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + content: + application/x-json-stream: + schema: + type: array + items: + type: array + minItems: 2 + maxItems: 2 + items: + type: string + '401': + description: Invalid Auth Token + '404': + description: Account not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/accounts/{account}/identities \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/accounts/{account}/identities" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("GET", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/accounts/{account}/identities'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -1549,84 +1549,6 @@ paths: body: '{}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: List account parameters - description: Lists all parameters for an account. - tags: - - Account - parameters: - - name: account - in: path - description: The account identifier. - schema: - type: string - style: simple - required: true - responses: - '201': - description: OK - content: - application/json: - schema: - type: object - properties: - account: - description: The account identifier. - type: string - account_type: - description: The account type. - type: string - status: - description: The account status. - type: string - email: - description: The email for the account. - type: string - suspended_at: - description: Datetime if the account was suspended. - type: string - deleted_at: - description: Datetime if the account was deleted. - type: string - '401': - description: Invalid Auth Token - '404': - description: No account found. - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/accounts/{account} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/accounts/{account}" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/accounts/{account}'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -1726,56 +1648,74 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /accounts: get: - summary: List - description: List all accounts. + summary: List account parameters + description: Lists all parameters for an account. tags: - Account + parameters: + - name: account + in: path + description: The account identifier. + schema: + type: string + style: simple + required: true responses: - '200': + '201': description: OK content: - application/x-json-stream: + application/json: schema: - type: array - items: - type: object - properties: - account: - description: The account identifier. - type: string - type: - description: The type. - type: string - email: - description: The email. - type: string - '401': - description: Invalid Auth Token - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/accounts \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/accounts" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - + type: object + properties: + account: + description: The account identifier. + type: string + account_type: + description: The account type. + type: string + status: + description: The account status. + type: string + email: + description: The email for the account. + type: string + suspended_at: + description: Datetime if the account was suspended. + type: string + deleted_at: + description: Datetime if the account was deleted. + type: string + '401': + description: Invalid Auth Token + '404': + description: No account found. + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/accounts/{account} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/accounts/{account}" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("GET", url, headers=headers) + print(response.text) - lang: Node source: >- const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/accounts'; + let url = 'http://undefinedundefined/accounts/{account}'; let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': @@ -1786,54 +1726,48 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/userpass: - options: - summary: UserPass Allow cross-site scripting - description: UserPass Allow cross-site scripting. Explicit for Authentication. + /accounts: + get: + summary: List + description: List all accounts. tags: - - Auth + - Account responses: '200': description: OK - headers: - Access-Control-Allow-Origin: - schema: - type: string - Access-Control-Allow-Headers: - schema: - type: string - Access-Control-Allow-Methods: - schema: - type: string - enum: - - '*' - Access-Control-Allow-Credentials: - schema: - type: string - enum: - - 'true' - Access-Control-Expose-Headers: + content: + application/x-json-stream: schema: - type: string - enum: - - X-Rucio-Auth-Token - '404': - description: Not found + type: array + items: + type: object + properties: + account: + description: The account identifier. + type: string + type: + description: The type. + type: string + email: + description: The email. + type: string + '401': + description: Invalid Auth Token x-codeSamples: - lang: Shell source: |- - curl --request OPTIONS \ - --url http://undefinedundefined/auth/userpass \ + curl --request GET \ + --url http://undefinedundefined/accounts \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/userpass" + url = "http://undefinedundefined/accounts" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("OPTIONS", url, headers=headers) + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node @@ -1841,10 +1775,10 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/userpass'; + let url = 'http://undefinedundefined/accounts'; - let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -1852,6 +1786,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/userpass: get: summary: UserPass description: Authenticate a Rucio account temporarily via username and password. @@ -1977,10 +1912,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/gss: options: - summary: GSS Allow cross-site scripting - description: GSS Allow cross-site scripting. Explicit for Authentication. + summary: UserPass Allow cross-site scripting + description: UserPass Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2014,13 +1948,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/gss \ + --url http://undefinedundefined/auth/userpass \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/gss" + url = "http://undefinedundefined/auth/userpass" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2032,7 +1966,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/gss'; + let url = 'http://undefinedundefined/auth/userpass'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2043,6 +1977,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/gss: get: summary: GSS description: Authenticate a Rucio account via GSS. @@ -2129,10 +2064,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/x509: options: - summary: x509 Allow cross-site scripting - description: x509 Allow cross-site scripting. Explicit for Authentication. + summary: GSS Allow cross-site scripting + description: GSS Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2166,13 +2100,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/x509 \ + --url http://undefinedundefined/auth/gss \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/x509" + url = "http://undefinedundefined/auth/gss" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2184,7 +2118,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/x509'; + let url = 'http://undefinedundefined/auth/gss'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2195,6 +2129,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/x509: get: summary: x509 description: Authenticate a Rucio account via x509. @@ -2296,10 +2231,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/ssh: options: - summary: SSH Allow cross-site scripting - description: SSH Allow cross-site scripting. Explicit for Authentication. + summary: x509 Allow cross-site scripting + description: x509 Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2333,13 +2267,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/ssh \ + --url http://undefinedundefined/auth/x509 \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/ssh" + url = "http://undefinedundefined/auth/x509" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2351,7 +2285,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/ssh'; + let url = 'http://undefinedundefined/auth/x509'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2362,6 +2296,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/ssh: get: summary: SSH description: Authenticate a Rucio account via SSH. @@ -2448,12 +2383,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/ssh_challenge_token: options: - summary: SSHChallengeToken Allow cross-site scripting - description: >- - SSHChallengeToken Allow cross-site scripting. Explicit for - Authentication. + summary: SSH Allow cross-site scripting + description: SSH Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2487,13 +2419,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/ssh_challenge_token \ + --url http://undefinedundefined/auth/ssh \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/ssh_challenge_token" + url = "http://undefinedundefined/auth/ssh" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2505,7 +2437,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/ssh_challenge_token'; + let url = 'http://undefinedundefined/auth/ssh'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2516,6 +2448,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/ssh_challenge_token: get: summary: SSHChallengeToken description: Authenticate a Rucio account via SSHChallengeToken. @@ -2594,10 +2527,11 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/saml: options: - summary: SAML Allow cross-site scripting - description: SAML Allow cross-site scripting. Explicit for Authentication. + summary: SSHChallengeToken Allow cross-site scripting + description: >- + SSHChallengeToken Allow cross-site scripting. Explicit for + Authentication. tags: - Auth responses: @@ -2631,13 +2565,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/saml \ + --url http://undefinedundefined/auth/ssh_challenge_token \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/saml" + url = "http://undefinedundefined/auth/ssh_challenge_token" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2649,7 +2583,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/saml'; + let url = 'http://undefinedundefined/auth/ssh_challenge_token'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2660,6 +2594,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/saml: get: summary: SAML description: Authenticate a Rucio account via SAML. @@ -2785,10 +2720,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/validate: options: - summary: Validate Allow cross-site scripting - description: Validate Allow cross-site scripting. Explicit for Authentication. + summary: SAML Allow cross-site scripting + description: SAML Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2822,13 +2756,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/validate \ + --url http://undefinedundefined/auth/saml \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/validate" + url = "http://undefinedundefined/auth/saml" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2840,7 +2774,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/validate'; + let url = 'http://undefinedundefined/auth/saml'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2851,6 +2785,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/validate: get: summary: Validate description: Validate a Rucio auth token. @@ -2906,10 +2841,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc: options: - summary: OIDC Allow cross-site scripting - description: OIDC Allow cross-site scripting. Explicit for Authentication. + summary: Validate Allow cross-site scripting + description: Validate Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2932,19 +2866,24 @@ paths: type: string enum: - 'true' + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token '404': description: Not found x-codeSamples: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc \ + --url http://undefinedundefined/auth/validate \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc" + url = "http://undefinedundefined/auth/validate" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2956,7 +2895,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc'; + let url = 'http://undefinedundefined/auth/validate'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2967,6 +2906,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc: get: summary: OIDC description: Authenticate a Rucio account via OIDC. @@ -3076,10 +3016,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_token: options: - summary: TokenOIDC Allow cross-site scripting - description: TokenOIDC Allow cross-site scripting. Explicit for Authentication. + summary: OIDC Allow cross-site scripting + description: OIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3108,13 +3047,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_token \ + --url http://undefinedundefined/auth/oidc \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_token" + url = "http://undefinedundefined/auth/oidc" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3126,7 +3065,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_token'; + let url = 'http://undefinedundefined/auth/oidc'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3137,6 +3076,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_token: get: summary: TokenOIDC description: Authenticate a Rucio account via TokenOIDC. @@ -3200,10 +3140,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_code: options: - summary: CodeOIDC Allow cross-site scripting - description: CodeOIDC Allow cross-site scripting. Explicit for Authentication. + summary: TokenOIDC Allow cross-site scripting + description: TokenOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3232,13 +3171,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_code \ + --url http://undefinedundefined/auth/oidc_token \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_code" + url = "http://undefinedundefined/auth/oidc_token" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3250,7 +3189,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_code'; + let url = 'http://undefinedundefined/auth/oidc_token'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3261,6 +3200,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_code: get: summary: CodeOIDC description: Authenticate a Rucio account via CodeOIDC. @@ -3315,10 +3255,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_redirect: options: - summary: RedirectOIDC Allow cross-site scripting - description: RedirectOIDC Allow cross-site scripting. Explicit for Authentication. + summary: CodeOIDC Allow cross-site scripting + description: CodeOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3347,13 +3286,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_redirect \ + --url http://undefinedundefined/auth/oidc_code \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_redirect" + url = "http://undefinedundefined/auth/oidc_code" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3365,7 +3304,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_redirect'; + let url = 'http://undefinedundefined/auth/oidc_code'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3376,6 +3315,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_redirect: get: summary: RedirectOIDC description: Authenticate a Rucio account via RedirectOIDC. @@ -3442,10 +3382,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_refresh: options: - summary: RefreshOIDC Allow cross-site scripting - description: RefreshOIDC Allow cross-site scripting. Explicit for Authentication. + summary: RedirectOIDC Allow cross-site scripting + description: RedirectOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3468,24 +3407,19 @@ paths: type: string enum: - 'true' - Access-Control-Expose-Headers: - schema: - type: string - enum: - - X-Rucio-Auth-Token '404': description: Not found x-codeSamples: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_refresh \ + --url http://undefinedundefined/auth/oidc_redirect \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_refresh" + url = "http://undefinedundefined/auth/oidc_redirect" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3497,7 +3431,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_refresh'; + let url = 'http://undefinedundefined/auth/oidc_redirect'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3508,6 +3442,7 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_refresh: get: summary: RefreshOIDC description: Authenticate a Rucio account via RefreshOIDC. @@ -3577,9 +3512,74 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /config/{section}/{option}/{value}: - put: - summary: Create value + options: + summary: RefreshOIDC Allow cross-site scripting + description: RefreshOIDC Allow cross-site scripting. Explicit for Authentication. + tags: + - Auth + responses: + '200': + description: OK + headers: + Access-Control-Allow-Origin: + schema: + type: string + Access-Control-Allow-Headers: + schema: + type: string + Access-Control-Allow-Methods: + schema: + type: string + enum: + - '*' + Access-Control-Allow-Credentials: + schema: + type: string + enum: + - 'true' + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token + '404': + description: Not found + x-codeSamples: + - lang: Shell + source: |- + curl --request OPTIONS \ + --url http://undefinedundefined/auth/oidc_refresh \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/auth/oidc_refresh" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("OPTIONS", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/auth/oidc_refresh'; + + + let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + /config/{section}/{option}/{value}: + put: + summary: Create value description: Create or set the value of an option. tags: - Config @@ -3994,76 +3994,6 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /credentials/signurl: - options: - summary: Cross-Site Scripting - description: Allow cross-site scripting. Explicit for Authentication. - tags: - - Credentials - responses: - '200': - description: OK - headers: - Access-Control-Allow-Origin: - schema: - type: string - description: The http origin. - Access-Control-Allow-Headers: - schema: - type: string - description: The http access control request headers. - Access-Control-Allow-Methods: - schema: - type: string - enum: - - '*' - description: The allowed methods. - Access-Control-Allow-Credentials: - schema: - type: string - enum: - - 'true' - description: If credentials are allowed. - Access-Control-Expose-Headers: - schema: - type: string - enum: - - X-Rucio-Auth-Token - description: The exposed access control header. - '404': - description: Not found - x-codeSamples: - - lang: Shell - source: |- - curl --request OPTIONS \ - --url http://undefinedundefined/credentials/signurl \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/credentials/signurl" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("OPTIONS", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/credentials/signurl'; - - - let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); get: summary: Sign URL description: Sign a url for a limited lifetime for a particular srevice. @@ -4177,6 +4107,76 @@ paths: 'REPLACE_KEY_VALUE'}}; + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + options: + summary: Cross-Site Scripting + description: Allow cross-site scripting. Explicit for Authentication. + tags: + - Credentials + responses: + '200': + description: OK + headers: + Access-Control-Allow-Origin: + schema: + type: string + description: The http origin. + Access-Control-Allow-Headers: + schema: + type: string + description: The http access control request headers. + Access-Control-Allow-Methods: + schema: + type: string + enum: + - '*' + description: The allowed methods. + Access-Control-Allow-Credentials: + schema: + type: string + enum: + - 'true' + description: If credentials are allowed. + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token + description: The exposed access control header. + '404': + description: Not found + x-codeSamples: + - lang: Shell + source: |- + curl --request OPTIONS \ + --url http://undefinedundefined/credentials/signurl \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/credentials/signurl" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("OPTIONS", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/credentials/signurl'; + + + let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -4511,11 +4511,11 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /dids/{scope_name}/status: - put: - summary: Update did - description: Update a did. + get: + summary: Get did + description: Get a single data identifier. tags: - - Data Identifiers + - Data identifiers parameters: - name: scope_name in: path @@ -4524,96 +4524,20 @@ paths: type: string style: simple required: true - requestBody: - content: - application/json: - schema: - type: object - properties: - open: - description: The open status - type: boolean - responses: - '200': - description: OK - '401': - description: Invalid Auth Token - '404': - description: Did not found - '409': - description: Wrong status - x-codeSamples: - - lang: Shell - source: |- - curl --request PUT \ - --url http://undefinedundefined/dids/{scope_name}/status \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ - --header 'content-type: application/json' \ - --data '{"open":true}' - - lang: Python - source: >- - import requests - - - url = "http://undefinedundefined/dids/{scope_name}/status" - - - payload = {"open": True} - - headers = { - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", - "content-type": "application/json" - } - - - response = requests.request("PUT", url, json=payload, - headers=headers) - - - print(response.text) - - lang: Node - source: |- - const fetch = require('node-fetch'); - - let url = 'http://undefinedundefined/dids/{scope_name}/status'; - - let options = { - method: 'PUT', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"open":true}' - }; - - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: Get did - description: Get a single data identifier. - tags: - - Data identifiers - parameters: - - name: scope_name - in: path - description: The scope and the name of the did. - schema: - type: string - style: simple - required: true - - name: dynamic_depth - in: query - description: The DID type at which to stop the dynamic length/size estimation - schema: - type: string - enum: - - FILE - - DATASET - - name: dynamic - in: query - description: Same as dynamic_depth = "FILE" - deprecated: true - schema: - type: string + - name: dynamic_depth + in: query + description: The DID type at which to stop the dynamic length/size estimation + schema: + type: string + enum: + - FILE + - DATASET + - name: dynamic + in: query + description: Same as dynamic_depth = "FILE" + deprecated: true + schema: + type: string responses: '200': description: OK @@ -4725,6 +4649,82 @@ paths: 'REPLACE_KEY_VALUE'}}; + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + put: + summary: Update did + description: Update a did. + tags: + - Data Identifiers + parameters: + - name: scope_name + in: path + description: The scope and the name of the did. + schema: + type: string + style: simple + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + open: + description: The open status + type: boolean + responses: + '200': + description: OK + '401': + description: Invalid Auth Token + '404': + description: Did not found + '409': + description: Wrong status + x-codeSamples: + - lang: Shell + source: |- + curl --request PUT \ + --url http://undefinedundefined/dids/{scope_name}/status \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ + --header 'content-type: application/json' \ + --data '{"open":true}' + - lang: Python + source: >- + import requests + + + url = "http://undefinedundefined/dids/{scope_name}/status" + + + payload = {"open": True} + + headers = { + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", + "content-type": "application/json" + } + + + response = requests.request("PUT", url, json=payload, + headers=headers) + + + print(response.text) + - lang: Node + source: |- + const fetch = require('node-fetch'); + + let url = 'http://undefinedundefined/dids/{scope_name}/status'; + + let options = { + method: 'PUT', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"open":true}' + }; + fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -5036,94 +5036,6 @@ paths: body: '{"dids":[{"scope":"string","name":"string"}]}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: Get did - description: Returns the contents of a data identifier. - tags: - - Data Identifiers - parameters: - - name: scope_name - in: path - description: The scope and the name of the did. - schema: - type: string - style: simple - required: true - responses: - '200': - description: Did found - content: - application/x-json-stream: - schema: - description: The contents of a did. Items are line separated. - type: array - items: - type: object - required: - - scope - - name - - type - - bytes - - adler32 - - md5 - properties: - scope: - description: The scope of the did. - type: string - name: - description: The name of the did. - type: string - type: - description: The type of the did. - type: string - bytes: - description: The size of the did. - type: number - adler32: - description: The adler32 checksum of the did. - type: string - md5: - description: The md5 checksum of the did. - type: string - '401': - description: Invalid Auth Token - '404': - description: Scope not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/dids/{scope_name}/dids \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/dids/{scope_name}/dids" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/dids/{scope_name}/dids'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -5238,10 +5150,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /dids/{scope_name}/meta: - delete: - summary: Delete metadata - description: Deletes the specified metadata from the did. + get: + summary: Get did + description: Returns the contents of a data identifier. tags: - Data Identifiers parameters: @@ -5252,47 +5163,63 @@ paths: type: string style: simple required: true - - name: key - in: query - description: The key to delete. - schema: - type: string responses: '200': - description: OK - '400': - description: scope_name could not be parsed. + description: Did found + content: + application/x-json-stream: + schema: + description: The contents of a did. Items are line separated. + type: array + items: + type: object + required: + - scope + - name + - type + - bytes + - adler32 + - md5 + properties: + scope: + description: The scope of the did. + type: string + name: + description: The name of the did. + type: string + type: + description: The type of the did. + type: string + bytes: + description: The size of the did. + type: number + adler32: + description: The adler32 checksum of the did. + type: string + md5: + description: The md5 checksum of the did. + type: string '401': description: Invalid Auth Token '404': - description: Did or key not found + description: Scope not found '406': description: Not acceptable - '409': - description: Feature is not in current database. x-codeSamples: - lang: Shell source: |- - curl --request DELETE \ - --url 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE' \ + curl --request GET \ + --url http://undefinedundefined/dids/{scope_name}/dids \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python - source: >- + source: |- import requests - - url = "http://undefinedundefined/dids/{scope_name}/meta" - - - querystring = {"key":"SOME_STRING_VALUE"} - + url = "http://undefinedundefined/dids/{scope_name}/dids" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("DELETE", url, headers=headers, - params=querystring) - + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node @@ -5300,11 +5227,10 @@ paths: const fetch = require('node-fetch'); - let url = - 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE'; + let url = 'http://undefinedundefined/dids/{scope_name}/dids'; - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -5312,9 +5238,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - get: - summary: Get metadata - description: Get the metadata of a did. + /dids/{scope_name}/meta: + delete: + summary: Delete metadata + description: Deletes the specified metadata from the did. tags: - Data Identifiers parameters: @@ -5325,33 +5252,29 @@ paths: type: string style: simple required: true - - name: plugin + - name: key in: query - description: The plugin to use. + description: The key to delete. schema: type: string - default: DID_COLUMN responses: '200': description: OK - content: - application/json: - schema: - description: A data identifier with all attributes. - type: object '400': - description: Bad Request - Invalid metadata plugin specified + description: scope_name could not be parsed. '401': description: Invalid Auth Token '404': - description: Did not found + description: Did or key not found '406': description: Not acceptable + '409': + description: Feature is not in current database. x-codeSamples: - lang: Shell source: |- - curl --request GET \ - --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \ + curl --request DELETE \ + --url 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE' \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- @@ -5361,13 +5284,13 @@ paths: url = "http://undefinedundefined/dids/{scope_name}/meta" - querystring = {"plugin":"SOME_STRING_VALUE"} + querystring = {"key":"SOME_STRING_VALUE"} headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("GET", url, headers=headers, + response = requests.request("DELETE", url, headers=headers, params=querystring) @@ -5378,10 +5301,10 @@ paths: let url = - 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE'; + 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE'; - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -5457,28 +5380,105 @@ paths: "recursive": False } - headers = { - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", - "content-type": "application/json" - } + headers = { + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", + "content-type": "application/json" + } + + + response = requests.request("POST", url, json=payload, + headers=headers) + + + print(response.text) + - lang: Node + source: |- + const fetch = require('node-fetch'); + + let url = 'http://undefinedundefined/dids/{scope_name}/meta'; + + let options = { + method: 'POST', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"meta":{},"recursive":false}' + }; + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + get: + summary: Get metadata + description: Get the metadata of a did. + tags: + - Data Identifiers + parameters: + - name: scope_name + in: path + description: The scope and the name of the did. + schema: + type: string + style: simple + required: true + - name: plugin + in: query + description: The plugin to use. + schema: + type: string + default: DID_COLUMN + responses: + '200': + description: OK + content: + application/json: + schema: + description: A data identifier with all attributes. + type: object + '400': + description: Bad Request - Invalid metadata plugin specified + '401': + description: Invalid Auth Token + '404': + description: Did not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: >- + import requests + + + url = "http://undefinedundefined/dids/{scope_name}/meta" + + + querystring = {"plugin":"SOME_STRING_VALUE"} + + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("POST", url, json=payload, - headers=headers) + response = requests.request("GET", url, headers=headers, + params=querystring) print(response.text) - lang: Node - source: |- + source: >- const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/dids/{scope_name}/meta'; - let options = { - method: 'POST', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"meta":{},"recursive":false}' - }; + let url = + 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + fetch(url, options) .then(res => res.json()) @@ -5983,75 +5983,6 @@ paths: body: '{"account":"string"}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: Get followers - description: Get all followers for a specific did. - tags: - - Data Identifiers - parameters: - - name: scope_name - in: path - description: The scope and the name of the did. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - content: - application/json: - schema: - description: A list of all followers of a did. - type: array - items: - description: A follower of a did. - type: object - properties: - user: - description: The user which follows the did. - type: string - '400': - description: Value error - '401': - description: Invalid Auth Token - '404': - description: Did not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/dids/{scope_name}/follow \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/dids/{scope_name}/follow" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/dids/{scope_name}/follow'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -6132,6 +6063,75 @@ paths: body: '{"account":"string"}' }; + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + get: + summary: Get followers + description: Get all followers for a specific did. + tags: + - Data Identifiers + parameters: + - name: scope_name + in: path + description: The scope and the name of the did. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + description: A list of all followers of a did. + type: array + items: + description: A follower of a did. + type: object + properties: + user: + description: The user which follows the did. + type: string + '400': + description: Value error + '401': + description: Invalid Auth Token + '404': + description: Did not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/dids/{scope_name}/follow \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/dids/{scope_name}/follow" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("GET", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/dids/{scope_name}/follow'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -12504,9 +12504,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - get: - summary: Get Rse Distances - description: Returns the distances between a source and destination rse. + post: + summary: Create Rse Distance + description: Post a rse distance. tags: - Rucio Storage Elements parameters: @@ -12524,31 +12524,28 @@ paths: type: string style: simple required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + distance: + description: The distance between RSEs. + type: integer + ranking: + deprecated: true + description: Same as distance. + type: integer responses: - '200': + '201': description: OK content: application/json: schema: - description: The distances between the Rses. - type: array - items: - type: object - description: One distance between source and destination. - properties: - src_rse_id: - description: The source rse id. - type: string - dest_rse_id: - description: The destination rse id. - type: string - distance: - description: The distance between RSEs. - type: integer - ranking: - deprecated: true - description: Same as distance. - type: integer + type: string + enum: + - Created '401': description: Invalid Auth Token '404': @@ -12558,9 +12555,11 @@ paths: x-codeSamples: - lang: Shell source: |- - curl --request GET \ + curl --request POST \ --url http://undefinedundefined/rses/{source}/distances/{destination} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ + --header 'content-type: application/json' \ + --data '{"distance":0,"ranking":0}' - lang: Python source: >- import requests @@ -12570,10 +12569,19 @@ paths: "http://undefinedundefined/rses/{source}/distances/{destination}" - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + payload = { + "distance": 0, + "ranking": 0 + } + headers = { + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", + "content-type": "application/json" + } - response = requests.request("GET", url, headers=headers) + + response = requests.request("POST", url, json=payload, + headers=headers) print(response.text) @@ -12586,17 +12594,20 @@ paths: 'http://undefinedundefined/rses/{source}/distances/{destination}'; - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; + let options = { + method: 'POST', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"distance":0,"ranking":0}' + }; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - post: - summary: Create Rse Distance - description: Post a rse distance. + get: + summary: Get Rse Distances + description: Returns the distances between a source and destination rse. tags: - Rucio Storage Elements parameters: @@ -12614,28 +12625,31 @@ paths: type: string style: simple required: true - requestBody: - content: - application/json: - schema: - type: object - properties: - distance: - description: The distance between RSEs. - type: integer - ranking: - deprecated: true - description: Same as distance. - type: integer responses: - '201': + '200': description: OK content: application/json: - schema: - type: string - enum: - - Created + schema: + description: The distances between the Rses. + type: array + items: + type: object + description: One distance between source and destination. + properties: + src_rse_id: + description: The source rse id. + type: string + dest_rse_id: + description: The destination rse id. + type: string + distance: + description: The distance between RSEs. + type: integer + ranking: + deprecated: true + description: Same as distance. + type: integer '401': description: Invalid Auth Token '404': @@ -12645,11 +12659,9 @@ paths: x-codeSamples: - lang: Shell source: |- - curl --request POST \ + curl --request GET \ --url http://undefinedundefined/rses/{source}/distances/{destination} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ - --header 'content-type: application/json' \ - --data '{"distance":0,"ranking":0}' + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- import requests @@ -12659,19 +12671,10 @@ paths: "http://undefinedundefined/rses/{source}/distances/{destination}" - payload = { - "distance": 0, - "ranking": 0 - } - - headers = { - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", - "content-type": "application/json" - } + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("POST", url, json=payload, - headers=headers) + response = requests.request("GET", url, headers=headers) print(response.text) @@ -12684,11 +12687,8 @@ paths: 'http://undefinedundefined/rses/{source}/distances/{destination}'; - let options = { - method: 'POST', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"distance":0,"ranking":0}' - }; + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; fetch(url, options) @@ -14175,121 +14175,6 @@ paths: body: '{"availability_read":true,"availability_write":true,"availability_delete":true,"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","time_zone":"string","rse_type":"DISK","latitude":0,"longitude":0}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: Get RSE - description: Get details about a specific RSE. - tags: - - Rucio Storage Elements - parameters: - - name: rse - in: path - description: The name of the Rucio Storage Element name. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - content: - application/json: - schema: - description: The RSE properties. - type: object - properties: - deterministic: - description: If the pfn is generated deterministicly. - type: boolean - volatile: - description: RSE cache. - type: boolean - city: - description: The city of the RSE. - type: string - staging_area: - description: Staging area. - type: string - region_code: - description: The region code of the RSE. - type: string - country_name: - description: The country name of the RSE. - type: string - continent: - description: The continent of the RSE. - type: string - time_zone: - description: The time zone of the RSE. - type: string - ISP: - description: The internet service provider of the RSE. - type: string - rse_type: - description: The rse type. - type: string - enum: - - DISK - - TAPE - latitude: - description: The latitude of the RSE. - type: number - longitude: - description: The longitude of the RSE. - type: number - ASN: - description: The access service network of the RSE. - type: string - availability: - description: The availability of the RSE. - type: integer - deprecated: true - availability_read: - description: If the RSE is readable. - type: integer - availability_write: - description: If the RSE is writable. - type: integer - availability_delete: - description: If the RSE is deletable. - '401': - description: Invalid Auth Token - '404': - description: RSE not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/rses/{rse} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/rses/{rse}" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/rses/{rse}'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -14427,22 +14312,137 @@ paths: } - response = requests.request("POST", url, json=payload, - headers=headers) + response = requests.request("POST", url, json=payload, + headers=headers) + + + print(response.text) + - lang: Node + source: |- + const fetch = require('node-fetch'); + + let url = 'http://undefinedundefined/rses/{rse}'; + + let options = { + method: 'POST', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","continent":"string","time_zone":"string","ISP":"string","rse_type":"DISK","latitude":0,"longitude":0,"ASN":"string","availability":0,"availability_read":true,"availability_write":true,"availability_delete":true}' + }; + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + get: + summary: Get RSE + description: Get details about a specific RSE. + tags: + - Rucio Storage Elements + parameters: + - name: rse + in: path + description: The name of the Rucio Storage Element name. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + description: The RSE properties. + type: object + properties: + deterministic: + description: If the pfn is generated deterministicly. + type: boolean + volatile: + description: RSE cache. + type: boolean + city: + description: The city of the RSE. + type: string + staging_area: + description: Staging area. + type: string + region_code: + description: The region code of the RSE. + type: string + country_name: + description: The country name of the RSE. + type: string + continent: + description: The continent of the RSE. + type: string + time_zone: + description: The time zone of the RSE. + type: string + ISP: + description: The internet service provider of the RSE. + type: string + rse_type: + description: The rse type. + type: string + enum: + - DISK + - TAPE + latitude: + description: The latitude of the RSE. + type: number + longitude: + description: The longitude of the RSE. + type: number + ASN: + description: The access service network of the RSE. + type: string + availability: + description: The availability of the RSE. + type: integer + deprecated: true + availability_read: + description: If the RSE is readable. + type: integer + availability_write: + description: If the RSE is writable. + type: integer + availability_delete: + description: If the RSE is deletable. + '401': + description: Invalid Auth Token + '404': + description: RSE not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/rses/{rse} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/rses/{rse}" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node - source: |- + source: >- const fetch = require('node-fetch'); + let url = 'http://undefinedundefined/rses/{rse}'; - let options = { - method: 'POST', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","continent":"string","time_zone":"string","ISP":"string","rse_type":"DISK","latitude":0,"longitude":0,"ASN":"string","availability":0,"availability_read":true,"availability_write":true,"availability_delete":true}' - }; + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + fetch(url, options) .then(res => res.json()) @@ -16030,9 +16030,9 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /subscriptions/{account}/{name}: - put: - summary: Update subscription - description: Update an existing subscription. + get: + summary: Get Subscription + description: Retrieve a subscription. tags: - Replicas parameters: @@ -16050,81 +16050,84 @@ paths: type: string style: simple required: true - requestBody: - content: - application/json: - schema: - type: object - required: - - options - properties: - options: - description: The values for the new subscription. + responses: + '200': + description: OK + content: + application/x-json-stream: + schema: + description: A list of subscriptions. + type: array + items: + description: A subscription. type: object properties: + id: + description: The id of the subscription. + type: string + name: + description: The name of the subscription. + type: string filter: description: The filter for the subscription. type: string replication_rules: description: The replication rules for the subscription. type: string - comments: - description: The comments for the subscription. + policyid: + description: The policyid for the subscription. + type: integer + state: + description: The state of the subscription. + type: string + enum: + - A + - I + - 'N' + - U + - B + last_processed: + description: The time the subscription was processed last. + type: string + format: date-time + account: + description: The account for the subscription. type: string lifetime: description: The lifetime for the subscription. type: string format: date-time + comments: + description: The comments for the subscription. + type: string retroactive: - description: If the retroactive is activated for a subscription. + description: If the subscription is retroactive. type: boolean - priority: - description: >- - The priority/policyid for the subscription. Stored as - policyid. - type: integer - responses: - '201': - description: OK - '400': - description: Cannot decode json parameter list. + expired_at: + description: The date-time of the expiration for the subscription. + type: string + format: date-time '401': description: Invalid Auth Token '404': - description: Not found + description: Subscription Not found + '406': + description: Not acceptable x-codeSamples: - lang: Shell source: |- - curl --request PUT \ + curl --request GET \ --url http://undefinedundefined/subscriptions/{account}/{name} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ - --header 'content-type: application/json' \ - --data '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python - source: >- + source: |- import requests - url = "http://undefinedundefined/subscriptions/{account}/{name}" + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - payload = {"options": { - "filter": "string", - "replication_rules": "string", - "comments": "string", - "lifetime": "2019-08-24T14:15:22Z", - "retroactive": True, - "priority": 0 - }} - headers = { - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", - "content-type": "application/json" - } - - - response = requests.request("PUT", url, json=payload, - headers=headers) - + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node @@ -16136,20 +16139,17 @@ paths: 'http://undefinedundefined/subscriptions/{account}/{name}'; - let options = { - method: 'PUT', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' - }; + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - get: - summary: Get Subscription - description: Retrieve a subscription. + put: + summary: Update subscription + description: Update an existing subscription. tags: - Replicas parameters: @@ -16167,84 +16167,81 @@ paths: type: string style: simple required: true - responses: - '200': - description: OK - content: - application/x-json-stream: - schema: - description: A list of subscriptions. - type: array - items: - description: A subscription. + requestBody: + content: + application/json: + schema: + type: object + required: + - options + properties: + options: + description: The values for the new subscription. type: object properties: - id: - description: The id of the subscription. - type: string - name: - description: The name of the subscription. - type: string filter: description: The filter for the subscription. type: string replication_rules: description: The replication rules for the subscription. type: string - policyid: - description: The policyid for the subscription. - type: integer - state: - description: The state of the subscription. - type: string - enum: - - A - - I - - 'N' - - U - - B - last_processed: - description: The time the subscription was processed last. - type: string - format: date-time - account: - description: The account for the subscription. + comments: + description: The comments for the subscription. type: string lifetime: description: The lifetime for the subscription. type: string format: date-time - comments: - description: The comments for the subscription. - type: string retroactive: - description: If the subscription is retroactive. + description: If the retroactive is activated for a subscription. type: boolean - expired_at: - description: The date-time of the expiration for the subscription. - type: string - format: date-time + priority: + description: >- + The priority/policyid for the subscription. Stored as + policyid. + type: integer + responses: + '201': + description: OK + '400': + description: Cannot decode json parameter list. '401': description: Invalid Auth Token '404': - description: Subscription Not found - '406': - description: Not acceptable + description: Not found x-codeSamples: - lang: Shell source: |- - curl --request GET \ + curl --request PUT \ --url http://undefinedundefined/subscriptions/{account}/{name} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ + --header 'content-type: application/json' \ + --data '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' - lang: Python - source: |- + source: >- import requests + url = "http://undefinedundefined/subscriptions/{account}/{name}" - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("GET", url, headers=headers) + payload = {"options": { + "filter": "string", + "replication_rules": "string", + "comments": "string", + "lifetime": "2019-08-24T14:15:22Z", + "retroactive": True, + "priority": 0 + }} + headers = { + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", + "content-type": "application/json" + } + + + response = requests.request("PUT", url, json=payload, + headers=headers) + print(response.text) - lang: Node @@ -16256,8 +16253,11 @@ paths: 'http://undefinedundefined/subscriptions/{account}/{name}'; - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; + let options = { + method: 'PUT', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' + }; fetch(url, options)