pulumi-digitalocean 4.27.0__py3-none-any.whl → 4.39.0a1736833057__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.

Potentially problematic release.


This version of pulumi-digitalocean might be problematic. Click here for more details.

Files changed (107) hide show
  1. pulumi_digitalocean/__init__.py +75 -0
  2. pulumi_digitalocean/_enums.py +131 -52
  3. pulumi_digitalocean/_inputs.py +5767 -399
  4. pulumi_digitalocean/_utilities.py +41 -5
  5. pulumi_digitalocean/app.py +199 -67
  6. pulumi_digitalocean/cdn.py +20 -23
  7. pulumi_digitalocean/certificate.py +45 -42
  8. pulumi_digitalocean/config/__init__.pyi +5 -0
  9. pulumi_digitalocean/config/vars.py +5 -0
  10. pulumi_digitalocean/container_registry.py +11 -6
  11. pulumi_digitalocean/container_registry_docker_credentials.py +53 -12
  12. pulumi_digitalocean/custom_image.py +13 -8
  13. pulumi_digitalocean/database_cluster.py +298 -120
  14. pulumi_digitalocean/database_connection_pool.py +15 -10
  15. pulumi_digitalocean/database_db.py +19 -12
  16. pulumi_digitalocean/database_firewall.py +78 -75
  17. pulumi_digitalocean/database_kafka_config.py +1040 -0
  18. pulumi_digitalocean/database_kafka_topic.py +66 -61
  19. pulumi_digitalocean/database_mongodb_config.py +452 -0
  20. pulumi_digitalocean/database_mysql_config.py +15 -12
  21. pulumi_digitalocean/database_opensearch_config.py +2069 -0
  22. pulumi_digitalocean/database_postgresql_config.py +2614 -0
  23. pulumi_digitalocean/database_redis_config.py +29 -12
  24. pulumi_digitalocean/database_replica.py +29 -24
  25. pulumi_digitalocean/database_user.py +90 -75
  26. pulumi_digitalocean/dns_record.py +13 -8
  27. pulumi_digitalocean/domain.py +7 -6
  28. pulumi_digitalocean/droplet.py +89 -31
  29. pulumi_digitalocean/droplet_autoscale.py +474 -0
  30. pulumi_digitalocean/droplet_snapshot.py +23 -14
  31. pulumi_digitalocean/firewall.py +118 -106
  32. pulumi_digitalocean/floating_ip.py +19 -16
  33. pulumi_digitalocean/floating_ip_assignment.py +19 -16
  34. pulumi_digitalocean/get_account.py +18 -9
  35. pulumi_digitalocean/get_app.py +57 -10
  36. pulumi_digitalocean/get_certificate.py +19 -9
  37. pulumi_digitalocean/get_container_registry.py +19 -9
  38. pulumi_digitalocean/get_database_ca.py +14 -9
  39. pulumi_digitalocean/get_database_cluster.py +119 -11
  40. pulumi_digitalocean/get_database_connection_pool.py +25 -9
  41. pulumi_digitalocean/get_database_replica.py +29 -9
  42. pulumi_digitalocean/get_database_user.py +21 -9
  43. pulumi_digitalocean/get_domain.py +16 -9
  44. pulumi_digitalocean/get_domains.py +34 -27
  45. pulumi_digitalocean/get_droplet.py +66 -23
  46. pulumi_digitalocean/get_droplet_autoscale.py +197 -0
  47. pulumi_digitalocean/get_droplet_snapshot.py +36 -23
  48. pulumi_digitalocean/get_droplets.py +80 -54
  49. pulumi_digitalocean/get_firewall.py +29 -13
  50. pulumi_digitalocean/get_floating_ip.py +16 -9
  51. pulumi_digitalocean/get_image.py +42 -27
  52. pulumi_digitalocean/get_images.py +56 -53
  53. pulumi_digitalocean/get_kubernetes_cluster.py +53 -6
  54. pulumi_digitalocean/get_kubernetes_versions.py +43 -41
  55. pulumi_digitalocean/get_load_balancer.py +81 -17
  56. pulumi_digitalocean/get_project.py +23 -9
  57. pulumi_digitalocean/get_projects.py +56 -53
  58. pulumi_digitalocean/get_record.py +23 -9
  59. pulumi_digitalocean/get_records.py +62 -13
  60. pulumi_digitalocean/get_region.py +17 -9
  61. pulumi_digitalocean/get_regions.py +56 -53
  62. pulumi_digitalocean/get_reserved_ip.py +16 -9
  63. pulumi_digitalocean/get_reserved_ipv6.py +118 -0
  64. pulumi_digitalocean/get_sizes.py +24 -13
  65. pulumi_digitalocean/get_spaces_bucket.py +18 -9
  66. pulumi_digitalocean/get_spaces_bucket_object.py +41 -14
  67. pulumi_digitalocean/get_spaces_bucket_objects.py +26 -5
  68. pulumi_digitalocean/get_spaces_buckets.py +48 -45
  69. pulumi_digitalocean/get_ssh_key.py +27 -19
  70. pulumi_digitalocean/get_ssh_keys.py +40 -37
  71. pulumi_digitalocean/get_tag.py +31 -19
  72. pulumi_digitalocean/get_tags.py +32 -25
  73. pulumi_digitalocean/get_volume.py +35 -23
  74. pulumi_digitalocean/get_volume_snapshot.py +35 -21
  75. pulumi_digitalocean/get_vpc.py +33 -23
  76. pulumi_digitalocean/get_vpc_peering.py +244 -0
  77. pulumi_digitalocean/kubernetes_cluster.py +86 -35
  78. pulumi_digitalocean/kubernetes_node_pool.py +46 -43
  79. pulumi_digitalocean/load_balancer.py +320 -157
  80. pulumi_digitalocean/monitor_alert.py +17 -12
  81. pulumi_digitalocean/outputs.py +3419 -344
  82. pulumi_digitalocean/project.py +19 -16
  83. pulumi_digitalocean/project_resources.py +11 -8
  84. pulumi_digitalocean/provider.py +5 -0
  85. pulumi_digitalocean/pulumi-plugin.json +2 -1
  86. pulumi_digitalocean/reserved_ip.py +19 -16
  87. pulumi_digitalocean/reserved_ip_assignment.py +19 -16
  88. pulumi_digitalocean/reserved_ipv6.py +232 -0
  89. pulumi_digitalocean/reserved_ipv6_assignment.py +171 -0
  90. pulumi_digitalocean/spaces_bucket.py +70 -79
  91. pulumi_digitalocean/spaces_bucket_cors_configuration.py +30 -25
  92. pulumi_digitalocean/spaces_bucket_object.py +11 -12
  93. pulumi_digitalocean/spaces_bucket_policy.py +21 -16
  94. pulumi_digitalocean/ssh_key.py +19 -10
  95. pulumi_digitalocean/tag.py +13 -10
  96. pulumi_digitalocean/uptime_alert.py +10 -5
  97. pulumi_digitalocean/uptime_check.py +5 -0
  98. pulumi_digitalocean/volume.py +47 -50
  99. pulumi_digitalocean/volume_attachment.py +25 -20
  100. pulumi_digitalocean/volume_snapshot.py +17 -10
  101. pulumi_digitalocean/vpc.py +27 -22
  102. pulumi_digitalocean/vpc_peering.py +378 -0
  103. {pulumi_digitalocean-4.27.0.dist-info → pulumi_digitalocean-4.39.0a1736833057.dist-info}/METADATA +7 -6
  104. pulumi_digitalocean-4.39.0a1736833057.dist-info/RECORD +108 -0
  105. {pulumi_digitalocean-4.27.0.dist-info → pulumi_digitalocean-4.39.0a1736833057.dist-info}/WHEEL +1 -1
  106. pulumi_digitalocean-4.27.0.dist-info/RECORD +0 -97
  107. {pulumi_digitalocean-4.27.0.dist-info → pulumi_digitalocean-4.39.0a1736833057.dist-info}/top_level.txt +0 -0
