toil 6.1.0a1__py3-none-any.whl → 8.0.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.
Files changed (193) hide show
  1. toil/__init__.py +122 -315
  2. toil/batchSystems/__init__.py +1 -0
  3. toil/batchSystems/abstractBatchSystem.py +173 -89
  4. toil/batchSystems/abstractGridEngineBatchSystem.py +272 -148
  5. toil/batchSystems/awsBatch.py +244 -135
  6. toil/batchSystems/cleanup_support.py +26 -16
  7. toil/batchSystems/contained_executor.py +31 -28
  8. toil/batchSystems/gridengine.py +86 -50
  9. toil/batchSystems/htcondor.py +166 -89
  10. toil/batchSystems/kubernetes.py +632 -382
  11. toil/batchSystems/local_support.py +20 -15
  12. toil/batchSystems/lsf.py +134 -81
  13. toil/batchSystems/lsfHelper.py +13 -11
  14. toil/batchSystems/mesos/__init__.py +41 -29
  15. toil/batchSystems/mesos/batchSystem.py +290 -151
  16. toil/batchSystems/mesos/executor.py +79 -50
  17. toil/batchSystems/mesos/test/__init__.py +31 -23
  18. toil/batchSystems/options.py +46 -28
  19. toil/batchSystems/registry.py +53 -19
  20. toil/batchSystems/singleMachine.py +296 -125
  21. toil/batchSystems/slurm.py +603 -138
  22. toil/batchSystems/torque.py +47 -33
  23. toil/bus.py +186 -76
  24. toil/common.py +664 -368
  25. toil/cwl/__init__.py +1 -1
  26. toil/cwl/cwltoil.py +1136 -483
  27. toil/cwl/utils.py +17 -22
  28. toil/deferred.py +63 -42
  29. toil/exceptions.py +5 -3
  30. toil/fileStores/__init__.py +5 -5
  31. toil/fileStores/abstractFileStore.py +140 -60
  32. toil/fileStores/cachingFileStore.py +717 -269
  33. toil/fileStores/nonCachingFileStore.py +116 -87
  34. toil/job.py +1225 -368
  35. toil/jobStores/abstractJobStore.py +416 -266
  36. toil/jobStores/aws/jobStore.py +863 -477
  37. toil/jobStores/aws/utils.py +201 -120
  38. toil/jobStores/conftest.py +3 -2
  39. toil/jobStores/fileJobStore.py +292 -154
  40. toil/jobStores/googleJobStore.py +140 -74
  41. toil/jobStores/utils.py +36 -15
  42. toil/leader.py +668 -272
  43. toil/lib/accelerators.py +115 -18
  44. toil/lib/aws/__init__.py +74 -31
  45. toil/lib/aws/ami.py +122 -87
  46. toil/lib/aws/iam.py +284 -108
  47. toil/lib/aws/s3.py +31 -0
  48. toil/lib/aws/session.py +214 -39
  49. toil/lib/aws/utils.py +287 -231
  50. toil/lib/bioio.py +13 -5
  51. toil/lib/compatibility.py +11 -6
  52. toil/lib/conversions.py +104 -47
  53. toil/lib/docker.py +131 -103
  54. toil/lib/ec2.py +361 -199
  55. toil/lib/ec2nodes.py +174 -106
  56. toil/lib/encryption/_dummy.py +5 -3
  57. toil/lib/encryption/_nacl.py +10 -6
  58. toil/lib/encryption/conftest.py +1 -0
  59. toil/lib/exceptions.py +26 -7
  60. toil/lib/expando.py +5 -3
  61. toil/lib/ftp_utils.py +217 -0
  62. toil/lib/generatedEC2Lists.py +127 -19
  63. toil/lib/humanize.py +6 -2
  64. toil/lib/integration.py +341 -0
  65. toil/lib/io.py +141 -15
  66. toil/lib/iterables.py +4 -2
  67. toil/lib/memoize.py +12 -8
  68. toil/lib/misc.py +66 -21
  69. toil/lib/objects.py +2 -2
  70. toil/lib/resources.py +68 -15
  71. toil/lib/retry.py +126 -81
  72. toil/lib/threading.py +299 -82
  73. toil/lib/throttle.py +16 -15
  74. toil/options/common.py +843 -409
  75. toil/options/cwl.py +175 -90
  76. toil/options/runner.py +50 -0
  77. toil/options/wdl.py +73 -17
  78. toil/provisioners/__init__.py +117 -46
  79. toil/provisioners/abstractProvisioner.py +332 -157
  80. toil/provisioners/aws/__init__.py +70 -33
  81. toil/provisioners/aws/awsProvisioner.py +1145 -715
  82. toil/provisioners/clusterScaler.py +541 -279
  83. toil/provisioners/gceProvisioner.py +282 -179
  84. toil/provisioners/node.py +155 -79
  85. toil/realtimeLogger.py +34 -22
  86. toil/resource.py +137 -75
  87. toil/server/app.py +128 -62
  88. toil/server/celery_app.py +3 -1
  89. toil/server/cli/wes_cwl_runner.py +82 -53
  90. toil/server/utils.py +54 -28
  91. toil/server/wes/abstract_backend.py +64 -26
  92. toil/server/wes/amazon_wes_utils.py +21 -15
  93. toil/server/wes/tasks.py +121 -63
  94. toil/server/wes/toil_backend.py +142 -107
  95. toil/server/wsgi_app.py +4 -3
  96. toil/serviceManager.py +58 -22
  97. toil/statsAndLogging.py +224 -70
  98. toil/test/__init__.py +282 -183
  99. toil/test/batchSystems/batchSystemTest.py +460 -210
  100. toil/test/batchSystems/batch_system_plugin_test.py +90 -0
  101. toil/test/batchSystems/test_gridengine.py +173 -0
  102. toil/test/batchSystems/test_lsf_helper.py +67 -58
  103. toil/test/batchSystems/test_slurm.py +110 -49
  104. toil/test/cactus/__init__.py +0 -0
  105. toil/test/cactus/test_cactus_integration.py +56 -0
  106. toil/test/cwl/cwlTest.py +496 -287
  107. toil/test/cwl/measure_default_memory.cwl +12 -0
  108. toil/test/cwl/not_run_required_input.cwl +29 -0
  109. toil/test/cwl/scatter_duplicate_outputs.cwl +40 -0
  110. toil/test/cwl/seqtk_seq.cwl +1 -1
  111. toil/test/docs/scriptsTest.py +69 -46
  112. toil/test/jobStores/jobStoreTest.py +427 -264
  113. toil/test/lib/aws/test_iam.py +118 -50
  114. toil/test/lib/aws/test_s3.py +16 -9
  115. toil/test/lib/aws/test_utils.py +5 -6
  116. toil/test/lib/dockerTest.py +118 -141
  117. toil/test/lib/test_conversions.py +113 -115
  118. toil/test/lib/test_ec2.py +58 -50
  119. toil/test/lib/test_integration.py +104 -0
  120. toil/test/lib/test_misc.py +12 -5
  121. toil/test/mesos/MesosDataStructuresTest.py +23 -10
  122. toil/test/mesos/helloWorld.py +7 -6
  123. toil/test/mesos/stress.py +25 -20
  124. toil/test/options/__init__.py +13 -0
  125. toil/test/options/options.py +42 -0
  126. toil/test/provisioners/aws/awsProvisionerTest.py +320 -150
  127. toil/test/provisioners/clusterScalerTest.py +440 -250
  128. toil/test/provisioners/clusterTest.py +166 -44
  129. toil/test/provisioners/gceProvisionerTest.py +174 -100
  130. toil/test/provisioners/provisionerTest.py +25 -13
  131. toil/test/provisioners/restartScript.py +5 -4
  132. toil/test/server/serverTest.py +188 -141
  133. toil/test/sort/restart_sort.py +137 -68
  134. toil/test/sort/sort.py +134 -66
  135. toil/test/sort/sortTest.py +91 -49
  136. toil/test/src/autoDeploymentTest.py +141 -101
  137. toil/test/src/busTest.py +20 -18
  138. toil/test/src/checkpointTest.py +8 -2
  139. toil/test/src/deferredFunctionTest.py +49 -35
  140. toil/test/src/dockerCheckTest.py +32 -24
  141. toil/test/src/environmentTest.py +135 -0
  142. toil/test/src/fileStoreTest.py +539 -272
  143. toil/test/src/helloWorldTest.py +7 -4
  144. toil/test/src/importExportFileTest.py +61 -31
  145. toil/test/src/jobDescriptionTest.py +46 -21
  146. toil/test/src/jobEncapsulationTest.py +2 -0
  147. toil/test/src/jobFileStoreTest.py +74 -50
  148. toil/test/src/jobServiceTest.py +187 -73
  149. toil/test/src/jobTest.py +121 -71
  150. toil/test/src/miscTests.py +19 -18
  151. toil/test/src/promisedRequirementTest.py +82 -36
  152. toil/test/src/promisesTest.py +7 -6
  153. toil/test/src/realtimeLoggerTest.py +10 -6
  154. toil/test/src/regularLogTest.py +71 -37
  155. toil/test/src/resourceTest.py +80 -49
  156. toil/test/src/restartDAGTest.py +36 -22
  157. toil/test/src/resumabilityTest.py +9 -2
  158. toil/test/src/retainTempDirTest.py +45 -14
  159. toil/test/src/systemTest.py +12 -8
  160. toil/test/src/threadingTest.py +44 -25
  161. toil/test/src/toilContextManagerTest.py +10 -7
  162. toil/test/src/userDefinedJobArgTypeTest.py +8 -5
  163. toil/test/src/workerTest.py +73 -23
  164. toil/test/utils/toilDebugTest.py +103 -33
  165. toil/test/utils/toilKillTest.py +4 -5
  166. toil/test/utils/utilsTest.py +245 -106
  167. toil/test/wdl/wdltoil_test.py +818 -149
  168. toil/test/wdl/wdltoil_test_kubernetes.py +91 -0
  169. toil/toilState.py +120 -35
  170. toil/utils/toilConfig.py +13 -4
  171. toil/utils/toilDebugFile.py +44 -27
  172. toil/utils/toilDebugJob.py +214 -27
  173. toil/utils/toilDestroyCluster.py +11 -6
  174. toil/utils/toilKill.py +8 -3
  175. toil/utils/toilLaunchCluster.py +256 -140
  176. toil/utils/toilMain.py +37 -16
  177. toil/utils/toilRsyncCluster.py +32 -14
  178. toil/utils/toilSshCluster.py +49 -22
  179. toil/utils/toilStats.py +356 -273
  180. toil/utils/toilStatus.py +292 -139
  181. toil/utils/toilUpdateEC2Instances.py +3 -1
  182. toil/version.py +12 -12
  183. toil/wdl/utils.py +5 -5
  184. toil/wdl/wdltoil.py +3913 -1033
  185. toil/worker.py +367 -184
  186. {toil-6.1.0a1.dist-info → toil-8.0.0.dist-info}/LICENSE +25 -0
  187. toil-8.0.0.dist-info/METADATA +173 -0
  188. toil-8.0.0.dist-info/RECORD +253 -0
  189. {toil-6.1.0a1.dist-info → toil-8.0.0.dist-info}/WHEEL +1 -1
  190. toil-6.1.0a1.dist-info/METADATA +0 -125
  191. toil-6.1.0a1.dist-info/RECORD +0 -237
  192. {toil-6.1.0a1.dist-info → toil-8.0.0.dist-info}/entry_points.txt +0 -0
  193. {toil-6.1.0a1.dist-info → toil-8.0.0.dist-info}/top_level.txt +0 -0
