rucio 37.7.1__py3-none-any.whl → 38.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rucio might be problematic. Click here for more details.

Files changed (130) hide show
  1. rucio/alembicrevision.py +1 -1
  2. rucio/cli/bin_legacy/rucio.py +51 -107
  3. rucio/cli/bin_legacy/rucio_admin.py +26 -26
  4. rucio/cli/command.py +1 -0
  5. rucio/cli/did.py +2 -2
  6. rucio/cli/opendata.py +132 -0
  7. rucio/cli/replica.py +15 -5
  8. rucio/cli/rule.py +7 -2
  9. rucio/cli/scope.py +3 -2
  10. rucio/cli/utils.py +28 -4
  11. rucio/client/baseclient.py +9 -1
  12. rucio/client/client.py +2 -0
  13. rucio/client/diracclient.py +73 -12
  14. rucio/client/opendataclient.py +249 -0
  15. rucio/client/subscriptionclient.py +30 -0
  16. rucio/client/uploadclient.py +10 -13
  17. rucio/common/constants.py +4 -1
  18. rucio/common/exception.py +55 -0
  19. rucio/common/plugins.py +45 -8
  20. rucio/common/schema/generic.py +5 -3
  21. rucio/common/schema/generic_multi_vo.py +4 -2
  22. rucio/common/types.py +8 -7
  23. rucio/common/utils.py +176 -11
  24. rucio/core/dirac.py +5 -5
  25. rucio/core/opendata.py +744 -0
  26. rucio/core/rule.py +63 -8
  27. rucio/core/transfer.py +1 -1
  28. rucio/daemons/common.py +1 -1
  29. rucio/daemons/conveyor/finisher.py +2 -2
  30. rucio/daemons/conveyor/poller.py +2 -2
  31. rucio/daemons/conveyor/preparer.py +1 -1
  32. rucio/daemons/conveyor/submitter.py +2 -2
  33. rucio/daemons/conveyor/throttler.py +1 -1
  34. rucio/db/sqla/constants.py +6 -0
  35. rucio/db/sqla/migrate_repo/versions/a62db546a1f1_opendata_initial_model.py +85 -0
  36. rucio/db/sqla/models.py +69 -0
  37. rucio/db/sqla/session.py +8 -1
  38. rucio/db/sqla/util.py +2 -2
  39. rucio/gateway/dirac.py +1 -1
  40. rucio/gateway/opendata.py +190 -0
  41. rucio/gateway/subscription.py +5 -3
  42. rucio/rse/protocols/protocol.py +9 -5
  43. rucio/rse/translation.py +17 -6
  44. rucio/tests/common.py +64 -12
  45. rucio/transfertool/fts3.py +1 -0
  46. rucio/transfertool/fts3_plugins.py +6 -1
  47. rucio/vcsversion.py +4 -4
  48. rucio/web/rest/flaskapi/v1/auth.py +11 -2
  49. rucio/web/rest/flaskapi/v1/common.py +34 -14
  50. rucio/web/rest/flaskapi/v1/config.py +1 -1
  51. rucio/web/rest/flaskapi/v1/dids.py +447 -160
  52. rucio/web/rest/flaskapi/v1/heartbeats.py +1 -1
  53. rucio/web/rest/flaskapi/v1/identities.py +1 -1
  54. rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +1 -1
  55. rucio/web/rest/flaskapi/v1/locks.py +1 -1
  56. rucio/web/rest/flaskapi/v1/main.py +3 -7
  57. rucio/web/rest/flaskapi/v1/meta_conventions.py +1 -16
  58. rucio/web/rest/flaskapi/v1/nongrid_traces.py +1 -1
  59. rucio/web/rest/flaskapi/v1/opendata.py +391 -0
  60. rucio/web/rest/flaskapi/v1/opendata_public.py +146 -0
  61. rucio/web/rest/flaskapi/v1/requests.py +1 -1
  62. rucio/web/rest/flaskapi/v1/rses.py +1 -1
  63. rucio/web/rest/flaskapi/v1/rules.py +1 -1
  64. rucio/web/rest/flaskapi/v1/scopes.py +1 -1
  65. rucio/web/rest/flaskapi/v1/subscriptions.py +6 -9
  66. rucio/web/rest/flaskapi/v1/traces.py +1 -1
  67. rucio/web/rest/flaskapi/v1/vos.py +1 -1
  68. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/alembic.ini.template +1 -1
  69. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/alembic_offline.ini.template +1 -1
  70. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/rucio.cfg.template +2 -2
  71. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +3 -3
  72. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/requirements.server.txt +6 -3
  73. rucio-38.0.0.data/data/rucio/tools/reset_database.py +87 -0
  74. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio +2 -1
  75. {rucio-37.7.1.dist-info → rucio-38.0.0.dist-info}/METADATA +37 -36
  76. {rucio-37.7.1.dist-info → rucio-38.0.0.dist-info}/RECORD +128 -122
  77. {rucio-37.7.1.dist-info → rucio-38.0.0.dist-info}/licenses/AUTHORS.rst +1 -0
  78. rucio/client/fileclient.py +0 -57
  79. rucio-37.7.1.data/data/rucio/tools/reset_database.py +0 -40
  80. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
  81. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/ldap.cfg.template +0 -0
  82. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
  83. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  84. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
  85. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  86. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
  87. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  88. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
  89. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
  90. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/tools/bootstrap.py +0 -0
  91. {rucio-37.7.1.data → rucio-38.0.0.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
  92. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-abacus-account +0 -0
  93. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-abacus-collection-replica +0 -0
  94. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-abacus-rse +0 -0
  95. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-admin +0 -0
  96. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-atropos +0 -0
  97. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-auditor +0 -0
  98. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-automatix +0 -0
  99. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-bb8 +0 -0
  100. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-cache-client +0 -0
  101. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-cache-consumer +0 -0
  102. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-finisher +0 -0
  103. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-poller +0 -0
  104. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-preparer +0 -0
  105. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-receiver +0 -0
  106. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-stager +0 -0
  107. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-submitter +0 -0
  108. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-conveyor-throttler +0 -0
  109. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-dark-reaper +0 -0
  110. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-dumper +0 -0
  111. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-follower +0 -0
  112. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-hermes +0 -0
  113. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-judge-cleaner +0 -0
  114. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-judge-evaluator +0 -0
  115. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-judge-injector +0 -0
  116. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-judge-repairer +0 -0
  117. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-kronos +0 -0
  118. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-minos +0 -0
  119. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-minos-temporary-expiration +0 -0
  120. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-necromancer +0 -0
  121. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-oauth-manager +0 -0
  122. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-reaper +0 -0
  123. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-replica-recoverer +0 -0
  124. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-rse-decommissioner +0 -0
  125. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-storage-consistency-actions +0 -0
  126. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-transmogrifier +0 -0
  127. {rucio-37.7.1.data → rucio-38.0.0.data}/scripts/rucio-undertaker +0 -0
  128. {rucio-37.7.1.dist-info → rucio-38.0.0.dist-info}/WHEEL +0 -0
  129. {rucio-37.7.1.dist-info → rucio-38.0.0.dist-info}/licenses/LICENSE +0 -0
  130. {rucio-37.7.1.dist-info → rucio-38.0.0.dist-info}/top_level.txt +0 -0
@@ -139,7 +139,7 @@ class AccountScopeList(ErrorHandlingMethodView):
139
139
  return jsonify(scopes)
140
140
 
141
141
 
142
- def blueprint():
142
+ def blueprint() -> AuthenticatedBlueprint:
143
143
  bp = AuthenticatedBlueprint('scopes', __name__, url_prefix='/scopes')
144
144
 
145
145
  scope_view = Scope.as_view('scope')
@@ -169,6 +169,10 @@ class Subscription(ErrorHandlingMethodView):
169
169
  priority:
170
170
  description: "The priority/policyid for the subscription. Stored as policyid."
171
171
  type: integer
172
+ state:
173
+ description: "The state of the subscription. If not supplied, the state will be set to 'U' (updated)."
174
+ type: string
175
+ enum: ["A", "I", "N", "U", "B"]
172
176
  responses:
173
177
  201:
174
178
  description: "OK"
@@ -188,6 +192,7 @@ class Subscription(ErrorHandlingMethodView):
188
192
  'lifetime': None,
189
193
  'retroactive': None,
190
194
  'priority': None,
195
+ 'state': None,
191
196
  }