@@ -4,6 +4,7 @@
4
4
 
5
5
 
6
6
  import asyncio
7
+ import functools
7
8
  import importlib.metadata
8
9
  import importlib.util
9
10
  import inspect
@@ -11,14 +12,19 @@ import json
11
12
  import os
12
13
  import sys
13
14
  import typing
15
+ import warnings
16
+ import base64
14
17
 
15
18
  import pulumi
16
19
  import pulumi.runtime
17
20
  from pulumi.runtime.sync_await import _sync_await
21
+ from pulumi.runtime.proto import resource_pb2
18
22
 
19
23
  from semver import VersionInfo as SemverVersion
20
24
  from parver import Version as PEP440Version
21
25
 
26
+ C = typing.TypeVar("C", bound=typing.Callable)
27
+
22
28
 
23
29
  def get_env(*args):
24
30
  for v in args:
@@ -96,10 +102,6 @@ def _get_semver_version():
96
102
  _version = _get_semver_version()
97
103
  _version_str = str(_version)
98
104
 
99
-
100
- def get_version():
101
- return _version_str
102
-
103
105
  def get_resource_opts_defaults() -> pulumi.ResourceOptions:
104
106
  return pulumi.ResourceOptions(
105
107
  version=get_version(),
@@ -262,7 +264,7 @@ def call_plain(
262
264
  output = pulumi.runtime.call(tok, props, res, typ)
263
265
 
264
266
  # Ingoring deps silently. They are typically non-empty, r.f() calls include r as a dependency.
265
- result, known, secret, _ = _sync_await(asyncio.ensure_future(_await_output(output)))
267
+ result, known, secret, _ = _sync_await(asyncio.create_task(_await_output(output)))
266
268
 
267
269
  problem = None
268
270
  if not known:
@@ -287,5 +289,39 @@ async def _await_output(o: pulumi.Output[typing.Any]) -> typing.Tuple[object, bo
287
289
  await o._resources,
288
290
  )
289
291
 
292
+
293
+ # This is included to provide an upgrade path for users who are using a version
294
+ # of the Pulumi SDK (<3.121.0) that does not include the `deprecated` decorator.
295
+ def deprecated(message: str) -> typing.Callable[[C], C]:
296
+ """
297
+ Decorator to indicate a function is deprecated.
298
+
299
+ As well as inserting appropriate statements to indicate that the function is
300
+ deprecated, this decorator also tags the function with a special attribute
301
+ so that Pulumi code can detect that it is deprecated and react appropriately
302
+ in certain situations.
303
+
304
+ message is the deprecation message that should be printed if the function is called.
305
+ """
306
+
307
+ def decorator(fn: C) -> C:
308
+ if not callable(fn):
309
+ raise TypeError("Expected fn to be callable")
310
+
311
+ @functools.wraps(fn)
312
+ def deprecated_fn(*args, **kwargs):
313
+ warnings.warn(message)
314
+ pulumi.warn(f"{fn.__name__} is deprecated: {message}")
315
+
316
+ return fn(*args, **kwargs)
317
+
318
+ deprecated_fn.__dict__["_pulumi_deprecated_callable"] = fn
319
+ return typing.cast(C, deprecated_fn)
320
+
321
+ return decorator
322
+
290
323
  def get_plugin_download_url():
291
324
  return None
325
+
326
+ def get_version():
327
+ return _version_str
@@ -4,9 +4,14 @@
4
4
 
5
5
  import copy
6
6
  import warnings
7
+ import sys
7
8
  import pulumi
8
9
  import pulumi.runtime
9
10
  from typing import Any, Mapping, Optional, Sequence, Union, overload
11
+ if sys.version_info >= (3, 11):
12
+ from typing import NotRequired, TypedDict, TypeAlias
13
+ else:
14
+ from typing_extensions import NotRequired, TypedDict, TypeAlias
10
15
  from . import _utilities
11
16
  from . import outputs
12
17
  from ._inputs import *
@@ -16,10 +21,12 @@ __all__ = ['AppArgs', 'App']
16
21
  @pulumi.input_type
17
22
  class AppArgs:
18
23
  def __init__(__self__, *,
24
+ dedicated_ips: Optional[pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]]] = None,
19
25
  project_id: Optional[pulumi.Input[str]] = None,
20
26
  spec: Optional[pulumi.Input['AppSpecArgs']] = None):
