rucio-clients 38.2.0__py3-none-any.whl → 38.4.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 +26 -23
  2. rucio/cli/command.py +36 -26
  3. rucio/cli/config.py +22 -7
  4. rucio/cli/did.py +2 -2
  5. rucio/cli/download.py +1 -1
  6. rucio/cli/opendata.py +78 -10
  7. rucio/cli/utils.py +13 -1
  8. rucio/client/accountclient.py +20 -19
  9. rucio/client/accountlimitclient.py +5 -4
  10. rucio/client/baseclient.py +25 -25
  11. rucio/client/configclient.py +29 -5
  12. rucio/client/credentialclient.py +2 -1
  13. rucio/client/didclient.py +33 -32
  14. rucio/client/diracclient.py +2 -1
  15. rucio/client/exportclient.py +2 -1
  16. rucio/client/importclient.py +2 -1
  17. rucio/client/lifetimeclient.py +3 -2
  18. rucio/client/lockclient.py +4 -3
  19. rucio/client/metaconventionsclient.py +5 -4
  20. rucio/client/opendataclient.py +8 -7
  21. rucio/client/pingclient.py +2 -1
  22. rucio/client/replicaclient.py +27 -26
  23. rucio/client/requestclient.py +8 -8
  24. rucio/client/richclient.py +6 -0
  25. rucio/client/rseclient.py +31 -28
  26. rucio/client/ruleclient.py +13 -12
  27. rucio/client/scopeclient.py +4 -3
  28. rucio/client/subscriptionclient.py +6 -5
  29. rucio/common/constants.py +23 -0
  30. rucio/common/exception.py +30 -0
  31. rucio/common/plugins.py +33 -15
  32. rucio/common/utils.py +3 -3
  33. rucio/rse/protocols/webdav.py +5 -2
  34. rucio/rse/translation.py +3 -3
  35. rucio/vcsversion.py +3 -3
  36. {rucio_clients-38.2.0.dist-info → rucio_clients-38.4.0.dist-info}/METADATA +1 -1
  37. {rucio_clients-38.2.0.dist-info → rucio_clients-38.4.0.dist-info}/RECORD +48 -48
  38. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/data/etc/rse-accounts.cfg.template +0 -0
  39. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/data/etc/rucio.cfg.atlas.client.template +0 -0
  40. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/data/etc/rucio.cfg.template +0 -0
  41. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/data/requirements.client.txt +0 -0
  42. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/data/rucio_client/merge_rucio_configs.py +0 -0
  43. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/scripts/rucio +0 -0
  44. {rucio_clients-38.2.0.data → rucio_clients-38.4.0.data}/scripts/rucio-admin +0 -0
  45. {rucio_clients-38.2.0.dist-info → rucio_clients-38.4.0.dist-info}/WHEEL +0 -0
  46. {rucio_clients-38.2.0.dist-info → rucio_clients-38.4.0.dist-info}/licenses/AUTHORS.rst +0 -0
  47. {rucio_clients-38.2.0.dist-info → rucio_clients-38.4.0.dist-info}/licenses/LICENSE +0 -0
  48. {rucio_clients-38.2.0.dist-info → rucio_clients-38.4.0.dist-info}/top_level.txt +0 -0
@@ -19,6 +19,7 @@ from urllib.parse import quote_plus
19
19
  from requests.status_codes import codes
20
20
 
21
21
  from rucio.client.baseclient import BaseClient, choice
22
+ from rucio.common.constants import HTTPMethod
22
23
  from rucio.common.utils import build_url
23
24
 
24
25
  if TYPE_CHECKING:
@@ -63,7 +64,7 @@ class MetaConventionClient(BaseClient):
63
64
  'value_regexp': value_regexp,
64
65
  'key_type': key_type})
65
66
 
66
- r = self._send_request(url, type_='POST', data=data)
67
+ r = self._send_request(url, method=HTTPMethod.POST, data=data)
67
68
 
68
69
  if r.status_code == codes.created:
69
70
  return True
@@ -81,7 +82,7 @@ class MetaConventionClient(BaseClient):
81
82
  """
82
83
  path = self.META_BASEURL + '/'
83
84
  url = build_url(choice(self.list_hosts), path=path)
84
- r = self._send_request(url)
85
+ r = self._send_request(url, method=HTTPMethod.GET)
85
86
  if r.status_code == codes.ok:
86
87
  keys = loads(r.text)
87
88
  return keys
@@ -99,7 +100,7 @@ class MetaConventionClient(BaseClient):
99
100
  """
100
101
  path = '/'.join([self.META_BASEURL, quote_plus(key)]) + '/'
101
102
  url = build_url(choice(self.list_hosts), path=path)
