pulumi 3.218.0a1769619086__py3-none-any.whl → 3.219.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.
- pulumi/__init__.py +6 -0
- pulumi/_version.py +1 -1
- pulumi/dynamic/dynamic.py +3 -1
- pulumi/resource_hooks.py +107 -2
- pulumi/runtime/_callbacks.py +94 -1
- pulumi/runtime/resource.py +44 -2
- pulumi/runtime/resource_hooks.py +30 -1
- pulumi/runtime/settings.py +5 -0
- {pulumi-3.218.0a1769619086.dist-info → pulumi-3.219.0.dist-info}/METADATA +3 -3
- {pulumi-3.218.0a1769619086.dist-info → pulumi-3.219.0.dist-info}/RECORD +12 -12
- {pulumi-3.218.0a1769619086.dist-info → pulumi-3.219.0.dist-info}/WHEEL +0 -0
- {pulumi-3.218.0a1769619086.dist-info → pulumi-3.219.0.dist-info}/licenses/LICENSE +0 -0
pulumi/__init__.py
CHANGED
|
@@ -93,6 +93,9 @@ from .output import (
|
|
|
93
93
|
)
|
|
94
94
|
|
|
95
95
|
from .resource_hooks import (
|
|
96
|
+
ErrorHook,
|
|
97
|
+
ErrorHookArgs,
|
|
98
|
+
ErrorHookFunction,
|
|
96
99
|
ResourceHookArgs,
|
|
97
100
|
ResourceHookFunction,
|
|
98
101
|
ResourceHook,
|
|
@@ -189,6 +192,9 @@ __all__ = [
|
|
|
189
192
|
"contains_unknowns",
|
|
190
193
|
"deferred_output",
|
|
191
194
|
# resource_hooks
|
|
195
|
+
"ErrorHook",
|
|
196
|
+
"ErrorHookArgs",
|
|
197
|
+
"ErrorHookFunction",
|
|
192
198
|
"ResourceHookArgs",
|
|
193
199
|
"ResourceHookFunction",
|
|
194
200
|
"ResourceHook",
|
pulumi/_version.py
CHANGED
pulumi/dynamic/dynamic.py
CHANGED
|
@@ -329,7 +329,9 @@ class Resource(CustomResource):
|
|
|
329
329
|
|
|
330
330
|
_resource_type_name: ClassVar[str]
|
|
331
331
|
|
|
332
|
-
def __init_subclass__(cls, module: str = "", name: str = "Resource"):
|
|
332
|
+
def __init_subclass__(cls, module: str = "", name: str = "Resource", **kwargs):
|
|
333
|
+
super().__init_subclass__(**kwargs)
|
|
334
|
+
|
|
333
335
|
if module:
|
|
334
336
|
module = f"/{module}"
|
|
335
337
|
cls._resource_type_name = f"dynamic{module}:{name}"
|
pulumi/resource_hooks.py
CHANGED
|
@@ -5,7 +5,7 @@ from collections.abc import Callable
|
|
|
5
5
|
from collections.abc import Awaitable, Mapping
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
from .runtime.resource import register_resource_hook
|
|
8
|
+
from .runtime.resource import register_resource_hook, register_error_hook
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class ResourceHookArgs:
|
|
@@ -81,6 +81,105 @@ ResourceHookFunction = Callable[
|
|
|
81
81
|
"""ResourceHookFunction is a function that can be registered as a resource hook."""
|
|
82
82
|
|
|
83
83
|
|
|
84
|
+
class ErrorHookArgs:
|
|
85
|
+
"""
|
|
86
|
+
ErrorHookArgs represents the arguments passed to an error hook.
|
|
87
|
+
|
|
88
|
+
Depending on the failed operation, only some of the new/old inputs/outputs are set.
|
|
89
|
+
|
|
90
|
+
| Failed Operation | old_inputs | new_inputs | old_outputs |
|
|
91
|
+
| ---------------- | ---------- | ---------- | ----------- |
|
|
92
|
+
| create | | ✓ | |
|
|
93
|
+
| update | ✓ | ✓ | ✓ |
|
|
94
|
+
| delete | ✓ | | ✓ |
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
urn: str
|
|
98
|
+
"""The URN of the resource that triggered the hook."""
|
|
99
|
+
id: str
|
|
100
|
+
"""The ID of the resource that triggered the hook."""
|
|
101
|
+
name: str
|
|
102
|
+
"""The name of the resource that triggered the hook."""
|
|
103
|
+
type: str
|
|
104
|
+
"""The type of the resource that triggered the hook."""
|
|
105
|
+
new_inputs: Optional[Mapping[str, Any]] = None
|
|
106
|
+
"""The new inputs of the resource that triggered the hook."""
|
|
107
|
+
old_inputs: Optional[Mapping[str, Any]] = None
|
|
108
|
+
"""The old inputs of the resource that triggered the hook."""
|
|
109
|
+
old_outputs: Optional[Mapping[str, Any]] = None
|
|
110
|
+
"""The old outputs of the resource that triggered the hook."""
|
|
111
|
+
failed_operation: str
|
|
112
|
+
"""The operation that failed (create, update, or delete)."""
|
|
113
|
+
errors: list[str]
|
|
114
|
+
"""The errors that have been seen so far (newest first)."""
|
|
115
|
+
|
|
116
|
+
def __init__(
|
|
117
|
+
self,
|
|
118
|
+
urn: str,
|
|
119
|
+
id: str,
|
|
120
|
+
name: str,
|
|
121
|
+
type: str,
|
|
122
|
+
new_inputs: Optional[Mapping[str, Any]] = None,
|
|
123
|
+
old_inputs: Optional[Mapping[str, Any]] = None,
|
|
124
|
+
old_outputs: Optional[Mapping[str, Any]] = None,
|
|
125
|
+
failed_operation: str = "",
|
|
126
|
+
errors: Optional[list[str]] = None,
|
|
127
|
+
):
|
|
128
|
+
self.urn = urn
|
|
129
|
+
self.id = id
|
|
130
|
+
self.name = name
|
|
131
|
+
self.type = type
|
|
132
|
+
self.new_inputs = new_inputs
|
|
133
|
+
self.old_inputs = old_inputs
|
|
134
|
+
self.old_outputs = old_outputs
|
|
135
|
+
self.failed_operation = failed_operation
|
|
136
|
+
self.errors = errors or []
|
|
137
|
+
|
|
138
|
+
def __repr__(self):
|
|
139
|
+
return (
|
|
140
|
+
f"ErrorHookArgs(urn={self.urn}, "
|
|
141
|
+
+ f"id={self.id}, "
|
|
142
|
+
+ f"name={self.name}, "
|
|
143
|
+
+ f"type={self.type}, "
|
|
144
|
+
+ f"failed_operation={self.failed_operation}, "
|
|
145
|
+
+ f"errors={self.errors})"
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
ErrorHookFunction = Callable[
|
|
150
|
+
[ErrorHookArgs],
|
|
151
|
+
Union[bool, Awaitable[bool]],
|
|
152
|
+
]
|
|
153
|
+
"""ErrorHookFunction is a function that can be registered as an error hook. Returns True to retry, False to not retry."""
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class ErrorHook:
|
|
157
|
+
"""ErrorHook is a named hook that can be registered as an error hook."""
|
|
158
|
+
|
|
159
|
+
name: str
|
|
160
|
+
"""The unique name of the error hook."""
|
|
161
|
+
callback: ErrorHookFunction
|
|
162
|
+
"""The function that will be called when the error hook is triggered."""
|
|
163
|
+
_registered: asyncio.Future[None]
|
|
164
|
+
"""
|
|
165
|
+
Tracks the registration of the error hook. The future will resolve once
|
|
166
|
+
the hook has been registered, or reject if any error occurs.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
def __init__(self, name: str, func: ErrorHookFunction):
|
|
170
|
+
self.__doc__ = getattr(func, "__doc__", None)
|
|
171
|
+
self.__name__ = getattr(func, "__name__", None)
|
|
172
|
+
self.name = name
|
|
173
|
+
self.callback = func
|
|
174
|
+
self._registered = register_error_hook(self)
|
|
175
|
+
|
|
176
|
+
def __call__(self, args: ErrorHookArgs) -> Union[bool, Awaitable[bool]]:
|
|
177
|
+
return self.callback(args)
|
|
178
|
+
|
|
179
|
+
def __repr__(self) -> str:
|
|
180
|
+
return f"ErrorHook(name={self.name}, callback={self.callback})"
|
|
181
|
+
|
|
182
|
+
|
|
84
183
|
class ResourceHookOptions:
|
|
85
184
|
"""Options for registering a resource hook."""
|
|
86
185
|
|
|
@@ -168,6 +267,8 @@ class ResourceHookBinding:
|
|
|
168
267
|
:class:`ResourceHookFunction`. This is because the engine needs to be able to identify a hook when a resource is
|
|
169
268
|
deleted.
|
|
170
269
|
"""
|
|
270
|
+
on_error: Optional[list["ErrorHook"]]
|
|
271
|
+
"""Hooks to be invoked when a resource operation fails. Return True to retry, False to not retry."""
|
|
171
272
|
|
|
172
273
|
def __init__(
|
|
173
274
|
self,
|
|
@@ -177,6 +278,7 @@ class ResourceHookBinding:
|
|
|
177
278
|
after_update: Optional[list[Union[ResourceHook, ResourceHookFunction]]] = None,
|
|
178
279
|
before_delete: Optional[list[ResourceHook]] = None,
|
|
179
280
|
after_delete: Optional[list[ResourceHook]] = None,
|
|
281
|
+
on_error: Optional[list["ErrorHook"]] = None,
|
|
180
282
|
):
|
|
181
283
|
self.before_create = before_create
|
|
182
284
|
self.after_create = after_create
|
|
@@ -184,6 +286,7 @@ class ResourceHookBinding:
|
|
|
184
286
|
self.after_update = after_update
|
|
185
287
|
self.before_delete = before_delete
|
|
186
288
|
self.after_delete = after_delete
|
|
289
|
+
self.on_error = on_error
|
|
187
290
|
|
|
188
291
|
def __repr__(self):
|
|
189
292
|
return (
|
|
@@ -192,7 +295,8 @@ class ResourceHookBinding:
|
|
|
192
295
|
+ f"before_update={self.before_update}, "
|
|
193
296
|
+ f"after_update={self.after_update}, "
|
|
194
297
|
+ f"before_delete={self.before_delete}, "
|
|
195
|
-
+ f"after_delete={self.after_delete}
|
|
298
|
+
+ f"after_delete={self.after_delete}, "
|
|
299
|
+
+ f"on_error={self.on_error})"
|
|
196
300
|
)
|
|
197
301
|
|
|
198
302
|
def _copy(self):
|
|
@@ -223,6 +327,7 @@ class ResourceHookBinding:
|
|
|
223
327
|
dest.after_update = _merge_lists(dest.after_update, source.after_update)
|
|
224
328
|
dest.before_delete = _merge_lists(dest.before_delete, source.before_delete)
|
|
225
329
|
dest.after_delete = _merge_lists(dest.after_delete, source.after_delete)
|
|
330
|
+
dest.on_error = _merge_lists(dest.on_error, source.on_error)
|
|
226
331
|
|
|
227
332
|
return dest
|
|
228
333
|
|
pulumi/runtime/_callbacks.py
CHANGED
|
@@ -54,7 +54,7 @@ if TYPE_CHECKING:
|
|
|
54
54
|
ResourceOptions,
|
|
55
55
|
ResourceTransform,
|
|
56
56
|
)
|
|
57
|
-
from ..resource_hooks import ResourceHook
|
|
57
|
+
from ..resource_hooks import ErrorHook, ResourceHook
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
# Workaround for https://github.com/grpc/grpc/issues/38679,
|
|
@@ -381,6 +381,91 @@ class _CallbackServicer(callback_pb2_grpc.CallbacksServicer):
|
|
|
381
381
|
on_dry_run=hook.opts.on_dry_run if hook.opts else False,
|
|
382
382
|
)
|
|
383
383
|
|
|
384
|
+
def do_register_error_hook(
|
|
385
|
+
self, hook: ErrorHook
|
|
386
|
+
) -> resource_pb2.RegisterErrorHookRequest:
|
|
387
|
+
log.debug(f"do_register_error_hook {hook.name}")
|
|
388
|
+
|
|
389
|
+
async def cb(s: bytes) -> Message:
|
|
390
|
+
request: resource_pb2.ErrorHookRequest = (
|
|
391
|
+
resource_pb2.ErrorHookRequest.FromString(s)
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
try:
|
|
395
|
+
from ..resource_hooks import ErrorHookArgs
|
|
396
|
+
|
|
397
|
+
new_inputs = (
|
|
398
|
+
outputtify_secrets(
|
|
399
|
+
cast(
|
|
400
|
+
dict[str, Any],
|
|
401
|
+
deserialize_properties(
|
|
402
|
+
request.new_inputs,
|
|
403
|
+
keep_unknowns=True,
|
|
404
|
+
),
|
|
405
|
+
)
|
|
406
|
+
)
|
|
407
|
+
if request.HasField("new_inputs") and request.new_inputs
|
|
408
|
+
else None
|
|
409
|
+
)
|
|
410
|
+
old_inputs = (
|
|
411
|
+
outputtify_secrets(
|
|
412
|
+
cast(
|
|
413
|
+
dict[str, Any],
|
|
414
|
+
deserialize_properties(
|
|
415
|
+
request.old_inputs,
|
|
416
|
+
keep_unknowns=True,
|
|
417
|
+
),
|
|
418
|
+
)
|
|
419
|
+
)
|
|
420
|
+
if request.HasField("old_inputs") and request.old_inputs
|
|
421
|
+
else None
|
|
422
|
+
)
|
|
423
|
+
old_outputs = (
|
|
424
|
+
outputtify_secrets(
|
|
425
|
+
cast(
|
|
426
|
+
dict[str, Any],
|
|
427
|
+
deserialize_properties(
|
|
428
|
+
request.old_outputs,
|
|
429
|
+
keep_unknowns=True,
|
|
430
|
+
),
|
|
431
|
+
)
|
|
432
|
+
)
|
|
433
|
+
if request.HasField("old_outputs") and request.old_outputs
|
|
434
|
+
else None
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
args = ErrorHookArgs(
|
|
438
|
+
urn=request.urn,
|
|
439
|
+
id=request.id,
|
|
440
|
+
name=request.name,
|
|
441
|
+
type=request.type,
|
|
442
|
+
new_inputs=new_inputs,
|
|
443
|
+
old_inputs=old_inputs,
|
|
444
|
+
old_outputs=old_outputs,
|
|
445
|
+
failed_operation=request.failed_operation,
|
|
446
|
+
errors=list(request.errors),
|
|
447
|
+
)
|
|
448
|
+
maybe_retry = hook(args)
|
|
449
|
+
if isinstance(maybe_retry, Awaitable):
|
|
450
|
+
retry = await maybe_retry
|
|
451
|
+
else:
|
|
452
|
+
retry = maybe_retry
|
|
453
|
+
return resource_pb2.ErrorHookResponse(retry=retry)
|
|
454
|
+
except Exception as e: # noqa: BLE001 catch blind exception
|
|
455
|
+
log.debug(f"Exception while executing error hook: {str(e)}")
|
|
456
|
+
return resource_pb2.ErrorHookResponse(error=str(e))
|
|
457
|
+
|
|
458
|
+
token = str(uuid.uuid4())
|
|
459
|
+
self._callbacks[token] = cb
|
|
460
|
+
callback = callback_pb2.Callback(
|
|
461
|
+
token=token,
|
|
462
|
+
target=self._target,
|
|
463
|
+
)
|
|
464
|
+
return resource_pb2.RegisterErrorHookRequest(
|
|
465
|
+
name=hook.name,
|
|
466
|
+
callback=callback,
|
|
467
|
+
)
|
|
468
|
+
|
|
384
469
|
def register_resource_hook(self, hook: ResourceHook) -> None:
|
|
385
470
|
req = self.do_register_resource_hook(hook)
|
|
386
471
|
try:
|
|
@@ -390,6 +475,14 @@ class _CallbackServicer(callback_pb2_grpc.CallbacksServicer):
|
|
|
390
475
|
self._callbacks.pop(req.callback.token)
|
|
391
476
|
raise
|
|
392
477
|
|
|
478
|
+
def register_error_hook(self, hook: ErrorHook) -> None:
|
|
479
|
+
req = self.do_register_error_hook(hook)
|
|
480
|
+
try:
|
|
481
|
+
self._monitor.RegisterErrorHook(req)
|
|
482
|
+
except Exception:
|
|
483
|
+
self._callbacks.pop(req.callback.token)
|
|
484
|
+
raise
|
|
485
|
+
|
|
393
486
|
def _resource_options(
|
|
394
487
|
self, request: resource_pb2.TransformRequest
|
|
395
488
|
) -> ResourceOptions:
|
pulumi/runtime/resource.py
CHANGED
|
@@ -39,6 +39,7 @@ from .settings import (
|
|
|
39
39
|
_get_callbacks,
|
|
40
40
|
_get_rpc_manager,
|
|
41
41
|
_sync_monitor_supports_transforms,
|
|
42
|
+
monitor_supports_error_hooks,
|
|
42
43
|
monitor_supports_resource_hooks,
|
|
43
44
|
handle_grpc_error,
|
|
44
45
|
)
|
|
@@ -53,7 +54,12 @@ if TYPE_CHECKING:
|
|
|
53
54
|
CustomTimeouts,
|
|
54
55
|
)
|
|
55
56
|
from ..resource import ResourceOptions
|
|
56
|
-
from ..resource_hooks import
|
|
57
|
+
from ..resource_hooks import (
|
|
58
|
+
ErrorHook,
|
|
59
|
+
ResourceHook,
|
|
60
|
+
ResourceHookBinding,
|
|
61
|
+
ResourceHookFunction,
|
|
62
|
+
)
|
|
57
63
|
|
|
58
64
|
|
|
59
65
|
class ResourceResolverOperations(NamedTuple):
|
|
@@ -1344,7 +1350,7 @@ async def _prepare_resource_hooks(
|
|
|
1344
1350
|
hooks: Optional["ResourceHookBinding"],
|
|
1345
1351
|
name_prefix: str,
|
|
1346
1352
|
) -> resource_pb2.RegisterResourceRequest.ResourceHooksBinding:
|
|
1347
|
-
from ..resource_hooks import ResourceHook
|
|
1353
|
+
from ..resource_hooks import ErrorHook, ResourceHook
|
|
1348
1354
|
|
|
1349
1355
|
proto = resource_pb2.RegisterResourceRequest.ResourceHooksBinding()
|
|
1350
1356
|
if not hooks:
|
|
@@ -1382,6 +1388,19 @@ async def _prepare_resource_hooks(
|
|
|
1382
1388
|
await hook._registered
|
|
1383
1389
|
getattr(proto, hook_type).append(hook.name)
|
|
1384
1390
|
|
|
1391
|
+
on_error_hooks_list: list[ErrorHook] = getattr(hooks, "on_error", []) or []
|
|
1392
|
+
if on_error_hooks_list:
|
|
1393
|
+
if not await monitor_supports_error_hooks():
|
|
1394
|
+
raise Exception(
|
|
1395
|
+
"The Pulumi CLI does not support error hooks. Please update the Pulumi CLI."
|
|
1396
|
+
)
|
|
1397
|
+
|
|
1398
|
+
for error_hook in on_error_hooks_list:
|
|
1399
|
+
if not isinstance(error_hook, ErrorHook):
|
|
1400
|
+
raise ValueError("Error hooks must be ErrorHook instances")
|
|
1401
|
+
await error_hook._registered
|
|
1402
|
+
proto.on_error.append(error_hook.name)
|
|
1403
|
+
|
|
1385
1404
|
return proto
|
|
1386
1405
|
|
|
1387
1406
|
|
|
@@ -1406,3 +1425,26 @@ def register_resource_hook(hook: "ResourceHook") -> asyncio.Future[None]:
|
|
|
1406
1425
|
return result
|
|
1407
1426
|
|
|
1408
1427
|
return asyncio.ensure_future(wrapper())
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
def register_error_hook(hook: "ErrorHook") -> asyncio.Future[None]:
|
|
1431
|
+
async def do_register() -> None:
|
|
1432
|
+
callbacks = await _get_callbacks()
|
|
1433
|
+
if callbacks is None:
|
|
1434
|
+
raise Exception("No callback server registered.")
|
|
1435
|
+
return callbacks.register_error_hook(hook)
|
|
1436
|
+
|
|
1437
|
+
async def wrapper() -> None:
|
|
1438
|
+
if not await monitor_supports_error_hooks():
|
|
1439
|
+
raise Exception(
|
|
1440
|
+
"The Pulumi CLI does not support error hooks. Please update the Pulumi CLI."
|
|
1441
|
+
)
|
|
1442
|
+
|
|
1443
|
+
result, exception = await _get_rpc_manager().do_rpc(
|
|
1444
|
+
"register error hook", do_register
|
|
1445
|
+
)()
|
|
1446
|
+
if exception:
|
|
1447
|
+
raise exception
|
|
1448
|
+
return result
|
|
1449
|
+
|
|
1450
|
+
return asyncio.ensure_future(wrapper())
|
pulumi/runtime/resource_hooks.py
CHANGED
|
@@ -14,7 +14,13 @@
|
|
|
14
14
|
|
|
15
15
|
import asyncio
|
|
16
16
|
from typing import Optional, Union
|
|
17
|
-
from ..resource_hooks import
|
|
17
|
+
from ..resource_hooks import (
|
|
18
|
+
ErrorHookArgs,
|
|
19
|
+
ErrorHook,
|
|
20
|
+
ResourceHookArgs,
|
|
21
|
+
ResourceHook,
|
|
22
|
+
ResourceHookBinding,
|
|
23
|
+
)
|
|
18
24
|
from .proto import RegisterResourceRequest, ConstructRequest
|
|
19
25
|
|
|
20
26
|
|
|
@@ -22,6 +28,28 @@ def noop(args: ResourceHookArgs) -> None:
|
|
|
22
28
|
pass
|
|
23
29
|
|
|
24
30
|
|
|
31
|
+
def noop_error(args: ErrorHookArgs) -> bool:
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class StubErrorHook(ErrorHook):
|
|
36
|
+
"""
|
|
37
|
+
StubErrorHook is an error hook that does nothing and returns False (no retry).
|
|
38
|
+
|
|
39
|
+
We need to reconstruct ErrorHook instances to set on ResourceOptions when
|
|
40
|
+
we only have the name available (e.g. from Construct request). These
|
|
41
|
+
stubs will later be serialized back into a list of hook names.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, name: str):
|
|
45
|
+
# Note: we intentionally do not call super here, because we do not
|
|
46
|
+
# want to kick off a registration for this hook.
|
|
47
|
+
self.name = name
|
|
48
|
+
self.callback = noop_error
|
|
49
|
+
self._registered = asyncio.Future()
|
|
50
|
+
self._registered.set_result(None)
|
|
51
|
+
|
|
52
|
+
|
|
25
53
|
class StubResourceHook(ResourceHook):
|
|
26
54
|
"""
|
|
27
55
|
StubResourceHook is a resource hook that does nothing.
|
|
@@ -64,4 +92,5 @@ def _binding_from_proto(
|
|
|
64
92
|
after_update=list(map(StubResourceHook, protoBinding.after_update)),
|
|
65
93
|
before_delete=list(map(StubResourceHook, protoBinding.before_delete)),
|
|
66
94
|
after_delete=list(map(StubResourceHook, protoBinding.after_delete)),
|
|
95
|
+
on_error=list(map(StubErrorHook, protoBinding.on_error)),
|
|
67
96
|
)
|
pulumi/runtime/settings.py
CHANGED
|
@@ -386,6 +386,10 @@ async def monitor_supports_resource_hooks() -> bool:
|
|
|
386
386
|
return await monitor_supports_feature("resourceHooks")
|
|
387
387
|
|
|
388
388
|
|
|
389
|
+
async def monitor_supports_error_hooks() -> bool:
|
|
390
|
+
return await monitor_supports_feature("errorHooks")
|
|
391
|
+
|
|
392
|
+
|
|
389
393
|
def reset_options(
|
|
390
394
|
project: Optional[str] = None,
|
|
391
395
|
stack: Optional[str] = None,
|
|
@@ -444,4 +448,5 @@ async def _load_monitor_feature_support():
|
|
|
444
448
|
monitor_supports_feature("invokeTransforms"),
|
|
445
449
|
monitor_supports_feature("parameterization"),
|
|
446
450
|
monitor_supports_feature("resourceHooks"),
|
|
451
|
+
monitor_supports_feature("errorHooks"),
|
|
447
452
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pulumi
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.219.0
|
|
4
4
|
Summary: Pulumi's Python SDK
|
|
5
5
|
Project-URL: Documentation, https://www.pulumi.com
|
|
6
6
|
Project-URL: Changelog, https://github.com/pulumi/pulumi/blob/master/CHANGELOG.md
|
|
@@ -17,8 +17,8 @@ Requires-Dist: debugpy~=1.8.7
|
|
|
17
17
|
Requires-Dist: dill~=0.4
|
|
18
18
|
Requires-Dist: grpcio<2,>=1.68.1; python_version < '3.14'
|
|
19
19
|
Requires-Dist: grpcio<2,>=1.75.1; python_version >= '3.14'
|
|
20
|
-
Requires-Dist: pip
|
|
21
|
-
Requires-Dist: protobuf<
|
|
20
|
+
Requires-Dist: pip>=24.3.1
|
|
21
|
+
Requires-Dist: protobuf<7,>=3.20.3
|
|
22
22
|
Requires-Dist: pyyaml~=6.0
|
|
23
23
|
Requires-Dist: semver~=3.0
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
pulumi/__init__.py,sha256=
|
|
1
|
+
pulumi/__init__.py,sha256=ySZJClazJdfK-zoRuhf5HPA54VMKeGRYb_EdFMKobwk,4569
|
|
2
2
|
pulumi/_types.py,sha256=C_gCpJIlb7V39x-iSNgMqYdLkTSqmZ8RHQb2BIIzGtU,39333
|
|
3
3
|
pulumi/_utils.py,sha256=cIeLt2NXeHVhODfh4JEpoyV1wMesDGOzJN5u5NyyEs8,11263
|
|
4
|
-
pulumi/_version.py,sha256=
|
|
4
|
+
pulumi/_version.py,sha256=N4aY505FlfZHOC6MG9h89RtItTB9X_tp19xjh42MKkQ,733
|
|
5
5
|
pulumi/asset.py,sha256=jOZBKiC8GYHpGYL5pOi-hfL30efiK8FLdc4fad7YwII,3952
|
|
6
6
|
pulumi/config.py,sha256=pWMfMNLTZe63QmvyT-3XMG3VWTUTHkk6SMQg5lJZapE,25047
|
|
7
7
|
pulumi/deprecated.py,sha256=aO0kXzGtYg14UDqK-MLxaAaqIfMMg4-oUvAO6FIVBV0,1738
|
|
@@ -12,7 +12,7 @@ pulumi/metadata.py,sha256=g2wWNl1eEQ-08jZmyrvFYcB447gMvBFfzqef1NnqOxc,1858
|
|
|
12
12
|
pulumi/output.py,sha256=NNBkQ66S8wuddDJZjsTL2fiJ-Rz-6uXHNBhpF0b8A-o,43578
|
|
13
13
|
pulumi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
pulumi/resource.py,sha256=4Bf6ZJQ1-2YEx5tvSufxv2t-xVKIrcnRS1MfSVJ1I-E,52632
|
|
15
|
-
pulumi/resource_hooks.py,sha256=
|
|
15
|
+
pulumi/resource_hooks.py,sha256=0Tc62wdCi6FmEkAU1QYbQcCoQEQoIA9NcYWIdTT--cQ,13040
|
|
16
16
|
pulumi/stack_reference.py,sha256=Vx_0v_22e6Xy5Ofr_NMUBiNeyIr5Klaj94keJTr3Y0w,6360
|
|
17
17
|
pulumi/stash.py,sha256=jBJfzC5cH5h-xhx0bDHnIms6gidZ7RAIQFuRZIVSoo0,4503
|
|
18
18
|
pulumi/type_token.py,sha256=RIA-r-IcmqYqUvlLwnPvT9Y5Xbg--nFHneWq2dpK7vw,1276
|
|
@@ -38,7 +38,7 @@ pulumi/automation/events.py,sha256=229awNpKDtZKzV1d_4_CidsJ7K8_rsQAaFxFIsHYkOw,2
|
|
|
38
38
|
pulumi/dynamic/__init__.py,sha256=uZFY_4BlGZq5Bgwp37Dm9Hqy3Uf8iDd_TVvMaK2Yz8U,1139
|
|
39
39
|
pulumi/dynamic/__main__.py,sha256=QehWmvtoPkqClqYn7PeOzAtSVkJwQlpFVrHoUD_6hs4,9943
|
|
40
40
|
pulumi/dynamic/config.py,sha256=50XzNBN6u_0TkCqQOVBK1zcWHWCEVV1a_JpyB7ZNWnE,1272
|
|
41
|
-
pulumi/dynamic/dynamic.py,sha256=
|
|
41
|
+
pulumi/dynamic/dynamic.py,sha256=wol9OFnalSA_AE92V2JaAxZwc97clsBlEwNprMGvb-o,11656
|
|
42
42
|
pulumi/policy/__init__.py,sha256=MNs4_1_aoIZHwvoPuYSYwhvpF1RNhFeVuw2zzu4F5so,667
|
|
43
43
|
pulumi/policy/__main__.py,sha256=siArVFRKjv7Jx_ufWFwVw4f2cMBc2qKqnQCp-FYAKM8,2556
|
|
44
44
|
pulumi/provider/__init__.py,sha256=lvzJnqpo1pXMHsl7A8ZHhcBqaYvzQeiUxc_8JV8XhPE,800
|
|
@@ -55,7 +55,7 @@ pulumi/provider/experimental/server.py,sha256=-ntiIdGTNg3CdSKTQ3tnLjpLHtmjT2Ev7v
|
|
|
55
55
|
pulumi/provider/experimental/util.py,sha256=pJQ7M-Qcyqpc_z_9lH6pTBdlGMN9nFWd8Bp7Rlk2ywc,827
|
|
56
56
|
pulumi/run/plugin/__main__.py,sha256=oJ4b-7Mu9QUqbbAFDh0Bd4_7gXwPX020X_bL-dKa29c,2502
|
|
57
57
|
pulumi/runtime/__init__.py,sha256=SEjqSJXIBd6BKMMWczVoX7-E-nsVvXPvaVy9FQTvkYE,2520
|
|
58
|
-
pulumi/runtime/_callbacks.py,sha256=
|
|
58
|
+
pulumi/runtime/_callbacks.py,sha256=hhZHvx1LEdsbcCrNOPbJCTPBDoPyNcaujG9A81dQRJg,26183
|
|
59
59
|
pulumi/runtime/_depends_on.py,sha256=LxxLqz7JPWCsa8I_nxO9NvyXnS8Vj1vBGCukNU7RYI0,1966
|
|
60
60
|
pulumi/runtime/_grpc_settings.py,sha256=0GCSqaPJVZ6tO1GSV_2kOUJwf5Jil9sTkJsEn6hrrOc,1403
|
|
61
61
|
pulumi/runtime/_json.py,sha256=Za60rKUrykdf-_L31Wlq1lLSz9yyo2HhNIji9x9pGgo,1625
|
|
@@ -64,12 +64,12 @@ pulumi/runtime/config.py,sha256=B77z24lPlTcSbJ8ssEwxbXj_A1hmfk30SlXe48jwgfY,3406
|
|
|
64
64
|
pulumi/runtime/invoke.py,sha256=Tl0Ndo84PaDQZQvqAQYtZ9jjeawGqXfKdE_k1KJc_0g,23005
|
|
65
65
|
pulumi/runtime/known_types.py,sha256=rUKAoP-JBww1LFkbK3vIgGEJVjuEB5p3fjBXllAPuRw,2702
|
|
66
66
|
pulumi/runtime/mocks.py,sha256=Mtm2Ilr77hTy4eGptzct1BRT8PvexBDOMHYTC-CCVX8,11342
|
|
67
|
-
pulumi/runtime/resource.py,sha256=
|
|
67
|
+
pulumi/runtime/resource.py,sha256=7lFemDzH96y7KOpMdPPU6WiltE27HItgUodZJcv0A8U,55435
|
|
68
68
|
pulumi/runtime/resource_cycle_breaker.py,sha256=CBtvlxlxguf4_F3UYxM2fySfDdygq1rDpyxQlWNQ6dA,2014
|
|
69
|
-
pulumi/runtime/resource_hooks.py,sha256=
|
|
69
|
+
pulumi/runtime/resource_hooks.py,sha256=NkAN5XuLjc-WMi8M5Vh9wExHoF1OnI1dLwoSclqwwVg,3374
|
|
70
70
|
pulumi/runtime/rpc.py,sha256=Nkw8osBqVA_n5PKuzLetZtqGySbPp30sfxm_7qlYTG0,67038
|
|
71
71
|
pulumi/runtime/rpc_manager.py,sha256=7GguypHU0XFAp0Lmv-fOrbhVty-oLk6gn_lYfvJbL7I,3153
|
|
72
|
-
pulumi/runtime/settings.py,sha256=
|
|
72
|
+
pulumi/runtime/settings.py,sha256=VcU69la8jWGupp12jzixDjSJRjTsKAupSJh0Ef1P-MM,13719
|
|
73
73
|
pulumi/runtime/stack.py,sha256=c7FAGsglh4EI4JRTTaAG1-es3hWC3yZ1dlcGBGFnLA0,14657
|
|
74
74
|
pulumi/runtime/sync_await.py,sha256=U49qpS7youGQlePoG6AlLwJ7QBzFepWKAZBephXuOgM,3157
|
|
75
75
|
pulumi/runtime/proto/__init__.py,sha256=xthtRh9YwifZj00_6U63gubzeM7y_xkePihT9B87GGw,1105
|
|
@@ -146,7 +146,7 @@ pulumi/runtime/proto/testing/language_pb2.py,sha256=gllx-3VVuRToAlIpt0IvEfVPsxnQ
|
|
|
146
146
|
pulumi/runtime/proto/testing/language_pb2.pyi,sha256=1KyoBEhlUsf6cApa4Hh0W59S3jdFoUwdrv3zhuRbbUw,10383
|
|
147
147
|
pulumi/runtime/proto/testing/language_pb2_grpc.py,sha256=Lna44LwQpf8CSA03H8c49E-o9JgnRztohjJM3YDNkSI,6800
|
|
148
148
|
pulumi/runtime/proto/testing/language_pb2_grpc.pyi,sha256=U1DOZIPP_vJx-qocDQbx5asRqsmb66JdUuXTLYRgULc,5008
|
|
149
|
-
pulumi-3.
|
|
150
|
-
pulumi-3.
|
|
151
|
-
pulumi-3.
|
|
152
|
-
pulumi-3.
|
|
149
|
+
pulumi-3.219.0.dist-info/METADATA,sha256=llhWlFFjDcpGgGiMHLyrPM8Vx7nimBN2Z9qSnzlVYDI,3780
|
|
150
|
+
pulumi-3.219.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
151
|
+
pulumi-3.219.0.dist-info/licenses/LICENSE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
|
|
152
|
+
pulumi-3.219.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|