rucio 37.4.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 +15 -15
- rucio/client/lockclient.py +3 -3
- rucio/client/replicaclient.py +2 -2
- rucio/client/requestclient.py +6 -5
- rucio/client/touchclient.py +1 -1
- rucio/client/uploadclient.py +725 -181
- rucio/common/config.py +1 -2
- rucio/common/constants.py +16 -17
- 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 +19 -3
- 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 +5 -2
- rucio/core/permission/generic_multi_vo.py +2 -2
- rucio/core/replica.py +18 -18
- rucio/core/request.py +2 -2
- 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/core/transfer.py +4 -5
- 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/conveyor/throttler.py +2 -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/13d4f70c66a9_introduce_transfer_limits.py +1 -1
- 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 +2 -2
- 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/gateway/request.py +13 -12
- rucio/rse/protocols/ngarc.py +2 -2
- rucio/rse/protocols/srm.py +1 -1
- rucio/rse/protocols/webdav.py +8 -1
- rucio/rse/rsemanager.py +2 -2
- rucio/tests/common.py +4 -4
- rucio/vcsversion.py +3 -3
- rucio/web/rest/flaskapi/v1/accountlimits.py +22 -22
- rucio/web/rest/flaskapi/v1/accounts.py +177 -177
- rucio/web/rest/flaskapi/v1/archives.py +10 -10
- rucio/web/rest/flaskapi/v1/auth.py +106 -106
- rucio/web/rest/flaskapi/v1/common.py +1 -1
- rucio/web/rest/flaskapi/v1/config.py +37 -37
- rucio/web/rest/flaskapi/v1/credentials.py +25 -25
- rucio/web/rest/flaskapi/v1/dids.py +391 -391
- rucio/web/rest/flaskapi/v1/dirac.py +8 -8
- rucio/web/rest/flaskapi/v1/export.py +6 -6
- rucio/web/rest/flaskapi/v1/heartbeats.py +14 -14
- rucio/web/rest/flaskapi/v1/identities.py +25 -25
- rucio/web/rest/flaskapi/v1/import.py +19 -19
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +54 -54
- rucio/web/rest/flaskapi/v1/locks.py +62 -62
- rucio/web/rest/flaskapi/v1/main.py +1 -0
- rucio/web/rest/flaskapi/v1/meta_conventions.py +29 -29
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
- rucio/web/rest/flaskapi/v1/ping.py +4 -4
- rucio/web/rest/flaskapi/v1/redirect.py +16 -16
- rucio/web/rest/flaskapi/v1/replicas.py +282 -282
- rucio/web/rest/flaskapi/v1/requests.py +274 -270
- rucio/web/rest/flaskapi/v1/rses.py +427 -427
- rucio/web/rest/flaskapi/v1/rules.py +129 -129
- rucio/web/rest/flaskapi/v1/scopes.py +21 -21
- rucio/web/rest/flaskapi/v1/subscriptions.py +120 -120
- rucio/web/rest/flaskapi/v1/traces.py +18 -18
- rucio/web/rest/flaskapi/v1/vos.py +32 -32
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/requirements.server.txt +1 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-account +8 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-rse +8 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-auditor +1 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-throttler +7 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-follower +1 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-judge-cleaner +9 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-necromancer +7 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-replica-recoverer +31 -9
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-undertaker +8 -2
- {rucio-37.4.0.dist-info → rucio-37.6.0.dist-info}/METADATA +1 -1
- {rucio-37.4.0.dist-info → rucio-37.6.0.dist-info}/RECORD +179 -179
- {rucio-37.4.0.dist-info → rucio-37.6.0.dist-info}/WHEEL +1 -1
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/ldap.cfg.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/tools/bootstrap.py +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/data/rucio/tools/reset_database.py +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-collection-replica +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-admin +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-atropos +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-automatix +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-bb8 +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-cache-client +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-cache-consumer +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-finisher +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-poller +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-preparer +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-receiver +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-stager +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-submitter +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-dark-reaper +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-dumper +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-hermes +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-judge-evaluator +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-judge-injector +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-judge-repairer +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-kronos +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-minos +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-minos-temporary-expiration +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-oauth-manager +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-reaper +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-rse-decommissioner +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-storage-consistency-actions +0 -0
- {rucio-37.4.0.data → rucio-37.6.0.data}/scripts/rucio-transmogrifier +0 -0
- {rucio-37.4.0.dist-info → rucio-37.6.0.dist-info}/licenses/AUTHORS.rst +0 -0
- {rucio-37.4.0.dist-info → rucio-37.6.0.dist-info}/licenses/LICENSE +0 -0
- {rucio-37.4.0.dist-info → rucio-37.6.0.dist-info}/top_level.txt +0 -0
|
@@ -33,7 +33,7 @@ class VOs(ErrorHandlingMethodView):
|
|
|
33
33
|
- VO
|
|
34
34
|
responses:
|
|
35
35
|
200:
|
|
36
|
-
description: OK
|
|
36
|
+
description: "OK"
|
|
37
37
|
content:
|
|
38
38
|
application/json:
|
|
39
39
|
schema:
|
|
@@ -42,29 +42,29 @@ class VOs(ErrorHandlingMethodView):
|
|
|
42
42
|
type: object
|
|
43
43
|
properties:
|
|
44
44
|
vo:
|
|
45
|
-
description: The vo.
|
|
45
|
+
description: "The vo."
|
|
46
46
|
type: string
|
|
47
47
|
description:
|
|
48
|
-
description: The description of the vo.
|
|
48
|
+
description: "The description of the vo."
|
|
49
49
|
type: string
|
|
50
50
|
email:
|
|
51
|
-
description: The email for the vo.
|
|
51
|
+
description: "The email for the vo."
|
|
52
52
|
type: string
|
|
53
53
|
created_at:
|
|
54
|
-
description: The date the vo was created.
|
|
54
|
+
description: "The date the vo was created."
|
|
55
55
|
type: string
|
|
56
56
|
format: date-time
|
|
57
57
|
updated_at:
|
|
58
|
-
description: The date the vo was updated.
|
|
58
|
+
description: "The date the vo was updated."
|
|
59
59
|
type: string
|
|
60
60
|
format: date-time
|
|
61
61
|
|
|
62
62
|
406:
|
|
63
|
-
description: Not Acceptable
|
|
63
|
+
description: "Not Acceptable"
|
|
64
64
|
401:
|
|
65
|
-
description: Invalid Auth Token
|
|
65
|
+
description: "Invalid Auth Token"
|
|
66
66
|
409:
|
|
67
|
-
description: Unsupported operation.
|
|
67
|
+
description: "Unsupported operation."
|
|
68
68
|
"""
|
|
69
69
|
try:
|
|
70
70
|
def generate(issuer, vo):
|
|
@@ -90,7 +90,7 @@ class VO(ErrorHandlingMethodView):
|
|
|
90
90
|
parameters:
|
|
91
91
|
- name: vo
|
|
92
92
|
in: path
|
|
93
|
-
description: The vo to add.
|
|
93
|
+
description: "The vo to add."
|
|
94
94
|
schema:
|
|
95
95
|
type: string
|
|
96
96
|
style: simple
|
|
@@ -101,18 +101,18 @@ class VO(ErrorHandlingMethodView):
|
|
|
101
101
|
type: object
|
|
102
102
|
properties:
|
|
103
103
|
description:
|
|
104
|
-
description: The description of the VO.
|
|
104
|
+
description: "The description of the VO."
|
|
105
105
|
type: string
|
|
106
106
|
email:
|
|
107
|
-
description: The admin email associated with the VO.
|
|
107
|
+
description: "The admin email associated with the VO."
|
|
108
108
|
type: string
|
|
109
109
|
responses:
|
|
110
110
|
201:
|
|
111
|
-
description: OK
|
|
111
|
+
description: "OK"
|
|
112
112
|
401:
|
|
113
|
-
description: Invalid Auth Token
|
|
113
|
+
description: "Invalid Auth Token"
|
|
114
114
|
409:
|
|
115
|
-
description: Unsupported operation.
|
|
115
|
+
description: "Unsupported operation."
|
|
116
116
|
"""
|
|
117
117
|
parameters = json_parameters(optional=True)
|
|
118
118
|
kwargs = {'description': None, 'email': None}
|
|
@@ -137,7 +137,7 @@ class VO(ErrorHandlingMethodView):
|
|
|
137
137
|
parameters:
|
|
138
138
|
- name: vo
|
|
139
139
|
in: path
|
|
140
|
-
description: The vo to add.
|
|
140
|
+
description: "The vo to add."
|
|
141
141
|
schema:
|
|
142
142
|
type: string
|
|
143
143
|
style: simple
|
|
@@ -148,20 +148,20 @@ class VO(ErrorHandlingMethodView):
|
|
|
148
148
|
type: object
|
|
149
149
|
properties:
|
|
150
150
|
description:
|
|
151
|
-
description: The description of the VO.
|
|
151
|
+
description: "The description of the VO."
|
|
152
152
|
type: string
|
|
153
153
|
email:
|
|
154
|
-
description: The admin email associated with the VO.
|
|
154
|
+
description: "The admin email associated with the VO."
|
|
155
155
|
type: string
|
|
156
156
|
responses:
|
|
157
157
|
200:
|
|
158
|
-
description: OK
|
|
158
|
+
description: "OK"
|
|
159
159
|
401:
|
|
160
|
-
description: Invalid Auth Token
|
|
160
|
+
description: "Invalid Auth Token"
|
|
161
161
|
404:
|
|
162
|
-
description: VO not found.
|
|
162
|
+
description: "VO not found."
|
|
163
163
|
409:
|
|
164
|
-
description: Unsupported operation.
|
|
164
|
+
description: "Unsupported operation."
|
|
165
165
|
"""
|
|
166
166
|
parameters = json_parameters()
|
|
167
167
|
try:
|
|
@@ -188,7 +188,7 @@ class RecoverVO(ErrorHandlingMethodView):
|
|
|
188
188
|
parameters:
|
|
189
189
|
- name: vo
|
|
190
190
|
in: path
|
|
191
|
-
description: The vo to add.
|
|
191
|
+
description: "The vo to add."
|
|
192
192
|
schema:
|
|
193
193
|
type: string
|
|
194
194
|
style: simple
|
|
@@ -203,29 +203,29 @@ class RecoverVO(ErrorHandlingMethodView):
|
|
|
203
203
|
- email
|
|
204
204
|
properties:
|
|
205
205
|
identity:
|
|
206
|
-
description: Identity key to use.
|
|
206
|
+
description: "Identity key to use."
|
|
207
207
|
type: string
|
|
208
208
|
authtype:
|
|
209
|
-
description: The authtype of the account.
|
|
209
|
+
description: "The authtype of the account."
|
|
210
210
|
type: string
|
|
211
211
|
email:
|
|
212
|
-
description: The admin email for the vo.
|
|
212
|
+
description: "The admin email for the vo."
|
|
213
213
|
type: string
|
|
214
214
|
password:
|
|
215
|
-
description: Password for identity.
|
|
215
|
+
description: "Password for identity."
|
|
216
216
|
type: string
|
|
217
217
|
default:
|
|
218
|
-
description: Whether to use identity as account default.
|
|
218
|
+
description: "Whether to use identity as account default."
|
|
219
219
|
type: boolean
|
|
220
220
|
responses:
|
|
221
221
|
201:
|
|
222
|
-
description: OK
|
|
222
|
+
description: "OK"
|
|
223
223
|
401:
|
|
224
|
-
description: Invalid Auth Token
|
|
224
|
+
description: "Invalid Auth Token"
|
|
225
225
|
404:
|
|
226
|
-
description: Account not found.
|
|
226
|
+
description: "Account not found."
|
|
227
227
|
409:
|
|
228
|
-
description: Unsupported operation.
|
|
228
|
+
description: "Unsupported operation."
|
|
229
229
|
"""
|
|
230
230
|
parameters = json_parameters()
|
|
231
231
|
identity = param_get(parameters, 'identity')
|
|
@@ -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
|