102
- r = self._send_request(url)
103
+ r = self._send_request(url, method=HTTPMethod.GET)
103
104
  if r.status_code == codes.ok:
104
105
  values = loads(r.text)
105
106
  return values
@@ -131,7 +132,7 @@ class MetaConventionClient(BaseClient):
131
132
  path = '/'.join([self.META_BASEURL, quote_plus(key)]) + '/'
132
133
  data = dumps({'value': value})
133
134
  url = build_url(choice(self.list_hosts), path=path)
134
- r = self._send_request(url, type_='POST', data=data)
135
+ r = self._send_request(url, method=HTTPMethod.POST, data=data)
135
136
  if r.status_code == codes.created:
136
137
  return True
137
138
  else:
@@ -20,6 +20,7 @@ from requests.status_codes import codes
20
20
 
21
21
  from rucio.client.baseclient import BaseClient, choice
22
22
  from rucio.common.config import config_get
23
+ from rucio.common.constants import HTTPMethod
23
24
  from rucio.common.utils import build_url, render_json
24
25
 
25
26
  if TYPE_CHECKING:
@@ -85,7 +86,7 @@ class OpenDataClient(BaseClient):
85
86
  raise ValueError('state and public cannot be provided at the same time.')
86
87
 
87
88
  url = build_url(self.get_opendata_host(public=public), path=path)
88
- r = self._send_request(url, type_='GET', params=params)
89
+ r = self._send_request(url, method=HTTPMethod.GET, params=params)
89
90
  if r.status_code == codes.ok:
90
91
  return json.loads(r.content.decode('utf-8'))
91
92
  else:
@@ -115,7 +116,7 @@ class OpenDataClient(BaseClient):
115
116
  path = '/'.join([self.opendata_private_dids_base_url, quote_plus(scope), quote_plus(name)])
116
117
  url = build_url(self.get_opendata_host(public=False), path=path)
117
118
 
118
- r = self._send_request(url, type_='POST')
119
+ r = self._send_request(url, method=HTTPMethod.POST)
119
120
 
120
121
  if r.status_code == codes.created:
121
122
  return True
@@ -146,7 +147,7 @@ class OpenDataClient(BaseClient):
146
147
  path = '/'.join([self.opendata_private_dids_base_url, quote_plus(scope), quote_plus(name)])
147
148
  url = build_url(self.get_opendata_host(public=False), path=path)
148
149
 
149
- r = self._send_request(url, type_='DEL')
150
+ r = self._send_request(url, method=HTTPMethod.DELETE)
150
151
 
151
152
  if r.status_code == codes.no_content:
152
153
  return True
@@ -162,7 +163,7 @@ class OpenDataClient(BaseClient):
162
163
  state: Optional["OPENDATA_DID_STATE_LITERAL"] = None,
163
164
  meta: Optional[dict] = None,
164
165
  doi: Optional[str] = None,
165
- ) -> bool:
166
+ ) -> dict[str, Any]:
166
167
  """
167
168
  Update an existing Opendata DID in the Opendata catalog.
168
169
 
@@ -198,10 +199,10 @@ class OpenDataClient(BaseClient):
198
199
  if doi is not None:
199
200
  data['doi'] = doi
200
201
 
201
- r = self._send_request(url, type_='PUT', data=render_json(**data))
202
+ r = self._send_request(url, method=HTTPMethod.PUT, data=render_json(**data))
202
203
 
203
204
  if r.status_code == codes.ok:
204
- return True
205
+ return json.loads(r.content.decode('utf-8'))
205
206
  else:
206
207
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
207
208
  raise exc_cls(exc_msg)
@@ -236,7 +237,7 @@ class OpenDataClient(BaseClient):
236
237
  path = '/'.join([base_url, quote_plus(scope), quote_plus(name)])
237
238
  url = build_url(self.get_opendata_host(public=public), path=path)
238
239
 
239
- r = self._send_request(url, type_='GET', params={
240
+ r = self._send_request(url, method=HTTPMethod.GET, params={
240
241
  'files': 1 if include_files else 0,
241
242
  'meta': 1 if include_metadata else 0,
242
243
  'doi': 1 if include_doi else 0,
@@ -18,6 +18,7 @@ from typing import Any
18
18
  from requests.status_codes import codes
19
19
 
20
20
  from rucio.client.baseclient import BaseClient
21
+ from rucio.common.constants import HTTPMethod
21
22
  from rucio.common.utils import build_url
22
23
 
23
24
 
@@ -67,7 +68,7 @@ class PingClient(BaseClient):
67
68
  headers = None
68
69
  path = 'ping'
69
70
  url = build_url(self.host, path=path)
70
- r = self._send_request(url, headers=headers, type_='GET')
71
+ r = self._send_request(url, headers=headers, method=HTTPMethod.GET)
71
72
 
72
73
  if r.status_code == codes.ok:
73
74
  server_info = loads(r.text)
@@ -20,6 +20,7 @@ from urllib.parse import quote_plus
20
20
  from requests.status_codes import codes
21
21
 
22
22
  from rucio.client.baseclient import BaseClient, choice
23
+ from rucio.common.constants import HTTPMethod
23
24
  from rucio.common.utils import build_url, chunks, render_json
24
25
 
25
26
 
@@ -50,7 +51,7 @@ class ReplicaClient(BaseClient):
50
51
  headers = {}
51
52
  for chunk in chunks(replicas, self.REPLICAS_CHUNK_SIZE):
52
53
  data = {'rse': rse, 'rse_id': rse_id, 'replicas': chunk}
53
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data))
54
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data))
54
55
  if r.status_code != codes.ok:
55
56
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
56
57
  raise exc_cls(exc_msg)
@@ -74,12 +75,12 @@ class ReplicaClient(BaseClient):
74
75
  Dictionary of the form {"rse_name": ["did: error",...]} - list of strings for DIDs failed to declare, by RSE
75
76
  """
