toil 7.0.0__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.
- toil/__init__.py +121 -83
- toil/batchSystems/__init__.py +1 -0
- toil/batchSystems/abstractBatchSystem.py +137 -77
- toil/batchSystems/abstractGridEngineBatchSystem.py +211 -101
- toil/batchSystems/awsBatch.py +237 -128
- toil/batchSystems/cleanup_support.py +22 -16
- toil/batchSystems/contained_executor.py +30 -26
- toil/batchSystems/gridengine.py +85 -49
- toil/batchSystems/htcondor.py +164 -87
- toil/batchSystems/kubernetes.py +622 -386
- toil/batchSystems/local_support.py +17 -12
- toil/batchSystems/lsf.py +132 -79
- toil/batchSystems/lsfHelper.py +13 -11
- toil/batchSystems/mesos/__init__.py +41 -29
- toil/batchSystems/mesos/batchSystem.py +288 -149
- toil/batchSystems/mesos/executor.py +77 -49
- toil/batchSystems/mesos/test/__init__.py +31 -23
- toil/batchSystems/options.py +38 -29
- toil/batchSystems/registry.py +53 -19
- toil/batchSystems/singleMachine.py +293 -123
- toil/batchSystems/slurm.py +489 -137
- toil/batchSystems/torque.py +46 -32
- toil/bus.py +141 -73
- toil/common.py +630 -359
- toil/cwl/__init__.py +1 -1
- toil/cwl/cwltoil.py +1114 -532
- toil/cwl/utils.py +17 -22
- toil/deferred.py +62 -41
- toil/exceptions.py +5 -3
- toil/fileStores/__init__.py +5 -5
- toil/fileStores/abstractFileStore.py +88 -57
- toil/fileStores/cachingFileStore.py +711 -247
- toil/fileStores/nonCachingFileStore.py +113 -75
- toil/job.py +988 -315
- toil/jobStores/abstractJobStore.py +387 -243
- toil/jobStores/aws/jobStore.py +727 -403
- toil/jobStores/aws/utils.py +161 -109
- toil/jobStores/conftest.py +1 -0
- toil/jobStores/fileJobStore.py +289 -151
- toil/jobStores/googleJobStore.py +137 -70
- toil/jobStores/utils.py +36 -15
- toil/leader.py +614 -269
- toil/lib/accelerators.py +115 -18
- toil/lib/aws/__init__.py +55 -28
- toil/lib/aws/ami.py +122 -87
- toil/lib/aws/iam.py +284 -108
- toil/lib/aws/s3.py +31 -0
- toil/lib/aws/session.py +193 -58
- toil/lib/aws/utils.py +238 -218
- toil/lib/bioio.py +13 -5
- toil/lib/compatibility.py +11 -6
- toil/lib/conversions.py +83 -49
- toil/lib/docker.py +131 -103
- toil/lib/ec2.py +322 -209
- toil/lib/ec2nodes.py +174 -106
- toil/lib/encryption/_dummy.py +5 -3
- toil/lib/encryption/_nacl.py +10 -6
- toil/lib/encryption/conftest.py +1 -0
- toil/lib/exceptions.py +26 -7
- toil/lib/expando.py +4 -2
- toil/lib/ftp_utils.py +217 -0
- toil/lib/generatedEC2Lists.py +127 -19
- toil/lib/humanize.py +6 -2
- toil/lib/integration.py +341 -0
- toil/lib/io.py +99 -11
- toil/lib/iterables.py +4 -2
- toil/lib/memoize.py +12 -8
- toil/lib/misc.py +65 -18
- toil/lib/objects.py +2 -2
- toil/lib/resources.py +19 -7
- toil/lib/retry.py +115 -77
- toil/lib/threading.py +282 -80
- toil/lib/throttle.py +15 -14
- toil/options/common.py +834 -401
- toil/options/cwl.py +175 -90
- toil/options/runner.py +50 -0
- toil/options/wdl.py +70 -19
- toil/provisioners/__init__.py +111 -46
- toil/provisioners/abstractProvisioner.py +322 -157
- toil/provisioners/aws/__init__.py +62 -30
- toil/provisioners/aws/awsProvisioner.py +980 -627
- toil/provisioners/clusterScaler.py +541 -279
- toil/provisioners/gceProvisioner.py +282 -179
- toil/provisioners/node.py +147 -79
- toil/realtimeLogger.py +34 -22
- toil/resource.py +137 -75
- toil/server/app.py +127 -61
- toil/server/celery_app.py +3 -1
- toil/server/cli/wes_cwl_runner.py +82 -53
- toil/server/utils.py +54 -28
- toil/server/wes/abstract_backend.py +64 -26
- toil/server/wes/amazon_wes_utils.py +21 -15
- toil/server/wes/tasks.py +121 -63
- toil/server/wes/toil_backend.py +142 -107
- toil/server/wsgi_app.py +4 -3
- toil/serviceManager.py +58 -22
- toil/statsAndLogging.py +148 -64
- toil/test/__init__.py +263 -179
- toil/test/batchSystems/batchSystemTest.py +438 -195
- toil/test/batchSystems/batch_system_plugin_test.py +18 -7
- toil/test/batchSystems/test_gridengine.py +173 -0
- toil/test/batchSystems/test_lsf_helper.py +67 -58
- toil/test/batchSystems/test_slurm.py +93 -47
- toil/test/cactus/test_cactus_integration.py +20 -22
- toil/test/cwl/cwlTest.py +271 -71
- toil/test/cwl/measure_default_memory.cwl +12 -0
- toil/test/cwl/not_run_required_input.cwl +29 -0
- toil/test/cwl/scatter_duplicate_outputs.cwl +40 -0
- toil/test/docs/scriptsTest.py +60 -34
- toil/test/jobStores/jobStoreTest.py +412 -235
- toil/test/lib/aws/test_iam.py +116 -48
- toil/test/lib/aws/test_s3.py +16 -9
- toil/test/lib/aws/test_utils.py +5 -6
- toil/test/lib/dockerTest.py +118 -141
- toil/test/lib/test_conversions.py +113 -115
- toil/test/lib/test_ec2.py +57 -49
- toil/test/lib/test_integration.py +104 -0
- toil/test/lib/test_misc.py +12 -5
- toil/test/mesos/MesosDataStructuresTest.py +23 -10
- toil/test/mesos/helloWorld.py +7 -6
- toil/test/mesos/stress.py +25 -20
- toil/test/options/options.py +7 -2
- toil/test/provisioners/aws/awsProvisionerTest.py +293 -140
- toil/test/provisioners/clusterScalerTest.py +440 -250
- toil/test/provisioners/clusterTest.py +81 -42
- toil/test/provisioners/gceProvisionerTest.py +174 -100
- toil/test/provisioners/provisionerTest.py +25 -13
- toil/test/provisioners/restartScript.py +5 -4
- toil/test/server/serverTest.py +188 -141
- toil/test/sort/restart_sort.py +137 -68
- toil/test/sort/sort.py +134 -66
- toil/test/sort/sortTest.py +91 -49
- toil/test/src/autoDeploymentTest.py +140 -100
- toil/test/src/busTest.py +20 -18
- toil/test/src/checkpointTest.py +8 -2
- toil/test/src/deferredFunctionTest.py +49 -35
- toil/test/src/dockerCheckTest.py +33 -26
- toil/test/src/environmentTest.py +20 -10
- toil/test/src/fileStoreTest.py +538 -271
- toil/test/src/helloWorldTest.py +7 -4
- toil/test/src/importExportFileTest.py +61 -31
- toil/test/src/jobDescriptionTest.py +32 -17
- toil/test/src/jobEncapsulationTest.py +2 -0
- toil/test/src/jobFileStoreTest.py +74 -50
- toil/test/src/jobServiceTest.py +187 -73
- toil/test/src/jobTest.py +120 -70
- toil/test/src/miscTests.py +19 -18
- toil/test/src/promisedRequirementTest.py +82 -36
- toil/test/src/promisesTest.py +7 -6
- toil/test/src/realtimeLoggerTest.py +6 -6
- toil/test/src/regularLogTest.py +71 -37
- toil/test/src/resourceTest.py +80 -49
- toil/test/src/restartDAGTest.py +36 -22
- toil/test/src/resumabilityTest.py +9 -2
- toil/test/src/retainTempDirTest.py +45 -14
- toil/test/src/systemTest.py +12 -8
- toil/test/src/threadingTest.py +44 -25
- toil/test/src/toilContextManagerTest.py +10 -7
- toil/test/src/userDefinedJobArgTypeTest.py +8 -5
- toil/test/src/workerTest.py +33 -16
- toil/test/utils/toilDebugTest.py +70 -58
- toil/test/utils/toilKillTest.py +4 -5
- toil/test/utils/utilsTest.py +239 -102
- toil/test/wdl/wdltoil_test.py +789 -148
- toil/test/wdl/wdltoil_test_kubernetes.py +37 -23
- toil/toilState.py +52 -26
- toil/utils/toilConfig.py +13 -4
- toil/utils/toilDebugFile.py +44 -27
- toil/utils/toilDebugJob.py +85 -25
- toil/utils/toilDestroyCluster.py +11 -6
- toil/utils/toilKill.py +8 -3
- toil/utils/toilLaunchCluster.py +251 -145
- toil/utils/toilMain.py +37 -16
- toil/utils/toilRsyncCluster.py +27 -14
- toil/utils/toilSshCluster.py +45 -22
- toil/utils/toilStats.py +75 -36
- toil/utils/toilStatus.py +226 -119
- toil/utils/toilUpdateEC2Instances.py +3 -1
- toil/version.py +11 -11
- toil/wdl/utils.py +5 -5
- toil/wdl/wdltoil.py +3513 -1052
- toil/worker.py +269 -128
- toil-8.0.0.dist-info/METADATA +173 -0
- toil-8.0.0.dist-info/RECORD +253 -0
- {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/WHEEL +1 -1
- toil-7.0.0.dist-info/METADATA +0 -158
- toil-7.0.0.dist-info/RECORD +0 -244
- {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/LICENSE +0 -0
- {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/entry_points.txt +0 -0
- {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/top_level.txt +0 -0
toil/lib/aws/session.py
CHANGED
|
@@ -15,7 +15,7 @@ import collections
|
|
|
15
15
|
import logging
|
|
16
16
|
import os
|
|
17
17
|
import threading
|
|
18
|
-
from typing import
|
|
18
|
+
from typing import TYPE_CHECKING, Literal, Optional, cast, overload
|
|
19
19
|
|
|
20
20
|
import boto3
|
|
21
21
|
import boto3.resources.base
|
|
@@ -24,12 +24,14 @@ from boto3 import Session
|
|
|
24
24
|
from botocore.client import Config
|
|
25
25
|
from botocore.session import get_session
|
|
26
26
|
from botocore.utils import JSONFileCache
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
from
|
|
30
|
-
from
|
|
31
|
-
from
|
|
32
|
-
from
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from mypy_boto3_autoscaling import AutoScalingClient
|
|
30
|
+
from mypy_boto3_ec2 import EC2Client, EC2ServiceResource
|
|
31
|
+
from mypy_boto3_iam import IAMClient, IAMServiceResource
|
|
32
|
+
from mypy_boto3_s3 import S3Client, S3ServiceResource
|
|
33
|
+
from mypy_boto3_sdb import SimpleDBClient
|
|
34
|
+
from mypy_boto3_sts import STSClient
|
|
33
35
|
|
|
34
36
|
logger = logging.getLogger(__name__)
|
|
35
37
|
|
|
@@ -49,6 +51,7 @@ logger = logging.getLogger(__name__)
|
|
|
49
51
|
# initializing Boto3 (or Boto2) things at a time.
|
|
50
52
|
_init_lock = threading.RLock()
|
|
51
53
|
|
|
54
|
+
|
|
52
55
|
def _new_boto3_session(region_name: Optional[str] = None) -> Session:
|
|
53
56
|
"""
|
|
54
57
|
This is the One True Place where new Boto3 sessions should be made, and
|
|
@@ -64,10 +67,16 @@ def _new_boto3_session(region_name: Optional[str] = None) -> Session:
|
|
|
64
67
|
|
|
65
68
|
with _init_lock:
|
|
66
69
|
botocore_session = get_session()
|
|
67
|
-
botocore_session.get_component(
|
|
68
|
-
|
|
70
|
+
botocore_session.get_component("credential_provider").get_provider(
|
|
71
|
+
"assume-role"
|
|
72
|
+
).cache = JSONFileCache()
|
|
73
|
+
|
|
74
|
+
return Session(
|
|
75
|
+
botocore_session=botocore_session,
|
|
76
|
+
region_name=region_name,
|
|
77
|
+
profile_name=os.environ.get("TOIL_AWS_PROFILE", None),
|
|
78
|
+
)
|
|
69
79
|
|
|
70
|
-
return Session(botocore_session=botocore_session, region_name=region_name, profile_name=os.environ.get("TOIL_AWS_PROFILE", None))
|
|
71
80
|
|
|
72
81
|
class AWSConnectionManager:
|
|
73
82
|
"""
|
|
@@ -103,36 +112,64 @@ class AWSConnectionManager:
|
|
|
103
112
|
"""
|
|
104
113
|
# This stores Boto3 sessions in .item of a thread-local storage, by
|
|
105
114
|
# region.
|
|
106
|
-
self.sessions_by_region:
|
|
115
|
+
self.sessions_by_region: dict[Optional[str], threading.local] = (
|
|
116
|
+
collections.defaultdict(threading.local)
|
|
117
|
+
)
|
|
107
118
|
# This stores Boto3 resources in .item of a thread-local storage, by
|
|
108
119
|
# (region, service name, endpoint URL) tuples
|
|
109
|
-
self.resource_cache:
|
|
120
|
+
self.resource_cache: dict[
|
|
121
|
+
tuple[Optional[str], str, Optional[str]], threading.local
|
|
122
|
+
] = collections.defaultdict(threading.local)
|
|
110
123
|
# This stores Boto3 clients in .item of a thread-local storage, by
|
|
111
124
|
# (region, service name, endpoint URL) tuples
|
|
112
|
-
self.client_cache:
|
|
125
|
+
self.client_cache: dict[
|
|
126
|
+
tuple[Optional[str], str, Optional[str]], threading.local
|
|
127
|
+
] = collections.defaultdict(threading.local)
|
|
113
128
|
# This stores Boto 2 connections in .item of a thread-local storage, by
|
|
114
129
|
# (region, service name) tuples.
|
|
115
|
-
self.boto2_cache:
|
|
130
|
+
self.boto2_cache: dict[tuple[Optional[str], str], threading.local] = (
|
|
131
|
+
collections.defaultdict(threading.local)
|
|
132
|
+
)
|
|
116
133
|
|
|
117
134
|
def session(self, region: Optional[str]) -> boto3.session.Session:
|
|
118
135
|
"""
|
|
119
136
|
Get the Boto3 Session to use for the given region.
|
|
120
137
|
"""
|
|
121
138
|
storage = self.sessions_by_region[region]
|
|
122
|
-
if not hasattr(storage,
|
|
139
|
+
if not hasattr(storage, "item"):
|
|
123
140
|
# This is the first time this thread wants to talk to this region
|
|
124
141
|
# through this manager
|
|
125
142
|
storage.item = _new_boto3_session(region_name=region)
|
|
126
143
|
return cast(boto3.session.Session, storage.item)
|
|
127
144
|
|
|
128
145
|
@overload
|
|
129
|
-
def resource(
|
|
146
|
+
def resource(
|
|
147
|
+
self,
|
|
148
|
+
region: Optional[str],
|
|
149
|
+
service_name: Literal["s3"],
|
|
150
|
+
endpoint_url: Optional[str] = None,
|
|
151
|
+
) -> "S3ServiceResource": ...
|
|
130
152
|
@overload
|
|
131
|
-
def resource(
|
|
153
|
+
def resource(
|
|
154
|
+
self,
|
|
155
|
+
region: Optional[str],
|
|
156
|
+
service_name: Literal["iam"],
|
|
157
|
+
endpoint_url: Optional[str] = None,
|
|
158
|
+
) -> "IAMServiceResource": ...
|
|
132
159
|
@overload
|
|
133
|
-
def resource(
|
|
134
|
-
|
|
135
|
-
|
|
160
|
+
def resource(
|
|
161
|
+
self,
|
|
162
|
+
region: Optional[str],
|
|
163
|
+
service_name: Literal["ec2"],
|
|
164
|
+
endpoint_url: Optional[str] = None,
|
|
165
|
+
) -> "EC2ServiceResource": ...
|
|
166
|
+
|
|
167
|
+
def resource(
|
|
168
|
+
self,
|
|
169
|
+
region: Optional[str],
|
|
170
|
+
service_name: str,
|
|
171
|
+
endpoint_url: Optional[str] = None,
|
|
172
|
+
) -> boto3.resources.base.ServiceResource:
|
|
136
173
|
"""
|
|
137
174
|
Get the Boto3 Resource to use with the given service (like 'ec2') in the given region.
|
|
138
175
|
|
|
@@ -141,7 +178,7 @@ class AWSConnectionManager:
|
|
|
141
178
|
"""
|
|
142
179
|
key = (region, service_name, endpoint_url)
|
|
143
180
|
storage = self.resource_cache[key]
|
|
144
|
-
if not hasattr(storage,
|
|
181
|
+
if not hasattr(storage, "item"):
|
|
145
182
|
with _init_lock:
|
|
146
183
|
# We lock inside the if check; we don't care if the memoization
|
|
147
184
|
# sometimes results in multiple different copies leaking out.
|
|
@@ -151,35 +188,69 @@ class AWSConnectionManager:
|
|
|
151
188
|
# The Boto3 stubs are missing an overload for `resource` that takes
|
|
152
189
|
# a non-literal string. See
|
|
153
190
|
# <https://github.com/vemel/mypy_boto3_builder/issues/121#issuecomment-1011322636>
|
|
154
|
-
storage.item = self.session(region).resource(service_name, endpoint_url=endpoint_url)
|
|
191
|
+
storage.item = self.session(region).resource(service_name, endpoint_url=endpoint_url) # type: ignore
|
|
155
192
|
else:
|
|
156
193
|
# We might not be able to pass None to Boto3 and have it be the same as no argument.
|
|
157
|
-
storage.item = self.session(region).resource(service_name)
|
|
194
|
+
storage.item = self.session(region).resource(service_name) # type: ignore
|
|
158
195
|
|
|
159
196
|
return cast(boto3.resources.base.ServiceResource, storage.item)
|
|
160
197
|
|
|
161
198
|
@overload
|
|
162
|
-
def client(
|
|
163
|
-
|
|
199
|
+
def client(
|
|
200
|
+
self,
|
|
201
|
+
region: Optional[str],
|
|
202
|
+
service_name: Literal["ec2"],
|
|
203
|
+
endpoint_url: Optional[str] = None,
|
|
204
|
+
config: Optional[Config] = None,
|
|
205
|
+
) -> "EC2Client": ...
|
|
164
206
|
@overload
|
|
165
|
-
def client(
|
|
166
|
-
|
|
207
|
+
def client(
|
|
208
|
+
self,
|
|
209
|
+
region: Optional[str],
|
|
210
|
+
service_name: Literal["iam"],
|
|
211
|
+
endpoint_url: Optional[str] = None,
|
|
212
|
+
config: Optional[Config] = None,
|
|
213
|
+
) -> "IAMClient": ...
|
|
167
214
|
@overload
|
|
168
|
-
def client(
|
|
169
|
-
|
|
215
|
+
def client(
|
|
216
|
+
self,
|
|
217
|
+
region: Optional[str],
|
|
218
|
+
service_name: Literal["s3"],
|
|
219
|
+
endpoint_url: Optional[str] = None,
|
|
220
|
+
config: Optional[Config] = None,
|
|
221
|
+
) -> "S3Client": ...
|
|
170
222
|
@overload
|
|
171
|
-
def client(
|
|
172
|
-
|
|
223
|
+
def client(
|
|
224
|
+
self,
|
|
225
|
+
region: Optional[str],
|
|
226
|
+
service_name: Literal["sts"],
|
|
227
|
+
endpoint_url: Optional[str] = None,
|
|
228
|
+
config: Optional[Config] = None,
|
|
229
|
+
) -> "STSClient": ...
|
|
173
230
|
@overload
|
|
174
|
-
def client(
|
|
175
|
-
|
|
231
|
+
def client(
|
|
232
|
+
self,
|
|
233
|
+
region: Optional[str],
|
|
234
|
+
service_name: Literal["sdb"],
|
|
235
|
+
endpoint_url: Optional[str] = None,
|
|
236
|
+
config: Optional[Config] = None,
|
|
237
|
+
) -> "SimpleDBClient": ...
|
|
176
238
|
@overload
|
|
177
|
-
def client(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
239
|
+
def client(
|
|
240
|
+
self,
|
|
241
|
+
region: Optional[str],
|
|
242
|
+
service_name: Literal["autoscaling"],
|
|
243
|
+
endpoint_url: Optional[str] = None,
|
|
244
|
+
config: Optional[Config] = None,
|
|
245
|
+
) -> "AutoScalingClient": ...
|
|
246
|
+
|
|
247
|
+
def client(
|
|
248
|
+
self,
|
|
249
|
+
region: Optional[str],
|
|
250
|
+
service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"],
|
|
251
|
+
endpoint_url: Optional[str] = None,
|
|
252
|
+
config: Optional[Config] = None,
|
|
253
|
+
) -> botocore.client.BaseClient:
|
|
183
254
|
"""
|
|
184
255
|
Get the Boto3 Client to use with the given service (like 'ec2') in the given region.
|
|
185
256
|
|
|
@@ -192,29 +263,34 @@ class AWSConnectionManager:
|
|
|
192
263
|
# Don't try and memoize if a custom config is used
|
|
193
264
|
with _init_lock:
|
|
194
265
|
if endpoint_url is not None:
|
|
195
|
-
return self.session(region).client(
|
|
266
|
+
return self.session(region).client(
|
|
267
|
+
service_name, endpoint_url=endpoint_url, config=config
|
|
268
|
+
)
|
|
196
269
|
else:
|
|
197
270
|
return self.session(region).client(service_name, config=config)
|
|
198
271
|
|
|
199
272
|
key = (region, service_name, endpoint_url)
|
|
200
273
|
storage = self.client_cache[key]
|
|
201
|
-
if not hasattr(storage,
|
|
274
|
+
if not hasattr(storage, "item"):
|
|
202
275
|
with _init_lock:
|
|
203
276
|
# We lock because we call .client()
|
|
204
277
|
|
|
205
278
|
if endpoint_url is not None:
|
|
206
279
|
# The Boto3 stubs are probably missing an overload here too. See:
|
|
207
280
|
# <https://github.com/vemel/mypy_boto3_builder/issues/121#issuecomment-1011322636>
|
|
208
|
-
storage.item = self.session(region).client(
|
|
281
|
+
storage.item = self.session(region).client(
|
|
282
|
+
service_name, endpoint_url=endpoint_url
|
|
283
|
+
)
|
|
209
284
|
else:
|
|
210
285
|
# We might not be able to pass None to Boto3 and have it be the same as no argument.
|
|
211
286
|
storage.item = self.session(region).client(service_name)
|
|
212
|
-
return cast(botocore.client.BaseClient
|
|
287
|
+
return cast(botocore.client.BaseClient, storage.item)
|
|
213
288
|
|
|
214
289
|
|
|
215
290
|
# If you don't want your own AWSConnectionManager, we have a global one and some global functions
|
|
216
291
|
_global_manager = AWSConnectionManager()
|
|
217
292
|
|
|
293
|
+
|
|
218
294
|
def establish_boto3_session(region_name: Optional[str] = None) -> Session:
|
|
219
295
|
"""
|
|
220
296
|
Get a Boto 3 session usable by the current thread.
|
|
@@ -225,20 +301,57 @@ def establish_boto3_session(region_name: Optional[str] = None) -> Session:
|
|
|
225
301
|
# Just use a global version of the manager. Note that we change the argument order!
|
|
226
302
|
return _global_manager.session(region_name)
|
|
227
303
|
|
|
304
|
+
|
|
228
305
|
@overload
|
|
229
|
-
def client(
|
|
306
|
+
def client(
|
|
307
|
+
service_name: Literal["ec2"],
|
|
308
|
+
region_name: Optional[str] = None,
|
|
309
|
+
endpoint_url: Optional[str] = None,
|
|
310
|
+
config: Optional[Config] = None,
|
|
311
|
+
) -> "EC2Client": ...
|
|
230
312
|
@overload
|
|
231
|
-
def client(
|
|
313
|
+
def client(
|
|
314
|
+
service_name: Literal["iam"],
|
|
315
|
+
region_name: Optional[str] = None,
|
|
316
|
+
endpoint_url: Optional[str] = None,
|
|
317
|
+
config: Optional[Config] = None,
|
|
318
|
+
) -> "IAMClient": ...
|
|
232
319
|
@overload
|
|
233
|
-
def client(
|
|
320
|
+
def client(
|
|
321
|
+
service_name: Literal["s3"],
|
|
322
|
+
region_name: Optional[str] = None,
|
|
323
|
+
endpoint_url: Optional[str] = None,
|
|
324
|
+
config: Optional[Config] = None,
|
|
325
|
+
) -> "S3Client": ...
|
|
234
326
|
@overload
|
|
235
|
-
def client(
|
|
327
|
+
def client(
|
|
328
|
+
service_name: Literal["sts"],
|
|
329
|
+
region_name: Optional[str] = None,
|
|
330
|
+
endpoint_url: Optional[str] = None,
|
|
331
|
+
config: Optional[Config] = None,
|
|
332
|
+
) -> "STSClient": ...
|
|
236
333
|
@overload
|
|
237
|
-
def client(
|
|
334
|
+
def client(
|
|
335
|
+
service_name: Literal["sdb"],
|
|
336
|
+
region_name: Optional[str] = None,
|
|
337
|
+
endpoint_url: Optional[str] = None,
|
|
338
|
+
config: Optional[Config] = None,
|
|
339
|
+
) -> "SimpleDBClient": ...
|
|
238
340
|
@overload
|
|
239
|
-
def client(
|
|
240
|
-
|
|
241
|
-
|
|
341
|
+
def client(
|
|
342
|
+
service_name: Literal["autoscaling"],
|
|
343
|
+
region_name: Optional[str] = None,
|
|
344
|
+
endpoint_url: Optional[str] = None,
|
|
345
|
+
config: Optional[Config] = None,
|
|
346
|
+
) -> "AutoScalingClient": ...
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def client(
|
|
350
|
+
service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"],
|
|
351
|
+
region_name: Optional[str] = None,
|
|
352
|
+
endpoint_url: Optional[str] = None,
|
|
353
|
+
config: Optional[Config] = None,
|
|
354
|
+
) -> botocore.client.BaseClient:
|
|
242
355
|
"""
|
|
243
356
|
Get a Boto 3 client for a particular AWS service, usable by the current thread.
|
|
244
357
|
|
|
@@ -246,16 +359,36 @@ def client(service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"
|
|
|
246
359
|
"""
|
|
247
360
|
|
|
248
361
|
# Just use a global version of the manager. Note that we change the argument order!
|
|
249
|
-
return _global_manager.client(
|
|
362
|
+
return _global_manager.client(
|
|
363
|
+
region_name, service_name, endpoint_url=endpoint_url, config=config
|
|
364
|
+
)
|
|
365
|
+
|
|
250
366
|
|
|
251
367
|
@overload
|
|
252
|
-
def resource(
|
|
368
|
+
def resource(
|
|
369
|
+
service_name: Literal["s3"],
|
|
370
|
+
region_name: Optional[str] = None,
|
|
371
|
+
endpoint_url: Optional[str] = None,
|
|
372
|
+
) -> "S3ServiceResource": ...
|
|
253
373
|
@overload
|
|
254
|
-
def resource(
|
|
374
|
+
def resource(
|
|
375
|
+
service_name: Literal["iam"],
|
|
376
|
+
region_name: Optional[str] = None,
|
|
377
|
+
endpoint_url: Optional[str] = None,
|
|
378
|
+
) -> "IAMServiceResource": ...
|
|
255
379
|
@overload
|
|
256
|
-
def resource(
|
|
257
|
-
|
|
258
|
-
|
|
380
|
+
def resource(
|
|
381
|
+
service_name: Literal["ec2"],
|
|
382
|
+
region_name: Optional[str] = None,
|
|
383
|
+
endpoint_url: Optional[str] = None,
|
|
384
|
+
) -> "EC2ServiceResource": ...
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def resource(
|
|
388
|
+
service_name: Literal["s3", "iam", "ec2"],
|
|
389
|
+
region_name: Optional[str] = None,
|
|
390
|
+
endpoint_url: Optional[str] = None,
|
|
391
|
+
) -> boto3.resources.base.ServiceResource:
|
|
259
392
|
"""
|
|
260
393
|
Get a Boto 3 resource for a particular AWS service, usable by the current thread.
|
|
261
394
|
|
|
@@ -263,4 +396,6 @@ def resource(service_name: Literal["s3", "iam", "ec2"], region_name: Optional[st
|
|
|
263
396
|
"""
|
|
264
397
|
|
|
265
398
|
# Just use a global version of the manager. Note that we change the argument order!
|
|
266
|
-
return _global_manager.resource(
|
|
399
|
+
return _global_manager.resource(
|
|
400
|
+
region_name, service_name, endpoint_url=endpoint_url
|
|
401
|
+
)
|