rucio 37.7.1__py3-none-any.whl → 38.0.0rc1__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.
- rucio/alembicrevision.py +1 -1
- rucio/cli/bin_legacy/rucio.py +51 -107
- rucio/cli/bin_legacy/rucio_admin.py +26 -26
- rucio/cli/command.py +1 -0
- rucio/cli/did.py +2 -2
- rucio/cli/opendata.py +132 -0
- rucio/cli/replica.py +15 -5
- rucio/cli/rule.py +7 -2
- rucio/cli/scope.py +3 -2
- rucio/cli/utils.py +28 -4
- rucio/client/baseclient.py +9 -1
- rucio/client/client.py +2 -0
- rucio/client/diracclient.py +73 -12
- rucio/client/opendataclient.py +249 -0
- rucio/client/subscriptionclient.py +30 -0
- rucio/client/uploadclient.py +10 -13
- rucio/common/constants.py +4 -1
- rucio/common/exception.py +55 -0
- rucio/common/plugins.py +45 -8
- rucio/common/schema/generic.py +5 -3
- rucio/common/schema/generic_multi_vo.py +4 -2
- rucio/common/types.py +8 -7
- rucio/common/utils.py +176 -11
- rucio/core/dirac.py +5 -5
- rucio/core/opendata.py +744 -0
- rucio/core/rule.py +63 -8
- rucio/core/transfer.py +1 -1
- rucio/db/sqla/constants.py +6 -0
- rucio/db/sqla/migrate_repo/versions/a62db546a1f1_opendata_initial_model.py +85 -0
- rucio/db/sqla/models.py +67 -0
- rucio/db/sqla/util.py +2 -2
- rucio/gateway/dirac.py +1 -1
- rucio/gateway/opendata.py +190 -0
- rucio/gateway/subscription.py +5 -3
- rucio/rse/protocols/protocol.py +9 -5
- rucio/rse/translation.py +17 -6
- rucio/transfertool/fts3.py +1 -0
- rucio/transfertool/fts3_plugins.py +6 -1
- rucio/vcsversion.py +4 -4
- rucio/web/rest/flaskapi/v1/common.py +34 -14
- rucio/web/rest/flaskapi/v1/config.py +1 -1
- rucio/web/rest/flaskapi/v1/dids.py +447 -160
- rucio/web/rest/flaskapi/v1/heartbeats.py +1 -1
- rucio/web/rest/flaskapi/v1/identities.py +1 -1
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +1 -1
- rucio/web/rest/flaskapi/v1/locks.py +1 -1
- rucio/web/rest/flaskapi/v1/main.py +3 -8
- rucio/web/rest/flaskapi/v1/meta_conventions.py +1 -16
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +1 -1
- rucio/web/rest/flaskapi/v1/opendata.py +391 -0
- rucio/web/rest/flaskapi/v1/opendata_public.py +146 -0
- rucio/web/rest/flaskapi/v1/requests.py +1 -1
- rucio/web/rest/flaskapi/v1/rses.py +1 -1
- rucio/web/rest/flaskapi/v1/rules.py +1 -1
- rucio/web/rest/flaskapi/v1/scopes.py +1 -1
- rucio/web/rest/flaskapi/v1/subscriptions.py +6 -9
- rucio/web/rest/flaskapi/v1/traces.py +1 -1
- rucio/web/rest/flaskapi/v1/vos.py +1 -1
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/alembic.ini.template +1 -1
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/alembic_offline.ini.template +1 -1
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/rucio.cfg.template +2 -2
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/rucio_multi_vo.cfg.template +3 -3
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/requirements.server.txt +6 -3
- rucio-38.0.0rc1.data/data/rucio/tools/reset_database.py +87 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio +2 -1
- {rucio-37.7.1.dist-info → rucio-38.0.0rc1.dist-info}/METADATA +36 -36
- {rucio-37.7.1.dist-info → rucio-38.0.0rc1.dist-info}/RECORD +119 -113
- rucio/client/fileclient.py +0 -57
- rucio-37.7.1.data/data/rucio/tools/reset_database.py +0 -40
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/ldap.cfg.template +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/tools/bootstrap.py +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-abacus-account +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-abacus-collection-replica +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-abacus-rse +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-admin +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-atropos +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-auditor +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-automatix +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-bb8 +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-cache-client +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-cache-consumer +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-finisher +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-poller +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-preparer +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-receiver +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-stager +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-submitter +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-conveyor-throttler +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-dark-reaper +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-dumper +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-follower +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-hermes +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-judge-cleaner +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-judge-evaluator +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-judge-injector +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-judge-repairer +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-kronos +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-minos +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-minos-temporary-expiration +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-necromancer +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-oauth-manager +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-reaper +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-replica-recoverer +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-rse-decommissioner +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-storage-consistency-actions +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-transmogrifier +0 -0
- {rucio-37.7.1.data → rucio-38.0.0rc1.data}/scripts/rucio-undertaker +0 -0
- {rucio-37.7.1.dist-info → rucio-38.0.0rc1.dist-info}/WHEEL +0 -0
- {rucio-37.7.1.dist-info → rucio-38.0.0rc1.dist-info}/licenses/AUTHORS.rst +0 -0
- {rucio-37.7.1.dist-info → rucio-38.0.0rc1.dist-info}/licenses/LICENSE +0 -0
- {rucio-37.7.1.dist-info → rucio-38.0.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -17,6 +17,7 @@ import sys
|
|
|
17
17
|
from typing import TYPE_CHECKING, Any, Optional, TypeVar
|
|
18
18
|
|
|
19
19
|
from rucio.common.config import config_get_int
|
|
20
|
+
from rucio.common.constants import DEFAULT_VO
|
|
20
21
|
from rucio.common.exception import InvalidRequest
|
|
21
22
|
from rucio.common.plugins import PolicyPackageAlgorithms
|
|
22
23
|
|
|
@@ -85,7 +86,11 @@ class FTS3TapeMetadataPlugin(PolicyPackageAlgorithms):
|
|
|
85
86
|
"""
|
|
86
87
|
return {"collocation_hints": collocation_func(**hints)}
|
|
87
88
|
|
|
88
|
-
def _default(self,
|
|
89
|
+
def _default(self, hint_dict: dict[str, Any]) -> dict:
|
|
90
|
+
vo = hint_dict['vo'] if 'vo' in hint_dict else DEFAULT_VO
|
|
91
|
+
default_algorithm = self._get_default_algorithm(self.ALGORITHM_NAME, vo=vo)
|
|
92
|
+
if default_algorithm is not None:
|
|
93
|
+
return default_algorithm(hint_dict)
|
|
89
94
|
return {}
|
|
90
95
|
|
|
91
96
|
def _verify_in_format(self, hint_dict: dict[str, Any]) -> None:
|
rucio/vcsversion.py
CHANGED
|
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
|
|
|
4
4
|
'''
|
|
5
5
|
VERSION_INFO = {
|
|
6
6
|
'final': True,
|
|
7
|
-
'version': '
|
|
8
|
-
'branch_nick': '
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
7
|
+
'version': '38.0.0rc1',
|
|
8
|
+
'branch_nick': 'master',
|
|
9
|
+
'revision_id': '7f986b67665c21ac40a2b32732b2f263bafd2f6c',
|
|
10
|
+
'revno': 13890
|
|
11
11
|
}
|
|
@@ -20,11 +20,12 @@ import re
|
|
|
20
20
|
from configparser import NoOptionError, NoSectionError
|
|
21
21
|
from functools import wraps
|
|
22
22
|
from time import time
|
|
23
|
-
from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union
|
|
23
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union, cast
|
|
24
24
|
from urllib.parse import unquote_plus
|
|
25
25
|
|
|
26
26
|
import flask
|
|
27
27
|
from flask.views import MethodView
|
|
28
|
+
from typing_extensions import ParamSpec
|
|
28
29
|
from werkzeug.datastructures import Headers
|
|
29
30
|
from werkzeug.exceptions import HTTPException
|
|
30
31
|
from werkzeug.wrappers import Request, Response
|
|
@@ -183,25 +184,44 @@ def response_headers(response: ResponseTypeVar) -> ResponseTypeVar:
|
|
|
183
184
|
return response
|
|
184
185
|
|
|
185
186
|
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
P = ParamSpec('P')
|
|
188
|
+
R = TypeVar('R')
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def check_accept_header_wrapper_flask(
|
|
192
|
+
supported_content_types: 'Iterable[str]'
|
|
193
|
+
) -> 'Callable[[Callable[P, R]], Callable[P, R]]':
|
|
194
|
+
"""Decorator that refuses requests with an unsupported *Accept* header."""
|
|
195
|
+
|
|
196
|
+
def wrapper(
|
|
197
|
+
f: 'Callable[P, R]'
|
|
198
|
+
) -> 'Callable[P, R]':
|
|
199
|
+
"""Decorate *f* with an *Accept*-header check and return the new callable."""
|
|
188
200
|
|
|
189
|
-
def wrapper(f):
|
|
190
201
|
@wraps(f)
|
|
191
|
-
def decorated(*args, **kwargs):
|
|
202
|
+
def decorated(*args: 'P.args', **kwargs: 'P.kwargs') -> 'R':
|
|
203
|
+
"""Run the header check, then delegate to *f* (or return 406)."""
|
|
204
|
+
|
|
205
|
+
# 1. no Accept header → accept everything
|
|
192
206
|
if not flask.request.accept_mimetypes.provided:
|
|
193
|
-
# accept anything, if Accept header is not provided
|
|
194
207
|
return f(*args, **kwargs)
|
|
195
208
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
209
|
+
# 2. at least one acceptable media‑type → call the view
|
|
210
|
+
if any(s in flask.request.accept_mimetypes for s in supported_content_types):
|
|
211
|
+
return f(*args, **kwargs)
|
|
199
212
|
|
|
200
|
-
# none matched
|
|
201
|
-
return
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
213
|
+
# 3. none matched → 406 response
|
|
214
|
+
return cast(
|
|
215
|
+
'R',
|
|
216
|
+
generate_http_error_flask(
|
|
217
|
+
status_code=406,
|
|
218
|
+
exc=UnsupportedRequestedContentType.__name__,
|
|
219
|
+
exc_msg=(
|
|
220
|
+
f'The requested content type '
|
|
221
|
+
f'{flask.request.environ.get("HTTP_ACCEPT")} is not supported. '
|
|
222
|
+
f'Use {supported_content_types}.'
|
|
223
|
+
),
|
|
224
|
+
),
|
|
205
225
|
)
|
|
206
226
|
|
|
207
227
|
return decorated
|
|
@@ -281,7 +281,7 @@ class OptionSet(ErrorHandlingMethodView):
|
|
|
281
281
|
return generate_http_error_flask(500, error, f"Could not set value '{value}' for section '{section}' option '{option}'")
|
|
282
282
|
|
|
283
283
|
|
|
284
|
-
def blueprint():
|
|
284
|
+
def blueprint() -> AuthenticatedBlueprint:
|
|
285
285
|
bp = AuthenticatedBlueprint('config', __name__, url_prefix='/config')
|
|
286
286
|
|
|
287
287
|
option_set_view = OptionSet.as_view('option_set')
|