rucio-clients 38.3.0__py3-none-any.whl → 38.5.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-clients might be problematic. Click here for more details.

Files changed (48) hide show
  1. rucio/cli/bin_legacy/rucio.py +12 -7
  2. rucio/cli/bin_legacy/rucio_admin.py +9 -2
  3. rucio/cli/did.py +1 -1
  4. rucio/cli/opendata.py +19 -2
  5. rucio/cli/replica.py +6 -2
  6. rucio/cli/rule.py +0 -1
  7. rucio/cli/scope.py +9 -0
  8. rucio/cli/utils.py +11 -0
  9. rucio/client/accountclient.py +20 -19
  10. rucio/client/accountlimitclient.py +5 -4
  11. rucio/client/baseclient.py +25 -25
  12. rucio/client/configclient.py +7 -6
  13. rucio/client/credentialclient.py +2 -1
  14. rucio/client/didclient.py +33 -32
  15. rucio/client/diracclient.py +2 -1
  16. rucio/client/downloadclient.py +3 -1
  17. rucio/client/exportclient.py +2 -1
  18. rucio/client/importclient.py +2 -1
  19. rucio/client/lifetimeclient.py +3 -2
  20. rucio/client/lockclient.py +4 -3
  21. rucio/client/metaconventionsclient.py +5 -4
  22. rucio/client/opendataclient.py +8 -7
  23. rucio/client/pingclient.py +2 -1
  24. rucio/client/replicaclient.py +27 -26
  25. rucio/client/requestclient.py +8 -8
  26. rucio/client/rseclient.py +31 -28
  27. rucio/client/ruleclient.py +13 -12
  28. rucio/client/scopeclient.py +44 -4
  29. rucio/client/subscriptionclient.py +6 -5
  30. rucio/common/constants.py +18 -0
  31. rucio/common/didtype.py +18 -11
  32. rucio/common/exception.py +20 -0
  33. rucio/common/plugins.py +9 -7
  34. rucio/rse/protocols/webdav.py +5 -2
  35. rucio/vcsversion.py +3 -3
  36. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/data/etc/rucio.cfg.template +2 -3
  37. {rucio_clients-38.3.0.dist-info → rucio_clients-38.5.0.dist-info}/METADATA +1 -1
  38. {rucio_clients-38.3.0.dist-info → rucio_clients-38.5.0.dist-info}/RECORD +48 -48
  39. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/data/etc/rse-accounts.cfg.template +0 -0
  40. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/data/etc/rucio.cfg.atlas.client.template +0 -0
  41. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/data/requirements.client.txt +0 -0
  42. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/data/rucio_client/merge_rucio_configs.py +0 -0
  43. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/scripts/rucio +0 -0
  44. {rucio_clients-38.3.0.data → rucio_clients-38.5.0.data}/scripts/rucio-admin +0 -0
  45. {rucio_clients-38.3.0.dist-info → rucio_clients-38.5.0.dist-info}/WHEEL +0 -0
  46. {rucio_clients-38.3.0.dist-info → rucio_clients-38.5.0.dist-info}/licenses/AUTHORS.rst +0 -0
  47. {rucio_clients-38.3.0.dist-info → rucio_clients-38.5.0.dist-info}/licenses/LICENSE +0 -0
  48. {rucio_clients-38.3.0.dist-info → rucio_clients-38.5.0.dist-info}/top_level.txt +0 -0
@@ -13,13 +13,18 @@
13
13
  # limitations under the License.
14
14
 
15
15
  from json import loads
16
+ from typing import TYPE_CHECKING, Any, Literal, Union
16
17
  from urllib.parse import quote_plus
17
18
 
18
19
  from requests.status_codes import codes
19
20
 
20
21
  from rucio.client.baseclient import BaseClient, choice
22
+ from rucio.common.constants import HTTPMethod
21
23
  from rucio.common.utils import build_url
22
24
 
25
+ if TYPE_CHECKING:
26
+ from collections.abc import Iterator
27
+
23
28
 
24
29
  class ScopeClient(BaseClient):
25
30
 
@@ -56,14 +61,14 @@ class ScopeClient(BaseClient):
56
61
 
57
62
  path = '/'.join([self.SCOPE_BASEURL, account, 'scopes', quote_plus(scope)])
58
63
  url = build_url(choice(self.list_hosts), path=path)
59
- r = self._send_request(url, type_='POST')
64
+ r = self._send_request(url, method=HTTPMethod.POST)
60
65
  if r.status_code == codes.created:
61
66
  return True
62
67
  else:
63
68
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
64
69
  raise exc_cls(exc_msg)
65
70
 