21
27
  """
22
28
  The set of arguments for constructing a App resource.
29
+ :param pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]] dedicated_ips: The dedicated egress IP addresses associated with the app.
23
30
  :param pulumi.Input[str] project_id: The ID of the project that the app is assigned to.
24
31
 
25
32
  A spec can contain multiple components.
@@ -27,11 +34,25 @@ class AppArgs:
27
34
  A `service` can contain:
28
35
  :param pulumi.Input['AppSpecArgs'] spec: A DigitalOcean App spec describing the app.
29
36
  """
37
+ if dedicated_ips is not None:
38
+ pulumi.set(__self__, "dedicated_ips", dedicated_ips)
30
39
  if project_id is not None:
31
40
  pulumi.set(__self__, "project_id", project_id)
32
41
  if spec is not None:
33
42
  pulumi.set(__self__, "spec", spec)
34
43
 
44
+ @property
45
+ @pulumi.getter(name="dedicatedIps")
46
+ def dedicated_ips(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]]]:
47
+ """
48
+ The dedicated egress IP addresses associated with the app.
49
+ """
50
+ return pulumi.get(self, "dedicated_ips")
51
+
52
+ @dedicated_ips.setter
53
+ def dedicated_ips(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]]]):
54
+ pulumi.set(self, "dedicated_ips", value)
55
+
35
56
  @property