192
197
  for keyword in list(metadata):
193
198
  metadata[keyword] = param_get(options, keyword, default=metadata[keyword])
@@ -614,7 +619,7 @@ class SubscriptionId(ErrorHandlingMethodView):
614
619
  return Response(render_json(**subscription), content_type="application/json")
615
620
 
616
621
 
617
- def blueprint():
622
+ def blueprint() -> AuthenticatedBlueprint:
618
623
  bp = AuthenticatedBlueprint('subscriptions', __name__, url_prefix='/subscriptions')
619
624
 
620
625
  subscription_id_view = SubscriptionId.as_view('subscription_id')
@@ -631,14 +636,6 @@ def blueprint():
631
636
  subscription_name_view = SubscriptionName.as_view('subscription_name')
632
637
  bp.add_url_rule('/name/<name>', view_func=subscription_name_view, methods=['get', ])
633
638
 
634
- # Legacy url support
635
- # TODO: Take out with Rucio 38
636
- bp.add_url_rule('/Id/<subscription_id>', view_func=subscription_id_view, methods=['get', ])
637
- bp.add_url_rule('/<account>/<name>/Rules/States', view_func=states_view, methods=['get', ])
638
- bp.add_url_rule('/<account>/Rules/States', view_func=states_view, methods=['get', ])
639
- bp.add_url_rule('/<account>/<name>/Rules', view_func=rules_view, methods=['get', ])
640
- bp.add_url_rule('/Name/<name>', view_func=subscription_name_view, methods=['get', ])
641
-
642
639
  bp.after_request(response_headers)
