pulumi-tailscale 1.0.0a1767140025__tar.gz → 1.0.0a1767670937__tar.gz

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 (44) hide show
  1. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/PKG-INFO +1 -1
  2. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/__init__.py +9 -0
  3. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/acl.py +38 -38
  4. pulumi_tailscale-1.0.0a1767670937/pulumi_tailscale/federated_identity.py +576 -0
  5. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/get_acl.py +6 -2
  6. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/oauth_client.py +46 -18
  7. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/pulumi-plugin.json +1 -1
  8. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale.egg-info/PKG-INFO +1 -1
  9. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale.egg-info/SOURCES.txt +1 -0
  10. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pyproject.toml +1 -1
  11. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/README.md +0 -0
  12. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/_inputs.py +0 -0
  13. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/_utilities.py +0 -0
  14. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/aws_external_id.py +0 -0
  15. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/config/__init__.py +0 -0
  16. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/config/__init__.pyi +0 -0
  17. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/config/vars.py +0 -0
  18. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/contacts.py +0 -0
  19. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/device_authorization.py +0 -0
  20. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/device_key.py +0 -0
  21. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/device_subnet_routes.py +0 -0
  22. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/device_tags.py +0 -0
  23. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/dns_configuration.py +0 -0
  24. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/dns_nameservers.py +0 -0
  25. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/dns_preferences.py +0 -0
  26. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/dns_search_paths.py +0 -0
  27. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/dns_split_nameservers.py +0 -0
  28. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/get4_via6.py +0 -0
  29. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/get_device.py +0 -0
  30. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/get_devices.py +0 -0
  31. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/get_user.py +0 -0
  32. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/get_users.py +0 -0
  33. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/logstream_configuration.py +0 -0
  34. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/outputs.py +0 -0
  35. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/posture_integration.py +0 -0
  36. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/provider.py +0 -0
  37. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/py.typed +0 -0
  38. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/tailnet_key.py +0 -0
  39. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/tailnet_settings.py +0 -0
  40. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale/webhook.py +0 -0
  41. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale.egg-info/dependency_links.txt +0 -0
  42. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale.egg-info/requires.txt +0 -0
  43. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/pulumi_tailscale.egg-info/top_level.txt +0 -0
  44. {pulumi_tailscale-1.0.0a1767140025 → pulumi_tailscale-1.0.0a1767670937}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulumi_tailscale
3
- Version: 1.0.0a1767140025
3
+ Version: 1.0.0a1767670937
4
4
  Summary: A Pulumi package for creating and managing Tailscale cloud resources.
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://pulumi.io
@@ -18,6 +18,7 @@ from .dns_nameservers import *
18
18
  from .dns_preferences import *
19
19
  from .dns_search_paths import *
20
20
  from .dns_split_nameservers import *
21
+ from .federated_identity import *
21
22
  from .get4_via6 import *
22
23
  from .get_acl import *
23
24
  from .get_device import *
@@ -140,6 +141,14 @@ _utilities.register(
140
141
  "tailscale:index/dnsSplitNameservers:DnsSplitNameservers": "DnsSplitNameservers"
141
142
  }
142
143
  },
144
+ {
145
+ "pkg": "tailscale",
146
+ "mod": "index/federatedIdentity",
147
+ "fqn": "pulumi_tailscale",
148
+ "classes": {
149
+ "tailscale:index/federatedIdentity:FederatedIdentity": "FederatedIdentity"
150
+ }
151
+ },
143
152
  {
144
153
  "pkg": "tailscale",
145
154
  "mod": "index/logstreamConfiguration",
@@ -25,8 +25,8 @@ class AclArgs:
25
25
  """
26
26
  The set of arguments for constructing a Acl resource.
27
27
  :param pulumi.Input[_builtins.str] acl: The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.
28
- :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
29
- :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
28
+ :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
29
+ :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
30
30
  """
31
31
  pulumi.set(__self__, "acl", acl)
32
32
  if overwrite_existing_content is not None:
@@ -50,7 +50,7 @@ class AclArgs:
50
50
  @pulumi.getter(name="overwriteExistingContent")
51
51
  def overwrite_existing_content(self) -> Optional[pulumi.Input[_builtins.bool]]:
52
52
  """
53
- If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
53
+ If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
54
54
  """
55
55
  return pulumi.get(self, "overwrite_existing_content")
56
56
 
@@ -62,7 +62,7 @@ class AclArgs:
62
62
  @pulumi.getter(name="resetAclOnDestroy")
63
63
  def reset_acl_on_destroy(self) -> Optional[pulumi.Input[_builtins.bool]]:
64
64
  """
65
- If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
65
+ If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
66
66
  """
67
67
  return pulumi.get(self, "reset_acl_on_destroy")
68
68
 
@@ -80,8 +80,8 @@ class _AclState:
80
80
  """
81
81
  Input properties used for looking up and filtering Acl resources.
82
82
  :param pulumi.Input[_builtins.str] acl: The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.
83
- :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
84
- :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
83
+ :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
84
+ :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
85
85
  """
86
86
  if acl is not None:
87
87
  pulumi.set(__self__, "acl", acl)
@@ -106,7 +106,7 @@ class _AclState:
106
106
  @pulumi.getter(name="overwriteExistingContent")
107
107
  def overwrite_existing_content(self) -> Optional[pulumi.Input[_builtins.bool]]:
108
108
  """
109
- If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
109
+ If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
110
110
  """
111
111
  return pulumi.get(self, "overwrite_existing_content")
112
112
 
@@ -118,7 +118,7 @@ class _AclState:
118
118
  @pulumi.getter(name="resetAclOnDestroy")
119
119
  def reset_acl_on_destroy(self) -> Optional[pulumi.Input[_builtins.bool]]:
120
120
  """
121
- If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
121
+ If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
122
122
  """
123
123
  return pulumi.get(self, "reset_acl_on_destroy")
124
124
 
@@ -138,9 +138,11 @@ class Acl(pulumi.CustomResource):
138
138
  reset_acl_on_destroy: Optional[pulumi.Input[_builtins.bool]] = None,
139
139
  __props__=None):