@@ -18,10 +18,12 @@ import shlex
18
18
  import tempfile
19
19
  from queue import Empty
20
20
  from shlex import quote
21
- from typing import Dict, List, Optional
21
+ from typing import Optional
22
22
 
23
- from toil.batchSystems.abstractGridEngineBatchSystem import (AbstractGridEngineBatchSystem,
24
- UpdatedBatchJobInfo)
23
+ from toil.batchSystems.abstractGridEngineBatchSystem import (
24
+ AbstractGridEngineBatchSystem,
25
+ UpdatedBatchJobInfo,
26
+ )
25
27
  from toil.lib.conversions import hms_duration_to_seconds
26
28
  from toil.lib.misc import CalledProcessErrorStderr, call_command
27
29
 
@@ -31,7 +33,7 @@ logger = logging.getLogger(__name__)
31
33
  class TorqueBatchSystem(AbstractGridEngineBatchSystem):
32
34
 
33
35
  # class-specific Worker
34
- class Worker(AbstractGridEngineBatchSystem.Worker):
36
+ class GridEngineThread(AbstractGridEngineBatchSystem.GridEngineThread):
35
37
  def __init__(
36
38
  self, newJobsQueue, updatedJobsQueue, killQueue, killedJobsQueue, boss
37
39
  ):
