DIRAC 9.0.0a67__py3-none-any.whl → 9.0.0a69__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.
@@ -1,11 +1,14 @@
1
1
  """ Helper for the CS Resources section
2
2
  """
3
- import re
4
3
  from urllib import parse
5
4
 
6
5
  from DIRAC import S_ERROR, S_OK, gConfig, gLogger
7
6
  from DIRAC.ConfigurationSystem.Client.Helpers.Path import cfgPath
8
7
  from DIRAC.Core.Utilities.List import fromChar, uniqueElements
8
+ from DIRACCommon.ConfigurationSystem.Client.Helpers.Resources import (
9
+ getDIRACPlatform as _getDIRACPlatform,
10
+ _platformSortKey,
11
+ )
9
12
 
10
13
  gBaseResourcesSection = "/Resources"
11
14
 
@@ -328,8 +331,8 @@ def getCompatiblePlatforms(originalPlatforms):
328
331
  if not (result["OK"] and result["Value"]):
329
332
  return S_ERROR("OS compatibility info not found")
330
333
 
331
- platformsDict = {k: v.replace(" ", "").split(",") for k, v in result["Value"].items()} # can be an iterator
332
- for k, v in platformsDict.items(): # can be an iterator
334
+ platformsDict = {k: v.replace(" ", "").split(",") for k, v in result["Value"].items()}
335
+ for k, v in platformsDict.items():
333
336
  if k not in v:
334
337
  v.append(k)
335
338
 
@@ -355,7 +358,6 @@ def getDIRACPlatform(OSList):
355
358
  :param list OSList: list of platforms defined by resource providers
356
359
  :return: a list of DIRAC platforms that can be specified in job descriptions
