{"name":"tailscale","displayName":"Tailscale","version":"0.27.0","description":"A Pulumi package for creating and managing Tailscale cloud resources.","keywords":["pulumi","tailscale"],"homepage":"https://pulumi.io","license":"Apache-2.0","attribution":"This Pulumi package is based on the [`tailscale` Terraform Provider](https://github.com/tailscale/terraform-provider-tailscale).","repository":"https://github.com/pulumi/pulumi-tailscale","meta":{"moduleFormat":"(.*)(?:/[^/]*)"},"language":{"csharp":{"packageReferences":{"Pulumi":"3.*"},"compatibility":"tfbridge20","respectSchemaVersion":true},"go":{"importBasePath":"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale","generateResourceContainerTypes":true,"generateExtraInputTypes":true,"respectSchemaVersion":true},"nodejs":{"packageDescription":"A Pulumi package for creating and managing Tailscale cloud resources.","readme":"\u003e This provider is a derived work of the [Terraform Provider](https://github.com/tailscale/terraform-provider-tailscale)\n\u003e distributed under [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/). If you encounter a bug or missing feature,\n\u003e first check the [`pulumi-tailscale` repo](https://github.com/pulumi/pulumi-tailscale/issues); however, if that doesn't turn up anything,\n\u003e please consult the source [`terraform-provider-tailscale` repo](https://github.com/tailscale/terraform-provider-tailscale/issues).","devDependencies":{"@types/mime":"^2.0.0","@types/node":"^10.0.0"},"compatibility":"tfbridge20","disableUnionOutputTypes":true,"respectSchemaVersion":true},"python":{"readme":"\u003e This provider is a derived work of the [Terraform Provider](https://github.com/tailscale/terraform-provider-tailscale)\n\u003e distributed under [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/). If you encounter a bug or missing feature,\n\u003e first check the [`pulumi-tailscale` repo](https://github.com/pulumi/pulumi-tailscale/issues); however, if that doesn't turn up anything,\n\u003e please consult the source [`terraform-provider-tailscale` repo](https://github.com/tailscale/terraform-provider-tailscale/issues).","compatibility":"tfbridge20","respectSchemaVersion":true,"pyproject":{"enabled":true}}},"config":{"variables":{"apiKey":{"type":"string","description":"The API key to use for authenticating requests to the API. Can be set via the TAILSCALE_API_KEY environment variable. Conflicts with 'oauth_client_id' and 'oauth_client_secret'.","secret":true},"baseUrl":{"type":"string","description":"The base URL of the Tailscale API. Defaults to https://api.tailscale.com. Can be set via the TAILSCALE_BASE_URL environment variable."},"identityToken":{"type":"string","description":"The jwt identity token to exchange for a Tailscale API token when using a federated identity. Can be set via the TAILSCALE_IDENTITY_TOKEN environment variable. Conflicts with 'api_key' and 'oauth_client_secret'.","secret":true},"oauthClientId":{"type":"string","description":"The OAuth application or federated identity's ID when using OAuth client credentials or workload identity federation. Can be set via the TAILSCALE_OAUTH_CLIENT_ID environment variable. Either 'oauth_client_secret' or 'identity_token' must be set alongside 'oauth_client_id'. Conflicts with 'api_key'."},"oauthClientSecret":{"type":"string","description":"The OAuth application's secret when using OAuth client credentials. Can be set via the TAILSCALE_OAUTH_CLIENT_SECRET environment variable. Conflicts with 'api_key' and 'identity_token'.","secret":true},"scopes":{"type":"array","items":{"type":"string"},"description":"The OAuth 2.0 scopes to request when generating the access token using the supplied OAuth client credentials. See https://tailscale.com/kb/1623/trust-credentials#scopes for available scopes. Only valid when both 'oauth_client_id' and 'oauth_client_secret', or both are set."},"tailnet":{"type":"string","description":"The tailnet ID. Tailnets created before Oct 2025 can still use the legacy ID, but the Tailnet ID is the preferred identifier. Can be set via the TAILSCALE_TAILNET environment variable. Default is the tailnet that owns API credentials passed to the provider."},"userAgent":{"type":"string","description":"User-Agent header for API requests."}}},"types":{"tailscale:index/ContactsAccount:ContactsAccount":{"properties":{"email":{"type":"string","description":"Email address to send communications to\n"}},"type":"object","required":["email"]},"tailscale:index/ContactsSecurity:ContactsSecurity":{"properties":{"email":{"type":"string","description":"Email address to send communications to\n"}},"type":"object","required":["email"]},"tailscale:index/ContactsSupport:ContactsSupport":{"properties":{"email":{"type":"string","description":"Email address to send communications to\n"}},"type":"object","required":["email"]},"tailscale:index/DnsConfigurationNameserver:DnsConfigurationNameserver":{"properties":{"address":{"type":"string","description":"The nameserver's IPv4 or IPv6 address\n"},"useWithExitNode":{"type":"boolean","description":"This nameserver will continue to be used when an exit node is selected (requires Tailscale v1.88.1 or later). Defaults to false.\n"}},"type":"object","required":["address"]},"tailscale:index/DnsConfigurationSplitDn:DnsConfigurationSplitDn":{"properties":{"domain":{"type":"string","description":"The nameservers will be used only for this domain.\n"},"nameservers":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationSplitDnNameserver:DnsConfigurationSplitDnNameserver"},"description":"Set the nameservers used by devices on your network to resolve DNS queries.\n"}},"type":"object","required":["domain","nameservers"]},"tailscale:index/DnsConfigurationSplitDnNameserver:DnsConfigurationSplitDnNameserver":{"properties":{"address":{"type":"string","description":"The nameserver's IPv4 or IPv6 address.\n"},"useWithExitNode":{"type":"boolean","description":"This nameserver will continue to be used when an exit node is selected (requires Tailscale v1.88.1 or later). Defaults to false.\n"}},"type":"object","required":["address"]},"tailscale:index/getDevicesDevice:getDevicesDevice":{"properties":{"addresses":{"type":"array","items":{"type":"string"},"description":"The list of device's IPs\n"},"authorized":{"type":"boolean","description":"Whether the device is authorized to access the tailnet\n"},"blocksIncomingConnections":{"type":"boolean","description":"Whether the device blocks incoming connections\n"},"clientVersion":{"type":"string","description":"The Tailscale client version running on the device\n"},"created":{"type":"string","description":"The creation time of the device\n"},"expires":{"type":"string","description":"The expiry time of the device's key\n"},"hostname":{"type":"string","description":"The short hostname of the device\n"},"id":{"type":"string","description":"The legacy identifier of the device. Use\u003cspan pulumi-lang-nodejs=\" nodeId \" pulumi-lang-dotnet=\" NodeId \" pulumi-lang-go=\" nodeId \" pulumi-lang-python=\" node_id \" pulumi-lang-yaml=\" nodeId \" pulumi-lang-java=\" nodeId \"\u003e node_id \u003c/span\u003einstead for new resources.\n"},"isExternal":{"type":"boolean","description":"Whether the device is marked as external\n"},"keyExpiryDisabled":{"type":"boolean","description":"Whether the device's key expiry is disabled\n"},"lastSeen":{"type":"string","description":"The last seen time of the device\n"},"machineKey":{"type":"string","description":"The machine key of the device\n"},"name":{"type":"string","description":"The full name of the device (e.g. `hostname.domain.ts.net`)\n"},"nodeId":{"type":"string","description":"The preferred indentifier for a device.\n"},"nodeKey":{"type":"string","description":"The node key of the device\n"},"os":{"type":"string","description":"The operating system of the device\n"},"tags":{"type":"array","items":{"type":"string"},"description":"The tags applied to the device\n"},"tailnetLockError":{"type":"string","description":"The tailnet lock error for the device, if any\n"},"tailnetLockKey":{"type":"string","description":"The tailnet lock key for the device, if any\n"},"updateAvailable":{"type":"boolean","description":"Whether an update is available for the device\n"},"user":{"type":"string","description":"The user associated with the device\n"}},"type":"object","required":["addresses","authorized","blocksIncomingConnections","clientVersion","created","expires","hostname","id","isExternal","keyExpiryDisabled","lastSeen","machineKey","name","nodeId","nodeKey","os","tags","tailnetLockError","tailnetLockKey","updateAvailable","user"],"language":{"nodejs":{"requiredInputs":[]}}},"tailscale:index/getDevicesFilter:getDevicesFilter":{"properties":{"name":{"type":"string","description":"The name must be a top-level device property, e.g. isEphemeral, tags, hostname, etc.\n"},"values":{"type":"array","items":{"type":"string"},"description":"The list of values to filter for. Values are matched as exact matches.\n"}},"type":"object","required":["name","values"]},"tailscale:index/getUsersUser:getUsersUser":{"properties":{"created":{"type":"string","description":"The time the user joined their tailnet.\n"},"currentlyConnected":{"type":"boolean","description":"true when the user has a node currently connected to the control server.\n"},"deviceCount":{"type":"integer","description":"Number of devices the user owns.\n"},"displayName":{"type":"string","description":"The name of the user.\n"},"id":{"type":"string","description":"The unique identifier for the user.\n"},"lastSeen":{"type":"string","description":"The later of either: a) The last time any of the user's nodes were connected to the network or b) The last time the user authenticated to any tailscale service, including the admin panel.\n"},"loginName":{"type":"string","description":"The emailish login name of the user.\n"},"profilePicUrl":{"type":"string","description":"The profile pic URL for the user.\n"},"role":{"type":"string","description":"The role of the user.\n"},"status":{"type":"string","description":"The status of the user.\n"},"tailnetId":{"type":"string","description":"The tailnet that owns the user.\n"},"type":{"type":"string","description":"The type of relation this user has to the tailnet associated with the request.\n"}},"type":"object","required":["created","currentlyConnected","deviceCount","displayName","id","lastSeen","loginName","profilePicUrl","role","status","tailnetId","type"],"language":{"nodejs":{"requiredInputs":[]}}}},"provider":{"description":"The provider type for the tailscale package. By default, resources use package-wide configuration\nsettings, however an explicit `Provider` instance may be created and passed during resource\nconstruction to achieve fine-grained programmatic control over provider settings. See the\n[documentation](https://www.pulumi.com/docs/reference/programming-model/#providers) for more information.\n","properties":{"apiKey":{"type":"string","description":"The API key to use for authenticating requests to the API. Can be set via the TAILSCALE_API_KEY environment variable. Conflicts with 'oauth_client_id' and 'oauth_client_secret'.","secret":true},"baseUrl":{"type":"string","description":"The base URL of the Tailscale API. Defaults to https://api.tailscale.com. Can be set via the TAILSCALE_BASE_URL environment variable."},"identityToken":{"type":"string","description":"The jwt identity token to exchange for a Tailscale API token when using a federated identity. Can be set via the TAILSCALE_IDENTITY_TOKEN environment variable. Conflicts with 'api_key' and 'oauth_client_secret'.","secret":true},"oauthClientId":{"type":"string","description":"The OAuth application or federated identity's ID when using OAuth client credentials or workload identity federation. Can be set via the TAILSCALE_OAUTH_CLIENT_ID environment variable. Either 'oauth_client_secret' or 'identity_token' must be set alongside 'oauth_client_id'. Conflicts with 'api_key'."},"oauthClientSecret":{"type":"string","description":"The OAuth application's secret when using OAuth client credentials. Can be set via the TAILSCALE_OAUTH_CLIENT_SECRET environment variable. Conflicts with 'api_key' and 'identity_token'.","secret":true},"scopes":{"type":"array","items":{"type":"string"},"description":"The OAuth 2.0 scopes to request when generating the access token using the supplied OAuth client credentials. See https://tailscale.com/kb/1623/trust-credentials#scopes for available scopes. Only valid when both 'oauth_client_id' and 'oauth_client_secret', or both are set."},"tailnet":{"type":"string","description":"The tailnet ID. Tailnets created before Oct 2025 can still use the legacy ID, but the Tailnet ID is the preferred identifier. Can be set via the TAILSCALE_TAILNET environment variable. Default is the tailnet that owns API credentials passed to the provider."},"userAgent":{"type":"string","description":"User-Agent header for API requests."}},"inputProperties":{"apiKey":{"type":"string","description":"The API key to use for authenticating requests to the API. Can be set via the TAILSCALE_API_KEY environment variable. Conflicts with 'oauth_client_id' and 'oauth_client_secret'.","secret":true},"baseUrl":{"type":"string","description":"The base URL of the Tailscale API. Defaults to https://api.tailscale.com. Can be set via the TAILSCALE_BASE_URL environment variable."},"identityToken":{"type":"string","description":"The jwt identity token to exchange for a Tailscale API token when using a federated identity. Can be set via the TAILSCALE_IDENTITY_TOKEN environment variable. Conflicts with 'api_key' and 'oauth_client_secret'.","secret":true},"oauthClientId":{"type":"string","description":"The OAuth application or federated identity's ID when using OAuth client credentials or workload identity federation. Can be set via the TAILSCALE_OAUTH_CLIENT_ID environment variable. Either 'oauth_client_secret' or 'identity_token' must be set alongside 'oauth_client_id'. Conflicts with 'api_key'."},"oauthClientSecret":{"type":"string","description":"The OAuth application's secret when using OAuth client credentials. Can be set via the TAILSCALE_OAUTH_CLIENT_SECRET environment variable. Conflicts with 'api_key' and 'identity_token'.","secret":true},"scopes":{"type":"array","items":{"type":"string"},"description":"The OAuth 2.0 scopes to request when generating the access token using the supplied OAuth client credentials. See https://tailscale.com/kb/1623/trust-credentials#scopes for available scopes. Only valid when both 'oauth_client_id' and 'oauth_client_secret', or both are set."},"tailnet":{"type":"string","description":"The tailnet ID. Tailnets created before Oct 2025 can still use the legacy ID, but the Tailnet ID is the preferred identifier. Can be set via the TAILSCALE_TAILNET environment variable. Default is the tailnet that owns API credentials passed to the provider."},"userAgent":{"type":"string","description":"User-Agent header for API requests."}},"methods":{"terraformConfig":"pulumi:providers:tailscale/terraformConfig"}},"resources":{"tailscale:index/acl:Acl":{"description":"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.\n\nIf tests are defined in the policy file (the top-level \"tests\" section), policy file validation will occur before creation and update operations are applied.\n\n\u003e **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.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst asJson = new tailscale.Acl(\"as_json\", {acl: JSON.stringify({\n    grants: [{\n        src: [\"*\"],\n        dst: [\"*\"],\n        ip: [\"*\"],\n    }],\n})});\nconst asHujson = new tailscale.Acl(\"as_hujson\", {acl: `  {\n    // Comments in HuJSON policy are preserved when the policy is applied.\n    \\\\\"grants\\\\\": [\n      {\n        // Allow all users access to all ports.\n        \\\\\"src\\\\\": [\\\\\"*\\\\\"],\n        \\\\\"dst\\\\\": [\\\\\"*\\\\\"],\n        \\\\\"ip\\\\\": [\\\\\"*\\\\\"],\n      },\n    ],\n  }\n`});\n```\n```python\nimport pulumi\nimport json\nimport pulumi_tailscale as tailscale\n\nas_json = tailscale.Acl(\"as_json\", acl=json.dumps({\n    \"grants\": [{\n        \"src\": [\"*\"],\n        \"dst\": [\"*\"],\n        \"ip\": [\"*\"],\n    }],\n}))\nas_hujson = tailscale.Acl(\"as_hujson\", acl=\"\"\"  {\n    // Comments in HuJSON policy are preserved when the policy is applied.\n    \\\"grants\\\": [\n      {\n        // Allow all users access to all ports.\n        \\\"src\\\": [\\\"*\\\"],\n        \\\"dst\\\": [\\\"*\\\"],\n        \\\"ip\\\": [\\\"*\\\"],\n      },\n    ],\n  }\n\"\"\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.Json;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var asJson = new Tailscale.Acl(\"as_json\", new()\n    {\n        AclJson = JsonSerializer.Serialize(new Dictionary\u003cstring, object?\u003e\n        {\n            [\"grants\"] = new[]\n            {\n                new Dictionary\u003cstring, object?\u003e\n                {\n                    [\"src\"] = new[]\n                    {\n                        \"*\",\n                    },\n                    [\"dst\"] = new[]\n                    {\n                        \"*\",\n                    },\n                    [\"ip\"] = new[]\n                    {\n                        \"*\",\n                    },\n                },\n            },\n        }),\n    });\n\n    var asHujson = new Tailscale.Acl(\"as_hujson\", new()\n    {\n        AclJson = @\"  {\n    // Comments in HuJSON policy are preserved when the policy is applied.\n    \\\"\"grants\\\"\": [\n      {\n        // Allow all users access to all ports.\n        \\\"\"src\\\"\": [\\\"\"*\\\"\"],\n        \\\"\"dst\\\"\": [\\\"\"*\\\"\"],\n        \\\"\"ip\\\"\": [\\\"\"*\\\"\"],\n      },\n    ],\n  }\n\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\ttmpJSON0, err := json.Marshal(map[string]interface{}{\n\t\t\t\"grants\": []map[string]interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"src\": []string{\n\t\t\t\t\t\t\"*\",\n\t\t\t\t\t},\n\t\t\t\t\t\"dst\": []string{\n\t\t\t\t\t\t\"*\",\n\t\t\t\t\t},\n\t\t\t\t\t\"ip\": []string{\n\t\t\t\t\t\t\"*\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tjson0 := string(tmpJSON0)\n\t\t_, err = tailscale.NewAcl(ctx, \"as_json\", \u0026tailscale.AclArgs{\n\t\t\tAcl: pulumi.String(json0),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewAcl(ctx, \"as_hujson\", \u0026tailscale.AclArgs{\n\t\t\tAcl: pulumi.String(`  {\n    // Comments in HuJSON policy are preserved when the policy is applied.\n    \\\"grants\\\": [\n      {\n        // Allow all users access to all ports.\n        \\\"src\\\": [\\\"*\\\"],\n        \\\"dst\\\": [\\\"*\\\"],\n        \\\"ip\\\": [\\\"*\\\"],\n      },\n    ],\n  }\n`),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.Acl;\nimport com.pulumi.tailscale.AclArgs;\nimport static com.pulumi.codegen.internal.Serialization.*;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var asJson = new Acl(\"asJson\", AclArgs.builder()\n            .acl(serializeJson(\n                jsonObject(\n                    jsonProperty(\"grants\", jsonArray(jsonObject(\n                        jsonProperty(\"src\", jsonArray(\"*\")),\n                        jsonProperty(\"dst\", jsonArray(\"*\")),\n                        jsonProperty(\"ip\", jsonArray(\"*\"))\n                    )))\n                )))\n            .build());\n\n        var asHujson = new Acl(\"asHujson\", AclArgs.builder()\n            .acl(\"\"\"\n  {\n    // Comments in HuJSON policy are preserved when the policy is applied.\n    \\\"grants\\\": [\n      {\n        // Allow all users access to all ports.\n        \\\"src\\\": [\\\"*\\\"],\n        \\\"dst\\\": [\\\"*\\\"],\n        \\\"ip\\\": [\\\"*\\\"],\n      },\n    ],\n  }\n            \"\"\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  asJson:\n    type: tailscale:Acl\n    name: as_json\n    properties:\n      acl:\n        fn::toJSON:\n          grants:\n            - src:\n                - '*'\n              dst:\n                - '*'\n              ip:\n                - '*'\n  asHujson:\n    type: tailscale:Acl\n    name: as_hujson\n    properties:\n      acl: |2\n          {\n            // Comments in HuJSON policy are preserved when the policy is applied.\n            \\\"grants\\\": [\n              {\n                // Allow all users access to all ports.\n                \\\"src\\\": [\\\"*\\\"],\n                \\\"dst\\\": [\\\"*\\\"],\n                \\\"ip\\\": [\\\"*\\\"],\n              },\n            ],\n          }\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/acl:Acl sample_acl acl\n```\n\n","properties":{"acl":{"type":"string","description":"The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.\n","language":{"csharp":{"name":"AclJson"}}},"overwriteExistingContent":{"type":"boolean","description":"If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten\n"},"resetAclOnDestroy":{"type":"boolean","description":"If true, will reset the policy file for the Tailnet to the default when this resource is destroyed\n"}},"required":["acl"],"inputProperties":{"acl":{"type":"string","description":"The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.\n","language":{"csharp":{"name":"AclJson"}}},"overwriteExistingContent":{"type":"boolean","description":"If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten\n"},"resetAclOnDestroy":{"type":"boolean","description":"If true, will reset the policy file for the Tailnet to the default when this resource is destroyed\n"}},"requiredInputs":["acl"],"stateInputs":{"description":"Input properties used for looking up and filtering Acl resources.\n","properties":{"acl":{"type":"string","description":"The policy that defines which devices and users are allowed to connect in your network. Can be either a JSON or a HuJSON string.\n","language":{"csharp":{"name":"AclJson"}}},"overwriteExistingContent":{"type":"boolean","description":"If true, will skip requirement to import acl before allowing changes. Be careful, can cause the policy file to be overwritten\n"},"resetAclOnDestroy":{"type":"boolean","description":"If true, will reset the policy file for the Tailnet to the default when this resource is destroyed\n"}},"type":"object"}},"tailscale:index/awsExternalId:AwsExternalId":{"description":"The\u003cspan pulumi-lang-nodejs=\" awsExternalId \" pulumi-lang-dotnet=\" AwsExternalId \" pulumi-lang-go=\" awsExternalId \" pulumi-lang-python=\" aws_external_id \" pulumi-lang-yaml=\" awsExternalId \" pulumi-lang-java=\" awsExternalId \"\u003e aws_external_id \u003c/span\u003eresource allows you to mint an AWS External ID that Tailscale can use to assume an AWS IAM role that you create for the purposes of allowing Tailscale to stream logs to your S3 bucket. See the\u003cspan pulumi-lang-nodejs=\" logstreamConfiguration \" pulumi-lang-dotnet=\" LogstreamConfiguration \" pulumi-lang-go=\" logstreamConfiguration \" pulumi-lang-python=\" logstream_configuration \" pulumi-lang-yaml=\" logstreamConfiguration \" pulumi-lang-java=\" logstreamConfiguration \"\u003e logstream_configuration \u003c/span\u003eresource for more details.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst prod = new tailscale.AwsExternalId(\"prod\", {});\nconst tailscaleAssumeRole = aws.index.IamPolicyDocument({\n    statement: [{\n        actions: [\"sts:AssumeRole\"],\n        principals: [{\n            type: \"AWS\",\n            identifiers: [prod.tailscaleAwsAccountId],\n        }],\n        condition: [{\n            test: \"StringEquals\",\n            variable: \"sts:ExternalId\",\n            values: [prod.externalId],\n        }],\n    }],\n});\nconst logsWriterIamRole = new aws.index.IamRole(\"logs_writer\", {\n    name: \"logs-writer\",\n    assumeRolePolicy: tailscaleAssumeRole.json,\n});\nconst configurationLogs = new tailscale.LogstreamConfiguration(\"configuration_logs\", {\n    logType: \"configuration\",\n    destinationType: \"s3\",\n    s3Bucket: tailscaleLogs.id,\n    s3Region: \"us-west-2\",\n    s3AuthenticationType: \"rolearn\",\n    s3RoleArn: logsWriterIamRole.arn,\n    s3ExternalId: prod.externalId,\n});\nconst logsWriter = aws.index.IamPolicyDocument({\n    statement: [{\n        effect: \"Allow\",\n        actions: [\"s3:*\"],\n        resources: [\n            \"arn:aws:s3:::example-bucket\",\n            \"arn:aws:s3:::example-bucket/*\",\n        ],\n    }],\n});\nconst logsWriterIamRolePolicy = new aws.index.IamRolePolicy(\"logs_writer\", {\n    role: logsWriterIamRole.id,\n    policy: logsWriter.json,\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\nimport pulumi_tailscale as tailscale\n\nprod = tailscale.AwsExternalId(\"prod\")\ntailscale_assume_role = aws.index.iam_policy_document(statement=[{\n    \"actions\": [\"sts:AssumeRole\"],\n    \"principals\": [{\n        \"type\": \"AWS\",\n        \"identifiers\": [prod.tailscale_aws_account_id],\n    }],\n    \"condition\": [{\n        \"test\": \"StringEquals\",\n        \"variable\": \"sts:ExternalId\",\n        \"values\": [prod.external_id],\n    }],\n}])\nlogs_writer_iam_role = aws.index.IamRole(\"logs_writer\",\n    name=logs-writer,\n    assume_role_policy=tailscale_assume_role.json)\nconfiguration_logs = tailscale.LogstreamConfiguration(\"configuration_logs\",\n    log_type=\"configuration\",\n    destination_type=\"s3\",\n    s3_bucket=tailscale_logs[\"id\"],\n    s3_region=\"us-west-2\",\n    s3_authentication_type=\"rolearn\",\n    s3_role_arn=logs_writer_iam_role[\"arn\"],\n    s3_external_id=prod.external_id)\nlogs_writer = aws.index.iam_policy_document(statement=[{\n    \"effect\": \"Allow\",\n    \"actions\": [\"s3:*\"],\n    \"resources\": [\n        \"arn:aws:s3:::example-bucket\",\n        \"arn:aws:s3:::example-bucket/*\",\n    ],\n}])\nlogs_writer_iam_role_policy = aws.index.IamRolePolicy(\"logs_writer\",\n    role=logs_writer_iam_role.id,\n    policy=logs_writer.json)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var prod = new Tailscale.AwsExternalId(\"prod\");\n\n    var tailscaleAssumeRole = Aws.Index.IamPolicyDocument.Invoke(new()\n    {\n        Statement = new[]\n        {\n            \n            {\n                { \"actions\", new[]\n                {\n                    \"sts:AssumeRole\",\n                } },\n                { \"principals\", new[]\n                {\n                    \n                    {\n                        { \"type\", \"AWS\" },\n                        { \"identifiers\", new[]\n                        {\n                            prod.TailscaleAwsAccountId,\n                        } },\n                    },\n                } },\n                { \"condition\", new[]\n                {\n                    \n                    {\n                        { \"test\", \"StringEquals\" },\n                        { \"variable\", \"sts:ExternalId\" },\n                        { \"values\", new[]\n                        {\n                            prod.ExternalId,\n                        } },\n                    },\n                } },\n            },\n        },\n    });\n\n    var logsWriterIamRole = new Aws.Index.IamRole(\"logs_writer\", new()\n    {\n        Name = \"logs-writer\",\n        AssumeRolePolicy = tailscaleAssumeRole.Json,\n    });\n\n    var configurationLogs = new Tailscale.LogstreamConfiguration(\"configuration_logs\", new()\n    {\n        LogType = \"configuration\",\n        DestinationType = \"s3\",\n        S3Bucket = tailscaleLogs.Id,\n        S3Region = \"us-west-2\",\n        S3AuthenticationType = \"rolearn\",\n        S3RoleArn = logsWriterIamRole.Arn,\n        S3ExternalId = prod.ExternalId,\n    });\n\n    var logsWriter = Aws.Index.IamPolicyDocument.Invoke(new()\n    {\n        Statement = new[]\n        {\n            \n            {\n                { \"effect\", \"Allow\" },\n                { \"actions\", new[]\n                {\n                    \"s3:*\",\n                } },\n                { \"resources\", new[]\n                {\n                    \"arn:aws:s3:::example-bucket\",\n                    \"arn:aws:s3:::example-bucket/*\",\n                } },\n            },\n        },\n    });\n\n    var logsWriterIamRolePolicy = new Aws.Index.IamRolePolicy(\"logs_writer\", new()\n    {\n        Role = logsWriterIamRole.Id,\n        Policy = logsWriter.Json,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/go/aws\"\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tprod, err := tailscale.NewAwsExternalId(ctx, \"prod\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttailscaleAssumeRole, err := aws.IamPolicyDocument(ctx, map[string]interface{}{\n\t\t\t\"statement\": []map[string]interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"actions\": []string{\n\t\t\t\t\t\t\"sts:AssumeRole\",\n\t\t\t\t\t},\n\t\t\t\t\t\"principals\": []map[string]interface{}{\n\t\t\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\t\t\"type\": \"AWS\",\n\t\t\t\t\t\t\t\"identifiers\": pulumi.StringArray{\n\t\t\t\t\t\t\t\tprod.TailscaleAwsAccountId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t\"condition\": []map[string]interface{}{\n\t\t\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\t\t\"test\":     \"StringEquals\",\n\t\t\t\t\t\t\t\"variable\": \"sts:ExternalId\",\n\t\t\t\t\t\t\t\"values\": pulumi.StringArray{\n\t\t\t\t\t\t\t\tprod.ExternalId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlogsWriterIamRole, err := aws.NewIamRole(ctx, \"logs_writer\", \u0026aws.IamRoleArgs{\n\t\t\tName:             \"logs-writer\",\n\t\t\tAssumeRolePolicy: tailscaleAssumeRole.Json,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewLogstreamConfiguration(ctx, \"configuration_logs\", \u0026tailscale.LogstreamConfigurationArgs{\n\t\t\tLogType:              pulumi.String(\"configuration\"),\n\t\t\tDestinationType:      pulumi.String(\"s3\"),\n\t\t\tS3Bucket:             pulumi.Any(tailscaleLogs.Id),\n\t\t\tS3Region:             pulumi.String(\"us-west-2\"),\n\t\t\tS3AuthenticationType: pulumi.String(\"rolearn\"),\n\t\t\tS3RoleArn:            logsWriterIamRole.Arn,\n\t\t\tS3ExternalId:         prod.ExternalId,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlogsWriter, err := aws.IamPolicyDocument(ctx, map[string]interface{}{\n\t\t\t\"statement\": []map[string]interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"effect\": \"Allow\",\n\t\t\t\t\t\"actions\": []string{\n\t\t\t\t\t\t\"s3:*\",\n\t\t\t\t\t},\n\t\t\t\t\t\"resources\": []string{\n\t\t\t\t\t\t\"arn:aws:s3:::example-bucket\",\n\t\t\t\t\t\t\"arn:aws:s3:::example-bucket/*\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = aws.NewIamRolePolicy(ctx, \"logs_writer\", \u0026aws.IamRolePolicyArgs{\n\t\t\tRole:   logsWriterIamRole.Id,\n\t\t\tPolicy: logsWriter.Json,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.AwsExternalId;\nimport com.pulumi.aws.AwsFunctions;\nimport com.pulumi.aws.IamRole;\nimport com.pulumi.aws.IamRoleArgs;\nimport com.pulumi.tailscale.LogstreamConfiguration;\nimport com.pulumi.tailscale.LogstreamConfigurationArgs;\nimport com.pulumi.aws.IamRolePolicy;\nimport com.pulumi.aws.IamRolePolicyArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var prod = new AwsExternalId(\"prod\");\n\n        final var tailscaleAssumeRole = AwsFunctions.IamPolicyDocument(Map.of(\"statement\", List.of(Map.ofEntries(\n            Map.entry(\"actions\", List.of(\"sts:AssumeRole\")),\n            Map.entry(\"principals\", List.of(Map.ofEntries(\n                Map.entry(\"type\", \"AWS\"),\n                Map.entry(\"identifiers\", List.of(prod.tailscaleAwsAccountId()))\n            ))),\n            Map.entry(\"condition\", List.of(Map.ofEntries(\n                Map.entry(\"test\", \"StringEquals\"),\n                Map.entry(\"variable\", \"sts:ExternalId\"),\n                Map.entry(\"values\", List.of(prod.externalId()))\n            )))\n        ))));\n\n        var logsWriterIamRole = new IamRole(\"logsWriterIamRole\", IamRoleArgs.builder()\n            .name(\"logs-writer\")\n            .assumeRolePolicy(tailscaleAssumeRole.json())\n            .build());\n\n        var configurationLogs = new LogstreamConfiguration(\"configurationLogs\", LogstreamConfigurationArgs.builder()\n            .logType(\"configuration\")\n            .destinationType(\"s3\")\n            .s3Bucket(tailscaleLogs.id())\n            .s3Region(\"us-west-2\")\n            .s3AuthenticationType(\"rolearn\")\n            .s3RoleArn(logsWriterIamRole.arn())\n            .s3ExternalId(prod.externalId())\n            .build());\n\n        final var logsWriter = AwsFunctions.IamPolicyDocument(Map.of(\"statement\", Map.ofEntries(\n            Map.entry(\"effect\", \"Allow\"),\n            Map.entry(\"actions\", \"s3:*\"),\n            Map.entry(\"resources\",             \n                \"arn:aws:s3:::example-bucket\",\n                \"arn:aws:s3:::example-bucket/*\")\n        )));\n\n        var logsWriterIamRolePolicy = new IamRolePolicy(\"logsWriterIamRolePolicy\", IamRolePolicyArgs.builder()\n            .role(logsWriterIamRole.id())\n            .policy(logsWriter.json())\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  prod:\n    type: tailscale:AwsExternalId\n  configurationLogs:\n    type: tailscale:LogstreamConfiguration\n    name: configuration_logs\n    properties:\n      logType: configuration\n      destinationType: s3\n      s3Bucket: ${tailscaleLogs.id}\n      s3Region: us-west-2\n      s3AuthenticationType: rolearn\n      s3RoleArn: ${logsWriterIamRole.arn}\n      s3ExternalId: ${prod.externalId}\n  logsWriterIamRole:\n    type: aws:IamRole\n    name: logs_writer\n    properties:\n      name: logs-writer\n      assumeRolePolicy: ${tailscaleAssumeRole.json}\n  logsWriterIamRolePolicy:\n    type: aws:IamRolePolicy\n    name: logs_writer\n    properties:\n      role: ${logsWriterIamRole.id}\n      policy: ${logsWriter.json}\nvariables:\n  tailscaleAssumeRole:\n    fn::invoke:\n      function: aws:IamPolicyDocument\n      arguments:\n        statement:\n          - actions:\n              - sts:AssumeRole\n            principals:\n              - type: AWS\n                identifiers:\n                  - ${prod.tailscaleAwsAccountId}\n            condition:\n              - test: StringEquals\n                variable: sts:ExternalId\n                values:\n                  - ${prod.externalId}\n  logsWriter:\n    fn::invoke:\n      function: aws:IamPolicyDocument\n      arguments:\n        statement:\n          - effect: Allow\n            actions:\n              - s3:*\n            resources:\n              - arn:aws:s3:::example-bucket\n              - arn:aws:s3:::example-bucket/*\n```\n\u003c!--End PulumiCodeChooser --\u003e\n","properties":{"externalId":{"type":"string","description":"The External ID that Tailscale will supply when assuming your role. You must reference this in your IAM role's trust policy. See https://docs.aws.amazon.com/IAM/latest/UserGuide/id*roles*common-scenarios_third-party.html for more information on external IDs.\n"},"tailscaleAwsAccountId":{"type":"string","description":"The AWS account from which Tailscale will assume your role. You must reference this in your IAM role's trust policy. See https://docs.aws.amazon.com/IAM/latest/UserGuide/id*roles*common-scenarios_third-party.html for more information on external IDs.\n"}},"required":["externalId","tailscaleAwsAccountId"],"stateInputs":{"description":"Input properties used for looking up and filtering AwsExternalId resources.\n","properties":{"externalId":{"type":"string","description":"The External ID that Tailscale will supply when assuming your role. You must reference this in your IAM role's trust policy. See https://docs.aws.amazon.com/IAM/latest/UserGuide/id*roles*common-scenarios_third-party.html for more information on external IDs.\n"},"tailscaleAwsAccountId":{"type":"string","description":"The AWS account from which Tailscale will assume your role. You must reference this in your IAM role's trust policy. See https://docs.aws.amazon.com/IAM/latest/UserGuide/id*roles*common-scenarios_third-party.html for more information on external IDs.\n"}},"type":"object"}},"tailscale:index/contacts:Contacts":{"description":"The contacts resource allows you to configure contact details for your Tailscale network. See https://tailscale.com/kb/1224/contact-preferences for more information.\n\nDestroying this resource does not unset or modify values in the tailscale control plane, and simply removes the resource from Terraform state.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleContacts = new tailscale.Contacts(\"sample_contacts\", {\n    account: {\n        email: \"account@example.com\",\n    },\n    support: {\n        email: \"support@example.com\",\n    },\n    security: {\n        email: \"security@example.com\",\n    },\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_contacts = tailscale.Contacts(\"sample_contacts\",\n    account={\n        \"email\": \"account@example.com\",\n    },\n    support={\n        \"email\": \"support@example.com\",\n    },\n    security={\n        \"email\": \"security@example.com\",\n    })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleContacts = new Tailscale.Contacts(\"sample_contacts\", new()\n    {\n        Account = new Tailscale.Inputs.ContactsAccountArgs\n        {\n            Email = \"account@example.com\",\n        },\n        Support = new Tailscale.Inputs.ContactsSupportArgs\n        {\n            Email = \"support@example.com\",\n        },\n        Security = new Tailscale.Inputs.ContactsSecurityArgs\n        {\n            Email = \"security@example.com\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewContacts(ctx, \"sample_contacts\", \u0026tailscale.ContactsArgs{\n\t\t\tAccount: \u0026tailscale.ContactsAccountArgs{\n\t\t\t\tEmail: pulumi.String(\"account@example.com\"),\n\t\t\t},\n\t\t\tSupport: \u0026tailscale.ContactsSupportArgs{\n\t\t\t\tEmail: pulumi.String(\"support@example.com\"),\n\t\t\t},\n\t\t\tSecurity: \u0026tailscale.ContactsSecurityArgs{\n\t\t\t\tEmail: pulumi.String(\"security@example.com\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.Contacts;\nimport com.pulumi.tailscale.ContactsArgs;\nimport com.pulumi.tailscale.inputs.ContactsAccountArgs;\nimport com.pulumi.tailscale.inputs.ContactsSupportArgs;\nimport com.pulumi.tailscale.inputs.ContactsSecurityArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleContacts = new Contacts(\"sampleContacts\", ContactsArgs.builder()\n            .account(ContactsAccountArgs.builder()\n                .email(\"account@example.com\")\n                .build())\n            .support(ContactsSupportArgs.builder()\n                .email(\"support@example.com\")\n                .build())\n            .security(ContactsSecurityArgs.builder()\n                .email(\"security@example.com\")\n                .build())\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleContacts:\n    type: tailscale:Contacts\n    name: sample_contacts\n    properties:\n      account:\n        email: account@example.com\n      support:\n        email: support@example.com\n      security:\n        email: security@example.com\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/contacts:Contacts sample_contacts contacts\n```\n\n","properties":{"account":{"$ref":"#/types/tailscale:index/ContactsAccount:ContactsAccount","description":"Configuration for communications about important changes to your tailnet\n"},"security":{"$ref":"#/types/tailscale:index/ContactsSecurity:ContactsSecurity","description":"Configuration for communications about security issues affecting your tailnet\n"},"support":{"$ref":"#/types/tailscale:index/ContactsSupport:ContactsSupport","description":"Configuration for communications about misconfigurations in your tailnet\n"}},"required":["account","security","support"],"inputProperties":{"account":{"$ref":"#/types/tailscale:index/ContactsAccount:ContactsAccount","description":"Configuration for communications about important changes to your tailnet\n"},"security":{"$ref":"#/types/tailscale:index/ContactsSecurity:ContactsSecurity","description":"Configuration for communications about security issues affecting your tailnet\n"},"support":{"$ref":"#/types/tailscale:index/ContactsSupport:ContactsSupport","description":"Configuration for communications about misconfigurations in your tailnet\n"}},"requiredInputs":["account","security","support"],"stateInputs":{"description":"Input properties used for looking up and filtering Contacts resources.\n","properties":{"account":{"$ref":"#/types/tailscale:index/ContactsAccount:ContactsAccount","description":"Configuration for communications about important changes to your tailnet\n"},"security":{"$ref":"#/types/tailscale:index/ContactsSecurity:ContactsSecurity","description":"Configuration for communications about security issues affecting your tailnet\n"},"support":{"$ref":"#/types/tailscale:index/ContactsSupport:ContactsSupport","description":"Configuration for communications about misconfigurations in your tailnet\n"}},"type":"object"}},"tailscale:index/deviceAuthorization:DeviceAuthorization":{"description":"The\u003cspan pulumi-lang-nodejs=\" deviceAuthorization \" pulumi-lang-dotnet=\" DeviceAuthorization \" pulumi-lang-go=\" deviceAuthorization \" pulumi-lang-python=\" device_authorization \" pulumi-lang-yaml=\" deviceAuthorization \" pulumi-lang-java=\" deviceAuthorization \"\u003e device_authorization \u003c/span\u003eresource is used to approve new devices before they can join the tailnet. See https://tailscale.com/kb/1099/device-authorization/ for more details.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleDevice = tailscale.getDevice({\n    name: \"device.example.com\",\n});\nconst sampleAuthorization = new tailscale.DeviceAuthorization(\"sample_authorization\", {\n    deviceId: sampleDevice.then(sampleDevice =\u003e sampleDevice.nodeId),\n    authorized: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_device = tailscale.get_device(name=\"device.example.com\")\nsample_authorization = tailscale.DeviceAuthorization(\"sample_authorization\",\n    device_id=sample_device.node_id,\n    authorized=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleDevice = Tailscale.GetDevice.Invoke(new()\n    {\n        Name = \"device.example.com\",\n    });\n\n    var sampleAuthorization = new Tailscale.DeviceAuthorization(\"sample_authorization\", new()\n    {\n        DeviceId = sampleDevice.Apply(getDeviceResult =\u003e getDeviceResult.NodeId),\n        Authorized = true,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tsampleDevice, err := tailscale.GetDevice(ctx, \u0026tailscale.GetDeviceArgs{\n\t\t\tName: pulumi.StringRef(\"device.example.com\"),\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewDeviceAuthorization(ctx, \"sample_authorization\", \u0026tailscale.DeviceAuthorizationArgs{\n\t\t\tDeviceId:   pulumi.String(sampleDevice.NodeId),\n\t\t\tAuthorized: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetDeviceArgs;\nimport com.pulumi.tailscale.DeviceAuthorization;\nimport com.pulumi.tailscale.DeviceAuthorizationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var sampleDevice = TailscaleFunctions.getDevice(GetDeviceArgs.builder()\n            .name(\"device.example.com\")\n            .build());\n\n        var sampleAuthorization = new DeviceAuthorization(\"sampleAuthorization\", DeviceAuthorizationArgs.builder()\n            .deviceId(sampleDevice.nodeId())\n            .authorized(true)\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleAuthorization:\n    type: tailscale:DeviceAuthorization\n    name: sample_authorization\n    properties:\n      deviceId: ${sampleDevice.nodeId}\n      authorized: true\nvariables:\n  sampleDevice:\n    fn::invoke:\n      function: tailscale:getDevice\n      arguments:\n        name: device.example.com\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nDevice authorization can be imported using the node ID (preferred), e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceAuthorization:DeviceAuthorization sample_authorization nodeidCNTRL\n```\n\nDevice authorization can be imported using the legacy ID, e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceAuthorization:DeviceAuthorization sample_authorization 123456789\n```\n\n","properties":{"authorized":{"type":"boolean","description":"Whether or not the device is authorized\n"},"deviceId":{"type":"string","description":"The device to set as authorized\n"}},"required":["authorized","deviceId"],"inputProperties":{"authorized":{"type":"boolean","description":"Whether or not the device is authorized\n"},"deviceId":{"type":"string","description":"The device to set as authorized\n"}},"requiredInputs":["authorized","deviceId"],"stateInputs":{"description":"Input properties used for looking up and filtering DeviceAuthorization resources.\n","properties":{"authorized":{"type":"boolean","description":"Whether or not the device is authorized\n"},"deviceId":{"type":"string","description":"The device to set as authorized\n"}},"type":"object"}},"tailscale:index/deviceKey:DeviceKey":{"description":"The\u003cspan pulumi-lang-nodejs=\" deviceKey \" pulumi-lang-dotnet=\" DeviceKey \" pulumi-lang-go=\" deviceKey \" pulumi-lang-python=\" device_key \" pulumi-lang-yaml=\" deviceKey \" pulumi-lang-java=\" deviceKey \"\u003e device_key \u003c/span\u003eresource allows you to update the properties of a device's key\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst exampleDevice = tailscale.getDevice({\n    name: \"device.example.com\",\n});\nconst exampleKey = new tailscale.DeviceKey(\"example_key\", {\n    deviceId: exampleDevice.then(exampleDevice =\u003e exampleDevice.nodeId),\n    keyExpiryDisabled: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nexample_device = tailscale.get_device(name=\"device.example.com\")\nexample_key = tailscale.DeviceKey(\"example_key\",\n    device_id=example_device.node_id,\n    key_expiry_disabled=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleDevice = Tailscale.GetDevice.Invoke(new()\n    {\n        Name = \"device.example.com\",\n    });\n\n    var exampleKey = new Tailscale.DeviceKey(\"example_key\", new()\n    {\n        DeviceId = exampleDevice.Apply(getDeviceResult =\u003e getDeviceResult.NodeId),\n        KeyExpiryDisabled = true,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleDevice, err := tailscale.GetDevice(ctx, \u0026tailscale.GetDeviceArgs{\n\t\t\tName: pulumi.StringRef(\"device.example.com\"),\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewDeviceKey(ctx, \"example_key\", \u0026tailscale.DeviceKeyArgs{\n\t\t\tDeviceId:          pulumi.String(exampleDevice.NodeId),\n\t\t\tKeyExpiryDisabled: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetDeviceArgs;\nimport com.pulumi.tailscale.DeviceKey;\nimport com.pulumi.tailscale.DeviceKeyArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var exampleDevice = TailscaleFunctions.getDevice(GetDeviceArgs.builder()\n            .name(\"device.example.com\")\n            .build());\n\n        var exampleKey = new DeviceKey(\"exampleKey\", DeviceKeyArgs.builder()\n            .deviceId(exampleDevice.nodeId())\n            .keyExpiryDisabled(true)\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleKey:\n    type: tailscale:DeviceKey\n    name: example_key\n    properties:\n      deviceId: ${exampleDevice.nodeId}\n      keyExpiryDisabled: true\nvariables:\n  exampleDevice:\n    fn::invoke:\n      function: tailscale:getDevice\n      arguments:\n        name: device.example.com\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nDevice key can be imported using the node ID (preferred), e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceKey:DeviceKey sample nodeidCNTRL\n```\n\nDevice key can be imported using the legacy ID, e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceKey:DeviceKey sample 123456789\n```\n\n","properties":{"deviceId":{"type":"string","description":"The device to update the key properties of\n"},"keyExpiryDisabled":{"type":"boolean","description":"Determines whether or not the device's key will expire. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n"}},"required":["deviceId"],"inputProperties":{"deviceId":{"type":"string","description":"The device to update the key properties of\n"},"keyExpiryDisabled":{"type":"boolean","description":"Determines whether or not the device's key will expire. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n"}},"requiredInputs":["deviceId"],"stateInputs":{"description":"Input properties used for looking up and filtering DeviceKey resources.\n","properties":{"deviceId":{"type":"string","description":"The device to update the key properties of\n"},"keyExpiryDisabled":{"type":"boolean","description":"Determines whether or not the device's key will expire. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n"}},"type":"object"}},"tailscale:index/deviceSubnetRoutes:DeviceSubnetRoutes":{"description":"The\u003cspan pulumi-lang-nodejs=\" deviceSubnetRoutes \" pulumi-lang-dotnet=\" DeviceSubnetRoutes \" pulumi-lang-go=\" deviceSubnetRoutes \" pulumi-lang-python=\" device_subnet_routes \" pulumi-lang-yaml=\" deviceSubnetRoutes \" pulumi-lang-java=\" deviceSubnetRoutes \"\u003e device_subnet_routes \u003c/span\u003eresource allows you to configure enabled subnet routes for your Tailscale devices. See https://tailscale.com/kb/1019/subnets for more information.\n\nRoutes must be both advertised and enabled for a device to act as a subnet router or exit node. Routes must be advertised directly from the device: advertised routes cannot be managed through Terraform. If a device is advertising routes, they are not exposed to traffic until they are enabled. Conversely, if routes are enabled before they are advertised, they are not available for routing until the device in question is advertising them.\n\nNote: all routes enabled for the device through the admin console or autoApprovers in the ACL must be explicitly added to the routes attribute of this resource to avoid configuration drift.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleDevice = tailscale.getDevice({\n    name: \"device.example.com\",\n});\nconst sampleRoutes = new tailscale.DeviceSubnetRoutes(\"sample_routes\", {\n    deviceId: sampleDevice.then(sampleDevice =\u003e sampleDevice.nodeId),\n    routes: [\n        \"10.0.1.0/24\",\n        \"1.2.0.0/16\",\n        \"2.0.0.0/24\",\n    ],\n});\nconst sampleExitNode = new tailscale.DeviceSubnetRoutes(\"sample_exit_node\", {\n    deviceId: sampleDevice.then(sampleDevice =\u003e sampleDevice.nodeId),\n    routes: [\n        \"0.0.0.0/0\",\n        \"::/0\",\n    ],\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_device = tailscale.get_device(name=\"device.example.com\")\nsample_routes = tailscale.DeviceSubnetRoutes(\"sample_routes\",\n    device_id=sample_device.node_id,\n    routes=[\n        \"10.0.1.0/24\",\n        \"1.2.0.0/16\",\n        \"2.0.0.0/24\",\n    ])\nsample_exit_node = tailscale.DeviceSubnetRoutes(\"sample_exit_node\",\n    device_id=sample_device.node_id,\n    routes=[\n        \"0.0.0.0/0\",\n        \"::/0\",\n    ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleDevice = Tailscale.GetDevice.Invoke(new()\n    {\n        Name = \"device.example.com\",\n    });\n\n    var sampleRoutes = new Tailscale.DeviceSubnetRoutes(\"sample_routes\", new()\n    {\n        DeviceId = sampleDevice.Apply(getDeviceResult =\u003e getDeviceResult.NodeId),\n        Routes = new[]\n        {\n            \"10.0.1.0/24\",\n            \"1.2.0.0/16\",\n            \"2.0.0.0/24\",\n        },\n    });\n\n    var sampleExitNode = new Tailscale.DeviceSubnetRoutes(\"sample_exit_node\", new()\n    {\n        DeviceId = sampleDevice.Apply(getDeviceResult =\u003e getDeviceResult.NodeId),\n        Routes = new[]\n        {\n            \"0.0.0.0/0\",\n            \"::/0\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tsampleDevice, err := tailscale.GetDevice(ctx, \u0026tailscale.GetDeviceArgs{\n\t\t\tName: pulumi.StringRef(\"device.example.com\"),\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewDeviceSubnetRoutes(ctx, \"sample_routes\", \u0026tailscale.DeviceSubnetRoutesArgs{\n\t\t\tDeviceId: pulumi.String(sampleDevice.NodeId),\n\t\t\tRoutes: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"10.0.1.0/24\"),\n\t\t\t\tpulumi.String(\"1.2.0.0/16\"),\n\t\t\t\tpulumi.String(\"2.0.0.0/24\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewDeviceSubnetRoutes(ctx, \"sample_exit_node\", \u0026tailscale.DeviceSubnetRoutesArgs{\n\t\t\tDeviceId: pulumi.String(sampleDevice.NodeId),\n\t\t\tRoutes: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"0.0.0.0/0\"),\n\t\t\t\tpulumi.String(\"::/0\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetDeviceArgs;\nimport com.pulumi.tailscale.DeviceSubnetRoutes;\nimport com.pulumi.tailscale.DeviceSubnetRoutesArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var sampleDevice = TailscaleFunctions.getDevice(GetDeviceArgs.builder()\n            .name(\"device.example.com\")\n            .build());\n\n        var sampleRoutes = new DeviceSubnetRoutes(\"sampleRoutes\", DeviceSubnetRoutesArgs.builder()\n            .deviceId(sampleDevice.nodeId())\n            .routes(            \n                \"10.0.1.0/24\",\n                \"1.2.0.0/16\",\n                \"2.0.0.0/24\")\n            .build());\n\n        var sampleExitNode = new DeviceSubnetRoutes(\"sampleExitNode\", DeviceSubnetRoutesArgs.builder()\n            .deviceId(sampleDevice.nodeId())\n            .routes(            \n                \"0.0.0.0/0\",\n                \"::/0\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleRoutes:\n    type: tailscale:DeviceSubnetRoutes\n    name: sample_routes\n    properties:\n      deviceId: ${sampleDevice.nodeId}\n      routes:\n        - 10.0.1.0/24\n        - 1.2.0.0/16\n        - 2.0.0.0/24\n  sampleExitNode:\n    type: tailscale:DeviceSubnetRoutes\n    name: sample_exit_node\n    properties:\n      deviceId: ${sampleDevice.nodeId}\n      routes:\n        - 0.0.0.0/0\n        - ::/0\nvariables:\n  sampleDevice:\n    fn::invoke:\n      function: tailscale:getDevice\n      arguments:\n        name: device.example.com\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nDevice subnet rules can be imported using the node ID (preferred), e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceSubnetRoutes:DeviceSubnetRoutes sample nodeidCNTRL\n```\n\nDevice subnet rules can be imported using the legacy ID, e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceSubnetRoutes:DeviceSubnetRoutes sample 123456789\n```\n\n","properties":{"deviceId":{"type":"string","description":"The device to set subnet routes for\n"},"routes":{"type":"array","items":{"type":"string"},"description":"The subnet routes that are enabled to be routed by a device\n"}},"required":["deviceId","routes"],"inputProperties":{"deviceId":{"type":"string","description":"The device to set subnet routes for\n","willReplaceOnChanges":true},"routes":{"type":"array","items":{"type":"string"},"description":"The subnet routes that are enabled to be routed by a device\n"}},"requiredInputs":["deviceId","routes"],"stateInputs":{"description":"Input properties used for looking up and filtering DeviceSubnetRoutes resources.\n","properties":{"deviceId":{"type":"string","description":"The device to set subnet routes for\n","willReplaceOnChanges":true},"routes":{"type":"array","items":{"type":"string"},"description":"The subnet routes that are enabled to be routed by a device\n"}},"type":"object"}},"tailscale:index/deviceTags:DeviceTags":{"description":"The\u003cspan pulumi-lang-nodejs=\" deviceTags \" pulumi-lang-dotnet=\" DeviceTags \" pulumi-lang-go=\" deviceTags \" pulumi-lang-python=\" device_tags \" pulumi-lang-yaml=\" deviceTags \" pulumi-lang-java=\" deviceTags \"\u003e device_tags \u003c/span\u003eresource is used to apply tags to Tailscale devices. See https://tailscale.com/kb/1068/acl-tags/ for more details.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleDevice = tailscale.getDevice({\n    name: \"device.example.com\",\n});\nconst sampleTags = new tailscale.DeviceTags(\"sample_tags\", {\n    deviceId: sampleDevice.then(sampleDevice =\u003e sampleDevice.nodeId),\n    tags: [\"room:bedroom\"],\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_device = tailscale.get_device(name=\"device.example.com\")\nsample_tags = tailscale.DeviceTags(\"sample_tags\",\n    device_id=sample_device.node_id,\n    tags=[\"room:bedroom\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleDevice = Tailscale.GetDevice.Invoke(new()\n    {\n        Name = \"device.example.com\",\n    });\n\n    var sampleTags = new Tailscale.DeviceTags(\"sample_tags\", new()\n    {\n        DeviceId = sampleDevice.Apply(getDeviceResult =\u003e getDeviceResult.NodeId),\n        Tags = new[]\n        {\n            \"room:bedroom\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tsampleDevice, err := tailscale.GetDevice(ctx, \u0026tailscale.GetDeviceArgs{\n\t\t\tName: pulumi.StringRef(\"device.example.com\"),\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.NewDeviceTags(ctx, \"sample_tags\", \u0026tailscale.DeviceTagsArgs{\n\t\t\tDeviceId: pulumi.String(sampleDevice.NodeId),\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"room:bedroom\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetDeviceArgs;\nimport com.pulumi.tailscale.DeviceTags;\nimport com.pulumi.tailscale.DeviceTagsArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var sampleDevice = TailscaleFunctions.getDevice(GetDeviceArgs.builder()\n            .name(\"device.example.com\")\n            .build());\n\n        var sampleTags = new DeviceTags(\"sampleTags\", DeviceTagsArgs.builder()\n            .deviceId(sampleDevice.nodeId())\n            .tags(\"room:bedroom\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleTags:\n    type: tailscale:DeviceTags\n    name: sample_tags\n    properties:\n      deviceId: ${sampleDevice.nodeId}\n      tags:\n        - room:bedroom\nvariables:\n  sampleDevice:\n    fn::invoke:\n      function: tailscale:getDevice\n      arguments:\n        name: device.example.com\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nDevice tags can be imported using the node ID (preferred), e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceTags:DeviceTags sample nodeidCNTRL\n```\n\nDevice tags can be imported using the legacy ID, e.g.,\n\n```sh\n$ pulumi import tailscale:index/deviceTags:DeviceTags sample 123456789\n```\n\n","properties":{"deviceId":{"type":"string","description":"The device to set tags for\n"},"tags":{"type":"array","items":{"type":"string"},"description":"The tags to apply to the device\n"}},"required":["deviceId","tags"],"inputProperties":{"deviceId":{"type":"string","description":"The device to set tags for\n"},"tags":{"type":"array","items":{"type":"string"},"description":"The tags to apply to the device\n"}},"requiredInputs":["deviceId","tags"],"stateInputs":{"description":"Input properties used for looking up and filtering DeviceTags resources.\n","properties":{"deviceId":{"type":"string","description":"The device to set tags for\n"},"tags":{"type":"array","items":{"type":"string"},"description":"The tags to apply to the device\n"}},"type":"object"}},"tailscale:index/dnsConfiguration:DnsConfiguration":{"description":"The\u003cspan pulumi-lang-nodejs=\" dnsConfiguration \" pulumi-lang-dotnet=\" DnsConfiguration \" pulumi-lang-go=\" dnsConfiguration \" pulumi-lang-python=\" dns_configuration \" pulumi-lang-yaml=\" dnsConfiguration \" pulumi-lang-java=\" dnsConfiguration \"\u003e dns_configuration \u003c/span\u003eresource allows you to manage the complete DNS configuration for your Tailscale network. See https://tailscale.com/kb/1054/dns for more information.\n\n\u003e **Note:** The Tailscale Terraform provider has multiple resources for managing DNS configuration. This resource is meant to manage the entirety of a Tailnet's DNS configuration and conflicts with tailscale_dns_nameservers, tailscale_dns_preferences, tailscale_dns_search_paths, and tailscale_dns_split_nameservers. This resource and previously mentioned resources should not be used simultaneously.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleConfiguration = new tailscale.DnsConfiguration(\"sample_configuration\", {\n    nameservers: [\n        {\n            address: \"8.8.8.8\",\n        },\n        {\n            address: \"1.1.1.1\",\n            useWithExitNode: true,\n        },\n    ],\n    splitDns: [\n        {\n            domain: \"foo.example.com\",\n            nameservers: [\n                {\n                    address: \"1.1.1.2\",\n                    useWithExitNode: true,\n                },\n                {\n                    address: \"1.1.1.3\",\n                },\n            ],\n        },\n        {\n            domain: \"bar.example.com\",\n            nameservers: [{\n                address: \"8.8.8.2\",\n                useWithExitNode: true,\n            }],\n        },\n    ],\n    searchPaths: [\n        \"example.com\",\n        \"anotherexample.com\",\n    ],\n    overrideLocalDns: true,\n    magicDns: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_configuration = tailscale.DnsConfiguration(\"sample_configuration\",\n    nameservers=[\n        {\n            \"address\": \"8.8.8.8\",\n        },\n        {\n            \"address\": \"1.1.1.1\",\n            \"use_with_exit_node\": True,\n        },\n    ],\n    split_dns=[\n        {\n            \"domain\": \"foo.example.com\",\n            \"nameservers\": [\n                {\n                    \"address\": \"1.1.1.2\",\n                    \"use_with_exit_node\": True,\n                },\n                {\n                    \"address\": \"1.1.1.3\",\n                },\n            ],\n        },\n        {\n            \"domain\": \"bar.example.com\",\n            \"nameservers\": [{\n                \"address\": \"8.8.8.2\",\n                \"use_with_exit_node\": True,\n            }],\n        },\n    ],\n    search_paths=[\n        \"example.com\",\n        \"anotherexample.com\",\n    ],\n    override_local_dns=True,\n    magic_dns=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleConfiguration = new Tailscale.DnsConfiguration(\"sample_configuration\", new()\n    {\n        Nameservers = new[]\n        {\n            new Tailscale.Inputs.DnsConfigurationNameserverArgs\n            {\n                Address = \"8.8.8.8\",\n            },\n            new Tailscale.Inputs.DnsConfigurationNameserverArgs\n            {\n                Address = \"1.1.1.1\",\n                UseWithExitNode = true,\n            },\n        },\n        SplitDns = new[]\n        {\n            new Tailscale.Inputs.DnsConfigurationSplitDnArgs\n            {\n                Domain = \"foo.example.com\",\n                Nameservers = new[]\n                {\n                    new Tailscale.Inputs.DnsConfigurationSplitDnNameserverArgs\n                    {\n                        Address = \"1.1.1.2\",\n                        UseWithExitNode = true,\n                    },\n                    new Tailscale.Inputs.DnsConfigurationSplitDnNameserverArgs\n                    {\n                        Address = \"1.1.1.3\",\n                    },\n                },\n            },\n            new Tailscale.Inputs.DnsConfigurationSplitDnArgs\n            {\n                Domain = \"bar.example.com\",\n                Nameservers = new[]\n                {\n                    new Tailscale.Inputs.DnsConfigurationSplitDnNameserverArgs\n                    {\n                        Address = \"8.8.8.2\",\n                        UseWithExitNode = true,\n                    },\n                },\n            },\n        },\n        SearchPaths = new[]\n        {\n            \"example.com\",\n            \"anotherexample.com\",\n        },\n        OverrideLocalDns = true,\n        MagicDns = true,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewDnsConfiguration(ctx, \"sample_configuration\", \u0026tailscale.DnsConfigurationArgs{\n\t\t\tNameservers: tailscale.DnsConfigurationNameserverArray{\n\t\t\t\t\u0026tailscale.DnsConfigurationNameserverArgs{\n\t\t\t\t\tAddress: pulumi.String(\"8.8.8.8\"),\n\t\t\t\t},\n\t\t\t\t\u0026tailscale.DnsConfigurationNameserverArgs{\n\t\t\t\t\tAddress:         pulumi.String(\"1.1.1.1\"),\n\t\t\t\t\tUseWithExitNode: pulumi.Bool(true),\n\t\t\t\t},\n\t\t\t},\n\t\t\tSplitDns: tailscale.DnsConfigurationSplitDnArray{\n\t\t\t\t\u0026tailscale.DnsConfigurationSplitDnArgs{\n\t\t\t\t\tDomain: pulumi.String(\"foo.example.com\"),\n\t\t\t\t\tNameservers: tailscale.DnsConfigurationSplitDnNameserverArray{\n\t\t\t\t\t\t\u0026tailscale.DnsConfigurationSplitDnNameserverArgs{\n\t\t\t\t\t\t\tAddress:         pulumi.String(\"1.1.1.2\"),\n\t\t\t\t\t\t\tUseWithExitNode: pulumi.Bool(true),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\u0026tailscale.DnsConfigurationSplitDnNameserverArgs{\n\t\t\t\t\t\t\tAddress: pulumi.String(\"1.1.1.3\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\u0026tailscale.DnsConfigurationSplitDnArgs{\n\t\t\t\t\tDomain: pulumi.String(\"bar.example.com\"),\n\t\t\t\t\tNameservers: tailscale.DnsConfigurationSplitDnNameserverArray{\n\t\t\t\t\t\t\u0026tailscale.DnsConfigurationSplitDnNameserverArgs{\n\t\t\t\t\t\t\tAddress:         pulumi.String(\"8.8.8.2\"),\n\t\t\t\t\t\t\tUseWithExitNode: pulumi.Bool(true),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tSearchPaths: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"example.com\"),\n\t\t\t\tpulumi.String(\"anotherexample.com\"),\n\t\t\t},\n\t\t\tOverrideLocalDns: pulumi.Bool(true),\n\t\t\tMagicDns:         pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.DnsConfiguration;\nimport com.pulumi.tailscale.DnsConfigurationArgs;\nimport com.pulumi.tailscale.inputs.DnsConfigurationNameserverArgs;\nimport com.pulumi.tailscale.inputs.DnsConfigurationSplitDnArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleConfiguration = new DnsConfiguration(\"sampleConfiguration\", DnsConfigurationArgs.builder()\n            .nameservers(            \n                DnsConfigurationNameserverArgs.builder()\n                    .address(\"8.8.8.8\")\n                    .build(),\n                DnsConfigurationNameserverArgs.builder()\n                    .address(\"1.1.1.1\")\n                    .useWithExitNode(true)\n                    .build())\n            .splitDns(            \n                DnsConfigurationSplitDnArgs.builder()\n                    .domain(\"foo.example.com\")\n                    .nameservers(                    \n                        DnsConfigurationSplitDnNameserverArgs.builder()\n                            .address(\"1.1.1.2\")\n                            .useWithExitNode(true)\n                            .build(),\n                        DnsConfigurationSplitDnNameserverArgs.builder()\n                            .address(\"1.1.1.3\")\n                            .build())\n                    .build(),\n                DnsConfigurationSplitDnArgs.builder()\n                    .domain(\"bar.example.com\")\n                    .nameservers(DnsConfigurationSplitDnNameserverArgs.builder()\n                        .address(\"8.8.8.2\")\n                        .useWithExitNode(true)\n                        .build())\n                    .build())\n            .searchPaths(            \n                \"example.com\",\n                \"anotherexample.com\")\n            .overrideLocalDns(true)\n            .magicDns(true)\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleConfiguration:\n    type: tailscale:DnsConfiguration\n    name: sample_configuration\n    properties:\n      nameservers:\n        - address: 8.8.8.8\n        - address: 1.1.1.1\n          useWithExitNode: true\n      splitDns:\n        - domain: foo.example.com\n          nameservers:\n            - address: 1.1.1.2\n              useWithExitNode: true\n            - address: 1.1.1.3\n        - domain: bar.example.com\n          nameservers:\n            - address: 8.8.8.2\n              useWithExitNode: true\n      searchPaths:\n        - example.com\n        - anotherexample.com\n      overrideLocalDns: true\n      magicDns: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/dnsConfiguration:DnsConfiguration sample_configuration dns_configuration\n```\n\n","properties":{"magicDns":{"type":"boolean","description":"Whether or not to enable MagicDNS. Defaults to true.\n"},"nameservers":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationNameserver:DnsConfigurationNameserver"},"description":"Set the nameservers used by devices on your network to resolve DNS queries. \u003cspan pulumi-lang-nodejs=\"`overrideLocalDns`\" pulumi-lang-dotnet=\"`OverrideLocalDns`\" pulumi-lang-go=\"`overrideLocalDns`\" pulumi-lang-python=\"`override_local_dns`\" pulumi-lang-yaml=\"`overrideLocalDns`\" pulumi-lang-java=\"`overrideLocalDns`\"\u003e`override_local_dns`\u003c/span\u003e must also be true to prefer these nameservers over local DNS configuration.\n"},"overrideLocalDns":{"type":"boolean","description":"When enabled, use the configured DNS servers in \u003cspan pulumi-lang-nodejs=\"`nameservers`\" pulumi-lang-dotnet=\"`Nameservers`\" pulumi-lang-go=\"`nameservers`\" pulumi-lang-python=\"`nameservers`\" pulumi-lang-yaml=\"`nameservers`\" pulumi-lang-java=\"`nameservers`\"\u003e`nameservers`\u003c/span\u003e to resolve names outside the tailnet. When disabled, devices will prefer their local DNS configuration. Defaults to false.\n"},"searchPaths":{"type":"array","items":{"type":"string"},"description":"Additional search domains. When MagicDNS is on, the tailnet domain is automatically included as the first search domain.\n"},"splitDns":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationSplitDn:DnsConfigurationSplitDn"},"description":"Set the nameservers used by devices on your network to resolve DNS queries on specific domains (requires Tailscale v1.8 or later). Configuration does not depend on \u003cspan pulumi-lang-nodejs=\"`overrideLocalDns`\" pulumi-lang-dotnet=\"`OverrideLocalDns`\" pulumi-lang-go=\"`overrideLocalDns`\" pulumi-lang-python=\"`override_local_dns`\" pulumi-lang-yaml=\"`overrideLocalDns`\" pulumi-lang-java=\"`overrideLocalDns`\"\u003e`override_local_dns`\u003c/span\u003e.\n"}},"inputProperties":{"magicDns":{"type":"boolean","description":"Whether or not to enable MagicDNS. Defaults to true.\n"},"nameservers":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationNameserver:DnsConfigurationNameserver"},"description":"Set the nameservers used by devices on your network to resolve DNS queries. \u003cspan pulumi-lang-nodejs=\"`overrideLocalDns`\" pulumi-lang-dotnet=\"`OverrideLocalDns`\" pulumi-lang-go=\"`overrideLocalDns`\" pulumi-lang-python=\"`override_local_dns`\" pulumi-lang-yaml=\"`overrideLocalDns`\" pulumi-lang-java=\"`overrideLocalDns`\"\u003e`override_local_dns`\u003c/span\u003e must also be true to prefer these nameservers over local DNS configuration.\n"},"overrideLocalDns":{"type":"boolean","description":"When enabled, use the configured DNS servers in \u003cspan pulumi-lang-nodejs=\"`nameservers`\" pulumi-lang-dotnet=\"`Nameservers`\" pulumi-lang-go=\"`nameservers`\" pulumi-lang-python=\"`nameservers`\" pulumi-lang-yaml=\"`nameservers`\" pulumi-lang-java=\"`nameservers`\"\u003e`nameservers`\u003c/span\u003e to resolve names outside the tailnet. When disabled, devices will prefer their local DNS configuration. Defaults to false.\n"},"searchPaths":{"type":"array","items":{"type":"string"},"description":"Additional search domains. When MagicDNS is on, the tailnet domain is automatically included as the first search domain.\n"},"splitDns":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationSplitDn:DnsConfigurationSplitDn"},"description":"Set the nameservers used by devices on your network to resolve DNS queries on specific domains (requires Tailscale v1.8 or later). Configuration does not depend on \u003cspan pulumi-lang-nodejs=\"`overrideLocalDns`\" pulumi-lang-dotnet=\"`OverrideLocalDns`\" pulumi-lang-go=\"`overrideLocalDns`\" pulumi-lang-python=\"`override_local_dns`\" pulumi-lang-yaml=\"`overrideLocalDns`\" pulumi-lang-java=\"`overrideLocalDns`\"\u003e`override_local_dns`\u003c/span\u003e.\n"}},"stateInputs":{"description":"Input properties used for looking up and filtering DnsConfiguration resources.\n","properties":{"magicDns":{"type":"boolean","description":"Whether or not to enable MagicDNS. Defaults to true.\n"},"nameservers":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationNameserver:DnsConfigurationNameserver"},"description":"Set the nameservers used by devices on your network to resolve DNS queries. \u003cspan pulumi-lang-nodejs=\"`overrideLocalDns`\" pulumi-lang-dotnet=\"`OverrideLocalDns`\" pulumi-lang-go=\"`overrideLocalDns`\" pulumi-lang-python=\"`override_local_dns`\" pulumi-lang-yaml=\"`overrideLocalDns`\" pulumi-lang-java=\"`overrideLocalDns`\"\u003e`override_local_dns`\u003c/span\u003e must also be true to prefer these nameservers over local DNS configuration.\n"},"overrideLocalDns":{"type":"boolean","description":"When enabled, use the configured DNS servers in \u003cspan pulumi-lang-nodejs=\"`nameservers`\" pulumi-lang-dotnet=\"`Nameservers`\" pulumi-lang-go=\"`nameservers`\" pulumi-lang-python=\"`nameservers`\" pulumi-lang-yaml=\"`nameservers`\" pulumi-lang-java=\"`nameservers`\"\u003e`nameservers`\u003c/span\u003e to resolve names outside the tailnet. When disabled, devices will prefer their local DNS configuration. Defaults to false.\n"},"searchPaths":{"type":"array","items":{"type":"string"},"description":"Additional search domains. When MagicDNS is on, the tailnet domain is automatically included as the first search domain.\n"},"splitDns":{"type":"array","items":{"$ref":"#/types/tailscale:index/DnsConfigurationSplitDn:DnsConfigurationSplitDn"},"description":"Set the nameservers used by devices on your network to resolve DNS queries on specific domains (requires Tailscale v1.8 or later). Configuration does not depend on \u003cspan pulumi-lang-nodejs=\"`overrideLocalDns`\" pulumi-lang-dotnet=\"`OverrideLocalDns`\" pulumi-lang-go=\"`overrideLocalDns`\" pulumi-lang-python=\"`override_local_dns`\" pulumi-lang-yaml=\"`overrideLocalDns`\" pulumi-lang-java=\"`overrideLocalDns`\"\u003e`override_local_dns`\u003c/span\u003e.\n"}},"type":"object"}},"tailscale:index/dnsNameservers:DnsNameservers":{"description":"The\u003cspan pulumi-lang-nodejs=\" dnsNameservers \" pulumi-lang-dotnet=\" DnsNameservers \" pulumi-lang-go=\" dnsNameservers \" pulumi-lang-python=\" dns_nameservers \" pulumi-lang-yaml=\" dnsNameservers \" pulumi-lang-java=\" dnsNameservers \"\u003e dns_nameservers \u003c/span\u003eresource allows you to configure DNS nameservers for your Tailscale network. See https://tailscale.com/kb/1054/dns for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleNameservers = new tailscale.DnsNameservers(\"sample_nameservers\", {nameservers: [\n    \"8.8.8.8\",\n    \"8.8.4.4\",\n]});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_nameservers = tailscale.DnsNameservers(\"sample_nameservers\", nameservers=[\n    \"8.8.8.8\",\n    \"8.8.4.4\",\n])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleNameservers = new Tailscale.DnsNameservers(\"sample_nameservers\", new()\n    {\n        Nameservers = new[]\n        {\n            \"8.8.8.8\",\n            \"8.8.4.4\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewDnsNameservers(ctx, \"sample_nameservers\", \u0026tailscale.DnsNameserversArgs{\n\t\t\tNameservers: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"8.8.8.8\"),\n\t\t\t\tpulumi.String(\"8.8.4.4\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.DnsNameservers;\nimport com.pulumi.tailscale.DnsNameserversArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleNameservers = new DnsNameservers(\"sampleNameservers\", DnsNameserversArgs.builder()\n            .nameservers(            \n                \"8.8.8.8\",\n                \"8.8.4.4\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleNameservers:\n    type: tailscale:DnsNameservers\n    name: sample_nameservers\n    properties:\n      nameservers:\n        - 8.8.8.8\n        - 8.8.4.4\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/dnsNameservers:DnsNameservers sample dns_nameservers\n```\n\n","properties":{"nameservers":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.\n"}},"required":["nameservers"],"inputProperties":{"nameservers":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.\n"}},"requiredInputs":["nameservers"],"stateInputs":{"description":"Input properties used for looking up and filtering DnsNameservers resources.\n","properties":{"nameservers":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.\n"}},"type":"object"}},"tailscale:index/dnsPreferences:DnsPreferences":{"description":"The\u003cspan pulumi-lang-nodejs=\" dnsPreferences \" pulumi-lang-dotnet=\" DnsPreferences \" pulumi-lang-go=\" dnsPreferences \" pulumi-lang-python=\" dns_preferences \" pulumi-lang-yaml=\" dnsPreferences \" pulumi-lang-java=\" dnsPreferences \"\u003e dns_preferences \u003c/span\u003eresource allows you to configure DNS preferences for your Tailscale network. See https://tailscale.com/kb/1054/dns for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst samplePreferences = new tailscale.DnsPreferences(\"sample_preferences\", {magicDns: true});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_preferences = tailscale.DnsPreferences(\"sample_preferences\", magic_dns=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var samplePreferences = new Tailscale.DnsPreferences(\"sample_preferences\", new()\n    {\n        MagicDns = true,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewDnsPreferences(ctx, \"sample_preferences\", \u0026tailscale.DnsPreferencesArgs{\n\t\t\tMagicDns: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.DnsPreferences;\nimport com.pulumi.tailscale.DnsPreferencesArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var samplePreferences = new DnsPreferences(\"samplePreferences\", DnsPreferencesArgs.builder()\n            .magicDns(true)\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  samplePreferences:\n    type: tailscale:DnsPreferences\n    name: sample_preferences\n    properties:\n      magicDns: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/dnsPreferences:DnsPreferences sample_preferences dns_preferences\n```\n\n","properties":{"magicDns":{"type":"boolean","description":"Whether or not to enable magic DNS\n"}},"required":["magicDns"],"inputProperties":{"magicDns":{"type":"boolean","description":"Whether or not to enable magic DNS\n"}},"requiredInputs":["magicDns"],"stateInputs":{"description":"Input properties used for looking up and filtering DnsPreferences resources.\n","properties":{"magicDns":{"type":"boolean","description":"Whether or not to enable magic DNS\n"}},"type":"object"}},"tailscale:index/dnsSearchPaths:DnsSearchPaths":{"description":"The\u003cspan pulumi-lang-nodejs=\" dnsNameservers \" pulumi-lang-dotnet=\" DnsNameservers \" pulumi-lang-go=\" dnsNameservers \" pulumi-lang-python=\" dns_nameservers \" pulumi-lang-yaml=\" dnsNameservers \" pulumi-lang-java=\" dnsNameservers \"\u003e dns_nameservers \u003c/span\u003eresource allows you to configure DNS nameservers for your Tailscale network. See https://tailscale.com/kb/1054/dns for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleSearchPaths = new tailscale.DnsSearchPaths(\"sample_search_paths\", {searchPaths: [\"example.com\"]});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_search_paths = tailscale.DnsSearchPaths(\"sample_search_paths\", search_paths=[\"example.com\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleSearchPaths = new Tailscale.DnsSearchPaths(\"sample_search_paths\", new()\n    {\n        SearchPaths = new[]\n        {\n            \"example.com\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewDnsSearchPaths(ctx, \"sample_search_paths\", \u0026tailscale.DnsSearchPathsArgs{\n\t\t\tSearchPaths: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"example.com\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.DnsSearchPaths;\nimport com.pulumi.tailscale.DnsSearchPathsArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleSearchPaths = new DnsSearchPaths(\"sampleSearchPaths\", DnsSearchPathsArgs.builder()\n            .searchPaths(\"example.com\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleSearchPaths:\n    type: tailscale:DnsSearchPaths\n    name: sample_search_paths\n    properties:\n      searchPaths:\n        - example.com\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/dnsSearchPaths:DnsSearchPaths sample dns_search_paths\n```\n\n","properties":{"searchPaths":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these domain suffixes to resolve DNS names.\n"}},"required":["searchPaths"],"inputProperties":{"searchPaths":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these domain suffixes to resolve DNS names.\n"}},"requiredInputs":["searchPaths"],"stateInputs":{"description":"Input properties used for looking up and filtering DnsSearchPaths resources.\n","properties":{"searchPaths":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these domain suffixes to resolve DNS names.\n"}},"type":"object"}},"tailscale:index/dnsSplitNameservers:DnsSplitNameservers":{"description":"The\u003cspan pulumi-lang-nodejs=\" dnsSplitNameservers \" pulumi-lang-dotnet=\" DnsSplitNameservers \" pulumi-lang-go=\" dnsSplitNameservers \" pulumi-lang-python=\" dns_split_nameservers \" pulumi-lang-yaml=\" dnsSplitNameservers \" pulumi-lang-java=\" dnsSplitNameservers \"\u003e dns_split_nameservers \u003c/span\u003eresource allows you to configure split DNS nameservers for your Tailscale network. See https://tailscale.com/kb/1054/dns for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleSplitNameservers = new tailscale.DnsSplitNameservers(\"sample_split_nameservers\", {\n    domain: \"foo.example.com\",\n    nameservers: [\"1.1.1.1\"],\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_split_nameservers = tailscale.DnsSplitNameservers(\"sample_split_nameservers\",\n    domain=\"foo.example.com\",\n    nameservers=[\"1.1.1.1\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleSplitNameservers = new Tailscale.DnsSplitNameservers(\"sample_split_nameservers\", new()\n    {\n        Domain = \"foo.example.com\",\n        Nameservers = new[]\n        {\n            \"1.1.1.1\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewDnsSplitNameservers(ctx, \"sample_split_nameservers\", \u0026tailscale.DnsSplitNameserversArgs{\n\t\t\tDomain: pulumi.String(\"foo.example.com\"),\n\t\t\tNameservers: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"1.1.1.1\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.DnsSplitNameservers;\nimport com.pulumi.tailscale.DnsSplitNameserversArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleSplitNameservers = new DnsSplitNameservers(\"sampleSplitNameservers\", DnsSplitNameserversArgs.builder()\n            .domain(\"foo.example.com\")\n            .nameservers(\"1.1.1.1\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleSplitNameservers:\n    type: tailscale:DnsSplitNameservers\n    name: sample_split_nameservers\n    properties:\n      domain: foo.example.com\n      nameservers:\n        - 1.1.1.1\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nSplit DNS nameservers can be imported using the domain name, e.g.\n\n```sh\n$ pulumi import tailscale:index/dnsSplitNameservers:DnsSplitNameservers sample_split_nameservers example.com\n```\n\n","properties":{"domain":{"type":"string","description":"Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers. Changing this will force the resource to be recreated.\n"},"nameservers":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.\n"}},"required":["domain","nameservers"],"inputProperties":{"domain":{"type":"string","description":"Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers. Changing this will force the resource to be recreated.\n","willReplaceOnChanges":true},"nameservers":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.\n"}},"requiredInputs":["domain","nameservers"],"stateInputs":{"description":"Input properties used for looking up and filtering DnsSplitNameservers resources.\n","properties":{"domain":{"type":"string","description":"Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers. Changing this will force the resource to be recreated.\n","willReplaceOnChanges":true},"nameservers":{"type":"array","items":{"type":"string"},"description":"Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.\n"}},"type":"object"}},"tailscale:index/federatedIdentity:FederatedIdentity":{"description":"The\u003cspan pulumi-lang-nodejs=\" federatedIdentity \" pulumi-lang-dotnet=\" FederatedIdentity \" pulumi-lang-go=\" federatedIdentity \" pulumi-lang-python=\" federated_identity \" pulumi-lang-yaml=\" federatedIdentity \" pulumi-lang-java=\" federatedIdentity \"\u003e federated_identity \u003c/span\u003eresource allows you to create federated identities to programmatically interact with the Tailscale API using workload identity federation.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst exampleFederatedIdentity = new tailscale.FederatedIdentity(\"example_federated_identity\", {\n    description: \"Example federated identity\",\n    scopes: [\n        \"auth_keys\",\n        \"devices:core\",\n    ],\n    tags: [\"tag:test\"],\n    issuer: \"https://example.com\",\n    subject: \"example-sub-*\",\n    customClaimRules: {\n        repo_name: \"example-repo-name\",\n    },\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nexample_federated_identity = tailscale.FederatedIdentity(\"example_federated_identity\",\n    description=\"Example federated identity\",\n    scopes=[\n        \"auth_keys\",\n        \"devices:core\",\n    ],\n    tags=[\"tag:test\"],\n    issuer=\"https://example.com\",\n    subject=\"example-sub-*\",\n    custom_claim_rules={\n        \"repo_name\": \"example-repo-name\",\n    })\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleFederatedIdentity = new Tailscale.FederatedIdentity(\"example_federated_identity\", new()\n    {\n        Description = \"Example federated identity\",\n        Scopes = new[]\n        {\n            \"auth_keys\",\n            \"devices:core\",\n        },\n        Tags = new[]\n        {\n            \"tag:test\",\n        },\n        Issuer = \"https://example.com\",\n        Subject = \"example-sub-*\",\n        CustomClaimRules = \n        {\n            { \"repo_name\", \"example-repo-name\" },\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewFederatedIdentity(ctx, \"example_federated_identity\", \u0026tailscale.FederatedIdentityArgs{\n\t\t\tDescription: pulumi.String(\"Example federated identity\"),\n\t\t\tScopes: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"auth_keys\"),\n\t\t\t\tpulumi.String(\"devices:core\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"tag:test\"),\n\t\t\t},\n\t\t\tIssuer:  pulumi.String(\"https://example.com\"),\n\t\t\tSubject: pulumi.String(\"example-sub-*\"),\n\t\t\tCustomClaimRules: pulumi.StringMap{\n\t\t\t\t\"repo_name\": pulumi.String(\"example-repo-name\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.FederatedIdentity;\nimport com.pulumi.tailscale.FederatedIdentityArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var exampleFederatedIdentity = new FederatedIdentity(\"exampleFederatedIdentity\", FederatedIdentityArgs.builder()\n            .description(\"Example federated identity\")\n            .scopes(            \n                \"auth_keys\",\n                \"devices:core\")\n            .tags(\"tag:test\")\n            .issuer(\"https://example.com\")\n            .subject(\"example-sub-*\")\n            .customClaimRules(Map.of(\"repo_name\", \"example-repo-name\"))\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleFederatedIdentity:\n    type: tailscale:FederatedIdentity\n    name: example_federated_identity\n    properties:\n      description: Example federated identity\n      scopes:\n        - auth_keys\n        - devices:core\n      tags:\n        - tag:test\n      issuer: https://example.com\n      subject: example-sub-*\n      customClaimRules:\n        repo_name: example-repo-name\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\n```sh\n$ pulumi import tailscale:index/federatedIdentity:FederatedIdentity example k1234511CNTRL-kZDRvszg8621CNTRL\n```\n\n","properties":{"audience":{"type":"string","description":"The value used when matching against the \u003cspan pulumi-lang-nodejs=\"`aud`\" pulumi-lang-dotnet=\"`Aud`\" pulumi-lang-go=\"`aud`\" pulumi-lang-python=\"`aud`\" pulumi-lang-yaml=\"`aud`\" pulumi-lang-java=\"`aud`\"\u003e`aud`\u003c/span\u003e 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.\n"},"createdAt":{"type":"string","description":"The creation timestamp of the key in RFC3339 format\n"},"customClaimRules":{"type":"object","additionalProperties":{"type":"string"},"description":"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.\n"},"description":{"type":"string","description":"A description of the federated identity consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"issuer":{"type":"string","description":"The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.\n"},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.\n"},"subject":{"type":"string","description":"The pattern used when matching against the \u003cspan pulumi-lang-nodejs=\"`sub`\" pulumi-lang-dotnet=\"`Sub`\" pulumi-lang-go=\"`sub`\" pulumi-lang-python=\"`sub`\" pulumi-lang-yaml=\"`sub`\" pulumi-lang-java=\"`sub`\"\u003e`sub`\u003c/span\u003e claim from an OIDC identity token. Patterns can include `*` characters to match against any character.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"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 \u003cspan pulumi-lang-nodejs=\"\"authKeys\"\" pulumi-lang-dotnet=\"\"AuthKeys\"\" pulumi-lang-go=\"\"authKeys\"\" pulumi-lang-python=\"\"auth_keys\"\" pulumi-lang-yaml=\"\"authKeys\"\" pulumi-lang-java=\"\"authKeys\"\"\u003e\"auth_keys\"\u003c/span\u003e.\n"},"updatedAt":{"type":"string","description":"The updated timestamp of the key in RFC3339 format\n"},"userId":{"type":"string","description":"ID of the user who created this federated identity, empty for federated identities created by other trust credentials.\n"}},"required":["audience","createdAt","issuer","scopes","subject","updatedAt","userId"],"inputProperties":{"audience":{"type":"string","description":"The value used when matching against the \u003cspan pulumi-lang-nodejs=\"`aud`\" pulumi-lang-dotnet=\"`Aud`\" pulumi-lang-go=\"`aud`\" pulumi-lang-python=\"`aud`\" pulumi-lang-yaml=\"`aud`\" pulumi-lang-java=\"`aud`\"\u003e`aud`\u003c/span\u003e 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.\n"},"customClaimRules":{"type":"object","additionalProperties":{"type":"string"},"description":"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.\n"},"description":{"type":"string","description":"A description of the federated identity consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"issuer":{"type":"string","description":"The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.\n"},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.\n"},"subject":{"type":"string","description":"The pattern used when matching against the \u003cspan pulumi-lang-nodejs=\"`sub`\" pulumi-lang-dotnet=\"`Sub`\" pulumi-lang-go=\"`sub`\" pulumi-lang-python=\"`sub`\" pulumi-lang-yaml=\"`sub`\" pulumi-lang-java=\"`sub`\"\u003e`sub`\u003c/span\u003e claim from an OIDC identity token. Patterns can include `*` characters to match against any character.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"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 \u003cspan pulumi-lang-nodejs=\"\"authKeys\"\" pulumi-lang-dotnet=\"\"AuthKeys\"\" pulumi-lang-go=\"\"authKeys\"\" pulumi-lang-python=\"\"auth_keys\"\" pulumi-lang-yaml=\"\"authKeys\"\" pulumi-lang-java=\"\"authKeys\"\"\u003e\"auth_keys\"\u003c/span\u003e.\n"}},"requiredInputs":["issuer","scopes","subject"],"stateInputs":{"description":"Input properties used for looking up and filtering FederatedIdentity resources.\n","properties":{"audience":{"type":"string","description":"The value used when matching against the \u003cspan pulumi-lang-nodejs=\"`aud`\" pulumi-lang-dotnet=\"`Aud`\" pulumi-lang-go=\"`aud`\" pulumi-lang-python=\"`aud`\" pulumi-lang-yaml=\"`aud`\" pulumi-lang-java=\"`aud`\"\u003e`aud`\u003c/span\u003e 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.\n"},"createdAt":{"type":"string","description":"The creation timestamp of the key in RFC3339 format\n"},"customClaimRules":{"type":"object","additionalProperties":{"type":"string"},"description":"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.\n"},"description":{"type":"string","description":"A description of the federated identity consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"issuer":{"type":"string","description":"The issuer of the OIDC identity token used in the token exchange. Must be a valid and publicly reachable https:// URL.\n"},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant to the federated identity. See https://tailscale.com/kb/1623/ for a list of available scopes.\n"},"subject":{"type":"string","description":"The pattern used when matching against the \u003cspan pulumi-lang-nodejs=\"`sub`\" pulumi-lang-dotnet=\"`Sub`\" pulumi-lang-go=\"`sub`\" pulumi-lang-python=\"`sub`\" pulumi-lang-yaml=\"`sub`\" pulumi-lang-java=\"`sub`\"\u003e`sub`\u003c/span\u003e claim from an OIDC identity token. Patterns can include `*` characters to match against any character.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"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 \u003cspan pulumi-lang-nodejs=\"\"authKeys\"\" pulumi-lang-dotnet=\"\"AuthKeys\"\" pulumi-lang-go=\"\"authKeys\"\" pulumi-lang-python=\"\"auth_keys\"\" pulumi-lang-yaml=\"\"authKeys\"\" pulumi-lang-java=\"\"authKeys\"\"\u003e\"auth_keys\"\u003c/span\u003e.\n"},"updatedAt":{"type":"string","description":"The updated timestamp of the key in RFC3339 format\n"},"userId":{"type":"string","description":"ID of the user who created this federated identity, empty for federated identities created by other trust credentials.\n"}},"type":"object"}},"tailscale:index/logstreamConfiguration:LogstreamConfiguration":{"description":"The\u003cspan pulumi-lang-nodejs=\" logstreamConfiguration \" pulumi-lang-dotnet=\" LogstreamConfiguration \" pulumi-lang-go=\" logstreamConfiguration \" pulumi-lang-python=\" logstream_configuration \" pulumi-lang-yaml=\" logstreamConfiguration \" pulumi-lang-java=\" logstreamConfiguration \"\u003e logstream_configuration \u003c/span\u003eresource allows you to configure streaming configuration or network flow logs to a supported security information and event management (SIEM) system. See https://tailscale.com/kb/1255/log-streaming for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\n// Example configuration for a non-S3 logstreaming endpoint\nconst sampleLogstreamConfiguration = new tailscale.LogstreamConfiguration(\"sample_logstream_configuration\", {\n    logType: \"configuration\",\n    destinationType: \"panther\",\n    url: \"https://example.com\",\n    token: \"some-token\",\n});\n// Example configuration for an AWS S3 logstreaming endpoint\nconst sampleLogstreamConfigurationS3 = new tailscale.LogstreamConfiguration(\"sample_logstream_configuration_s3\", {\n    logType: \"configuration\",\n    destinationType: \"s3\",\n    s3Bucket: tailscaleLogs.id,\n    s3Region: \"us-west-2\",\n    s3AuthenticationType: \"rolearn\",\n    s3RoleArn: tailscaleLogsWriter.arn,\n    s3ExternalId: prod.externalId,\n});\n// Example configuration for an S3-compatible logstreaming endpoint\nconst sampleLogstreamConfigurationS3Compatible = new tailscale.LogstreamConfiguration(\"sample_logstream_configuration_s3_compatible\", {\n    logType: \"configuration\",\n    destinationType: \"s3\",\n    url: \"https://s3.example.com\",\n    s3Bucket: \"example-bucket\",\n    s3Region: \"us-west-2\",\n    s3AuthenticationType: \"accesskey\",\n    s3AccessKeyId: \"some-access-key\",\n    s3SecretAccessKey: \"some-secret-key\",\n});\n// Example configuration for a GCS logstreaming endpoint using workload identity\nconst sampleLogstreamConfigurationGcsWif = new tailscale.LogstreamConfiguration(\"sample_logstream_configuration_gcs_wif\", {\n    logType: \"configuration\",\n    destinationType: \"gcs\",\n    gcsBucket: \"example-gcs-bucket\",\n    gcsCredentials: JSON.stringify({\n        type: \"external_account\",\n        audience: \"//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/example-pool/providers/example-provider\",\n        subject_token_type: \"urn:ietf:params:aws:token-type:aws4_request\",\n        service_account_impersonation_url: \"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/example@example.iam.gserviceaccount.com:generateAccessToken\",\n        token_url: \"https://sts.googleapis.com/v1/token\",\n        credential_source: {\n            environment_id: \"aws1\",\n            region_url: \"http://169.254.169.254/latest/meta-data/placement/availability-zone\",\n            url: \"http://169.254.169.254/latest/meta-data/iam/security-credentials\",\n            regional_cred_verification_url: \"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity\u0026Version=2011-06-15\",\n            imdsv2_session_token_url: \"http://169.254.169.254/latest/api/token\",\n        },\n    }),\n});\n```\n```python\nimport pulumi\nimport json\nimport pulumi_tailscale as tailscale\n\n# Example configuration for a non-S3 logstreaming endpoint\nsample_logstream_configuration = tailscale.LogstreamConfiguration(\"sample_logstream_configuration\",\n    log_type=\"configuration\",\n    destination_type=\"panther\",\n    url=\"https://example.com\",\n    token=\"some-token\")\n# Example configuration for an AWS S3 logstreaming endpoint\nsample_logstream_configuration_s3 = tailscale.LogstreamConfiguration(\"sample_logstream_configuration_s3\",\n    log_type=\"configuration\",\n    destination_type=\"s3\",\n    s3_bucket=tailscale_logs[\"id\"],\n    s3_region=\"us-west-2\",\n    s3_authentication_type=\"rolearn\",\n    s3_role_arn=tailscale_logs_writer[\"arn\"],\n    s3_external_id=prod[\"externalId\"])\n# Example configuration for an S3-compatible logstreaming endpoint\nsample_logstream_configuration_s3_compatible = tailscale.LogstreamConfiguration(\"sample_logstream_configuration_s3_compatible\",\n    log_type=\"configuration\",\n    destination_type=\"s3\",\n    url=\"https://s3.example.com\",\n    s3_bucket=\"example-bucket\",\n    s3_region=\"us-west-2\",\n    s3_authentication_type=\"accesskey\",\n    s3_access_key_id=\"some-access-key\",\n    s3_secret_access_key=\"some-secret-key\")\n# Example configuration for a GCS logstreaming endpoint using workload identity\nsample_logstream_configuration_gcs_wif = tailscale.LogstreamConfiguration(\"sample_logstream_configuration_gcs_wif\",\n    log_type=\"configuration\",\n    destination_type=\"gcs\",\n    gcs_bucket=\"example-gcs-bucket\",\n    gcs_credentials=json.dumps({\n        \"type\": \"external_account\",\n        \"audience\": \"//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/example-pool/providers/example-provider\",\n        \"subject_token_type\": \"urn:ietf:params:aws:token-type:aws4_request\",\n        \"service_account_impersonation_url\": \"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/example@example.iam.gserviceaccount.com:generateAccessToken\",\n        \"token_url\": \"https://sts.googleapis.com/v1/token\",\n        \"credential_source\": {\n            \"environment_id\": \"aws1\",\n            \"region_url\": \"http://169.254.169.254/latest/meta-data/placement/availability-zone\",\n            \"url\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials\",\n            \"regional_cred_verification_url\": \"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity\u0026Version=2011-06-15\",\n            \"imdsv2_session_token_url\": \"http://169.254.169.254/latest/api/token\",\n        },\n    }))\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.Json;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    // Example configuration for a non-S3 logstreaming endpoint\n    var sampleLogstreamConfiguration = new Tailscale.LogstreamConfiguration(\"sample_logstream_configuration\", new()\n    {\n        LogType = \"configuration\",\n        DestinationType = \"panther\",\n        Url = \"https://example.com\",\n        Token = \"some-token\",\n    });\n\n    // Example configuration for an AWS S3 logstreaming endpoint\n    var sampleLogstreamConfigurationS3 = new Tailscale.LogstreamConfiguration(\"sample_logstream_configuration_s3\", new()\n    {\n        LogType = \"configuration\",\n        DestinationType = \"s3\",\n        S3Bucket = tailscaleLogs.Id,\n        S3Region = \"us-west-2\",\n        S3AuthenticationType = \"rolearn\",\n        S3RoleArn = tailscaleLogsWriter.Arn,\n        S3ExternalId = prod.ExternalId,\n    });\n\n    // Example configuration for an S3-compatible logstreaming endpoint\n    var sampleLogstreamConfigurationS3Compatible = new Tailscale.LogstreamConfiguration(\"sample_logstream_configuration_s3_compatible\", new()\n    {\n        LogType = \"configuration\",\n        DestinationType = \"s3\",\n        Url = \"https://s3.example.com\",\n        S3Bucket = \"example-bucket\",\n        S3Region = \"us-west-2\",\n        S3AuthenticationType = \"accesskey\",\n        S3AccessKeyId = \"some-access-key\",\n        S3SecretAccessKey = \"some-secret-key\",\n    });\n\n    // Example configuration for a GCS logstreaming endpoint using workload identity\n    var sampleLogstreamConfigurationGcsWif = new Tailscale.LogstreamConfiguration(\"sample_logstream_configuration_gcs_wif\", new()\n    {\n        LogType = \"configuration\",\n        DestinationType = \"gcs\",\n        GcsBucket = \"example-gcs-bucket\",\n        GcsCredentials = JsonSerializer.Serialize(new Dictionary\u003cstring, object?\u003e\n        {\n            [\"type\"] = \"external_account\",\n            [\"audience\"] = \"//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/example-pool/providers/example-provider\",\n            [\"subject_token_type\"] = \"urn:ietf:params:aws:token-type:aws4_request\",\n            [\"service_account_impersonation_url\"] = \"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/example@example.iam.gserviceaccount.com:generateAccessToken\",\n            [\"token_url\"] = \"https://sts.googleapis.com/v1/token\",\n            [\"credential_source\"] = new Dictionary\u003cstring, object?\u003e\n            {\n                [\"environment_id\"] = \"aws1\",\n                [\"region_url\"] = \"http://169.254.169.254/latest/meta-data/placement/availability-zone\",\n                [\"url\"] = \"http://169.254.169.254/latest/meta-data/iam/security-credentials\",\n                [\"regional_cred_verification_url\"] = \"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity\u0026Version=2011-06-15\",\n                [\"imdsv2_session_token_url\"] = \"http://169.254.169.254/latest/api/token\",\n            },\n        }),\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t// Example configuration for a non-S3 logstreaming endpoint\n\t\t_, err := tailscale.NewLogstreamConfiguration(ctx, \"sample_logstream_configuration\", \u0026tailscale.LogstreamConfigurationArgs{\n\t\t\tLogType:         pulumi.String(\"configuration\"),\n\t\t\tDestinationType: pulumi.String(\"panther\"),\n\t\t\tUrl:             pulumi.String(\"https://example.com\"),\n\t\t\tToken:           pulumi.String(\"some-token\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Example configuration for an AWS S3 logstreaming endpoint\n\t\t_, err = tailscale.NewLogstreamConfiguration(ctx, \"sample_logstream_configuration_s3\", \u0026tailscale.LogstreamConfigurationArgs{\n\t\t\tLogType:              pulumi.String(\"configuration\"),\n\t\t\tDestinationType:      pulumi.String(\"s3\"),\n\t\t\tS3Bucket:             pulumi.Any(tailscaleLogs.Id),\n\t\t\tS3Region:             pulumi.String(\"us-west-2\"),\n\t\t\tS3AuthenticationType: pulumi.String(\"rolearn\"),\n\t\t\tS3RoleArn:            pulumi.Any(tailscaleLogsWriter.Arn),\n\t\t\tS3ExternalId:         pulumi.Any(prod.ExternalId),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Example configuration for an S3-compatible logstreaming endpoint\n\t\t_, err = tailscale.NewLogstreamConfiguration(ctx, \"sample_logstream_configuration_s3_compatible\", \u0026tailscale.LogstreamConfigurationArgs{\n\t\t\tLogType:              pulumi.String(\"configuration\"),\n\t\t\tDestinationType:      pulumi.String(\"s3\"),\n\t\t\tUrl:                  pulumi.String(\"https://s3.example.com\"),\n\t\t\tS3Bucket:             pulumi.String(\"example-bucket\"),\n\t\t\tS3Region:             pulumi.String(\"us-west-2\"),\n\t\t\tS3AuthenticationType: pulumi.String(\"accesskey\"),\n\t\t\tS3AccessKeyId:        pulumi.String(\"some-access-key\"),\n\t\t\tS3SecretAccessKey:    pulumi.String(\"some-secret-key\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttmpJSON0, err := json.Marshal(map[string]interface{}{\n\t\t\t\"type\":                              \"external_account\",\n\t\t\t\"audience\":                          \"//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/example-pool/providers/example-provider\",\n\t\t\t\"subject_token_type\":                \"urn:ietf:params:aws:token-type:aws4_request\",\n\t\t\t\"service_account_impersonation_url\": \"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/example@example.iam.gserviceaccount.com:generateAccessToken\",\n\t\t\t\"token_url\":                         \"https://sts.googleapis.com/v1/token\",\n\t\t\t\"credential_source\": map[string]interface{}{\n\t\t\t\t\"environment_id\":                 \"aws1\",\n\t\t\t\t\"region_url\":                     \"http://169.254.169.254/latest/meta-data/placement/availability-zone\",\n\t\t\t\t\"url\":                            \"http://169.254.169.254/latest/meta-data/iam/security-credentials\",\n\t\t\t\t\"regional_cred_verification_url\": \"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity\u0026Version=2011-06-15\",\n\t\t\t\t\"imdsv2_session_token_url\":       \"http://169.254.169.254/latest/api/token\",\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tjson0 := string(tmpJSON0)\n\t\t// Example configuration for a GCS logstreaming endpoint using workload identity\n\t\t_, err = tailscale.NewLogstreamConfiguration(ctx, \"sample_logstream_configuration_gcs_wif\", \u0026tailscale.LogstreamConfigurationArgs{\n\t\t\tLogType:         pulumi.String(\"configuration\"),\n\t\t\tDestinationType: pulumi.String(\"gcs\"),\n\t\t\tGcsBucket:       pulumi.String(\"example-gcs-bucket\"),\n\t\t\tGcsCredentials:  pulumi.String(json0),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.LogstreamConfiguration;\nimport com.pulumi.tailscale.LogstreamConfigurationArgs;\nimport static com.pulumi.codegen.internal.Serialization.*;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        // Example configuration for a non-S3 logstreaming endpoint\n        var sampleLogstreamConfiguration = new LogstreamConfiguration(\"sampleLogstreamConfiguration\", LogstreamConfigurationArgs.builder()\n            .logType(\"configuration\")\n            .destinationType(\"panther\")\n            .url(\"https://example.com\")\n            .token(\"some-token\")\n            .build());\n\n        // Example configuration for an AWS S3 logstreaming endpoint\n        var sampleLogstreamConfigurationS3 = new LogstreamConfiguration(\"sampleLogstreamConfigurationS3\", LogstreamConfigurationArgs.builder()\n            .logType(\"configuration\")\n            .destinationType(\"s3\")\n            .s3Bucket(tailscaleLogs.id())\n            .s3Region(\"us-west-2\")\n            .s3AuthenticationType(\"rolearn\")\n            .s3RoleArn(tailscaleLogsWriter.arn())\n            .s3ExternalId(prod.externalId())\n            .build());\n\n        // Example configuration for an S3-compatible logstreaming endpoint\n        var sampleLogstreamConfigurationS3Compatible = new LogstreamConfiguration(\"sampleLogstreamConfigurationS3Compatible\", LogstreamConfigurationArgs.builder()\n            .logType(\"configuration\")\n            .destinationType(\"s3\")\n            .url(\"https://s3.example.com\")\n            .s3Bucket(\"example-bucket\")\n            .s3Region(\"us-west-2\")\n            .s3AuthenticationType(\"accesskey\")\n            .s3AccessKeyId(\"some-access-key\")\n            .s3SecretAccessKey(\"some-secret-key\")\n            .build());\n\n        // Example configuration for a GCS logstreaming endpoint using workload identity\n        var sampleLogstreamConfigurationGcsWif = new LogstreamConfiguration(\"sampleLogstreamConfigurationGcsWif\", LogstreamConfigurationArgs.builder()\n            .logType(\"configuration\")\n            .destinationType(\"gcs\")\n            .gcsBucket(\"example-gcs-bucket\")\n            .gcsCredentials(serializeJson(\n                jsonObject(\n                    jsonProperty(\"type\", \"external_account\"),\n                    jsonProperty(\"audience\", \"//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/example-pool/providers/example-provider\"),\n                    jsonProperty(\"subject_token_type\", \"urn:ietf:params:aws:token-type:aws4_request\"),\n                    jsonProperty(\"service_account_impersonation_url\", \"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/example@example.iam.gserviceaccount.com:generateAccessToken\"),\n                    jsonProperty(\"token_url\", \"https://sts.googleapis.com/v1/token\"),\n                    jsonProperty(\"credential_source\", jsonObject(\n                        jsonProperty(\"environment_id\", \"aws1\"),\n                        jsonProperty(\"region_url\", \"http://169.254.169.254/latest/meta-data/placement/availability-zone\"),\n                        jsonProperty(\"url\", \"http://169.254.169.254/latest/meta-data/iam/security-credentials\"),\n                        jsonProperty(\"regional_cred_verification_url\", \"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity\u0026Version=2011-06-15\"),\n                        jsonProperty(\"imdsv2_session_token_url\", \"http://169.254.169.254/latest/api/token\")\n                    ))\n                )))\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  # Example configuration for a non-S3 logstreaming endpoint\n  sampleLogstreamConfiguration:\n    type: tailscale:LogstreamConfiguration\n    name: sample_logstream_configuration\n    properties:\n      logType: configuration\n      destinationType: panther\n      url: https://example.com\n      token: some-token\n  # Example configuration for an AWS S3 logstreaming endpoint\n  sampleLogstreamConfigurationS3:\n    type: tailscale:LogstreamConfiguration\n    name: sample_logstream_configuration_s3\n    properties:\n      logType: configuration\n      destinationType: s3\n      s3Bucket: ${tailscaleLogs.id}\n      s3Region: us-west-2\n      s3AuthenticationType: rolearn\n      s3RoleArn: ${tailscaleLogsWriter.arn}\n      s3ExternalId: ${prod.externalId}\n  # Example configuration for an S3-compatible logstreaming endpoint\n  sampleLogstreamConfigurationS3Compatible:\n    type: tailscale:LogstreamConfiguration\n    name: sample_logstream_configuration_s3_compatible\n    properties:\n      logType: configuration\n      destinationType: s3\n      url: https://s3.example.com\n      s3Bucket: example-bucket\n      s3Region: us-west-2\n      s3AuthenticationType: accesskey\n      s3AccessKeyId: some-access-key\n      s3SecretAccessKey: some-secret-key\n  # Example configuration for a GCS logstreaming endpoint using workload identity\n  sampleLogstreamConfigurationGcsWif:\n    type: tailscale:LogstreamConfiguration\n    name: sample_logstream_configuration_gcs_wif\n    properties:\n      logType: configuration\n      destinationType: gcs\n      gcsBucket: example-gcs-bucket\n      gcsCredentials:\n        fn::toJSON:\n          type: external_account\n          audience: //iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/example-pool/providers/example-provider\n          subject_token_type: urn:ietf:params:aws:token-type:aws4_request\n          service_account_impersonation_url: https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/example@example.iam.gserviceaccount.com:generateAccessToken\n          token_url: https://sts.googleapis.com/v1/token\n          credential_source:\n            environment_id: aws1\n            region_url: http://169.254.169.254/latest/meta-data/placement/availability-zone\n            url: http://169.254.169.254/latest/meta-data/iam/security-credentials\n            regional_cred_verification_url: https://sts.{region}.amazonaws.com?Action=GetCallerIdentity\u0026Version=2011-06-15\n            imdsv2_session_token_url: http://169.254.169.254/latest/api/token\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nLogstream configuration can be imported using the logstream configuration id, e.g.,\n\n```sh\n$ pulumi import tailscale:index/logstreamConfiguration:LogstreamConfiguration sample_logstream_configuration 123456789\n```\n\n","properties":{"compressionFormat":{"type":"string","description":"The compression algorithm used for logs. Valid values are \u003cspan pulumi-lang-nodejs=\"`none`\" pulumi-lang-dotnet=\"`None`\" pulumi-lang-go=\"`none`\" pulumi-lang-python=\"`none`\" pulumi-lang-yaml=\"`none`\" pulumi-lang-java=\"`none`\"\u003e`none`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`zstd`\" pulumi-lang-dotnet=\"`Zstd`\" pulumi-lang-go=\"`zstd`\" pulumi-lang-python=\"`zstd`\" pulumi-lang-yaml=\"`zstd`\" pulumi-lang-java=\"`zstd`\"\u003e`zstd`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`gzip`\" pulumi-lang-dotnet=\"`Gzip`\" pulumi-lang-go=\"`gzip`\" pulumi-lang-python=\"`gzip`\" pulumi-lang-yaml=\"`gzip`\" pulumi-lang-java=\"`gzip`\"\u003e`gzip`\u003c/span\u003e. Defaults to \u003cspan pulumi-lang-nodejs=\"`none`\" pulumi-lang-dotnet=\"`None`\" pulumi-lang-go=\"`none`\" pulumi-lang-python=\"`none`\" pulumi-lang-yaml=\"`none`\" pulumi-lang-java=\"`none`\"\u003e`none`\u003c/span\u003e.\n"},"destinationType":{"type":"string","description":"The type of SIEM platform to stream to. Valid values are \u003cspan pulumi-lang-nodejs=\"`axiom`\" pulumi-lang-dotnet=\"`Axiom`\" pulumi-lang-go=\"`axiom`\" pulumi-lang-python=\"`axiom`\" pulumi-lang-yaml=\"`axiom`\" pulumi-lang-java=\"`axiom`\"\u003e`axiom`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`cribl`\" pulumi-lang-dotnet=\"`Cribl`\" pulumi-lang-go=\"`cribl`\" pulumi-lang-python=\"`cribl`\" pulumi-lang-yaml=\"`cribl`\" pulumi-lang-java=\"`cribl`\"\u003e`cribl`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`datadog`\" pulumi-lang-dotnet=\"`Datadog`\" pulumi-lang-go=\"`datadog`\" pulumi-lang-python=\"`datadog`\" pulumi-lang-yaml=\"`datadog`\" pulumi-lang-java=\"`datadog`\"\u003e`datadog`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`elastic`\" pulumi-lang-dotnet=\"`Elastic`\" pulumi-lang-go=\"`elastic`\" pulumi-lang-python=\"`elastic`\" pulumi-lang-yaml=\"`elastic`\" pulumi-lang-java=\"`elastic`\"\u003e`elastic`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`gcs`\" pulumi-lang-dotnet=\"`Gcs`\" pulumi-lang-go=\"`gcs`\" pulumi-lang-python=\"`gcs`\" pulumi-lang-yaml=\"`gcs`\" pulumi-lang-java=\"`gcs`\"\u003e`gcs`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`panther`\" pulumi-lang-dotnet=\"`Panther`\" pulumi-lang-go=\"`panther`\" pulumi-lang-python=\"`panther`\" pulumi-lang-yaml=\"`panther`\" pulumi-lang-java=\"`panther`\"\u003e`panther`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`splunk`\" pulumi-lang-dotnet=\"`Splunk`\" pulumi-lang-go=\"`splunk`\" pulumi-lang-python=\"`splunk`\" pulumi-lang-yaml=\"`splunk`\" pulumi-lang-java=\"`splunk`\"\u003e`splunk`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`s3`\" pulumi-lang-dotnet=\"`S3`\" pulumi-lang-go=\"`s3`\" pulumi-lang-python=\"`s3`\" pulumi-lang-yaml=\"`s3`\" pulumi-lang-java=\"`s3`\"\u003e`s3`\u003c/span\u003e.\n"},"gcsBucket":{"type":"string","description":"The name of the GCS bucket\n"},"gcsCredentials":{"type":"string","description":"The encoded string of JSON that is used to authenticate for workload identity in GCS\n"},"gcsKeyPrefix":{"type":"string","description":"The GCS key prefix for the bucket\n"},"gcsScopes":{"type":"array","items":{"type":"string"},"description":"The GCS scopes needed to be able to write in the bucket\n"},"logType":{"type":"string","description":"The type of logs to stream. Valid values are \u003cspan pulumi-lang-nodejs=\"`configuration`\" pulumi-lang-dotnet=\"`Configuration`\" pulumi-lang-go=\"`configuration`\" pulumi-lang-python=\"`configuration`\" pulumi-lang-yaml=\"`configuration`\" pulumi-lang-java=\"`configuration`\"\u003e`configuration`\u003c/span\u003e (configuration audit logs) and \u003cspan pulumi-lang-nodejs=\"`network`\" pulumi-lang-dotnet=\"`Network`\" pulumi-lang-go=\"`network`\" pulumi-lang-python=\"`network`\" pulumi-lang-yaml=\"`network`\" pulumi-lang-java=\"`network`\"\u003e`network`\u003c/span\u003e (network flow logs).\n"},"s3AccessKeyId":{"type":"string","description":"The S3 access key ID. Required if destination*type is s3 and s3*authentication_type is 'accesskey'.\n"},"s3AuthenticationType":{"type":"string","description":"The type of authentication to use for S3. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis \u003cspan pulumi-lang-nodejs=\"`s3`\" pulumi-lang-dotnet=\"`S3`\" pulumi-lang-go=\"`s3`\" pulumi-lang-python=\"`s3`\" pulumi-lang-yaml=\"`s3`\" pulumi-lang-java=\"`s3`\"\u003e`s3`\u003c/span\u003e. Valid values are \u003cspan pulumi-lang-nodejs=\"`accesskey`\" pulumi-lang-dotnet=\"`Accesskey`\" pulumi-lang-go=\"`accesskey`\" pulumi-lang-python=\"`accesskey`\" pulumi-lang-yaml=\"`accesskey`\" pulumi-lang-java=\"`accesskey`\"\u003e`accesskey`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`rolearn`\" pulumi-lang-dotnet=\"`Rolearn`\" pulumi-lang-go=\"`rolearn`\" pulumi-lang-python=\"`rolearn`\" pulumi-lang-yaml=\"`rolearn`\" pulumi-lang-java=\"`rolearn`\"\u003e`rolearn`\u003c/span\u003e. Tailscale recommends using \u003cspan pulumi-lang-nodejs=\"`rolearn`\" pulumi-lang-dotnet=\"`Rolearn`\" pulumi-lang-go=\"`rolearn`\" pulumi-lang-python=\"`rolearn`\" pulumi-lang-yaml=\"`rolearn`\" pulumi-lang-java=\"`rolearn`\"\u003e`rolearn`\u003c/span\u003e.\n"},"s3Bucket":{"type":"string","description":"The S3 bucket name. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n"},"s3ExternalId":{"type":"string","description":"The AWS External ID that Tailscale supplies when authenticating using role-based authentication. Required if destination*type is 's3' and s3*authentication*type is 'rolearn'. This can be obtained via the tailscale*aws*external*id resource.\n"},"s3KeyPrefix":{"type":"string","description":"An optional S3 key prefix to prepend to the auto-generated S3 key name.\n"},"s3Region":{"type":"string","description":"The region in which the S3 bucket is located. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n"},"s3RoleArn":{"type":"string","description":"ARN of the AWS IAM role that Tailscale should assume when using role-based authentication. Required if destination*type is 's3' and s3*authentication_type is 'rolearn'.\n"},"s3SecretAccessKey":{"type":"string","description":"The S3 secret access key. Required if destination*type is 's3' and s3*authentication_type is 'accesskey'.\n","secret":true},"token":{"type":"string","description":"The token/password with which log streams to this endpoint should be authenticated, required unless\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n","secret":true},"uploadPeriodMinutes":{"type":"integer","description":"An optional number of minutes to wait in between uploading new logs. If the quantity of logs does not fit within a single upload, multiple uploads will be made.\n"},"url":{"type":"string","description":"The URL to which log streams are being posted. If\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3' and you want to use the official Amazon S3 endpoint, leave this empty.\n"},"user":{"type":"string","description":"The username with which log streams to this endpoint are authenticated. Only required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 'elastic', defaults to 'user' if not set.\n"}},"required":["destinationType","logType"],"inputProperties":{"compressionFormat":{"type":"string","description":"The compression algorithm used for logs. Valid values are \u003cspan pulumi-lang-nodejs=\"`none`\" pulumi-lang-dotnet=\"`None`\" pulumi-lang-go=\"`none`\" pulumi-lang-python=\"`none`\" pulumi-lang-yaml=\"`none`\" pulumi-lang-java=\"`none`\"\u003e`none`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`zstd`\" pulumi-lang-dotnet=\"`Zstd`\" pulumi-lang-go=\"`zstd`\" pulumi-lang-python=\"`zstd`\" pulumi-lang-yaml=\"`zstd`\" pulumi-lang-java=\"`zstd`\"\u003e`zstd`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`gzip`\" pulumi-lang-dotnet=\"`Gzip`\" pulumi-lang-go=\"`gzip`\" pulumi-lang-python=\"`gzip`\" pulumi-lang-yaml=\"`gzip`\" pulumi-lang-java=\"`gzip`\"\u003e`gzip`\u003c/span\u003e. Defaults to \u003cspan pulumi-lang-nodejs=\"`none`\" pulumi-lang-dotnet=\"`None`\" pulumi-lang-go=\"`none`\" pulumi-lang-python=\"`none`\" pulumi-lang-yaml=\"`none`\" pulumi-lang-java=\"`none`\"\u003e`none`\u003c/span\u003e.\n"},"destinationType":{"type":"string","description":"The type of SIEM platform to stream to. Valid values are \u003cspan pulumi-lang-nodejs=\"`axiom`\" pulumi-lang-dotnet=\"`Axiom`\" pulumi-lang-go=\"`axiom`\" pulumi-lang-python=\"`axiom`\" pulumi-lang-yaml=\"`axiom`\" pulumi-lang-java=\"`axiom`\"\u003e`axiom`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`cribl`\" pulumi-lang-dotnet=\"`Cribl`\" pulumi-lang-go=\"`cribl`\" pulumi-lang-python=\"`cribl`\" pulumi-lang-yaml=\"`cribl`\" pulumi-lang-java=\"`cribl`\"\u003e`cribl`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`datadog`\" pulumi-lang-dotnet=\"`Datadog`\" pulumi-lang-go=\"`datadog`\" pulumi-lang-python=\"`datadog`\" pulumi-lang-yaml=\"`datadog`\" pulumi-lang-java=\"`datadog`\"\u003e`datadog`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`elastic`\" pulumi-lang-dotnet=\"`Elastic`\" pulumi-lang-go=\"`elastic`\" pulumi-lang-python=\"`elastic`\" pulumi-lang-yaml=\"`elastic`\" pulumi-lang-java=\"`elastic`\"\u003e`elastic`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`gcs`\" pulumi-lang-dotnet=\"`Gcs`\" pulumi-lang-go=\"`gcs`\" pulumi-lang-python=\"`gcs`\" pulumi-lang-yaml=\"`gcs`\" pulumi-lang-java=\"`gcs`\"\u003e`gcs`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`panther`\" pulumi-lang-dotnet=\"`Panther`\" pulumi-lang-go=\"`panther`\" pulumi-lang-python=\"`panther`\" pulumi-lang-yaml=\"`panther`\" pulumi-lang-java=\"`panther`\"\u003e`panther`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`splunk`\" pulumi-lang-dotnet=\"`Splunk`\" pulumi-lang-go=\"`splunk`\" pulumi-lang-python=\"`splunk`\" pulumi-lang-yaml=\"`splunk`\" pulumi-lang-java=\"`splunk`\"\u003e`splunk`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`s3`\" pulumi-lang-dotnet=\"`S3`\" pulumi-lang-go=\"`s3`\" pulumi-lang-python=\"`s3`\" pulumi-lang-yaml=\"`s3`\" pulumi-lang-java=\"`s3`\"\u003e`s3`\u003c/span\u003e.\n"},"gcsBucket":{"type":"string","description":"The name of the GCS bucket\n"},"gcsCredentials":{"type":"string","description":"The encoded string of JSON that is used to authenticate for workload identity in GCS\n"},"gcsKeyPrefix":{"type":"string","description":"The GCS key prefix for the bucket\n"},"gcsScopes":{"type":"array","items":{"type":"string"},"description":"The GCS scopes needed to be able to write in the bucket\n"},"logType":{"type":"string","description":"The type of logs to stream. Valid values are \u003cspan pulumi-lang-nodejs=\"`configuration`\" pulumi-lang-dotnet=\"`Configuration`\" pulumi-lang-go=\"`configuration`\" pulumi-lang-python=\"`configuration`\" pulumi-lang-yaml=\"`configuration`\" pulumi-lang-java=\"`configuration`\"\u003e`configuration`\u003c/span\u003e (configuration audit logs) and \u003cspan pulumi-lang-nodejs=\"`network`\" pulumi-lang-dotnet=\"`Network`\" pulumi-lang-go=\"`network`\" pulumi-lang-python=\"`network`\" pulumi-lang-yaml=\"`network`\" pulumi-lang-java=\"`network`\"\u003e`network`\u003c/span\u003e (network flow logs).\n","willReplaceOnChanges":true},"s3AccessKeyId":{"type":"string","description":"The S3 access key ID. Required if destination*type is s3 and s3*authentication_type is 'accesskey'.\n"},"s3AuthenticationType":{"type":"string","description":"The type of authentication to use for S3. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis \u003cspan pulumi-lang-nodejs=\"`s3`\" pulumi-lang-dotnet=\"`S3`\" pulumi-lang-go=\"`s3`\" pulumi-lang-python=\"`s3`\" pulumi-lang-yaml=\"`s3`\" pulumi-lang-java=\"`s3`\"\u003e`s3`\u003c/span\u003e. Valid values are \u003cspan pulumi-lang-nodejs=\"`accesskey`\" pulumi-lang-dotnet=\"`Accesskey`\" pulumi-lang-go=\"`accesskey`\" pulumi-lang-python=\"`accesskey`\" pulumi-lang-yaml=\"`accesskey`\" pulumi-lang-java=\"`accesskey`\"\u003e`accesskey`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`rolearn`\" pulumi-lang-dotnet=\"`Rolearn`\" pulumi-lang-go=\"`rolearn`\" pulumi-lang-python=\"`rolearn`\" pulumi-lang-yaml=\"`rolearn`\" pulumi-lang-java=\"`rolearn`\"\u003e`rolearn`\u003c/span\u003e. Tailscale recommends using \u003cspan pulumi-lang-nodejs=\"`rolearn`\" pulumi-lang-dotnet=\"`Rolearn`\" pulumi-lang-go=\"`rolearn`\" pulumi-lang-python=\"`rolearn`\" pulumi-lang-yaml=\"`rolearn`\" pulumi-lang-java=\"`rolearn`\"\u003e`rolearn`\u003c/span\u003e.\n"},"s3Bucket":{"type":"string","description":"The S3 bucket name. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n"},"s3ExternalId":{"type":"string","description":"The AWS External ID that Tailscale supplies when authenticating using role-based authentication. Required if destination*type is 's3' and s3*authentication*type is 'rolearn'. This can be obtained via the tailscale*aws*external*id resource.\n"},"s3KeyPrefix":{"type":"string","description":"An optional S3 key prefix to prepend to the auto-generated S3 key name.\n"},"s3Region":{"type":"string","description":"The region in which the S3 bucket is located. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n"},"s3RoleArn":{"type":"string","description":"ARN of the AWS IAM role that Tailscale should assume when using role-based authentication. Required if destination*type is 's3' and s3*authentication_type is 'rolearn'.\n"},"s3SecretAccessKey":{"type":"string","description":"The S3 secret access key. Required if destination*type is 's3' and s3*authentication_type is 'accesskey'.\n","secret":true},"token":{"type":"string","description":"The token/password with which log streams to this endpoint should be authenticated, required unless\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n","secret":true},"uploadPeriodMinutes":{"type":"integer","description":"An optional number of minutes to wait in between uploading new logs. If the quantity of logs does not fit within a single upload, multiple uploads will be made.\n"},"url":{"type":"string","description":"The URL to which log streams are being posted. If\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3' and you want to use the official Amazon S3 endpoint, leave this empty.\n"},"user":{"type":"string","description":"The username with which log streams to this endpoint are authenticated. Only required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 'elastic', defaults to 'user' if not set.\n"}},"requiredInputs":["destinationType","logType"],"stateInputs":{"description":"Input properties used for looking up and filtering LogstreamConfiguration resources.\n","properties":{"compressionFormat":{"type":"string","description":"The compression algorithm used for logs. Valid values are \u003cspan pulumi-lang-nodejs=\"`none`\" pulumi-lang-dotnet=\"`None`\" pulumi-lang-go=\"`none`\" pulumi-lang-python=\"`none`\" pulumi-lang-yaml=\"`none`\" pulumi-lang-java=\"`none`\"\u003e`none`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`zstd`\" pulumi-lang-dotnet=\"`Zstd`\" pulumi-lang-go=\"`zstd`\" pulumi-lang-python=\"`zstd`\" pulumi-lang-yaml=\"`zstd`\" pulumi-lang-java=\"`zstd`\"\u003e`zstd`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`gzip`\" pulumi-lang-dotnet=\"`Gzip`\" pulumi-lang-go=\"`gzip`\" pulumi-lang-python=\"`gzip`\" pulumi-lang-yaml=\"`gzip`\" pulumi-lang-java=\"`gzip`\"\u003e`gzip`\u003c/span\u003e. Defaults to \u003cspan pulumi-lang-nodejs=\"`none`\" pulumi-lang-dotnet=\"`None`\" pulumi-lang-go=\"`none`\" pulumi-lang-python=\"`none`\" pulumi-lang-yaml=\"`none`\" pulumi-lang-java=\"`none`\"\u003e`none`\u003c/span\u003e.\n"},"destinationType":{"type":"string","description":"The type of SIEM platform to stream to. Valid values are \u003cspan pulumi-lang-nodejs=\"`axiom`\" pulumi-lang-dotnet=\"`Axiom`\" pulumi-lang-go=\"`axiom`\" pulumi-lang-python=\"`axiom`\" pulumi-lang-yaml=\"`axiom`\" pulumi-lang-java=\"`axiom`\"\u003e`axiom`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`cribl`\" pulumi-lang-dotnet=\"`Cribl`\" pulumi-lang-go=\"`cribl`\" pulumi-lang-python=\"`cribl`\" pulumi-lang-yaml=\"`cribl`\" pulumi-lang-java=\"`cribl`\"\u003e`cribl`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`datadog`\" pulumi-lang-dotnet=\"`Datadog`\" pulumi-lang-go=\"`datadog`\" pulumi-lang-python=\"`datadog`\" pulumi-lang-yaml=\"`datadog`\" pulumi-lang-java=\"`datadog`\"\u003e`datadog`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`elastic`\" pulumi-lang-dotnet=\"`Elastic`\" pulumi-lang-go=\"`elastic`\" pulumi-lang-python=\"`elastic`\" pulumi-lang-yaml=\"`elastic`\" pulumi-lang-java=\"`elastic`\"\u003e`elastic`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`gcs`\" pulumi-lang-dotnet=\"`Gcs`\" pulumi-lang-go=\"`gcs`\" pulumi-lang-python=\"`gcs`\" pulumi-lang-yaml=\"`gcs`\" pulumi-lang-java=\"`gcs`\"\u003e`gcs`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`panther`\" pulumi-lang-dotnet=\"`Panther`\" pulumi-lang-go=\"`panther`\" pulumi-lang-python=\"`panther`\" pulumi-lang-yaml=\"`panther`\" pulumi-lang-java=\"`panther`\"\u003e`panther`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`splunk`\" pulumi-lang-dotnet=\"`Splunk`\" pulumi-lang-go=\"`splunk`\" pulumi-lang-python=\"`splunk`\" pulumi-lang-yaml=\"`splunk`\" pulumi-lang-java=\"`splunk`\"\u003e`splunk`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`s3`\" pulumi-lang-dotnet=\"`S3`\" pulumi-lang-go=\"`s3`\" pulumi-lang-python=\"`s3`\" pulumi-lang-yaml=\"`s3`\" pulumi-lang-java=\"`s3`\"\u003e`s3`\u003c/span\u003e.\n"},"gcsBucket":{"type":"string","description":"The name of the GCS bucket\n"},"gcsCredentials":{"type":"string","description":"The encoded string of JSON that is used to authenticate for workload identity in GCS\n"},"gcsKeyPrefix":{"type":"string","description":"The GCS key prefix for the bucket\n"},"gcsScopes":{"type":"array","items":{"type":"string"},"description":"The GCS scopes needed to be able to write in the bucket\n"},"logType":{"type":"string","description":"The type of logs to stream. Valid values are \u003cspan pulumi-lang-nodejs=\"`configuration`\" pulumi-lang-dotnet=\"`Configuration`\" pulumi-lang-go=\"`configuration`\" pulumi-lang-python=\"`configuration`\" pulumi-lang-yaml=\"`configuration`\" pulumi-lang-java=\"`configuration`\"\u003e`configuration`\u003c/span\u003e (configuration audit logs) and \u003cspan pulumi-lang-nodejs=\"`network`\" pulumi-lang-dotnet=\"`Network`\" pulumi-lang-go=\"`network`\" pulumi-lang-python=\"`network`\" pulumi-lang-yaml=\"`network`\" pulumi-lang-java=\"`network`\"\u003e`network`\u003c/span\u003e (network flow logs).\n","willReplaceOnChanges":true},"s3AccessKeyId":{"type":"string","description":"The S3 access key ID. Required if destination*type is s3 and s3*authentication_type is 'accesskey'.\n"},"s3AuthenticationType":{"type":"string","description":"The type of authentication to use for S3. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis \u003cspan pulumi-lang-nodejs=\"`s3`\" pulumi-lang-dotnet=\"`S3`\" pulumi-lang-go=\"`s3`\" pulumi-lang-python=\"`s3`\" pulumi-lang-yaml=\"`s3`\" pulumi-lang-java=\"`s3`\"\u003e`s3`\u003c/span\u003e. Valid values are \u003cspan pulumi-lang-nodejs=\"`accesskey`\" pulumi-lang-dotnet=\"`Accesskey`\" pulumi-lang-go=\"`accesskey`\" pulumi-lang-python=\"`accesskey`\" pulumi-lang-yaml=\"`accesskey`\" pulumi-lang-java=\"`accesskey`\"\u003e`accesskey`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`rolearn`\" pulumi-lang-dotnet=\"`Rolearn`\" pulumi-lang-go=\"`rolearn`\" pulumi-lang-python=\"`rolearn`\" pulumi-lang-yaml=\"`rolearn`\" pulumi-lang-java=\"`rolearn`\"\u003e`rolearn`\u003c/span\u003e. Tailscale recommends using \u003cspan pulumi-lang-nodejs=\"`rolearn`\" pulumi-lang-dotnet=\"`Rolearn`\" pulumi-lang-go=\"`rolearn`\" pulumi-lang-python=\"`rolearn`\" pulumi-lang-yaml=\"`rolearn`\" pulumi-lang-java=\"`rolearn`\"\u003e`rolearn`\u003c/span\u003e.\n"},"s3Bucket":{"type":"string","description":"The S3 bucket name. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n"},"s3ExternalId":{"type":"string","description":"The AWS External ID that Tailscale supplies when authenticating using role-based authentication. Required if destination*type is 's3' and s3*authentication*type is 'rolearn'. This can be obtained via the tailscale*aws*external*id resource.\n"},"s3KeyPrefix":{"type":"string","description":"An optional S3 key prefix to prepend to the auto-generated S3 key name.\n"},"s3Region":{"type":"string","description":"The region in which the S3 bucket is located. Required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n"},"s3RoleArn":{"type":"string","description":"ARN of the AWS IAM role that Tailscale should assume when using role-based authentication. Required if destination*type is 's3' and s3*authentication_type is 'rolearn'.\n"},"s3SecretAccessKey":{"type":"string","description":"The S3 secret access key. Required if destination*type is 's3' and s3*authentication_type is 'accesskey'.\n","secret":true},"token":{"type":"string","description":"The token/password with which log streams to this endpoint should be authenticated, required unless\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3'.\n","secret":true},"uploadPeriodMinutes":{"type":"integer","description":"An optional number of minutes to wait in between uploading new logs. If the quantity of logs does not fit within a single upload, multiple uploads will be made.\n"},"url":{"type":"string","description":"The URL to which log streams are being posted. If\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 's3' and you want to use the official Amazon S3 endpoint, leave this empty.\n"},"user":{"type":"string","description":"The username with which log streams to this endpoint are authenticated. Only required if\u003cspan pulumi-lang-nodejs=\" destinationType \" pulumi-lang-dotnet=\" DestinationType \" pulumi-lang-go=\" destinationType \" pulumi-lang-python=\" destination_type \" pulumi-lang-yaml=\" destinationType \" pulumi-lang-java=\" destinationType \"\u003e destination_type \u003c/span\u003eis 'elastic', defaults to 'user' if not set.\n"}},"type":"object"}},"tailscale:index/oauthClient:OauthClient":{"description":"The\u003cspan pulumi-lang-nodejs=\" oauthClient \" pulumi-lang-dotnet=\" OauthClient \" pulumi-lang-go=\" oauthClient \" pulumi-lang-python=\" oauth_client \" pulumi-lang-yaml=\" oauthClient \" pulumi-lang-java=\" oauthClient \"\u003e oauth_client \u003c/span\u003eresource allows you to create OAuth clients to programmatically interact with the Tailscale API.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleClient = new tailscale.OauthClient(\"sample_client\", {\n    description: \"sample client\",\n    scopes: [\"all:read\"],\n    tags: [\"tag:test\"],\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_client = tailscale.OauthClient(\"sample_client\",\n    description=\"sample client\",\n    scopes=[\"all:read\"],\n    tags=[\"tag:test\"])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleClient = new Tailscale.OauthClient(\"sample_client\", new()\n    {\n        Description = \"sample client\",\n        Scopes = new[]\n        {\n            \"all:read\",\n        },\n        Tags = new[]\n        {\n            \"tag:test\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewOauthClient(ctx, \"sample_client\", \u0026tailscale.OauthClientArgs{\n\t\t\tDescription: pulumi.String(\"sample client\"),\n\t\t\tScopes: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"all:read\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"tag:test\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.OauthClient;\nimport com.pulumi.tailscale.OauthClientArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleClient = new OauthClient(\"sampleClient\", OauthClientArgs.builder()\n            .description(\"sample client\")\n            .scopes(\"all:read\")\n            .tags(\"tag:test\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleClient:\n    type: tailscale:OauthClient\n    name: sample_client\n    properties:\n      description: sample client\n      scopes:\n        - all:read\n      tags:\n        - tag:test\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nNote: Sensitive fields such as the secret key are not returned by the API and will be unset in the Terraform state after import.\n\n```sh\n$ pulumi import tailscale:index/oauthClient:OauthClient example k1234511CNTRL\n```\n\n","properties":{"createdAt":{"type":"string","description":"The creation timestamp of the key in RFC3339 format\n"},"description":{"type":"string","description":"A description of the OAuth client consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"key":{"type":"string","description":"The client secret, also known as the key. Used with the client ID to generate access tokens.\n","secret":true},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"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 \u003cspan pulumi-lang-nodejs=\"\"authKeys\"\" pulumi-lang-dotnet=\"\"AuthKeys\"\" pulumi-lang-go=\"\"authKeys\"\" pulumi-lang-python=\"\"auth_keys\"\" pulumi-lang-yaml=\"\"authKeys\"\" pulumi-lang-java=\"\"authKeys\"\"\u003e\"auth_keys\"\u003c/span\u003e.\n"},"updatedAt":{"type":"string","description":"The updated timestamp of the key in RFC3339 format\n"},"userId":{"type":"string","description":"ID of the user who created this key, empty for OAuth clients created by other trust credentials.\n"}},"required":["createdAt","key","scopes","updatedAt","userId"],"inputProperties":{"description":{"type":"string","description":"A description of the OAuth client consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"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 \u003cspan pulumi-lang-nodejs=\"\"authKeys\"\" pulumi-lang-dotnet=\"\"AuthKeys\"\" pulumi-lang-go=\"\"authKeys\"\" pulumi-lang-python=\"\"auth_keys\"\" pulumi-lang-yaml=\"\"authKeys\"\" pulumi-lang-java=\"\"authKeys\"\"\u003e\"auth_keys\"\u003c/span\u003e.\n"}},"requiredInputs":["scopes"],"stateInputs":{"description":"Input properties used for looking up and filtering OauthClient resources.\n","properties":{"createdAt":{"type":"string","description":"The creation timestamp of the key in RFC3339 format\n"},"description":{"type":"string","description":"A description of the OAuth client consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"key":{"type":"string","description":"The client secret, also known as the key. Used with the client ID to generate access tokens.\n","secret":true},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant to the client. See https://tailscale.com/kb/1623/ for a list of available scopes.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"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 \u003cspan pulumi-lang-nodejs=\"\"authKeys\"\" pulumi-lang-dotnet=\"\"AuthKeys\"\" pulumi-lang-go=\"\"authKeys\"\" pulumi-lang-python=\"\"auth_keys\"\" pulumi-lang-yaml=\"\"authKeys\"\" pulumi-lang-java=\"\"authKeys\"\"\u003e\"auth_keys\"\u003c/span\u003e.\n"},"updatedAt":{"type":"string","description":"The updated timestamp of the key in RFC3339 format\n"},"userId":{"type":"string","description":"ID of the user who created this key, empty for OAuth clients created by other trust credentials.\n"}},"type":"object"}},"tailscale:index/postureIntegration:PostureIntegration":{"description":"The\u003cspan pulumi-lang-nodejs=\" postureIntegration \" pulumi-lang-dotnet=\" PostureIntegration \" pulumi-lang-go=\" postureIntegration \" pulumi-lang-python=\" posture_integration \" pulumi-lang-yaml=\" postureIntegration \" pulumi-lang-java=\" postureIntegration \"\u003e posture_integration \u003c/span\u003eresource allows you to manage integrations with device posture data providers. See https://tailscale.com/kb/1288/device-posture for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst samplePostureIntegration = new tailscale.PostureIntegration(\"sample_posture_integration\", {\n    postureProvider: \"falcon\",\n    cloudId: \"us-1\",\n    clientId: \"clientid1\",\n    clientSecret: \"test-secret1\",\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_posture_integration = tailscale.PostureIntegration(\"sample_posture_integration\",\n    posture_provider=\"falcon\",\n    cloud_id=\"us-1\",\n    client_id=\"clientid1\",\n    client_secret=\"test-secret1\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var samplePostureIntegration = new Tailscale.PostureIntegration(\"sample_posture_integration\", new()\n    {\n        PostureProvider = \"falcon\",\n        CloudId = \"us-1\",\n        ClientId = \"clientid1\",\n        ClientSecret = \"test-secret1\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewPostureIntegration(ctx, \"sample_posture_integration\", \u0026tailscale.PostureIntegrationArgs{\n\t\t\tPostureProvider: pulumi.String(\"falcon\"),\n\t\t\tCloudId:         pulumi.String(\"us-1\"),\n\t\t\tClientId:        pulumi.String(\"clientid1\"),\n\t\t\tClientSecret:    pulumi.String(\"test-secret1\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.PostureIntegration;\nimport com.pulumi.tailscale.PostureIntegrationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var samplePostureIntegration = new PostureIntegration(\"samplePostureIntegration\", PostureIntegrationArgs.builder()\n            .postureProvider(\"falcon\")\n            .cloudId(\"us-1\")\n            .clientId(\"clientid1\")\n            .clientSecret(\"test-secret1\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  samplePostureIntegration:\n    type: tailscale:PostureIntegration\n    name: sample_posture_integration\n    properties:\n      postureProvider: falcon\n      cloudId: us-1\n      clientId: clientid1\n      clientSecret: test-secret1\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nPosture integration can be imported using the posture integration id, e.g.,\n\n```sh\n$ pulumi import tailscale:index/postureIntegration:PostureIntegration sample_posture_integration 123456789\n```\n\n","properties":{"clientId":{"type":"string","description":"Unique identifier for your client.\n"},"clientSecret":{"type":"string","description":"The secret (auth key, token, etc.) used to authenticate with the provider.\n","secret":true},"cloudId":{"type":"string","description":"Identifies which of the provider's clouds to integrate with.\n"},"postureProvider":{"type":"string","description":"The third-party provider for posture data. Valid values are \u003cspan pulumi-lang-nodejs=\"`falcon`\" pulumi-lang-dotnet=\"`Falcon`\" pulumi-lang-go=\"`falcon`\" pulumi-lang-python=\"`falcon`\" pulumi-lang-yaml=\"`falcon`\" pulumi-lang-java=\"`falcon`\"\u003e`falcon`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`fleet`\" pulumi-lang-dotnet=\"`Fleet`\" pulumi-lang-go=\"`fleet`\" pulumi-lang-python=\"`fleet`\" pulumi-lang-yaml=\"`fleet`\" pulumi-lang-java=\"`fleet`\"\u003e`fleet`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`huntress`\" pulumi-lang-dotnet=\"`Huntress`\" pulumi-lang-go=\"`huntress`\" pulumi-lang-python=\"`huntress`\" pulumi-lang-yaml=\"`huntress`\" pulumi-lang-java=\"`huntress`\"\u003e`huntress`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`intune`\" pulumi-lang-dotnet=\"`Intune`\" pulumi-lang-go=\"`intune`\" pulumi-lang-python=\"`intune`\" pulumi-lang-yaml=\"`intune`\" pulumi-lang-java=\"`intune`\"\u003e`intune`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`jamfpro`\" pulumi-lang-dotnet=\"`Jamfpro`\" pulumi-lang-go=\"`jamfpro`\" pulumi-lang-python=\"`jamfpro`\" pulumi-lang-yaml=\"`jamfpro`\" pulumi-lang-java=\"`jamfpro`\"\u003e`jamfpro`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`kandji`\" pulumi-lang-dotnet=\"`Kandji`\" pulumi-lang-go=\"`kandji`\" pulumi-lang-python=\"`kandji`\" pulumi-lang-yaml=\"`kandji`\" pulumi-lang-java=\"`kandji`\"\u003e`kandji`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`kolide`\" pulumi-lang-dotnet=\"`Kolide`\" pulumi-lang-go=\"`kolide`\" pulumi-lang-python=\"`kolide`\" pulumi-lang-yaml=\"`kolide`\" pulumi-lang-java=\"`kolide`\"\u003e`kolide`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`sentinelone`\" pulumi-lang-dotnet=\"`Sentinelone`\" pulumi-lang-go=\"`sentinelone`\" pulumi-lang-python=\"`sentinelone`\" pulumi-lang-yaml=\"`sentinelone`\" pulumi-lang-java=\"`sentinelone`\"\u003e`sentinelone`\u003c/span\u003e.\n"},"tenantId":{"type":"string","description":"The Microsoft Intune directory (tenant) ID. For other providers, this is left blank.\n"}},"required":["clientSecret","postureProvider"],"inputProperties":{"clientId":{"type":"string","description":"Unique identifier for your client.\n"},"clientSecret":{"type":"string","description":"The secret (auth key, token, etc.) used to authenticate with the provider.\n","secret":true},"cloudId":{"type":"string","description":"Identifies which of the provider's clouds to integrate with.\n"},"postureProvider":{"type":"string","description":"The third-party provider for posture data. Valid values are \u003cspan pulumi-lang-nodejs=\"`falcon`\" pulumi-lang-dotnet=\"`Falcon`\" pulumi-lang-go=\"`falcon`\" pulumi-lang-python=\"`falcon`\" pulumi-lang-yaml=\"`falcon`\" pulumi-lang-java=\"`falcon`\"\u003e`falcon`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`fleet`\" pulumi-lang-dotnet=\"`Fleet`\" pulumi-lang-go=\"`fleet`\" pulumi-lang-python=\"`fleet`\" pulumi-lang-yaml=\"`fleet`\" pulumi-lang-java=\"`fleet`\"\u003e`fleet`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`huntress`\" pulumi-lang-dotnet=\"`Huntress`\" pulumi-lang-go=\"`huntress`\" pulumi-lang-python=\"`huntress`\" pulumi-lang-yaml=\"`huntress`\" pulumi-lang-java=\"`huntress`\"\u003e`huntress`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`intune`\" pulumi-lang-dotnet=\"`Intune`\" pulumi-lang-go=\"`intune`\" pulumi-lang-python=\"`intune`\" pulumi-lang-yaml=\"`intune`\" pulumi-lang-java=\"`intune`\"\u003e`intune`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`jamfpro`\" pulumi-lang-dotnet=\"`Jamfpro`\" pulumi-lang-go=\"`jamfpro`\" pulumi-lang-python=\"`jamfpro`\" pulumi-lang-yaml=\"`jamfpro`\" pulumi-lang-java=\"`jamfpro`\"\u003e`jamfpro`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`kandji`\" pulumi-lang-dotnet=\"`Kandji`\" pulumi-lang-go=\"`kandji`\" pulumi-lang-python=\"`kandji`\" pulumi-lang-yaml=\"`kandji`\" pulumi-lang-java=\"`kandji`\"\u003e`kandji`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`kolide`\" pulumi-lang-dotnet=\"`Kolide`\" pulumi-lang-go=\"`kolide`\" pulumi-lang-python=\"`kolide`\" pulumi-lang-yaml=\"`kolide`\" pulumi-lang-java=\"`kolide`\"\u003e`kolide`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`sentinelone`\" pulumi-lang-dotnet=\"`Sentinelone`\" pulumi-lang-go=\"`sentinelone`\" pulumi-lang-python=\"`sentinelone`\" pulumi-lang-yaml=\"`sentinelone`\" pulumi-lang-java=\"`sentinelone`\"\u003e`sentinelone`\u003c/span\u003e.\n","willReplaceOnChanges":true},"tenantId":{"type":"string","description":"The Microsoft Intune directory (tenant) ID. For other providers, this is left blank.\n"}},"requiredInputs":["clientSecret","postureProvider"],"stateInputs":{"description":"Input properties used for looking up and filtering PostureIntegration resources.\n","properties":{"clientId":{"type":"string","description":"Unique identifier for your client.\n"},"clientSecret":{"type":"string","description":"The secret (auth key, token, etc.) used to authenticate with the provider.\n","secret":true},"cloudId":{"type":"string","description":"Identifies which of the provider's clouds to integrate with.\n"},"postureProvider":{"type":"string","description":"The third-party provider for posture data. Valid values are \u003cspan pulumi-lang-nodejs=\"`falcon`\" pulumi-lang-dotnet=\"`Falcon`\" pulumi-lang-go=\"`falcon`\" pulumi-lang-python=\"`falcon`\" pulumi-lang-yaml=\"`falcon`\" pulumi-lang-java=\"`falcon`\"\u003e`falcon`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`fleet`\" pulumi-lang-dotnet=\"`Fleet`\" pulumi-lang-go=\"`fleet`\" pulumi-lang-python=\"`fleet`\" pulumi-lang-yaml=\"`fleet`\" pulumi-lang-java=\"`fleet`\"\u003e`fleet`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`huntress`\" pulumi-lang-dotnet=\"`Huntress`\" pulumi-lang-go=\"`huntress`\" pulumi-lang-python=\"`huntress`\" pulumi-lang-yaml=\"`huntress`\" pulumi-lang-java=\"`huntress`\"\u003e`huntress`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`intune`\" pulumi-lang-dotnet=\"`Intune`\" pulumi-lang-go=\"`intune`\" pulumi-lang-python=\"`intune`\" pulumi-lang-yaml=\"`intune`\" pulumi-lang-java=\"`intune`\"\u003e`intune`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`jamfpro`\" pulumi-lang-dotnet=\"`Jamfpro`\" pulumi-lang-go=\"`jamfpro`\" pulumi-lang-python=\"`jamfpro`\" pulumi-lang-yaml=\"`jamfpro`\" pulumi-lang-java=\"`jamfpro`\"\u003e`jamfpro`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`kandji`\" pulumi-lang-dotnet=\"`Kandji`\" pulumi-lang-go=\"`kandji`\" pulumi-lang-python=\"`kandji`\" pulumi-lang-yaml=\"`kandji`\" pulumi-lang-java=\"`kandji`\"\u003e`kandji`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`kolide`\" pulumi-lang-dotnet=\"`Kolide`\" pulumi-lang-go=\"`kolide`\" pulumi-lang-python=\"`kolide`\" pulumi-lang-yaml=\"`kolide`\" pulumi-lang-java=\"`kolide`\"\u003e`kolide`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`sentinelone`\" pulumi-lang-dotnet=\"`Sentinelone`\" pulumi-lang-go=\"`sentinelone`\" pulumi-lang-python=\"`sentinelone`\" pulumi-lang-yaml=\"`sentinelone`\" pulumi-lang-java=\"`sentinelone`\"\u003e`sentinelone`\u003c/span\u003e.\n","willReplaceOnChanges":true},"tenantId":{"type":"string","description":"The Microsoft Intune directory (tenant) ID. For other providers, this is left blank.\n"}},"type":"object"}},"tailscale:index/tailnetKey:TailnetKey":{"description":"The\u003cspan pulumi-lang-nodejs=\" tailnetKey \" pulumi-lang-dotnet=\" TailnetKey \" pulumi-lang-go=\" tailnetKey \" pulumi-lang-python=\" tailnet_key \" pulumi-lang-yaml=\" tailnetKey \" pulumi-lang-java=\" tailnetKey \"\u003e tailnet_key \u003c/span\u003eresource allows you to create pre-authentication keys that can register new nodes without needing to sign in via a web browser. See https://tailscale.com/kb/1085/auth-keys for more information\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleKey = new tailscale.TailnetKey(\"sample_key\", {\n    reusable: true,\n    ephemeral: false,\n    preauthorized: true,\n    expiry: 3600,\n    description: \"Sample key\",\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_key = tailscale.TailnetKey(\"sample_key\",\n    reusable=True,\n    ephemeral=False,\n    preauthorized=True,\n    expiry=3600,\n    description=\"Sample key\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleKey = new Tailscale.TailnetKey(\"sample_key\", new()\n    {\n        Reusable = true,\n        Ephemeral = false,\n        Preauthorized = true,\n        Expiry = 3600,\n        Description = \"Sample key\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewTailnetKey(ctx, \"sample_key\", \u0026tailscale.TailnetKeyArgs{\n\t\t\tReusable:      pulumi.Bool(true),\n\t\t\tEphemeral:     pulumi.Bool(false),\n\t\t\tPreauthorized: pulumi.Bool(true),\n\t\t\tExpiry:        pulumi.Int(3600),\n\t\t\tDescription:   pulumi.String(\"Sample key\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailnetKey;\nimport com.pulumi.tailscale.TailnetKeyArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleKey = new TailnetKey(\"sampleKey\", TailnetKeyArgs.builder()\n            .reusable(true)\n            .ephemeral(false)\n            .preauthorized(true)\n            .expiry(3600)\n            .description(\"Sample key\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleKey:\n    type: tailscale:TailnetKey\n    name: sample_key\n    properties:\n      reusable: true\n      ephemeral: false\n      preauthorized: true\n      expiry: 3600\n      description: Sample key\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nTailnet key can be imported using the key id, e.g.,\n\n```sh\n$ pulumi import tailscale:index/tailnetKey:TailnetKey sample_key 123456789\n```\n\n\u003e ** Note ** the \u003cspan pulumi-lang-nodejs=\"`key`\" pulumi-lang-dotnet=\"`Key`\" pulumi-lang-go=\"`key`\" pulumi-lang-python=\"`key`\" pulumi-lang-yaml=\"`key`\" pulumi-lang-java=\"`key`\"\u003e`key`\u003c/span\u003e attribute will not be populated on import as this attribute is only populated\non resource creation.\n\n","properties":{"createdAt":{"type":"string","description":"The creation timestamp of the key in RFC3339 format\n"},"description":{"type":"string","description":"A description of the key consisting of alphanumeric characters. Defaults to `\"\"`.\n"},"ephemeral":{"type":"boolean","description":"Indicates if the key is ephemeral. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n"},"expiresAt":{"type":"string","description":"The expiry timestamp of the key in RFC3339 format\n"},"expiry":{"type":"integer","description":"The expiry of the key in seconds. Defaults to \u003cspan pulumi-lang-nodejs=\"`7776000`\" pulumi-lang-dotnet=\"`7776000`\" pulumi-lang-go=\"`7776000`\" pulumi-lang-python=\"`7776000`\" pulumi-lang-yaml=\"`7776000`\" pulumi-lang-java=\"`7776000`\"\u003e`7776000`\u003c/span\u003e (90 days).\n"},"invalid":{"type":"boolean","description":"Indicates whether the key is invalid (e.g. expired, revoked or has been deleted).\n"},"key":{"type":"string","description":"The authentication key\n","secret":true},"preauthorized":{"type":"boolean","description":"Determines whether or not the machines authenticated by the key will be authorized for the tailnet by default. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n"},"recreateIfInvalid":{"type":"string","description":"Determines whether the key should be created again if it becomes invalid. By default, reusable keys will be recreated, but single-use keys will not. Possible values: 'always', 'never'.\n"},"reusable":{"type":"boolean","description":"Indicates if the key is reusable or single-use. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n"},"tags":{"type":"array","items":{"type":"string"},"description":"List of tags to apply to the machines authenticated by the key.\n"},"userId":{"type":"string","description":"ID of the user who created this key, empty for keys created by OAuth clients.\n"}},"required":["createdAt","expiresAt","expiry","invalid","key","userId"],"inputProperties":{"description":{"type":"string","description":"A description of the key consisting of alphanumeric characters. Defaults to `\"\"`.\n","willReplaceOnChanges":true},"ephemeral":{"type":"boolean","description":"Indicates if the key is ephemeral. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n","willReplaceOnChanges":true},"expiry":{"type":"integer","description":"The expiry of the key in seconds. Defaults to \u003cspan pulumi-lang-nodejs=\"`7776000`\" pulumi-lang-dotnet=\"`7776000`\" pulumi-lang-go=\"`7776000`\" pulumi-lang-python=\"`7776000`\" pulumi-lang-yaml=\"`7776000`\" pulumi-lang-java=\"`7776000`\"\u003e`7776000`\u003c/span\u003e (90 days).\n","willReplaceOnChanges":true},"preauthorized":{"type":"boolean","description":"Determines whether or not the machines authenticated by the key will be authorized for the tailnet by default. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n","willReplaceOnChanges":true},"recreateIfInvalid":{"type":"string","description":"Determines whether the key should be created again if it becomes invalid. By default, reusable keys will be recreated, but single-use keys will not. Possible values: 'always', 'never'.\n"},"reusable":{"type":"boolean","description":"Indicates if the key is reusable or single-use. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n","willReplaceOnChanges":true},"tags":{"type":"array","items":{"type":"string"},"description":"List of tags to apply to the machines authenticated by the key.\n","willReplaceOnChanges":true},"userId":{"type":"string","description":"ID of the user who created this key, empty for keys created by OAuth clients.\n"}},"stateInputs":{"description":"Input properties used for looking up and filtering TailnetKey resources.\n","properties":{"createdAt":{"type":"string","description":"The creation timestamp of the key in RFC3339 format\n"},"description":{"type":"string","description":"A description of the key consisting of alphanumeric characters. Defaults to `\"\"`.\n","willReplaceOnChanges":true},"ephemeral":{"type":"boolean","description":"Indicates if the key is ephemeral. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n","willReplaceOnChanges":true},"expiresAt":{"type":"string","description":"The expiry timestamp of the key in RFC3339 format\n"},"expiry":{"type":"integer","description":"The expiry of the key in seconds. Defaults to \u003cspan pulumi-lang-nodejs=\"`7776000`\" pulumi-lang-dotnet=\"`7776000`\" pulumi-lang-go=\"`7776000`\" pulumi-lang-python=\"`7776000`\" pulumi-lang-yaml=\"`7776000`\" pulumi-lang-java=\"`7776000`\"\u003e`7776000`\u003c/span\u003e (90 days).\n","willReplaceOnChanges":true},"invalid":{"type":"boolean","description":"Indicates whether the key is invalid (e.g. expired, revoked or has been deleted).\n"},"key":{"type":"string","description":"The authentication key\n","secret":true},"preauthorized":{"type":"boolean","description":"Determines whether or not the machines authenticated by the key will be authorized for the tailnet by default. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n","willReplaceOnChanges":true},"recreateIfInvalid":{"type":"string","description":"Determines whether the key should be created again if it becomes invalid. By default, reusable keys will be recreated, but single-use keys will not. Possible values: 'always', 'never'.\n"},"reusable":{"type":"boolean","description":"Indicates if the key is reusable or single-use. Defaults to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e.\n","willReplaceOnChanges":true},"tags":{"type":"array","items":{"type":"string"},"description":"List of tags to apply to the machines authenticated by the key.\n","willReplaceOnChanges":true},"userId":{"type":"string","description":"ID of the user who created this key, empty for keys created by OAuth clients.\n"}},"type":"object"}},"tailscale:index/tailnetSettings:TailnetSettings":{"description":"The\u003cspan pulumi-lang-nodejs=\" tailnetSettings \" pulumi-lang-dotnet=\" TailnetSettings \" pulumi-lang-go=\" tailnetSettings \" pulumi-lang-python=\" tailnet_settings \" pulumi-lang-yaml=\" tailnetSettings \" pulumi-lang-java=\" tailnetSettings \"\u003e tailnet_settings \u003c/span\u003eresource allows you to configure settings for your tailnet. See https://tailscale.com/api#tag/tailnetsettings for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleTailnetSettings = new tailscale.TailnetSettings(\"sample_tailnet_settings\", {\n    aclsExternallyManagedOn: true,\n    aclsExternalLink: \"https://github.com/octocat/Hello-World\",\n    devicesApprovalOn: true,\n    devicesAutoUpdatesOn: true,\n    devicesKeyDurationDays: 5,\n    usersApprovalOn: true,\n    usersRoleAllowedToJoinExternalTailnet: \"member\",\n    postureIdentityCollectionOn: true,\n    httpsEnabled: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_tailnet_settings = tailscale.TailnetSettings(\"sample_tailnet_settings\",\n    acls_externally_managed_on=True,\n    acls_external_link=\"https://github.com/octocat/Hello-World\",\n    devices_approval_on=True,\n    devices_auto_updates_on=True,\n    devices_key_duration_days=5,\n    users_approval_on=True,\n    users_role_allowed_to_join_external_tailnet=\"member\",\n    posture_identity_collection_on=True,\n    https_enabled=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleTailnetSettings = new Tailscale.TailnetSettings(\"sample_tailnet_settings\", new()\n    {\n        AclsExternallyManagedOn = true,\n        AclsExternalLink = \"https://github.com/octocat/Hello-World\",\n        DevicesApprovalOn = true,\n        DevicesAutoUpdatesOn = true,\n        DevicesKeyDurationDays = 5,\n        UsersApprovalOn = true,\n        UsersRoleAllowedToJoinExternalTailnet = \"member\",\n        PostureIdentityCollectionOn = true,\n        HttpsEnabled = true,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewTailnetSettings(ctx, \"sample_tailnet_settings\", \u0026tailscale.TailnetSettingsArgs{\n\t\t\tAclsExternallyManagedOn:               pulumi.Bool(true),\n\t\t\tAclsExternalLink:                      pulumi.String(\"https://github.com/octocat/Hello-World\"),\n\t\t\tDevicesApprovalOn:                     pulumi.Bool(true),\n\t\t\tDevicesAutoUpdatesOn:                  pulumi.Bool(true),\n\t\t\tDevicesKeyDurationDays:                pulumi.Int(5),\n\t\t\tUsersApprovalOn:                       pulumi.Bool(true),\n\t\t\tUsersRoleAllowedToJoinExternalTailnet: pulumi.String(\"member\"),\n\t\t\tPostureIdentityCollectionOn:           pulumi.Bool(true),\n\t\t\tHttpsEnabled:                          pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailnetSettings;\nimport com.pulumi.tailscale.TailnetSettingsArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleTailnetSettings = new TailnetSettings(\"sampleTailnetSettings\", TailnetSettingsArgs.builder()\n            .aclsExternallyManagedOn(true)\n            .aclsExternalLink(\"https://github.com/octocat/Hello-World\")\n            .devicesApprovalOn(true)\n            .devicesAutoUpdatesOn(true)\n            .devicesKeyDurationDays(5)\n            .usersApprovalOn(true)\n            .usersRoleAllowedToJoinExternalTailnet(\"member\")\n            .postureIdentityCollectionOn(true)\n            .httpsEnabled(true)\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleTailnetSettings:\n    type: tailscale:TailnetSettings\n    name: sample_tailnet_settings\n    properties:\n      aclsExternallyManagedOn: true\n      aclsExternalLink: https://github.com/octocat/Hello-World\n      devicesApprovalOn: true\n      devicesAutoUpdatesOn: true\n      devicesKeyDurationDays: 5\n      usersApprovalOn: true\n      usersRoleAllowedToJoinExternalTailnet: member\n      postureIdentityCollectionOn: true\n      httpsEnabled: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nID doesn't matter.\n\n```sh\n$ pulumi import tailscale:index/tailnetSettings:TailnetSettings sample_preferences tailnet_settings\n```\n\n","properties":{"aclsExternalLink":{"type":"string","description":"Link to your external ACL definition or management system. Must be a valid URL.\n"},"aclsExternallyManagedOn":{"type":"boolean","description":"Prevent users from editing policies in the admin console to avoid conflicts with external management workflows like GitOps or Terraform.\n"},"devicesApprovalOn":{"type":"boolean","description":"Whether device approval is enabled for the tailnet\n"},"devicesAutoUpdatesOn":{"type":"boolean","description":"Whether auto updates are enabled for devices that belong to this tailnet\n"},"devicesKeyDurationDays":{"type":"integer","description":"The key expiry duration for devices on this tailnet\n"},"httpsEnabled":{"type":"boolean","description":"Whether provisioning of HTTPS certificates is enabled for the tailnet\n"},"networkFlowLoggingOn":{"type":"boolean","description":"Whether network flow logs are enabled for the tailnet\n"},"postureIdentityCollectionOn":{"type":"boolean","description":"Whether identity collection is enabled for device posture integrations for the tailnet\n"},"regionalRoutingOn":{"type":"boolean","description":"Whether regional routing is enabled for the tailnet\n"},"usersApprovalOn":{"type":"boolean","description":"Whether user approval is enabled for this tailnet\n"},"usersRoleAllowedToJoinExternalTailnet":{"type":"string","description":"Which user roles are allowed to join external tailnets\n"}},"required":["aclsExternalLink","aclsExternallyManagedOn","devicesApprovalOn","devicesAutoUpdatesOn","devicesKeyDurationDays","httpsEnabled","networkFlowLoggingOn","postureIdentityCollectionOn","regionalRoutingOn","usersApprovalOn","usersRoleAllowedToJoinExternalTailnet"],"inputProperties":{"aclsExternalLink":{"type":"string","description":"Link to your external ACL definition or management system. Must be a valid URL.\n"},"aclsExternallyManagedOn":{"type":"boolean","description":"Prevent users from editing policies in the admin console to avoid conflicts with external management workflows like GitOps or Terraform.\n"},"devicesApprovalOn":{"type":"boolean","description":"Whether device approval is enabled for the tailnet\n"},"devicesAutoUpdatesOn":{"type":"boolean","description":"Whether auto updates are enabled for devices that belong to this tailnet\n"},"devicesKeyDurationDays":{"type":"integer","description":"The key expiry duration for devices on this tailnet\n"},"httpsEnabled":{"type":"boolean","description":"Whether provisioning of HTTPS certificates is enabled for the tailnet\n"},"networkFlowLoggingOn":{"type":"boolean","description":"Whether network flow logs are enabled for the tailnet\n"},"postureIdentityCollectionOn":{"type":"boolean","description":"Whether identity collection is enabled for device posture integrations for the tailnet\n"},"regionalRoutingOn":{"type":"boolean","description":"Whether regional routing is enabled for the tailnet\n"},"usersApprovalOn":{"type":"boolean","description":"Whether user approval is enabled for this tailnet\n"},"usersRoleAllowedToJoinExternalTailnet":{"type":"string","description":"Which user roles are allowed to join external tailnets\n"}},"stateInputs":{"description":"Input properties used for looking up and filtering TailnetSettings resources.\n","properties":{"aclsExternalLink":{"type":"string","description":"Link to your external ACL definition or management system. Must be a valid URL.\n"},"aclsExternallyManagedOn":{"type":"boolean","description":"Prevent users from editing policies in the admin console to avoid conflicts with external management workflows like GitOps or Terraform.\n"},"devicesApprovalOn":{"type":"boolean","description":"Whether device approval is enabled for the tailnet\n"},"devicesAutoUpdatesOn":{"type":"boolean","description":"Whether auto updates are enabled for devices that belong to this tailnet\n"},"devicesKeyDurationDays":{"type":"integer","description":"The key expiry duration for devices on this tailnet\n"},"httpsEnabled":{"type":"boolean","description":"Whether provisioning of HTTPS certificates is enabled for the tailnet\n"},"networkFlowLoggingOn":{"type":"boolean","description":"Whether network flow logs are enabled for the tailnet\n"},"postureIdentityCollectionOn":{"type":"boolean","description":"Whether identity collection is enabled for device posture integrations for the tailnet\n"},"regionalRoutingOn":{"type":"boolean","description":"Whether regional routing is enabled for the tailnet\n"},"usersApprovalOn":{"type":"boolean","description":"Whether user approval is enabled for this tailnet\n"},"usersRoleAllowedToJoinExternalTailnet":{"type":"string","description":"Which user roles are allowed to join external tailnets\n"}},"type":"object"}},"tailscale:index/webhook:Webhook":{"description":"The webhook resource allows you to configure webhook endpoints for your Tailscale network. See https://tailscale.com/kb/1213/webhooks for more information.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleWebhook = new tailscale.Webhook(\"sample_webhook\", {\n    endpointUrl: \"https://example.com/webhook/endpoint\",\n    providerType: \"slack\",\n    subscriptions: [\n        \"nodeCreated\",\n        \"userDeleted\",\n    ],\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_webhook = tailscale.Webhook(\"sample_webhook\",\n    endpoint_url=\"https://example.com/webhook/endpoint\",\n    provider_type=\"slack\",\n    subscriptions=[\n        \"nodeCreated\",\n        \"userDeleted\",\n    ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleWebhook = new Tailscale.Webhook(\"sample_webhook\", new()\n    {\n        EndpointUrl = \"https://example.com/webhook/endpoint\",\n        ProviderType = \"slack\",\n        Subscriptions = new[]\n        {\n            \"nodeCreated\",\n            \"userDeleted\",\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.NewWebhook(ctx, \"sample_webhook\", \u0026tailscale.WebhookArgs{\n\t\t\tEndpointUrl:  pulumi.String(\"https://example.com/webhook/endpoint\"),\n\t\t\tProviderType: pulumi.String(\"slack\"),\n\t\t\tSubscriptions: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"nodeCreated\"),\n\t\t\t\tpulumi.String(\"userDeleted\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.Webhook;\nimport com.pulumi.tailscale.WebhookArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var sampleWebhook = new Webhook(\"sampleWebhook\", WebhookArgs.builder()\n            .endpointUrl(\"https://example.com/webhook/endpoint\")\n            .providerType(\"slack\")\n            .subscriptions(            \n                \"nodeCreated\",\n                \"userDeleted\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  sampleWebhook:\n    type: tailscale:Webhook\n    name: sample_webhook\n    properties:\n      endpointUrl: https://example.com/webhook/endpoint\n      providerType: slack\n      subscriptions:\n        - nodeCreated\n        - userDeleted\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nWebhooks can be imported using the endpoint id, e.g.,\n\n```sh\n$ pulumi import tailscale:index/webhook:Webhook sample_webhook 123456789\n```\n\n","properties":{"endpointUrl":{"type":"string","description":"The endpoint to send webhook events to.\n"},"providerType":{"type":"string","description":"The provider type of the endpoint URL. This determines the payload format sent to the destination. Valid values are \u003cspan pulumi-lang-nodejs=\"`slack`\" pulumi-lang-dotnet=\"`Slack`\" pulumi-lang-go=\"`slack`\" pulumi-lang-python=\"`slack`\" pulumi-lang-yaml=\"`slack`\" pulumi-lang-java=\"`slack`\"\u003e`slack`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`mattermost`\" pulumi-lang-dotnet=\"`Mattermost`\" pulumi-lang-go=\"`mattermost`\" pulumi-lang-python=\"`mattermost`\" pulumi-lang-yaml=\"`mattermost`\" pulumi-lang-java=\"`mattermost`\"\u003e`mattermost`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`googlechat`\" pulumi-lang-dotnet=\"`Googlechat`\" pulumi-lang-go=\"`googlechat`\" pulumi-lang-python=\"`googlechat`\" pulumi-lang-yaml=\"`googlechat`\" pulumi-lang-java=\"`googlechat`\"\u003e`googlechat`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`discord`\" pulumi-lang-dotnet=\"`Discord`\" pulumi-lang-go=\"`discord`\" pulumi-lang-python=\"`discord`\" pulumi-lang-yaml=\"`discord`\" pulumi-lang-java=\"`discord`\"\u003e`discord`\u003c/span\u003e.\n"},"secret":{"type":"string","description":"The secret used for signing webhook payloads. Only set on resource creation. See https://tailscale.com/kb/1213/webhooks#webhook-secret for more information.\n","secret":true},"subscriptions":{"type":"array","items":{"type":"string"},"description":"The set of events that trigger this webhook. For a full list of event types, see the [webhooks documentation](https://tailscale.com/kb/1213/webhooks#events).\n"}},"required":["endpointUrl","secret","subscriptions"],"inputProperties":{"endpointUrl":{"type":"string","description":"The endpoint to send webhook events to.\n","willReplaceOnChanges":true},"providerType":{"type":"string","description":"The provider type of the endpoint URL. This determines the payload format sent to the destination. Valid values are \u003cspan pulumi-lang-nodejs=\"`slack`\" pulumi-lang-dotnet=\"`Slack`\" pulumi-lang-go=\"`slack`\" pulumi-lang-python=\"`slack`\" pulumi-lang-yaml=\"`slack`\" pulumi-lang-java=\"`slack`\"\u003e`slack`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`mattermost`\" pulumi-lang-dotnet=\"`Mattermost`\" pulumi-lang-go=\"`mattermost`\" pulumi-lang-python=\"`mattermost`\" pulumi-lang-yaml=\"`mattermost`\" pulumi-lang-java=\"`mattermost`\"\u003e`mattermost`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`googlechat`\" pulumi-lang-dotnet=\"`Googlechat`\" pulumi-lang-go=\"`googlechat`\" pulumi-lang-python=\"`googlechat`\" pulumi-lang-yaml=\"`googlechat`\" pulumi-lang-java=\"`googlechat`\"\u003e`googlechat`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`discord`\" pulumi-lang-dotnet=\"`Discord`\" pulumi-lang-go=\"`discord`\" pulumi-lang-python=\"`discord`\" pulumi-lang-yaml=\"`discord`\" pulumi-lang-java=\"`discord`\"\u003e`discord`\u003c/span\u003e.\n","willReplaceOnChanges":true},"subscriptions":{"type":"array","items":{"type":"string"},"description":"The set of events that trigger this webhook. For a full list of event types, see the [webhooks documentation](https://tailscale.com/kb/1213/webhooks#events).\n"}},"requiredInputs":["endpointUrl","subscriptions"],"stateInputs":{"description":"Input properties used for looking up and filtering Webhook resources.\n","properties":{"endpointUrl":{"type":"string","description":"The endpoint to send webhook events to.\n","willReplaceOnChanges":true},"providerType":{"type":"string","description":"The provider type of the endpoint URL. This determines the payload format sent to the destination. Valid values are \u003cspan pulumi-lang-nodejs=\"`slack`\" pulumi-lang-dotnet=\"`Slack`\" pulumi-lang-go=\"`slack`\" pulumi-lang-python=\"`slack`\" pulumi-lang-yaml=\"`slack`\" pulumi-lang-java=\"`slack`\"\u003e`slack`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`mattermost`\" pulumi-lang-dotnet=\"`Mattermost`\" pulumi-lang-go=\"`mattermost`\" pulumi-lang-python=\"`mattermost`\" pulumi-lang-yaml=\"`mattermost`\" pulumi-lang-java=\"`mattermost`\"\u003e`mattermost`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`googlechat`\" pulumi-lang-dotnet=\"`Googlechat`\" pulumi-lang-go=\"`googlechat`\" pulumi-lang-python=\"`googlechat`\" pulumi-lang-yaml=\"`googlechat`\" pulumi-lang-java=\"`googlechat`\"\u003e`googlechat`\u003c/span\u003e, and \u003cspan pulumi-lang-nodejs=\"`discord`\" pulumi-lang-dotnet=\"`Discord`\" pulumi-lang-go=\"`discord`\" pulumi-lang-python=\"`discord`\" pulumi-lang-yaml=\"`discord`\" pulumi-lang-java=\"`discord`\"\u003e`discord`\u003c/span\u003e.\n","willReplaceOnChanges":true},"secret":{"type":"string","description":"The secret used for signing webhook payloads. Only set on resource creation. See https://tailscale.com/kb/1213/webhooks#webhook-secret for more information.\n","secret":true},"subscriptions":{"type":"array","items":{"type":"string"},"description":"The set of events that trigger this webhook. For a full list of event types, see the [webhooks documentation](https://tailscale.com/kb/1213/webhooks#events).\n"}},"type":"object"}}},"functions":{"pulumi:providers:tailscale/terraformConfig":{"description":"This function returns a Terraform config object with terraform-namecased keys,to be used with the Terraform Module Provider.","inputs":{"properties":{"__self__":{"type":"ref","$ref":"#/provider"}},"type":"pulumi:providers:tailscale/terraformConfig","required":["__self__"]},"outputs":{"properties":{"result":{"additionalProperties":{"$ref":"pulumi.json#/Any"},"type":"object"}},"required":["result"],"type":"object"}},"tailscale:index/get4Via6:get4Via6":{"description":"The 4via6 data source is calculates an IPv6 prefix for a given site ID and IPv4 CIDR. See Tailscale documentation for [4via6 subnets](https://tailscale.com/kb/1201/4via6-subnets/) for more details.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst example = tailscale.get4Via6({\n    site: 7,\n    cidr: \"10.1.1.0/24\",\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nexample = tailscale.get4_via6(site=7,\n    cidr=\"10.1.1.0/24\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var example = Tailscale.Get4Via6.Invoke(new()\n    {\n        Site = 7,\n        Cidr = \"10.1.1.0/24\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.Get4Via6(ctx, \u0026tailscale.Get4Via6Args{\n\t\t\tSite: 7,\n\t\t\tCidr: \"10.1.1.0/24\",\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.Get4Via6Args;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var example = TailscaleFunctions.get4Via6(Get4Via6Args.builder()\n            .site(7)\n            .cidr(\"10.1.1.0/24\")\n            .build());\n\n    }\n}\n```\n```yaml\nvariables:\n  example:\n    fn::invoke:\n      function: tailscale:get4Via6\n      arguments:\n        site: 7\n        cidr: 10.1.1.0/24\n```\n\u003c!--End PulumiCodeChooser --\u003e\n","inputs":{"description":"A collection of arguments for invoking get4Via6.\n","properties":{"cidr":{"type":"string","description":"The IPv4 CIDR to map\n"},"site":{"type":"integer","description":"Site ID (between 0 and 65535)\n"}},"type":"object","required":["cidr","site"]},"outputs":{"description":"A collection of values returned by get4Via6.\n","properties":{"cidr":{"description":"The IPv4 CIDR to map\n","type":"string"},"id":{"description":"The provider-assigned unique ID for this managed resource.","type":"string"},"ipv6":{"description":"The 4via6 mapped address\n","type":"string"},"site":{"description":"Site ID (between 0 and 65535)\n","type":"integer"}},"required":["cidr","ipv6","site","id"],"type":"object"}},"tailscale:index/getAcl:getAcl":{"description":"The acl data source gets the Tailscale policy file for a tailnet\n\n\u003e **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.\n","outputs":{"description":"A collection of values returned by getAcl.\n","properties":{"hujson":{"description":"The contents of Tailscale ACL as a HuJSON string\n","type":"string"},"id":{"description":"The provider-assigned unique ID for this managed resource.","type":"string"},"json":{"description":"The contents of Tailscale ACL as a JSON string\n","type":"string"}},"required":["hujson","json","id"],"type":"object"}},"tailscale:index/getDevice:getDevice":{"description":"The device data source describes a single device in a tailnet\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleDevice = tailscale.getDevice({\n    name: \"device1.example.ts.net\",\n    waitFor: \"60s\",\n});\nconst sampleDevice2 = tailscale.getDevice({\n    hostname: \"device2\",\n    waitFor: \"60s\",\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_device = tailscale.get_device(name=\"device1.example.ts.net\",\n    wait_for=\"60s\")\nsample_device2 = tailscale.get_device(hostname=\"device2\",\n    wait_for=\"60s\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleDevice = Tailscale.GetDevice.Invoke(new()\n    {\n        Name = \"device1.example.ts.net\",\n        WaitFor = \"60s\",\n    });\n\n    var sampleDevice2 = Tailscale.GetDevice.Invoke(new()\n    {\n        Hostname = \"device2\",\n        WaitFor = \"60s\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.GetDevice(ctx, \u0026tailscale.GetDeviceArgs{\n\t\t\tName:    pulumi.StringRef(\"device1.example.ts.net\"),\n\t\t\tWaitFor: pulumi.StringRef(\"60s\"),\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = tailscale.GetDevice(ctx, \u0026tailscale.GetDeviceArgs{\n\t\t\tHostname: pulumi.StringRef(\"device2\"),\n\t\t\tWaitFor:  pulumi.StringRef(\"60s\"),\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetDeviceArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var sampleDevice = TailscaleFunctions.getDevice(GetDeviceArgs.builder()\n            .name(\"device1.example.ts.net\")\n            .waitFor(\"60s\")\n            .build());\n\n        final var sampleDevice2 = TailscaleFunctions.getDevice(GetDeviceArgs.builder()\n            .hostname(\"device2\")\n            .waitFor(\"60s\")\n            .build());\n\n    }\n}\n```\n```yaml\nvariables:\n  sampleDevice:\n    fn::invoke:\n      function: tailscale:getDevice\n      arguments:\n        name: device1.example.ts.net\n        waitFor: 60s\n  sampleDevice2:\n    fn::invoke:\n      function: tailscale:getDevice\n      arguments:\n        hostname: device2\n        waitFor: 60s\n```\n\u003c!--End PulumiCodeChooser --\u003e\n","inputs":{"description":"A collection of arguments for invoking getDevice.\n","properties":{"hostname":{"type":"string","description":"The short hostname of the device\n"},"name":{"type":"string","description":"The full name of the device (e.g. `hostname.domain.ts.net`)\n"},"waitFor":{"type":"string","description":"If specified, the provider will make multiple attempts to obtain the data source until the\u003cspan pulumi-lang-nodejs=\" waitFor \" pulumi-lang-dotnet=\" WaitFor \" pulumi-lang-go=\" waitFor \" pulumi-lang-python=\" wait_for \" pulumi-lang-yaml=\" waitFor \" pulumi-lang-java=\" waitFor \"\u003e wait_for \u003c/span\u003eduration is reached. Retries are made every second so this value should be greater than 1s\n"}},"type":"object"},"outputs":{"description":"A collection of values returned by getDevice.\n","properties":{"addresses":{"description":"The list of device's IPs\n","items":{"type":"string"},"type":"array"},"authorized":{"description":"Whether the device is authorized to access the tailnet\n","type":"boolean"},"blocksIncomingConnections":{"description":"Whether the device blocks incoming connections\n","type":"boolean"},"clientVersion":{"description":"The Tailscale client version running on the device\n","type":"string"},"created":{"description":"The creation time of the device\n","type":"string"},"expires":{"description":"The expiry time of the device's key\n","type":"string"},"hostname":{"description":"The short hostname of the device\n","type":"string"},"id":{"description":"The provider-assigned unique ID for this managed resource.","type":"string"},"isExternal":{"description":"Whether the device is marked as external\n","type":"boolean"},"keyExpiryDisabled":{"description":"Whether the device's key expiry is disabled\n","type":"boolean"},"lastSeen":{"description":"The last seen time of the device\n","type":"string"},"machineKey":{"description":"The machine key of the device\n","type":"string"},"name":{"description":"The full name of the device (e.g. `hostname.domain.ts.net`)\n","type":"string"},"nodeId":{"description":"The preferred indentifier for a device.\n","type":"string"},"nodeKey":{"description":"The node key of the device\n","type":"string"},"os":{"description":"The operating system of the device\n","type":"string"},"tags":{"description":"The tags applied to the device\n","items":{"type":"string"},"type":"array"},"tailnetLockError":{"description":"The tailnet lock error for the device, if any\n","type":"string"},"tailnetLockKey":{"description":"The tailnet lock key for the device, if any\n","type":"string"},"updateAvailable":{"description":"Whether an update is available for the device\n","type":"boolean"},"user":{"description":"The user associated with the device\n","type":"string"},"waitFor":{"description":"If specified, the provider will make multiple attempts to obtain the data source until the\u003cspan pulumi-lang-nodejs=\" waitFor \" pulumi-lang-dotnet=\" WaitFor \" pulumi-lang-go=\" waitFor \" pulumi-lang-python=\" wait_for \" pulumi-lang-yaml=\" waitFor \" pulumi-lang-java=\" waitFor \"\u003e wait_for \u003c/span\u003eduration is reached. Retries are made every second so this value should be greater than 1s\n","type":"string"}},"required":["addresses","authorized","blocksIncomingConnections","clientVersion","created","expires","isExternal","keyExpiryDisabled","lastSeen","machineKey","nodeId","nodeKey","os","tags","tailnetLockError","tailnetLockKey","updateAvailable","user","id"],"type":"object"}},"tailscale:index/getDevices:getDevices":{"description":"The devices data source describes a list of devices in a tailnet\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst sampleDevices = tailscale.getDevices({\n    namePrefix: \"example-\",\n    filters: [\n        {\n            name: \"isEphemeral\",\n            values: [\"true\"],\n        },\n        {\n            name: \"tags\",\n            values: [\n                \"tag:server\",\n                \"tag:test\",\n            ],\n        },\n    ],\n});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nsample_devices = tailscale.get_devices(name_prefix=\"example-\",\n    filters=[\n        {\n            \"name\": \"isEphemeral\",\n            \"values\": [\"true\"],\n        },\n        {\n            \"name\": \"tags\",\n            \"values\": [\n                \"tag:server\",\n                \"tag:test\",\n            ],\n        },\n    ])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var sampleDevices = Tailscale.GetDevices.Invoke(new()\n    {\n        NamePrefix = \"example-\",\n        Filters = new[]\n        {\n            new Tailscale.Inputs.GetDevicesFilterInputArgs\n            {\n                Name = \"isEphemeral\",\n                Values = new[]\n                {\n                    \"true\",\n                },\n            },\n            new Tailscale.Inputs.GetDevicesFilterInputArgs\n            {\n                Name = \"tags\",\n                Values = new[]\n                {\n                    \"tag:server\",\n                    \"tag:test\",\n                },\n            },\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.GetDevices(ctx, \u0026tailscale.GetDevicesArgs{\n\t\t\tNamePrefix: pulumi.StringRef(\"example-\"),\n\t\t\tFilters: []tailscale.GetDevicesFilter{\n\t\t\t\t{\n\t\t\t\t\tName: \"isEphemeral\",\n\t\t\t\t\tValues: []string{\n\t\t\t\t\t\t\"true\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"tags\",\n\t\t\t\t\tValues: []string{\n\t\t\t\t\t\t\"tag:server\",\n\t\t\t\t\t\t\"tag:test\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetDevicesArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var sampleDevices = TailscaleFunctions.getDevices(GetDevicesArgs.builder()\n            .namePrefix(\"example-\")\n            .filters(            \n                GetDevicesFilterArgs.builder()\n                    .name(\"isEphemeral\")\n                    .values(\"true\")\n                    .build(),\n                GetDevicesFilterArgs.builder()\n                    .name(\"tags\")\n                    .values(                    \n                        \"tag:server\",\n                        \"tag:test\")\n                    .build())\n            .build());\n\n    }\n}\n```\n```yaml\nvariables:\n  sampleDevices:\n    fn::invoke:\n      function: tailscale:getDevices\n      arguments:\n        namePrefix: example-\n        filters:\n          - name: isEphemeral\n            values:\n              - 'true'\n          - name: tags\n            values:\n              - tag:server\n              - tag:test\n```\n\u003c!--End PulumiCodeChooser --\u003e\n","inputs":{"description":"A collection of arguments for invoking getDevices.\n","properties":{"filters":{"type":"array","items":{"$ref":"#/types/tailscale:index/getDevicesFilter:getDevicesFilter"},"description":"Filters the device list to elements devices whose fields match the provided values.\n"},"namePrefix":{"type":"string","description":"Filters the device list to elements whose name has the provided prefix\n"}},"type":"object"},"outputs":{"description":"A collection of values returned by getDevices.\n","properties":{"devices":{"description":"The list of devices in the tailnet\n","items":{"$ref":"#/types/tailscale:index/getDevicesDevice:getDevicesDevice"},"type":"array"},"filters":{"description":"Filters the device list to elements devices whose fields match the provided values.\n","items":{"$ref":"#/types/tailscale:index/getDevicesFilter:getDevicesFilter"},"type":"array"},"id":{"description":"The provider-assigned unique ID for this managed resource.","type":"string"},"namePrefix":{"description":"Filters the device list to elements whose name has the provided prefix\n","type":"string"}},"required":["devices","id"],"type":"object"}},"tailscale:index/getUser:getUser":{"description":"The user data source describes a single user in a tailnet\n\n","inputs":{"description":"A collection of arguments for invoking getUser.\n","properties":{"id":{"type":"string","description":"The unique identifier for the user.\n"},"loginName":{"type":"string","description":"The emailish login name of the user.\n"}},"type":"object"},"outputs":{"description":"A collection of values returned by getUser.\n","properties":{"created":{"description":"The time the user joined their tailnet.\n","type":"string"},"currentlyConnected":{"description":"true when the user has a node currently connected to the control server.\n","type":"boolean"},"deviceCount":{"description":"Number of devices the user owns.\n","type":"integer"},"displayName":{"description":"The name of the user.\n","type":"string"},"id":{"description":"The unique identifier for the user.\n","type":"string"},"lastSeen":{"description":"The later of either: a) The last time any of the user's nodes were connected to the network or b) The last time the user authenticated to any tailscale service, including the admin panel.\n","type":"string"},"loginName":{"description":"The emailish login name of the user.\n","type":"string"},"profilePicUrl":{"description":"The profile pic URL for the user.\n","type":"string"},"role":{"description":"The role of the user.\n","type":"string"},"status":{"description":"The status of the user.\n","type":"string"},"tailnetId":{"description":"The tailnet that owns the user.\n","type":"string"},"type":{"description":"The type of relation this user has to the tailnet associated with the request.\n","type":"string"}},"required":["created","currentlyConnected","deviceCount","displayName","lastSeen","profilePicUrl","role","status","tailnetId","type"],"type":"object"}},"tailscale:index/getUsers:getUsers":{"description":"The users data source describes a list of users in a tailnet\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as tailscale from \"@pulumi/tailscale\";\n\nconst all_users = tailscale.getUsers({});\n```\n```python\nimport pulumi\nimport pulumi_tailscale as tailscale\n\nall_users = tailscale.get_users()\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Tailscale = Pulumi.Tailscale;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var all_users = Tailscale.GetUsers.Invoke();\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-tailscale/sdk/go/tailscale\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := tailscale.GetUsers(ctx, \u0026tailscale.GetUsersArgs{}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.tailscale.TailscaleFunctions;\nimport com.pulumi.tailscale.inputs.GetUsersArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var all-users = TailscaleFunctions.getUsers(GetUsersArgs.builder()\n            .build());\n\n    }\n}\n```\n```yaml\nvariables:\n  all-users:\n    fn::invoke:\n      function: tailscale:getUsers\n      arguments: {}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n","inputs":{"description":"A collection of arguments for invoking getUsers.\n","properties":{"role":{"type":"string","description":"Filter the results to only include users with a specific role. Valid values are \u003cspan pulumi-lang-nodejs=\"`owner`\" pulumi-lang-dotnet=\"`Owner`\" pulumi-lang-go=\"`owner`\" pulumi-lang-python=\"`owner`\" pulumi-lang-yaml=\"`owner`\" pulumi-lang-java=\"`owner`\"\u003e`owner`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`member`\" pulumi-lang-dotnet=\"`Member`\" pulumi-lang-go=\"`member`\" pulumi-lang-python=\"`member`\" pulumi-lang-yaml=\"`member`\" pulumi-lang-java=\"`member`\"\u003e`member`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`admin`\" pulumi-lang-dotnet=\"`Admin`\" pulumi-lang-go=\"`admin`\" pulumi-lang-python=\"`admin`\" pulumi-lang-yaml=\"`admin`\" pulumi-lang-java=\"`admin`\"\u003e`admin`\u003c/span\u003e, `it-admin`, `network-admin`, `billing-admin`, and \u003cspan pulumi-lang-nodejs=\"`auditor`\" pulumi-lang-dotnet=\"`Auditor`\" pulumi-lang-go=\"`auditor`\" pulumi-lang-python=\"`auditor`\" pulumi-lang-yaml=\"`auditor`\" pulumi-lang-java=\"`auditor`\"\u003e`auditor`\u003c/span\u003e.\n"},"type":{"type":"string","description":"Filter the results to only include users of a specific type. Valid values are \u003cspan pulumi-lang-nodejs=\"`member`\" pulumi-lang-dotnet=\"`Member`\" pulumi-lang-go=\"`member`\" pulumi-lang-python=\"`member`\" pulumi-lang-yaml=\"`member`\" pulumi-lang-java=\"`member`\"\u003e`member`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`shared`\" pulumi-lang-dotnet=\"`Shared`\" pulumi-lang-go=\"`shared`\" pulumi-lang-python=\"`shared`\" pulumi-lang-yaml=\"`shared`\" pulumi-lang-java=\"`shared`\"\u003e`shared`\u003c/span\u003e.\n"}},"type":"object"},"outputs":{"description":"A collection of values returned by getUsers.\n","properties":{"id":{"description":"The provider-assigned unique ID for this managed resource.","type":"string"},"role":{"description":"Filter the results to only include users with a specific role. Valid values are \u003cspan pulumi-lang-nodejs=\"`owner`\" pulumi-lang-dotnet=\"`Owner`\" pulumi-lang-go=\"`owner`\" pulumi-lang-python=\"`owner`\" pulumi-lang-yaml=\"`owner`\" pulumi-lang-java=\"`owner`\"\u003e`owner`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`member`\" pulumi-lang-dotnet=\"`Member`\" pulumi-lang-go=\"`member`\" pulumi-lang-python=\"`member`\" pulumi-lang-yaml=\"`member`\" pulumi-lang-java=\"`member`\"\u003e`member`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`admin`\" pulumi-lang-dotnet=\"`Admin`\" pulumi-lang-go=\"`admin`\" pulumi-lang-python=\"`admin`\" pulumi-lang-yaml=\"`admin`\" pulumi-lang-java=\"`admin`\"\u003e`admin`\u003c/span\u003e, `it-admin`, `network-admin`, `billing-admin`, and \u003cspan pulumi-lang-nodejs=\"`auditor`\" pulumi-lang-dotnet=\"`Auditor`\" pulumi-lang-go=\"`auditor`\" pulumi-lang-python=\"`auditor`\" pulumi-lang-yaml=\"`auditor`\" pulumi-lang-java=\"`auditor`\"\u003e`auditor`\u003c/span\u003e.\n","type":"string"},"type":{"description":"Filter the results to only include users of a specific type. Valid values are \u003cspan pulumi-lang-nodejs=\"`member`\" pulumi-lang-dotnet=\"`Member`\" pulumi-lang-go=\"`member`\" pulumi-lang-python=\"`member`\" pulumi-lang-yaml=\"`member`\" pulumi-lang-java=\"`member`\"\u003e`member`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`shared`\" pulumi-lang-dotnet=\"`Shared`\" pulumi-lang-go=\"`shared`\" pulumi-lang-python=\"`shared`\" pulumi-lang-yaml=\"`shared`\" pulumi-lang-java=\"`shared`\"\u003e`shared`\u003c/span\u003e.\n","type":"string"},"users":{"description":"The list of users in the tailnet\n","items":{"$ref":"#/types/tailscale:index/getUsersUser:getUsersUser"},"type":"array"}},"required":["users","id"],"type":"object"}}}}