36
57
  @pulumi.getter(name="projectId")
37
58
  def project_id(self) -> Optional[pulumi.Input[str]]:
@@ -67,7 +88,9 @@ class _AppState:
67
88
  active_deployment_id: Optional[pulumi.Input[str]] = None,
68
89
  app_urn: Optional[pulumi.Input[str]] = None,
69
90
  created_at: Optional[pulumi.Input[str]] = None,
91
+ dedicated_ips: Optional[pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]]] = None,
70
92
  default_ingress: Optional[pulumi.Input[str]] = None,
93
+ live_domain: Optional[pulumi.Input[str]] = None,
71
94
  live_url: Optional[pulumi.Input[str]] = None,
72
95
  project_id: Optional[pulumi.Input[str]] = None,
73
96
  spec: Optional[pulumi.Input['AppSpecArgs']] = None,
@@ -77,7 +100,9 @@ class _AppState:
77
100
  :param pulumi.Input[str] active_deployment_id: The ID the app's currently active deployment.
78
101
  :param pulumi.Input[str] app_urn: The uniform resource identifier for the app.
79
102
  :param pulumi.Input[str] created_at: The date and time of when the app was created.
103
+ :param pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]] dedicated_ips: The dedicated egress IP addresses associated with the app.
80
104
  :param pulumi.Input[str] default_ingress: The default URL to access the app.
105
+ :param pulumi.Input[str] live_domain: The live domain of the app.
81
106
  :param pulumi.Input[str] live_url: The live URL of the app.
82
107
  :param pulumi.Input[str] project_id: The ID of the project that the app is assigned to.
83
108
 
@@ -93,8 +118,12 @@ class _AppState:
93
118
  pulumi.set(__self__, "app_urn", app_urn)
94
119
  if created_at is not None:
95
120
  pulumi.set(__self__, "created_at", created_at)
121
+ if dedicated_ips is not None:
122
+ pulumi.set(__self__, "dedicated_ips", dedicated_ips)
96
123
  if default_ingress is not None:
97
124
  pulumi.set(__self__, "default_ingress", default_ingress)
125
+ if live_domain is not None:
126
+ pulumi.set(__self__, "live_domain", live_domain)
98
127
  if live_url is not None:
99
128
  pulumi.set(__self__, "live_url", live_url)
100
129
  if project_id is not None:
@@ -140,6 +169,18 @@ class _AppState:
140
169
  def created_at(self, value: Optional[pulumi.Input[str]]):
141
170
  pulumi.set(self, "created_at", value)
142
171
 
172
+ @property
173
+ @pulumi.getter(name="dedicatedIps")
174
+ def dedicated_ips(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]]]:
175
+ """
176
+ The dedicated egress IP addresses associated with the app.
177
+ """
178
+ return pulumi.get(self, "dedicated_ips")
179
+
180
+ @dedicated_ips.setter
181
+ def dedicated_ips(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['AppDedicatedIpArgs']]]]):
182
+ pulumi.set(self, "dedicated_ips", value)
183
+
143
184
  @property