357
360
  """
358
-
359
361
  # For backward compatibility allow a single string argument
360
362
  osList = OSList
361
363
  if isinstance(OSList, str):
@@ -365,31 +367,12 @@ def getDIRACPlatform(OSList):
365
367
  if not (result["OK"] and result["Value"]):
366
368
  return S_ERROR("OS compatibility info not found")
367
369
 
368
- platformsDict = {k: v.replace(" ", "").split(",") for k, v in result["Value"].items()} # can be an iterator
369
- for k, v in platformsDict.items(): # can be an iterator
370
+ platformsDict = {k: set(v.replace(" ", "").split(",")) for k, v in result["Value"].items()}
371
+ for k, v in platformsDict.items():
370
372
  if k not in v:
371
- v.append(k)
372
-
373
- # making an OS -> platforms dict
374
- os2PlatformDict = dict()
375
- for platform, osItems in platformsDict.items(): # can be an iterator
376
- for osItem in osItems:
377
- if os2PlatformDict.get(osItem):
378
- os2PlatformDict[osItem].append(platform)
379
- else:
380
- os2PlatformDict[osItem] = [platform]
381
-
382
- platforms = []
383
- for os in osList:
384
- if os in os2PlatformDict:
385
- platforms += os2PlatformDict[os]
386
-
387
- if not platforms:
388
- return S_ERROR(f"No compatible DIRAC platform found for {','.join(OSList)}")
373
+ v.add(k)
389
374
 
390
- platforms.sort(key=_platformSortKey, reverse=True)
391
-
392
- return S_OK(platforms)
375
+ return _getDIRACPlatform(osList, platformsDict)
393
376
 
394
377
 
395
378
  def getDIRACPlatforms():
@@ -451,7 +434,7 @@ def getInfoAboutProviders(of=None, providerName=None, option="", section=""):
451
434
  result = gConfig.getConfigurationTree(relPath)
452
435
  if not result["OK"]:
453
436
  return result
454
- for key, value in result["Value"].items(): # can be an iterator
437
+ for key, value in result["Value"].items():
455
438
  if value:
456
439
  resDict[key.replace(relPath, "")] = value
457
440
  return S_OK(resDict)
@@ -459,18 +442,3 @@ def getInfoAboutProviders(of=None, providerName=None, option="", section=""):
459
442
  return gConfig.getSections(f"{gBaseResourcesSection}/{of}Providers/{providerName}/{section}/")
460
443
  else:
461
444
  return S_OK(gConfig.getValue(f"{gBaseResourcesSection}/{of}Providers/{providerName}/{section}/{option}"))
462
-
463
-
464
- def _platformSortKey(version: str) -> list[str]:
465
- # Loosely based on distutils.version.LooseVersion
466
- parts = []
467
- for part in re.split(r"(\d+|[a-z]+|\.| -)", version.lower()):
468
- if not part or part == ".":
469
- continue
470
- if part[:1] in "0123456789":
471
- part = part.zfill(8)
472
- else:
473
- while parts and parts[-1] == "00000000":
474
- parts.pop()
475
- parts.append(part)
476
- return parts
@@ -9,7 +9,6 @@ from DIRAC.ConfigurationSystem.Client import ConfigurationData
9
9
  from DIRAC.ConfigurationSystem.Client.Helpers.Resources import (
10
10
  getDIRACPlatform,
11
11
  getCompatiblePlatforms,
12
- _platformSortKey,
13
12
  getQueue,
14
13
  )
15
14
 
@@ -77,21 +76,6 @@ def test_getDIRACPlatform(mocker, mockGCReplyInput, requested, expectedRes, expe
77
76
  assert set(res["Value"]) == set(expectedValue), res["Value"]
78
77
 
79
78
 
80
- @pytest.mark.parametrize(
81
- "string,expected",
82
- [
83
- ("Darwin_arm64_12.4", ["darwin", "_", "arm", "64", "_", "12", "4"]),
84
- ("Linux_x86_64_glibc-2.17", ["linux", "_", "x", "86", "_", "64", "_", "glibc", "-", "2", "17"]),
85
- ("Linux_aarch64_glibc-2.28", ["linux", "_", "aarch", "64", "_", "glibc", "-", "2", "28"]),
86
- ],
87
- )
88
- def test_platformSortKey(string, expected):
89
- actual = _platformSortKey(string)
90
- for a, e in zip_longest(actual, expected):
91
- # Numbers are padded with zeros so string comparison works
92
- assert a.lstrip("0") == e
93
-
94
-
95
79
  @pytest.mark.parametrize(
96
80
  "mockGCReplyInput, requested, expectedRes, expectedValue",
97
81
  [
@@ -17,7 +17,6 @@ Example:
17
17
  'LocalAccount': 'prod006',
18
18
  'LocalBatchID': '',
19
19
  'LocalJobID': '277821.ce.labmc.inf.utfsm.cl',
20
- 'MatcherServiceTime': '2.27646398544',
21
20
  'Memory(kB)': '858540kB',
22
21
  'ModelName': 'Intel(R)Xeon(R)CPU5110@1.60GHz',
23
22
  'NormCPUTime(s)': '1.02',
@@ -236,7 +236,6 @@ class JobAgent(AgentModule):
236
236
  jobGroup = matcherInfo["Group"]
237
237
  owner = matcherInfo["Owner"]
238
238
  ceDict = matcherInfo["CEDict"]
239
- matchTime = matcherInfo["matchTime"]
240
239
 
241
240
  optimizerParams = {}
242
241
  for key in matcherInfo:
@@ -263,9 +262,6 @@ class JobAgent(AgentModule):
263
262
  self.log.verbose("Job request successful: \n", jobRequest["Value"])
264
263
  self.log.info("Received", f"JobID={jobID}, JobType={jobType}, Owner={owner}, JobGroup={jobGroup}")
265
264
  self.jobCount += 1
266
- self.jobs[jobID]["JobReport"].setJobParameter(
267
- par_name="MatcherServiceTime", par_value=str(matchTime), sendFlag=False
268
- )
269
265
 
270
266
  self.jobs[jobID]["JobReport"].setJobStatus(minorStatus="Job Received by Agent", sendFlag=False)
271
267
  result_setupProxy = self._setupProxy(owner, jobGroup)
@@ -547,7 +543,7 @@ class JobAgent(AgentModule):
547
543
  jobRequest = MatcherClient().requestJob(ceDict)
548
544
  matchTime = time.time() - start
549
545
 
550
- self.log.info("MatcherTime", f"= {matchTime:.2f} (s)")
546
+ self.log.verbose("MatcherTime", f"= {matchTime:.2f} (s)")
551
547
  if jobRequest["OK"]:
552
548
  jobRequest["Value"]["matchTime"] = matchTime
553
549
  jobRequest["Value"]["CEDict"] = ceDict
@@ -1,4 +1,4 @@
1
- """ This agent syncs CS and pilot files to a web server of your choice
1
+ """This agent syncs CS and pilot files to a web server of your choice
2
2
 
3
3
  .. literalinclude:: ../ConfigTemplate.cfg
4
4
  :start-after: ##BEGIN PilotSyncAgent
@@ -7,6 +7,7 @@
7
7
  :caption: PilotsSyncAgent options
8
8
 
9
9
  """