643
640
  return bp
644
641
 
@@ -118,7 +118,7 @@ class Trace(ErrorHandlingMethodView):
118
118
  return generate_http_error_flask(400, err)
119
119
 
120
120
 
121
- def blueprint():
121
+ def blueprint() -> Blueprint:
122
122
  bp = Blueprint('traces', __name__, url_prefix='/traces')
123
123
 
124
124
  trace_view = Trace.as_view('trace')
@@ -255,7 +255,7 @@ class RecoverVO(ErrorHandlingMethodView):
255
255
  return 'Created', 201
256
256
 
257
257
 
258
- def blueprint():
258
+ def blueprint() -> AuthenticatedBlueprint:
259
259
  bp = AuthenticatedBlueprint('vos', __name__, url_prefix='/vos')
260
260
 
261
261
  recover_view = RecoverVO.as_view('recover')
@@ -18,7 +18,7 @@
18
18
  # Choose one of the databases+schema below
19
19
  # Oracle, PostgreSQL, MySQL/MariaDB are fully supported
20
20
 
21
- sqlalchemy.url=oracle://user:pass@servicename
21
+ sqlalchemy.url=oracle+oracledb://user:pass@servicename
22
22
  version_table_schema=rucio
23
23
 
24
24
  #sqlalchemy.url=postgresql+psycopg://rucio:rucio@psql-hostname:5432/rucio
@@ -18,7 +18,7 @@
18
18
  # Choose one of the databases+schema below
19
19
  # Oracle, PostgreSQL, MySQL/MariaDB are fully supported
20
20
 
21
- #sqlalchemy.url=oracle://user:pass@servicename
21
+ #sqlalchemy.url=oracle+oracledb://user:pass@servicename
22
22
  #version_table_schema=rucio
23
23
 
24
24
  #sqlalchemy.url=postgresql+psycopg://rucio:rucio@psql-hostname:5432/rucio
@@ -73,8 +73,8 @@ default_mail_from = spamspamspam@cern.ch
73
73
 
74
74
  [database]
75
75
  default = sqlite:////tmp/rucio.db
76
- #default = oracle://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=______))(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=_____))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=__________)))
77
- #default = oracle://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=______))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=_____________)))
76
+ #default = oracle+oracledb://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=______))(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=_____))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=__________)))
77
+ #default = oracle+oracledb://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=______))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=_____________)))
78
78
  #schema=atlas_rucio # only for cern oracle