140
140
  """
141
- The acl resource allows you to configure a Tailscale ACL. See https://tailscale.com/kb/1018/acls for more information. Note that this resource will completely overwrite existing ACL contents for a given tailnet.
141
+ The acl resource allows you to configure a Tailscale policy file. See https://tailscale.com/kb/1395/tailnet-policy-file for more information. Note that this resource will completely overwrite existing policy file contents for a given tailnet.
142
142
 
143
- If tests are defined in the ACL (the top-level "tests" section), ACL validation will occur before creation and update operations are applied.
143
+ If tests are defined in the policy file (the top-level "tests" section), policy file validation will occur before creation and update operations are applied.
144
+
145
+ > **Note:** The naming of this resource predates Tailscale's usage of the term "policy file" to refer to the centralized configuration file for a tailnet. This resource controls a tailnet's entire policy file and not just the ACLs section within it.
144
146
 
145
147
  ## Example Usage
146
148
 
@@ -150,20 +152,20 @@ class Acl(pulumi.CustomResource):
150
152
  import pulumi_tailscale as tailscale
151
153
 
152
154
  as_json = tailscale.Acl("as_json", acl=json.dumps({
153
- "acls": [{
154
- "action": "accept",
155
- "users": ["*"],
156
- "ports": ["*:*"],
155
+ "grants": [{
156
+ "src": ["*"],
157
+ "dst": ["*"],
158
+ "ip": ["*"],
157
159
  }],
158
160
  }))
159
161
  as_hujson = tailscale.Acl("as_hujson", acl=\"\"\" {
160
162
  // Comments in HuJSON policy are preserved when the policy is applied.
161
- \\"acls\\": [
163
+ \\"grants\\": [
162
164
  {
163
165
  // Allow all users access to all ports.
164
- action = \\"accept\\",
165
- users = [\\"*\\"],
166
- ports = [\\"*:*\\"],
166
+ \\"src\\" = [\\"*\\"],
167
+ \\"dst\\" = [\\"*\\"],
168
+ \\"ip\\" = [\\"*\\"],
167
169
  },
168
170
  ],
169
171
  }
@@ -172,8 +174,6 @@ class Acl(pulumi.CustomResource):
172
174
 
173
175
  ## Import
174
176
 
175
- The `pulumi import` command can be used, for example:
176
-
177
177
  ID doesn't matter.
178
178
 
179
179
  ```sh
@@ -183,8 +183,8 @@ class Acl(pulumi.CustomResource):
183
183
  :param str resource_name: The name of the resource.
184
184
  :param pulumi.ResourceOptions opts: Options for the resource.
185
185
  :param pulumi.Input[_builtins.str] acl: The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.
186
- :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
187
- :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
186
+ :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
187
+ :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
188
188
  """
189
189
  ...
190
190
  @overload
@@ -193,9 +193,11 @@ class Acl(pulumi.CustomResource):
193
193
  args: AclArgs,
194
194
  opts: Optional[pulumi.ResourceOptions] = None):
195
195
  """
196
- The acl resource allows you to configure a Tailscale ACL. See https://tailscale.com/kb/1018/acls for more information. Note that this resource will completely overwrite existing ACL contents for a given tailnet.
196
+ The acl resource allows you to configure a Tailscale policy file. See https://tailscale.com/kb/1395/tailnet-policy-file for more information. Note that this resource will completely overwrite existing policy file contents for a given tailnet.
197
197
 
198
- If tests are defined in the ACL (the top-level "tests" section), ACL validation will occur before creation and update operations are applied.
198
+ If tests are defined in the policy file (the top-level "tests" section), policy file validation will occur before creation and update operations are applied.
199
+
200
+ > **Note:** The naming of this resource predates Tailscale's usage of the term "policy file" to refer to the centralized configuration file for a tailnet. This resource controls a tailnet's entire policy file and not just the ACLs section within it.
199
201
 
200
202
  ## Example Usage
201
203
 
@@ -205,20 +207,20 @@ class Acl(pulumi.CustomResource):
205
207
  import pulumi_tailscale as tailscale
206
208
 
207
209
  as_json = tailscale.Acl("as_json", acl=json.dumps({
208
- "acls": [{
209
- "action": "accept",
210
- "users": ["*"],
211
- "ports": ["*:*"],
210
+ "grants": [{
211
+ "src": ["*"],
212
+ "dst": ["*"],
213
+ "ip": ["*"],
212
214
  }],
213
215
  }))
214
216
  as_hujson = tailscale.Acl("as_hujson", acl=\"\"\" {
215
217
  // Comments in HuJSON policy are preserved when the policy is applied.
216
- \\"acls\\": [
218
+ \\"grants\\": [
217
219
  {
218
220
  // Allow all users access to all ports.
219
- action = \\"accept\\",
220
- users = [\\"*\\"],
221
- ports = [\\"*:*\\"],
221
+ \\"src\\" = [\\"*\\"],
222
+ \\"dst\\" = [\\"*\\"],
223
+ \\"ip\\" = [\\"*\\"],
222
224
  },
223
225
  ],
224
226
  }
@@ -227,8 +229,6 @@ class Acl(pulumi.CustomResource):
227
229
 
228
230
  ## Import
229
231
 
230
- The `pulumi import` command can be used, for example:
231
-
232
232
  ID doesn't matter.
233
233
 
234
234
  ```sh
@@ -288,8 +288,8 @@ class Acl(pulumi.CustomResource):
288
288
  :param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
289
289
  :param pulumi.ResourceOptions opts: Options for the resource.
290
290
  :param pulumi.Input[_builtins.str] acl: The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.
291
- :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
292
- :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
291
+ :param pulumi.Input[_builtins.bool] overwrite_existing_content: If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
292
+ :param pulumi.Input[_builtins.bool] reset_acl_on_destroy: If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
293
293
  """
294
294
  opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
295
295
 
@@ -312,7 +312,7 @@ class Acl(pulumi.CustomResource):
312
312
  @pulumi.getter(name="overwriteExistingContent")
313
313
  def overwrite_existing_content(self) -> pulumi.Output[Optional[_builtins.bool]]:
314
314
  """
315
- If true, will skip requirement to import acl before allowing changes. Be careful, can cause ACL to be overwritten
315
+ If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten
316
316
  """