76
77
 
77
- out = {} # {rse: ["did: error text",...]}
78
+ out = {} # {rse: ["did: error text",...]}
78
79
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'bad']))
79
80
  headers = {}
80
81
  for chunk in chunks(replicas, self.REPLICAS_CHUNK_SIZE):
81
82
  data = {'reason': reason, 'replicas': chunk, 'force': force}
82
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data))
83
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data))
83
84
  if r.status_code not in (codes.created, codes.ok):
84
85
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
85
86
  raise exc_cls(exc_msg)
@@ -105,7 +106,7 @@ class ReplicaClient(BaseClient):
105
106
  data = {'reason': reason, 'rse': rse, 'dids': dids}
106
107
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'bad/dids']))
107
108
  headers = {}
108
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data))
109
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data))
109
110
  if r.status_code == codes.created:
110
111
  return loads(r.text)
111
112
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -126,7 +127,7 @@ class ReplicaClient(BaseClient):
126
127
  data = {'reason': reason, 'pfns': pfns}
127
128
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'suspicious']))
128
129
  headers = {}
129
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data))
130
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data))
130
131
  if r.status_code == codes.created:
131
132
  return loads(r.text)
132
133
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -146,7 +147,7 @@ class ReplicaClient(BaseClient):
146
147
  data = {'rse': rse, 'pfns': pfns}
147
148
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'dids']))
148
149
  headers = {}
149
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data))
150
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data))
150
151
  if r.status_code == codes.ok:
151
152
  return self._load_json_data(r)
152
153
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -243,7 +244,7 @@ class ReplicaClient(BaseClient):
243
244
  headers['Accept'] = 'application/metalink4+xml'
244
245
 
245
246
  # pass json dict in querystring
246
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data), stream=True)
247
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data), stream=True)
247
248
  if r.status_code == codes.ok:
248
249
  if not metalink:
249
250
  return self._load_json_data(r)
@@ -278,22 +279,22 @@ class ReplicaClient(BaseClient):
278
279
 
279
280
  url = build_url(choice(self.list_hosts),
280
281
  path='/'.join([self.REPLICAS_BASEURL, 'suspicious']))
281
- r = self._send_request(url, type_='GET', params=params)
282
+ r = self._send_request(url, method=HTTPMethod.GET, params=params)
282
283
  if r.status_code == codes.ok:
283
284
  return self._load_json_data(r)
284
285
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
285
286
  raise exc_cls(exc_msg)
286
287
 
287
288
  def add_replica(
288
- self,
289
- rse: str,
290
- scope: str,
291
- name: str,
292
- bytes_: int,
293
- adler32: str,
294
- pfn: Optional[str] = None,
295
- md5: Optional[str] = None,
296
- meta: Optional[dict[str, Any]] = None
289
+ self,
290
+ rse: str,
291
+ scope: str,
292
+ name: str,
293
+ bytes_: int,
294
+ adler32: str,
295
+ pfn: Optional[str] = None,
296
+ md5: Optional[str] = None,
297
+ meta: Optional[dict[str, Any]] = None
297
298
  ) -> bool:
298
299
  """
299
300
  Add file replicas to a RSE.
@@ -350,7 +351,7 @@ class ReplicaClient(BaseClient):
350
351
  """
351
352
  url = build_url(choice(self.list_hosts), path=self.REPLICAS_BASEURL)
352
353
  data = {'rse': rse, 'files': files, 'ignore_availability': ignore_availability}