79
79
  #default = mysql+pymysql://rucio:rucio@localhost/rucio
80
80
  #default = postgresql+psycopg://rucio:rucio@localhost/rucio
@@ -56,8 +56,8 @@ default_mail_from = spamspamspam@cern.ch
56
56
 
57
57
  [database]
58
58
  default = sqlite:////tmp/rucio.db
59
- #default = oracle://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=______))(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=_____))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=__________)))
60
- #default = oracle://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=______))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=_____________)))
59
+ #default = oracle+oracledb://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=______))(ADDRESS=(PROTOCOL=TCP)(HOST=_________)(PORT=_____))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=__________)))
60
+ #default = oracle+oracledb://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=______))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=_____________)))
61
61
  #schema=atlas_rucio # only for cern oracle
62
62
  #default = mysql+pymysql://rucio:rucio@localhost/rucio
63
63
  #default = postgresql+psycopg://rucio:rucio@localhost/rucio
@@ -213,4 +213,4 @@ idpsecrets = /opt/rucio/etc/idpsecrets.json
213
213
  admin_issuer = wlcg
214
214
 
215
215
  [api]
216
- endpoints = accountlimits, accounts, config, credentials, dids, export, heartbeats, identities, import, lifetime_exceptions, locks, meta, ping, redirect, replicas, requests, rses, rules, scopes, subscriptions, traces, vos
216
+ endpoints = accountlimits, accounts, config, credentials, dids, export, heartbeats, identities, import, lifetime_exceptions, locks, meta_conventions, ping, redirect, replicas, requests, rses, rules, scopes, subscriptions, traces, vos
@@ -57,7 +57,7 @@ cryptography==44.0.2
57
57
  # pyjwt
58
58
  # pyspnego
59
59
  # requests-kerberos
60
- cx-oracle==8.3.0
60
+ oracledb==3.1.1
61
61
  # via -r requirements.server.in
62
62
  decorator==5.2.1
63
63
  # via
@@ -75,7 +75,7 @@ elastic-transport==8.17.0
75
75
  # via elasticsearch
76
76
  elasticsearch==8.15.1
77
77
  # via -r requirements.server.in
78
- flask==3.1.0
78
+ flask==3.1.1
79
79
  # via -r requirements.server.in
80
80
  frozenlist==1.5.0
81
81
  # via
@@ -89,6 +89,8 @@ globus-sdk==3.41.0
89
89
  # via -r requirements.server.in
90
90
  google-auth==2.38.0
91
91
  # via -r requirements.server.in
92
+ greenlet==3.2.2
93
+ # via sqlalchemy
92
94
  gssapi==1.9.0
93
95
  # via pyspnego
94
96
  idna==3.10
@@ -129,6 +131,7 @@ markdown-it-py==3.0.0
129
131
  # via rich
130
132
  markupsafe==3.0.2
131
133
  # via
134
+ # flask
132
135
  # jinja2
133
136
  # mako
134
137
  # werkzeug
@@ -258,7 +261,7 @@ stomp-py==8.2.0
258
261
  # via -r requirements.server.in
259
262
  tabulate==0.9.0
260
263
  # via -r requirements.server.in
261
- typing-extensions==4.12.2
264
+ typing-extensions==4.14.0
262
265
  # via
263
266
  # alembic