317
317
  return pulumi.get(self, "overwrite_existing_content")
318
318
 
@@ -320,7 +320,7 @@ class Acl(pulumi.CustomResource):
320
320
  @pulumi.getter(name="resetAclOnDestroy")
321
321
  def reset_acl_on_destroy(self) -> pulumi.Output[Optional[_builtins.bool]]:
322
322
  """
323
- If true, will reset the ACL for the Tailnet to the default when this resource is destroyed
323
+ If true, will reset the policy file for the Tailnet to the default when this resource is destroyed
324
324
  """
325
325
  return pulumi.get(self, "reset_acl_on_destroy")
326
326
 
@@ -0,0 +1,576 @@
1
+ # coding=utf-8
2
+ # *** WARNING: this file was generated by pulumi-language-python. ***
3
+ # *** Do not edit by hand unless you're certain you know what you are doing! ***
4
+
5
+ import builtins as _builtins
6
+ import warnings
7
+ import sys
8
+ import pulumi
9
+ import pulumi.runtime
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
15
+ from . import _utilities
16
+
17
+ __all__ = ['FederatedIdentityArgs', 'FederatedIdentity']
18
+
19
+ @pulumi.input_type
20
+ class FederatedIdentityArgs:
21
+ def __init__(__self__, *,
22
+ issuer: pulumi.Input[_builtins.str],
23
+ scopes: pulumi.Input[Sequence[pulumi.Input[_builtins.str]]],
24
+ subject: pulumi.Input[_builtins.str],
25
+ audience: Optional[pulumi.Input[_builtins.str]] = None,
26
+ custom_claim_rules: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
27
+ description: Optional[pulumi.Input[_builtins.str]] = None,
28
+ tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None):
29
+ """
30
+ The set of arguments for constructing a FederatedIdentity resource.
31
+ :param pulumi.Input[_builtins.str] issuer: The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
32
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
33
+ :param pulumi.Input[_builtins.str] subject: The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
34
+ :param pulumi.Input[_builtins.str] audience: The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
35
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] custom_claim_rules: A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
36
+ :param pulumi.Input[_builtins.str] description: A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
37
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
38
+ """
39
+ pulumi.set(__self__, "issuer", issuer)
40
+ pulumi.set(__self__, "scopes", scopes)
41
+ pulumi.set(__self__, "subject", subject)
42
+ if audience is not None:
43
+ pulumi.set(__self__, "audience", audience)
44
+ if custom_claim_rules is not None:
45
+ pulumi.set(__self__, "custom_claim_rules", custom_claim_rules)
46
+ if description is not None:
47
+ pulumi.set(__self__, "description", description)
48
+ if tags is not None:
49
+ pulumi.set(__self__, "tags", tags)
50
+
51
+ @_builtins.property
52
+ @pulumi.getter
53
+ def issuer(self) -> pulumi.Input[_builtins.str]:
54
+ """
55
+ The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
56
+ """
57
+ return pulumi.get(self, "issuer")
58
+
59
+ @issuer.setter
60
+ def issuer(self, value: pulumi.Input[_builtins.str]):
61
+ pulumi.set(self, "issuer", value)
62
+
63
+ @_builtins.property
64
+ @pulumi.getter
65
+ def scopes(self) -> pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]:
66
+ """
67
+ Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
68
+ """
69
+ return pulumi.get(self, "scopes")
70
+
71
+ @scopes.setter
72
+ def scopes(self, value: pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]):
73
+ pulumi.set(self, "scopes", value)
74
+
75
+ @_builtins.property
76
+ @pulumi.getter
77
+ def subject(self) -> pulumi.Input[_builtins.str]:
78
+ """
79
+ The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
80
+ """
81
+ return pulumi.get(self, "subject")
82
+
83
+ @subject.setter
84
+ def subject(self, value: pulumi.Input[_builtins.str]):
85
+ pulumi.set(self, "subject", value)
86
+
87
+ @_builtins.property
88
+ @pulumi.getter
89
+ def audience(self) -> Optional[pulumi.Input[_builtins.str]]:
90
+ """
91
+ The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
92
+ """
93
+ return pulumi.get(self, "audience")
94
+
95
+ @audience.setter
96
+ def audience(self, value: Optional[pulumi.Input[_builtins.str]]):
97
+ pulumi.set(self, "audience", value)
98
+
99
+ @_builtins.property
100
+ @pulumi.getter(name="customClaimRules")
101
+ def custom_claim_rules(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
102
+ """
103
+ A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
104
+ """
105
+ return pulumi.get(self, "custom_claim_rules")
106
+
107
+ @custom_claim_rules.setter
108
+ def custom_claim_rules(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
109
+ pulumi.set(self, "custom_claim_rules", value)
110
+
111
+ @_builtins.property
112
+ @pulumi.getter
113
+ def description(self) -> Optional[pulumi.Input[_builtins.str]]:
114
+ """
115
+ A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
116
+ """
117
+ return pulumi.get(self, "description")
118
+
119
+ @description.setter
120
+ def description(self, value: Optional[pulumi.Input[_builtins.str]]):
121
+ pulumi.set(self, "description", value)
122
+
123
+ @_builtins.property
124
+ @pulumi.getter
125
+ def tags(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
126
+ """
127
+ A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
128
+ """
129
+ return pulumi.get(self, "tags")
130
+
131
+ @tags.setter
132
+ def tags(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
133
+ pulumi.set(self, "tags", value)
134
+
135
+
136
+ @pulumi.input_type
137
+ class _FederatedIdentityState:
138
+ def __init__(__self__, *,
139
+ audience: Optional[pulumi.Input[_builtins.str]] = None,
140
+ created_at: Optional[pulumi.Input[_builtins.str]] = None,
141
+ custom_claim_rules: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
142
+ description: Optional[pulumi.Input[_builtins.str]] = None,
143
+ issuer: Optional[pulumi.Input[_builtins.str]] = None,
144
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
145
+ subject: Optional[pulumi.Input[_builtins.str]] = None,
146
+ tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
147
+ updated_at: Optional[pulumi.Input[_builtins.str]] = None,
148
+ user_id: Optional[pulumi.Input[_builtins.str]] = None):
149
+ """
150
+ Input properties used for looking up and filtering FederatedIdentity resources.
151
+ :param pulumi.Input[_builtins.str] audience: The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
152
+ :param pulumi.Input[_builtins.str] created_at: The creation timestamp of the key in RFC3339 format
153
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] custom_claim_rules: A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
154
+ :param pulumi.Input[_builtins.str] description: A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
155
+ :param pulumi.Input[_builtins.str] issuer: The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
156
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
157
+ :param pulumi.Input[_builtins.str] subject: The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
158
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
159
+ :param pulumi.Input[_builtins.str] updated_at: The updated timestamp of the key in RFC3339 format
160
+ :param pulumi.Input[_builtins.str] user_id: ID of the user who created this federated identity, empty for federated identities created by other trust credentials.
161
+ """
162
+ if audience is not None:
163
+ pulumi.set(__self__, "audience", audience)
164
+ if created_at is not None:
165
+ pulumi.set(__self__, "created_at", created_at)
166
+ if custom_claim_rules is not None:
167
+ pulumi.set(__self__, "custom_claim_rules", custom_claim_rules)
168
+ if description is not None:
169
+ pulumi.set(__self__, "description", description)
170
+ if issuer is not None:
171
+ pulumi.set(__self__, "issuer", issuer)
172
+ if scopes is not None:
173
+ pulumi.set(__self__, "scopes", scopes)
174
+ if subject is not None:
175
+ pulumi.set(__self__, "subject", subject)
176
+ if tags is not None:
177
+ pulumi.set(__self__, "tags", tags)
178
+ if updated_at is not None:
179
+ pulumi.set(__self__, "updated_at", updated_at)
180
+ if user_id is not None:
181
+ pulumi.set(__self__, "user_id", user_id)
182
+
183
+ @_builtins.property
184
+ @pulumi.getter
185
+ def audience(self) -> Optional[pulumi.Input[_builtins.str]]:
186
+ """
187
+ The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
188
+ """
189
+ return pulumi.get(self, "audience")
190
+
191
+ @audience.setter
192
+ def audience(self, value: Optional[pulumi.Input[_builtins.str]]):
193
+ pulumi.set(self, "audience", value)
194
+
195
+ @_builtins.property
196
+ @pulumi.getter(name="createdAt")
197
+ def created_at(self) -> Optional[pulumi.Input[_builtins.str]]:
198
+ """
199
+ The creation timestamp of the key in RFC3339 format
200
+ """
201
+ return pulumi.get(self, "created_at")
202
+
203
+ @created_at.setter
204
+ def created_at(self, value: Optional[pulumi.Input[_builtins.str]]):
205
+ pulumi.set(self, "created_at", value)
206
+
207
+ @_builtins.property
208
+ @pulumi.getter(name="customClaimRules")
209
+ def custom_claim_rules(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
210
+ """
211
+ A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
212
+ """
213
+ return pulumi.get(self, "custom_claim_rules")
214
+
215
+ @custom_claim_rules.setter
216
+ def custom_claim_rules(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
217
+ pulumi.set(self, "custom_claim_rules", value)
218
+
219
+ @_builtins.property
220
+ @pulumi.getter
221
+ def description(self) -> Optional[pulumi.Input[_builtins.str]]:
222
+ """
223
+ A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
224
+ """
225
+ return pulumi.get(self, "description")
226
+
227
+ @description.setter
228
+ def description(self, value: Optional[pulumi.Input[_builtins.str]]):
229
+ pulumi.set(self, "description", value)
230
+
231
+ @_builtins.property
232
+ @pulumi.getter
233
+ def issuer(self) -> Optional[pulumi.Input[_builtins.str]]:
234
+ """
235
+ The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
236
+ """
237
+ return pulumi.get(self, "issuer")
238
+
239
+ @issuer.setter
240
+ def issuer(self, value: Optional[pulumi.Input[_builtins.str]]):
241
+ pulumi.set(self, "issuer", value)
242
+
243
+ @_builtins.property
244
+ @pulumi.getter
245
+ def scopes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
246
+ """
247
+ Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
248
+ """
249
+ return pulumi.get(self, "scopes")
250
+
251
+ @scopes.setter
252
+ def scopes(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
253
+ pulumi.set(self, "scopes", value)
254
+
255
+ @_builtins.property
256
+ @pulumi.getter
257
+ def subject(self) -> Optional[pulumi.Input[_builtins.str]]:
258
+ """
259
+ The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
260
+ """
261
+ return pulumi.get(self, "subject")
262
+
263
+ @subject.setter
264
+ def subject(self, value: Optional[pulumi.Input[_builtins.str]]):
265
+ pulumi.set(self, "subject", value)
266
+
267
+ @_builtins.property
268
+ @pulumi.getter
269
+ def tags(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
270
+ """
271
+ A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
272
+ """
273
+ return pulumi.get(self, "tags")
274
+
275
+ @tags.setter
276
+ def tags(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
277
+ pulumi.set(self, "tags", value)
278
+
279
+ @_builtins.property
280
+ @pulumi.getter(name="updatedAt")
281
+ def updated_at(self) -> Optional[pulumi.Input[_builtins.str]]:
282
+ """
283
+ The updated timestamp of the key in RFC3339 format
284
+ """
285
+ return pulumi.get(self, "updated_at")
286
+
287
+ @updated_at.setter
288
+ def updated_at(self, value: Optional[pulumi.Input[_builtins.str]]):
289
+ pulumi.set(self, "updated_at", value)
290
+
291
+ @_builtins.property
292
+ @pulumi.getter(name="userId")
293
+ def user_id(self) -> Optional[pulumi.Input[_builtins.str]]:
294
+ """
295
+ ID of the user who created this federated identity, empty for federated identities created by other trust credentials.
296
+ """
297
+ return pulumi.get(self, "user_id")
298
+
299
+ @user_id.setter
300
+ def user_id(self, value: Optional[pulumi.Input[_builtins.str]]):
301
+ pulumi.set(self, "user_id", value)
302
+
303
+
304
+ @pulumi.type_token("tailscale:index/federatedIdentity:FederatedIdentity")
305
+ class FederatedIdentity(pulumi.CustomResource):
306
+ @overload
307
+ def __init__(__self__,
308
+ resource_name: str,
309
+ opts: Optional[pulumi.ResourceOptions] = None,
310
+ audience: Optional[pulumi.Input[_builtins.str]] = None,
311
+ custom_claim_rules: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
312
+ description: Optional[pulumi.Input[_builtins.str]] = None,
313
+ issuer: Optional[pulumi.Input[_builtins.str]] = None,
314
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
315
+ subject: Optional[pulumi.Input[_builtins.str]] = None,
316
+ tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
317
+ __props__=None):
318
+ """
319
+ The federated_identity resource allows you to create federated identities to programmatically interact with the Tailscale API using workload identity federation.
320
+
321
+ ## Example Usage
322
+
323
+ ```python
324
+ import pulumi
325
+ import pulumi_tailscale as tailscale
326
+
327
+ example_federated_identity = tailscale.FederatedIdentity("example_federated_identity",
328
+ description="Example federated identity",
329
+ scopes=[
330
+ "auth_keys",
331
+ "devices:core",
332
+ ],
333
+ tags=["tag:test"],
334
+ issuer="https://example.com",
335
+ subject="example-sub-*",
336
+ custom_claim_rules={
337
+ "repo_name": "example-repo-name",
338
+ })
339
+ ```
340
+
341
+ ## Import
342
+
343
+ The `pulumi import` command can be used, for example:
344
+
345
+ ```sh
346
+ $ pulumi import tailscale:index/federatedIdentity:FederatedIdentity example k1234511CNTRL-kZDRvszg8621CNTRL
347
+ ```
348
+
349
+ :param str resource_name: The name of the resource.
350
+ :param pulumi.ResourceOptions opts: Options for the resource.
351
+ :param pulumi.Input[_builtins.str] audience: The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
352
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] custom_claim_rules: A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
353
+ :param pulumi.Input[_builtins.str] description: A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
354
+ :param pulumi.Input[_builtins.str] issuer: The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
355
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
356
+ :param pulumi.Input[_builtins.str] subject: The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
357
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
358
+ """
359
+ ...
360
+ @overload
361
+ def __init__(__self__,
362
+ resource_name: str,
363
+ args: FederatedIdentityArgs,
364
+ opts: Optional[pulumi.ResourceOptions] = None):
365
+ """
366
+ The federated_identity resource allows you to create federated identities to programmatically interact with the Tailscale API using workload identity federation.
367
+
368
+ ## Example Usage
369
+
370
+ ```python
371
+ import pulumi
372
+ import pulumi_tailscale as tailscale
373
+
374
+ example_federated_identity = tailscale.FederatedIdentity("example_federated_identity",
375
+ description="Example federated identity",
376
+ scopes=[
377
+ "auth_keys",
378
+ "devices:core",
379
+ ],
380
+ tags=["tag:test"],
381
+ issuer="https://example.com",
382
+ subject="example-sub-*",
383
+ custom_claim_rules={
384
+ "repo_name": "example-repo-name",
385
+ })
386
+ ```
387
+
388
+ ## Import
389
+
390
+ The `pulumi import` command can be used, for example:
391
+
392
+ ```sh
393
+ $ pulumi import tailscale:index/federatedIdentity:FederatedIdentity example k1234511CNTRL-kZDRvszg8621CNTRL
394
+ ```
395
+
396
+ :param str resource_name: The name of the resource.
397
+ :param FederatedIdentityArgs args: The arguments to use to populate this resource's properties.
398
+ :param pulumi.ResourceOptions opts: Options for the resource.
399
+ """
400
+ ...
401
+ def __init__(__self__, resource_name: str, *args, **kwargs):
402
+ resource_args, opts = _utilities.get_resource_args_opts(FederatedIdentityArgs, pulumi.ResourceOptions, *args, **kwargs)
403
+ if resource_args is not None:
404
+ __self__._internal_init(resource_name, opts, **resource_args.__dict__)
405
+ else:
406
+ __self__._internal_init(resource_name, *args, **kwargs)
407
+
408
+ def _internal_init(__self__,
409
+ resource_name: str,
410
+ opts: Optional[pulumi.ResourceOptions] = None,
411
+ audience: Optional[pulumi.Input[_builtins.str]] = None,
412
+ custom_claim_rules: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
413
+ description: Optional[pulumi.Input[_builtins.str]] = None,
414
+ issuer: Optional[pulumi.Input[_builtins.str]] = None,
415
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
416
+ subject: Optional[pulumi.Input[_builtins.str]] = None,
417
+ tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
418
+ __props__=None):
419
+ opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
420
+ if not isinstance(opts, pulumi.ResourceOptions):
421
+ raise TypeError('Expected resource options to be a ResourceOptions instance')
422
+ if opts.id is None:
423
+ if __props__ is not None:
424
+ raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
425
+ __props__ = FederatedIdentityArgs.__new__(FederatedIdentityArgs)
426
+
427
+ __props__.__dict__["audience"] = audience
428
+ __props__.__dict__["custom_claim_rules"] = custom_claim_rules
429
+ __props__.__dict__["description"] = description
430
+ if issuer is None and not opts.urn:
431
+ raise TypeError("Missing required property 'issuer'")
432
+ __props__.__dict__["issuer"] = issuer
433
+ if scopes is None and not opts.urn:
434
+ raise TypeError("Missing required property 'scopes'")
435
+ __props__.__dict__["scopes"] = scopes
436
+ if subject is None and not opts.urn:
437
+ raise TypeError("Missing required property 'subject'")
438
+ __props__.__dict__["subject"] = subject
439
+ __props__.__dict__["tags"] = tags
440
+ __props__.__dict__["created_at"] = None
441
+ __props__.__dict__["updated_at"] = None
442
+ __props__.__dict__["user_id"] = None
443
+ super(FederatedIdentity, __self__).__init__(
444
+ 'tailscale:index/federatedIdentity:FederatedIdentity',
445
+ resource_name,
446
+ __props__,
447
+ opts)
448
+
449
+ @staticmethod
450
+ def get(resource_name: str,
451
+ id: pulumi.Input[str],
452
+ opts: Optional[pulumi.ResourceOptions] = None,
453
+ audience: Optional[pulumi.Input[_builtins.str]] = None,
454
+ created_at: Optional[pulumi.Input[_builtins.str]] = None,
455
+ custom_claim_rules: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
456
+ description: Optional[pulumi.Input[_builtins.str]] = None,
457
+ issuer: Optional[pulumi.Input[_builtins.str]] = None,
458
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
459
+ subject: Optional[pulumi.Input[_builtins.str]] = None,
460
+ tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
461
+ updated_at: Optional[pulumi.Input[_builtins.str]] = None,
462
+ user_id: Optional[pulumi.Input[_builtins.str]] = None) -> 'FederatedIdentity':
463
+ """
464
+ Get an existing FederatedIdentity resource's state with the given name, id, and optional extra
465
+ properties used to qualify the lookup.
466
+
467
+ :param str resource_name: The unique name of the resulting resource.
468
+ :param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
469
+ :param pulumi.ResourceOptions opts: Options for the resource.
470
+ :param pulumi.Input[_builtins.str] audience: The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
471
+ :param pulumi.Input[_builtins.str] created_at: The creation timestamp of the key in RFC3339 format
472
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] custom_claim_rules: A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
473
+ :param pulumi.Input[_builtins.str] description: A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
474
+ :param pulumi.Input[_builtins.str] issuer: The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
475
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
476
+ :param pulumi.Input[_builtins.str] subject: The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
477
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
478
+ :param pulumi.Input[_builtins.str] updated_at: The updated timestamp of the key in RFC3339 format
479
+ :param pulumi.Input[_builtins.str] user_id: ID of the user who created this federated identity, empty for federated identities created by other trust credentials.
480
+ """
481
+ opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
482
+
483
+ __props__ = _FederatedIdentityState.__new__(_FederatedIdentityState)
484
+
485
+ __props__.__dict__["audience"] = audience
486
+ __props__.__dict__["created_at"] = created_at
487
+ __props__.__dict__["custom_claim_rules"] = custom_claim_rules
488
+ __props__.__dict__["description"] = description
489
+ __props__.__dict__["issuer"] = issuer
490
+ __props__.__dict__["scopes"] = scopes
491
+ __props__.__dict__["subject"] = subject
492
+ __props__.__dict__["tags"] = tags
493
+ __props__.__dict__["updated_at"] = updated_at
494
+ __props__.__dict__["user_id"] = user_id
495
+ return FederatedIdentity(resource_name, opts=opts, __props__=__props__)
496
+
497
+ @_builtins.property
498
+ @pulumi.getter
499
+ def audience(self) -> pulumi.Output[_builtins.str]:
500
+ """
501
+ The value used when matching against the `aud` claim from an OIDC identity token. Specifying the audience is optional as Tailscale will generate a secure audience at creation time by default. It is recommended to let Tailscale generate the audience unless the identity provider you are integrating with requires a specific audience format.
502
+ """
503
+ return pulumi.get(self, "audience")
504
+
505
+ @_builtins.property
506
+ @pulumi.getter(name="createdAt")
507
+ def created_at(self) -> pulumi.Output[_builtins.str]:
508
+ """
509
+ The creation timestamp of the key in RFC3339 format
510
+ """
511
+ return pulumi.get(self, "created_at")
512
+
513
+ @_builtins.property
514
+ @pulumi.getter(name="customClaimRules")
515
+ def custom_claim_rules(self) -> pulumi.Output[Optional[Mapping[str, _builtins.str]]]:
516
+ """
517
+ A map of claim names to pattern strings used to match against arbitrary claims in the OIDC identity token. Patterns can include `*` characters to match against any character.
518
+ """
519
+ return pulumi.get(self, "custom_claim_rules")
520
+
521
+ @_builtins.property
522
+ @pulumi.getter
523
+ def description(self) -> pulumi.Output[Optional[_builtins.str]]:
524
+ """
525
+ A description of the federated identity consisting of alphanumeric characters. Defaults to `""`.
526
+ """
527
+ return pulumi.get(self, "description")
528
+
529
+ @_builtins.property
530
+ @pulumi.getter
531
+ def issuer(self) -> pulumi.Output[_builtins.str]:
532
+ """
533
+ The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.
534
+ """
535
+ return pulumi.get(self, "issuer")
536
+
537
+ @_builtins.property
538
+ @pulumi.getter
539
+ def scopes(self) -> pulumi.Output[Sequence[_builtins.str]]:
540
+ """
541
+ Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.
542
+ """
543
+ return pulumi.get(self, "scopes")
544
+
545
+ @_builtins.property
546
+ @pulumi.getter
547
+ def subject(self) -> pulumi.Output[_builtins.str]:
548
+ """
549
+ The pattern used when matching against the `sub` claim from an OIDC identity token. Patterns can include `*` characters to match against any character.
550
+ """
551
+ return pulumi.get(self, "subject")
552
+
553
+ @_builtins.property
554
+ @pulumi.getter
555
+ def tags(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]:
556
+ """
557
+ A list of tags that access tokens generated for the federated identity will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
558
+ """
559
+ return pulumi.get(self, "tags")
560
+
561
+ @_builtins.property
562
+ @pulumi.getter(name="updatedAt")
563
+ def updated_at(self) -> pulumi.Output[_builtins.str]:
564
+ """
565
+ The updated timestamp of the key in RFC3339 format
566
+ """
567
+ return pulumi.get(self, "updated_at")
568
+
569
+ @_builtins.property
570
+ @pulumi.getter(name="userId")
571
+ def user_id(self) -> pulumi.Output[_builtins.str]:
572
+ """
573
+ ID of the user who created this federated identity, empty for federated identities created by other trust credentials.
574
+ """
575
+ return pulumi.get(self, "user_id")
576
+
@@ -75,7 +75,9 @@ class AwaitableGetAclResult(GetAclResult):
75
75
 
76
76
  def get_acl(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetAclResult:
77
77
  """
78
- The acl data source gets the Tailscale ACL for a tailnet
78
+ The acl data source gets the Tailscale policy file for a tailnet
79
+
80
+ > **Note:** The naming of this data source predates Tailscale's usage of the term "policy file" to refer to the centralized configuration file for a tailnet. This data source fetches a tailnet's entire policy file and not just the ACLs section within it.
79
81
  """
80
82
  __args__ = dict()
81
83
  opts = pulumi.InvokeOptions.merge(_utilities.get_invoke_opts_defaults(), opts)
@@ -87,7 +89,9 @@ def get_acl(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetAclResul
87
89
  json=pulumi.get(__ret__, 'json'))
88
90
  def get_acl_output(opts: Optional[Union[pulumi.InvokeOptions, pulumi.InvokeOutputOptions]] = None) -> pulumi.Output[GetAclResult]:
89
91
  """
90
- The acl data source gets the Tailscale ACL for a tailnet
92
+ The acl data source gets the Tailscale policy file for a tailnet
93
+
94
+ > **Note:** The naming of this data source predates Tailscale's usage of the term "policy file" to refer to the centralized configuration file for a tailnet. This data source fetches a tailnet's entire policy file and not just the ACLs section within it.
91
95
  """
92
96
  __args__ = dict()
93
97
  opts = pulumi.InvokeOutputOptions.merge(_utilities.get_invoke_opts_defaults(), opts)
@@ -24,8 +24,8 @@ class OauthClientArgs:
24
24
  tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None):
25
25
  """
26
26
  The set of arguments for constructing a OauthClient resource.
27
- :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
28
- :param pulumi.Input[_builtins.str] description: A description of the key consisting of alphanumeric characters. Defaults to `""`.
27
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
28
+ :param pulumi.Input[_builtins.str] description: A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
29
29
  :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the OAuth client will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
30
30
  """
31
31
  pulumi.set(__self__, "scopes", scopes)
@@ -38,7 +38,7 @@ class OauthClientArgs:
38
38
  @pulumi.getter
39
39
  def scopes(self) -> pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]:
40
40
  """
41
- Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
41
+ Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
42
42
  """
43
43
  return pulumi.get(self, "scopes")
44
44
 
@@ -50,7 +50,7 @@ class OauthClientArgs:
50
50
  @pulumi.getter
51
51
  def description(self) -> Optional[pulumi.Input[_builtins.str]]:
52
52
  """
53
- A description of the key consisting of alphanumeric characters. Defaults to `""`.
53
+ A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
54
54
  """
55
55
  return pulumi.get(self, "description")
56
56
 
@@ -79,15 +79,17 @@ class _OauthClientState:
79
79
  key: Optional[pulumi.Input[_builtins.str]] = None,
80
80
  scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
81
81
  tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
82
+ updated_at: Optional[pulumi.Input[_builtins.str]] = None,
82
83
  user_id: Optional[pulumi.Input[_builtins.str]] = None):
83
84
  """
84
85
  Input properties used for looking up and filtering OauthClient resources.
85
86
  :param pulumi.Input[_builtins.str] created_at: The creation timestamp of the key in RFC3339 format
86
- :param pulumi.Input[_builtins.str] description: A description of the key consisting of alphanumeric characters. Defaults to `""`.
87
+ :param pulumi.Input[_builtins.str] description: A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
87
88
  :param pulumi.Input[_builtins.str] key: The client secret, also known as the key. Used with the client ID to generate access tokens.
88
- :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
89
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
89
90
  :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the OAuth client will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
90
- :param pulumi.Input[_builtins.str] user_id: ID of the user who created this key, empty for OAuth clients created by other OAuth clients.
91
+ :param pulumi.Input[_builtins.str] updated_at: The updated timestamp of the key in RFC3339 format
92
+ :param pulumi.Input[_builtins.str] user_id: ID of the user who created this key, empty for OAuth clients created by other trust credentials.
91
93
  """
92
94
  if created_at is not None:
93
95
  pulumi.set(__self__, "created_at", created_at)
@@ -99,6 +101,8 @@ class _OauthClientState:
99
101
  pulumi.set(__self__, "scopes", scopes)
100
102
  if tags is not None:
101
103
  pulumi.set(__self__, "tags", tags)
104
+ if updated_at is not None:
105
+ pulumi.set(__self__, "updated_at", updated_at)
102
106
  if user_id is not None:
103
107
  pulumi.set(__self__, "user_id", user_id)
104
108
 
@@ -118,7 +122,7 @@ class _OauthClientState:
118
122
  @pulumi.getter
119
123
  def description(self) -> Optional[pulumi.Input[_builtins.str]]:
120
124
  """
121
- A description of the key consisting of alphanumeric characters. Defaults to `""`.
125
+ A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
122
126
  """
123
127
  return pulumi.get(self, "description")
124
128
 
@@ -142,7 +146,7 @@ class _OauthClientState:
142
146
  @pulumi.getter
143
147
  def scopes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
144
148
  """
145
- Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
149
+ Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
146
150
  """
147
151
  return pulumi.get(self, "scopes")
148
152
 
@@ -162,11 +166,23 @@ class _OauthClientState:
162
166
  def tags(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
163
167
  pulumi.set(self, "tags", value)
164
168
 
169
+ @_builtins.property
170
+ @pulumi.getter(name="updatedAt")
171
+ def updated_at(self) -> Optional[pulumi.Input[_builtins.str]]:
172
+ """
173
+ The updated timestamp of the key in RFC3339 format
174
+ """
175
+ return pulumi.get(self, "updated_at")
176
+
177
+ @updated_at.setter
178
+ def updated_at(self, value: Optional[pulumi.Input[_builtins.str]]):
179
+ pulumi.set(self, "updated_at", value)
180
+
165
181
  @_builtins.property
166
182
  @pulumi.getter(name="userId")
167
183
  def user_id(self) -> Optional[pulumi.Input[_builtins.str]]:
168
184
  """
169
- ID of the user who created this key, empty for OAuth clients created by other OAuth clients.
185
+ ID of the user who created this key, empty for OAuth clients created by other trust credentials.
170
186
  """
171
187
  return pulumi.get(self, "user_id")
172
188
 
@@ -212,8 +228,8 @@ class OauthClient(pulumi.CustomResource):
212
228
 
213
229
  :param str resource_name: The name of the resource.
214
230
  :param pulumi.ResourceOptions opts: Options for the resource.
215
- :param pulumi.Input[_builtins.str] description: A description of the key consisting of alphanumeric characters. Defaults to `""`.
216
- :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
231
+ :param pulumi.Input[_builtins.str] description: A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
232
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
217
233
  :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the OAuth client will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
218
234
  """
219
235
  ...
@@ -281,6 +297,7 @@ class OauthClient(pulumi.CustomResource):
281
297
  __props__.__dict__["tags"] = tags
282
298
  __props__.__dict__["created_at"] = None
283
299
  __props__.__dict__["key"] = None
300
+ __props__.__dict__["updated_at"] = None
284
301
  __props__.__dict__["user_id"] = None
285
302
  secret_opts = pulumi.ResourceOptions(additional_secret_outputs=["key"])
286
303
  opts = pulumi.ResourceOptions.merge(opts, secret_opts)
@@ -299,6 +316,7 @@ class OauthClient(pulumi.CustomResource):
299
316
  key: Optional[pulumi.Input[_builtins.str]] = None,
300
317
  scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
301
318
  tags: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
319
+ updated_at: Optional[pulumi.Input[_builtins.str]] = None,
302
320
  user_id: Optional[pulumi.Input[_builtins.str]] = None) -> 'OauthClient':
303
321
  """
304
322
  Get an existing OauthClient resource's state with the given name, id, and optional extra
@@ -308,11 +326,12 @@ class OauthClient(pulumi.CustomResource):
308
326
  :param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
309
327
  :param pulumi.ResourceOptions opts: Options for the resource.
310
328
  :param pulumi.Input[_builtins.str] created_at: The creation timestamp of the key in RFC3339 format
311
- :param pulumi.Input[_builtins.str] description: A description of the key consisting of alphanumeric characters. Defaults to `""`.
329
+ :param pulumi.Input[_builtins.str] description: A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
312
330
  :param pulumi.Input[_builtins.str] key: The client secret, also known as the key. Used with the client ID to generate access tokens.
313
- :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
331
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
314
332
  :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] tags: A list of tags that access tokens generated for the OAuth client will be able to assign to devices. Mandatory if the scopes include "devices:core" or "auth_keys".
315
- :param pulumi.Input[_builtins.str] user_id: ID of the user who created this key, empty for OAuth clients created by other OAuth clients.
333
+ :param pulumi.Input[_builtins.str] updated_at: The updated timestamp of the key in RFC3339 format
334
+ :param pulumi.Input[_builtins.str] user_id: ID of the user who created this key, empty for OAuth clients created by other trust credentials.
316
335
  """
317
336
  opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
318
337
 
@@ -323,6 +342,7 @@ class OauthClient(pulumi.CustomResource):
323
342
  __props__.__dict__["key"] = key
324
343
  __props__.__dict__["scopes"] = scopes
325
344
  __props__.__dict__["tags"] = tags
345
+ __props__.__dict__["updated_at"] = updated_at
326
346
  __props__.__dict__["user_id"] = user_id
327
347
  return OauthClient(resource_name, opts=opts, __props__=__props__)
328
348
 
@@ -338,7 +358,7 @@ class OauthClient(pulumi.CustomResource):
338
358
  @pulumi.getter
339
359
  def description(self) -> pulumi.Output[Optional[_builtins.str]]:
340
360
  """
341
- A description of the key consisting of alphanumeric characters. Defaults to `""`.
361
+ A description of the OAuth client consisting of alphanumeric characters. Defaults to `""`.
342
362
  """
343
363
  return pulumi.get(self, "description")
344
364
 
@@ -354,7 +374,7 @@ class OauthClient(pulumi.CustomResource):
354
374
  @pulumi.getter
355
375
  def scopes(self) -> pulumi.Output[Sequence[_builtins.str]]:
356
376
  """
357
- Scopes to grant to the client. See https://tailscale.com/kb/1215/ for a list of available scopes.
377
+ Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.
358
378
  """
359
379
  return pulumi.get(self, "scopes")
360
380
 
@@ -366,11 +386,19 @@ class OauthClient(pulumi.CustomResource):
366
386
  """
367
387
  return pulumi.get(self, "tags")
368
388
 
389
+ @_builtins.property
390
+ @pulumi.getter(name="updatedAt")
391
+ def updated_at(self) -> pulumi.Output[_builtins.str]:
392
+ """
393
+ The updated timestamp of the key in RFC3339 format
394
+ """
395
+ return pulumi.get(self, "updated_at")
396
+
369
397
  @_builtins.property
370
398
  @pulumi.getter(name="userId")
371
399
  def user_id(self) -> pulumi.Output[_builtins.str]:
372
400
  """
373
- ID of the user who created this key, empty for OAuth clients created by other OAuth clients.
401
+ ID of the user who created this key, empty for OAuth clients created by other trust credentials.
374
402
  """
375
403
  return pulumi.get(self, "user_id")
376
404
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "resource": true,
3
3
  "name": "tailscale",
4
- "version": "1.0.0-alpha.1767140025"
4
+ "version": "1.0.0-alpha.1767670937"
5
5
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulumi_tailscale
3
- Version: 1.0.0a1767140025
3
+ Version: 1.0.0a1767670937
4
4
  Summary: A Pulumi package for creating and managing Tailscale cloud resources.
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://pulumi.io
@@ -15,6 +15,7 @@ pulumi_tailscale/dns_nameservers.py
15
15
  pulumi_tailscale/dns_preferences.py
16
16
  pulumi_tailscale/dns_search_paths.py
17
17
  pulumi_tailscale/dns_split_nameservers.py
18
+ pulumi_tailscale/federated_identity.py
18
19
  pulumi_tailscale/get4_via6.py
19
20
  pulumi_tailscale/get_acl.py
20
21
  pulumi_tailscale/get_device.py
@@ -5,7 +5,7 @@
5
5
  keywords = ["pulumi", "tailscale"]
6
6
  readme = "README.md"
7
7
  requires-python = ">=3.9"
8
- version = "1.0.0a1767140025"
8
+ version = "1.0.0a1767670937"
9
9
  [project.license]
10
10
  text = "Apache-2.0"
11
11
  [project.urls]