144
185
  @pulumi.getter(name="defaultIngress")
145
186
  def default_ingress(self) -> Optional[pulumi.Input[str]]:
@@ -152,6 +193,18 @@ class _AppState:
152
193
  def default_ingress(self, value: Optional[pulumi.Input[str]]):
153
194
  pulumi.set(self, "default_ingress", value)
154
195
 
196
+ @property
197
+ @pulumi.getter(name="liveDomain")
198
+ def live_domain(self) -> Optional[pulumi.Input[str]]:
199
+ """
200
+ The live domain of the app.
201
+ """
202
+ return pulumi.get(self, "live_domain")
203
+
204
+ @live_domain.setter
205
+ def live_domain(self, value: Optional[pulumi.Input[str]]):
206
+ pulumi.set(self, "live_domain", value)
207
+
155
208
  @property
156
209
  @pulumi.getter(name="liveUrl")
157
210
  def live_url(self) -> Optional[pulumi.Input[str]]:
@@ -210,8 +263,9 @@ class App(pulumi.CustomResource):
210
263
  def __init__(__self__,
211
264
  resource_name: str,
212
265
  opts: Optional[pulumi.ResourceOptions] = None,
266
+ dedicated_ips: Optional[pulumi.Input[Sequence[pulumi.Input[Union['AppDedicatedIpArgs', 'AppDedicatedIpArgsDict']]]]] = None,
213
267
  project_id: Optional[pulumi.Input[str]] = None,
214
- spec: Optional[pulumi.Input[pulumi.InputType['AppSpecArgs']]] = None,
268
+ spec: Optional[pulumi.Input[Union['AppSpecArgs', 'AppSpecArgsDict']]] = None,
215
269
  __props__=None):
216
270
  """
217
271
  Provides a DigitalOcean App resource.
@@ -222,50 +276,76 @@ class App(pulumi.CustomResource):
222
276
 
223
277
  ### Basic Example
224
278
 
225
- <!--Start PulumiCodeChooser -->
226
279
  ```python
227
280
  import pulumi
228
281
  import pulumi_digitalocean as digitalocean
229
282
 
230
- golang_sample = digitalocean.App("golang-sample", spec=digitalocean.AppSpecArgs(
231
- name="golang-sample",
232
- region="ams",
233
- services=[digitalocean.AppSpecServiceArgs(
234
- environment_slug="go",
235
- git=digitalocean.AppSpecServiceGitArgs(
236
- branch="main",
237
- repo_clone_url="https://github.com/digitalocean/sample-golang.git",
238
- ),
239
- instance_count=1,
240
- instance_size_slug="professional-xs",
241
- name="go-service",
242
- )],
243
- ))
283
+ golang_sample = digitalocean.App("golang-sample", spec={
284
+ "name": "golang-sample",
285
+ "region": "ams",
286
+ "services": [{
287
+ "name": "go-service",
288
+ "instance_count": 1,
289
+ "instance_size_slug": "apps-s-1vcpu-1gb",
290
+ "git": {
291
+ "repo_clone_url": "https://github.com/digitalocean/sample-golang.git",
292
+ "branch": "main",
293
+ },
294
+ }],
295
+ })
244
296
  ```
245
- <!--End PulumiCodeChooser -->
246
297
 
247
298
  ### Static Site Example
248
299
 
249
- <!--Start PulumiCodeChooser -->
250
300
  ```python
251
301
  import pulumi
252
302
  import pulumi_digitalocean as digitalocean
253
303
 
254
- static_site_example = digitalocean.App("static-site-example", spec=digitalocean.AppSpecArgs(
255
- name="static-site-example",
256
- region="ams",
257
- static_sites=[digitalocean.AppSpecStaticSiteArgs(
258
- build_command="bundle exec jekyll build -d ./public",
259
- git=digitalocean.AppSpecStaticSiteGitArgs(
260
- branch="main",
261
- repo_clone_url="https://github.com/digitalocean/sample-jekyll.git",
262
- ),
263
- name="sample-jekyll",
264
- output_dir="/public",
265
- )],
266
- ))
304
+ static_site_example = digitalocean.App("static-site-example", spec={
305
+ "name": "static-site-example",
306
+ "region": "ams",
307
+ "static_sites": [{
308
+ "name": "sample-jekyll",
309
+ "build_command": "bundle exec jekyll build -d ./public",
310
+ "output_dir": "/public",
311
+ "git": {
312
+ "repo_clone_url": "https://github.com/digitalocean/sample-jekyll.git",
313
+ "branch": "main",
314
+ },
315
+ }],
316
+ })
317
+ ```
318
+
319
+ ### Log Destination Example with Opensearch
320
+
321
+ ```python
322
+ import pulumi
323
+ import pulumi_digitalocean as digitalocean
324
+
325
+ golang_sample = digitalocean.App("golang-sample", spec={
326
+ "name": "golang-sample",
327
+ "region": "ams",
328
+ "services": [{
329
+ "name": "go-service",
330
+ "instance_count": 1,
331
+ "instance_size_slug": "apps-s-1vcpu-1gb",
332
+ "git": {
333
+ "repo_clone_url": "https://github.com/digitalocean/sample-golang.git",
334
+ "branch": "main",
335
+ },
336
+ "log_destinations": [{
337
+ "name": "MyLogs",
338
+ "open_search": {
339
+ "endpoint": "https://something:1234",
340
+ "basic_auth": {
341
+ "user": "user",
342
+ "password": "hi",
343
+ },
344
+ },
345
+ }],
346
+ }],
347
+ })
267
348
  ```
268
- <!--End PulumiCodeChooser -->
269
349
 
270
350
  ## Import
271
351
 
@@ -277,12 +357,13 @@ class App(pulumi.CustomResource):
277
357
 
278
358
  :param str resource_name: The name of the resource.
279
359
  :param pulumi.ResourceOptions opts: Options for the resource.
360
+ :param pulumi.Input[Sequence[pulumi.Input[Union['AppDedicatedIpArgs', 'AppDedicatedIpArgsDict']]]] dedicated_ips: The dedicated egress IP addresses associated with the app.
280
361
  :param pulumi.Input[str] project_id: The ID of the project that the app is assigned to.
281
362
 
282
363
  A spec can contain multiple components.
283
364
 
284
365
  A `service` can contain:
285
- :param pulumi.Input[pulumi.InputType['AppSpecArgs']] spec: A DigitalOcean App spec describing the app.
366
+ :param pulumi.Input[Union['AppSpecArgs', 'AppSpecArgsDict']] spec: A DigitalOcean App spec describing the app.
286
367
  """
