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.
- rucio/__init__.py +0 -1
- rucio/alembicrevision.py +1 -2
- rucio/client/__init__.py +0 -1
- rucio/client/accountclient.py +45 -25
- rucio/client/accountlimitclient.py +37 -9
- rucio/client/baseclient.py +199 -154
- rucio/client/client.py +2 -3
- rucio/client/configclient.py +19 -6
- rucio/client/credentialclient.py +9 -4
- rucio/client/didclient.py +238 -63
- rucio/client/diracclient.py +13 -5
- rucio/client/downloadclient.py +162 -51
- rucio/client/exportclient.py +4 -4
- rucio/client/fileclient.py +3 -4
- rucio/client/importclient.py +4 -4
- rucio/client/lifetimeclient.py +21 -5
- rucio/client/lockclient.py +18 -8
- rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
- rucio/client/pingclient.py +0 -1
- rucio/client/replicaclient.py +15 -5
- rucio/client/requestclient.py +35 -19
- rucio/client/rseclient.py +133 -51
- rucio/client/ruleclient.py +29 -22
- rucio/client/scopeclient.py +8 -6
- rucio/client/subscriptionclient.py +47 -35
- rucio/client/touchclient.py +8 -4
- rucio/client/uploadclient.py +166 -82
- rucio/common/__init__.py +0 -1
- rucio/common/cache.py +4 -4
- rucio/common/config.py +52 -47
- rucio/common/constants.py +69 -2
- rucio/common/constraints.py +0 -1
- rucio/common/didtype.py +24 -22
- rucio/common/exception.py +281 -222
- rucio/common/extra.py +0 -1
- rucio/common/logging.py +54 -38
- rucio/common/pcache.py +122 -101
- rucio/common/plugins.py +153 -0
- rucio/common/policy.py +4 -4
- rucio/common/schema/__init__.py +17 -10
- rucio/common/schema/atlas.py +7 -5
- rucio/common/schema/belleii.py +7 -5
- rucio/common/schema/domatpc.py +7 -5
- rucio/common/schema/escape.py +7 -5
- rucio/common/schema/generic.py +8 -6
- rucio/common/schema/generic_multi_vo.py +7 -5
- rucio/common/schema/icecube.py +7 -5
- rucio/common/stomp_utils.py +0 -1
- rucio/common/stopwatch.py +0 -1
- rucio/common/test_rucio_server.py +2 -2
- rucio/common/types.py +262 -17
- rucio/common/utils.py +743 -451
- rucio/rse/__init__.py +3 -4
- rucio/rse/protocols/__init__.py +0 -1
- rucio/rse/protocols/bittorrent.py +184 -0
- rucio/rse/protocols/cache.py +1 -2
- rucio/rse/protocols/dummy.py +1 -2
- rucio/rse/protocols/gfal.py +12 -10
- rucio/rse/protocols/globus.py +7 -7
- rucio/rse/protocols/gsiftp.py +2 -3
- rucio/rse/protocols/http_cache.py +1 -2
- rucio/rse/protocols/mock.py +1 -2
- rucio/rse/protocols/ngarc.py +1 -2
- rucio/rse/protocols/posix.py +12 -13
- rucio/rse/protocols/protocol.py +116 -52
- rucio/rse/protocols/rclone.py +6 -7
- rucio/rse/protocols/rfio.py +4 -5
- rucio/rse/protocols/srm.py +9 -10
- rucio/rse/protocols/ssh.py +8 -9
- rucio/rse/protocols/storm.py +2 -3
- rucio/rse/protocols/webdav.py +17 -14
- rucio/rse/protocols/xrootd.py +23 -17
- rucio/rse/rsemanager.py +19 -7
- rucio/vcsversion.py +4 -4
- rucio/version.py +5 -13
- rucio_clients-35.8.0.data/data/requirements.client.txt +15 -0
- {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/rucio_client/merge_rucio_configs.py +2 -5
- {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/scripts/rucio +87 -85
- {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/scripts/rucio-admin +45 -32
- {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/METADATA +13 -13
- rucio_clients-35.8.0.dist-info/RECORD +88 -0
- {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/WHEEL +1 -1
- {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
- rucio/common/schema/cms.py +0 -478
- rucio/common/schema/lsst.py +0 -423
- rucio_clients-32.8.6.data/data/requirements.txt +0 -55
- rucio_clients-32.8.6.dist-info/RECORD +0 -88
- {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/etc/rse-accounts.cfg.template +0 -0
- {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/etc/rucio.cfg.template +0 -0
- {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/licenses/LICENSE +0 -0
- {rucio_clients-32.8.6.dist-info → rucio_clients-35.8.0.dist-info}/top_level.txt +0 -0
rucio/rse/protocols/webdav.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,11 +15,11 @@
|
|
|
16
15
|
import os
|
|
17
16
|
import sys
|
|
18
17
|
import xml.etree.ElementTree as ET
|
|
19
|
-
from
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
rucio/rse/protocols/xrootd.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");
|
|
@@ -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
|
|
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 = '
|
|
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
|
|
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: {}'
|
|
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 = '
|
|
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 = '
|
|
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
|
|
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 = '
|
|
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 = '
|
|
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
|
|
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 = '
|
|
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
|
|
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 = '
|
|
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
|
|
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 = '
|
|
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 = '
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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': '
|
|
8
|
-
'branch_nick': 'release-
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
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
|
-
|
|
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
|
{rucio_clients-32.8.6.data → rucio_clients-35.8.0.data}/data/rucio_client/merge_rucio_configs.py
RENAMED
|
@@ -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 = {
|