rucio 38.0.0rc2__py3-none-any.whl → 38.1.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.
- rucio/cli/account.py +1 -1
- rucio/cli/bin_legacy/rucio.py +2 -64
- rucio/cli/did.py +1 -4
- rucio/common/exception.py +5 -5
- rucio/common/schema/__init__.py +19 -35
- rucio/common/utils.py +1 -1
- rucio/core/lock.py +7 -6
- rucio/core/permission/__init__.py +20 -32
- rucio/daemons/common.py +1 -1
- rucio/daemons/conveyor/finisher.py +2 -2
- rucio/daemons/conveyor/poller.py +2 -2
- rucio/daemons/conveyor/preparer.py +1 -1
- rucio/daemons/conveyor/submitter.py +2 -2
- rucio/daemons/conveyor/throttler.py +1 -1
- rucio/db/sqla/models.py +2 -0
- rucio/db/sqla/session.py +8 -1
- rucio/tests/common.py +64 -12
- rucio/vcsversion.py +4 -4
- rucio/web/rest/flaskapi/v1/auth.py +11 -2
- rucio/web/rest/flaskapi/v1/main.py +1 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio +4 -1
- {rucio-38.0.0rc2.dist-info → rucio-38.1.0.dist-info}/METADATA +1 -1
- {rucio-38.0.0rc2.dist-info → rucio-38.1.0.dist-info}/RECORD +81 -81
- {rucio-38.0.0rc2.dist-info → rucio-38.1.0.dist-info}/licenses/AUTHORS.rst +1 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/ldap.cfg.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/requirements.server.txt +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/tools/bootstrap.py +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/tools/reset_database.py +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-abacus-account +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-abacus-collection-replica +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-abacus-rse +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-admin +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-atropos +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-auditor +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-automatix +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-bb8 +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-cache-client +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-cache-consumer +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-finisher +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-poller +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-preparer +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-receiver +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-stager +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-submitter +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-conveyor-throttler +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-dark-reaper +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-dumper +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-follower +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-hermes +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-judge-cleaner +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-judge-evaluator +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-judge-injector +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-judge-repairer +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-kronos +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-minos +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-minos-temporary-expiration +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-necromancer +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-oauth-manager +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-reaper +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-replica-recoverer +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-rse-decommissioner +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-storage-consistency-actions +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-transmogrifier +0 -0
- {rucio-38.0.0rc2.data → rucio-38.1.0.data}/scripts/rucio-undertaker +0 -0
- {rucio-38.0.0rc2.dist-info → rucio-38.1.0.dist-info}/WHEEL +0 -0
- {rucio-38.0.0rc2.dist-info → rucio-38.1.0.dist-info}/licenses/LICENSE +0 -0
- {rucio-38.0.0rc2.dist-info → rucio-38.1.0.dist-info}/top_level.txt +0 -0
rucio/cli/account.py
CHANGED
|
@@ -212,5 +212,5 @@ def identity_add(ctx, account_name, type_, id, email, password):
|
|
|
212
212
|
@click.pass_context
|
|
213
213
|
def identity_remove(ctx, account_name, type_, id):
|
|
214
214
|
"""Revoke a given ID's access from an account"""
|
|
215
|
-
args = Arguments({"no_pager": ctx.obj.no_pager, "account": account_name, "authtype": type_, "
|
|
215
|
+
args = Arguments({"no_pager": ctx.obj.no_pager, "account": account_name, "authtype": type_, "identity": id})
|
|
216
216
|
identity_delete(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
rucio/cli/bin_legacy/rucio.py
CHANGED
|
@@ -32,7 +32,6 @@ from rich.status import Status
|
|
|
32
32
|
from rich.text import Text
|
|
33
33
|
from rich.theme import Theme
|
|
34
34
|
from rich.traceback import install
|
|
35
|
-
from rich.tree import Tree
|
|
36
35
|
from tabulate import tabulate
|
|
37
36
|
|
|
38
37
|
# rucio module has the same name as this executable module, so this rule fails. pylint: disable=no-name-in-module
|
|
@@ -716,64 +715,7 @@ def list_parent_dids(args, client, logger, console, spinner):
|
|
|
716
715
|
spinner.update(status='Fetching parent DIDs')
|
|
717
716
|
spinner.start()
|
|
718
717
|
|
|
719
|
-
if args.
|
|
720
|
-
dict_datasets = {}
|
|
721
|
-
output = []
|
|
722
|
-
for res in client.get_did_from_pfns(args.pfns):
|
|
723
|
-
for key in res:
|
|
724
|
-
if key not in dict_datasets:
|
|
725
|
-
dict_datasets[key] = []
|
|
726
|
-
for rule in client.list_associated_rules_for_file(res[key]['scope'], res[key]['name']):
|
|
727
|
-
if f"{rule['scope']}:{rule['name']}" not in dict_datasets[key]:
|
|
728
|
-
dict_datasets[key].append(f"{rule['scope']}:{rule['name']}")
|
|
729
|
-
|
|
730
|
-
for i, pfn in enumerate(dict_datasets):
|
|
731
|
-
if cli_config == 'rich':
|
|
732
|
-
parent_tree = Tree('')
|
|
733
|
-
for parent in dict_datasets[pfn]:
|
|
734
|
-
parent_tree.add(parent)
|
|
735
|
-
table = generate_table([['PFN', pfn], ['Parents', parent_tree]], col_alignments=['left', 'left'], row_styles=['none'])
|
|
736
|
-
output.append(table)
|
|
737
|
-
else:
|
|
738
|
-
print('PFN: ', pfn)
|
|
739
|
-
print('Parents: ', ','.join(dict_datasets[pfn]))
|
|
740
|
-
|
|
741
|
-
if cli_config == 'rich':
|
|
742
|
-
spinner.stop()
|
|
743
|
-
print_output(*output, console=console, no_pager=args.no_pager)
|
|
744
|
-
elif args.guids:
|
|
745
|
-
output = []
|
|
746
|
-
guids = []
|
|
747
|
-
for input_ in args.guids:
|
|
748
|
-
try:
|
|
749
|
-
uuid.UUID(input_)
|
|
750
|
-
except ValueError:
|
|
751
|
-
print(f'Ignoring invalid GUID: {input_}')
|
|
752
|
-
continue
|
|
753
|
-
dict_datasets = {}
|
|
754
|
-
for guid in guids:
|
|
755
|
-
for did in client.get_dataset_by_guid(guid):
|
|
756
|
-
if guid not in dict_datasets:
|
|
757
|
-
dict_datasets[guid] = []
|
|
758
|
-
for rule in client.list_associated_rules_for_file(did['scope'], did['name']):
|
|
759
|
-
if f"{rule['scope']}:{rule['name']}" not in dict_datasets[guid]:
|
|
760
|
-
dict_datasets[guid].append(f"{rule['scope']}:{rule['name']}")
|
|
761
|
-
|
|
762
|
-
for i, guid in enumerate(dict_datasets):
|
|
763
|
-
if cli_config == 'rich':
|
|
764
|
-
parent_tree = Tree('')
|
|
765
|
-
for parent in dict_datasets[guid]:
|
|
766
|
-
parent_tree.add(parent)
|
|
767
|
-
table = generate_table([['GUID', guid], ['Parents', parent_tree]], col_alignments=['left', 'left'], row_styles=['none'])
|
|
768
|
-
output.append(table)
|
|
769
|
-
else:
|
|
770
|
-
print('GUID: ', guid)
|
|
771
|
-
print('Parents : ', ','.join(dict_datasets[guid]))
|
|
772
|
-
|
|
773
|
-
if cli_config == 'rich':
|
|
774
|
-
spinner.stop()
|
|
775
|
-
print_output(*output, console=console, no_pager=args.no_pager)
|
|
776
|
-
elif args.did:
|
|
718
|
+
if args.did:
|
|
777
719
|
table_data = []
|
|
778
720
|
scope, name = get_scope(args.did, client)
|
|
779
721
|
for dataset in client.list_parent_dids(scope=scope, name=name):
|
|
@@ -789,7 +731,7 @@ def list_parent_dids(args, client, logger, console, spinner):
|
|
|
789
731
|
else:
|
|
790
732
|
print(tabulate(table_data, tablefmt=tablefmt, headers=['SCOPE:NAME', '[DID TYPE]']))
|
|
791
733
|
else:
|
|
792
|
-
raise InputValidationError('
|
|
734
|
+
raise InputValidationError('A DID must be provided. Use -h to list the options.')
|
|
793
735
|
return SUCCESS
|
|
794
736
|
|
|
795
737
|
|
|
@@ -2403,8 +2345,6 @@ You can filter by key/value, e.g.::
|
|
|
2403
2345
|
''')
|
|
2404
2346
|
list_parent_parser.set_defaults(function=list_parent_dids)
|
|
2405
2347
|
list_parent_parser.add_argument(dest='did', action='store', nargs='?', default=None, help='Data identifier.')
|
|
2406
|
-
list_parent_parser.add_argument('--pfn', dest='pfns', action='store', nargs='+', help='List parent dids for these pfns.')
|
|
2407
|
-
list_parent_parser.add_argument('--guid', dest='guids', action='store', nargs='+', help='List parent dids for these guids.')
|
|
2408
2348
|
|
|
2409
2349
|
# argparse 2.7 does not allow aliases for commands, thus the list-parent-datasets is a copy&paste from list-parent-dids
|
|
2410
2350
|
list_parent_datasets_parser = subparsers.add_parser('list-parent-datasets', help='List parent DIDs for a given DID', description='List all parents Data IDentifier that contains the target Data IDentifier.',
|
|
@@ -2423,8 +2363,6 @@ You can filter by key/value, e.g.::
|
|
|
2423
2363
|
|
|
2424
2364
|
list_parent_datasets_parser.set_defaults(function=list_parent_dids)
|
|
2425
2365
|
list_parent_datasets_parser.add_argument(dest='did', action='store', nargs='?', default=None, help='Data identifier.')
|
|
2426
|
-
list_parent_datasets_parser.add_argument('--pfn', dest='pfns', action='store', nargs='+', help='List parent dids for these pfns.')
|
|
2427
|
-
list_parent_datasets_parser.add_argument('--guid', dest='guids', action='store', nargs='+', help='List parent dids for these guids.')
|
|
2428
2366
|
|
|
2429
2367
|
# The list-scopes command
|
|
2430
2368
|
scope_list_parser = subparsers.add_parser('list-scopes', help='List all available scopes.',
|
rucio/cli/did.py
CHANGED
|
@@ -37,11 +37,8 @@ def did():
|
|
|
37
37
|
@click.option("--short", is_flag=True, default=False, help="Dump the list of DIDs")
|
|
38
38
|
@click.argument("did-pattern", nargs=-1)
|
|
39
39
|
@click.option("--parent", default=False, is_flag=True, help="List the parents of the DID - must use a full DID scope and name")
|
|
40
|
-
# TODO Implement or remove option - view https://github.com/rucio/rucio/issues/7230
|
|
41
|
-
@click.option("--pfn", hidden=True)
|
|
42
|
-
@click.option("--guid", hidden=True)
|
|
43
40
|
@click.pass_context
|
|
44
|
-
def list_(ctx, did_pattern, recursive, filter_, short, parent
|
|
41
|
+
def list_(ctx, did_pattern, recursive, filter_, short, parent):
|
|
45
42
|
"""
|
|
46
43
|
List the Data IDentifiers matching certain pattern.
|
|
47
44
|
Only the collections (i.e. dataset or container) are returned by default.
|
rucio/common/exception.py
CHANGED
|
@@ -1215,7 +1215,7 @@ class OpenDataError(RucioException):
|
|
|
1215
1215
|
|
|
1216
1216
|
def __init__(self, *args):
|
|
1217
1217
|
super(OpenDataError, self).__init__(*args)
|
|
1218
|
-
self._message =
|
|
1218
|
+
self._message = "Error related to open data."
|
|
1219
1219
|
self.error_code = 115
|
|
1220
1220
|
|
|
1221
1221
|
|
|
@@ -1226,7 +1226,7 @@ class OpenDataDataIdentifierNotFound(OpenDataError):
|
|
|
1226
1226
|
|
|
1227
1227
|
def __init__(self, *args):
|
|
1228
1228
|
super(OpenDataDataIdentifierNotFound, self).__init__(*args)
|
|
1229
|
-
self._message =
|
|
1229
|
+
self._message = "Data identifier not found in the open data catalog."
|
|
1230
1230
|
self.error_code = 116
|
|
1231
1231
|
|
|
1232
1232
|
|
|
@@ -1237,7 +1237,7 @@ class OpenDataDataIdentifierAlreadyExists(OpenDataError):
|
|
|
1237
1237
|
|
|
1238
1238
|
def __init__(self, *args):
|
|
1239
1239
|
super(OpenDataDataIdentifierAlreadyExists, self).__init__(*args)
|
|
1240
|
-
self._message =
|
|
1240
|
+
self._message = "Data identifier already exists in the open data catalog."
|
|
1241
1241
|
self.error_code = 117
|
|
1242
1242
|
|
|
1243
1243
|
|
|
@@ -1248,7 +1248,7 @@ class OpenDataInvalidState(OpenDataError):
|
|
|
1248
1248
|
|
|
1249
1249
|
def __init__(self, *args):
|
|
1250
1250
|
super(OpenDataInvalidState, self).__init__(*args)
|
|
1251
|
-
self._message =
|
|
1251
|
+
self._message = "Open data entry is in an invalid state."
|
|
1252
1252
|
self.error_code = 118
|
|
1253
1253
|
|
|
1254
1254
|
|
|
@@ -1259,5 +1259,5 @@ class OpenDataInvalidStateUpdate(OpenDataError):
|
|
|
1259
1259
|
|
|
1260
1260
|
def __init__(self, *args):
|
|
1261
1261
|
super(OpenDataInvalidStateUpdate, self).__init__(*args)
|
|
1262
|
-
self._message =
|
|
1262
|
+
self._message = "Invalid state update attempted on open data entry."
|
|
1263
1263
|
self.error_code = 119
|
rucio/common/schema/__init__.py
CHANGED
|
@@ -59,23 +59,15 @@ def _get_generic_schema_module():
|
|
|
59
59
|
if not _is_multivo():
|
|
60
60
|
GENERIC_FALLBACK = 'generic'
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
72
|
-
# fall back to old system for now
|
|
73
|
-
try:
|
|
74
|
-
policy = config.config_get('policy', 'schema', check_config_table=False)
|
|
75
|
-
except (NoOptionError, NoSectionError):
|
|
76
|
-
policy = GENERIC_FALLBACK
|
|
77
|
-
policy = 'rucio.common.schema.' + policy.lower()
|
|
78
|
-
else:
|
|
62
|
+
try:
|
|
63
|
+
if 'RUCIO_POLICY_PACKAGE' in environ:
|
|
64
|
+
policy = environ['RUCIO_POLICY_PACKAGE']
|
|
65
|
+
else:
|
|
66
|
+
policy = config.config_get('policy', 'package', check_config_table=False, raise_exception=True)
|
|
67
|
+
package_module = importlib.import_module(policy)
|
|
68
|
+
check_policy_module_version(package_module)
|
|
69
|
+
policy = policy + ".schema"
|
|
70
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
79
71
|
policy = 'rucio.common.schema.' + GENERIC_FALLBACK.lower()
|
|
80
72
|
|
|
81
73
|
try:
|
|
@@ -102,24 +94,16 @@ if not _is_multivo():
|
|
|
102
94
|
|
|
103
95
|
def load_schema_for_vo(vo: str) -> None:
|
|
104
96
|
generic_fallback = 'generic_multi_vo'
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
116
|
-
# fall back to old system for now
|
|
117
|
-
try:
|
|
118
|
-
policy = config.config_get('policy', 'schema', check_config_table=False)
|
|
119
|
-
except (NoOptionError, NoSectionError):
|
|
120
|
-
policy = generic_fallback
|
|
121
|
-
policy = 'rucio.common.schema.' + policy.lower()
|
|
122
|
-
else:
|
|
97
|
+
try:
|
|
98
|
+
env_name = 'RUCIO_POLICY_PACKAGE_' + vo.upper()
|
|
99
|
+
if env_name in environ:
|
|
100
|
+
policy = environ[env_name]
|
|
101
|
+
else:
|
|
102
|
+
policy = config.config_get('policy', 'package-' + vo, check_config_table=False, raise_exception=True)
|
|
103
|
+
package_module = importlib.import_module(policy)
|
|
104
|
+
check_policy_module_version(package_module)
|
|
105
|
+
policy = policy + ".schema"
|
|
106
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
123
107
|
policy = 'rucio.common.schema.' + generic_fallback.lower()
|
|
124
108
|
|
|
125
109
|
try:
|
rucio/common/utils.py
CHANGED
|
@@ -399,7 +399,7 @@ class NonDeterministicPFNAlgorithms(PolicyPackageAlgorithms):
|
|
|
399
399
|
Initialises a non-deterministic PFN construction object
|
|
400
400
|
"""
|
|
401
401
|
super().__init__()
|
|
402
|
-
|
|
402
|
+
|
|
403
403
|
self.vo = vo
|
|
404
404
|
|
|
405
405
|
def construct_non_deterministic_pfn(self, dsn: str, scope: Optional[str], filename: str, naming_convention: str) -> str:
|
rucio/core/lock.py
CHANGED
|
@@ -542,7 +542,7 @@ def touch_dataset_locks(dataset_locks: "Iterable[dict[str, Any]]", *, session: "
|
|
|
542
542
|
for dataset_lock in dataset_locks:
|
|
543
543
|
eol_at = define_eol(dataset_lock['scope'], dataset_lock['name'], rses=[{'id': dataset_lock['rse_id']}], session=session)
|
|
544
544
|
try:
|
|
545
|
-
|
|
545
|
+
update_dslock_stmt = update(
|
|
546
546
|
models.DatasetLock
|
|
547
547
|
).where(
|
|
548
548
|
and_(models.DatasetLock.scope == dataset_lock['scope'],
|
|
@@ -553,24 +553,25 @@ def touch_dataset_locks(dataset_locks: "Iterable[dict[str, Any]]", *, session: "
|
|
|
553
553
|
}).execution_options(
|
|
554
554
|
synchronize_session=False
|
|
555
555
|
)
|
|
556
|
-
|
|
556
|
+
session.execute(update_dslock_stmt)
|
|
557
|
+
|
|
558
|
+
update_rule_subq = select(
|
|
557
559
|
models.DatasetLock.rule_id
|
|
558
560
|
).where(
|
|
559
561
|
and_(models.DatasetLock.scope == dataset_lock['scope'],
|
|
560
562
|
models.DatasetLock.name == dataset_lock['name'],
|
|
561
563
|
models.DatasetLock.rse_id == dataset_lock['rse_id'])
|
|
562
564
|
)
|
|
563
|
-
|
|
564
|
-
stmt = update(
|
|
565
|
+
update_rule_stmt = update(
|
|
565
566
|
models.ReplicationRule
|
|
566
567
|
).where(
|
|
567
|
-
models.ReplicationRule.id.in_(
|
|
568
|
+
models.ReplicationRule.id.in_(update_rule_subq)
|
|
568
569
|
).values({
|
|
569
570
|
models.ReplicationRule.eol_at: eol_at
|
|
570
571
|
}).execution_options(
|
|
571
572
|
synchronize_session=False
|
|
572
573
|
)
|
|
573
|
-
session.execute(
|
|
574
|
+
session.execute(update_rule_stmt)
|
|
574
575
|
except DatabaseError:
|
|
575
576
|
return False
|
|
576
577
|
|
|
@@ -49,20 +49,16 @@ if not multivo:
|
|
|
49
49
|
if fallback_policy == 'def':
|
|
50
50
|
fallback_policy = generic_fallback
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# fall back to old system for now
|
|
63
|
-
policy = 'rucio.core.permission.' + fallback_policy.lower()
|
|
64
|
-
else:
|
|
65
|
-
policy = 'rucio.core.permission.' + generic_fallback.lower()
|
|
52
|
+
try:
|
|
53
|
+
if 'RUCIO_POLICY_PACKAGE' in environ:
|
|
54
|
+
policy = environ['RUCIO_POLICY_PACKAGE']
|
|
55
|
+
else:
|
|
56
|
+
policy = config.config_get('policy', 'package', check_config_table=False, raise_exception=True)
|
|
57
|
+
package_module = importlib.import_module(policy)
|
|
58
|
+
check_policy_module_version(package_module)
|
|
59
|
+
policy = policy + ".permission"
|
|
60
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
61
|
+
policy = 'rucio.core.permission.' + fallback_policy.lower()
|
|
66
62
|
|
|
67
63
|
try:
|
|
68
64
|
module = importlib.import_module(policy)
|
|
@@ -86,24 +82,16 @@ if not multivo:
|
|
|
86
82
|
|
|
87
83
|
def load_permission_for_vo(vo: str) -> None:
|
|
88
84
|
generic_fallback = 'generic_multi_vo'
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
100
|
-
# fall back to old system for now
|
|
101
|
-
try:
|
|
102
|
-
policy = config.config_get('policy', 'permission')
|
|
103
|
-
except (NoOptionError, NoSectionError):
|
|
104
|
-
policy = generic_fallback
|
|
105
|
-
policy = 'rucio.core.permission.' + policy.lower()
|
|
106
|
-
else:
|
|
85
|
+
try:
|
|
86
|
+
env_name = 'RUCIO_POLICY_PACKAGE_' + vo.upper()
|
|
87
|
+
if env_name in environ:
|
|
88
|
+
policy = environ[env_name]
|
|
89
|
+
else:
|
|
90
|
+
policy = config.config_get('policy', 'package-' + vo, raise_exception=True)
|
|
91
|
+
package_module = importlib.import_module(policy)
|
|
92
|
+
check_policy_module_version(package_module)
|
|
93
|
+
policy = policy + ".permission"
|
|
94
|
+
except (NoOptionError, NoSectionError, ModuleNotFoundError):
|
|
107
95
|
policy = 'rucio.core.permission.' + generic_fallback.lower()
|
|
108
96
|
|
|
109
97
|
try:
|
rucio/daemons/common.py
CHANGED
|
@@ -118,7 +118,7 @@ def _activity_looper(
|
|
|
118
118
|
sleep_time: int,
|
|
119
119
|
activities: Optional['Sequence[str]'],
|
|
120
120
|
heartbeat_handler: HeartbeatHandler,
|
|
121
|
-
) -> 'Generator[tuple[str, float], tuple[float, bool], None]':
|
|
121
|
+
) -> 'Generator[tuple[Optional[str], float], tuple[float, bool], None]':
|
|
122
122
|
"""
|
|
123
123
|
Generator which loops (either once, or indefinitely) over all activities while ensuring that `sleep_time`
|
|
124
124
|
passes between handling twice the same activity.
|
|
@@ -66,7 +66,7 @@ def _fetch_requests(
|
|
|
66
66
|
set_last_processed_by: bool,
|
|
67
67
|
cached_topology: Optional[ExpiringObjectCache],
|
|
68
68
|
heartbeat_handler: "HeartbeatHandler",
|
|
69
|
-
activity: str,
|
|
69
|
+
activity: Optional[str],
|
|
70
70
|
) -> tuple[bool, tuple[list[dict[str, Any]], Topology]]:
|
|
71
71
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
72
72
|
|
|
@@ -184,7 +184,7 @@ def finisher(
|
|
|
184
184
|
)
|
|
185
185
|
def _db_producer(
|
|
186
186
|
*,
|
|
187
|
-
activity: str,
|
|
187
|
+
activity: Optional[str],
|
|
188
188
|
heartbeat_handler: "HeartbeatHandler"
|
|
189
189
|
) -> tuple[bool, tuple[list[dict[str, Any]], Topology]]:
|
|
190
190
|
return _fetch_requests(
|
rucio/daemons/conveyor/poller.py
CHANGED
|
@@ -66,7 +66,7 @@ def _fetch_requests(
|
|
|
66
66
|
transfertool: Optional[str],
|
|
67
67
|
filter_transfertool: Optional[str],
|
|
68
68
|
cached_topology: Optional[ExpiringObjectCache],
|
|
69
|
-
activity: str,
|
|
69
|
+
activity: Optional[str],
|
|
70
70
|
set_last_processed_by: bool,
|
|
71
71
|
heartbeat_handler: "HeartbeatHandler"
|
|
72
72
|
) -> tuple[bool, list[dict[str, Any]]]:
|
|
@@ -196,7 +196,7 @@ def poller(
|
|
|
196
196
|
)
|
|
197
197
|
def _db_producer(
|
|
198
198
|
*,
|
|
199
|
-
activity: str,
|
|
199
|
+
activity: Optional[str],
|
|
200
200
|
heartbeat_handler: "HeartbeatHandler"
|
|
201
201
|
) -> tuple[bool, list[dict[str, Any]]]:
|
|
202
202
|
return _fetch_requests(
|
|
@@ -100,7 +100,7 @@ def preparer(
|
|
|
100
100
|
sleep_time=sleep_time)
|
|
101
101
|
def _db_producer(
|
|
102
102
|
*,
|
|
103
|
-
activity: str,
|
|
103
|
+
activity: Optional[str],
|
|
104
104
|
heartbeat_handler: "HeartbeatHandler"
|
|
105
105
|
) -> tuple[bool, tuple[Topology, dict[str, RequestWithSources]]]:
|
|
106
106
|
return _fetch_requests(
|
|
@@ -55,7 +55,7 @@ TRANSFER_TYPE = config_get('conveyor', 'transfertype', False, 'single')
|
|
|
55
55
|
def _fetch_requests(
|
|
56
56
|
partition_hash_var: Optional[str],
|
|
57
57
|
bulk: int,
|
|
58
|
-
activity: str,
|
|
58
|
+
activity: Optional[str],
|
|
59
59
|
rse_ids: Optional[list[str]],
|
|
60
60
|
request_type: list[RequestType],
|
|
61
61
|
ignore_availability: bool,
|
|
@@ -285,7 +285,7 @@ def submitter(
|
|
|
285
285
|
activities=activities)
|
|
286
286
|
def _db_producer(
|
|
287
287
|
*,
|
|
288
|
-
activity: str,
|
|
288
|
+
activity: Optional[str],
|
|
289
289
|
heartbeat_handler: "HeartbeatHandler"
|
|
290
290
|
) -> tuple[bool, tuple[Topology, dict[str, RequestWithSources]]]:
|
|
291
291
|
return _fetch_requests(
|
|
@@ -102,7 +102,7 @@ def throttler(
|
|
|
102
102
|
sleep_time=sleep_time)
|
|
103
103
|
def _db_producer(
|
|
104
104
|
*,
|
|
105
|
-
activity: str,
|
|
105
|
+
activity: Optional[str],
|
|
106
106
|
heartbeat_handler: "HeartbeatHandler"
|
|
107
107
|
) -> tuple[bool, Optional["ReleaseGroupsDict"]]:
|
|
108
108
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
rucio/db/sqla/models.py
CHANGED
|
@@ -517,6 +517,7 @@ class OpenDataDOI(BASE, ModelBase):
|
|
|
517
517
|
Index('OPENDATA_DOI_CREATED_AT_IDX', 'created_at'),
|
|
518
518
|
)
|
|
519
519
|
|
|
520
|
+
|
|
520
521
|
class OpenDataMeta(BASE, ModelBase):
|
|
521
522
|
"""Mapping between OpenData DIDs and DOIs"""
|
|
522
523
|
__tablename__ = 'dids_opendata_meta'
|
|
@@ -535,6 +536,7 @@ class OpenDataMeta(BASE, ModelBase):
|
|
|
535
536
|
),
|
|
536
537
|
)
|
|
537
538
|
|
|
539
|
+
|
|
538
540
|
class VirtualPlacements(BASE, ModelBase):
|
|
539
541
|
"""Represents virtual placements"""
|
|
540
542
|
__tablename__ = 'virtual_placements'
|
rucio/db/sqla/session.py
CHANGED
|
@@ -38,6 +38,8 @@ from rucio.db.sqla.constants import DatabaseOperationType
|
|
|
38
38
|
|
|
39
39
|
EXTRA_MODULES = import_extras(['MySQLdb', 'pymysql'])
|
|
40
40
|
|
|
41
|
+
LOG = logging.getLogger(__name__)
|
|
42
|
+
|
|
41
43
|
if TYPE_CHECKING:
|
|
42
44
|
from collections.abc import Callable, Iterator
|
|
43
45
|
from typing import Optional, ParamSpec, TypeVar
|
|
@@ -71,7 +73,6 @@ DEFAULT_SCHEMA_NAME = config_get(DATABASE_SECTION, 'schema',
|
|
|
71
73
|
_METADATA = MetaData(schema=DEFAULT_SCHEMA_NAME)
|
|
72
74
|
_MAKER, _ENGINE, _LOCK = None, None, Lock()
|
|
73
75
|
|
|
74
|
-
|
|
75
76
|
SQLA_CONFIG_POOLCLASS_MAPPING = {
|
|
76
77
|
'queuepool': QueuePool,
|
|
77
78
|
'singletonthreadpool': SingletonThreadPool,
|
|
@@ -218,6 +219,12 @@ def get_engine() -> 'Engine':
|
|
|
218
219
|
if 'mysql' in sql_connection:
|
|
219
220
|
conv = mysql_convert_decimal_to_float(pymysql=sql_connection.startswith('mysql+pymysql'))
|
|
220
221
|
params['connect_args'] = {'conv': conv}
|
|
222
|
+
elif 'oracle' in sql_connection:
|
|
223
|
+
try:
|
|
224
|
+
import oracledb # pylint: disable=import-error
|
|
225
|
+
oracledb.init_oracle_client()
|
|
226
|
+
except Exception as err:
|
|
227
|
+
LOG.warning('Could not start Oracle thick mode; falling back to thin: %s', err)
|
|
221
228
|
for param, param_type in config_params:
|
|
222
229
|
try:
|
|
223
230
|
params[param] = param_type(config_get(DATABASE_SECTION, param, check_config_table=False))
|
rucio/tests/common.py
CHANGED
|
@@ -50,23 +50,75 @@ skip_outside_gh_actions = pytest.mark.skipif(os.getenv("GITHUB_ACTIONS") != "tru
|
|
|
50
50
|
reason="Skipping tests outside GitHub Actions")
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
def is_influxdb_available(
|
|
54
|
-
|
|
53
|
+
def is_influxdb_available(
|
|
54
|
+
url: str = "http://influxdb:8086",
|
|
55
|
+
timeout: float = 2.0
|
|
56
|
+
) -> bool:
|
|
57
|
+
"""
|
|
58
|
+
Return True when InfluxDB is up and ready for queries, otherwise False.
|
|
59
|
+
|
|
60
|
+
Strategy:
|
|
61
|
+
1. Try /health → 200 + JSON["status"] == "pass"
|
|
62
|
+
2. Fallback to /ping → 204
|
|
63
|
+
"""
|
|
64
|
+
print(f"Checking InfluxDB availability at {url}")
|
|
65
|
+
try:
|
|
66
|
+
r = requests.get(f"{url}/health", timeout=timeout)
|
|
67
|
+
print(f"InfluxDB /health responded with {r.status_code} and body: {r.text}", r.status_code, r.text)
|
|
68
|
+
if r.status_code == 200 and r.json().get("status") == "pass":
|
|
69
|
+
return True
|
|
70
|
+
print(f"InfluxDB is not running healthy at {url}.")
|
|
71
|
+
return False
|
|
72
|
+
except requests.RequestException as e:
|
|
73
|
+
# /health failed or is not available (pre‑1.8)
|
|
74
|
+
print(f"Failed to query InfluxDB /health at {url}: {e}")
|
|
75
|
+
|
|
55
76
|
try:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
77
|
+
print(f"Falling back to /ping for InfluxDB at {url}")
|
|
78
|
+
r = requests.get(f"{url}/ping", timeout=timeout)
|
|
79
|
+
print(f"InfluxDB /ping responded with {r.status_code}")
|
|
80
|
+
return r.status_code == 204
|
|
81
|
+
except requests.RequestException as e:
|
|
82
|
+
print(f"InfluxDB is not reachable at {url}: {e}")
|
|
60
83
|
return False
|
|
61
84
|
|
|
62
85
|
|
|
63
|
-
def is_elasticsearch_available(
|
|
64
|
-
|
|
86
|
+
def is_elasticsearch_available(
|
|
87
|
+
url: str = "http://elasticsearch:9200",
|
|
88
|
+
timeout: float = 2.0,
|
|
89
|
+
min_status: str = 'green',
|
|
90
|
+
) -> bool:
|
|
91
|
+
"""
|
|
92
|
+
Return True when the Elasticsearch node is reachable **and**
|
|
93
|
+
cluster health is at least `min_status` ('red'<'yellow'<'green').
|
|
94
|
+
|
|
95
|
+
1. GET /_cluster/health → 200 + JSON["status"] meets threshold
|
|
96
|
+
2. Fallback: HEAD / → 200 (port open but health unknown)
|
|
97
|
+
"""
|
|
98
|
+
_status_level = {"red": 1, "yellow": 2, "green": 3}
|
|
99
|
+
|
|
100
|
+
print(f"Checking Elasticsearch availability at {url}")
|
|
101
|
+
try:
|
|
102
|
+
r = requests.get(f"{url}/_cluster/health", timeout=timeout)
|
|
103
|
+
print(f"Elasticsearch /_cluster/health responded with {r.status_code} and body: {r.text}")
|
|
104
|
+
if r.status_code == 200:
|
|
105
|
+
status = r.json().get("status")
|
|
106
|
+
if status and _status_level[status] >= _status_level[min_status]:
|
|
107
|
+
return True
|
|
108
|
+
print(f"Elasticsearch health is {status!r}, below threshold {min_status!r}.")
|
|
109
|
+
return False
|
|
110
|
+
except requests.RequestException as e:
|
|
111
|
+
# Either not reachable or /_cluster/health not yet available
|
|
112
|
+
print(f"Failed to query Elasticsearch /_cluster/health at {url}: {e}")
|
|
113
|
+
|
|
114
|
+
# Very old nodes or boot‑strapping clusters: fall back to a simple HEAD /
|
|
65
115
|
try:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
116
|
+
print(f"Falling back to HEAD request for Elasticsearch at {url}")
|
|
117
|
+
r = requests.head(url, timeout=timeout)
|
|
118
|
+
print(f"Elasticsearch HEAD / responded with {r.status_code}")
|
|
119
|
+
return r.status_code == 200
|
|
120
|
+
except requests.RequestException as e:
|
|
121
|
+
print(f"Elasticsearch is not reachable at {url}: {e}")
|
|
70
122
|
return False
|
|
71
123
|
|
|
72
124
|
|
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': '38.0
|
|
8
|
-
'branch_nick': '
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
7
|
+
'version': '38.1.0',
|
|
8
|
+
'branch_nick': 'release-38-LTS',
|
|
9
|
+
'revision_id': 'f63f25c84c254eac1701a9640e3cb658a7bbdd8e',
|
|
10
|
+
'revno': 13947
|
|
11
11
|
}
|
|
@@ -19,6 +19,7 @@ from typing import TYPE_CHECKING
|
|
|
19
19
|
from urllib.parse import urlparse
|
|
20
20
|
|
|
21
21
|
from flask import Blueprint, Flask, Response, redirect, render_template, request
|
|
22
|
+
from jinja2.exceptions import TemplateNotFound
|
|
22
23
|
from werkzeug.datastructures import Headers
|
|
23
24
|
|
|
24
25
|
from rucio.common.config import config_get
|
|
@@ -579,9 +580,17 @@ class CodeOIDC(ErrorHandlingMethodView):
|
|
|
579
580
|
return render_template('auth_crash.html', crashtype='no_result'), 401, headers
|
|
580
581
|
|
|
581
582
|
if 'fetchcode' in result:
|
|
582
|
-
|
|
583
|
+
try:
|
|
584
|
+
return render_template('auth_granted.html', authcode=result['fetchcode']), 200, headers
|
|
585
|
+
except TemplateNotFound:
|
|
586
|
+
headers.set('Content-Type', 'text/plain')
|
|
587
|
+
return 'auth_granted.html missing', 500, headers
|
|
583
588
|
elif 'polling' in result and result['polling'] is True:
|
|
584
|
-
|
|
589
|
+
try:
|
|
590
|
+
return render_template('auth_granted.html', authcode='allok'), 200, headers
|
|
591
|
+
except TemplateNotFound:
|
|
592
|
+
headers.set('Content-Type', 'text/plain')
|
|
593
|
+
return 'auth_granted.html missing', 500, headers
|
|
585
594
|
else:
|
|
586
595
|
headers.extend(error_headers('InvalidRequest', 'Cannot recognize and process your request'))
|
|
587
596
|
return render_template('auth_crash.html', crashtype='bad_request'), 400, headers
|
|
@@ -17,6 +17,7 @@ import argparse
|
|
|
17
17
|
import sys
|
|
18
18
|
from typing import TYPE_CHECKING, Optional
|
|
19
19
|
|
|
20
|
+
from rucio.cli.bin_legacy.rucio import get_parser
|
|
20
21
|
from rucio.cli.bin_legacy.rucio import main as main_legacy
|
|
21
22
|
from rucio.cli.command import main
|
|
22
23
|
from rucio.common.utils import setup_logger
|
|
@@ -119,9 +120,11 @@ if __name__ == "__main__":
|
|
|
119
120
|
main() # pylint: disable=E1120
|
|
120
121
|
|
|
121
122
|
else:
|
|
122
|
-
make_warning(logger)
|
|
123
123
|
try:
|
|
124
|
+
get_parser().parse_args()
|
|
125
|
+
make_warning(logger)
|
|
124
126
|
main_legacy()
|
|
127
|
+
|
|
125
128
|
# Make a custom warning - show the new help menu when invalid commands are called.
|
|
126
129
|
except argparse.ArgumentError:
|
|
127
130
|
logger.error("Invalid argument(s) - %s " % sys.argv[1:])
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
rucio/__init__.py,sha256=Y7cPPlHVQPFyN8bSPFC0W3WViEdONr5g_qwBub5rufE,660
|
|
2
2
|
rucio/alembicrevision.py,sha256=9tnjQLFkTpUEcZqcw-ojWpt4Wbg-5OtMJ0CfjPc0wX8,690
|
|
3
|
-
rucio/vcsversion.py,sha256=
|
|
3
|
+
rucio/vcsversion.py,sha256=yMKoNaABtSAIdUEDF8GKVaGThokyhemXGEjqfWPCHaI,248
|
|
4
4
|
rucio/version.py,sha256=IwsNb1QQk0D092QQbR2K9wBPF2Akny1RGs-ZZziUohE,1519
|
|
5
5
|
rucio/cli/__init__.py,sha256=GIkHmxgE3xdvWSf-7ZnvVaJmbs7NokaSjbFzsrXOG9o,662
|
|
6
|
-
rucio/cli/account.py,sha256=
|
|
6
|
+
rucio/cli/account.py,sha256=2Fe-iEaTfLxqlW5mDJsJPwD-Etm4VqaMowTSA67hZIo,9458
|
|
7
7
|
rucio/cli/command.py,sha256=dr9bhugorgc2kX-JsdrRsq9Yfh92sYwaALB7CrX6PNI,10835
|
|
8
8
|
rucio/cli/config.py,sha256=L7vhzAyUVKZBWKKDvrLl7zCei8O6kDyzX_x_-p-vk9M,2706
|
|
9
|
-
rucio/cli/did.py,sha256=
|
|
9
|
+
rucio/cli/did.py,sha256=IDrFFAfMhnVhGJMBm9QySO1avnbRcx_VTSaDMi41am8,9020
|
|
10
10
|
rucio/cli/download.py,sha256=nltAf8nm8P6nrfIu0CUveY4YM6oL5nSR3w6yS4qBbw0,6248
|
|
11
11
|
rucio/cli/lifetime_exception.py,sha256=joi9HdaiYP_g3115IR_ImX7oFlEg1xbSaK-IzmoIVcY,1498
|
|
12
12
|
rucio/cli/opendata.py,sha256=wnfzcVBpCmkA9WQFqNsqtMuT-2QRl1LHBjLBgm_c4AU,4741
|
|
@@ -18,7 +18,7 @@ rucio/cli/subscription.py,sha256=kx1ox3OkWqdwfdflhdsv00XSYI6nnUZCp97YBZa4Aw4,426
|
|
|
18
18
|
rucio/cli/upload.py,sha256=29gJGfb7jsiA6-UwPCSg1kGZu-OJ-bdxUZr27S2mJEM,3237
|
|
19
19
|
rucio/cli/utils.py,sha256=AEmdlvvebyFqBiM5z2HWrR1_kWmcDR1yLq3694rFqMs,10410
|
|
20
20
|
rucio/cli/bin_legacy/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
21
|
-
rucio/cli/bin_legacy/rucio.py,sha256=
|
|
21
|
+
rucio/cli/bin_legacy/rucio.py,sha256=Z53nUKd5orN9sFPHXcC6XC2diwMo1Dx5AzJhT3ha7Dw,140892
|
|
22
22
|
rucio/cli/bin_legacy/rucio_admin.py,sha256=pRpJhEGMr3-xzw3EsGeVayEiu8NI_UxEI2wSIbeulzI,141046
|
|
23
23
|
rucio/client/__init__.py,sha256=0-jkSlrJf-eqbN4swA5a07eaWd6_6JXPQPLXMs4A3iI,660
|
|
24
24
|
rucio/client/accountclient.py,sha256=kScbVL9rR8pyZRmETOyz_gwffc7biaPriMgDnCLxA_0,18864
|
|
@@ -55,7 +55,7 @@ rucio/common/config.py,sha256=69AhxgP9SXXrlaTqlOCQiaiqGqHLhSfhRFasroGfDdc,24402
|
|
|
55
55
|
rucio/common/constants.py,sha256=5MhQHY24NODmvp71MqHS8BzSird2K1ICmC94clD-JlY,7751
|
|
56
56
|
rucio/common/constraints.py,sha256=MrdiAwKyoaZGfspUWX_53XS2790nXMSMg1JYmTO_ciQ,726
|
|
57
57
|
rucio/common/didtype.py,sha256=nXoyK740yrwsiGX9e9vOc8UX0PXRvKry67C0Sd8SpmM,8010
|
|
58
|
-
rucio/common/exception.py,sha256=
|
|
58
|
+
rucio/common/exception.py,sha256=q_vSqaJ_SdPorkyo247-l9HqBDpZSGZ1pf2-ZR4uaUY,36188
|
|
59
59
|
rucio/common/extra.py,sha256=IE01275vTJobyNiYbptU9NmsUl2Ga_92FSoOODV8Qfk,1054
|
|
60
60
|
rucio/common/logging.py,sha256=_G1QDFpPLghz2VXOjdhC7j-TtZBxmPJsyJtztW7mf68,15874
|
|
61
61
|
rucio/common/pcache.py,sha256=V2OnO4h4v5yaxWT9T9DMJpm-2rLalBzzaqlUWUq5x4c,47097
|
|
@@ -65,12 +65,12 @@ rucio/common/stomp_utils.py,sha256=3GTiRTJ0roe5OX_wgkVwOJYAIhGgYbhiROHc2M8LQT8,5
|
|
|
65
65
|
rucio/common/stopwatch.py,sha256=_9zxoLjr8A0wUDJsljK4vZNDCI-dIOgpcxXiCNVJcHU,1641
|
|
66
66
|
rucio/common/test_rucio_server.py,sha256=2teFpN5Pthp-zQt1_aErOURDTgOhFP9GKdEr1NMmc4o,5085
|
|
67
67
|
rucio/common/types.py,sha256=joi_upIQsi3U3HMmyfVOVQem3404kGI6OixyFzrqavk,11941
|
|
68
|
-
rucio/common/utils.py,sha256=
|
|
68
|
+
rucio/common/utils.py,sha256=FauL76qhhSm2IZxKrZT7cSnURPCytWAZP5awHdTAXNY,67298
|
|
69
69
|
rucio/common/dumper/__init__.py,sha256=FHhVrOmAJ6-bfHFxgUkPIiejQ0nbGojrW26hfRBHvhg,10940
|
|
70
70
|
rucio/common/dumper/consistency.py,sha256=k1MLD9RAVBR7uBZxjuuQsD8PzbXzOSd6vdWytDweUx4,17962
|
|
71
71
|
rucio/common/dumper/data_models.py,sha256=ckjUy7R9ftmsSCjC1kF0Ccpjq53Eba4EWWlpHzGKI8M,11184
|
|
72
72
|
rucio/common/dumper/path_parsing.py,sha256=Y0GI-xn9VShaR_wFSrzA8yIm0jrjGVAJ5euua0V3enU,2394
|
|
73
|
-
rucio/common/schema/__init__.py,sha256
|
|
73
|
+
rucio/common/schema/__init__.py,sha256=gC39BlHz45lX6-OTtIL5U8RqVJpZGk0RfqCwSKRseYU,7284
|
|
74
74
|
rucio/common/schema/generic.py,sha256=NmmQJ0Z8dHbL7xnbFL7rvXFK29wA8ZGtkwwwMAxzVC0,15887
|
|
75
75
|
rucio/common/schema/generic_multi_vo.py,sha256=UK5DOO-dO7pY6O44t9SJqzeS3xUye_stu_f-EVD-r0s,15107
|
|
76
76
|
rucio/core/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
@@ -88,7 +88,7 @@ rucio/core/heartbeat.py,sha256=xesayFiO_mFsfvbmaGf0pLyeCTW0dZ4LHypOnDhzlbk,11380
|
|
|
88
88
|
rucio/core/identity.py,sha256=BvmZ5JCXYe2WakpTZVKGu3hcPBYaIGg7x-R5UeplNIg,12112
|
|
89
89
|
rucio/core/importer.py,sha256=V2UMTPIUiCUYYAYVRrab3FqA36o_N-4Q_ox3juRC7Zg,14299
|
|
90
90
|
rucio/core/lifetime_exception.py,sha256=f1wpHy-YG3MwdgmV9x7XMvxvlh2kL2iY6NcpDNaVUck,15321
|
|
91
|
-
rucio/core/lock.py,sha256=
|
|
91
|
+
rucio/core/lock.py,sha256=Vg5sT81MLB1hN7tJOOYaD9OOWpio3DC7VtWEla-78eA,23478
|
|
92
92
|
rucio/core/message.py,sha256=r1IfYtelXh7rHNWL_v9jLtsayJjq2vejHQivdNlog2w,10361
|
|
93
93
|
rucio/core/meta_conventions.py,sha256=gzQudxD4sCEax5rFm7WWKZubC1kCxiRNjyS5otj7_Mc,8599
|
|
94
94
|
rucio/core/monitor.py,sha256=ABVRtfmwroWYEku53jtLy5ByKONLIid3SuP6Yry7sSY,16169
|
|
@@ -121,11 +121,11 @@ rucio/core/did_meta_plugins/filter_engine.py,sha256=tFRtA1A-T1DNlfffgfZdTJ0LCfuk
|
|
|
121
121
|
rucio/core/did_meta_plugins/json_meta.py,sha256=KzhgrNIBDuRyUkxkPh86NJZFP_wzFHEUd2EX-AnZ_J4,9918
|
|
122
122
|
rucio/core/did_meta_plugins/mongo_meta.py,sha256=igFgIm5DvJeYDa4yud0mkG80jozJn9IhPPS6shPXIr8,8535
|
|
123
123
|
rucio/core/did_meta_plugins/postgres_meta.py,sha256=8wmbX3CH0Gqx73wycH7kRXaawoNnmF-vPow-fz8v5gQ,14262
|
|
124
|
-
rucio/core/permission/__init__.py,sha256=
|
|
124
|
+
rucio/core/permission/__init__.py,sha256=E7gfKO0T4tFJFckU0Pe0ldjMneFFjORyNPycd5lL-78,5875
|
|
125
125
|
rucio/core/permission/generic.py,sha256=mAxgCTcKL-HKFsA-xcRw5DfYV9xNPfaOBZzSDXiQilI,49901
|
|
126
126
|
rucio/core/permission/generic_multi_vo.py,sha256=nHkPNNixP6bWKSS8tIOJiX_--TL6s8F2TMnobWMnYu8,45653
|
|
127
127
|
rucio/daemons/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
128
|
-
rucio/daemons/common.py,sha256=
|
|
128
|
+
rucio/daemons/common.py,sha256=jCPsyxWWQvYTt3GeerUSqP48QFpky5iG3hGIdjofs6s,15560
|
|
129
129
|
rucio/daemons/abacus/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
130
130
|
rucio/daemons/abacus/account.py,sha256=I1rSanUNbmnrkH9VWYey4AmGimh2h4O5RHWJOg1oZew,4015
|
|
131
131
|
rucio/daemons/abacus/collection_replica.py,sha256=SPV9UYkpH77cnX8XdYXxLtbv7CTP_cIztOWGug6i8JE,4069
|
|
@@ -150,13 +150,13 @@ rucio/daemons/cache/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtH
|
|
|
150
150
|
rucio/daemons/cache/consumer.py,sha256=trcSffcPLcsDuJ6fc0pcDOBxPnYf4uCMp3G5xTMcD_A,6966
|
|
151
151
|
rucio/daemons/conveyor/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
152
152
|
rucio/daemons/conveyor/common.py,sha256=ktmCzxpzjdduJBo4uJXQV3XHGKZK6EQ6og-aHwqKS6E,26437
|
|
153
|
-
rucio/daemons/conveyor/finisher.py,sha256=
|
|
154
|
-
rucio/daemons/conveyor/poller.py,sha256=
|
|
155
|
-
rucio/daemons/conveyor/preparer.py,sha256
|
|
153
|
+
rucio/daemons/conveyor/finisher.py,sha256=KnaO7kZxNHQtKj1PtBGRvqIqbfOlJxAyI0np55QfB3M,25242
|
|
154
|
+
rucio/daemons/conveyor/poller.py,sha256=VSRdFrVDFyBsAZ_V-4TAPXlODyLZdG7nefN3uF5XJhs,16825
|
|
155
|
+
rucio/daemons/conveyor/preparer.py,sha256=--Zchp5EZqiU8wzeO-qpVSo2nKQ0Hy9pEi1acehwzJg,8032
|
|
156
156
|
rucio/daemons/conveyor/receiver.py,sha256=qTbt2uLM5aCfL7ei4JfMrSZwEa2K0s2Yfh0ahTdAn48,8830
|
|
157
157
|
rucio/daemons/conveyor/stager.py,sha256=rrZ-nfPOQMHZzFnOi18JM6rnHlEQpOsPpNM4M89o_gg,4282
|
|
158
|
-
rucio/daemons/conveyor/submitter.py,sha256=
|
|
159
|
-
rucio/daemons/conveyor/throttler.py,sha256=
|
|
158
|
+
rucio/daemons/conveyor/submitter.py,sha256=NfvlXRx4FhcUL2mHk9EuOQ_myBaq0I7bHEgYKBF4RTU,17217
|
|
159
|
+
rucio/daemons/conveyor/throttler.py,sha256=4buwTCux6CFdMXh5v8DYyNC2w33_yHE__dA_ZjUpsr8,22389
|
|
160
160
|
rucio/daemons/follower/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
161
161
|
rucio/daemons/follower/follower.py,sha256=QlPhOsVRC8xGuExFfvy874e6FfPn9wfFmMbjUBqVXTQ,3438
|
|
162
162
|
rucio/daemons/hermes/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
@@ -192,9 +192,9 @@ rucio/daemons/undertaker/undertaker.py,sha256=b8HiFkk7YY4fxORQ7MgmDVADZvvHlHiKrc
|
|
|
192
192
|
rucio/db/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
193
193
|
rucio/db/sqla/__init__.py,sha256=nVXdqNgRs6AXgN7cVM3MAdHZZDX1l0FdVEabWEtMbbw,2506
|
|
194
194
|
rucio/db/sqla/constants.py,sha256=F0MhQNm7-vgDzXXF7SzVLIRu_JhyfLUdTixXqUX-Seo,4396
|
|
195
|
-
rucio/db/sqla/models.py,sha256=
|
|
195
|
+
rucio/db/sqla/models.py,sha256=0Zy_VUPNTo_Huu_mdGPdO46a0QfdDyAffMKsfvtqLbc,114783
|
|
196
196
|
rucio/db/sqla/sautils.py,sha256=X4gHWCkqvDlJEEHmhO2txV94__kvS8M9Hb1aJvbLaUg,2000
|
|
197
|
-
rucio/db/sqla/session.py,sha256=
|
|
197
|
+
rucio/db/sqla/session.py,sha256=iu00PirtSQYQe1671lAZTqq8xv_J4CTPHPi8sKa_86A,19586
|
|
198
198
|
rucio/db/sqla/types.py,sha256=VBCDsSozh2mUNwmmBNbA5xZHkgU0FMXwRBmsc33YUtE,6090
|
|
199
199
|
rucio/db/sqla/util.py,sha256=-CRPH_wkvYFjMpFYYlIs6Vux6F_oDyKSlRjb8HNy_XI,22689
|
|
200
200
|
rucio/db/sqla/migrate_repo/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
@@ -377,7 +377,7 @@ rucio/rse/protocols/storm.py,sha256=Z4fzklxG-x70A0Lugg1jE1RicwCSeF27iz0MXO-4to0,
|
|
|
377
377
|
rucio/rse/protocols/webdav.py,sha256=8UzmBA8vF_-exoUvpIHRQLfhvAvExQsfu-P4WbXGOXI,24810
|
|
378
378
|
rucio/rse/protocols/xrootd.py,sha256=oJHueVR44dcW5nkg8jCbr9PetV9UIti3C0tka_m7yIk,12604
|
|
379
379
|
rucio/tests/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
380
|
-
rucio/tests/common.py,sha256=
|
|
380
|
+
rucio/tests/common.py,sha256=oPffRftoWH3Pxv27XscwLl2_o7I4AHNTpKjsSyb9-RE,11925
|
|
381
381
|
rucio/tests/common_server.py,sha256=hRuD7IZZjlNtahvkIssRvNPK68dS7Cs00aUuO4BQsWs,5667
|
|
382
382
|
rucio/transfertool/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
383
383
|
rucio/transfertool/bittorrent.py,sha256=2gPRmopyav8IXAtHcsC5oUcjZtmNQ8prUMKzFcCPUaE,8378
|
|
@@ -400,7 +400,7 @@ rucio/web/rest/flaskapi/v1/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Km
|
|
|
400
400
|
rucio/web/rest/flaskapi/v1/accountlimits.py,sha256=CMizBo0qC4-34wygu-KqFVULsDIB0tAbogSvf6cHcK4,8092
|
|
401
401
|
rucio/web/rest/flaskapi/v1/accounts.py,sha256=H-29xbY34cfSgUuUxi0fkFZZlA3KP0VEjTBBGr4mmQk,38174
|
|
402
402
|
rucio/web/rest/flaskapi/v1/archives.py,sha256=cizZNUcZrGFTiwwGO7I8bN-v2l2D7cgRLZSPB_VMA-E,3605
|
|
403
|
-
rucio/web/rest/flaskapi/v1/auth.py,sha256=
|
|
403
|
+
rucio/web/rest/flaskapi/v1/auth.py,sha256=Y14C6NZTnK2TkKfYrFNiaGGLcnoNT-jvmnI5qZISWX0,63922
|
|
404
404
|
rucio/web/rest/flaskapi/v1/common.py,sha256=VM3DszTS8F7x0gBmJhqSbbzkoUZSKPCrhxFlPmt3xDc,18708
|
|
405
405
|
rucio/web/rest/flaskapi/v1/config.py,sha256=YyiUMXeUFau5jnjv_wjyPhxjGnO1uiax9bMO2I-k0zQ,10191
|
|
406
406
|
rucio/web/rest/flaskapi/v1/credentials.py,sha256=wGRf3nH-jc_X0ZGJFobsZFSoGFfSWM8JWMNMeJ0xO6E,8147
|
|
@@ -412,7 +412,7 @@ rucio/web/rest/flaskapi/v1/identities.py,sha256=A9pkEUfeFdCx0Ux2uzCsH47XDygqH36w
|
|
|
412
412
|
rucio/web/rest/flaskapi/v1/import.py,sha256=YtMBJkwtwdZ75GFY-da8K2rQgZd4Y37bJo7IFmSOJ98,5293
|
|
413
413
|
rucio/web/rest/flaskapi/v1/lifetime_exceptions.py,sha256=j_PxdALWJ6semHyzezFgaN6B1gYzHyRJSOlvky0APf0,12123
|
|
414
414
|
rucio/web/rest/flaskapi/v1/locks.py,sha256=46DQnKxivraxHmAl3jV2aQVVSnaum1yUhR0BJrK7sQM,13123
|
|
415
|
-
rucio/web/rest/flaskapi/v1/main.py,sha256=
|
|
415
|
+
rucio/web/rest/flaskapi/v1/main.py,sha256=PIU3vZP_yYfnYALZOtBkX3uNZj6ylJB1Jm_m_Ag7XgI,3143
|
|
416
416
|
rucio/web/rest/flaskapi/v1/meta_conventions.py,sha256=f69e-aF7tDpM9oaxH8sX2NVWd9eJk6yhFAyCLj2acmM,7322
|
|
417
417
|
rucio/web/rest/flaskapi/v1/metrics.py,sha256=-tCHboUu_5hI87G_pZswhpY6koTwu6WudgW4RixOnIg,1250
|
|
418
418
|
rucio/web/rest/flaskapi/v1/nongrid_traces.py,sha256=yP2T0bT5SrXVVHNMElYPU2sCMQKaxI5Y-s-H_xvN-h0,3151
|
|
@@ -431,64 +431,64 @@ rucio/web/rest/flaskapi/v1/types.py,sha256=kY-nml_En9zwkKu9TEYwEZGaF2NJ09gN2IUY7
|
|
|
431
431
|
rucio/web/rest/flaskapi/v1/vos.py,sha256=qt0PKhXqXfJDFN0b15gvHYNArWFDRI1PDmlyP93D4WY,9178
|
|
432
432
|
rucio/web/rest/flaskapi/v1/templates/auth_crash.html,sha256=enhyVliQHlblgCEHvBzAlLxymFySlc42tk87vfWdBo0,2254
|
|
433
433
|
rucio/web/rest/flaskapi/v1/templates/auth_granted.html,sha256=SDsrTCQhwklLu3mDtSTUATnK16QG1T-eWDTDjmv8bn4,2139
|
|
434
|
-
rucio-38.0.
|
|
435
|
-
rucio-38.0.
|
|
436
|
-
rucio-38.0.
|
|
437
|
-
rucio-38.0.
|
|
438
|
-
rucio-38.0.
|
|
439
|
-
rucio-38.0.
|
|
440
|
-
rucio-38.0.
|
|
441
|
-
rucio-38.0.
|
|
442
|
-
rucio-38.0.
|
|
443
|
-
rucio-38.0.
|
|
444
|
-
rucio-38.0.
|
|
445
|
-
rucio-38.0.
|
|
446
|
-
rucio-38.0.
|
|
447
|
-
rucio-38.0.
|
|
448
|
-
rucio-38.0.
|
|
449
|
-
rucio-38.0.
|
|
450
|
-
rucio-38.0.
|
|
451
|
-
rucio-38.0.
|
|
452
|
-
rucio-38.0.
|
|
453
|
-
rucio-38.0.
|
|
454
|
-
rucio-38.0.
|
|
455
|
-
rucio-38.0.
|
|
456
|
-
rucio-38.0.
|
|
457
|
-
rucio-38.0.
|
|
458
|
-
rucio-38.0.
|
|
459
|
-
rucio-38.0.
|
|
460
|
-
rucio-38.0.
|
|
461
|
-
rucio-38.0.
|
|
462
|
-
rucio-38.0.
|
|
463
|
-
rucio-38.0.
|
|
464
|
-
rucio-38.0.
|
|
465
|
-
rucio-38.0.
|
|
466
|
-
rucio-38.0.
|
|
467
|
-
rucio-38.0.
|
|
468
|
-
rucio-38.0.
|
|
469
|
-
rucio-38.0.
|
|
470
|
-
rucio-38.0.
|
|
471
|
-
rucio-38.0.
|
|
472
|
-
rucio-38.0.
|
|
473
|
-
rucio-38.0.
|
|
474
|
-
rucio-38.0.
|
|
475
|
-
rucio-38.0.
|
|
476
|
-
rucio-38.0.
|
|
477
|
-
rucio-38.0.
|
|
478
|
-
rucio-38.0.
|
|
479
|
-
rucio-38.0.
|
|
480
|
-
rucio-38.0.
|
|
481
|
-
rucio-38.0.
|
|
482
|
-
rucio-38.0.
|
|
483
|
-
rucio-38.0.
|
|
484
|
-
rucio-38.0.
|
|
485
|
-
rucio-38.0.
|
|
486
|
-
rucio-38.0.
|
|
487
|
-
rucio-38.0.
|
|
488
|
-
rucio-38.0.
|
|
489
|
-
rucio-38.0.
|
|
490
|
-
rucio-38.0.
|
|
491
|
-
rucio-38.0.
|
|
492
|
-
rucio-38.0.
|
|
493
|
-
rucio-38.0.
|
|
494
|
-
rucio-38.0.
|
|
434
|
+
rucio-38.1.0.data/data/rucio/requirements.server.txt,sha256=0tq4Oa50x-KzrCU5s2P8074foEcGzSNxaSsrQr_os8k,6011
|
|
435
|
+
rucio-38.1.0.data/data/rucio/etc/alembic.ini.template,sha256=4eZJWGyy_-lzZoIhQNRDVGqkALTe0i7Em4wkI4ocVvw,1781
|
|
436
|
+
rucio-38.1.0.data/data/rucio/etc/alembic_offline.ini.template,sha256=NLswPNzUFLVm2l4V4gzWcUpbLNLMnYFRttyVIGXsDaM,1939
|
|
437
|
+
rucio-38.1.0.data/data/rucio/etc/globus-config.yml.template,sha256=ADOplXW10bO5KZVYRavwKgNaDR0VmdJ3gVbINeqoSIA,96
|
|
438
|
+
rucio-38.1.0.data/data/rucio/etc/ldap.cfg.template,sha256=2n-Exv81toCDZ6OzuNfMa71OoiLTdCSjWhkzCfSN3eM,806
|
|
439
|
+
rucio-38.1.0.data/data/rucio/etc/rse-accounts.cfg.template,sha256=IfDnXVxBPUrMnTMbJnd3P7eYHgY1C4Kfz7xKskJs-FI,543
|
|
440
|
+
rucio-38.1.0.data/data/rucio/etc/rucio.cfg.atlas.client.template,sha256=aHP1oX9m5yA8xVTTT2Hz6AyOYu92-Bcd5LF0i3AZRQw,1350
|
|
441
|
+
rucio-38.1.0.data/data/rucio/etc/rucio.cfg.template,sha256=hKnGDIm7oIFWBhj6vr5L6bE4TDRHT-7eZh9IsqOHbpo,8023
|
|
442
|
+
rucio-38.1.0.data/data/rucio/etc/rucio_multi_vo.cfg.template,sha256=OOl_XA1lx0h9RUu9ogdjPySzUEbABGPYNiAIRM0LPcQ,6946
|
|
443
|
+
rucio-38.1.0.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl,sha256=MTrB-IQEFE6TJnkwXjLxlUIc4afHmmrdQDC1S5og_dM,1210
|
|
444
|
+
rucio-38.1.0.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl,sha256=HxYNm7EKG9cMNkwUNPgZUC7o0Q9-DTINh1JtGtHOYUg,105
|
|
445
|
+
rucio-38.1.0.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl,sha256=R4rssZ2hE8wcYPmAyc-UDpO5SPhMLZGNuYz6pvLjPVc,499
|
|
446
|
+
rucio-38.1.0.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl,sha256=feXJ3pZynlESBuPoe_y8amB84UQnLaP6SHtRk3cn7ZA,120
|
|
447
|
+
rucio-38.1.0.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl,sha256=O054th_sVqZTFUeC3Gg_Qe8CrXQb-bxJhMaO48VMzzU,493
|
|
448
|
+
rucio-38.1.0.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl,sha256=EiT0KucfIKYnIN5XO9XawzZAJSVRYlza5sn8VloyBy4,546
|
|
449
|
+
rucio-38.1.0.data/data/rucio/tools/bootstrap.py,sha256=iI0Ue2mrRJdjFITm93DLHUBxDb_yfEoMUDpgO5Bqkhw,1259
|
|
450
|
+
rucio-38.1.0.data/data/rucio/tools/merge_rucio_configs.py,sha256=u62K1EcCGydM5nZA30zhlqWo4EX5N87b_MDkx5YfzVI,6163
|
|
451
|
+
rucio-38.1.0.data/data/rucio/tools/reset_database.py,sha256=ZDXVWhIck_QeIi6F7X2qlPK9kgaCo1DsG4lOj3HA8fo,3449
|
|
452
|
+
rucio-38.1.0.data/scripts/rucio,sha256=f8f5X6O9W2JfUqWiSdsuDROekGt28p9CBvFZropZ-C0,5260
|
|
453
|
+
rucio-38.1.0.data/scripts/rucio-abacus-account,sha256=rT7tgYxl5TMhPlg8gCvUA8NSxbgHdjilV8NJ_QMC5GA,2886
|
|
454
|
+
rucio-38.1.0.data/scripts/rucio-abacus-collection-replica,sha256=HD2acGu8xBDAsKGCA7oLQvcY5SdT1mIQhSrREDV2n_M,1809
|
|
455
|
+
rucio-38.1.0.data/scripts/rucio-abacus-rse,sha256=DoRsYnMzzkH7z6YvWjl40mIgXmq_3-osTPdDAqPjHgA,2633
|
|
456
|
+
rucio-38.1.0.data/scripts/rucio-admin,sha256=AhPO6-fAPviHObhB_Yi7GJXKfjpaH6m0RqxwctBeFlE,4229
|
|
457
|
+
rucio-38.1.0.data/scripts/rucio-atropos,sha256=o6KsmbjxbFgtKWl7gZbmBxBc3gYWax6FkkyfhUDmKbY,3171
|
|
458
|
+
rucio-38.1.0.data/scripts/rucio-auditor,sha256=4ktnrxKXkJTyMKysPc-AE7dDGbsa1e_o8bRDRkiJpT4,6124
|
|
459
|
+
rucio-38.1.0.data/scripts/rucio-automatix,sha256=Lgud3OXVqUcBrPMtTAgSgPE5ZWSr74FBfBh0EoA9-E8,1996
|
|
460
|
+
rucio-38.1.0.data/scripts/rucio-bb8,sha256=TD8P3cMiDB_knZKZcGTQsy8aA7nPQXMC1TNPCyXrsSg,3089
|
|
461
|
+
rucio-38.1.0.data/scripts/rucio-cache-client,sha256=71-xm4MyxEDBlwnlviHsOgF0tx5EbADsPoVpj_DJDkA,5276
|
|
462
|
+
rucio-38.1.0.data/scripts/rucio-cache-consumer,sha256=5mCXRQWwAww3aabTMQh-U9HgHFkCJf3VpTHdk9R-rsU,1348
|
|
463
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-finisher,sha256=mAexgdlj41UOwIQDZ5POU8gTRMuKzaOqhEww6cRV2rI,2333
|
|
464
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-poller,sha256=z2C17x3n_eKdDrL1w1ePJpslkbOw2UMTh5BaOw-__Es,2825
|
|
465
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-preparer,sha256=jlaBQbN8f081ekInQxn3QcNvrQQqedmdjQ6PeEp9JeU,1746
|
|
466
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-receiver,sha256=Tgg6oXQp1G31ZK_7OKh6fLvcO3GdGi55b7xho2I9B74,1669
|
|
467
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-stager,sha256=AaFzBHTahrv5--H16lbpUlXc64hijLL_myakuJ0V-oI,3371
|
|
468
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-submitter,sha256=IMENh4rK8w6KbjZaOD8UJEv5BHdiFDjhfsHmZZK-T80,6738
|
|
469
|
+
rucio-38.1.0.data/scripts/rucio-conveyor-throttler,sha256=5YIuyXE_ezko31YMuQkz-w1oGGYluoL3FP7o50KtoTI,3914
|
|
470
|
+
rucio-38.1.0.data/scripts/rucio-dark-reaper,sha256=GmQAUNmmJKJjeuY7jbQIHvrbdQWRJSlqojMF_6h8j2Y,2532
|
|
471
|
+
rucio-38.1.0.data/scripts/rucio-dumper,sha256=zGfdsamPIUxbnDFDPM6FtqR1d3FH1AdC0gtH1JeLaxU,6729
|
|
472
|
+
rucio-38.1.0.data/scripts/rucio-follower,sha256=GgZPcVlIejOX91VcgbUh7DThYTu3lDe8c1AuCIk85vM,1400
|
|
473
|
+
rucio-38.1.0.data/scripts/rucio-hermes,sha256=i238hHzuv9JNUUPHNcOjnFQSs6BpPmz88t8ZFgS2GxI,1973
|
|
474
|
+
rucio-38.1.0.data/scripts/rucio-judge-cleaner,sha256=iOucH4sil-tu5nibFOSKK3BQUhkXvzAx4E5QGbQGGCs,4726
|
|
475
|
+
rucio-38.1.0.data/scripts/rucio-judge-evaluator,sha256=JrWN2ZatnUig5iWM7Ku4nEspXBjaucOrc8Ic55_OCzc,7458
|
|
476
|
+
rucio-38.1.0.data/scripts/rucio-judge-injector,sha256=d6na_n4H7njpUmJQg2Gc4KlbgK0_xuW5vw3waLReLTQ,1657
|
|
477
|
+
rucio-38.1.0.data/scripts/rucio-judge-repairer,sha256=QHeBySAn1bYS17z5dTfq8o81uEUpqhGVUqe6KWZBVmQ,1661
|
|
478
|
+
rucio-38.1.0.data/scripts/rucio-kronos,sha256=WQQ0izYfdVvmfaaRkqSf4mejL-U86OL5mD5v1t2p6Eg,1770
|
|
479
|
+
rucio-38.1.0.data/scripts/rucio-minos,sha256=-utVl82-xd7zxp4yy1udqCm_MehRP7pU5WDdJ7EFuac,2246
|
|
480
|
+
rucio-38.1.0.data/scripts/rucio-minos-temporary-expiration,sha256=E9G_h__cJNWuEcFDoeBFjzCHqp1swW-ff67M2WpZ3eg,1983
|
|
481
|
+
rucio-38.1.0.data/scripts/rucio-necromancer,sha256=3qGsbLJqoEVyuKYLgpCRoxRexPf-_1ufR_wJYMby9gc,5681
|
|
482
|
+
rucio-38.1.0.data/scripts/rucio-oauth-manager,sha256=qqFyI_L-bHg4R6a3OSgL_RsmosuODykX7HM-u0Mr-nY,2776
|
|
483
|
+
rucio-38.1.0.data/scripts/rucio-reaper,sha256=c0aMDs0N0ubKcl5T5aHunqaBcmIIj6WmERReKTS9di4,3773
|
|
484
|
+
rucio-38.1.0.data/scripts/rucio-replica-recoverer,sha256=vE_8iW0wooL3rSejMtX5SDKZ8jVit1QC86XesGwwsIU,19446
|
|
485
|
+
rucio-38.1.0.data/scripts/rucio-rse-decommissioner,sha256=zXXTq1lPzoI5R012fGWrxXi9VcHZNIfB85EefwQN1kw,2337
|
|
486
|
+
rucio-38.1.0.data/scripts/rucio-storage-consistency-actions,sha256=Mb4GUO1kP7HdiCORhHkYfmfZIhJKp88RBr8TEC19HXo,3906
|
|
487
|
+
rucio-38.1.0.data/scripts/rucio-transmogrifier,sha256=i17F1FTrxharmCWVZpylXSH2Xow2KaxkTr2jzDFn8Rc,3350
|
|
488
|
+
rucio-38.1.0.data/scripts/rucio-undertaker,sha256=JYwGBZC_wdwOPHJKXj_VLipd7G838Eo__43JFNtBors,2775
|
|
489
|
+
rucio-38.1.0.dist-info/licenses/AUTHORS.rst,sha256=FQ5q2_bY3dYKDmEw-8YD-SgPJ4fgnM1XI5wRF5ksQPg,4771
|
|
490
|
+
rucio-38.1.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
491
|
+
rucio-38.1.0.dist-info/METADATA,sha256=X7cmK7HmJn5iFDwETAJB_1KiGD5FoSDjlMGWuQsCF8o,3300
|
|
492
|
+
rucio-38.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
493
|
+
rucio-38.1.0.dist-info/top_level.txt,sha256=lJM8plwW0ePPICkwFnpYzfdqHnSv6JZr1OD4JEysPgM,6
|
|
494
|
+
rucio-38.1.0.dist-info/RECORD,,
|
|
@@ -69,6 +69,7 @@ Individual contributors to the source code
|
|
|
69
69
|
- Maximilian Linhoff, <maximilian.linhoff@tu-dortmund.de>, 2024
|
|
70
70
|
- Eric Banzuzi, <eric.banzuzi@gmail.com>, 2024
|
|
71
71
|
- Paul Millar, <paul.millar@desy.de>, 2025
|
|
72
|
+
- Vimalan S <vimalan.github@gmail.com>, 2025
|
|
72
73
|
|
|
73
74
|
Organisations employing contributors
|
|
74
75
|
------------------------------------
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl
RENAMED
|
File without changes
|
{rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl
RENAMED
|
File without changes
|
{rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl
RENAMED
|
File without changes
|
{rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl
RENAMED
|
File without changes
|
{rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl
RENAMED
|
File without changes
|
{rucio-38.0.0rc2.data → rucio-38.1.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|