287
368
  ...
288
369
  @overload
@@ -299,50 +380,76 @@ class App(pulumi.CustomResource):
299
380
 
300
381
  ### Basic Example
301
382
 
302
- <!--Start PulumiCodeChooser -->
303
383
  ```python
304
384
  import pulumi
305
385
  import pulumi_digitalocean as digitalocean
306
386
 
307
- golang_sample = digitalocean.App("golang-sample", spec=digitalocean.AppSpecArgs(
308
- name="golang-sample",
309
- region="ams",
310
- services=[digitalocean.AppSpecServiceArgs(
311
- environment_slug="go",
312
- git=digitalocean.AppSpecServiceGitArgs(
313
- branch="main",
314
- repo_clone_url="https://github.com/digitalocean/sample-golang.git",
315
- ),
316
- instance_count=1,
317
- instance_size_slug="professional-xs",
318
- name="go-service",
319
- )],
320
- ))
387
+ golang_sample = digitalocean.App("golang-sample", spec={
388
+ "name": "golang-sample",
389
+ "region": "ams",
390
+ "services": [{
391
+ "name": "go-service",
392
+ "instance_count": 1,
393
+ "instance_size_slug": "apps-s-1vcpu-1gb",
394
+ "git": {
395
+ "repo_clone_url": "https://github.com/digitalocean/sample-golang.git",
396
+ "branch": "main",
397
+ },
398
+ }],
399
+ })
321
400
  ```
322
- <!--End PulumiCodeChooser -->
323
401
 
324
402
  ### Static Site Example
325
403
 