10
+
10
11
  import os
11
12
  import json
12
13
  import shutil
@@ -38,8 +39,8 @@ class PilotSyncAgent(AgentModule):
38
39
  self.workingDirectory = self.am_getOption("WorkDirectory")
39
40
  self.saveDir = self.am_getOption("SaveDirectory", self.saveDir)
40
41
  self.uploadLocations = self.am_getOption("UploadLocations", self.uploadLocations)
41
- includeMasterCS = self.am_getOption("IncludeMasterCS", self.includeMasterCS)
42
- if isinstance(includeMasterCS, str) and includeMasterCS.lower() in ["n", "no", "false"]:
42
+ self.includeMasterCS = self.am_getOption("IncludeMasterCS", self.includeMasterCS)
43
+ if isinstance(self.includeMasterCS, str) and self.includeMasterCS.lower() in ["n", "no", "false"]:
43
44
  self.includeMasterCS = False
44
45
 
45
46
  self.certAndKeyLocation = getHostCertificateAndKeyLocation()
@@ -285,7 +285,6 @@ class PushJobAgent(JobAgent):
285
285
  jobGroup = matcherInfo["Group"]
286
286
  owner = matcherInfo["Owner"]
287
287
  ceDict = matcherInfo["CEDict"]
288
- matchTime = matcherInfo["matchTime"]
289
288
 
290
289
  optimizerParams = {}
291
290
  for key in matcherInfo:
@@ -313,9 +312,6 @@ class PushJobAgent(JobAgent):
313
312
  self.log.verbose("Job request successful: \n", jobRequest["Value"])
314
313
  self.log.info("Received", f"JobID={jobID}, JobType={jobType}, Owner={owner}, JobGroup={jobGroup}")
315
314
 
316
- self.jobs[jobID]["JobReport"].setJobParameter(
317
- par_name="MatcherServiceTime", par_value=str(matchTime), sendFlag=False
318
- )
319
315
  self.jobs[jobID]["JobReport"].setJobStatus(
320
316
  status=JobStatus.MATCHED, minorStatus="Job Received by Agent", sendFlag=False
321
317
  )
