rucio 37.5.0__py3-none-any.whl → 37.6.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/bin_legacy/rucio.py +1 -1
- rucio/cli/bin_legacy/rucio_admin.py +1 -1
- rucio/cli/did.py +2 -2
- rucio/cli/rse.py +2 -3
- rucio/cli/subscription.py +1 -1
- rucio/client/baseclient.py +5 -1
- rucio/client/didclient.py +16 -16
- rucio/client/downloadclient.py +14 -14
- rucio/client/lockclient.py +3 -3
- rucio/client/replicaclient.py +2 -2
- rucio/client/touchclient.py +1 -1
- rucio/client/uploadclient.py +725 -181
- rucio/common/config.py +1 -2
- rucio/common/constants.py +2 -0
- rucio/common/didtype.py +2 -2
- rucio/common/dumper/__init__.py +1 -1
- rucio/common/pcache.py +20 -25
- rucio/common/plugins.py +10 -17
- rucio/common/schema/__init__.py +7 -5
- rucio/common/utils.py +1 -1
- rucio/core/authentication.py +1 -1
- rucio/core/credential.py +1 -1
- rucio/core/did.py +54 -54
- rucio/core/did_meta_plugins/__init__.py +10 -10
- rucio/core/did_meta_plugins/did_column_meta.py +9 -9
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +3 -3
- rucio/core/did_meta_plugins/elasticsearch_meta.py +7 -7
- rucio/core/did_meta_plugins/json_meta.py +2 -2
- rucio/core/did_meta_plugins/mongo_meta.py +9 -9
- rucio/core/did_meta_plugins/postgres_meta.py +7 -7
- rucio/core/dirac.py +1 -1
- rucio/core/lifetime_exception.py +2 -2
- rucio/core/lock.py +7 -7
- rucio/core/meta_conventions.py +2 -2
- rucio/core/monitor.py +1 -1
- rucio/core/naming_convention.py +1 -1
- rucio/core/nongrid_trace.py +2 -2
- rucio/core/oidc.py +2 -2
- rucio/core/permission/__init__.py +7 -5
- rucio/core/permission/generic.py +2 -2
- rucio/core/permission/generic_multi_vo.py +2 -2
- rucio/core/replica.py +17 -17
- rucio/core/rule.py +30 -30
- rucio/core/rule_grouping.py +2 -3
- rucio/core/scope.py +1 -1
- rucio/core/trace.py +2 -2
- rucio/daemons/auditor/__init__.py +1 -1
- rucio/daemons/badreplicas/minos.py +9 -3
- rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -2
- rucio/daemons/badreplicas/necromancer.py +9 -3
- rucio/daemons/bb8/common.py +1 -1
- rucio/daemons/bb8/nuclei_background_rebalance.py +1 -1
- rucio/daemons/bb8/t2_background_rebalance.py +1 -1
- rucio/daemons/cache/consumer.py +1 -1
- rucio/daemons/conveyor/finisher.py +13 -4
- rucio/daemons/conveyor/poller.py +5 -2
- rucio/daemons/conveyor/receiver.py +1 -1
- rucio/daemons/follower/follower.py +1 -1
- rucio/daemons/hermes/hermes.py +2 -2
- rucio/daemons/judge/cleaner.py +2 -2
- rucio/daemons/judge/evaluator.py +7 -7
- rucio/daemons/judge/injector.py +2 -2
- rucio/daemons/judge/repairer.py +2 -2
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +1 -1
- rucio/daemons/storage/consistency/actions.py +3 -3
- rucio/daemons/transmogrifier/transmogrifier.py +1 -1
- rucio/daemons/undertaker/undertaker.py +6 -6
- rucio/db/sqla/constants.py +4 -3
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -1
- rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +1 -1
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +1 -1
- rucio/db/sqla/models.py +1 -1
- rucio/db/sqla/session.py +7 -7
- rucio/gateway/account.py +65 -90
- rucio/gateway/did.py +26 -26
- rucio/gateway/dirac.py +1 -1
- rucio/gateway/lifetime_exception.py +1 -1
- rucio/gateway/replica.py +2 -2
- rucio/rse/protocols/ngarc.py +2 -2
- rucio/rse/protocols/srm.py +1 -1
- rucio/rse/protocols/webdav.py +8 -1
- rucio/tests/common.py +4 -4
- rucio/vcsversion.py +3 -3
- rucio/web/rest/flaskapi/v1/accounts.py +20 -20
- rucio/web/rest/flaskapi/v1/archives.py +2 -2
- rucio/web/rest/flaskapi/v1/common.py +1 -1
- rucio/web/rest/flaskapi/v1/dids.py +188 -188
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +5 -5
- rucio/web/rest/flaskapi/v1/locks.py +13 -13
- rucio/web/rest/flaskapi/v1/main.py +1 -0
- rucio/web/rest/flaskapi/v1/redirect.py +2 -2
- rucio/web/rest/flaskapi/v1/replicas.py +16 -16
- rucio/web/rest/flaskapi/v1/requests.py +16 -16
- rucio/web/rest/flaskapi/v1/subscriptions.py +7 -7
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-account +8 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-rse +8 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-auditor +1 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-throttler +7 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-follower +1 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-cleaner +9 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-necromancer +7 -1
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-replica-recoverer +31 -9
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-undertaker +8 -2
- {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/METADATA +1 -1
- {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/RECORD +155 -155
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/ldap.cfg.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/requirements.server.txt +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/tools/bootstrap.py +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/tools/reset_database.py +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-collection-replica +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-admin +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-atropos +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-automatix +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-bb8 +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-cache-client +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-cache-consumer +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-finisher +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-poller +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-preparer +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-receiver +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-stager +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-submitter +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-dark-reaper +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-dumper +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-hermes +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-evaluator +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-injector +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-repairer +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-kronos +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-minos +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-minos-temporary-expiration +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-oauth-manager +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-reaper +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-rse-decommissioner +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-storage-consistency-actions +0 -0
- {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-transmogrifier +0 -0
- {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/WHEEL +0 -0
- {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/licenses/AUTHORS.rst +0 -0
- {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/licenses/LICENSE +0 -0
- {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/top_level.txt +0 -0
|
@@ -56,7 +56,7 @@ class LifetimeException(ErrorHandlingMethodView):
|
|
|
56
56
|
description: "The name of the lifetime exception."
|
|
57
57
|
type: string
|
|
58
58
|
did_type:
|
|
59
|
-
description: "The type of the
|
|
59
|
+
description: "The type of the DID."
|
|
60
60
|
type: string
|
|
61
61
|
enum: ['F', 'D', 'C', 'A', 'X', 'Y', 'Z']
|
|
62
62
|
account:
|
|
@@ -108,14 +108,14 @@ class LifetimeException(ErrorHandlingMethodView):
|
|
|
108
108
|
type: object
|
|
109
109
|
properties:
|
|
110
110
|
dids:
|
|
111
|
-
description: "List of
|
|
111
|
+
description: "List of DIDs associated with the lifetime exception."
|
|
112
112
|
type: array
|
|
113
113
|
items:
|
|
114
|
-
description: "A
|
|
114
|
+
description: "A DID"
|
|
115
115
|
type: object
|
|
116
116
|
properties:
|
|
117
117
|
name:
|
|
118
|
-
description: "The name of the
|
|
118
|
+
description: "The name of the DID."
|
|
119
119
|
type: string
|
|
120
120
|
pattern:
|
|
121
121
|
description: "The pattern of the lifetime exception."
|
|
@@ -201,7 +201,7 @@ class LifetimeExceptionId(ErrorHandlingMethodView):
|
|
|
201
201
|
description: "The name of the lifetime exception."
|
|
202
202
|
type: string
|
|
203
203
|
did_type:
|
|
204
|
-
description: "The type of the
|
|
204
|
+
description: "The type of the DID."
|
|
205
205
|
type: string
|
|
206
206
|
enum: ['F', 'D', 'C', 'A', 'X', 'Y', 'Z']
|
|
207
207
|
account:
|
|
@@ -46,7 +46,7 @@ class LockByRSE(ErrorHandlingMethodView):
|
|
|
46
46
|
type: object
|
|
47
47
|
properties:
|
|
48
48
|
did_type:
|
|
49
|
-
description: "The
|
|
49
|
+
description: "The DID type to filter for."
|
|
50
50
|
type: string
|
|
51
51
|
enum: ['dataset']
|
|
52
52
|
responses:
|
|
@@ -95,7 +95,7 @@ class LockByRSE(ErrorHandlingMethodView):
|
|
|
95
95
|
401:
|
|
96
96
|
description: "Invalid Auth Token"
|
|
97
97
|
500:
|
|
98
|
-
description: "Wrong
|
|
98
|
+
description: "Wrong DID type"
|
|
99
99
|
content:
|
|
100
100
|
application/json:
|
|
101
101
|
schema:
|
|
@@ -143,7 +143,7 @@ class LocksByScopeName(ErrorHandlingMethodView):
|
|
|
143
143
|
type: object
|
|
144
144
|
properties:
|
|
145
145
|
did_type:
|
|
146
|
-
description: "The
|
|
146
|
+
description: "The DID type to filter for."
|
|
147
147
|
type: string
|
|
148
148
|
enum: ['dataset']
|
|
149
149
|
responses:
|
|
@@ -192,7 +192,7 @@ class LocksByScopeName(ErrorHandlingMethodView):
|
|
|
192
192
|
401:
|
|
193
193
|
description: "Invalid Auth Token"
|
|
194
194
|
500:
|
|
195
|
-
description: "Wrong
|
|
195
|
+
description: "Wrong DID type"
|
|
196
196
|
content:
|
|
197
197
|
application/json:
|
|
198
198
|
schema:
|
|
@@ -229,8 +229,8 @@ class DatasetLocksForDids(ErrorHandlingMethodView):
|
|
|
229
229
|
:status 400: Wrong DID type.
|
|
230
230
|
:returns: Line separated list of dictionary with lock information.
|
|
231
231
|
---
|
|
232
|
-
summary: Get locks by
|
|
233
|
-
description: "Get all dataset locks for the associated
|
|
232
|
+
summary: Get locks by DIDs
|
|
233
|
+
description: "Get all dataset locks for the associated DIDs."
|
|
234
234
|
tags:
|
|
235
235
|
- Lock
|
|
236
236
|
requestBody:
|
|
@@ -240,23 +240,23 @@ class DatasetLocksForDids(ErrorHandlingMethodView):
|
|
|
240
240
|
type: object
|
|
241
241
|
properties:
|
|
242
242
|
dids:
|
|
243
|
-
description: "The
|
|
243
|
+
description: "The DIDs associated with the locks."
|
|
244
244
|
type: array
|
|
245
245
|
items:
|
|
246
246
|
type: object
|
|
247
|
-
description: "A
|
|
247
|
+
description: "A DID"
|
|
248
248
|
required:
|
|
249
249
|
- scope
|
|
250
250
|
- name
|
|
251
251
|
properties:
|
|
252
252
|
scope:
|
|
253
|
-
description: "The scope of the
|
|
253
|
+
description: "The scope of the DID."
|
|
254
254
|
type: string
|
|
255
255
|
name:
|
|
256
|
-
description: "The name of the
|
|
256
|
+
description: "The name of the DID."
|
|
257
257
|
type: string
|
|
258
258
|
type:
|
|
259
|
-
description: "The type of the
|
|
259
|
+
description: "The type of the DID."
|
|
260
260
|
type: string
|
|
261
261
|
enum: ['dataset', 'container']
|
|
262
262
|
responses:
|
|
@@ -305,12 +305,12 @@ class DatasetLocksForDids(ErrorHandlingMethodView):
|
|
|
305
305
|
401:
|
|
306
306
|
description: "Invalid Auth Token"
|
|
307
307
|
400:
|
|
308
|
-
description: "Wrong
|
|
308
|
+
description: "Wrong DID type"
|
|
309
309
|
content:
|
|
310
310
|
application/json:
|
|
311
311
|
schema:
|
|
312
312
|
type: string
|
|
313
|
-
enum: ['
|
|
313
|
+
enum: ['Cannot find the list of DIDs in the data. Use "dids" keyword.']
|
|
314
314
|
406:
|
|
315
315
|
description: "Not acceptable"
|
|
316
316
|
|
|
@@ -75,6 +75,7 @@ def apply_endpoints(app: Flask, modules: "Iterable[str]") -> None:
|
|
|
75
75
|
else:
|
|
76
76
|
raise ConfigurationError(f'"{blueprint_module}" from the endpoints configuration value did not have a blueprint')
|
|
77
77
|
|
|
78
|
+
|
|
78
79
|
endpoints = set(config_get_list('api', 'endpoints', raise_exception=False, default=[]))
|
|
79
80
|
endpoints_add = set(config_get_list('api', 'endpoints_add', raise_exception=False, default=[]))
|
|
80
81
|
endpoints_remove = set(config_get_list('api', 'endpoints_remove', raise_exception=False, default=[]))
|
|
@@ -103,7 +103,7 @@ class MetaLinkRedirector(ErrorHandlingMethodView):
|
|
|
103
103
|
401:
|
|
104
104
|
description: "Invalid Auth Token"
|
|
105
105
|
404:
|
|
106
|
-
description: "Rse or
|
|
106
|
+
description: "Rse or DID not found"
|
|
107
107
|
406:
|
|
108
108
|
description: "Not acceptable"
|
|
109
109
|
"""
|
|
@@ -263,7 +263,7 @@ class HeaderRedirector(ErrorHandlingMethodView):
|
|
|
263
263
|
401:
|
|
264
264
|
description: "Invalid Auth Token"
|
|
265
265
|
404:
|
|
266
|
-
description: "Rse or
|
|
266
|
+
description: "Rse or DID not found"
|
|
267
267
|
"""
|
|
268
268
|
headers = self.get_headers()
|
|
269
269
|
|
|
@@ -221,7 +221,7 @@ class Replicas(ErrorHandlingMethodView):
|
|
|
221
221
|
401:
|
|
222
222
|
description: "Invalid Auth Token"
|
|
223
223
|
404:
|
|
224
|
-
description: "
|
|
224
|
+
description: "DID not found"
|
|
225
225
|
406:
|
|
226
226
|
description: "Not acceptable"
|
|
227
227
|
"""
|
|
@@ -347,7 +347,7 @@ class Replicas(ErrorHandlingMethodView):
|
|
|
347
347
|
404:
|
|
348
348
|
description: "Rse or scope not found"
|
|
349
349
|
409:
|
|
350
|
-
description: "Replica or
|
|
350
|
+
description: "Replica or DID already exists"
|
|
351
351
|
503:
|
|
352
352
|
description: "Resource temporary unavailable"
|
|
353
353
|
"""
|
|
@@ -541,16 +541,16 @@ class ListReplicas(ErrorHandlingMethodView):
|
|
|
541
541
|
description: "The client's location."
|
|
542
542
|
type: string
|
|
543
543
|
dids:
|
|
544
|
-
description: "List of
|
|
544
|
+
description: "List of DIDs."
|
|
545
545
|
type: array
|
|
546
546
|
items:
|
|
547
547
|
type: object
|
|
548
548
|
properties:
|
|
549
549
|
scope:
|
|
550
|
-
description: "The scope of the
|
|
550
|
+
description: "The scope of the DID."
|
|
551
551
|
type: string
|
|
552
552
|
name:
|
|
553
|
-
description: "The name of the
|
|
553
|
+
description: "The name of the DID."
|
|
554
554
|
type: string
|
|
555
555
|
schemes:
|
|
556
556
|
description: "A list of schemes to filter the replicas."
|
|
@@ -652,7 +652,7 @@ class ListReplicas(ErrorHandlingMethodView):
|
|
|
652
652
|
401:
|
|
653
653
|
description: "Invalid Auth Token"
|
|
654
654
|
404:
|
|
655
|
-
description: "
|
|
655
|
+
description: "DID not found."
|
|
656
656
|
406:
|
|
657
657
|
description: "Not acceptable"
|
|
658
658
|
"""
|
|
@@ -764,7 +764,7 @@ class ReplicasDIDs(ErrorHandlingMethodView):
|
|
|
764
764
|
def post(self):
|
|
765
765
|
"""
|
|
766
766
|
---
|
|
767
|
-
summary: List Replicas
|
|
767
|
+
summary: List Replicas DIDs
|
|
768
768
|
description: "List the DIDs associated to a list of replicas."
|
|
769
769
|
tags:
|
|
770
770
|
- Replicas
|
|
@@ -795,7 +795,7 @@ class ReplicasDIDs(ErrorHandlingMethodView):
|
|
|
795
795
|
type: object
|
|
796
796
|
additionalProperties:
|
|
797
797
|
x-additionalPropertiesName: mapped PFNs to DIDs
|
|
798
|
-
description: "A mapping from a pfn to a
|
|
798
|
+
description: "A mapping from a pfn to a DID."
|
|
799
799
|
type: object
|
|
800
800
|
properties:
|
|
801
801
|
scope:
|
|
@@ -1391,7 +1391,7 @@ class DatasetReplicasBulk(ErrorHandlingMethodView):
|
|
|
1391
1391
|
"""
|
|
1392
1392
|
---
|
|
1393
1393
|
summary: List Dataset Replicas for Multiple DIDs
|
|
1394
|
-
description: "List dataset replicas for multiple
|
|
1394
|
+
description: "List dataset replicas for multiple DIDs."
|
|
1395
1395
|
tags:
|
|
1396
1396
|
- Replicas
|
|
1397
1397
|
requestBody:
|
|
@@ -1403,17 +1403,17 @@ class DatasetReplicasBulk(ErrorHandlingMethodView):
|
|
|
1403
1403
|
- dids
|
|
1404
1404
|
properties:
|
|
1405
1405
|
dids:
|
|
1406
|
-
description: "A list of
|
|
1406
|
+
description: "A list of DIDs."
|
|
1407
1407
|
type: array
|
|
1408
1408
|
items:
|
|
1409
|
-
description: "A
|
|
1409
|
+
description: "A DID."
|
|
1410
1410
|
type: object
|
|
1411
1411
|
properties:
|
|
1412
1412
|
scope:
|
|
1413
|
-
description: "The scope of the
|
|
1413
|
+
description: "The scope of the DID."
|
|
1414
1414
|
type: string
|
|
1415
1415
|
name:
|
|
1416
|
-
description: "The name of the
|
|
1416
|
+
description: "The name of the DID."
|
|
1417
1417
|
type: string
|
|
1418
1418
|
responses:
|
|
1419
1419
|
200:
|
|
@@ -1634,16 +1634,16 @@ class BadDIDs(ErrorHandlingMethodView):
|
|
|
1634
1634
|
type: string
|
|
1635
1635
|
format: date-time
|
|
1636
1636
|
dids:
|
|
1637
|
-
description: "The list of
|
|
1637
|
+
description: "The list of DIDs associated with the bad replicas."
|
|
1638
1638
|
type: array
|
|
1639
1639
|
items:
|
|
1640
1640
|
type: object
|
|
1641
1641
|
properties:
|
|
1642
1642
|
scope:
|
|
1643
|
-
description: "The scope of the
|
|
1643
|
+
description: "The scope of the DID."
|
|
1644
1644
|
type: string
|
|
1645
1645
|
name:
|
|
1646
|
-
description: "The name of the
|
|
1646
|
+
description: "The name of the DID."
|
|
1647
1647
|
type: string
|
|
1648
1648
|
rse:
|
|
1649
1649
|
description: "The name of the rse."
|
|
@@ -78,7 +78,7 @@ class RequestGet(ErrorHandlingMethodView):
|
|
|
78
78
|
description: "The name of the transfer."
|
|
79
79
|
type: string
|
|
80
80
|
did_type:
|
|
81
|
-
description: "The
|
|
81
|
+
description: "The DID type."
|
|
82
82
|
type: string
|
|
83
83
|
dest_rse_id:
|
|
84
84
|
description: "The destination RSE id."
|
|
@@ -115,13 +115,13 @@ class RequestGet(ErrorHandlingMethodView):
|
|
|
115
115
|
description: "The activity of the request."
|
|
116
116
|
type: string
|
|
117
117
|
bytes:
|
|
118
|
-
description: "The size of the
|
|
118
|
+
description: "The size of the DID in bytes."
|
|
119
119
|
type: integer
|
|
120
120
|
md5:
|
|
121
|
-
description: "The md5 checksum of the
|
|
121
|
+
description: "The md5 checksum of the DID to transfer."
|
|
122
122
|
type: string
|
|
123
123
|
adler32:
|
|
124
|
-
description: "The adler32 checksum of the
|
|
124
|
+
description: "The adler32 checksum of the DID to transfer."
|
|
125
125
|
type: string
|
|
126
126
|
dest_url:
|
|
127
127
|
description: "The destination url."
|
|
@@ -243,7 +243,7 @@ class RequestHistoryGet(ErrorHandlingMethodView):
|
|
|
243
243
|
description: "The name of the transfer."
|
|
244
244
|
type: string
|
|
245
245
|
did_type:
|
|
246
|
-
description: "The
|
|
246
|
+
description: "The DID type."
|
|
247
247
|
type: string
|
|
248
248
|
dest_rse_id:
|
|
249
249
|
description: "The destination RSE id."
|
|
@@ -280,13 +280,13 @@ class RequestHistoryGet(ErrorHandlingMethodView):
|
|
|
280
280
|
description: "The activity of the request."
|
|
281
281
|
type: string
|
|
282
282
|
bytes:
|
|
283
|
-
description: "The size of the
|
|
283
|
+
description: "The size of the DID in bytes."
|
|
284
284
|
type: integer
|
|
285
285
|
md5:
|
|
286
|
-
description: "The md5 checksum of the
|
|
286
|
+
description: "The md5 checksum of the DID to transfer."
|
|
287
287
|
type: string
|
|
288
288
|
adler32:
|
|
289
|
-
description: "The adler32 checksum of the
|
|
289
|
+
description: "The adler32 checksum of the DID to transfer."
|
|
290
290
|
type: string
|
|
291
291
|
dest_url:
|
|
292
292
|
description: "The destination url."
|
|
@@ -440,7 +440,7 @@ class RequestList(ErrorHandlingMethodView):
|
|
|
440
440
|
description: "The name of the transfer."
|
|
441
441
|
type: string
|
|
442
442
|
did_type:
|
|
443
|
-
description: "The
|
|
443
|
+
description: "The DID type."
|
|
444
444
|
type: string
|
|
445
445
|
dest_rse_id:
|
|
446
446
|
description: "The destination RSE id."
|
|
@@ -477,13 +477,13 @@ class RequestList(ErrorHandlingMethodView):
|
|
|
477
477
|
description: "The activity of the request."
|
|
478
478
|
type: string
|
|
479
479
|
bytes:
|
|
480
|
-
description: "The size of the
|
|
480
|
+
description: "The size of the DID in bytes."
|
|
481
481
|
type: integer
|
|
482
482
|
md5:
|
|
483
|
-
description: "The md5 checksum of the
|
|
483
|
+
description: "The md5 checksum of the DID to transfer."
|
|
484
484
|
type: string
|
|
485
485
|
adler32:
|
|
486
|
-
description: "The adler32 checksum of the
|
|
486
|
+
description: "The adler32 checksum of the DID to transfer."
|
|
487
487
|
type: string
|
|
488
488
|
dest_url:
|
|
489
489
|
description: "The destination url."
|
|
@@ -679,7 +679,7 @@ class RequestHistoryList(ErrorHandlingMethodView):
|
|
|
679
679
|
description: "The name of the transfer."
|
|
680
680
|
type: string
|
|
681
681
|
did_type:
|
|
682
|
-
description: "The
|
|
682
|
+
description: "The DID type."
|
|
683
683
|
type: string
|
|
684
684
|
dest_rse_id:
|
|
685
685
|
description: "The destination RSE id."
|
|
@@ -716,13 +716,13 @@ class RequestHistoryList(ErrorHandlingMethodView):
|
|
|
716
716
|
description: "The activity of the request."
|
|
717
717
|
type: string
|
|
718
718
|
bytes:
|
|
719
|
-
description: "The size of the
|
|
719
|
+
description: "The size of the DID in bytes."
|
|
720
720
|
type: integer
|
|
721
721
|
md5:
|
|
722
|
-
description: "The md5 checksum of the
|
|
722
|
+
description: "The md5 checksum of the DID to transfer."
|
|
723
723
|
type: string
|
|
724
724
|
adler32:
|
|
725
|
-
description: "The adler32 checksum of the
|
|
725
|
+
description: "The adler32 checksum of the DID to transfer."
|
|
726
726
|
type: string
|
|
727
727
|
dest_url:
|
|
728
728
|
description: "The destination url."
|
|
@@ -34,7 +34,7 @@ class Subscription(ErrorHandlingMethodView):
|
|
|
34
34
|
summary: Get Subscription
|
|
35
35
|
description: "Retrieve a subscription."
|
|
36
36
|
tags:
|
|
37
|
-
-
|
|
37
|
+
- Subscription
|
|
38
38
|
parameters:
|
|
39
39
|
- name: account
|
|
40
40
|
in: path
|
|
@@ -122,7 +122,7 @@ class Subscription(ErrorHandlingMethodView):
|
|
|
122
122
|
summary: Update subscription
|
|
123
123
|
description: "Update an existing subscription."
|
|
124
124
|
tags:
|
|
125
|
-
-
|
|
125
|
+
- Subscription
|
|
126
126
|
parameters:
|
|
127
127
|
- name: account
|
|
128
128
|
in: path
|
|
@@ -209,7 +209,7 @@ class Subscription(ErrorHandlingMethodView):
|
|
|
209
209
|
summary: Create subscription
|
|
210
210
|
description: "Create a new subscription"
|
|
211
211
|
tags:
|
|
212
|
-
-
|
|
212
|
+
- Subscription
|
|
213
213
|
parameters:
|
|
214
214
|
- name: account
|
|
215
215
|
in: path
|
|
@@ -328,7 +328,7 @@ class SubscriptionName(ErrorHandlingMethodView):
|
|
|
328
328
|
summary: Get Subscription by Name
|
|
329
329
|
description: "Retrieve a subscription by name."
|
|
330
330
|
tags:
|
|
331
|
-
-
|
|
331
|
+
- Subscription
|
|
332
332
|
parameters:
|
|
333
333
|
- name: name
|
|
334
334
|
in: path
|
|
@@ -414,7 +414,7 @@ class Rules(ErrorHandlingMethodView):
|
|
|
414
414
|
summary: Get Replication Rules
|
|
415
415
|
description: "Return all rules of a given subscription id."
|
|
416
416
|
tags:
|
|
417
|
-
-
|
|
417
|
+
- Subscription
|
|
418
418
|
parameters:
|
|
419
419
|
- name: account
|
|
420
420
|
in: path
|
|
@@ -479,7 +479,7 @@ class States(ErrorHandlingMethodView):
|
|
|
479
479
|
summary: Get states
|
|
480
480
|
description: "Return a summary of the states of all rules of a given subscription id."
|
|
481
481
|
tags:
|
|
482
|
-
-
|
|
482
|
+
- Subscription
|
|
483
483
|
parameters:
|
|
484
484
|
- name: account
|
|
485
485
|
in: path
|
|
@@ -541,7 +541,7 @@ class SubscriptionId(ErrorHandlingMethodView):
|
|
|
541
541
|
summary: Get Subscription from ID
|
|
542
542
|
description: "Retrieve a subscription matching the given subscription id."
|
|
543
543
|
tags:
|
|
544
|
-
-
|
|
544
|
+
- Subscription
|
|
545
545
|
parameters:
|
|
546
546
|
- name: subscription_id
|
|
547
547
|
in: path
|
|
@@ -27,7 +27,14 @@ def get_parser():
|
|
|
27
27
|
"""
|
|
28
28
|
Returns the argparse parser.
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
description = (
|
|
31
|
+
"The Abacus-Account daemon is responsible for updating account usages. "
|
|
32
|
+
"It checks if there are new entries in the UpdatedAccountCounter table "
|
|
33
|
+
"and updates the account counters in the AccountCounter table by adding "
|
|
34
|
+
"or subtracting the amount and size of files and recalculating the quotas."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
parser = argparse.ArgumentParser(description=description, epilog='''
|
|
31
38
|
Upload a file::
|
|
32
39
|
|
|
33
40
|
$ rucio upload --rse MOCK --scope mock filename.txt
|
|
@@ -27,7 +27,14 @@ def get_parser():
|
|
|
27
27
|
"""
|
|
28
28
|
Returns the argparse parser.
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
description = (
|
|
31
|
+
"The Abacus-RSE daemon is responsible for updating RSE usages. "
|
|
32
|
+
"It checks if there are new entries in the UpdatedRSECounter table "
|
|
33
|
+
"and updates the RSE counter in the RSECounter table "
|
|
34
|
+
"by adding or subtracting the amount of files and the size."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
parser = argparse.ArgumentParser(description=description, epilog='''
|
|
31
38
|
Upload a file to your RSE::
|
|
32
39
|
|
|
33
40
|
$ rucio upload --rse MOCK --scope mock filename.txt
|
|
@@ -27,7 +27,13 @@ def get_parser():
|
|
|
27
27
|
"""
|
|
28
28
|
Returns the argparse parser.
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
description = (
|
|
31
|
+
"The Conveyor-Throttler daemon is responsible for managing the internal queue of transfer requests. "
|
|
32
|
+
"Depending on transfer limits of current and waiting transfers, "
|
|
33
|
+
"it decides whether a transfer should be put in the queue or not."
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
parser = argparse.ArgumentParser(description=description, epilog='''
|
|
31
37
|
In this example, the transfer limit will be one transfer which means that there should be only one active transfer at the time.
|
|
32
38
|
There will be two waiting transfer requests and no current active transfer.
|
|
33
39
|
After running the daemon, there will be one transfer in the queue which can then be started.
|
|
@@ -27,7 +27,15 @@ def get_parser():
|
|
|
27
27
|
"""
|
|
28
28
|
Returns the argparse parser.
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
description = (
|
|
31
|
+
"The Judge-Cleaner daemon is responsible for cleaning expired replication rules. "
|
|
32
|
+
"It deletes rules by checking if the 'expired_at' date property is older than the current timestamp. "
|
|
33
|
+
"If the rule is expired, it will first remove one lock for the replica and parent datasets if the DID belongs to any. "
|
|
34
|
+
"Then it will set a tombstone to the replica to mark it as deletable if there are no rules protecting the replica. "
|
|
35
|
+
"After these steps, the rule gets deleted."
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
parser = argparse.ArgumentParser(description=description, epilog='''
|
|
31
39
|
Upload a file to your RSE::
|
|
32
40
|
|
|
33
41
|
$ rucio upload --rse MOCK --scope mock --name file filename.txt
|
|
@@ -27,7 +27,13 @@ def get_parser():
|
|
|
27
27
|
"""
|
|
28
28
|
Returns the argparse parser.
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
description = (
|
|
31
|
+
"The Necromancer daemon is responsible for managing bad replicas. "
|
|
32
|
+
"If a replica that got declared bad has other replicas, it will try to recover it by requesting a new transfer. "
|
|
33
|
+
"If there are no replicas anymore, then the file gets marked as lost."
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
parser = argparse.ArgumentParser(description=description, epilog='''
|
|
31
37
|
Lost replica:
|
|
32
38
|
In this example the file gets uploaded and will only have this replica as there are no replication rules. If it gets declared bad, there will be no replica to recover from.
|
|
33
39
|
Therefore the replica gets marked as lost.
|
|
@@ -227,14 +227,29 @@ Note that attempting the use the ``--vos`` argument when in single-VO mode will
|
|
|
227
227
|
$ rucio-replica-recoverer --run-once --vos abc xyz
|
|
228
228
|
2020-07-28 15:21:33,349 5488 WARNING Ignoring argument vos, this is only applicable in a multi-VO setup.
|
|
229
229
|
''', formatter_class=argparse.RawDescriptionHelpFormatter) # NOQA: E501
|
|
230
|
-
parser.add_argument("--nattempts",
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
parser.add_argument("--
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
parser.add_argument('--
|
|
237
|
-
|
|
230
|
+
parser.add_argument("--nattempts",
|
|
231
|
+
action="store", default=5, type=int,
|
|
232
|
+
help='Minimum count of suspicious file replica appearance in bad_replicas table. Default value is 5.')
|
|
233
|
+
parser.add_argument("--younger-than",
|
|
234
|
+
action="store", default=5, type=int,
|
|
235
|
+
help='Consider all file replicas logged in bad_replicas table since specified number of younger-than days. Default value is 5.')
|
|
236
|
+
parser.add_argument('--vos', nargs='+', type=str,
|
|
237
|
+
help='Optional list of VOs to consider. Only used in multi-VO mode.')
|
|
238
|
+
parser.add_argument("--run-once",
|
|
239
|
+
action="store_true", default=False,
|
|
240
|
+
help='One iteration only.')
|
|
241
|
+
parser.add_argument("--limit-suspicious-files-on-rse",
|
|
242
|
+
action="store", default=5, type=int,
|
|
243
|
+
help='Maximum number of suspicious replicas on an RSE before that RSE is considered problematic and the suspicious replicas on that RSE are declared "TEMPORARY_UNAVAILABLE". Default value is 5.')
|
|
244
|
+
parser.add_argument('--json-file-name',
|
|
245
|
+
action="store", default="/opt/rucio/etc/suspicious_replica_recoverer.json", type=str,
|
|
246
|
+
help='Name of the json file that that contains the policies which will be used by the suspicious replica recoverer.')
|
|
247
|
+
parser.add_argument('--sleep-time',
|
|
248
|
+
action="store", default=3600, type=int,
|
|
249
|
+
help='Concurrency control: Thread sleep time after each chunk of work.')
|
|
250
|
+
parser.add_argument('--active-mode',
|
|
251
|
+
action="store_true", default=False,
|
|
252
|
+
help='If NOT specified, the daemon will run without taking any actions on any files. In either case, the log file will be produced normally.')
|
|
238
253
|
return parser
|
|
239
254
|
|
|
240
255
|
|
|
@@ -243,6 +258,13 @@ if __name__ == "__main__":
|
|
|
243
258
|
PARSER = get_parser()
|
|
244
259
|
ARGS = PARSER.parse_args()
|
|
245
260
|
try:
|
|
246
|
-
run(once=ARGS.run_once,
|
|
261
|
+
run(once=ARGS.run_once,
|
|
262
|
+
younger_than=ARGS.younger_than,
|
|
263
|
+
nattempts=ARGS.nattempts,
|
|
264
|
+
vos=ARGS.vos,
|
|
265
|
+
limit_suspicious_files_on_rse=ARGS.limit_suspicious_files_on_rse,
|
|
266
|
+
json_file_name=ARGS.json_file_name,
|
|
267
|
+
sleep_time=ARGS.sleep_time,
|
|
268
|
+
active_mode=ARGS.active_mode)
|
|
247
269
|
except KeyboardInterrupt:
|
|
248
270
|
stop()
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
"""
|
|
17
|
-
Undertaker is a daemon to manage expired
|
|
17
|
+
Undertaker is a daemon to manage expired DID.
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
import argparse
|
|
@@ -27,7 +27,13 @@ def get_parser():
|
|
|
27
27
|
"""
|
|
28
28
|
Returns the argparse parser.
|
|
29
29
|
"""
|
|
30
|
-
|
|
30
|
+
description = (
|
|
31
|
+
"The Undertaker daemon is responsible for managing expired DIDs. "
|
|
32
|
+
"It deletes DIDs, but not replicas by checking if there are DIDs where the "
|
|
33
|
+
"'expired_at' date property is older than the current timestamp."
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
parser = argparse.ArgumentParser(description=description, epilog='''
|
|
31
37
|
Create a DID that is already expired by setting its lifetime to -1::
|
|
32
38
|
|
|
33
39
|
$ python
|