@@ -41,18 +43,17 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
41
43
  self._version = self._pbsVersion()
42
44
 
43
45
  def _pbsVersion(self):
44
- """ Determines PBS/Torque version via pbsnodes
45
- """
46
+ """Determines PBS/Torque version via pbsnodes"""
46
47
  try:
47
48
  out = call_command(["pbsnodes", "--version"])
48
49
  if "PBSPro" in out:
49
- logger.debug("PBS Pro proprietary Torque version detected")
50
- self._version = "pro"
50
+ logger.debug("PBS Pro proprietary Torque version detected")
51
+ self._version = "pro"
51
52
  else:
52
- logger.debug("Torque OSS version detected")
53
- self._version = "oss"
53
+ logger.debug("Torque OSS version detected")
54
+ self._version = "oss"
54
55
  except CalledProcessErrorStderr as e:
55
- if e.returncode != 0:
56
+ if e.returncode != 0:
56
57
  logger.error("Could not determine PBS/Torque version")
57
58
 
58
59
  return self._version
@@ -60,6 +61,7 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
60
61
  """
61
62
  Torque-specific AbstractGridEngineWorker methods
62
63
  """
64
+
63
65
  def getRunningJobIDs(self):
64
66
  times = {}
65
67
  with self.runningJobsLock:
@@ -75,32 +77,33 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
75
77
  # PBS plain qstat will return every running job on the system.
76
78
  jobids = sorted(list(currentjobs.keys()))
77
79
  if self._version == "pro":
78
- stdout = call_command(['qstat', '-x'] + jobids)
80
+ stdout = call_command(["qstat", "-x"] + jobids)
79
81
  elif self._version == "oss":
80
- stdout = call_command(['qstat'] + jobids)
82
+ stdout = call_command(["qstat"] + jobids)
81
83
 
82
84
  # qstat supports XML output which is more comprehensive, but PBSPro does not support it
83
85
  # so instead we stick with plain commandline qstat tabular outputs
84
- for currline in stdout.split('\n'):
86
+ for currline in stdout.split("\n"):
85
87
  items = currline.strip().split()
86
88
  if items:
87
89
  jobid = items[0].strip().split(".")[0]
88
90
  if jobid in currentjobs:
89
91
  logger.debug("getRunningJobIDs job status for is: %s", items[4])
90
- if jobid in currentjobs and items[4] == 'R':
92
+ if jobid in currentjobs and items[4] == "R":
91
93
  walltime = items[3].strip()
92
94
  logger.debug(
93
95
  "getRunningJobIDs qstat reported walltime is: %s", walltime
94
96
  )
95
97
  # normal qstat has a quirk with job time where it reports '0'
96
98
  # when initially running; this catches this case
97
- if walltime == '0':
99
+ if walltime == "0":
98
100
  walltime = 0.0
99
101
  elif not walltime:
100
102
  # Sometimes we don't get any data here.
101
103
  # See https://github.com/DataBiosphere/toil/issues/3715
102
104
  logger.warning(
103
- "Assuming 0 walltime due to missing field in qstat line: %s", currline
105
+ "Assuming 0 walltime due to missing field in qstat line: %s",
106
+ currline,
104
107
  )
105
108
  walltime = 0.0
106
109
  else:
@@ -120,10 +123,12 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
120
123
  except Empty:
121
124
  logger.debug("getUpdatedBatchJob: Job queue is empty")
122
125
  else:
123
- return UpdatedBatchJobInfo(jobID=jobID, exitStatus=retcode, wallTime=None, exitReason=None)
126
+ return UpdatedBatchJobInfo(
127
+ jobID=jobID, exitStatus=retcode, wallTime=None, exitReason=None
128
+ )
124
129
 
125
130
  def killJob(self, jobID):
126
- call_command(['qdel', self.getBatchSystemID(jobID)])
131
+ call_command(["qdel", self.getBatchSystemID(jobID)])
127
132
 
128
133
  def prepareSubmission(
129
134
  self,
@@ -132,8 +137,9 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
132
137
  jobID: int,
133
138
  command: str,
134
139
  jobName: str,
135
- job_environment: Optional[Dict[str, str]] = None,
136
- gpus: Optional[int] = None) -> List[str]:
140
+ job_environment: Optional[dict[str, str]] = None,
141
+ gpus: Optional[int] = None,
142
+ ) -> list[str]:
137
143
  return self.prepareQsub(cpu, memory, jobID, job_environment) + [
138
144
  self.generateTorqueWrapper(command, jobID)
139
145
  ]
@@ -143,21 +149,25 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
143
149
 
144
150
  def getJobExitCode(self, torqueJobID):
145
151
  if self._version == "pro":
146
- args = ["qstat", "-x", "-f", str(torqueJobID).split('.')[0]]
152
+ args = ["qstat", "-x", "-f", str(torqueJobID).split(".")[0]]
147
153
  elif self._version == "oss":
148
- args = ["qstat", "-f", str(torqueJobID).split('.')[0]]
154
+ args = ["qstat", "-f", str(torqueJobID).split(".")[0]]
149
155
 
150
156
  stdout = call_command(args)
151
- for line in stdout.split('\n'):
157
+ for line in stdout.split("\n"):
152
158
  line = line.strip()
153
159
  # Case differences due to PBSPro vs OSS Torque qstat outputs
154
- if line.startswith("failed") or line.startswith("FAILED") and int(line.split()[1]) == 1:
160
+ if (
161
+ line.startswith("failed")
162
+ or line.startswith("FAILED")
163
+ and int(line.split()[1]) == 1
164
+ ):
155
165
  return 1
156
166
  if line.startswith("exit_status") or line.startswith("Exit_status"):
157
167
  status = line.split(" = ")[1]
158
168
  logger.debug("Exit Status: %s", status)
159
169
  return int(status)
160
- if 'unknown job id' in line.lower():
170
+ if "unknown job id" in line.lower():
161
171
  # some clusters configure Torque to forget everything about just
162
172
  # finished jobs instantly, apparently for performance reasons
163
173
  logger.debug(
@@ -176,8 +186,8 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
176
186
  cpu: int,
177
187
  mem: int,
178
188
  jobID: int,
179
- job_environment: Optional[Dict[str, str]],
180
- ) -> List[str]:
189
+ job_environment: Optional[dict[str, str]],
190
+ ) -> list[str]:
181
191
 
182
192
  # TODO: passing $PWD on command line not working for -d, resorting to
183
193
  # $PBS_O_WORKDIR but maybe should fix this here instead of in script?
@@ -189,9 +199,13 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
189
199
  environment.update(job_environment)
190
200
 
191
201
  if environment:
192
- qsubline.append('-v')
193
- qsubline.append(','.join(k + '=' + quote(os.environ[k] if v is None else v)
194
- for k, v in self.boss.environment.items()))
202
+ qsubline.append("-v")
203
+ qsubline.append(
204
+ ",".join(
205
+ k + "=" + quote(os.environ[k] if v is None else v)
206
+ for k, v in self.boss.environment.items()
207
+ )
208
+ )
195
209
 
196
210
  reqline = list()
197
211
  if self._version == "pro":
@@ -208,7 +222,7 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
208
222
  reqline.append("nodes=1:ppn=" + str(int(math.ceil(cpu))))
209
223
 
210
224
  # Other resource requirements can be passed through the environment (see man qsub)
211
- reqlineEnv = os.getenv('TOIL_TORQUE_REQS')
225
+ reqlineEnv = os.getenv("TOIL_TORQUE_REQS")
212
226
  if reqlineEnv is not None:
213
227
  logger.debug(
214
228
  "Additional Torque resource requirements appended to qsub from "
@@ -232,7 +246,7 @@ class TorqueBatchSystem(AbstractGridEngineBatchSystem):
232
246
  # All other qsub parameters can be passed through the environment (see man qsub).
233
247
  # No attempt is made to parse them out here and check that they do not conflict
234
248
  # with those that we already constructed above
235
- arglineEnv = os.getenv('TOIL_TORQUE_ARGS')
249
+ arglineEnv = os.getenv("TOIL_TORQUE_ARGS")
236
250
  if arglineEnv is not None:
237
251
  logger.debug(
238
252
  "Native Torque options appended to qsub from TOIL_TORQUE_ARGS env. variable: %s",