@@ -1,9 +1,10 @@
1
- """ CStoJSONSynchronizer
2
- Module that keeps the pilot parameters file synchronized with the information
3
- in the Operations/Pilot section of the CS. If there are additions in the CS,
4
- these are incorporated to the file.
5
- The module uploads to a web server the latest version of the pilot scripts.
1
+ """CStoJSONSynchronizer
2
+ Module that keeps the pilot parameters file synchronized with the information
3
+ in the Operations/Pilot section of the CS. If there are additions in the CS,
4
+ these are incorporated to the file.
5
+ The module uploads to a web server the latest version of the pilot scripts.
6
6
  """
7
+
7
8
  import datetime
8
9
  import glob
9
10
  import os
@@ -19,6 +20,67 @@ from DIRAC.ConfigurationSystem.Client.Helpers.Operations import Operations
19
20
  from DIRAC.ConfigurationSystem.Client.Helpers.Path import cfgPath
20
21
  from DIRAC.Core.Utilities.ReturnValues import DOKReturnType, DReturnType
21
22
 
23
+ import socket
24
+ from urllib.parse import urlparse
25
+
26
+
27
+ def exclude_master_cs_aliases(urls: list[str], master_cs_url: str) -> list[str]:
28
+ """
29
+ Excludes URLs that are DNS aliases of the given MasterCS server URL.
30
+
31
+ This function resolves the IP addresses of the MasterCS server and each URL in the input list.
32
+ It returns a new list containing only those URLs whose hostnames do not resolve to any of the
33
+ MasterCS server's IP addresses, effectively excluding all DNS aliases of the MasterCS server.
34
+
35
+ Args:
36
+ urls (list[str]): A list of URLs to filter. Each URL should be a string in a valid URL format.
37
+ master_cs_url (str): The reference URL (e.g., MasterCS server URL) whose DNS aliases are to be excluded.
38
+
39
+ Returns:
40
+ list[str]: A new list of URLs with all aliases of the MasterCS server removed.
41
+ If the MasterCS hostname cannot be resolved, the original list is returned unchanged.
42
+
43
+ Example:
44
+ >>> urls = [
45
+ ... 'dips://lbvobox303.cern.ch:9135/Configuration/Server',
46
+ ... 'dips://ccwlcglhcb02.in2p3.fr:9135/Configuration/Server',
47
+ ... 'dips://lbvobox302.cern.ch:9135/Configuration/Server',
48
+ ... ]
49
+ >>> master_cs_url = "dips://mastercs.cern.ch:9135/Configuration/Server"
50
+ >>> exclude_master_cs_aliases(urls, master_cs_url)
51
+ ['dips://ccwlcglhcb02.in2p3.fr:9135/Configuration/Server']
52
+
53
+ Notes:
54
+ - If the MasterCS hostname cannot be resolved, the function returns the original list.
55
+ - If a hostname in the input list cannot be resolved, it is included in the result.
56
+ - The comparison is based on IP addresses, not hostnames.
57
+ """
58
+ master_cs_hostname = urlparse(master_cs_url).hostname
59
+ if not master_cs_hostname:
60
+ return urls
61
+
62
+ # Resolve IP addresses for the MasterCS hostname
63
+ try:
64
+ master_cs_ips = set(socket.gethostbyname_ex(master_cs_hostname)[2])
65
+ except socket.gaierror:
66
+ return urls
67
+
68
+ # Function to get IPs for a hostname
69
+ def get_ips(hostname):
70
+ try:
71
+ return set(socket.gethostbyname_ex(hostname)[2])
72
+ except socket.gaierror:
73
+ return set()
74
+
75
+ filtered_urls = []
76
+ for url in urls:
77
+ hostname = urlparse(url).hostname
78
+ ips = get_ips(hostname)
79
+ if not ips & master_cs_ips:
80
+ filtered_urls.append(url)
81
+
82
+ return filtered_urls
83
+
22
84
 
23
85
  class PilotCStoJSONSynchronizer:
24
86
  """
@@ -151,7 +213,8 @@ class PilotCStoJSONSynchronizer:
151
213
  configurationServers = gConfig.getServersList()
152
214
  if not includeMasterCS:
153
215
  masterCS = gConfigurationData.getMasterServer()
154
- configurationServers = list(set(configurationServers) - {masterCS})
216
+ configurationServers = exclude_master_cs_aliases(configurationServers, masterCS)
217
+
155
218
  pilotDict["ConfigurationServers"] = configurationServers
156
219
 
157
220
  self.log.debug("Got pilotDict", str(pilotDict))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DIRAC
3
- Version: 9.0.0a67
3
+ Version: 9.0.0a69
4
4
  Summary: DIRAC is an interware, meaning a software framework for distributed computing.
5
5
  Home-page: https://github.com/DIRACGrid/DIRAC/
6
6
  License: GPL-3.0-only
@@ -19,7 +19,7 @@ Requires-Dist: cachetools
19
19
  Requires-Dist: certifi
20
20
  Requires-Dist: cwltool
21
21
  Requires-Dist: diraccfg
22
- Requires-Dist: DIRACCommon==v9.0.0a67
22
+ Requires-Dist: DIRACCommon==v9.0.0a69
23
23
  Requires-Dist: diracx-client>=v0.0.1a18
24
24
  Requires-Dist: diracx-core>=v0.0.1a18
25
25
  Requires-Dist: db12
