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.

Files changed (155) hide show
  1. rucio/cli/bin_legacy/rucio.py +1 -1
  2. rucio/cli/bin_legacy/rucio_admin.py +1 -1
  3. rucio/cli/did.py +2 -2
  4. rucio/cli/rse.py +2 -3
  5. rucio/cli/subscription.py +1 -1
  6. rucio/client/baseclient.py +5 -1
  7. rucio/client/didclient.py +16 -16
  8. rucio/client/downloadclient.py +14 -14
  9. rucio/client/lockclient.py +3 -3
  10. rucio/client/replicaclient.py +2 -2
  11. rucio/client/touchclient.py +1 -1
  12. rucio/client/uploadclient.py +725 -181
  13. rucio/common/config.py +1 -2
  14. rucio/common/constants.py +2 -0
  15. rucio/common/didtype.py +2 -2
  16. rucio/common/dumper/__init__.py +1 -1
  17. rucio/common/pcache.py +20 -25
  18. rucio/common/plugins.py +10 -17
  19. rucio/common/schema/__init__.py +7 -5
  20. rucio/common/utils.py +1 -1
  21. rucio/core/authentication.py +1 -1
  22. rucio/core/credential.py +1 -1
  23. rucio/core/did.py +54 -54
  24. rucio/core/did_meta_plugins/__init__.py +10 -10
  25. rucio/core/did_meta_plugins/did_column_meta.py +9 -9
  26. rucio/core/did_meta_plugins/did_meta_plugin_interface.py +3 -3
  27. rucio/core/did_meta_plugins/elasticsearch_meta.py +7 -7
  28. rucio/core/did_meta_plugins/json_meta.py +2 -2
  29. rucio/core/did_meta_plugins/mongo_meta.py +9 -9
  30. rucio/core/did_meta_plugins/postgres_meta.py +7 -7
  31. rucio/core/dirac.py +1 -1
  32. rucio/core/lifetime_exception.py +2 -2
  33. rucio/core/lock.py +7 -7
  34. rucio/core/meta_conventions.py +2 -2
  35. rucio/core/monitor.py +1 -1
  36. rucio/core/naming_convention.py +1 -1
  37. rucio/core/nongrid_trace.py +2 -2
  38. rucio/core/oidc.py +2 -2
  39. rucio/core/permission/__init__.py +7 -5
  40. rucio/core/permission/generic.py +2 -2
  41. rucio/core/permission/generic_multi_vo.py +2 -2
  42. rucio/core/replica.py +17 -17
  43. rucio/core/rule.py +30 -30
  44. rucio/core/rule_grouping.py +2 -3
  45. rucio/core/scope.py +1 -1
  46. rucio/core/trace.py +2 -2
  47. rucio/daemons/auditor/__init__.py +1 -1
  48. rucio/daemons/badreplicas/minos.py +9 -3
  49. rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -2
  50. rucio/daemons/badreplicas/necromancer.py +9 -3
  51. rucio/daemons/bb8/common.py +1 -1
  52. rucio/daemons/bb8/nuclei_background_rebalance.py +1 -1
  53. rucio/daemons/bb8/t2_background_rebalance.py +1 -1
  54. rucio/daemons/cache/consumer.py +1 -1
  55. rucio/daemons/conveyor/finisher.py +13 -4
  56. rucio/daemons/conveyor/poller.py +5 -2
  57. rucio/daemons/conveyor/receiver.py +1 -1
  58. rucio/daemons/follower/follower.py +1 -1
  59. rucio/daemons/hermes/hermes.py +2 -2
  60. rucio/daemons/judge/cleaner.py +2 -2
  61. rucio/daemons/judge/evaluator.py +7 -7
  62. rucio/daemons/judge/injector.py +2 -2
  63. rucio/daemons/judge/repairer.py +2 -2
  64. rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +1 -1
  65. rucio/daemons/storage/consistency/actions.py +3 -3
  66. rucio/daemons/transmogrifier/transmogrifier.py +1 -1
  67. rucio/daemons/undertaker/undertaker.py +6 -6
  68. rucio/db/sqla/constants.py +4 -3
  69. rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -1
  70. rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +1 -1
  71. rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +1 -1
  72. rucio/db/sqla/models.py +1 -1
  73. rucio/db/sqla/session.py +7 -7
  74. rucio/gateway/account.py +65 -90
  75. rucio/gateway/did.py +26 -26
  76. rucio/gateway/dirac.py +1 -1
  77. rucio/gateway/lifetime_exception.py +1 -1
  78. rucio/gateway/replica.py +2 -2
  79. rucio/rse/protocols/ngarc.py +2 -2
  80. rucio/rse/protocols/srm.py +1 -1
  81. rucio/rse/protocols/webdav.py +8 -1
  82. rucio/tests/common.py +4 -4
  83. rucio/vcsversion.py +3 -3
  84. rucio/web/rest/flaskapi/v1/accounts.py +20 -20
  85. rucio/web/rest/flaskapi/v1/archives.py +2 -2
  86. rucio/web/rest/flaskapi/v1/common.py +1 -1
  87. rucio/web/rest/flaskapi/v1/dids.py +188 -188
  88. rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +5 -5
  89. rucio/web/rest/flaskapi/v1/locks.py +13 -13
  90. rucio/web/rest/flaskapi/v1/main.py +1 -0
  91. rucio/web/rest/flaskapi/v1/redirect.py +2 -2
  92. rucio/web/rest/flaskapi/v1/replicas.py +16 -16
  93. rucio/web/rest/flaskapi/v1/requests.py +16 -16
  94. rucio/web/rest/flaskapi/v1/subscriptions.py +7 -7
  95. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-account +8 -1
  96. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-rse +8 -1
  97. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-auditor +1 -1
  98. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-throttler +7 -1
  99. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-follower +1 -1
  100. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-cleaner +9 -1
  101. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-necromancer +7 -1
  102. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-replica-recoverer +31 -9
  103. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-undertaker +8 -2
  104. {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/METADATA +1 -1
  105. {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/RECORD +155 -155
  106. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/alembic.ini.template +0 -0
  107. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
  108. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
  109. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/ldap.cfg.template +0 -0
  110. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
  111. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  112. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
  113. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  114. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
  115. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  116. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
  117. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
  118. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
  119. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
  120. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/requirements.server.txt +0 -0
  121. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/tools/bootstrap.py +0 -0
  122. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
  123. {rucio-37.5.0.data → rucio-37.6.0.data}/data/rucio/tools/reset_database.py +0 -0
  124. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio +0 -0
  125. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-abacus-collection-replica +0 -0
  126. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-admin +0 -0
  127. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-atropos +0 -0
  128. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-automatix +0 -0
  129. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-bb8 +0 -0
  130. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-cache-client +0 -0
  131. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-cache-consumer +0 -0
  132. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-finisher +0 -0
  133. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-poller +0 -0
  134. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-preparer +0 -0
  135. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-receiver +0 -0
  136. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-stager +0 -0
  137. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-conveyor-submitter +0 -0
  138. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-dark-reaper +0 -0
  139. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-dumper +0 -0
  140. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-hermes +0 -0
  141. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-evaluator +0 -0
  142. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-injector +0 -0
  143. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-judge-repairer +0 -0
  144. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-kronos +0 -0
  145. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-minos +0 -0
  146. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-minos-temporary-expiration +0 -0
  147. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-oauth-manager +0 -0
  148. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-reaper +0 -0
  149. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-rse-decommissioner +0 -0
  150. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-storage-consistency-actions +0 -0
  151. {rucio-37.5.0.data → rucio-37.6.0.data}/scripts/rucio-transmogrifier +0 -0
  152. {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/WHEEL +0 -0
  153. {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/licenses/AUTHORS.rst +0 -0
  154. {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/licenses/LICENSE +0 -0
  155. {rucio-37.5.0.dist-info → rucio-37.6.0.dist-info}/top_level.txt +0 -0
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': '37.5.0',
7
+ 'version': '37.6.0',
8
8
  'branch_nick': 'release-37',
9
- 'revision_id': '092cfe864848019a987a3a167120cf5cf7df2f61',
10
- 'revno': 13761
9
+ 'revision_id': '30f77937bd8dd8b480072448e64a5398dbad0c9f',
10
+ 'revno': 13789
11
11
  }
@@ -76,7 +76,7 @@ class Attributes(ErrorHandlingMethodView):
76
76
  description: "Not acceptable."
77
77
  """
78
78
  try:
79
- attribs = list_account_attributes(account, vo=request.environ.get('vo'))
79
+ attribs = list_account_attributes(account, vo=request.environ['vo'])
80
80
  except AccountNotFound as error:
81
81
  return generate_http_error_flask(404, error)
82
82
 
@@ -134,7 +134,7 @@ class Attributes(ErrorHandlingMethodView):
134
134
  parameters = json_parameters()
135
135
  value = param_get(parameters, 'value')
136
136
  try:
137
- add_account_attribute(key=key, value=value, account=account, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
137
+ add_account_attribute(key=key, value=value, account=account, issuer=request.environ['issuer'], vo=request.environ['vo'])
138
138
  except AccessDenied as error:
139
139
  return generate_http_error_flask(401, error)
140
140
  except Duplicate as error:
@@ -173,7 +173,7 @@ class Attributes(ErrorHandlingMethodView):
173
173
  description: "No account found for the given id."
174
174
  """
175
175
  try:
176
- del_account_attribute(account=account, key=key, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
176
+ del_account_attribute(account=account, key=key, issuer=request.environ['issuer'], vo=request.environ['vo'])
177
177
  except AccessDenied as error:
178
178
  return generate_http_error_flask(401, error)
179
179
  except AccountNotFound as error:
@@ -333,10 +333,10 @@ class AccountParameter(ErrorHandlingMethodView):
333
333
  frontend = request.headers.get('X-Requested-Host', default=None)
334
334
  if frontend:
335
335
  return redirect(f'{frontend}/accounts/{request.environ.get("issuer")}', code=302)
336
- return redirect(request.environ.get('issuer'), code=303) # type: ignore (request.environ.get('issuer') might be None)
336
+ return redirect(request.environ['issuer'], code=303)
337
337
 
338
338
  try:
339
- acc = get_account_info(account, vo=request.environ.get('vo'))
339
+ acc = get_account_info(account, vo=request.environ['vo'])
340
340
  except AccountNotFound as error:
341
341
  return generate_http_error_flask(404, error)
342
342
  except AccessDenied as error:
@@ -383,7 +383,7 @@ class AccountParameter(ErrorHandlingMethodView):
383
383
  parameters = json_parameters()
384
384
  for key, value in parameters.items():
385
385
  try:
386
- update_account(account, key=key, value=value, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
386
+ update_account(account, key=key, value=value, issuer=request.environ['issuer'], vo=request.environ['vo'])
387
387
  except ValueError:
388
388
  return generate_http_error_flask(400, ValueError.__name__, f'Unknown value {value}')
389
389
  except AccessDenied as error:
@@ -442,7 +442,7 @@ class AccountParameter(ErrorHandlingMethodView):
442
442
  type_param = param_get(parameters, 'type')
443
443
  email = param_get(parameters, 'email')
444
444
  try:
445
- add_account(account, type_param, email, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
445
+ add_account(account, type_param, email, issuer=request.environ['issuer'], vo=request.environ['vo'])
446
446
  except Duplicate as error:
447
447
  return generate_http_error_flask(409, error)
448
448
  except AccessDenied as error:
@@ -475,7 +475,7 @@ class AccountParameter(ErrorHandlingMethodView):
475
475
  description: "Account not found"
476
476
  """
477
477
  try:
478
- del_account(account, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
478
+ del_account(account, issuer=request.environ['issuer'], vo=request.environ['vo'])
479
479
  except AccessDenied as error:
480
480
  return generate_http_error_flask(401, error)
481
481
  except AccountNotFound as error:
@@ -520,7 +520,7 @@ class Account(ErrorHandlingMethodView):
520
520
  for account in list_accounts(filter_=_filter, vo=vo):
521
521
  yield render_json(**account) + "\n"
522
522
 
523
- return try_stream(generate(_filter=dict(request.args.items(multi=False)), vo=request.environ.get('vo', 'def')))
523
+ return try_stream(generate(_filter=dict(request.args.items(multi=False)), vo=request.environ['vo']))
524
524
 
525
525
 
526
526
  class LocalAccountLimits(ErrorHandlingMethodView):
@@ -561,7 +561,7 @@ class LocalAccountLimits(ErrorHandlingMethodView):
561
561
  description: "Not Acceptable"
562
562
  """
563
563
  try:
564
- limits = get_local_account_limit(account=account, rse=rse, vo=request.environ.get('vo'))
564
+ limits = get_local_account_limit(account=account, rse=rse, vo=request.environ['vo'])
565
565
  except RSENotFound as error:
566
566
  return generate_http_error_flask(404, error)
567
567
 
@@ -606,7 +606,7 @@ class GlobalAccountLimits(ErrorHandlingMethodView):
606
606
  description: "Not Acceptable"
607
607
  """
608
608
  try:
609
- limits = get_global_account_limit(account=account, rse_expression=rse_expression, vo=request.environ.get('vo'))
609
+ limits = get_global_account_limit(account=account, rse_expression=rse_expression, vo=request.environ['vo'])
610
610
  except RSENotFound as error:
611
611
  return generate_http_error_flask(404, error)
612
612
 
@@ -677,8 +677,8 @@ class Identities(ErrorHandlingMethodView):
677
677
  authtype = param_get(parameters, 'authtype')
678
678
  email = param_get(parameters, 'email')
679
679
 
680
- issuer = request.environ.get('issuer')
681
- vo = request.environ.get('vo')
680
+ issuer = request.environ['issuer']
681
+ vo = request.environ['vo']
682
682
 
683
683
  if not issuer or not vo:
684
684
  return generate_http_error_flask(400, ValueError.__name__, 'Issuer and VO must be set.')
@@ -745,7 +745,7 @@ class Identities(ErrorHandlingMethodView):
745
745
  for identity in list_identities(account, vo=vo):
746
746
  yield render_json(**identity) + "\n"
747
747
 
748
- return try_stream(generate(request.environ.get('vo', 'def')))
748
+ return try_stream(generate(request.environ['vo']))
749
749
  except AccountNotFound as error:
750
750
  return generate_http_error_flask(404, error)
751
751
 
@@ -790,8 +790,8 @@ class Identities(ErrorHandlingMethodView):
790
790
  identity = param_get(parameters, 'identity')
791
791
  authtype = param_get(parameters, 'authtype')
792
792
 
793
- issuer = request.environ.get('issuer')
794
- vo = request.environ.get('vo')
793
+ issuer = request.environ['issuer']
794
+ vo = request.environ['vo']
795
795
 
796
796
  if not issuer or not vo:
797
797
  return generate_http_error_flask(400, ValueError.__name__, 'Issuer and VO must be set.')
@@ -846,7 +846,7 @@ class Rules(ErrorHandlingMethodView):
846
846
  for rule in list_replication_rules(filters=filters, vo=vo):
847
847
  yield dumps(rule, cls=APIEncoder) + '\n'
848
848
 
849
- return try_stream(generate(vo=request.environ.get('vo', 'def')))
849
+ return try_stream(generate(vo=request.environ['vo']))
850
850
  except RuleNotFound as error:
851
851
  return generate_http_error_flask(404, error)
852
852
 
@@ -901,7 +901,7 @@ class UsageHistory(ErrorHandlingMethodView):
901
901
  description: "Not acceptable"
902
902
  """
903
903
  try:
904
- usage = get_usage_history(account=account, rse=rse, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'))
904
+ usage = get_usage_history(account=account, rse=rse, issuer=request.environ['issuer'], vo=request.environ['vo'])
905
905
  except (AccountNotFound, CounterNotFound) as error:
906
906
  return generate_http_error_flask(404, error)
907
907
  except AccessDenied as error:
@@ -972,7 +972,7 @@ class LocalUsage(ErrorHandlingMethodView):
972
972
  for usage in get_local_account_usage(account=account, rse=rse, issuer=issuer, vo=vo):
973
973
  yield dumps(usage, cls=APIEncoder) + '\n'
974
974
 
975
- return try_stream(generate(issuer=request.environ.get('issuer'), vo=request.environ.get('vo', 'def'))) # type: ignore (request.environ.get('issuer') could be None)
975
+ return try_stream(generate(issuer=request.environ['issuer'], vo=request.environ['vo']))
976
976
  except (AccountNotFound, RSENotFound) as error:
977
977
  return generate_http_error_flask(404, error)
978
978
  except AccessDenied as error:
@@ -1036,7 +1036,7 @@ class GlobalUsage(ErrorHandlingMethodView):
1036
1036
  for usage in get_global_account_usage(account=account, rse_expression=rse_expression, issuer=issuer, vo=vo):
1037
1037
  yield dumps(usage, cls=APIEncoder) + '\n'
1038
1038
 
1039
- return try_stream(generate(vo=request.environ.get('vo', 'def'), issuer=request.environ.get('issuer'))) # type: ignore (request.environ.get('issuer') could be None)
1039
+ return try_stream(generate(vo=request.environ['vo'], issuer=request.environ['issuer']))
1040
1040
  except (AccountNotFound, RSENotFound) as error:
1041
1041
  return generate_http_error_flask(404, error)
1042
1042
  except AccessDenied as error:
@@ -54,10 +54,10 @@ class Archive(ErrorHandlingMethodView):
54
54
  type: object
55
55
  properties:
56
56
  scope:
57
- description: "The scope of the did."
57
+ description: "The scope of the DID."
58
58
  type: string
59
59
  name:
60
- description: "The name of the did."
60
+ description: "The name of the DID."
61
61
  type: string
62
62
  bytes:
63
63
  description: "The number of bytes."
@@ -234,7 +234,7 @@ def parse_scope_name(scope_name: str, vo: Optional[str]) -> tuple[str, ...]:
234
234
  if not vo:
235
235
  vo = 'def'
236
236
 
237
- # The ':' in did is replaced by '/', also an '/' is added. Why?
237
+ # The ':' in DID is replaced by '/', also an '/' is added. Why?
238
238
  pattern = get_schema_value('SCOPE_NAME_REGEXP', vo)
239
239
  text = '/' + scope_name
240
240