326
- <!--Start PulumiCodeChooser -->
327
404
  ```python
328
405
  import pulumi
329
406
  import pulumi_digitalocean as digitalocean
330
407
 
331
- static_site_example = digitalocean.App("static-site-example", spec=digitalocean.AppSpecArgs(
332
- name="static-site-example",
333
- region="ams",
334
- static_sites=[digitalocean.AppSpecStaticSiteArgs(
335
- build_command="bundle exec jekyll build -d ./public",
336
- git=digitalocean.AppSpecStaticSiteGitArgs(
337
- branch="main",
338
- repo_clone_url="https://github.com/digitalocean/sample-jekyll.git",
339
- ),
340
- name="sample-jekyll",
341
- output_dir="/public",
342
- )],
343
- ))
408
+ static_site_example = digitalocean.App("static-site-example", spec={
409
+ "name": "static-site-example",
410
+ "region": "ams",
411
+ "static_sites": [{
412
+ "name": "sample-jekyll",
413
+ "build_command": "bundle exec jekyll build -d ./public",
414
+ "output_dir": "/public",
415
+ "git": {
416
+ "repo_clone_url": "https://github.com/digitalocean/sample-jekyll.git",
417
+ "branch": "main",
418
+ },
419
+ }],
420
+ })
421
+ ```
422
+
423
+ ### Log Destination Example with Opensearch
424
+
425
+ ```python
426
+ import pulumi
427
+ import pulumi_digitalocean as digitalocean
428
+
429
+ golang_sample = digitalocean.App("golang-sample", spec={
430
+ "name": "golang-sample",
431
+ "region": "ams",
432
+ "services": [{
433
+ "name": "go-service",
434
+ "instance_count": 1,
435
+ "instance_size_slug": "apps-s-1vcpu-1gb",
436
+ "git": {
437
+ "repo_clone_url": "https://github.com/digitalocean/sample-golang.git",
438
+ "branch": "main",
439
+ },
440
+ "log_destinations": [{
441
+ "name": "MyLogs",
442
+ "open_search": {
443
+ "endpoint": "https://something:1234",
444
+ "basic_auth": {
445
+ "user": "user",
446
+ "password": "hi",
447
+ },
448
+ },
449
+ }],
450
+ }],
451
+ })
344
452
  ```
345
- <!--End PulumiCodeChooser -->
346
453
 
347
454
  ## Import
348
455
 
@@ -367,8 +474,9 @@ class App(pulumi.CustomResource):
367
474
  def _internal_init(__self__,
368
475
  resource_name: str,
369
476
  opts: Optional[pulumi.ResourceOptions] = None,
477
+ dedicated_ips: Optional[pulumi.Input[Sequence[pulumi.Input[Union['AppDedicatedIpArgs', 'AppDedicatedIpArgsDict']]]]] = None,
370
478
  project_id: Optional[pulumi.Input[str]] = None,
371
- spec: Optional[pulumi.Input[pulumi.InputType['AppSpecArgs']]] = None,
479
+ spec: Optional[pulumi.Input[Union['AppSpecArgs', 'AppSpecArgsDict']]] = None,
372
480
  __props__=None):
373
481
  opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
374
482
  if not isinstance(opts, pulumi.ResourceOptions):
@@ -378,12 +486,14 @@ class App(pulumi.CustomResource):
378
486
  raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
379
487
  __props__ = AppArgs.__new__(AppArgs)
380
488
 
489
+ __props__.__dict__["dedicated_ips"] = dedicated_ips
381
490
  __props__.__dict__["project_id"] = project_id
382
491
  __props__.__dict__["spec"] = spec
383
492
  __props__.__dict__["active_deployment_id"] = None
384
493
  __props__.__dict__["app_urn"] = None
385
494
  __props__.__dict__["created_at"] = None
386
495
  __props__.__dict__["default_ingress"] = None
496
+ __props__.__dict__["live_domain"] = None
387
497
  __props__.__dict__["live_url"] = None
388
498
  __props__.__dict__["updated_at"] = None