@@ -67,10 +67,10 @@ DIRAC/ConfigurationSystem/Client/Helpers/CSGlobals.py,sha256=_txOWvYqcRzK4n4VVEw
67
67
  DIRAC/ConfigurationSystem/Client/Helpers/Operations.py,sha256=jrpeauEwV6_xXQwVEbs6DDboB8oUmzkZkB_Xg8ZgdBQ,5991
68
68
  DIRAC/ConfigurationSystem/Client/Helpers/Path.py,sha256=ghRMD2qNaKejwg4RZ3m4LzfCG5bg1afvTnwJQydl94w,930
69
69
  DIRAC/ConfigurationSystem/Client/Helpers/Registry.py,sha256=svibVaHyRKRKPEs-k4pXgcTzr74qe72m4jo2Ue9Xqts,20775
70
- DIRAC/ConfigurationSystem/Client/Helpers/Resources.py,sha256=8llG-BevyD33S6nYpQjr1LQxdCqyJcS1U8vLBUrT3HY,16641
70
+ DIRAC/ConfigurationSystem/Client/Helpers/Resources.py,sha256=g6ZRdAydAnyKHjL9Gh6VS-jP5zb64q7uMOohtn8rin8,15604
71
71
  DIRAC/ConfigurationSystem/Client/Helpers/ResourcesDefaults.py,sha256=m6s-ZvjtYcLGsuu6mkCpIzxA8rEUYnwOOw1HvjecuJQ,3314
72
72
  DIRAC/ConfigurationSystem/Client/Helpers/__init__.py,sha256=syOASwgkZHn6b6ybYYu15wO8mrZXj7T-gIHk3EDlpjc,206
73
- DIRAC/ConfigurationSystem/Client/Helpers/test/Test_Helpers.py,sha256=PVq5SirQDSh-m3WnfiBAylpj9w3NzAxdBQRWBf1FXWw,6142
73
+ DIRAC/ConfigurationSystem/Client/Helpers/test/Test_Helpers.py,sha256=_pfEyd5tw5OGCluNWT8cN2PIX_XEr1gLZPHPXEG0zXs,5543
74
74
  DIRAC/ConfigurationSystem/Client/SyncPlugins/CERNLDAPSyncPlugin.py,sha256=p1gSEKMY85dMQvJST5oDQiUeeMedMCSUdXyRThE8hgo,3376
75
75
  DIRAC/ConfigurationSystem/Client/SyncPlugins/DummySyncPlugin.py,sha256=hGXcNMxh3r7sCXkTs5r1Mlvz6FjlZ1lBo9NzavQzoBo,1420
76
76
  DIRAC/ConfigurationSystem/Client/SyncPlugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -654,7 +654,7 @@ DIRAC/Interfaces/scripts/dirac_wms_job_get_output.py,sha256=GknZloaQFv8suW5U_vYS
654
654
  DIRAC/Interfaces/scripts/dirac_wms_job_get_output_data.py,sha256=ohn1CLgqUceDsHxdAIRrQs4t_k-ZyDk66whGm-RIPh0,1287
655
655
  DIRAC/Interfaces/scripts/dirac_wms_job_kill.py,sha256=tCbozyC_XEPmbvL9uIhSA7eg9fCzyRKl1AWQoecO7So,1493
656
656
  DIRAC/Interfaces/scripts/dirac_wms_job_logging_info.py,sha256=uzF3JkOUymGIKZCe93-n_drx7wi_hZgFsm5xOMFW3WE,2838
657
- DIRAC/Interfaces/scripts/dirac_wms_job_parameters.py,sha256=x2GXOL0_mL0YT6py49tXXdE1V1957RXQ8rdeNeAgYkI,1914
657
+ DIRAC/Interfaces/scripts/dirac_wms_job_parameters.py,sha256=fpZMjl0JAxRNzBm3XyU_ThYT100wzFxks26SedC1zyo,1872
658
658
  DIRAC/Interfaces/scripts/dirac_wms_job_peek.py,sha256=OAEMRuFLB-_TwaCefnQ-PKYPOkMpjJjKAX3WFm1x-A4,1042
