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'")