diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index d35def4..4415849 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -94,7 +94,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
prerequisites:
@@ -161,7 +161,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
publish:
@@ -202,7 +202,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
publish_sdk:
@@ -280,7 +280,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
test:
@@ -365,7 +365,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
name: main
diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml
index 1b46470..64e4b44 100644
--- a/.github/workflows/prerelease.yml
+++ b/.github/workflows/prerelease.yml
@@ -94,7 +94,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
prerequisites:
@@ -162,7 +162,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
publish:
@@ -203,7 +203,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
publish_sdk:
@@ -281,7 +281,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
test:
@@ -366,7 +366,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
name: prerelease
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8b136dc..73b975f 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -94,7 +94,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
prerequisites:
@@ -161,7 +161,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
publish:
@@ -202,7 +202,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
publish_sdk:
@@ -280,7 +280,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
test:
@@ -365,7 +365,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
name: release
diff --git a/.github/workflows/run-acceptance-tests.yml b/.github/workflows/run-acceptance-tests.yml
index ad4cb1d..8b95596 100644
--- a/.github/workflows/run-acceptance-tests.yml
+++ b/.github/workflows/run-acceptance-tests.yml
@@ -98,7 +98,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
comment-notification:
@@ -187,7 +187,7 @@ jobs:
goversion:
- 1.21.x
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
test:
@@ -276,7 +276,7 @@ jobs:
- dotnet
- go
nodeversion:
- - 16.x
+ - 18.x
pythonversion:
- "3.7"
name: run-acceptance-tests
diff --git a/provider/pkg/provider/aws/bastion.go b/provider/pkg/provider/aws/bastion.go
index b45de11..b940904 100644
--- a/provider/pkg/provider/aws/bastion.go
+++ b/provider/pkg/provider/aws/bastion.go
@@ -25,12 +25,13 @@ var (
// The set of arguments for creating a Bastion component resource.
type BastionArgs struct {
- VpcID pulumi.StringInput `pulumi:"vpcId"`
- SubnetIds pulumi.StringArrayInput `pulumi:"subnetIds"`
- TailscaleTags pulumi.StringArrayInput `pulumi:"tailscaleTags"`
- Route pulumi.StringInput `pulumi:"route"`
- Region pulumi.StringInput `pulumi:"region"`
- InstanceType pulumi.StringInput `pulumi:"instanceType"`
+ VpcID pulumi.StringInput `pulumi:"vpcId"`
+ SubnetIds pulumi.StringArrayInput `pulumi:"subnetIds"`
+ TailscaleTags pulumi.StringArrayInput `pulumi:"tailscaleTags"`
+ Route pulumi.StringInput `pulumi:"route"`
+ Region pulumi.StringInput `pulumi:"region"`
+ InstanceType pulumi.StringInput `pulumi:"instanceType"`
+ HighAvailability bool `pulumi:"highAvailability"`
}
type UserDataArgs struct {
@@ -291,10 +292,18 @@ func NewBastion(ctx *pulumi.Context,
return nil, fmt.Errorf("error creating launch configuration: %v", err)
}
+ var size int
+
+ if args.HighAvailability {
+ size = 2
+ } else {
+ size = 1
+ }
+
asg, err := autoscaling.NewGroup(ctx, name, &autoscaling.GroupArgs{
LaunchConfiguration: launchConfiguration.ID(),
- MaxSize: pulumi.Int(1),
- MinSize: pulumi.Int(1),
+ MaxSize: pulumi.Int(size),
+ MinSize: pulumi.Int(size),
HealthCheckType: pulumi.String("EC2"),
HealthCheckGracePeriod: pulumi.Int(30),
VpcZoneIdentifiers: args.SubnetIds,
diff --git a/provider/pkg/provider/azure/bastion.go b/provider/pkg/provider/azure/bastion.go
index c926974..c8386a5 100644
--- a/provider/pkg/provider/azure/bastion.go
+++ b/provider/pkg/provider/azure/bastion.go
@@ -27,6 +27,7 @@ type BastionArgs struct {
Route pulumi.StringInput `pulumi:"route"`
InstanceSku pulumi.StringInput `pulumi:"instanceSku"`
TailscaleTags pulumi.StringArrayInput `pulumi:"tailscaleTags"`
+ HighAvailability bool `pulumi:"highAvailability"`
}
type UserDataArgs struct {
@@ -113,12 +114,20 @@ func NewBastion(ctx *pulumi.Context,
return nil, err
}
+ var size int
+
+ if args.HighAvailability {
+ size = 2
+ } else {
+ size = 1
+ }
+
scaleset, err := compute.NewLinuxVirtualMachineScaleSet(ctx, name, &compute.LinuxVirtualMachineScaleSetArgs{
ResourceGroupName: args.ResourceGroupName,
Location: args.Location,
UpgradeMode: pulumi.String("Manual"),
Sku: sku,
- Instances: pulumi.Int(1),
+ Instances: pulumi.Int(size),
SourceImageReference: &compute.LinuxVirtualMachineScaleSetSourceImageReferenceArgs{
Publisher: pulumi.String("Canonical"),
Offer: pulumi.String("0001-com-ubuntu-server-focal"),
diff --git a/provider/pkg/provider/kubernetes/bastion.go b/provider/pkg/provider/kubernetes/bastion.go
index 5e610d4..3f497ba 100644
--- a/provider/pkg/provider/kubernetes/bastion.go
+++ b/provider/pkg/provider/kubernetes/bastion.go
@@ -14,10 +14,11 @@ import (
// The set of arguments for creating a Bastion component resource.
type BastionArgs struct {
- CreateNamespace bool `pulumi:"createNamespace"`
- Namespace *corev1.Namespace `pulumi:"namespace"`
- Routes pulumi.StringArrayInput `pulumi:"routes"`
- TailscaleTags pulumi.StringArrayInput `pulumi:"tailscaleTags"`
+ CreateNamespace bool `pulumi:"createNamespace"`
+ Namespace *corev1.Namespace `pulumi:"namespace"`
+ Routes pulumi.StringArrayInput `pulumi:"routes"`
+ TailscaleTags pulumi.StringArrayInput `pulumi:"tailscaleTags"`
+ HighAvailability bool `pulumi:"highAvailability"`
}
// The Bastion component resource.
@@ -149,12 +150,20 @@ func NewBastion(ctx *pulumi.Context,
},
).(pulumi.StringOutput)
+ var size int
+
+ if args.HighAvailability {
+ size = 2
+ } else {
+ size = 1
+ }
+
deployment, err := appsv1.NewDeployment(ctx, name, &appsv1.DeploymentArgs{
Metadata: &metav1.ObjectMetaArgs{
Namespace: namespace.Metadata.Name(),
},
Spec: &appsv1.DeploymentSpecArgs{
- Replicas: pulumi.Int(1),
+ Replicas: pulumi.Int(size),
Selector: &metav1.LabelSelectorArgs{
MatchLabels: pulumi.StringMap{
"name": pulumi.String(name),
diff --git a/schema.yaml b/schema.yaml
index 19f5d73..fbc12c1 100644
--- a/schema.yaml
+++ b/schema.yaml
@@ -25,12 +25,17 @@ resources:
instanceSku:
type: string
description: "The Azure instance SKU to use for the bastion."
+ highAvailability:
+ type: boolean
+ description: "Whether the bastion should be highly available."
+ default: false
tailscaleTags:
type: array
items:
type: string
description: "The tags to apply to the tailnet device andauth key. This tag should be added to your oauth key and ACL."
requiredInputs:
+ - highAvailability
- resourceGroupName
- subnetId
- route
@@ -49,6 +54,10 @@ resources:
tailscale-bastion:aws:Bastion:
isComponent: true
inputProperties:
+ highAvailability:
+ type: boolean
+ description: "Whether the bastion should be highly available."
+ default: false
vpcId:
type: string
description: "The VPC the Bastion should be created in."
@@ -72,6 +81,7 @@ resources:
type: string
description: "The EC2 instance type to use for the bastion."
requiredInputs:
+ - highAvailability
- vpcId
- subnetIds
- route
@@ -90,6 +100,10 @@ resources:
tailscale-bastion:kubernetes:Bastion:
isComponent: true
inputProperties:
+ highAvailability:
+ type: boolean
+ description: "Whether the bastion should be highly available."
+ default: false
tailscaleTags:
type: array
items:
@@ -108,6 +122,7 @@ resources:
type: string
description: "The routes to advertise to tailscale. This is likely the Pod and Service CIDR."
requiredInputs:
+ - highAvailability
- createNamespace
- routes
- tailscaleTags
diff --git a/sdk/dotnet/TailscaleBastion/Aws/Bastion.cs b/sdk/dotnet/TailscaleBastion/Aws/Bastion.cs
index 7a76c5a..dabe154 100644
--- a/sdk/dotnet/TailscaleBastion/Aws/Bastion.cs
+++ b/sdk/dotnet/TailscaleBastion/Aws/Bastion.cs
@@ -54,6 +54,12 @@ private static ComponentResourceOptions MakeResourceOptions(ComponentResourceOpt
public sealed class BastionArgs : global::Pulumi.ResourceArgs
{
+ ///
+ /// Whether the bastion should be highly available.
+ ///
+ [Input("highAvailability", required: true)]
+ public Input HighAvailability { get; set; } = null!;
+
///
/// The EC2 instance type to use for the bastion.
///
@@ -104,6 +110,7 @@ public InputList TailscaleTags
public BastionArgs()
{
+ HighAvailability = false;
}
public static new BastionArgs Empty => new BastionArgs();
}
diff --git a/sdk/dotnet/TailscaleBastion/Azure/Bastion.cs b/sdk/dotnet/TailscaleBastion/Azure/Bastion.cs
index 97dcbb4..62e1329 100644
--- a/sdk/dotnet/TailscaleBastion/Azure/Bastion.cs
+++ b/sdk/dotnet/TailscaleBastion/Azure/Bastion.cs
@@ -54,6 +54,12 @@ private static ComponentResourceOptions MakeResourceOptions(ComponentResourceOpt
public sealed class BastionArgs : global::Pulumi.ResourceArgs
{
+ ///
+ /// Whether the bastion should be highly available.
+ ///
+ [Input("highAvailability", required: true)]
+ public Input HighAvailability { get; set; } = null!;
+
///
/// The Azure instance SKU to use for the bastion.
///
@@ -98,6 +104,7 @@ public InputList TailscaleTags
public BastionArgs()
{
+ HighAvailability = false;
}
public static new BastionArgs Empty => new BastionArgs();
}
diff --git a/sdk/dotnet/TailscaleBastion/Kubernetes/Bastion.cs b/sdk/dotnet/TailscaleBastion/Kubernetes/Bastion.cs
index 113f18a..bfe8853 100644
--- a/sdk/dotnet/TailscaleBastion/Kubernetes/Bastion.cs
+++ b/sdk/dotnet/TailscaleBastion/Kubernetes/Bastion.cs
@@ -54,6 +54,12 @@ public sealed class BastionArgs : global::Pulumi.ResourceArgs
[Input("createNamespace", required: true)]
public bool CreateNamespace { get; set; }
+ ///
+ /// Whether the bastion should be highly available.
+ ///
+ [Input("highAvailability", required: true)]
+ public Input HighAvailability { get; set; } = null!;
+
///
/// The bucket resource.
///
@@ -86,6 +92,7 @@ public InputList TailscaleTags
public BastionArgs()
{
+ HighAvailability = false;
}
public static new BastionArgs Empty => new BastionArgs();
}
diff --git a/sdk/go/bastion/aws/bastion.go b/sdk/go/bastion/aws/bastion.go
index e07bf12..ab64b48 100644
--- a/sdk/go/bastion/aws/bastion.go
+++ b/sdk/go/bastion/aws/bastion.go
@@ -44,6 +44,9 @@ func NewBastion(ctx *pulumi.Context,
if args.VpcId == nil {
return nil, errors.New("invalid value for required argument 'VpcId'")
}
+ if args.HighAvailability == nil {
+ args.HighAvailability = pulumi.Bool(false)
+ }
opts = internal.PkgResourceDefaultOpts(opts)
var resource Bastion
err := ctx.RegisterRemoteComponentResource("tailscale-bastion:aws:Bastion", name, args, &resource, opts...)
@@ -54,6 +57,8 @@ func NewBastion(ctx *pulumi.Context,
}
type bastionArgs struct {
+ // Whether the bastion should be highly available.
+ HighAvailability bool `pulumi:"highAvailability"`
// The EC2 instance type to use for the bastion.
InstanceType *string `pulumi:"instanceType"`
// The AWS region you're using.
@@ -70,6 +75,8 @@ type bastionArgs struct {
// The set of arguments for constructing a Bastion resource.
type BastionArgs struct {
+ // Whether the bastion should be highly available.
+ HighAvailability pulumi.BoolInput
// The EC2 instance type to use for the bastion.
InstanceType pulumi.StringPtrInput
// The AWS region you're using.
diff --git a/sdk/go/bastion/azure/bastion.go b/sdk/go/bastion/azure/bastion.go
index ba9ea21..047cc03 100644
--- a/sdk/go/bastion/azure/bastion.go
+++ b/sdk/go/bastion/azure/bastion.go
@@ -44,6 +44,9 @@ func NewBastion(ctx *pulumi.Context,
if args.TailscaleTags == nil {
return nil, errors.New("invalid value for required argument 'TailscaleTags'")
}
+ if args.HighAvailability == nil {
+ args.HighAvailability = pulumi.Bool(false)
+ }
opts = internal.PkgResourceDefaultOpts(opts)
var resource Bastion
err := ctx.RegisterRemoteComponentResource("tailscale-bastion:azure:Bastion", name, args, &resource, opts...)
@@ -54,6 +57,8 @@ func NewBastion(ctx *pulumi.Context,
}
type bastionArgs struct {
+ // Whether the bastion should be highly available.
+ HighAvailability bool `pulumi:"highAvailability"`
// The Azure instance SKU to use for the bastion.
InstanceSku *string `pulumi:"instanceSku"`
// The Azure region you're using.
@@ -70,6 +75,8 @@ type bastionArgs struct {
// The set of arguments for constructing a Bastion resource.
type BastionArgs struct {
+ // Whether the bastion should be highly available.
+ HighAvailability pulumi.BoolInput
// The Azure instance SKU to use for the bastion.
InstanceSku pulumi.StringPtrInput
// The Azure region you're using.
diff --git a/sdk/go/bastion/kubernetes/bastion.go b/sdk/go/bastion/kubernetes/bastion.go
index e23b714..d65b63e 100644
--- a/sdk/go/bastion/kubernetes/bastion.go
+++ b/sdk/go/bastion/kubernetes/bastion.go
@@ -34,6 +34,9 @@ func NewBastion(ctx *pulumi.Context,
if args.TailscaleTags == nil {
return nil, errors.New("invalid value for required argument 'TailscaleTags'")
}
+ if args.HighAvailability == nil {
+ args.HighAvailability = pulumi.Bool(false)
+ }
opts = internal.PkgResourceDefaultOpts(opts)
var resource Bastion
err := ctx.RegisterRemoteComponentResource("tailscale-bastion:kubernetes:Bastion", name, args, &resource, opts...)
@@ -46,6 +49,8 @@ func NewBastion(ctx *pulumi.Context,
type bastionArgs struct {
// Whether we should create a new namespace.
CreateNamespace bool `pulumi:"createNamespace"`
+ // Whether the bastion should be highly available.
+ HighAvailability bool `pulumi:"highAvailability"`
// The bucket resource.
Namespace *corev1.Namespace `pulumi:"namespace"`
// The routes to advertise to tailscale. This is likely the Pod and Service CIDR.
@@ -58,6 +63,8 @@ type bastionArgs struct {
type BastionArgs struct {
// Whether we should create a new namespace.
CreateNamespace bool
+ // Whether the bastion should be highly available.
+ HighAvailability pulumi.BoolInput
// The bucket resource.
Namespace corev1.NamespaceInput
// The routes to advertise to tailscale. This is likely the Pod and Service CIDR.
diff --git a/sdk/nodejs/aws/bastion.ts b/sdk/nodejs/aws/bastion.ts
index 40028d1..57c293d 100644
--- a/sdk/nodejs/aws/bastion.ts
+++ b/sdk/nodejs/aws/bastion.ts
@@ -39,6 +39,9 @@ export class Bastion extends pulumi.ComponentResource {
let resourceInputs: pulumi.Inputs = {};
opts = opts || {};
if (!opts.id) {
+ if ((!args || args.highAvailability === undefined) && !opts.urn) {
+ throw new Error("Missing required property 'highAvailability'");
+ }
if ((!args || args.region === undefined) && !opts.urn) {
throw new Error("Missing required property 'region'");
}
@@ -54,6 +57,7 @@ export class Bastion extends pulumi.ComponentResource {
if ((!args || args.vpcId === undefined) && !opts.urn) {
throw new Error("Missing required property 'vpcId'");
}
+ resourceInputs["highAvailability"] = (args ? args.highAvailability : undefined) ?? false;
resourceInputs["instanceType"] = args ? args.instanceType : undefined;
resourceInputs["region"] = args ? args.region : undefined;
resourceInputs["route"] = args ? args.route : undefined;
@@ -75,6 +79,10 @@ export class Bastion extends pulumi.ComponentResource {
* The set of arguments for constructing a Bastion resource.
*/
export interface BastionArgs {
+ /**
+ * Whether the bastion should be highly available.
+ */
+ highAvailability: pulumi.Input;
/**
* The EC2 instance type to use for the bastion.
*/
diff --git a/sdk/nodejs/azure/bastion.ts b/sdk/nodejs/azure/bastion.ts
index a52d19f..0d5156a 100644
--- a/sdk/nodejs/azure/bastion.ts
+++ b/sdk/nodejs/azure/bastion.ts
@@ -39,6 +39,9 @@ export class Bastion extends pulumi.ComponentResource {
let resourceInputs: pulumi.Inputs = {};
opts = opts || {};
if (!opts.id) {
+ if ((!args || args.highAvailability === undefined) && !opts.urn) {
+ throw new Error("Missing required property 'highAvailability'");
+ }
if ((!args || args.location === undefined) && !opts.urn) {
throw new Error("Missing required property 'location'");
}
@@ -54,6 +57,7 @@ export class Bastion extends pulumi.ComponentResource {
if ((!args || args.tailscaleTags === undefined) && !opts.urn) {
throw new Error("Missing required property 'tailscaleTags'");
}
+ resourceInputs["highAvailability"] = (args ? args.highAvailability : undefined) ?? false;
resourceInputs["instanceSku"] = args ? args.instanceSku : undefined;
resourceInputs["location"] = args ? args.location : undefined;
resourceInputs["resourceGroupName"] = args ? args.resourceGroupName : undefined;
@@ -75,6 +79,10 @@ export class Bastion extends pulumi.ComponentResource {
* The set of arguments for constructing a Bastion resource.
*/
export interface BastionArgs {
+ /**
+ * Whether the bastion should be highly available.
+ */
+ highAvailability: pulumi.Input;
/**
* The Azure instance SKU to use for the bastion.
*/
diff --git a/sdk/nodejs/kubernetes/bastion.ts b/sdk/nodejs/kubernetes/bastion.ts
index a1990b4..293219e 100644
--- a/sdk/nodejs/kubernetes/bastion.ts
+++ b/sdk/nodejs/kubernetes/bastion.ts
@@ -40,6 +40,9 @@ export class Bastion extends pulumi.ComponentResource {
if ((!args || args.createNamespace === undefined) && !opts.urn) {
throw new Error("Missing required property 'createNamespace'");
}
+ if ((!args || args.highAvailability === undefined) && !opts.urn) {
+ throw new Error("Missing required property 'highAvailability'");
+ }
if ((!args || args.routes === undefined) && !opts.urn) {
throw new Error("Missing required property 'routes'");
}
@@ -47,6 +50,7 @@ export class Bastion extends pulumi.ComponentResource {
throw new Error("Missing required property 'tailscaleTags'");
}
resourceInputs["createNamespace"] = args ? args.createNamespace : undefined;
+ resourceInputs["highAvailability"] = (args ? args.highAvailability : undefined) ?? false;
resourceInputs["namespace"] = args ? args.namespace : undefined;
resourceInputs["routes"] = args ? args.routes : undefined;
resourceInputs["tailscaleTags"] = args ? args.tailscaleTags : undefined;
@@ -67,6 +71,10 @@ export interface BastionArgs {
* Whether we should create a new namespace.
*/
createNamespace: boolean;
+ /**
+ * Whether the bastion should be highly available.
+ */
+ highAvailability: pulumi.Input;
/**
* The bucket resource.
*/
diff --git a/sdk/python/lbrlabs_pulumi_tailscalebastion/aws/bastion.py b/sdk/python/lbrlabs_pulumi_tailscalebastion/aws/bastion.py
index bffd941..a2f6309 100644
--- a/sdk/python/lbrlabs_pulumi_tailscalebastion/aws/bastion.py
+++ b/sdk/python/lbrlabs_pulumi_tailscalebastion/aws/bastion.py
@@ -14,6 +14,7 @@
@pulumi.input_type
class BastionArgs:
def __init__(__self__, *,
+ high_availability: Optional[pulumi.Input[bool]] = None,
region: pulumi.Input[str],
route: pulumi.Input[str],
subnet_ids: pulumi.Input[Sequence[pulumi.Input[str]]],
@@ -22,6 +23,7 @@ def __init__(__self__, *,
instance_type: Optional[pulumi.Input[str]] = None):
"""
The set of arguments for constructing a Bastion resource.
+ :param pulumi.Input[bool] high_availability: Whether the bastion should be highly available.
:param pulumi.Input[str] region: The AWS region you're using.
:param pulumi.Input[str] route: The route you'd like to advertise via tailscale.
:param pulumi.Input[Sequence[pulumi.Input[str]]] subnet_ids: The subnet Ids to launch instances in.
@@ -29,6 +31,9 @@ def __init__(__self__, *,
:param pulumi.Input[str] vpc_id: The VPC the Bastion should be created in.
:param pulumi.Input[str] instance_type: The EC2 instance type to use for the bastion.
"""
+ if high_availability is None:
+ high_availability = False
+ pulumi.set(__self__, "high_availability", high_availability)
pulumi.set(__self__, "region", region)
pulumi.set(__self__, "route", route)
pulumi.set(__self__, "subnet_ids", subnet_ids)
@@ -37,6 +42,18 @@ def __init__(__self__, *,
if instance_type is not None:
pulumi.set(__self__, "instance_type", instance_type)
+ @property
+ @pulumi.getter(name="highAvailability")
+ def high_availability(self) -> pulumi.Input[bool]:
+ """
+ Whether the bastion should be highly available.
+ """
+ return pulumi.get(self, "high_availability")
+
+ @high_availability.setter
+ def high_availability(self, value: pulumi.Input[bool]):
+ pulumi.set(self, "high_availability", value)
+
@property
@pulumi.getter
def region(self) -> pulumi.Input[str]:
@@ -115,6 +132,7 @@ class Bastion(pulumi.ComponentResource):
def __init__(__self__,
resource_name: str,
opts: Optional[pulumi.ResourceOptions] = None,
+ high_availability: Optional[pulumi.Input[bool]] = None,
instance_type: Optional[pulumi.Input[str]] = None,
region: Optional[pulumi.Input[str]] = None,
route: Optional[pulumi.Input[str]] = None,
@@ -126,6 +144,7 @@ def __init__(__self__,
Create a Bastion resource with the given unique name, props, and options.
:param str resource_name: The name of the resource.
:param pulumi.ResourceOptions opts: Options for the resource.
+ :param pulumi.Input[bool] high_availability: Whether the bastion should be highly available.
:param pulumi.Input[str] instance_type: The EC2 instance type to use for the bastion.
:param pulumi.Input[str] region: The AWS region you're using.
:param pulumi.Input[str] route: The route you'd like to advertise via tailscale.
@@ -156,6 +175,7 @@ def __init__(__self__, resource_name: str, *args, **kwargs):
def _internal_init(__self__,
resource_name: str,
opts: Optional[pulumi.ResourceOptions] = None,
+ high_availability: Optional[pulumi.Input[bool]] = None,
instance_type: Optional[pulumi.Input[str]] = None,
region: Optional[pulumi.Input[str]] = None,
route: Optional[pulumi.Input[str]] = None,
@@ -173,6 +193,11 @@ def _internal_init(__self__,
raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
__props__ = BastionArgs.__new__(BastionArgs)
+ if high_availability is None:
+ high_availability = False
+ if high_availability is None and not opts.urn:
+ raise TypeError("Missing required property 'high_availability'")
+ __props__.__dict__["high_availability"] = high_availability
__props__.__dict__["instance_type"] = instance_type
if region is None and not opts.urn:
raise TypeError("Missing required property 'region'")
diff --git a/sdk/python/lbrlabs_pulumi_tailscalebastion/azure/bastion.py b/sdk/python/lbrlabs_pulumi_tailscalebastion/azure/bastion.py
index 8a8d90e..716786d 100644
--- a/sdk/python/lbrlabs_pulumi_tailscalebastion/azure/bastion.py
+++ b/sdk/python/lbrlabs_pulumi_tailscalebastion/azure/bastion.py
@@ -14,6 +14,7 @@
@pulumi.input_type
class BastionArgs:
def __init__(__self__, *,
+ high_availability: Optional[pulumi.Input[bool]] = None,
location: pulumi.Input[str],
resource_group_name: pulumi.Input[str],
route: pulumi.Input[str],
@@ -22,6 +23,7 @@ def __init__(__self__, *,
instance_sku: Optional[pulumi.Input[str]] = None):
"""
The set of arguments for constructing a Bastion resource.
+ :param pulumi.Input[bool] high_availability: Whether the bastion should be highly available.
:param pulumi.Input[str] location: The Azure region you're using.
:param pulumi.Input[str] resource_group_name: The Azure resource group to create the bastion in.
:param pulumi.Input[str] route: The route you'd like to advertise via tailscale.
@@ -29,6 +31,9 @@ def __init__(__self__, *,
:param pulumi.Input[Sequence[pulumi.Input[str]]] tailscale_tags: The tags to apply to the tailnet device andauth key. This tag should be added to your oauth key and ACL.
:param pulumi.Input[str] instance_sku: The Azure instance SKU to use for the bastion.
"""
+ if high_availability is None:
+ high_availability = False
+ pulumi.set(__self__, "high_availability", high_availability)
pulumi.set(__self__, "location", location)
pulumi.set(__self__, "resource_group_name", resource_group_name)
pulumi.set(__self__, "route", route)
@@ -37,6 +42,18 @@ def __init__(__self__, *,
if instance_sku is not None:
pulumi.set(__self__, "instance_sku", instance_sku)
+ @property
+ @pulumi.getter(name="highAvailability")
+ def high_availability(self) -> pulumi.Input[bool]:
+ """
+ Whether the bastion should be highly available.
+ """
+ return pulumi.get(self, "high_availability")
+
+ @high_availability.setter
+ def high_availability(self, value: pulumi.Input[bool]):
+ pulumi.set(self, "high_availability", value)
+
@property
@pulumi.getter
def location(self) -> pulumi.Input[str]:
@@ -115,6 +132,7 @@ class Bastion(pulumi.ComponentResource):
def __init__(__self__,
resource_name: str,
opts: Optional[pulumi.ResourceOptions] = None,
+ high_availability: Optional[pulumi.Input[bool]] = None,
instance_sku: Optional[pulumi.Input[str]] = None,
location: Optional[pulumi.Input[str]] = None,
resource_group_name: Optional[pulumi.Input[str]] = None,
@@ -126,6 +144,7 @@ def __init__(__self__,
Create a Bastion resource with the given unique name, props, and options.
:param str resource_name: The name of the resource.
:param pulumi.ResourceOptions opts: Options for the resource.
+ :param pulumi.Input[bool] high_availability: Whether the bastion should be highly available.
:param pulumi.Input[str] instance_sku: The Azure instance SKU to use for the bastion.
:param pulumi.Input[str] location: The Azure region you're using.
:param pulumi.Input[str] resource_group_name: The Azure resource group to create the bastion in.
@@ -156,6 +175,7 @@ def __init__(__self__, resource_name: str, *args, **kwargs):
def _internal_init(__self__,
resource_name: str,
opts: Optional[pulumi.ResourceOptions] = None,
+ high_availability: Optional[pulumi.Input[bool]] = None,
instance_sku: Optional[pulumi.Input[str]] = None,
location: Optional[pulumi.Input[str]] = None,
resource_group_name: Optional[pulumi.Input[str]] = None,
@@ -173,6 +193,11 @@ def _internal_init(__self__,
raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
__props__ = BastionArgs.__new__(BastionArgs)
+ if high_availability is None:
+ high_availability = False
+ if high_availability is None and not opts.urn:
+ raise TypeError("Missing required property 'high_availability'")
+ __props__.__dict__["high_availability"] = high_availability
__props__.__dict__["instance_sku"] = instance_sku
if location is None and not opts.urn:
raise TypeError("Missing required property 'location'")
diff --git a/sdk/python/lbrlabs_pulumi_tailscalebastion/kubernetes/bastion.py b/sdk/python/lbrlabs_pulumi_tailscalebastion/kubernetes/bastion.py
index 8045580..caa078d 100644
--- a/sdk/python/lbrlabs_pulumi_tailscalebastion/kubernetes/bastion.py
+++ b/sdk/python/lbrlabs_pulumi_tailscalebastion/kubernetes/bastion.py
@@ -16,17 +16,22 @@
class BastionArgs:
def __init__(__self__, *,
create_namespace: bool,
+ high_availability: Optional[pulumi.Input[bool]] = None,
routes: pulumi.Input[Sequence[pulumi.Input[str]]],
tailscale_tags: pulumi.Input[Sequence[pulumi.Input[str]]],
namespace: Optional[pulumi.Input['pulumi_kubernetes.core.v1.Namespace']] = None):
"""
The set of arguments for constructing a Bastion resource.
:param bool create_namespace: Whether we should create a new namespace.
+ :param pulumi.Input[bool] high_availability: Whether the bastion should be highly available.
:param pulumi.Input[Sequence[pulumi.Input[str]]] routes: The routes to advertise to tailscale. This is likely the Pod and Service CIDR.
:param pulumi.Input[Sequence[pulumi.Input[str]]] tailscale_tags: The tags to apply to the tailnet device andauth key. This tag should be added to your oauth key and ACL.
:param pulumi.Input['pulumi_kubernetes.core.v1.Namespace'] namespace: The bucket resource.
"""
pulumi.set(__self__, "create_namespace", create_namespace)
+ if high_availability is None:
+ high_availability = False
+ pulumi.set(__self__, "high_availability", high_availability)
pulumi.set(__self__, "routes", routes)
pulumi.set(__self__, "tailscale_tags", tailscale_tags)
if namespace is not None:
@@ -44,6 +49,18 @@ def create_namespace(self) -> bool:
def create_namespace(self, value: bool):
pulumi.set(self, "create_namespace", value)
+ @property
+ @pulumi.getter(name="highAvailability")
+ def high_availability(self) -> pulumi.Input[bool]:
+ """
+ Whether the bastion should be highly available.
+ """
+ return pulumi.get(self, "high_availability")
+
+ @high_availability.setter
+ def high_availability(self, value: pulumi.Input[bool]):
+ pulumi.set(self, "high_availability", value)
+
@property
@pulumi.getter
def routes(self) -> pulumi.Input[Sequence[pulumi.Input[str]]]:
@@ -87,6 +104,7 @@ def __init__(__self__,
resource_name: str,
opts: Optional[pulumi.ResourceOptions] = None,
create_namespace: Optional[bool] = None,
+ high_availability: Optional[pulumi.Input[bool]] = None,
namespace: Optional[pulumi.Input['pulumi_kubernetes.core.v1.Namespace']] = None,
routes: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
tailscale_tags: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
@@ -96,6 +114,7 @@ def __init__(__self__,
:param str resource_name: The name of the resource.
:param pulumi.ResourceOptions opts: Options for the resource.
:param bool create_namespace: Whether we should create a new namespace.
+ :param pulumi.Input[bool] high_availability: Whether the bastion should be highly available.
:param pulumi.Input['pulumi_kubernetes.core.v1.Namespace'] namespace: The bucket resource.
:param pulumi.Input[Sequence[pulumi.Input[str]]] routes: The routes to advertise to tailscale. This is likely the Pod and Service CIDR.
:param pulumi.Input[Sequence[pulumi.Input[str]]] tailscale_tags: The tags to apply to the tailnet device andauth key. This tag should be added to your oauth key and ACL.
@@ -124,6 +143,7 @@ def _internal_init(__self__,
resource_name: str,
opts: Optional[pulumi.ResourceOptions] = None,
create_namespace: Optional[bool] = None,
+ high_availability: Optional[pulumi.Input[bool]] = None,
namespace: Optional[pulumi.Input['pulumi_kubernetes.core.v1.Namespace']] = None,
routes: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
tailscale_tags: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
@@ -141,6 +161,11 @@ def _internal_init(__self__,
if create_namespace is None and not opts.urn:
raise TypeError("Missing required property 'create_namespace'")
__props__.__dict__["create_namespace"] = create_namespace
+ if high_availability is None:
+ high_availability = False
+ if high_availability is None and not opts.urn:
+ raise TypeError("Missing required property 'high_availability'")
+ __props__.__dict__["high_availability"] = high_availability
__props__.__dict__["namespace"] = namespace
if routes is None and not opts.urn:
raise TypeError("Missing required property 'routes'")