353
- r = self._send_request(url, type_='POST', data=render_json(**data))
354
+ r = self._send_request(url, method=HTTPMethod.POST, data=render_json(**data))
354
355
  if r.status_code == codes.created:
355
356
  return True
356
357
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -375,7 +376,7 @@ class ReplicaClient(BaseClient):
375
376
  """
376
377
  url = build_url(choice(self.list_hosts), path=self.REPLICAS_BASEURL)
377
378
  data = {'rse': rse, 'files': files, 'ignore_availability': ignore_availability}
378
- r = self._send_request(url, type_='DEL', data=render_json(**data))
379
+ r = self._send_request(url, method=HTTPMethod.DELETE, data=render_json(**data))
379
380
  if r.status_code == codes.ok:
380
381
  return True
381
382
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -408,7 +409,7 @@ class ReplicaClient(BaseClient):
408
409
  """
409
410
  url = build_url(choice(self.list_hosts), path=self.REPLICAS_BASEURL)
410
411
  data = {'rse': rse, 'files': files}
411
- r = self._send_request(url, type_='PUT', data=render_json(**data))
412
+ r = self._send_request(url, method=HTTPMethod.PUT, data=render_json(**data))
412
413
  if r.status_code == codes.ok:
413
414
  return True
414
415
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -438,7 +439,7 @@ class ReplicaClient(BaseClient):
438
439
  url = build_url(self.host,
439
440
  path='/'.join([self.REPLICAS_BASEURL, quote_plus(scope), quote_plus(name), 'datasets']),
440
441
  params=payload)
441
- r = self._send_request(url, type_='GET')
442
+ r = self._send_request(url, method=HTTPMethod.GET)
442
443
  if r.status_code == codes.ok:
443
444
  return self._load_json_data(r)
444
445
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -459,7 +460,7 @@ class ReplicaClient(BaseClient):
459
460
  """
460
461
  payload = {'dids': list(dids)}
461
462
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'datasets_bulk']))
462
- r = self._send_request(url, type_='POST', data=dumps(payload))
463
+ r = self._send_request(url, method=HTTPMethod.POST, data=dumps(payload))
463
464
  if r.status_code == codes.ok:
464
465
  return self._load_json_data(r)
465
466
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -493,7 +494,7 @@ class ReplicaClient(BaseClient):
493
494
  url = build_url(self.host,
494
495
  path='/'.join([self.REPLICAS_BASEURL, quote_plus(scope), quote_plus(name), 'datasets_vp']),
495
496
  params=payload)
496
- r = self._send_request(url, type_='GET')
497
+ r = self._send_request(url, method=HTTPMethod.GET)
497
498
  if r.status_code == codes.ok:
498
499
  return self._load_json_data(r)
499
500
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -516,7 +517,7 @@ class ReplicaClient(BaseClient):
516
517
  A list of dict dataset replicas
517
518
  """
518
519
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'rse', rse]))
519
- r = self._send_request(url, type_='GET')
520
+ r = self._send_request(url, method=HTTPMethod.GET)
520
521
  if r.status_code == codes.ok:
521
522
  return self._load_json_data(r)
522
523
 
@@ -545,7 +546,7 @@ class ReplicaClient(BaseClient):
545
546
  data = {'reason': reason, 'pfns': pfns, 'state': state, 'expires_at': expires_at}
546
547
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'bad/pfns']))
547
548
  headers = {}
548
- r = self._send_request(url, headers=headers, type_='POST', data=dumps(data))
549
+ r = self._send_request(url, headers=headers, method=HTTPMethod.POST, data=dumps(data))
549
550
  if r.status_code == codes.created:
550
551
  return True