659
659
  DIRAC/Interfaces/scripts/dirac_wms_job_reschedule.py,sha256=hufLR9CKLABzXUPovm15imf_jha55KDe-3XPtQ_g70Q,1155
660
660
  DIRAC/Interfaces/scripts/dirac_wms_job_status.py,sha256=vFcKh5EPlJ7tp9Pwz4orsspgp9_lvgxztYyyKmXWdYk,2208
@@ -1119,12 +1119,12 @@ DIRAC/Workflow/Utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1119
1119
  DIRAC/Workflow/Utilities/test/Test_Utilities.py,sha256=DNjFPpBmpojwCWhZSUSoG3AIhMQvqyiZdSuVkrHkOtk,2595
1120
1120
  DIRAC/WorkloadManagementSystem/ConfigTemplate.cfg,sha256=EpXTiHV-omMuMcWDzQzWZ_LmAZFMRTabfJpfZmVfzEA,9065
1121
1121
  DIRAC/WorkloadManagementSystem/__init__.py,sha256=9-_-HOT_8S3i-TMmTR_gFVVlNyktBRk-S2qSuOBKoIc,50
1122
- DIRAC/WorkloadManagementSystem/Agent/JobAgent.py,sha256=Hi3zPfK9h7CwNO2pK4IABCqO_uShCIaKvZGlUdgsWPA,41034
1122
+ DIRAC/WorkloadManagementSystem/Agent/JobAgent.py,sha256=LzLypd3m4a6M-J5_nmUMsMqgflb_1Xm77eONDE6G1Vg,40843
1123
1123
  DIRAC/WorkloadManagementSystem/Agent/JobCleaningAgent.py,sha256=TR8nDO43DuJxOQVIdOUrqpWjRjJp52dVzOKUUewL9U4,14708
1124
1124
  DIRAC/WorkloadManagementSystem/Agent/PilotLoggingAgent.py,sha256=ZIgvFpasGTh76GW3G7O4hKC_Kkm31uWymlH-MTT3AXg,10541
1125
1125
  DIRAC/WorkloadManagementSystem/Agent/PilotStatusAgent.py,sha256=qY6TbYCPOFFXhHffmRJLNEbWvZPyg5Lc5B_8BbyQ7zc,9711
1126
- DIRAC/WorkloadManagementSystem/Agent/PilotSyncAgent.py,sha256=Q50axgfx_D9iF2hT0aNaJ1KA85idOluBeBWDcjR6j8c,4845
1127
- DIRAC/WorkloadManagementSystem/Agent/PushJobAgent.py,sha256=OkIIFnJrwUYCroWEc5bgAfsnGks98y0gO1GLKamBXO0,38820
1126
+ DIRAC/WorkloadManagementSystem/Agent/PilotSyncAgent.py,sha256=qzDFCGZ8EtjxDUaPgyFDlSmJfyF2KLuyXTC7au3-p2Q,4860
1127
+ DIRAC/WorkloadManagementSystem/Agent/PushJobAgent.py,sha256=IvHshnw2xN0AZrruEu86C47GDez8enBD6jjNIZd6QcA,38594
1128
1128
  DIRAC/WorkloadManagementSystem/Agent/SiteDirector.py,sha256=ZnbjKca8tWLekObALrsFXm7EoXAYxEpHSGRAbrqU5mk,45229
1129
1129
  DIRAC/WorkloadManagementSystem/Agent/StalledJobAgent.py,sha256=foEbmRotEmfeQG6nyIsJv1kSJkm4flkQsPYbSylS3SM,24572
1130
1130
  DIRAC/WorkloadManagementSystem/Agent/StatesAccountingAgent.py,sha256=iNIlWQEDBk6R1S8oHOIusZUwxOwLtgwuzR_4s32-o5w,8707
@@ -1240,7 +1240,7 @@ DIRAC/WorkloadManagementSystem/Utilities/JobModel.py,sha256=jN9sFbzMZo9tab6Kp7Oe
1240
1240
  DIRAC/WorkloadManagementSystem/Utilities/JobParameters.py,sha256=JW3AAEtBJn1gIO_rm2Ft5qqjfLteIo3HpQtGNZBfhxE,8365