66
- def list_scopes(self) -> list[str]:
71
+ def list_scopes(self) -> "Union[list[str], Iterator[dict[Literal['scope', 'account'], Any]]]":
67
72
  """
68
73
  Sends the request to list all scopes.
69
74
 
@@ -74,7 +79,7 @@ class ScopeClient(BaseClient):
74
79
 
75
80
  path = '/'.join(['scopes/'])
76
81
  url = build_url(choice(self.list_hosts), path=path)
77
- r = self._send_request(url)
82
+ r = self._send_request(url, method=HTTPMethod.GET)
78
83
  if r.status_code == codes.ok:
79
84
  scopes = loads(r.text)
80
85
  return scopes
@@ -82,6 +87,41 @@ class ScopeClient(BaseClient):
82
87
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
83
88
  raise exc_cls(exc_msg)
84
89
 
90
+ def update_scope_ownership(self, account: str, scope: str) -> bool:
91
+ """
92
+ Change the ownership of a scope
93
+
94
+ Parameters
95
+ ----------
96
+ account :
97
+ New account to assign as scope owner
98
+ scope :
99
+ Scope to change ownership of
100
+
101
+ Returns
102
+ -------
103
+ bool
104
+ True if the operation was successful
105
+
106
+ Raises
107
+ ------
108
+ AccountNotFound
109
+ If account doesn't exist.
110
+ ScopeNotFound
111
+ If scope doesn't exist.
112
+ CannotAuthenticate, AccessDenied
113
+ Insufficient permission/incorrect credentials to change ownership.
114
+ """
115
+
116
+ path = '/'.join(['scopes', account, scope])
117
+ url = build_url(choice(self.list_hosts), path=path)
118
+ r = self._send_request(url, method=HTTPMethod.PUT)
119
+ if r.status_code == codes.ok:
120
+ return True
121
+ else:
122
+ exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
123
+ raise exc_cls(exc_msg)
124
+
85
125
  def list_scopes_for_account(self, account: str) -> list[str]:
86
126
  """
87
127
  Sends the request to list all scopes for a rucio account.
@@ -106,7 +146,7 @@ class ScopeClient(BaseClient):
106
146
  path = '/'.join([self.SCOPE_BASEURL, account, 'scopes/'])
107
147
  url = build_url(choice(self.list_hosts), path=path)
108
148
 
109
- r = self._send_request(url)
149
+ r = self._send_request(url, method=HTTPMethod.GET)
110
150
  if r.status_code == codes.ok:
111
151
  scopes = loads(r.text)
112
152
  return scopes
@@ -18,6 +18,7 @@ from typing import TYPE_CHECKING, Any, Literal, Optional, Union
18
18
  from requests.status_codes import codes
19
19
 
20
20
  from rucio.client.baseclient import BaseClient, choice
21
+ from rucio.common.constants import HTTPMethod
21
22
  from rucio.common.utils import build_url
22
23
 
23
24
  if TYPE_CHECKING:
@@ -78,7 +79,7 @@ class SubscriptionClient(BaseClient):
78
79
  raise TypeError('replication_rules should be a list')
79
80
  data = dumps({'options': {'filter': filter_, 'replication_rules': replication_rules, 'comments': comments,
80
81
  'lifetime': lifetime, 'retroactive': retroactive, 'dry_run': dry_run, 'priority': priority}})
81
- result = self._send_request(url, type_='POST', data=data)
82
+ result = self._send_request(url, method=HTTPMethod.POST, data=data)
82
83
  if result.status_code == codes.created: # pylint: disable=no-member
83
84
  return result.text
84
85
  else:
@@ -120,7 +121,7 @@ class SubscriptionClient(BaseClient):
120
121
  else:
121
122
  path += '/'
122
123
  url = build_url(choice(self.list_hosts), path=path)
123
- result = self._send_request(url, type_='GET')
124
+ result = self._send_request(url, method=HTTPMethod.GET)
124
125
  if result.status_code == codes.ok: # pylint: disable=no-member
125
126
  return self._load_json_data(result)
126
127
  if result.status_code == codes.not_found:
@@ -173,7 +174,7 @@ class SubscriptionClient(BaseClient):
173
174
  raise TypeError('replication_rules should be a list')
174
175
  data = dumps({'options': {'filter': filter_, 'replication_rules': replication_rules, 'comments': comments,
175
176
  'lifetime': lifetime, 'retroactive': retroactive, 'dry_run': dry_run, 'priority': priority}})
176
- result = self._send_request(url, type_='PUT', data=data)
177
+ result = self._send_request(url, method=HTTPMethod.PUT, data=data)
177
178
  if result.status_code == codes.created: # pylint: disable=no-member
178
179
  return True
179
180
  else:
@@ -203,7 +204,7 @@ class SubscriptionClient(BaseClient):
203
204
  path = self.SUB_BASEURL + '/' + account + '/' + name # type: ignore
204
205
  url = build_url(choice(self.list_hosts), path=path)
205
206
  data = dumps({'options': {'state': 'I'}})
206
- result = self._send_request(url, type_='PUT', data=data)
207
+ result = self._send_request(url, method=HTTPMethod.PUT, data=data)
207
208
  if result.status_code == codes.created: # pylint: disable=no-member
208
209
  return True
209
210
  else:
@@ -228,7 +229,7 @@ class SubscriptionClient(BaseClient):
228
229
 
229
230
  path = '/'.join([self.SUB_BASEURL, account, name, 'rules'])
230
231
  url = build_url(choice(self.list_hosts), path=path)
231
- result = self._send_request(url, type_='GET')
232
+ result = self._send_request(url, method=HTTPMethod.GET)
232
233
  if result.status_code == codes.ok: # pylint: disable=no-member
233
234
  return self._load_json_data(result)
234
235
  else:
rucio/common/constants.py CHANGED
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import enum
16
+ import sys
16
17
  from collections import namedtuple
17
18
  from typing import Literal, get_args
18
19
 
@@ -224,3 +225,20 @@ OPENDATA_DID_STATE_LITERAL_LIST = list(get_args(OPENDATA_DID_STATE_LITERAL))
224
225
 
225
226
  POLICY_ALGORITHM_TYPES_LITERAL = Literal['non_deterministic_pfn', 'scope', 'lfn2pfn', 'pfn2lfn', 'fts3_tape_metadata_plugins', 'fts3_plugins_init', 'auto_approve']
226
227
  POLICY_ALGORITHM_TYPES = list(get_args(POLICY_ALGORITHM_TYPES_LITERAL))
228
+
229
+ # https://github.com/rucio/rucio/issues/7958
230
+ # When Python 3.11 is the minimum supported version, we can use the standard library enum and remove this logic
231
+ if sys.version_info >= (3, 11):
232
+ from http import HTTPMethod
233
+ else:
234
+ @enum.unique
235
+ class HTTPMethod(str, enum.Enum):
236
+ """HTTP verbs used in Rucio requests."""
237
+
238
+ HEAD = "HEAD"
239
+ OPTIONS = "OPTIONS"
240
+ PATCH = "PATCH"
241
+ GET = "GET"
242
+ POST = "POST"
243
+ PUT = "PUT"
244
+ DELETE = "DELETE"
rucio/common/didtype.py CHANGED
@@ -15,10 +15,12 @@
15
15
  """
16
16
  DID type to represent a DID and to simplify operations on it
17
17
  """
18
-
18
+ import logging
19
+ from configparser import NoSectionError
19
20
  from typing import Any, Union
20
21
 
21
- from rucio.common.exception import DIDError
22
+ from rucio.common.exception import ConfigNotFound, DIDError, InvalidAlgorithmName
23
+ from rucio.common.utils import extract_scope
22
24
 
23
25
 
24
26
  class DID:
@@ -126,15 +128,20 @@ class DID:
126
128
  Construct the DID from a string.
127
129
  :param did: string containing the DID information
128
130
  """
129
- did_parts = did.split(DID.SCOPE_SEPARATOR, 1)
130
- if len(did_parts) == 1:
131
- self.name = did
132
- self._update_implicit_scope()
133
- if not self.has_scope():
134
- raise DIDError('Object construction from non-splitable string is ambigious')
135
- else:
136
- self.scope = did_parts[0]
137
- self.name = did_parts[1]
131
+ try:
132
+ self.scope, self.name = extract_scope(did)
133
+ except (ImportError, InvalidAlgorithmName, ConfigNotFound, NoSectionError) as e: # Only use when the policy can not be found
134
+ logging.debug("Failure using extract_scope policy for '%s': %s - Using fallback." % (did, type(e).__name__))
135
+ did_parts = did.split(DID.SCOPE_SEPARATOR, 1)
136
+ if len(did_parts) == 1:
137
+ self.name = did
138
+ self._update_implicit_scope()
139
+ if not self.has_scope():
140
+ error = f"Could not parse scope from did string {did} - fallback policy expects only one '{DID.SCOPE_SEPARATOR}'"
141
+ raise DIDError(error)
142
+ else:
143
+ self.scope = did_parts[0]
144
+ self.name = did_parts[1]
138
145
 
139
146
  def _did_from_dict(self, did: dict[str, str]) -> None:
140
147
  """
rucio/common/exception.py CHANGED
@@ -1271,3 +1271,23 @@ class InvalidPolicyPackageAlgorithmType(RucioException):
1271
1271
  super(InvalidPolicyPackageAlgorithmType, self).__init__(*args)
1272
1272
  self._message = f"Invalid policy package algorithm type '{param}'."
1273
1273
  self.error_code = 120
1274
+
1275
+
1276
+ class InvalidAccountType(RucioException):
1277
+ """
1278
+ Thrown when an account is created with an invalid type
1279
+ """
1280
+ def __init__(self, *args):
1281
+ super(InvalidAccountType, self).__init__(*args)
1282
+ self._message = "Cannot create an account with an invalid type."
1283
+ self.error_code = 121
1284
+
1285
+ class OpenDataDuplicateDOI(OpenDataError):
1286
+ """
1287
+ Throws when a data identifier with the same DOI already exists in the open data catalog.
1288
+ """
1289
+
1290
+ def __init__(self, doi: str, *args):
1291
+ super(OpenDataDuplicateDOI, self).__init__(*args)
1292
+ self._message = f"Data identifier with the same DOI ({doi}) already exists in the open data catalog."
1293
+ self.error_code = 122
rucio/common/plugins.py CHANGED
@@ -77,7 +77,7 @@ class PolicyPackageAlgorithms:
77
77
  """
78
78
  _ALGORITHMS: dict[POLICY_ALGORITHM_TYPES_LITERAL, dict[str, 'Callable[..., Any]']] = {}
79
79
  _loaded_policy_modules = False
80
- _default_algorithms: dict[str, 'Callable[..., Any]'] = {}
80
+ _default_algorithms: dict[str, Optional['Callable[..., Any]']] = {}
81
81
 
82
82
  def __init__(self) -> None:
83
83
  if not self._loaded_policy_modules:
@@ -105,17 +105,23 @@ class PolicyPackageAlgorithms:
105
105
  vo = ''
106
106
  package = cls._get_policy_package_name(vo)
107
107
  except (NoOptionError, NoSectionError):
108
+ cls._default_algorithms[type_for_vo] = default_algorithm
108
109
  return default_algorithm
109
110
 
110
111
  module_name = package + "." + algorithm_type
112
+ LOGGER.info('Attempting to find algorithm %s in default location %s...' % (algorithm_type, module_name))
111
113
  try:
112
114
  module = importlib.import_module(module_name)
113
115
 
114
116
  if hasattr(module, algorithm_type):
115
117
  default_algorithm = getattr(module, algorithm_type)
116
- cls._default_algorithms[type_for_vo] = default_algorithm
118
+ except ModuleNotFoundError:
119
+ LOGGER.info('Algorithm %s not found in default location %s' % (algorithm_type, module_name))
117
120
  except ImportError:
118
- LOGGER.info('Policy algorithm module %s could not be loaded' % module_name)
121
+ LOGGER.info('Algorithm %s found in default location %s, but could not be loaded' % (algorithm_type, module_name))
122
+ # if the default algorithm is not present, this will store None and we will
123
+ # not attempt to load the same algorithm again
124
+ cls._default_algorithms[type_for_vo] = default_algorithm
119
125
  return default_algorithm
120
126
 
121
127
  @classmethod
@@ -212,10 +218,6 @@ class PolicyPackageAlgorithms:
212
218
  if hasattr(module, 'get_algorithms'):
213
219
  all_algorithms = module.get_algorithms()
214
220
 
215
- # for backward compatibility, rename 'surl' to 'non_deterministic_pfn' here
216
- if 'surl' in all_algorithms:
217
- all_algorithms['non_deterministic_pfn'] = all_algorithms['surl']
218
-
219
221
  # check that the names are correctly prefixed for multi-VO
220
222
  if vo:
221
223
  for _, algorithms in all_algorithms.items():
@@ -25,6 +25,7 @@ from requests.adapters import HTTPAdapter
25
25
  from urllib3.poolmanager import PoolManager
26
26
 
27
27
  from rucio.common import exception
28
+ from rucio.common.constants import HTTPMethod
28
29
  from rucio.rse.protocols import protocol
29
30
 
30
31
 
@@ -259,9 +260,11 @@ class Default(protocol.RSEProtocol):
259
260
  try:
260
261
  # use GET instead of HEAD for presigned urls
261
262
  if not using_presigned_urls:
262
- result = self.session.request('HEAD', path, verify=False, timeout=self.timeout, cert=self.cert)
263
+ result = self.session.request(HTTPMethod.HEAD.value, path, verify=False, timeout=self.timeout,
264
+ cert=self.cert)
263
265
  else:
264
- result = self.session.request('GET', path, verify=False, timeout=self.timeout, cert=self.cert)
266
+ result = self.session.request(HTTPMethod.GET.value, path, verify=False, timeout=self.timeout,
267
+ cert=self.cert)
265
268
  if result.status_code == 200:
266
269
  return True
267
270
  elif result.status_code in [401, ]:
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.3.0',
7
+ 'version': '38.5.0',
8
8
  'branch_nick': 'release-38-LTS',
9
- 'revision_id': '5eebc4e67a544dcb2d689bd45260cb73fb10066a',
10
- 'revno': 14003
9
+ 'revision_id': '430fd3dd8f4dc5103e1e932c9515421e1c515c3e',
10
+ 'revno': 14073
11
11
  }
@@ -121,8 +121,8 @@ usercert = /opt/rucio/tools/x509up
121
121
 
122
122
  [messaging-fts3]
123
123
  port = 61123
124
- ssl_key_file = /home/mario/.ssh/hostkey.pem
125
- ssl_cert_file = /home/mario/.ssh/hostcert.pem
124
+ ssl_key_file = /etc/grid-security/hostkey.pem
125
+ ssl_cert_file = /etc/grid-security/hostcert.pem
126
126
  destination = /topic/transfer.fts_monitoring_queue_state
127
127
  brokers = dashb-test-mb.cern.ch
128
128
  voname = atlas
@@ -199,7 +199,6 @@ account = cache_mb
199
199
  cacert = /opt/rucio/etc/web/ca.crt
200
200
  #cacert = /etc/pki/tls/certs/CERN-bundle.pem
201
201
  usercert = /opt/rucio/etc/web/usercert.pem
202
- #usercert = /home/mario/.ssh/usercert_with_key.pem
203
202
 
204
203
  [nagios]
205
204
  proxy = /opt/rucio/etc/ddmadmin.proxy.nagios
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rucio-clients
3
- Version: 38.3.0
3
+ Version: 38.5.0
4
4
  Summary: Rucio Client Lite Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -1,49 +1,49 @@
1
1
  rucio/__init__.py,sha256=Y7cPPlHVQPFyN8bSPFC0W3WViEdONr5g_qwBub5rufE,660
2
2
  rucio/alembicrevision.py,sha256=9tnjQLFkTpUEcZqcw-ojWpt4Wbg-5OtMJ0CfjPc0wX8,690
3
- rucio/vcsversion.py,sha256=mQsxiR0m-shMbCPg19FH-Ol-CaR3LE4pKaB4sgr3qZI,248
3
+ rucio/vcsversion.py,sha256=gIawRqhnsUg9YGwak_xzJdzx3efjPERJHG5ap15AKF4,248
4
4
  rucio/version.py,sha256=IwsNb1QQk0D092QQbR2K9wBPF2Akny1RGs-ZZziUohE,1519
5
5
  rucio/cli/__init__.py,sha256=GIkHmxgE3xdvWSf-7ZnvVaJmbs7NokaSjbFzsrXOG9o,662
6
6
  rucio/cli/account.py,sha256=2Fe-iEaTfLxqlW5mDJsJPwD-Etm4VqaMowTSA67hZIo,9458
7
7
  rucio/cli/command.py,sha256=7jqBakwQOW7gORCLf63wrGOfzsQKdZbsc1TWUMmDH5s,11294
8
8
  rucio/cli/config.py,sha256=chcCxby1ET8YvoMx9IUIty0wVaZghISwEO_Ahe22ReA,3558
9
- rucio/cli/did.py,sha256=OfVO2Egjh-7woiw7xxDKCc_SwzVi1dZN66mS-LZ1Mxc,9026
9
+ rucio/cli/did.py,sha256=viwJC07AvEneC6_E307Q9nybWti-iYalwphNOpfQXLE,9041
10
10
  rucio/cli/download.py,sha256=kIB_n45egqBp4inVFmUXdofFAmlPkdAgxLTpPlG4WLM,6241
11
11
  rucio/cli/lifetime_exception.py,sha256=joi9HdaiYP_g3115IR_ImX7oFlEg1xbSaK-IzmoIVcY,1498
12
- rucio/cli/opendata.py,sha256=gAt6kyTXQUaQ6cv0XcB_9jmkYKavr3s3HCce84ywK7g,6580
13
- rucio/cli/replica.py,sha256=ZeknO6aKOambwe7lJGWcI_YAflz1-oMYBSZTYvMVIe0,8657
12
+ rucio/cli/opendata.py,sha256=UfUGDolu-d7hzlH26uhXk5YcD4HcF-R891GH11mwlLU,7329
13
+ rucio/cli/replica.py,sha256=qFsOyJjJM5GY-BctVcDCQpja7cNLcBZpBNd4S-SvaFw,8907
14
14
  rucio/cli/rse.py,sha256=J2IjCGUzvv9U0swFcU0ykZ1pYweHqTlXwmpGfSI-VgE,11490
15
- rucio/cli/rule.py,sha256=H_Yw8hx_DiqX_twEtgEY0x2AkftsRyLboMaXv_Zc6Ac,9090
16
- rucio/cli/scope.py,sha256=jzP9SK4IDKUrjWzE2Gs34I_gQpXnqmsBd6LbLuJI3QM,1698
15
+ rucio/cli/rule.py,sha256=3f-RP--CLdx5RrdIbgYYqvptb_oyZgAh1IVwmP5U83E,9032
16
+ rucio/cli/scope.py,sha256=uQFbjXDsPWv10fMd2jx9JauopkH7bKfILtzY4QF5I40,2060
17
17
  rucio/cli/subscription.py,sha256=kx1ox3OkWqdwfdflhdsv00XSYI6nnUZCp97YBZa4Aw4,4269
18
18
  rucio/cli/upload.py,sha256=29gJGfb7jsiA6-UwPCSg1kGZu-OJ-bdxUZr27S2mJEM,3237
19
- rucio/cli/utils.py,sha256=3WWzfXzircnK1FLEu5KzZAQZ_E9K9WGd0_AlNuQUmY0,11078
19
+ rucio/cli/utils.py,sha256=tCRTQxXIONkEarpA74NofHYh7HhKvQRC9ZtRc7C5vn8,11522
20
20
  rucio/cli/bin_legacy/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
21
- rucio/cli/bin_legacy/rucio.py,sha256=EprZpF5A7teDGH6aXIevMMM3vbs4mKE1LaqgcpqsCmg,140816
22
- rucio/cli/bin_legacy/rucio_admin.py,sha256=pRpJhEGMr3-xzw3EsGeVayEiu8NI_UxEI2wSIbeulzI,141046
21
+ rucio/cli/bin_legacy/rucio.py,sha256=6Md-5metJcOi3DVQRePwJpm_oZGtPN-jAy1FtKd91l8,141174
22
+ rucio/cli/bin_legacy/rucio_admin.py,sha256=G0tQPe83otuTdIDjQb3whi2zsrplE5R9lddEX9yISNo,141436
23
23
  rucio/client/__init__.py,sha256=0-jkSlrJf-eqbN4swA5a07eaWd6_6JXPQPLXMs4A3iI,660
24
- rucio/client/accountclient.py,sha256=kScbVL9rR8pyZRmETOyz_gwffc7biaPriMgDnCLxA_0,18864
25
- rucio/client/accountlimitclient.py,sha256=SWYdRMAMibWLZOhFb3HBI9vLvmp2uYjEhtM2ej1iGzQ,6905
26
- rucio/client/baseclient.py,sha256=gXh1RfzpQfvsFFm74F82jareOD8k9IlUOVHwwqsFyxI,50798
24
+ rucio/client/accountclient.py,sha256=yimP_88XbHOpMnyEG6kT2i0x8x4ILpq8EeVs0O_o-as,19148
25
+ rucio/client/accountlimitclient.py,sha256=RwWfyddIT6iZt8PDHRSqrOvgI7-GGZiz1kE4m1zGOtQ,6997
26
+ rucio/client/baseclient.py,sha256=jJ8x-EYTM_zONHGU-B7sg-cJDm1KCd6iVj0lyV2hB_s,51172
27
27
  rucio/client/client.py,sha256=npg0pFWzqnmnObjFO7QDdSkH1O0jrY-HglXEVfDrWNY,4493
28
- rucio/client/configclient.py,sha256=l-0kjkrAQXhzV78CPtqduzp7lgonnAl65wmtUflf9Dc,5493
29
- rucio/client/credentialclient.py,sha256=q4i_t-dIiojRmiY70iuJsAgnPqaZVwkJLbThxoc8_9k,2214
30
- rucio/client/didclient.py,sha256=66ODAQnrtvwwSo0Cu9FpCRo_36N28tHtUjbrz92hu_c,34619
31
- rucio/client/diracclient.py,sha256=MQCY0UxgXXlosL9-dKB469wkZ9XLgPs4dPsuEFfk4Rc,4465
32
- rucio/client/downloadclient.py,sha256=FoNTNNpry_2qo4XLIQXn7_AsnzLt9XllLB_J0UYTI7k,91687
33
- rucio/client/exportclient.py,sha256=xYbDSw5ZQlANjcbs2-CG4jVcyhxNm9GQ827_dokSJes,3310
34
- rucio/client/importclient.py,sha256=KeEWZhjrsAR5Km_UXwwH7hzgEo9ACJaJXN6de87txe4,1560
35
- rucio/client/lifetimeclient.py,sha256=lAtAzia-UWMzzkcFGPQ72kaiSe1iIbIaCBrxK0bD3GQ,5958
36
- rucio/client/lockclient.py,sha256=zQKaGskTeaqH9TBpLQzHe20Qaaor2jZ84LBINElDBAM,4421
37
- rucio/client/metaconventionsclient.py,sha256=tYvqXtcByiINcmZe0nT5Id2VuyJ2EDDUP2vfOPO6_yY,5655
38
- rucio/client/opendataclient.py,sha256=x0ESKis92lwX_lrB0nKukJy0qcvT7cZ5jWccoYxPVGg,9107
39
- rucio/client/pingclient.py,sha256=WU7jwbHoISky-ULw9h1_VqS0opRAM3j3RFnpWC7l48Y,2392
40
- rucio/client/replicaclient.py,sha256=Gi7vg87g4hhrW_UA9MB1FewGh67FW2wAnSWj4H9oMQk,20591
41
- rucio/client/requestclient.py,sha256=Vr1lAmAbfX2iGzj_aKRmRFPBpMXbVxIw_0LVAZ5Xtq0,8574
28
+ rucio/client/configclient.py,sha256=cy1yXDmtiNqlZrytF7GK9Pi5DB4-PO9VaiJn7ITLJi4,5595
29
+ rucio/client/credentialclient.py,sha256=9dvF6cAgf9hOTYuX-igzQOPdmMVCbjt97v4f7_yH_nE,2270
30
+ rucio/client/didclient.py,sha256=E9HusPPeQn4nhMrCtm0VsZtYlTAwAf5c9paSYuzPMjU,34969
31
+ rucio/client/diracclient.py,sha256=E5yGTkNdtBT5iYOAm81pT5lHHkEf0VSs40g1TB9VWwE,4521
32
+ rucio/client/downloadclient.py,sha256=Rs9x_s-kgiSuYtTHNX195Po6niPO3s25aOfHNVFYpEw,91781
33
+ rucio/client/exportclient.py,sha256=pCgjm-SbcZk5RZp2iOzAESdMeBeyVNYzQ1oModCvLfk,3366
34
+ rucio/client/importclient.py,sha256=9CHlLmgH59HBfm7zBe1TKiqNTmGar8SeIYiNZdkCFXU,1616
35
+ rucio/client/lifetimeclient.py,sha256=96MLiMv8ff1zMUnNe8OT6a12cUWIouG-dq4wBDUX-Jw,6037
36
+ rucio/client/lockclient.py,sha256=hluIjxQcitcrreZBjDwsYXI96Ceb9PjgAqPa7VP1lag,4523
37
+ rucio/client/metaconventionsclient.py,sha256=tQgFo65Pjxh0MZ4JZxpbwMm4fuzYP3hKVQnEjOtEAtE,5767
38
+ rucio/client/opendataclient.py,sha256=boJLaAySzQR8r13iGjn5ujx0K5VPI3A3e_IOW37JE8A,9249
39
+ rucio/client/pingclient.py,sha256=ZSxloZO6FRU6RkkNqow1tkTOfOzKHOW939LypQFEsE4,2448
40
+ rucio/client/replicaclient.py,sha256=n7m2oCjclF8uHpnYhIqZrGV7nZ-HiiXauygyQNbajDg,20834
41
+ rucio/client/requestclient.py,sha256=7N0RaZfuVegD40oQkekwn_UylVi3GljHAkxDezMMOs4,8659
42
42
  rucio/client/richclient.py,sha256=ArTHvnx0eJxRysfpBxnx0zaDI8ixgnfA_8vAegZQC2Y,10243
43
- rucio/client/rseclient.py,sha256=4R-WcCROjPRfWjcWuFM7itf4vmRRk0qvOa-itnTlZ8w,31858
44
- rucio/client/ruleclient.py,sha256=tlYRFMKVwjCuzketqg2F4XoGydbhNAjkOnm1BGUZEVg,13639
45
- rucio/client/scopeclient.py,sha256=-rXLdXScKeXavOaw9EwBHYo4SXwfcuqsOG6yGMIBWyM,3485
46
- rucio/client/subscriptionclient.py,sha256=gOTC5JfvdHJ6YUQdVWmrA-qgDMi1vnLkLlySiTAk-jw,9417
43
+ rucio/client/rseclient.py,sha256=zrXXMRIIENC6WmMPhNw4_JK_8XqqINt5TdB9ZYOQVus,32242
44
+ rucio/client/ruleclient.py,sha256=nFXZ2wC8UgbSTD0es7XHuY6szIDHCHDdZNAwABmgDts,13808
45
+ rucio/client/scopeclient.py,sha256=4_v2CJskpTwKrqLbECPqrXJvGtcuoURAVc8shoDmLkw,4822
46
+ rucio/client/subscriptionclient.py,sha256=B8oEQa_Dwh3gvydEYjEZXmSkjZY2EdbL7VZ0JXEDN1w,9513
47
47
  rucio/client/touchclient.py,sha256=LZXC2xI4QmmTTW4D1339sNXP1VwOKtxS-K7AaQwSlf4,2873
48
48
  rucio/client/uploadclient.py,sha256=pXsgzdQXDC8hcyA2lHvHkyrz1gCNsOADJuqS-gfLTFQ,72217
49
49
  rucio/common/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
@@ -52,14 +52,14 @@ rucio/common/cache.py,sha256=oa1WCodXpsmHzM-LJoYL7wQHw7VMU5I0g3TBg-VzEfo,3389
52
52
  rucio/common/checksum.py,sha256=nSqjY8TdDGohpAzcEM2fjv4FPdOKmKr_3U27HalKkoY,5254
53
53
  rucio/common/client.py,sha256=vHJ1gnHRBiXC2ZPfSgYPlsdJi0DbvwWDdHHMEOVgBvU,3129
54
54
  rucio/common/config.py,sha256=69AhxgP9SXXrlaTqlOCQiaiqGqHLhSfhRFasroGfDdc,24402
55
- rucio/common/constants.py,sha256=WhpUEh_L2AF35jL1yDO1yOPgiAWVgJxmYvD_F5Fwh6A,8029
55
+ rucio/common/constants.py,sha256=IdxXRvIltiJWz5qxxqpXZC1xum458-czxuot3PCtRXU,8535
56
56
  rucio/common/constraints.py,sha256=MrdiAwKyoaZGfspUWX_53XS2790nXMSMg1JYmTO_ciQ,726
57
- rucio/common/didtype.py,sha256=nXoyK740yrwsiGX9e9vOc8UX0PXRvKry67C0Sd8SpmM,8010
58
- rucio/common/exception.py,sha256=I90THVS-iNKCPl5zuBFGzsGuaQ4D6fx-n3ZevSl8z4U,36546
57
+ rucio/common/didtype.py,sha256=gk9Ewoh4wkeguouUNjAm-eS1PSDdPnkgxPXwKd4hm4U,8585
58
+ rucio/common/exception.py,sha256=kXltk7Zujf55L3h3v6iP0yfHXJIphbS7H67OS610Aig,37248
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
62
- rucio/common/plugins.py,sha256=A2koy6tXBPxE3lF89lBpbtg-d5Vn4bgg7osHt3Qd-Io,9664
62
+ rucio/common/plugins.py,sha256=SdPR8b7zpUJN2wMBnigG3_IJ9PgK8cfzkTSmpPnY2n8,9943
63
63
  rucio/common/policy.py,sha256=4i7SHyUpWxagS9nI72nBpWyfvYfz_aH6GH4lFMtDARo,3546
64
64
  rucio/common/stomp_utils.py,sha256=3GTiRTJ0roe5OX_wgkVwOJYAIhGgYbhiROHc2M8LQT8,5414
65
65
  rucio/common/stopwatch.py,sha256=_9zxoLjr8A0wUDJsljK4vZNDCI-dIOgpcxXiCNVJcHU,1641
@@ -88,18 +88,18 @@ rucio/rse/protocols/rfio.py,sha256=8TJ_60pWH7ragdNG9INz_oOK1LXLc-C43iENGAKfOEg,5
88
88
  rucio/rse/protocols/srm.py,sha256=9QFSORsXT-CR_6tDqyXCAQ5BzZifqaDItCYGIlTQGQI,14699
89
89
  rucio/rse/protocols/ssh.py,sha256=pHPAQx2bPNkMrtqbCqDfq7OXoy7XphQ-i2Stzdvnf1k,17506
90
90
  rucio/rse/protocols/storm.py,sha256=Z4fzklxG-x70A0Lugg1jE1RicwCSeF27iz0MXO-4to0,7864
91
- rucio/rse/protocols/webdav.py,sha256=8UzmBA8vF_-exoUvpIHRQLfhvAvExQsfu-P4WbXGOXI,24810
91
+ rucio/rse/protocols/webdav.py,sha256=axO_a4Z4nO6hlSAU1kUICXwUH-D0MrBYvdH3cHlFJuY,24978
92
92
  rucio/rse/protocols/xrootd.py,sha256=oJHueVR44dcW5nkg8jCbr9PetV9UIti3C0tka_m7yIk,12604
93
- rucio_clients-38.3.0.data/data/requirements.client.txt,sha256=ob8DW6vHurtEcXZ2j_u67WO_M2Mf7dzJFROKqIQINTo,1790
94
- rucio_clients-38.3.0.data/data/etc/rse-accounts.cfg.template,sha256=IfDnXVxBPUrMnTMbJnd3P7eYHgY1C4Kfz7xKskJs-FI,543
95
- rucio_clients-38.3.0.data/data/etc/rucio.cfg.atlas.client.template,sha256=aHP1oX9m5yA8xVTTT2Hz6AyOYu92-Bcd5LF0i3AZRQw,1350
96
- rucio_clients-38.3.0.data/data/etc/rucio.cfg.template,sha256=hKnGDIm7oIFWBhj6vr5L6bE4TDRHT-7eZh9IsqOHbpo,8023
97
- rucio_clients-38.3.0.data/data/rucio_client/merge_rucio_configs.py,sha256=u62K1EcCGydM5nZA30zhlqWo4EX5N87b_MDkx5YfzVI,6163
98
- rucio_clients-38.3.0.data/scripts/rucio,sha256=f8f5X6O9W2JfUqWiSdsuDROekGt28p9CBvFZropZ-C0,5260
99
- rucio_clients-38.3.0.data/scripts/rucio-admin,sha256=AhPO6-fAPviHObhB_Yi7GJXKfjpaH6m0RqxwctBeFlE,4229
100
- rucio_clients-38.3.0.dist-info/licenses/AUTHORS.rst,sha256=FQ5q2_bY3dYKDmEw-8YD-SgPJ4fgnM1XI5wRF5ksQPg,4771
101
- rucio_clients-38.3.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
102
- rucio_clients-38.3.0.dist-info/METADATA,sha256=uXRJ4c_TAzifO6vFNdXWtehgoSHuRXpT9kl_W1ZJUoI,1740
103
- rucio_clients-38.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
104
- rucio_clients-38.3.0.dist-info/top_level.txt,sha256=lJM8plwW0ePPICkwFnpYzfdqHnSv6JZr1OD4JEysPgM,6
105
- rucio_clients-38.3.0.dist-info/RECORD,,
93
+ rucio_clients-38.5.0.data/data/requirements.client.txt,sha256=ob8DW6vHurtEcXZ2j_u67WO_M2Mf7dzJFROKqIQINTo,1790
94
+ rucio_clients-38.5.0.data/data/etc/rse-accounts.cfg.template,sha256=IfDnXVxBPUrMnTMbJnd3P7eYHgY1C4Kfz7xKskJs-FI,543
95
+ rucio_clients-38.5.0.data/data/etc/rucio.cfg.atlas.client.template,sha256=aHP1oX9m5yA8xVTTT2Hz6AyOYu92-Bcd5LF0i3AZRQw,1350
96
+ rucio_clients-38.5.0.data/data/etc/rucio.cfg.template,sha256=ziIlTeKz8Qs55VDznjjnj5gRg0RSYegjLJdKZJfrIZg,7976
97
+ rucio_clients-38.5.0.data/data/rucio_client/merge_rucio_configs.py,sha256=u62K1EcCGydM5nZA30zhlqWo4EX5N87b_MDkx5YfzVI,6163
98
+ rucio_clients-38.5.0.data/scripts/rucio,sha256=f8f5X6O9W2JfUqWiSdsuDROekGt28p9CBvFZropZ-C0,5260
99
+ rucio_clients-38.5.0.data/scripts/rucio-admin,sha256=AhPO6-fAPviHObhB_Yi7GJXKfjpaH6m0RqxwctBeFlE,4229
100
+ rucio_clients-38.5.0.dist-info/licenses/AUTHORS.rst,sha256=FQ5q2_bY3dYKDmEw-8YD-SgPJ4fgnM1XI5wRF5ksQPg,4771
101
+ rucio_clients-38.5.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
102
+ rucio_clients-38.5.0.dist-info/METADATA,sha256=sg7xFDUMXTg0gcDLfmG7Aa2qZyX72rl_4lRMF5p8Q0A,1740
103
+ rucio_clients-38.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
104
+ rucio_clients-38.5.0.dist-info/top_level.txt,sha256=lJM8plwW0ePPICkwFnpYzfdqHnSv6JZr1OD4JEysPgM,6
105
+ rucio_clients-38.5.0.dist-info/RECORD,,