551
552
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -562,7 +563,7 @@ class ReplicaClient(BaseClient):
562
563
  """
563
564
  url = build_url(self.host, path='/'.join([self.REPLICAS_BASEURL, 'tombstone']))
564
565
  data = {'replicas': replicas}
565
- r = self._send_request(url, type_='POST', data=render_json(**data))
566
+ r = self._send_request(url, method=HTTPMethod.POST, data=render_json(**data))
566
567
  if r.status_code == codes.created:
567
568
  return True
568
569
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -19,7 +19,7 @@ from urllib.parse import quote_plus
19
19
  from requests.status_codes import codes
20
20
 
21
21
  from rucio.client.baseclient import BaseClient, choice
22
- from rucio.common.constants import TransferLimitDirection
22
+ from rucio.common.constants import HTTPMethod, TransferLimitDirection
23
23
  from rucio.common.utils import build_url
24
24
 
25
25
  if TYPE_CHECKING:
@@ -45,7 +45,7 @@ class RequestClient(BaseClient):
45
45
  path = '/'.join([self.REQUEST_BASEURL, 'list']) + '?' + '&'.join(['src_rse={}'.format(src_rse), 'dst_rse={}'.format(
46
46
  dst_rse), 'request_states={}'.format(request_states)])
47
47
  url = build_url(choice(self.list_hosts), path=path)
48
- r = self._send_request(url, type_='GET')
48
+ r = self._send_request(url, method=HTTPMethod.GET)
49
49
 
50
50
  if r.status_code == codes.ok:
51
51
  return self._load_json_data(r)
@@ -70,7 +70,7 @@ class RequestClient(BaseClient):
70
70
  path = '/'.join([self.REQUEST_BASEURL, 'history', 'list']) + '?' + '&'.join(['src_rse={}'.format(src_rse), 'dst_rse={}'.format(
71
71
  dst_rse), 'request_states={}'.format(request_states), 'offset={}'.format(offset), 'limit={}'.format(limit)])
72
72
  url = build_url(choice(self.list_hosts), path=path)
73
- r = self._send_request(url, type_='GET')
73
+ r = self._send_request(url, method=HTTPMethod.GET)
74
74
 
75
75
  if r.status_code == codes.ok:
76
76
  return self._load_json_data(r)
@@ -106,7 +106,7 @@ class RequestClient(BaseClient):
106
106
  if scope is not None:
107
107
  path = '/'.join([self.REQUEST_BASEURL, quote_plus(scope), quote_plus(name), rse])
108
108
  url = build_url(choice(self.list_hosts), path=path)
109
- r = self._send_request(url, type_='GET')
109
+ r = self._send_request(url, method=HTTPMethod.GET)
110
110
 
111
111
  if r.status_code == codes.ok:
112
112
  return next(self._load_json_data(r))
@@ -144,7 +144,7 @@ class RequestClient(BaseClient):
144
144
  if scope is not None:
145
145
  path = '/'.join([self.REQUEST_BASEURL, 'history', quote_plus(scope), quote_plus(name), rse])
146
146
  url = build_url(choice(self.list_hosts), path=path)
147
- r = self._send_request(url, type_='GET')
147
+ r = self._send_request(url, method=HTTPMethod.GET)
148
148
 
149
149
  if r.status_code == codes.ok:
150
150
  return next(self._load_json_data(r))
@@ -161,7 +161,7 @@ class RequestClient(BaseClient):
161
161
  """
162
162
  path = '/'.join([self.REQUEST_BASEURL, 'transfer_limits'])
163
163
  url = build_url(choice(self.list_hosts), path=path)
164
- r = self._send_request(url, type_='GET')
164
+ r = self._send_request(url, method=HTTPMethod.GET)
165
165
 
166
166
  if r.status_code == codes.ok:
167
167
  return self._load_json_data(r)
@@ -201,7 +201,7 @@ class RequestClient(BaseClient):
201
201
  'direction': direction.value, 'max_transfers': max_transfers,
202
202
  'volume': volume, 'deadline': deadline, 'strategy': strategy,
203
203
  'transfers': transfers, 'waitings': waitings})
204
- r = self._send_request(url, type_='PUT', data=data)
204
+ r = self._send_request(url, method=HTTPMethod.PUT, data=data)
205
205
 
206
206
  if r.status_code == codes.created:
207
207
  return True
@@ -225,7 +225,7 @@ class RequestClient(BaseClient):
225
225
  path = '/'.join([self.REQUEST_BASEURL, 'transfer_limits'])
226
226
  url = build_url(choice(self.list_hosts), path=path)
227
227
  data = dumps({'rse_expression': rse_expression, 'activity': activity, 'direction': direction.value})
228
- r = self._send_request(url, type_='DEL', data=data)
228
+ r = self._send_request(url, method=HTTPMethod.DELETE, data=data)
229
229
 
230
230
  if r.status_code == codes.ok:
231
231
  return True
@@ -131,6 +131,12 @@ class CLITheme:
131
131
  'SERVICE': 'yellow'
132
132
  }
133
133
 
134
+ OPENDATA_DID_STATE = {
135
+ 'PUBLIC': 'bold green',
136
+ 'DRAFT': 'bold default',
137
+ 'SUSPENDED': 'bold red',
138
+ }
139
+
134
140
 