1241
1241
  DIRAC/WorkloadManagementSystem/Utilities/JobStatusUtility.py,sha256=WtGJzC7fHvydANh8JH6e1Kk_jebrCMPr2c5cw3ufjm8,7826
1242
1242
  DIRAC/WorkloadManagementSystem/Utilities/ParametricJob.py,sha256=FNUsGhvsFVrtmA7r8G-sd4QTMeBkqG1sdtwiBUKQyd0,605
1243
- DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py,sha256=aJr2YdE5fb_gieejEyqOg_zcB9MFW5ikzVyKVjnGBN4,9838
1243
+ DIRAC/WorkloadManagementSystem/Utilities/PilotCStoJSONSynchronizer.py,sha256=sjOOWeKLZMpYD2GJVU-EOkZAfmRpAwIcJntAAcalE20,12244
1244
1244
  DIRAC/WorkloadManagementSystem/Utilities/PilotWrapper.py,sha256=VcvQTpeyTbVYqSsPQDyAt37N2CaEAnIuvbR6yk4kYk8,15465
1245
1245
  DIRAC/WorkloadManagementSystem/Utilities/QueueUtilities.py,sha256=J5-n_lvWbW_TRjrlqp8hx1SHEaXDW2Dxp3R1hBBrWnE,12082
1246
1246
  DIRAC/WorkloadManagementSystem/Utilities/RemoteRunner.py,sha256=7FcEtlYSJMzdbLIFBUKD-j_wqRHya-ISqk8w-JRy3kw,12159
@@ -1294,9 +1294,9 @@ DIRAC/tests/Workflow/Integration/exe-script.py,sha256=B_slYdTocEzqfQLRhwuPiLyYUn
1294
1294
  DIRAC/tests/Workflow/Integration/helloWorld.py,sha256=tBgEHH3ZF7ZiTS57gtmm3DW-Qxgm_57HWHpM-Y8XSws,205
1295
1295
  DIRAC/tests/Workflow/Regression/helloWorld.py,sha256=69eCgFuVSYo-mK3Dj2dw1c6g86sF5FksKCf8V2aGVoM,509
1296
1296
  DIRAC/tests/Workflow/Regression/helloWorld.xml,sha256=xwydIcFTAHIX-YPfQfyxuQ7hzvIO3IhR3UAF7ORgkGg,5310
1297
- dirac-9.0.0a67.dist-info/licenses/LICENSE,sha256=uyr4oV6jmjUeepXZPPjkJRwa5q5MrI7jqJz5sVXNblQ,32452
1298
- dirac-9.0.0a67.dist-info/METADATA,sha256=KsoeED4NaIZwsKIfB0lKcpwodmhirv2SVHYYUWTMMPQ,10020
1299
- dirac-9.0.0a67.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1300
- dirac-9.0.0a67.dist-info/entry_points.txt,sha256=hupzIL8aVmjK3nn7RLKdhcaiPmLOiD3Kulh3CSDHKmw,16492
1301
- dirac-9.0.0a67.dist-info/top_level.txt,sha256=RISrnN9kb_mPqmVu8_o4jF-DSX8-h6AcgfkO9cgfkHA,6
1302
- dirac-9.0.0a67.dist-info/RECORD,,
1297
+ dirac-9.0.0a69.dist-info/licenses/LICENSE,sha256=uyr4oV6jmjUeepXZPPjkJRwa5q5MrI7jqJz5sVXNblQ,32452
1298
+ dirac-9.0.0a69.dist-info/METADATA,sha256=lwVvrzXbmTIFjg9IJOC_gG9_f6QU_z7yEG8NGsedvus,10020
1299
+ dirac-9.0.0a69.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1300
+ dirac-9.0.0a69.dist-info/entry_points.txt,sha256=hupzIL8aVmjK3nn7RLKdhcaiPmLOiD3Kulh3CSDHKmw,16492
1301
+ dirac-9.0.0a69.dist-info/top_level.txt,sha256=RISrnN9kb_mPqmVu8_o4jF-DSX8-h6AcgfkO9cgfkHA,6
1302
+ dirac-9.0.0a69.dist-info/RECORD,,