rucio-clients 32.8.6__py3-none-any.whl → 35.8.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 (92) hide show
  1. rucio/__init__.py +0 -1
  2. rucio/alembicrevision.py +1 -2
  3. rucio/client/__init__.py +0 -1
  4. rucio/client/accountclient.py +45 -25
  5. rucio/client/accountlimitclient.py +37 -9
  6. rucio/client/baseclient.py +199 -154
  7. rucio/client/client.py +2 -3
  8. rucio/client/configclient.py +19 -6
  9. rucio/client/credentialclient.py +9 -4
  10. rucio/client/didclient.py +238 -63
  11. rucio/client/diracclient.py +13 -5
  12. rucio/client/downloadclient.py +162 -51
  13. rucio/client/exportclient.py +4 -4
  14. rucio/client/fileclient.py +3 -4
  15. rucio/client/importclient.py +4 -4
  16. rucio/client/lifetimeclient.py +21 -5
  17. rucio/client/lockclient.py +18 -8
  18. rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
  19. rucio/client/pingclient.py +0 -1
  20. rucio/client/replicaclient.py +15 -5
  21. rucio/client/requestclient.py +35 -19
  22. rucio/client/rseclient.py +133 -51
  23. rucio/client/ruleclient.py +29 -22
  24. rucio/client/scopeclient.py +8 -6
  25. rucio/client/subscriptionclient.py +47 -35
  26. rucio/client/touchclient.py +8 -4
  27. rucio/client/uploadclient.py +166 -82
  28. rucio/common/__init__.py +0 -1
  29. rucio/common/cache.py +4 -4
  30. rucio/common/config.py +52 -47
  31. rucio/common/constants.py +69 -2
  32. rucio/common/constraints.py +0 -1
  33. rucio/common/didtype.py +24 -22
  34. rucio/common/exception.py +281 -222
  35. rucio/common/extra.py +0 -1
  36. rucio/common/logging.py +54 -38
  37. rucio/common/pcache.py +122 -101
  38. rucio/common/plugins.py +153 -0
  39. rucio/common/policy.py +4 -4
  40. rucio/common/schema/__init__.py +17 -10
  41. rucio/common/schema/atlas.py +7 -5
  42. rucio/common/schema/belleii.py +7 -5
  43. rucio/common/schema/domatpc.py +7 -5
  44. rucio/common/schema/escape.py +7 -5
  45. rucio/common/schema/generic.py +8 -6
  46. rucio/common/schema/generic_multi_vo.py +7 -5
  47. rucio/common/schema/icecube.py +7 -5
  48. rucio/common/stomp_utils.py +0 -1
  49. rucio/common/stopwatch.py +0 -1
  50. rucio/common/test_rucio_server.py +2 -2
  51. rucio/common/types.py +262 -17
  52. rucio/common/utils.py +743 -451
  53. rucio/rse/__init__.py +3 -4
  54. rucio/rse/protocols/__init__.py +0 -1
  55. rucio/rse/protocols/bittorrent.py +184 -0
  56. rucio/rse/protocols/cache.py +1 -2
  57. rucio/rse/protocols/dummy.py +1 -2
  58. rucio/rse/protocols/gfal.py +12 -10
  59. rucio/rse/protocols/globus.py +7 -7
  60. rucio/rse/protocols/gsiftp.py +2 -3
  61. rucio/rse/protocols/http_cache.py +1 -2
  62. rucio/rse/protocols/mock.py +1 -2
  63. rucio/rse/protocols/ngarc.py +1 -2
  64. rucio/rse/protocols/posix.py +12 -13
  65. rucio/rse/protocols/protocol.py +116 -52
  66. rucio/rse/protocols/rclone.py +6 -7
  67. rucio/rse/protocols/rfio.py +4 -5
  68. rucio/rse/protocols/srm.py +9 -10
  69. rucio/rse/protocols/ssh.py +8 -9
  70. rucio/rse/protocols/storm.py +2 -3
  71. rucio/rse/protocols/webdav.py +17 -14
  72. rucio/rse/protocols/xrootd.py +23 -17
  73. rucio/rse/rsemanager.py +19 -7
  74. rucio/vcsversion.py +4 -4
  75. rucio/version.py +5 -13
  76. rucio_clients-35.8.0.data/data/requirements.client.txt +15 -0
  77. {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/rucio_client/merge_rucio_configs.py +2 -5
  78. {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/scripts/rucio +87 -85
  79. {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/scripts/rucio-admin +45 -32
  80. {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/METADATA +13 -13
  81. rucio_clients-35.8.0.dist-info/RECORD +88 -0
  82. {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/WHEEL +1 -1
  83. {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
  84. rucio/common/schema/cms.py +0 -478
  85. rucio/common/schema/lsst.py +0 -423
  86. rucio_clients-32.8.6.data/data/requirements.txt +0 -55
  87. rucio_clients-32.8.6.dist-info/RECORD +0 -88
  88. {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/etc/rse-accounts.cfg.template +0 -0
  89. {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/etc/rucio.cfg.atlas.client.template +0 -0
  90. {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/etc/rucio.cfg.template +0 -0
  91. {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/licenses/LICENSE +0 -0
  92. {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,11 +15,11 @@
16
15
  import os
17
16
  import sys
18
17
  import xml.etree.ElementTree as ET
19
- from typing import Optional
18
+ from dataclasses import dataclass
19
+ from typing import Any, Optional
20
20
  from urllib.parse import urlparse
21
21
 
22
22
  import requests
23
- from dataclasses import dataclass
24
23
  from requests.adapters import HTTPAdapter
25
24
  from urllib3.poolmanager import PoolManager
26
25
 
@@ -40,7 +39,7 @@ class TLSHTTPAdapter(HTTPAdapter):
40
39
  ca_cert_dir="/etc/grid-security/certificates")
41
40
 
42
41
 
43
- class UploadInChunks(object):
42
+ class UploadInChunks:
44
43
  '''
45
44
  Class to upload by chunks.
46
45
  '''
@@ -73,7 +72,7 @@ class UploadInChunks(object):
73
72
  return self.__totalsize
74
73
 
75
74
 
76
- class IterableToFileAdapter(object):
75
+ class IterableToFileAdapter:
77
76
  '''
78
77
  Class IterableToFileAdapter
79
78
  '''
@@ -134,7 +133,7 @@ class _PropfindResponse:
134
133
  """
135
134
 
136
135
  try:
137
- xml = ET.fromstring(document)
136
+ xml = ET.fromstring(document) # noqa: S314
138
137
  except ET.ParseError as ex:
139
138
  raise ValueError("Couldn't parse XML document") from ex
140
139
 
@@ -152,7 +151,7 @@ class Default(protocol.RSEProtocol):
152
151
 
153
152
  """ Implementing access to RSEs using the webDAV protocol."""
154
153
 
155
- def connect(self, credentials={}):
154
+ def connect(self, credentials: Optional[dict[str, Any]] = None) -> None:
156
155
  """ Establishes the actual connection to the referred RSE.
157
156
 
158
157
  :param credentials: Provides information to establish a connection
@@ -161,6 +160,7 @@ class Default(protocol.RSEProtocol):
161
160
 
162
161
  :raises RSEAccessDenied
163
162
  """
163
+ credentials = credentials or {}
164
164
  try:
165
165
  parse_url = urlparse(self.path2pfn(''))
166
166
  self.server = f'{parse_url.scheme}://{parse_url.netloc}'
@@ -185,12 +185,15 @@ class Default(protocol.RSEProtocol):
185
185
  # Trying to get the proxy from the default location
186
186
  proxy_path = '/tmp/x509up_u%s' % os.geteuid()
187
187
  if os.path.isfile(proxy_path):
188
- x509 = proxy_path
188
+ self.cert = (proxy_path, proxy_path)
189
189
  elif self.auth_token:
190
+ # If no proxy is found, we set the cert to None and use the auth_token
191
+ self.cert = None
190
192
  pass
191
193
  else:
192
194
  raise exception.RSEAccessDenied('X509_USER_PROXY is not set')
193
- self.cert = (x509, x509)
195
+ else:
196
+ self.cert = (x509, x509)
194
197
 
195
198
  try:
196
199
  self.timeout = credentials['timeout']
@@ -332,13 +335,13 @@ class Default(protocol.RSEProtocol):
332
335
  raise exception.RucioException(result.status_code, result.text)
333
336
  except requests.exceptions.ConnectionError as error:
334
337
  raise exception.ServiceUnavailable(error)
335
- except IOError as error:
338
+ except OSError as error:
336
339
  raise exception.SourceNotFound(error)
337
340
  except requests.exceptions.ConnectionError as error:
338
341
  raise exception.ServiceUnavailable(error)
339
342
  except requests.exceptions.ReadTimeout as error:
340
343
  raise exception.ServiceUnavailable(error)
341
- except IOError as error:
344
+ except OSError as error:
342
345
  raise exception.SourceNotFound(error)
343
346
 
344
347
  def rename(self, pfn, new_pfn):
@@ -479,7 +482,7 @@ class Default(protocol.RSEProtocol):
479
482
 
480
483
  :param path: path to file
481
484
 
482
- :raises ServiceUnavailable: if some generic error occured in the library.
485
+ :raises ServiceUnavailable: if some generic error occurred in the library.
483
486
  :raises SourceNotFound: if the source file was not found on the referred storage.
484
487
  :raises RSEAccessDenied: in case of permission issue.
485
488
 
@@ -528,13 +531,13 @@ class Default(protocol.RSEProtocol):
528
531
 
529
532
  :returns: a list with dict containing 'totalsize' and 'unusedsize'
530
533
 
531
- :raises ServiceUnavailable: if some generic error occured in the library.
534
+ :raises ServiceUnavailable: if some generic error occurred in the library.
532
535
  """
533
536
  endpoint_basepath = self.path2pfn('')
534
537
  headers = {'Depth': '0'}
535
538
 
536
539
  try:
537
- root = ET.fromstring(self.session.request('PROPFIND', endpoint_basepath, verify=False, headers=headers, cert=self.session.cert).text)
540
+ root = ET.fromstring(self.session.request('PROPFIND', endpoint_basepath, verify=False, headers=headers, cert=self.session.cert).text) # noqa: S314
538
541
  usedsize = root[0][1][0].find('{DAV:}quota-used-bytes').text
539
542
  try:
540
543
  unusedsize = root[0][1][0].find('{DAV:}quota-available-bytes').text
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,13 +16,20 @@ import logging
17
16
  import os
18
17
 
19
18
  from rucio.common import exception
20
- from rucio.common.utils import execute, PREFERRED_CHECKSUM
19
+ from rucio.common.utils import PREFERRED_CHECKSUM, execute
21
20
  from rucio.rse.protocols import protocol
22
21
 
23
22
 
24
23
  class Default(protocol.RSEProtocol):
25
24
  """ Implementing access to RSEs using the XRootD protocol using GSI authentication."""
26
25
 
26
+ @property
27
+ def _auth_env(self):
28
+ if self.auth_token:
29
+ return f"XrdSecPROTOCOL=ztn BEARER_TOKEN='{self.auth_token}'"
30
+ else:
31
+ return 'XrdSecPROTOCOL=gsi'
32
+
27
33
  def __init__(self, protocol_attr, rse_settings, logger=logging.log):
28
34
  """ Initializes the object with information about the referred RSE.
29
35
 
@@ -66,7 +72,7 @@ class Default(protocol.RSEProtocol):
66
72
  self.logger(logging.DEBUG, 'xrootd.exists: pfn: {}'.format(pfn))
67
73
  try:
68
74
  path = self.pfn2path(pfn)
69
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s stat %s' % (self.hostname, self.port, path)
75
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
70
76
  self.logger(logging.DEBUG, 'xrootd.exists: cmd: {}'.format(cmd))
71
77
  status, out, err = execute(cmd)
72
78
  if status != 0:
@@ -82,11 +88,11 @@ class Default(protocol.RSEProtocol):
82
88
 
83
89
  :param path: path to file
84
90
 
85
- :raises ServiceUnavailable: if some generic error occured in the library.
91
+ :raises ServiceUnavailable: if some generic error occurred in the library.
86
92
 
87
93
  :returns: a dict with two keys, filesize and an element of GLOBALLY_SUPPORTED_CHECKSUMS.
88
94
  """
89
- self.logger(logging.DEBUG, 'xrootd.stat: path: {}'.format(path))
95
+ self.logger(logging.DEBUG, f'xrootd.stat: path: {path}')
90
96
  ret = {}
91
97
  chsum = None
92
98
  if path.startswith('root:'):
@@ -94,7 +100,7 @@ class Default(protocol.RSEProtocol):
94
100
 
95
101
  try:
96
102
  # xrdfs stat for getting filesize
97
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s stat %s' % (self.hostname, self.port, path)
103
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} stat {path}'
98
104
  self.logger(logging.DEBUG, 'xrootd.stat: filesize cmd: {}'.format(cmd))
99
105
  status_stat, out, err = execute(cmd)
100
106
  if status_stat == 0:
@@ -106,7 +112,7 @@ class Default(protocol.RSEProtocol):
106
112
  break
107
113
 
108
114
  # xrdfs query checksum for getting checksum
109
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s query checksum %s' % (self.hostname, self.port, path)
115
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} query checksum {path}'
110
116
  self.logger(logging.DEBUG, 'xrootd.stat: checksum cmd: {}'.format(cmd))
111
117
  status_query, out, err = execute(cmd)
112
118
  if status_query == 0:
@@ -160,7 +166,7 @@ class Default(protocol.RSEProtocol):
160
166
  if not prefix.endswith('/'):
161
167
  prefix = ''.join([prefix, '/'])
162
168
 
163
- lfns = [lfns] if type(lfns) == dict else lfns
169
+ lfns = [lfns] if isinstance(lfns, dict) else lfns
164
170
  for lfn in lfns:
165
171
  scope, name = lfn['scope'], lfn['name']
166
172
  if 'path' in lfn and lfn['path'] is not None:
@@ -183,7 +189,7 @@ class Default(protocol.RSEProtocol):
183
189
  try:
184
190
  # The query stats call is not implemented on some xroot doors.
185
191
  # Workaround: fail, if server does not reply within 10 seconds for static config query
186
- cmd = 'XrdSecPROTOCOL=gsi XRD_REQUESTTIMEOUT=10 xrdfs %s:%s query config %s:%s' % (self.hostname, self.port, self.hostname, self.port)
192
+ cmd = f'{self._auth_env} XRD_REQUESTTIMEOUT=10 xrdfs {self.hostname}:{self.port} query config {self.hostname}:{self.port}'
187
193
  self.logger(logging.DEBUG, 'xrootd.connect: cmd: {}'.format(cmd))
188
194
  status, out, err = execute(cmd)
189
195
  if status != 0:
@@ -206,7 +212,7 @@ class Default(protocol.RSEProtocol):
206
212
  """
207
213
  self.logger(logging.DEBUG, 'xrootd.get: pfn: {}'.format(pfn))
208
214
  try:
209
- cmd = 'XrdSecPROTOCOL=gsi xrdcp -f %s %s' % (pfn, dest)
215
+ cmd = f'{self._auth_env} xrdcp -f {pfn} {dest}'
210
216
  self.logger(logging.DEBUG, 'xrootd.get: cmd: {}'.format(cmd))
211
217
  status, out, err = execute(cmd)
212
218
  if status == 54:
@@ -226,7 +232,7 @@ class Default(protocol.RSEProtocol):
226
232
  :param transfer_timeout: Transfer timeout (in seconds) - dummy
227
233
 
228
234
  :raises DestinationNotAccessible: if the destination storage was not accessible.
229
- :raises ServiceUnavailable: if some generic error occured in the library.
235
+ :raises ServiceUnavailable: if some generic error occurred in the library.
230
236
  :raises SourceNotFound: if the source file was not found on the referred storage.
231
237
  """
232
238
  self.logger(logging.DEBUG, 'xrootd.put: filename: {} target: {}'.format(filename, target))
@@ -237,7 +243,7 @@ class Default(protocol.RSEProtocol):
237
243
  if not os.path.exists(source_url):
238
244
  raise exception.SourceNotFound()
239
245
  try:
240
- cmd = 'XrdSecPROTOCOL=gsi xrdcp -f %s %s' % (source_url, path)
246
+ cmd = f'{self._auth_env} xrdcp -f {source_url} {path}'
241
247
  self.logger(logging.DEBUG, 'xrootd.put: cmd: {}'.format(cmd))
242
248
  status, out, err = execute(cmd)
243
249
  if status != 0:
@@ -251,7 +257,7 @@ class Default(protocol.RSEProtocol):
251
257
 
252
258
  :param pfn: Physical file name
253
259
 
254
- :raises ServiceUnavailable: if some generic error occured in the library.
260
+ :raises ServiceUnavailable: if some generic error occurred in the library.
255
261
  :raises SourceNotFound: if the source file was not found on the referred storage.
256
262
  """
257
263
  self.logger(logging.DEBUG, 'xrootd.delete: pfn: {}'.format(pfn))
@@ -259,7 +265,7 @@ class Default(protocol.RSEProtocol):
259
265
  raise exception.SourceNotFound()
260
266
  try:
261
267
  path = self.pfn2path(pfn)
262
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s rm %s' % (self.hostname, self.port, path)
268
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} rm {path}'
263
269
  self.logger(logging.DEBUG, 'xrootd.delete: cmd: {}'.format(cmd))
264
270
  status, out, err = execute(cmd)
265
271
  if status != 0:
@@ -273,7 +279,7 @@ class Default(protocol.RSEProtocol):
273
279
  :param pfn: Current physical file name
274
280
  :param new_pfn New physical file name
275
281
  :raises DestinationNotAccessible: if the destination storage was not accessible.
276
- :raises ServiceUnavailable: if some generic error occured in the library.
282
+ :raises ServiceUnavailable: if some generic error occurred in the library.
277
283
  :raises SourceNotFound: if the source file was not found on the referred storage.
278
284
  """
279
285
  self.logger(logging.DEBUG, 'xrootd.rename: pfn: {}'.format(pfn))
@@ -283,10 +289,10 @@ class Default(protocol.RSEProtocol):
283
289
  path = self.pfn2path(pfn)
284
290
  new_path = self.pfn2path(new_pfn)
285
291
  new_dir = new_path[:new_path.rindex('/') + 1]
286
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s mkdir -p %s' % (self.hostname, self.port, new_dir)
292
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mkdir -p {new_dir}'
287
293
  self.logger(logging.DEBUG, 'xrootd.stat: mkdir cmd: {}'.format(cmd))
288
294
  status, out, err = execute(cmd)
289
- cmd = 'XrdSecPROTOCOL=gsi xrdfs %s:%s mv %s %s' % (self.hostname, self.port, path, new_path)
295
+ cmd = f'{self._auth_env} xrdfs {self.hostname}:{self.port} mv {path} {new_path}'
290
296
  self.logger(logging.DEBUG, 'xrootd.stat: rename cmd: {}'.format(cmd))
291
297
  status, out, err = execute(cmd)
292
298
  if status != 0:
rucio/rse/rsemanager.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,15 +15,28 @@
16
15
  import copy
17
16
  import logging
18
17
  import random
18
+ from collections.abc import Callable
19
19
  from time import sleep
20
20
  from urllib.parse import urlparse
21
21
 
22
- from rucio.common import exception, utils, constants
23
- from rucio.common import types
22
+ from rucio.common import constants, exception, types, utils
24
23
  from rucio.common.config import config_get_int
24
+ from rucio.common.constants import RSE_SUPPORTED_PROTOCOL_OPERATIONS
25
25
  from rucio.common.constraints import STRING_TYPES
26
26
  from rucio.common.logging import formatted_logger
27
- from rucio.common.utils import make_valid_did, GLOBALLY_SUPPORTED_CHECKSUMS
27
+ from rucio.common.utils import GLOBALLY_SUPPORTED_CHECKSUMS, make_valid_did
28
+
29
+
30
+ def get_scope_protocol(vo: str = 'def') -> Callable:
31
+ """
32
+ Returns the callable protocol to translate the pfn to a name/scope pair
33
+
34
+ :returns:
35
+ Callable: Scope Parser function
36
+ """
37
+ from rucio.rse.protocols.protocol import RSEDeterministicScopeTranslation
38
+ translation = RSEDeterministicScopeTranslation(vo=vo)
39
+ return translation.parser
28
40
 
29
41
 
30
42
  def get_rse_info(rse=None, vo='def', rse_id=None, session=None) -> types.RSESettingsDict:
@@ -118,7 +130,7 @@ def _get_possible_protocols(rse_settings: types.RSESettingsDict, operation, sche
118
130
 
119
131
 
120
132
  def get_protocols_ordered(rse_settings: types.RSESettingsDict, operation, scheme=None, domain='wan', impl=None):
121
- if operation not in utils.rse_supported_protocol_operations():
133
+ if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
122
134
  raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
123
135
 
124
136
  if domain and domain not in utils.rse_supported_protocol_domains():
@@ -130,7 +142,7 @@ def get_protocols_ordered(rse_settings: types.RSESettingsDict, operation, scheme
130
142
 
131
143
 
132
144
  def select_protocol(rse_settings: types.RSESettingsDict, operation, scheme=None, domain='wan'):
133
- if operation not in utils.rse_supported_protocol_operations():
145
+ if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
134
146
  raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
135
147
 
136
148
  if domain and domain not in utils.rse_supported_protocol_domains():
@@ -158,7 +170,7 @@ def create_protocol(rse_settings: types.RSESettingsDict, operation, scheme=None,
158
170
 
159
171
  # Verify feasibility of Protocol
160
172
  operation = operation.lower()
161
- if operation not in utils.rse_supported_protocol_operations():
173
+ if operation not in RSE_SUPPORTED_PROTOCOL_OPERATIONS:
162
174
  raise exception.RSEOperationNotSupported('Operation %s is not supported' % operation)
163
175
 
164
176
  if domain and domain not in utils.rse_supported_protocol_domains():
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': '32.8.6',
8
- 'branch_nick': 'release-32-LTS',
9
- 'revision_id': 'ce0d5e6a899547293697ca2d6b5f6d40467c9d8e',
10
- 'revno': 12667
7
+ 'version': '35.8.0',
8
+ 'branch_nick': 'release-35-LTS',
9
+ 'revision_id': '8a304950325b8afa9499d3acccb176ef7f93fd07',
10
+ 'revno': 13205
11
11
  }
rucio/version.py CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,34 +12,27 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
16
- try:
17
- from rucio.vcsversion import VERSION_INFO
18
- except ImportError:
19
- VERSION_INFO = {'branch_nick': 'LOCALBRANCH', # NOQA
20
- 'revision_id': 'LOCALREVISION',
21
- 'version': 'VERSION',
22
- 'final': False,
23
- 'revno': 0}
15
+ from rucio.vcsversion import VERSION_INFO
24
16
 
25
17
  RUCIO_VERSION = [VERSION_INFO['version'], ]
26
18
  FINAL = VERSION_INFO['final'] # This becomes true at Release Candidate time
27
19
 
28
20
 
29
- def canonical_version_string():
21
+ def canonical_version_string() -> str:
30
22
  """ Get the canonical string """
31
23
  return '.'.join(filter(None, RUCIO_VERSION))
32
24
 
33
25
 
34
- def version_string():
26
+ def version_string() -> str:
35
27
  """ Get the version string """
36
28
  return canonical_version_string()
37
29
 
38
30
 
39
- def vcs_version_string():
31
+ def vcs_version_string() -> str:
40
32
  """ Get the VCS version string """
41
33
  return "%s:%s" % (VERSION_INFO['branch_nick'], VERSION_INFO['revision_id'])
42
34
 
43
35
 
44
- def version_string_with_vcs():
36
+ def version_string_with_vcs() -> str:
45
37
  """ Get the version string with VCS """
46
38
  return "%s-%s" % (canonical_version_string(), vcs_version_string())
@@ -0,0 +1,15 @@
1
+ # All dependencies needed to run rucio client should be defined here
2
+ requests>=2.32.2 # Python HTTP for Humans.
3
+ urllib3>=1.26.18 # HTTP library with thread-safe connection pooling, file post, etc.
4
+ dogpile-cache>=1.2.2 # Caching API plugins (1.1.2 is the first version to support pymemcache)
5
+ tabulate>=0.9.0 # Pretty-print tabular data
6
+ jsonschema>=4.20.0 # For JSON schema validation (Policy modules)
7
+
8
+ # All dependencies needed in extras for rucio client should be defined here
9
+ paramiko>=3.4.1 # ssh_extras; SSH2 protocol library (also needed in the server)
10
+ kerberos>=1.3.1 # kerberos_extras for client and server
11
+ pykerberos>=1.2.4 # kerberos_extras for client and server
12
+ requests-kerberos>=0.14.0 # kerberos_extras for client and server
13
+ python-swiftclient>=4.4.0 # swift_extras
14
+ argcomplete>=3.1.6 # argcomplete_extras; Bash tab completion for argparse
15
+ python-magic>=0.4.27 # dumper_extras; File type identification using libmagic
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,12 +13,11 @@
14
13
  # limitations under the License.
15
14
 
16
15
  import argparse
16
+ import json
17
17
  import logging
18
- from pathlib import Path
19
-
20
18
  import os
21
- import json
22
19
  import sys
20
+ from pathlib import Path
23
21
 
24
22
  try:
25
23
  import yaml
@@ -27,7 +25,6 @@ except ImportError:
27
25
  yaml = None
28
26
  import configparser
29
27
 
30
-
31
28
  # Multi-word sections used in kubernetes are slightly different from what rucio expects.
32
29
  # Usually, it's just a .replace('-', '_'), but not for hermes2, which doesn't follow any convention.
33
30
  multi_word_sections = {