135
141
  def setup_rich_logger(
136
142
  module_name: Optional[str] = None,
rucio/client/rseclient.py CHANGED
@@ -19,6 +19,7 @@ from urllib.parse import quote
19
19
  from requests.status_codes import codes
20
20
 
21
21
  from rucio.client.baseclient import BaseClient, choice
22
+ from rucio.common.constants import HTTPMethod
22
23
  from rucio.common.utils import build_url
23
24
 
24
25
  if TYPE_CHECKING:
@@ -53,7 +54,7 @@ class RSEClient(BaseClient):
53
54
  path = '/'.join([self.RSE_BASEURL, rse])
54
55
  url = build_url(choice(self.list_hosts), path=path)
55
56
 
56
- r = self._send_request(url, type_='GET')
57
+ r = self._send_request(url, method=HTTPMethod.GET)
57
58
  if r.status_code == codes.ok:
58
59
  rse_dict = loads(r.text)
59
60
  return rse_dict
@@ -110,7 +111,7 @@ class RSEClient(BaseClient):
110
111
  """
111
112
  path = 'rses/' + rse
112
113
  url = build_url(choice(self.list_hosts), path=path)
113
- r = self._send_request(url, type_='POST', data=dumps(kwargs))
114
+ r = self._send_request(url, method=HTTPMethod.POST, data=dumps(kwargs))
114
115
  if r.status_code == codes.created:
115
116
  return True
116
117
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -129,7 +130,7 @@ class RSEClient(BaseClient):
129
130
  """
130
131
  path = 'rses/' + rse
131
132
  url = build_url(choice(self.list_hosts), path=path)
132
- r = self._send_request(url, type_='PUT', data=dumps(parameters))
133
+ r = self._send_request(url, method=HTTPMethod.PUT, data=dumps(parameters))
133
134
  if r.status_code == codes.created:
134
135
  return True
135
136
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -150,7 +151,7 @@ class RSEClient(BaseClient):
150
151
  """
151
152
  path = 'rses/' + rse
152
153
  url = build_url(choice(self.list_hosts), path=path)
153
- r = self._send_request(url, type_='DEL')
154
+ r = self._send_request(url, method=HTTPMethod.DELETE)
154
155
  if r.status_code == codes.ok:
155
156
  return True
156
157
  else:
@@ -175,7 +176,7 @@ class RSEClient(BaseClient):
175
176
  else:
176
177
  path = 'rses/'
177
178
  url = build_url(choice(self.list_hosts), path=path)
178
- r = self._send_request(url, type_='GET')
179
+ r = self._send_request(url, method=HTTPMethod.GET)
179
180
  if r.status_code == codes.ok:
180
181
  return self._load_json_data(r)
181
182
  else:
@@ -213,7 +214,7 @@ class RSEClient(BaseClient):
213
214
  url = build_url(choice(self.list_hosts), path=path)
214
215
  data = dumps({'value': value})
215
216
 
216
- r = self._send_request(url, type_='POST', data=data)
217
+ r = self._send_request(url, method=HTTPMethod.POST, data=data)
217
218
  if r.status_code == codes.created:
218
219
  return True
219
220
  else:
@@ -238,7 +239,7 @@ class RSEClient(BaseClient):
238
239
  path = '/'.join([self.RSE_BASEURL, rse, 'attr', key])
239
240
  url = build_url(choice(self.list_hosts), path=path)
240
241
 
241
- r = self._send_request(url, type_='DEL')
242
+ r = self._send_request(url, method=HTTPMethod.DELETE)
242
243
  if r.status_code == codes.ok:
243
244
  return True
244
245
  else:
@@ -260,7 +261,7 @@ class RSEClient(BaseClient):
260
261
  """
261
262
  path = '/'.join([self.RSE_BASEURL, rse, 'attr/'])
262
263
  url = build_url(choice(self.list_hosts), path=path)
263
- r = self._send_request(url, type_='GET')
264
+ r = self._send_request(url, method=HTTPMethod.GET)
264
265
  if r.status_code == codes.ok:
265
266
  attributes = loads(r.text)
266
267
  return attributes
@@ -306,7 +307,7 @@ class RSEClient(BaseClient):
306
307
  scheme = params['scheme']
307
308
  path = '/'.join([self.RSE_BASEURL, rse, 'protocols', scheme])
308
309
  url = build_url(choice(self.list_hosts), path=path)
309
- r = self._send_request(url, type_='POST', data=dumps(params))
310
+ r = self._send_request(url, method=HTTPMethod.POST, data=dumps(params))
310
311
  if r.status_code == codes.created:
311
312
  return True
312
313
  else:
@@ -366,7 +367,7 @@ class RSEClient(BaseClient):
366
367
  params['protocol_domain'] = protocol_domain
367
368
  url = build_url(choice(self.list_hosts), path=path, params=params)
368
369
 
369
- r = self._send_request(url, type_='GET')
370
+ r = self._send_request(url, method=HTTPMethod.GET)
370
371
  if r.status_code == codes.ok:
371
372
  protocols = loads(r.text)
372
373
  return protocols
@@ -426,7 +427,7 @@ class RSEClient(BaseClient):
426
427
 
427
428
  url = build_url(choice(self.list_hosts), path=path, params=params, doseq=True)
428
429
 
429
- r = self._send_request(url, type_='GET')
430
+ r = self._send_request(url, method=HTTPMethod.GET)
430
431
  if r.status_code == codes.ok:
431
432
  pfns = loads(r.text)
432
433
  return pfns
@@ -477,7 +478,7 @@ class RSEClient(BaseClient):
477
478
 
478
479
  path = '/'.join(path)
479
480
  url = build_url(choice(self.list_hosts), path=path)
480
- r = self._send_request(url, type_='DEL')
481
+ r = self._send_request(url, method=HTTPMethod.DELETE)
481
482
  if r.status_code == codes.ok:
482
483
  return True
483
484
  else:
@@ -530,7 +531,7 @@ class RSEClient(BaseClient):
530
531
 
531
532
  path = '/'.join(path)
532
533
  url = build_url(choice(self.list_hosts), path=path)
533
- r = self._send_request(url, type_='PUT', data=dumps(data))
534
+ r = self._send_request(url, method=HTTPMethod.PUT, data=dumps(data))
534
535
  if r.status_code == codes.ok:
535
536
  return True
536
537
  else:
@@ -586,8 +587,10 @@ class RSEClient(BaseClient):
586
587
 
587
588
  priority_a = protocol_a['domains'][domain][operation]
588
589
  priority_b = protocol_b['domains'][domain][operation]
589
- self.update_protocols(rse, protocol_a['scheme'], {'domains': {domain: {operation: priority_b}}}, protocol_a['hostname'], protocol_a['port'])
590
- self.update_protocols(rse, protocol_b['scheme'], {'domains': {domain: {operation: priority_a}}}, protocol_b['hostname'], protocol_b['port'])
590
+ self.update_protocols(rse, protocol_a['scheme'], {'domains': {domain: {operation: priority_b}}},
591
+ protocol_a['hostname'], protocol_a['port'])
592
+ self.update_protocols(rse, protocol_b['scheme'], {'domains': {domain: {operation: priority_a}}},
593
+ protocol_b['hostname'], protocol_b['port'])
591
594
  return True
592
595
 
593
596
  def add_qos_policy(self, rse: str, qos_policy: str) -> Literal[True]:
@@ -614,7 +617,7 @@ class RSEClient(BaseClient):
614
617
  path = [self.RSE_BASEURL, rse, 'qos_policy', qos_policy]
615
618
  path = '/'.join(path)
616
619
  url = build_url(choice(self.list_hosts), path=path)
617
- r = self._send_request(url, type_='POST')
620
+ r = self._send_request(url, method=HTTPMethod.POST)
618
621
  if r.status_code == codes.created:
619
622
  return True
620
623
  else:
@@ -649,7 +652,7 @@ class RSEClient(BaseClient):
649
652
  path = [self.RSE_BASEURL, rse, 'qos_policy', qos_policy]
650
653
  path = '/'.join(path)
651
654
  url = build_url(choice(self.list_hosts), path=path)
652
- r = self._send_request(url, type_='DEL')
655
+ r = self._send_request(url, method=HTTPMethod.DELETE)
653
656
  if r.status_code == codes.ok:
654
657
  return True
655
658
  else:
@@ -669,7 +672,7 @@ class RSEClient(BaseClient):
669
672
  path = [self.RSE_BASEURL, rse, 'qos_policy']
670
673
  path = '/'.join(path)
671
674
  url = build_url(choice(self.list_hosts), path=path)
672
- r = self._send_request(url, type_='GET')
675
+ r = self._send_request(url, method=HTTPMethod.GET)
673
676
  if r.status_code == codes.ok:
674
677
  return loads(r.text)
675
678
  else:
@@ -708,7 +711,7 @@ class RSEClient(BaseClient):
708
711
  path = '/'.join(path)
709
712
  url = build_url(choice(self.list_hosts), path=path)
710
713
  data = {'source': source, 'used': used, 'free': free, 'files': files}
711
- r = self._send_request(url, type_='PUT', data=dumps(data))
714
+ r = self._send_request(url, method=HTTPMethod.PUT, data=dumps(data))
712
715
  if r.status_code == codes.ok:
713
716
  return True
714
717
  else:
@@ -737,7 +740,7 @@ class RSEClient(BaseClient):
737
740
  path = [self.RSE_BASEURL, rse, 'usage']
738
741
  path = '/'.join(path)
739
742
  url = build_url(choice(self.list_hosts), path=path)
740
- r = self._send_request(url, type_='GET', params=filters)
743
+ r = self._send_request(url, method=HTTPMethod.GET, params=filters)
741
744
  if r.status_code == codes.ok:
742
745
  return self._load_json_data(r)
743
746
  else:
@@ -766,7 +769,7 @@ class RSEClient(BaseClient):
766
769
  path = [self.RSE_BASEURL, rse, 'usage', 'history']
767
770
  path = '/'.join(path)
768
771
  url = build_url(choice(self.list_hosts), path=path)
769
- r = self._send_request(url, type_='GET', params=filters)
772
+ r = self._send_request(url, method=HTTPMethod.GET, params=filters)
770
773
  if r.status_code == codes.ok:
771
774
  return self._load_json_data(r)
772
775
  else:
@@ -800,7 +803,7 @@ class RSEClient(BaseClient):
800
803
  path = [self.RSE_BASEURL, rse, 'limits']
801
804
  path = '/'.join(path)
802
805
  url = build_url(choice(self.list_hosts), path=path)
803
- r = self._send_request(url, type_='PUT', data=dumps({'name': name, 'value': value}))
806
+ r = self._send_request(url, method=HTTPMethod.PUT, data=dumps({'name': name, 'value': value}))
804
807
  if r.status_code == codes.ok:
805
808
  return True
806
809
  exc_cls, exc_msg = self._get_exception(headers=r.headers,
@@ -827,7 +830,7 @@ class RSEClient(BaseClient):
827
830
  path = [self.RSE_BASEURL, rse, 'limits']
828
831
  path = '/'.join(path)
829
832
  url = build_url(choice(self.list_hosts), path=path)
830
- r = self._send_request(url, type_='GET')
833
+ r = self._send_request(url, method=HTTPMethod.GET)
831
834
  if r.status_code == codes.ok:
832
835
  return next(self._load_json_data(r))
833
836
  exc_cls, exc_msg = self._get_exception(headers=r.headers,
@@ -853,7 +856,7 @@ class RSEClient(BaseClient):
853
856
  path = [self.RSE_BASEURL, rse, 'limits']
854
857
  path = '/'.join(path)
855
858
  url = build_url(choice(self.list_hosts), path=path)
856
- r = self._send_request(url, type_='DEL', data=dumps({'name': name}))
859
+ r = self._send_request(url, method=HTTPMethod.DELETE, data=dumps({'name': name}))
857
860
  if r.status_code == codes.ok:
858
861
  return True
859
862
  exc_cls, exc_msg = self._get_exception(headers=r.headers,
@@ -878,7 +881,7 @@ class RSEClient(BaseClient):
878
881
  path = [self.RSE_BASEURL, source, 'distances', destination]
879
882
  path = '/'.join(path)
880
883
  url = build_url(choice(self.list_hosts), path=path)
881
- r = self._send_request(url, type_='POST', data=dumps(parameters))
884
+ r = self._send_request(url, method=HTTPMethod.POST, data=dumps(parameters))
882
885
  if r.status_code == codes.created:
883
886
  return True
884
887
  exc_cls, exc_msg = self._get_exception(headers=r.headers,
@@ -907,7 +910,7 @@ class RSEClient(BaseClient):
907
910
  path = [self.RSE_BASEURL, source, 'distances', destination]
908
911
  path = '/'.join(path)
909
912
  url = build_url(choice(self.list_hosts), path=path)
910
- r = self._send_request(url, type_='PUT', data=dumps(parameters))
913
+ r = self._send_request(url, method=HTTPMethod.PUT, data=dumps(parameters))
911
914
  if r.status_code == codes.ok:
912
915
  return True
913
916
  exc_cls, exc_msg = self._get_exception(headers=r.headers,
@@ -938,7 +941,7 @@ class RSEClient(BaseClient):
938
941
  path = [self.RSE_BASEURL, source, 'distances', destination]
939
942
  path = '/'.join(path)
940
943
  url = build_url(choice(self.list_hosts), path=path)
941
- r = self._send_request(url, type_='GET')
944
+ r = self._send_request(url, method=HTTPMethod.GET)
942
945
  if r.status_code == codes.ok:
943
946
  return next(self._load_json_data(r))
944
947
  exc_cls, exc_msg = self._get_exception(headers=r.headers, status_code=r.status_code, data=r.content)
@@ -962,7 +965,7 @@ class RSEClient(BaseClient):
962
965
  path = [self.RSE_BASEURL, source, 'distances', destination]
963
966
  path = '/'.join(path)
964
967
  url = build_url(choice(self.list_hosts), path=path)
965
- r = self._send_request(url, type_='DEL')
968
+ r = self._send_request(url, method=HTTPMethod.DELETE)
966
969
  if r.status_code == codes.ok:
967
970
  return True
968
971
  exc_cls, exc_msg = self._get_exception(headers=r.headers,