389
499
  super(App, __self__).__init__(
@@ -399,10 +509,12 @@ class App(pulumi.CustomResource):
399
509
  active_deployment_id: Optional[pulumi.Input[str]] = None,
400
510
  app_urn: Optional[pulumi.Input[str]] = None,
401
511
  created_at: Optional[pulumi.Input[str]] = None,
512
+ dedicated_ips: Optional[pulumi.Input[Sequence[pulumi.Input[Union['AppDedicatedIpArgs', 'AppDedicatedIpArgsDict']]]]] = None,
402
513
  default_ingress: Optional[pulumi.Input[str]] = None,
514
+ live_domain: Optional[pulumi.Input[str]] = None,
403
515
  live_url: Optional[pulumi.Input[str]] = None,
404
516
  project_id: Optional[pulumi.Input[str]] = None,
405
- spec: Optional[pulumi.Input[pulumi.InputType['AppSpecArgs']]] = None,
517
+ spec: Optional[pulumi.Input[Union['AppSpecArgs', 'AppSpecArgsDict']]] = None,
406
518
  updated_at: Optional[pulumi.Input[str]] = None) -> 'App':
407
519
  """
408
520
  Get an existing App resource's state with the given name, id, and optional extra
@@ -414,14 +526,16 @@ class App(pulumi.CustomResource):
414
526
  :param pulumi.Input[str] active_deployment_id: The ID the app's currently active deployment.
415
527
  :param pulumi.Input[str] app_urn: The uniform resource identifier for the app.
416
528
  :param pulumi.Input[str] created_at: The date and time of when the app was created.
529
+ :param pulumi.Input[Sequence[pulumi.Input[Union['AppDedicatedIpArgs', 'AppDedicatedIpArgsDict']]]] dedicated_ips: The dedicated egress IP addresses associated with the app.
417
530
  :param pulumi.Input[str] default_ingress: The default URL to access the app.
531
+ :param pulumi.Input[str] live_domain: The live domain of the app.
418
532
  :param pulumi.Input[str] live_url: The live URL of the app.
419
533
  :param pulumi.Input[str] project_id: The ID of the project that the app is assigned to.
420
534
 
421
535
  A spec can contain multiple components.
422
536
 
423
537
  A `service` can contain:
424
- :param pulumi.Input[pulumi.InputType['AppSpecArgs']] spec: A DigitalOcean App spec describing the app.
538
+ :param pulumi.Input[Union['AppSpecArgs', 'AppSpecArgsDict']] spec: A DigitalOcean App spec describing the app.
425
539
  :param pulumi.Input[str] updated_at: The date and time of when the app was last updated.
426
540
  """
427
541
  opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
@@ -431,7 +545,9 @@ class App(pulumi.CustomResource):
431
545
  __props__.__dict__["active_deployment_id"] = active_deployment_id
432
546
  __props__.__dict__["app_urn"] = app_urn
433
547
  __props__.__dict__["created_at"] = created_at
548
+ __props__.__dict__["dedicated_ips"] = dedicated_ips
434
549
  __props__.__dict__["default_ingress"] = default_ingress
550
+ __props__.__dict__["live_domain"] = live_domain
435
551
  __props__.__dict__["live_url"] = live_url
436
552
  __props__.__dict__["project_id"] = project_id
437
553
  __props__.__dict__["spec"] = spec
@@ -462,6 +578,14 @@ class App(pulumi.CustomResource):
462
578
  """
463
579
  return pulumi.get(self, "created_at")
464
580
 
581
+ @property
582
+ @pulumi.getter(name="dedicatedIps")
583
+ def dedicated_ips(self) -> pulumi.Output[Sequence['outputs.AppDedicatedIp']]:
584
+ """
585
+ The dedicated egress IP addresses associated with the app.
586
+ """
587
+ return pulumi.get(self, "dedicated_ips")
588
+
465
589
  @property
466
590
  @pulumi.getter(name="defaultIngress")
467
591
  def default_ingress(self) -> pulumi.Output[str]:
@@ -470,6 +594,14 @@ class App(pulumi.CustomResource):
470
594
  """
471
595
  return pulumi.get(self, "default_ingress")
472
596
 
597
+ @property
598
+ @pulumi.getter(name="liveDomain")
599
+ def live_domain(self) -> pulumi.Output[str]:
600
+ """
601
+ The live domain of the app.
602
+ """
603
+ return pulumi.get(self, "live_domain")
604
+
473
605
  @property
474
606
  @pulumi.getter(name="liveUrl")
475
607
  def live_url(self) -> pulumi.Output[str]: