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
@@ -0,0 +1,12 @@
1
+ cwlVersion: v1.2
2
+ class: CommandLineTool
3
+ inputs: []
4
+ baseCommand: ["bash", "-c", "ulimit -m"]
5
+ stdout: memory.txt
6
+ outputs:
7
+ memory:
8
+ type: string
9
+ outputBinding:
10
+ glob: memory.txt
11
+ loadContents: True
12
+ outputEval: $(self[0].contents)
@@ -0,0 +1,29 @@
1
+ # This workflow fills in a required int from an optional int, but only when the
2
+ # int is really present. But it also uses the value to compute the conditional
3
+ # task's resource requirements, so Toil can't just schedule the task and then
4
+ # check the condition.
5
+ # See <https://github.com/DataBiosphere/toil/issues/4930#issue-2297563321>
6
+ cwlVersion: v1.2
7
+ class: Workflow
8
+ requirements:
9
+ InlineJavascriptRequirement: {}
10
+ inputs:
11
+ optional_input: int?
12
+ steps:
13
+ the_step:
14
+ in:
15
+ required_input:
16
+ source: optional_input
17
+ when: $(inputs.required_input != null)
18
+ run:
19
+ cwlVersion: v1.2
20
+ class: CommandLineTool
21
+ inputs:
22
+ required_input: int
23
+ requirements:
24
+ ResourceRequirement:
25
+ coresMax: $(inputs.required_input)
26
+ baseCommand: "nproc"
27
+ outputs: []
28
+ out: []
29
+ outputs: []
@@ -0,0 +1,40 @@
1
+ cwlVersion: v1.2
2
+ class: Workflow
3
+ id: scatter-duplicate-outputs
4
+
5
+ inputs:
6
+ - id: toScatterOver
7
+ type: string[]
8
+ default: ['this','is','an','array','of','more','than','two','things']
9
+
10
+ steps:
11
+ echo:
12
+ run:
13
+ id: scatter
14
+ class: CommandLineTool
15
+ inputs:
16
+ s: string
17
+ baseCommand: [echo]
18
+ arguments: [ $(inputs.s)]
19
+ stdout: scatter.out
20
+ stderr: scatter.err
21
+ outputs:
22
+ out: stdout
23
+ err: stderr
24
+ in:
25
+ - id: s
26
+ source: toScatterOver
27
+ scatter:
28
+ - s
29
+ out:
30
+ - id: out
31
+ - id: err
32
+
33
+ outputs:
34
+ - id: echo_out
35
+ type: File[]
36
+ outputSource: ["echo/out"]
37
+
38
+
39
+ requirements:
40
+ - class: ScatterFeatureRequirement
@@ -21,4 +21,4 @@ hints:
21
21
  packages:
22
22
  - package: seqtk
23
23
  version:
24
- - r93
24
+ - '1.4'
@@ -5,15 +5,18 @@ import subprocess
5
5
  import sys
6
6
  import unittest
7
7
 
8
- pkg_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # noqa
8
+ import pytest
9
+
10
+ pkg_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) # noqa
9
11
  sys.path.insert(0, pkg_root) # noqa
10
12
 
11
- from toil.test import ToilTest, needs_cwl, needs_docker
13
+ from toil.test import ToilTest, needs_docker
12
14
  from toil.version import python
13
15
 
14
16
 
15
17
  class ToilDocumentationTest(ToilTest):
16
18
  """Tests for scripts in the toil tutorials."""
19
+
17
20
  @classmethod
18
21
  def setUpClass(cls):
19
22
  super(ToilTest, cls).setUpClass()
@@ -21,14 +24,8 @@ class ToilDocumentationTest(ToilTest):
21
24
 
22
25
  def tearDown(self) -> None:
23
26
  super(ToilTest, self).tearDown()
24
- # src/toil/test/docs/scripts/cwlExampleFiles/sample_1_output.txt
25
- output_files = ["sample_1_output.txt", "sample_2_output.txt", "sample_3_output.txt"]
26
- for output in output_files:
27
- output_file = os.path.join(self.directory, 'scripts/cwlExampleFiles', output)
28
- if os.path.exists(output_file):
29
- os.remove(output_file)
30
-
31
- jobstores = ['/mnt/ephemeral/workspace/toil-pull-requests/toilWorkflowRun']
27
+
28
+ jobstores = ["/mnt/ephemeral/workspace/toil-pull-requests/toilWorkflowRun"]
32
29
  for jobstore in jobstores:
33
30
  if os.path.exists(jobstore):
34
31
  shutil.rmtree(jobstore)
@@ -36,19 +33,24 @@ class ToilDocumentationTest(ToilTest):
36
33
  unittest.TestCase.tearDown(self)
37
34
 
38
35
  """Just check the exit code"""
39
- def checkExitCode(self, script):
36
+
37
+ def checkExitCode(self, script, extra_args: list[str] = []):
40
38
  program = os.path.join(self.directory, "scripts", script)
41
- process = subprocess.Popen([python, program, "file:my-jobstore", "--clean=always"],
42
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
39
+ process = subprocess.Popen(
40
+ [python, program, "file:my-jobstore", "--clean=always"] + extra_args,
41
+ stdout=subprocess.PIPE,
42
+ stderr=subprocess.PIPE,
43
+ )
43
44
  stdout, stderr = process.communicate()
44
45
  if isinstance(stdout, bytes):
45
- stdout = stdout.decode('utf-8')
46
- stderr = stderr.decode('utf-8')
46
+ stdout = stdout.decode("utf-8")
47
+ stderr = stderr.decode("utf-8")
47
48
  if not process.returncode == 0:
48
49
  raise RuntimeError(stderr)
49
- return stdout + ' ' + stderr
50
+ return stdout + " " + stderr
50
51
 
51
52
  """Check the exit code and the output"""
53
+
52
54
  def checkExpectedOut(self, script, expectedOutput):
53
55
  outerr = self.checkExitCode(script)
54
56
 
@@ -57,6 +59,7 @@ class ToilDocumentationTest(ToilTest):
57
59
  self.assertGreater(index, -1, f"Expected:\n{expectedOutput}\nOutput:\n{outerr}")
58
60
 
59
61
  """Check the exit code and look for a pattern"""
62
+
60
63
  def checkExpectedPattern(self, script, expectedPattern):
61
64
  outerr = self.checkExitCode(script)
62
65
 
@@ -65,13 +68,11 @@ class ToilDocumentationTest(ToilTest):
65
68
  n = re.search(pattern, outerr)
66
69
  self.assertNotEqual(n, None, f"Pattern:\n{expectedPattern}\nOutput:\n{outerr}")
67
70
 
68
- @needs_cwl
69
- def testCwlexample(self):
70
- self.checkExitCode("tutorial_cwlexample.py")
71
-
72
- def testDiscoverfiles(self):
73
- self.checkExitCode("tutorial_discoverfiles.py")
71
+ def testStats(self):
72
+ # This script asks for 4 cores but we might need to run the tests in only 3.
73
+ self.checkExitCode("tutorial_stats.py", ["--scale=0.5"])
74
74
 
75
+ @pytest.mark.timeout(1200)
75
76
  def testDynamic(self):
76
77
  self.checkExitCode("tutorial_dynamic.py")
77
78
 
@@ -82,16 +83,24 @@ class ToilDocumentationTest(ToilTest):
82
83
  self.checkExitCode("tutorial_encapsulation2.py")
83
84
 
84
85
  def testHelloworld(self):
85
- self.checkExpectedOut("tutorial_helloworld.py", "Hello, world!, here's a message: You did it!\n")
86
+ self.checkExpectedOut(
87
+ "tutorial_helloworld.py", "Hello, world!, here's a message: You did it!\n"
88
+ )
86
89
 
87
90
  def testInvokeworkflow(self):
88
- self.checkExpectedOut("tutorial_invokeworkflow.py", "Hello, world!, here's a message: Woot\n")
91
+ self.checkExpectedOut(
92
+ "tutorial_invokeworkflow.py", "Hello, world!, here's a message: Woot\n"
93
+ )
89
94
 
90
95
  def testInvokeworkflow2(self):
91
- self.checkExpectedOut("tutorial_invokeworkflow2.py", "Hello, world!, I have a message: Woot!\n")
96
+ self.checkExpectedOut(
97
+ "tutorial_invokeworkflow2.py", "Hello, world!, I have a message: Woot!\n"
98
+ )
92
99
 
93
100
  def testJobFunctions(self):
94
- self.checkExpectedOut("tutorial_jobfunctions.py", "Hello world, I have a message: Woot!\n")
101
+ self.checkExpectedOut(
102
+ "tutorial_jobfunctions.py", "Hello world, I have a message: Woot!\n"
103
+ )
95
104
 
96
105
  def testManaging(self):
97
106
  self.checkExitCode("tutorial_managing.py")
@@ -100,38 +109,51 @@ class ToilDocumentationTest(ToilTest):
100
109
  self.checkExitCode("tutorial_managing2.py")
101
110
 
102
111
  def testMultiplejobs(self):
103
- self.checkExpectedPattern("tutorial_multiplejobs.py",
104
- "Hello world, I have a message: first.*Hello world, I have a message: "
105
- "second or third.*Hello world, I have a message: second or third.*Hello world,"
106
- " I have a message: last")
112
+ self.checkExpectedPattern(
113
+ "tutorial_multiplejobs.py",
114
+ "Hello world, I have a message: first.*Hello world, I have a message: "
115
+ "second or third.*Hello world, I have a message: second or third.*Hello world,"
116
+ " I have a message: last",
117
+ )
107
118
 
108
119
  def testMultiplejobs2(self):
109
- self.checkExpectedPattern("tutorial_multiplejobs2.py",
110
- "Hello world, I have a message: first.*Hello world, I have a message: "
111
- "second or third.*Hello world, I have a message: second or third.*Hello world,"
112
- " I have a message: last")
120
+ self.checkExpectedPattern(
121
+ "tutorial_multiplejobs2.py",
122
+ "Hello world, I have a message: first.*Hello world, I have a message: "
123
+ "second or third.*Hello world, I have a message: second or third.*Hello world,"
124
+ " I have a message: last",
125
+ )
113
126
 
114
127
  def testMultiplejobs3(self):
115
- self.checkExpectedPattern("tutorial_multiplejobs3.py",
116
- "Hello world, I have a message: first.*Hello world, I have a message: "
117
- "second or third.*Hello world, I have a message: second or third.*Hello world,"
118
- " I have a message: last")
119
-
128
+ self.checkExpectedPattern(
129
+ "tutorial_multiplejobs3.py",
130
+ "Hello world, I have a message: first.*Hello world, I have a message: "
131
+ "second or third.*Hello world, I have a message: second or third.*Hello world,"
132
+ " I have a message: last",
133
+ )
134
+
135
+ @pytest.mark.timeout(1200)
120
136
  def testPromises2(self):
121
- self.checkExpectedOut("tutorial_promises2.py",
122
- "['00000', '00001', '00010', '00011', '00100', '00101', '00110', '00111',"
123
- " '01000', '01001', '01010', '01011', '01100', '01101', '01110', '01111',"
124
- " '10000', '10001', '10010', '10011', '10100', '10101', '10110', '10111',"
125
- " '11000', '11001', '11010', '11011', '11100', '11101', '11110', '11111']")
137
+ self.checkExpectedOut(
138
+ "tutorial_promises2.py",
139
+ "['00000', '00001', '00010', '00011', '00100', '00101', '00110', '00111',"
140
+ " '01000', '01001', '01010', '01011', '01100', '01101', '01110', '01111',"
141
+ " '10000', '10001', '10010', '10011', '10100', '10101', '10110', '10111',"
142
+ " '11000', '11001', '11010', '11011', '11100', '11101', '11110', '11111']",
143
+ )
126
144
 
127
145
  def testQuickstart(self):
128
- self.checkExpectedOut("tutorial_quickstart.py", "Hello, world!, here's a message: Woot\n")
146
+ self.checkExpectedOut(
147
+ "tutorial_quickstart.py", "Hello, world!, here's a message: Woot\n"
148
+ )
129
149
 
130
150
  def testRequirements(self):
131
151
  self.checkExitCode("tutorial_requirements.py")
132
152
 
133
153
  def testArguments(self):
134
- self.checkExpectedOut("tutorial_arguments.py", "Hello, world!, here's a message: Woot")
154
+ self.checkExpectedOut(
155
+ "tutorial_arguments.py", "Hello, world!, here's a message: Woot"
156
+ )
135
157
 
136
158
  @needs_docker
137
159
  def testDocker(self):
@@ -146,5 +168,6 @@ class ToilDocumentationTest(ToilTest):
146
168
  def testStaging(self):
147
169
  self.checkExitCode("tutorial_staging.py")
148
170
 
171
+
149
172
  if __name__ == "__main__":
150
173
  unittest.main()