264
267
  # dogpile-cache
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright European Organization for Nuclear Research (CERN) since 2012
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ """
17
+ Reset, purge and/or (re)create a Rucio test database.
18
+
19
+ Behavior
20
+ ------------------------+-----------------------+---------------------------+
21
+ Flag(s) | What happens | Subsequent actions |
22
+ ------------------------+-----------------------+---------------------------+
23
+ (no flag) | drop_orm_tables() | build_database() + |
24
+ | | create_base_vo() + |
25
+ | | create_root_account() |
26
+ ------------------------+-----------------------+---------------------------+
27
+ -b / --purge-build | purge_db() | build_database() + |
28
+ | | create_base_vo() + |
29
+ | | create_root_account() |
30
+ ------------------------+-----------------------+---------------------------+
31
+ -p / --purge | purge_db() | nothing else.. |
32
+ | | the script ends |
33
+ ------------------------+-----------------------+---------------------------+
34
+ """
35
+
36
+ import os.path
37
+ import sys
38
+ from argparse import ArgumentParser
39
+
40
+ # Ensure package imports work when executed from any cwd
41
+ base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
42
+ sys.path.append(base_path)
43
+ os.chdir(base_path)
44
+
45
+ from rucio.db.sqla.util import ( # noqa: E402
46
+ build_database, # noqa: E402
47
+ create_base_vo, # noqa: E402
48
+ create_root_account, # noqa: E402
49
+ drop_orm_tables, # noqa: E402
50
+ purge_db, # noqa: E402
51
+ )
52
+
53
+ if __name__ == '__main__':
54
+
55
+ parser = ArgumentParser(
56
+ prog="reset_database.py",
57
+ description="Reset the local Rucio database used in tests."
58
+ )
59
+ g = parser.add_mutually_exclusive_group()
60
+ g.add_argument(
61
+ "-b", "--purge-build",
62
+ action="store_true",
63
+ help="Purge EVERYTHING (tables, constraints, schema) "
64
+ "and then rebuild a fresh schema with base VO + root account.",
65
+ )
66
+ g.add_argument(
67
+ "-p", "--purge",
68
+ action="store_true",
69
+ help="Purge EVERYTHING and stop – do NOT recreate schema or accounts.",
70
+ )
71
+ args = parser.parse_args()
72
+
73
+ # ------------------------------------------------------------------
74
+ # 1. Decide how to reset
75
+ # ------------------------------------------------------------------
76
+ if args.purge_build or args.purge:
77
+ purge_db()
78
+ else:
79
+ drop_orm_tables()
80
+
81
+ # ------------------------------------------------------------------
82
+ # 2. Decide what to rebuild
83
+ # ------------------------------------------------------------------
84
+ if not args.purge:
85
+ build_database()
86
+ create_base_vo()
87
+ create_root_account()
@@ -54,6 +54,7 @@ def map_legacy_command() -> Optional[list[str]]:
54
54
  command_map = {
55
55
  "list-file-replicas": ["replica", "list", "file"],
56
56
  "list-dataset-replicas": ["replica", "list", "dataset"],
57
+ "list-datasets-rse": ["replica", "list", "dataset", "--rse"],
57
58
  "add-dataset": ["did", "add", "--type dataset"],
58
59
  "add-container": ["did", "add", "--type container"],
59
60
  "attach": ["did", "content", "add"],
@@ -96,7 +97,7 @@ def map_legacy_command() -> Optional[list[str]]:
96
97
 
97
98
 
98
99
  if __name__ == "__main__":
99
- commands = ("account", "config", "did", "replica", "rse", "rule", "scope", "subscription", "ping", "whoami", "test-server", "lifetime-exception", "upload", "download")
100
+ commands = ("account", "config", "did", "replica", "rse", "rule", "scope", "subscription", "ping", "whoami", "test-server", "lifetime-exception", "upload", "download", "opendata")
100
101
 
101
102
  parser = argparse.ArgumentParser(add_help=False)
102
103
  # Check for legacy flag
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rucio
3
- Version: 37.7.1
3
+ Version: 38.0.0
4
4
  Summary: Rucio Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -20,51 +20,52 @@ Classifier: Environment :: No Input/Output (Daemon)
20
20
  Requires-Python: >=3.9, <4
21
21
  License-File: LICENSE
22
22
  License-File: AUTHORS.rst
23
- Requires-Dist: click
24
- Requires-Dist: requests
25
- Requires-Dist: urllib3
23
+ Requires-Dist: requests<=2.32.3
24
+ Requires-Dist: urllib3<=1.26.19
26
25
  Requires-Dist: dogpile-cache<=1.2.2
27
- Requires-Dist: packaging
28
- Requires-Dist: tabulate
29
- Requires-Dist: jsonschema
30
- Requires-Dist: rich
31
- Requires-Dist: typing_extensions
32
- Requires-Dist: argcomplete
26
+ Requires-Dist: packaging<=24.1
27
+ Requires-Dist: tabulate<=0.9.0
28
+ Requires-Dist: jsonschema<=4.23.0
29
+ Requires-Dist: rich<=13.9.4
30
+ Requires-Dist: typing_extensions<=4.12.2
31
+ Requires-Dist: argcomplete<=3.5.3
33
32
  Requires-Dist: boto
34
- Requires-Dist: python-magic
35
- Requires-Dist: paramiko
36
- Requires-Dist: boto3
37
- Requires-Dist: sqlalchemy
38
- Requires-Dist: alembic
39
- Requires-Dist: pymemcache
40
- Requires-Dist: python-dateutil
41
- Requires-Dist: stomp-py
42
- Requires-Dist: statsd
43
- Requires-Dist: geoip2
44
- Requires-Dist: google-auth
45
- Requires-Dist: redis
46
- Requires-Dist: flask
47
- Requires-Dist: oic
48
- Requires-Dist: prometheus_client
33
+ Requires-Dist: python-magic<=0.4.27
34
+ Requires-Dist: paramiko<=3.5.1
35
+ Requires-Dist: boto3<=1.37.5
36
+ Requires-Dist: sqlalchemy<=2.0.38
37
+ Requires-Dist: alembic<=1.14.1
38
+ Requires-Dist: pymemcache<=4.0.0
39
+ Requires-Dist: python-dateutil<=2.9.0.post0
40
+ Requires-Dist: stomp-py<=8.2.0
41
+ Requires-Dist: statsd<=4.0.1
42
+ Requires-Dist: geoip2<=5.0.1
43
+ Requires-Dist: google-auth<=2.38.0
44
+ Requires-Dist: redis<=5.2.1
45
+ Requires-Dist: flask<=3.1.0
46
+ Requires-Dist: oic<=1.7.0
47
+ Requires-Dist: prometheus_client<=0.21.1
49
48
  Provides-Extra: oracle
50
- Requires-Dist: cx_oracle; extra == "oracle"
49
+ Requires-Dist: oracledb<=3.1.1; extra == "oracle"
51
50
  Provides-Extra: mongo
52
- Requires-Dist: pymongo; extra == "mongo"
51
+ Requires-Dist: pymongo<=4.11.2; extra == "mongo"
53
52
  Provides-Extra: elastic
54
- Requires-Dist: elasticsearch; extra == "elastic"
53
+ Requires-Dist: elasticsearch<=8.15.1; extra == "elastic"
55
54
  Provides-Extra: postgresql
56
- Requires-Dist: psycopg[binary,pool]; extra == "postgresql"
55
+ Requires-Dist: psycopg<=3.2.3; extra == "postgresql"
56
+ Requires-Dist: psycopg-binary<=3.2.3; extra == "postgresql"
57
+ Requires-Dist: psycopg-pool<=3.2.3; extra == "postgresql"
57
58
  Provides-Extra: mysql
58
- Requires-Dist: PyMySQL; extra == "mysql"
59
+ Requires-Dist: PyMySQL<=1.1.1; extra == "mysql"
59
60
  Provides-Extra: kerberos
60
- Requires-Dist: kerberos; extra == "kerberos"
61
- Requires-Dist: pykerberos; extra == "kerberos"
62
- Requires-Dist: requests-kerberos; extra == "kerberos"
61
+ Requires-Dist: kerberos<=1.3.1; extra == "kerberos"
62
+ Requires-Dist: pykerberos<=1.2.4; extra == "kerberos"
63
+ Requires-Dist: requests-kerberos<=0.15.0; extra == "kerberos"
63
64
  Provides-Extra: globus
64
- Requires-Dist: PyYAML; extra == "globus"
65
- Requires-Dist: globus-sdk; extra == "globus"
65
+ Requires-Dist: PyYAML<=6.0.2; extra == "globus"
66
+ Requires-Dist: globus-sdk<=3.41.0; extra == "globus"
66
67
  Provides-Extra: saml
67
- Requires-Dist: python3-saml; extra == "saml"
68
+ Requires-Dist: python3-saml<=1.16.0; extra == "saml"
68
69
  Provides-Extra: dev
69
70
  Requires-Dist: pytest; extra == "dev"
70
71
  Requires-Dist: pytest-xdist; extra == "dev"