// Code generated by crd2pulumi DO NOT EDIT.
// *** WARNING: Do not edit by hand unless you're certain you know what you are doing! ***

package v1alpha1

import (
	"context"
	"reflect"

	"antoine-roux.tk/projects/go/pulumi-library/crds/kubernetes/internal"
	v1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
)

var _ = internal.GetEnvOrDefault

// IngressRoute is the CRD implementation of a Traefik HTTP Router.
type IngressRouteType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// IngressRouteSpec defines the desired state of IngressRoute.
	Spec IngressRouteSpec `pulumi:"spec"`
}

type IngressRouteMetadata struct {
}

// IngressRouteSpec defines the desired state of IngressRoute.
type IngressRouteSpec struct {
	// EntryPoints defines the list of entry point names to bind to.
	// Entry points have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
	// Default: all.
	EntryPoints []string `pulumi:"entryPoints"`
	// Routes defines the list of routes.
	Routes []IngressRouteSpecRoutes `pulumi:"routes"`
	// TLS defines the TLS configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
	Tls *IngressRouteSpecTls `pulumi:"tls"`
}

// IngressRouteSpecInput is an input type that accepts IngressRouteSpecArgs and IngressRouteSpecOutput values.
// You can construct a concrete instance of `IngressRouteSpecInput` via:
//
//	IngressRouteSpecArgs{...}
type IngressRouteSpecInput interface {
	pulumi.Input

	ToIngressRouteSpecOutput() IngressRouteSpecOutput
	ToIngressRouteSpecOutputWithContext(context.Context) IngressRouteSpecOutput
}

// IngressRouteSpec defines the desired state of IngressRoute.
type IngressRouteSpecArgs struct {
	// EntryPoints defines the list of entry point names to bind to.
	// Entry points have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
	// Default: all.
	EntryPoints pulumi.StringArrayInput `pulumi:"entryPoints"`
	// Routes defines the list of routes.
	Routes IngressRouteSpecRoutesArrayInput `pulumi:"routes"`
	// TLS defines the TLS configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
	Tls IngressRouteSpecTlsPtrInput `pulumi:"tls"`
}

func (IngressRouteSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpec)(nil)).Elem()
}

func (i IngressRouteSpecArgs) ToIngressRouteSpecOutput() IngressRouteSpecOutput {
	return i.ToIngressRouteSpecOutputWithContext(context.Background())
}

func (i IngressRouteSpecArgs) ToIngressRouteSpecOutputWithContext(ctx context.Context) IngressRouteSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecOutput)
}

func (i IngressRouteSpecArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpec] {
	return pulumix.Output[IngressRouteSpec]{
		OutputState: i.ToIngressRouteSpecOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecArgs) ToIngressRouteSpecPtrOutput() IngressRouteSpecPtrOutput {
	return i.ToIngressRouteSpecPtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecArgs) ToIngressRouteSpecPtrOutputWithContext(ctx context.Context) IngressRouteSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecOutput).ToIngressRouteSpecPtrOutputWithContext(ctx)
}

// IngressRouteSpecPtrInput is an input type that accepts IngressRouteSpecArgs, IngressRouteSpecPtr and IngressRouteSpecPtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecPtrInput` via:
//
//	        IngressRouteSpecArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecPtrInput interface {
	pulumi.Input

	ToIngressRouteSpecPtrOutput() IngressRouteSpecPtrOutput
	ToIngressRouteSpecPtrOutputWithContext(context.Context) IngressRouteSpecPtrOutput
}

type ingressRouteSpecPtrType IngressRouteSpecArgs

func IngressRouteSpecPtr(v *IngressRouteSpecArgs) IngressRouteSpecPtrInput {
	return (*ingressRouteSpecPtrType)(v)
}

func (*ingressRouteSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpec)(nil)).Elem()
}

func (i *ingressRouteSpecPtrType) ToIngressRouteSpecPtrOutput() IngressRouteSpecPtrOutput {
	return i.ToIngressRouteSpecPtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecPtrType) ToIngressRouteSpecPtrOutputWithContext(ctx context.Context) IngressRouteSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecPtrOutput)
}

func (i *ingressRouteSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpec] {
	return pulumix.Output[*IngressRouteSpec]{
		OutputState: i.ToIngressRouteSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteSpec defines the desired state of IngressRoute.
type IngressRouteSpecOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpec)(nil)).Elem()
}

func (o IngressRouteSpecOutput) ToIngressRouteSpecOutput() IngressRouteSpecOutput {
	return o
}

func (o IngressRouteSpecOutput) ToIngressRouteSpecOutputWithContext(ctx context.Context) IngressRouteSpecOutput {
	return o
}

func (o IngressRouteSpecOutput) ToIngressRouteSpecPtrOutput() IngressRouteSpecPtrOutput {
	return o.ToIngressRouteSpecPtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecOutput) ToIngressRouteSpecPtrOutputWithContext(ctx context.Context) IngressRouteSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpec) *IngressRouteSpec {
		return &v
	}).(IngressRouteSpecPtrOutput)
}

func (o IngressRouteSpecOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpec] {
	return pulumix.Output[IngressRouteSpec]{
		OutputState: o.OutputState,
	}
}

// EntryPoints defines the list of entry point names to bind to.
// Entry points have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
// Default: all.
func (o IngressRouteSpecOutput) EntryPoints() pulumi.StringArrayOutput {
	return o.ApplyT(func(v IngressRouteSpec) []string { return v.EntryPoints }).(pulumi.StringArrayOutput)
}

// Routes defines the list of routes.
func (o IngressRouteSpecOutput) Routes() IngressRouteSpecRoutesArrayOutput {
	return o.ApplyT(func(v IngressRouteSpec) []IngressRouteSpecRoutes { return v.Routes }).(IngressRouteSpecRoutesArrayOutput)
}

// TLS defines the TLS configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
func (o IngressRouteSpecOutput) Tls() IngressRouteSpecTlsPtrOutput {
	return o.ApplyT(func(v IngressRouteSpec) *IngressRouteSpecTls { return v.Tls }).(IngressRouteSpecTlsPtrOutput)
}

type IngressRouteSpecPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpec)(nil)).Elem()
}

func (o IngressRouteSpecPtrOutput) ToIngressRouteSpecPtrOutput() IngressRouteSpecPtrOutput {
	return o
}

func (o IngressRouteSpecPtrOutput) ToIngressRouteSpecPtrOutputWithContext(ctx context.Context) IngressRouteSpecPtrOutput {
	return o
}

func (o IngressRouteSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpec] {
	return pulumix.Output[*IngressRouteSpec]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecPtrOutput) Elem() IngressRouteSpecOutput {
	return o.ApplyT(func(v *IngressRouteSpec) IngressRouteSpec {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpec
		return ret
	}).(IngressRouteSpecOutput)
}

// EntryPoints defines the list of entry point names to bind to.
// Entry points have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
// Default: all.
func (o IngressRouteSpecPtrOutput) EntryPoints() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *IngressRouteSpec) []string {
		if v == nil {
			return nil
		}
		return v.EntryPoints
	}).(pulumi.StringArrayOutput)
}

// Routes defines the list of routes.
func (o IngressRouteSpecPtrOutput) Routes() IngressRouteSpecRoutesArrayOutput {
	return o.ApplyT(func(v *IngressRouteSpec) []IngressRouteSpecRoutes {
		if v == nil {
			return nil
		}
		return v.Routes
	}).(IngressRouteSpecRoutesArrayOutput)
}

// TLS defines the TLS configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
func (o IngressRouteSpecPtrOutput) Tls() IngressRouteSpecTlsPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpec) *IngressRouteSpecTls {
		if v == nil {
			return nil
		}
		return v.Tls
	}).(IngressRouteSpecTlsPtrOutput)
}

// Route holds the HTTP route configuration.
type IngressRouteSpecRoutes struct {
	// Kind defines the kind of the route.
	// Rule is the only supported kind.
	Kind string `pulumi:"kind"`
	// Match defines the router's rule.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rule
	Match string `pulumi:"match"`
	// Middlewares defines the list of references to Middleware resources.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-middleware
	Middlewares []IngressRouteSpecRoutesMiddlewares `pulumi:"middlewares"`
	// Priority defines the router's priority.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#priority
	Priority *int `pulumi:"priority"`
	// Services defines the list of Service.
	// It can contain any combination of TraefikService and/or reference to a Kubernetes Service.
	Services []IngressRouteSpecRoutesServices `pulumi:"services"`
	// Syntax defines the router's rule syntax.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rulesyntax
	Syntax *string `pulumi:"syntax"`
}

// IngressRouteSpecRoutesInput is an input type that accepts IngressRouteSpecRoutesArgs and IngressRouteSpecRoutesOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesInput` via:
//
//	IngressRouteSpecRoutesArgs{...}
type IngressRouteSpecRoutesInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesOutput() IngressRouteSpecRoutesOutput
	ToIngressRouteSpecRoutesOutputWithContext(context.Context) IngressRouteSpecRoutesOutput
}

// Route holds the HTTP route configuration.
type IngressRouteSpecRoutesArgs struct {
	// Kind defines the kind of the route.
	// Rule is the only supported kind.
	Kind pulumi.StringInput `pulumi:"kind"`
	// Match defines the router's rule.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rule
	Match pulumi.StringInput `pulumi:"match"`
	// Middlewares defines the list of references to Middleware resources.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-middleware
	Middlewares IngressRouteSpecRoutesMiddlewaresArrayInput `pulumi:"middlewares"`
	// Priority defines the router's priority.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#priority
	Priority pulumi.IntPtrInput `pulumi:"priority"`
	// Services defines the list of Service.
	// It can contain any combination of TraefikService and/or reference to a Kubernetes Service.
	Services IngressRouteSpecRoutesServicesArrayInput `pulumi:"services"`
	// Syntax defines the router's rule syntax.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rulesyntax
	Syntax pulumi.StringPtrInput `pulumi:"syntax"`
}

func (IngressRouteSpecRoutesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutes)(nil)).Elem()
}

func (i IngressRouteSpecRoutesArgs) ToIngressRouteSpecRoutesOutput() IngressRouteSpecRoutesOutput {
	return i.ToIngressRouteSpecRoutesOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesArgs) ToIngressRouteSpecRoutesOutputWithContext(ctx context.Context) IngressRouteSpecRoutesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesOutput)
}

func (i IngressRouteSpecRoutesArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutes] {
	return pulumix.Output[IngressRouteSpecRoutes]{
		OutputState: i.ToIngressRouteSpecRoutesOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteSpecRoutesArrayInput is an input type that accepts IngressRouteSpecRoutesArray and IngressRouteSpecRoutesArrayOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesArrayInput` via:
//
//	IngressRouteSpecRoutesArray{ IngressRouteSpecRoutesArgs{...} }
type IngressRouteSpecRoutesArrayInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesArrayOutput() IngressRouteSpecRoutesArrayOutput
	ToIngressRouteSpecRoutesArrayOutputWithContext(context.Context) IngressRouteSpecRoutesArrayOutput
}

type IngressRouteSpecRoutesArray []IngressRouteSpecRoutesInput

func (IngressRouteSpecRoutesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecRoutes)(nil)).Elem()
}

func (i IngressRouteSpecRoutesArray) ToIngressRouteSpecRoutesArrayOutput() IngressRouteSpecRoutesArrayOutput {
	return i.ToIngressRouteSpecRoutesArrayOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesArray) ToIngressRouteSpecRoutesArrayOutputWithContext(ctx context.Context) IngressRouteSpecRoutesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesArrayOutput)
}

func (i IngressRouteSpecRoutesArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecRoutes] {
	return pulumix.Output[[]IngressRouteSpecRoutes]{
		OutputState: i.ToIngressRouteSpecRoutesArrayOutputWithContext(ctx).OutputState,
	}
}

// Route holds the HTTP route configuration.
type IngressRouteSpecRoutesOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutes)(nil)).Elem()
}

func (o IngressRouteSpecRoutesOutput) ToIngressRouteSpecRoutesOutput() IngressRouteSpecRoutesOutput {
	return o
}

func (o IngressRouteSpecRoutesOutput) ToIngressRouteSpecRoutesOutputWithContext(ctx context.Context) IngressRouteSpecRoutesOutput {
	return o
}

func (o IngressRouteSpecRoutesOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutes] {
	return pulumix.Output[IngressRouteSpecRoutes]{
		OutputState: o.OutputState,
	}
}

// Kind defines the kind of the route.
// Rule is the only supported kind.
func (o IngressRouteSpecRoutesOutput) Kind() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutes) string { return v.Kind }).(pulumi.StringOutput)
}

// Match defines the router's rule.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rule
func (o IngressRouteSpecRoutesOutput) Match() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutes) string { return v.Match }).(pulumi.StringOutput)
}

// Middlewares defines the list of references to Middleware resources.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-middleware
func (o IngressRouteSpecRoutesOutput) Middlewares() IngressRouteSpecRoutesMiddlewaresArrayOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutes) []IngressRouteSpecRoutesMiddlewares { return v.Middlewares }).(IngressRouteSpecRoutesMiddlewaresArrayOutput)
}

// Priority defines the router's priority.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#priority
func (o IngressRouteSpecRoutesOutput) Priority() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutes) *int { return v.Priority }).(pulumi.IntPtrOutput)
}

// Services defines the list of Service.
// It can contain any combination of TraefikService and/or reference to a Kubernetes Service.
func (o IngressRouteSpecRoutesOutput) Services() IngressRouteSpecRoutesServicesArrayOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutes) []IngressRouteSpecRoutesServices { return v.Services }).(IngressRouteSpecRoutesServicesArrayOutput)
}

// Syntax defines the router's rule syntax.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rulesyntax
func (o IngressRouteSpecRoutesOutput) Syntax() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutes) *string { return v.Syntax }).(pulumi.StringPtrOutput)
}

type IngressRouteSpecRoutesArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecRoutes)(nil)).Elem()
}

func (o IngressRouteSpecRoutesArrayOutput) ToIngressRouteSpecRoutesArrayOutput() IngressRouteSpecRoutesArrayOutput {
	return o
}

func (o IngressRouteSpecRoutesArrayOutput) ToIngressRouteSpecRoutesArrayOutputWithContext(ctx context.Context) IngressRouteSpecRoutesArrayOutput {
	return o
}

func (o IngressRouteSpecRoutesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecRoutes] {
	return pulumix.Output[[]IngressRouteSpecRoutes]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesArrayOutput) Index(i pulumi.IntInput) IngressRouteSpecRoutesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteSpecRoutes {
		return vs[0].([]IngressRouteSpecRoutes)[vs[1].(int)]
	}).(IngressRouteSpecRoutesOutput)
}

// MiddlewareRef is a reference to a Middleware resource.
type IngressRouteSpecRoutesMiddlewares struct {
	// Name defines the name of the referenced Middleware resource.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Middleware resource.
	Namespace *string `pulumi:"namespace"`
}

// IngressRouteSpecRoutesMiddlewaresInput is an input type that accepts IngressRouteSpecRoutesMiddlewaresArgs and IngressRouteSpecRoutesMiddlewaresOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesMiddlewaresInput` via:
//
//	IngressRouteSpecRoutesMiddlewaresArgs{...}
type IngressRouteSpecRoutesMiddlewaresInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesMiddlewaresOutput() IngressRouteSpecRoutesMiddlewaresOutput
	ToIngressRouteSpecRoutesMiddlewaresOutputWithContext(context.Context) IngressRouteSpecRoutesMiddlewaresOutput
}

// MiddlewareRef is a reference to a Middleware resource.
type IngressRouteSpecRoutesMiddlewaresArgs struct {
	// Name defines the name of the referenced Middleware resource.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Middleware resource.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (IngressRouteSpecRoutesMiddlewaresArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesMiddlewares)(nil)).Elem()
}

func (i IngressRouteSpecRoutesMiddlewaresArgs) ToIngressRouteSpecRoutesMiddlewaresOutput() IngressRouteSpecRoutesMiddlewaresOutput {
	return i.ToIngressRouteSpecRoutesMiddlewaresOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesMiddlewaresArgs) ToIngressRouteSpecRoutesMiddlewaresOutputWithContext(ctx context.Context) IngressRouteSpecRoutesMiddlewaresOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesMiddlewaresOutput)
}

func (i IngressRouteSpecRoutesMiddlewaresArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesMiddlewares] {
	return pulumix.Output[IngressRouteSpecRoutesMiddlewares]{
		OutputState: i.ToIngressRouteSpecRoutesMiddlewaresOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteSpecRoutesMiddlewaresArrayInput is an input type that accepts IngressRouteSpecRoutesMiddlewaresArray and IngressRouteSpecRoutesMiddlewaresArrayOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesMiddlewaresArrayInput` via:
//
//	IngressRouteSpecRoutesMiddlewaresArray{ IngressRouteSpecRoutesMiddlewaresArgs{...} }
type IngressRouteSpecRoutesMiddlewaresArrayInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesMiddlewaresArrayOutput() IngressRouteSpecRoutesMiddlewaresArrayOutput
	ToIngressRouteSpecRoutesMiddlewaresArrayOutputWithContext(context.Context) IngressRouteSpecRoutesMiddlewaresArrayOutput
}

type IngressRouteSpecRoutesMiddlewaresArray []IngressRouteSpecRoutesMiddlewaresInput

func (IngressRouteSpecRoutesMiddlewaresArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecRoutesMiddlewares)(nil)).Elem()
}

func (i IngressRouteSpecRoutesMiddlewaresArray) ToIngressRouteSpecRoutesMiddlewaresArrayOutput() IngressRouteSpecRoutesMiddlewaresArrayOutput {
	return i.ToIngressRouteSpecRoutesMiddlewaresArrayOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesMiddlewaresArray) ToIngressRouteSpecRoutesMiddlewaresArrayOutputWithContext(ctx context.Context) IngressRouteSpecRoutesMiddlewaresArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesMiddlewaresArrayOutput)
}

func (i IngressRouteSpecRoutesMiddlewaresArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecRoutesMiddlewares] {
	return pulumix.Output[[]IngressRouteSpecRoutesMiddlewares]{
		OutputState: i.ToIngressRouteSpecRoutesMiddlewaresArrayOutputWithContext(ctx).OutputState,
	}
}

// MiddlewareRef is a reference to a Middleware resource.
type IngressRouteSpecRoutesMiddlewaresOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesMiddlewaresOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesMiddlewares)(nil)).Elem()
}

func (o IngressRouteSpecRoutesMiddlewaresOutput) ToIngressRouteSpecRoutesMiddlewaresOutput() IngressRouteSpecRoutesMiddlewaresOutput {
	return o
}

func (o IngressRouteSpecRoutesMiddlewaresOutput) ToIngressRouteSpecRoutesMiddlewaresOutputWithContext(ctx context.Context) IngressRouteSpecRoutesMiddlewaresOutput {
	return o
}

func (o IngressRouteSpecRoutesMiddlewaresOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesMiddlewares] {
	return pulumix.Output[IngressRouteSpecRoutesMiddlewares]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Middleware resource.
func (o IngressRouteSpecRoutesMiddlewaresOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesMiddlewares) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Middleware resource.
func (o IngressRouteSpecRoutesMiddlewaresOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesMiddlewares) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type IngressRouteSpecRoutesMiddlewaresArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesMiddlewaresArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecRoutesMiddlewares)(nil)).Elem()
}

func (o IngressRouteSpecRoutesMiddlewaresArrayOutput) ToIngressRouteSpecRoutesMiddlewaresArrayOutput() IngressRouteSpecRoutesMiddlewaresArrayOutput {
	return o
}

func (o IngressRouteSpecRoutesMiddlewaresArrayOutput) ToIngressRouteSpecRoutesMiddlewaresArrayOutputWithContext(ctx context.Context) IngressRouteSpecRoutesMiddlewaresArrayOutput {
	return o
}

func (o IngressRouteSpecRoutesMiddlewaresArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecRoutesMiddlewares] {
	return pulumix.Output[[]IngressRouteSpecRoutesMiddlewares]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesMiddlewaresArrayOutput) Index(i pulumi.IntInput) IngressRouteSpecRoutesMiddlewaresOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteSpecRoutesMiddlewares {
		return vs[0].([]IngressRouteSpecRoutesMiddlewares)[vs[1].(int)]
	}).(IngressRouteSpecRoutesMiddlewaresOutput)
}

// Service defines an upstream HTTP service to proxy traffic to.
type IngressRouteSpecRoutesServices struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck *IngressRouteSpecRoutesServicesHealthCheck `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind *string `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader *bool `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding *IngressRouteSpecRoutesServicesResponseForwarding `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme *string `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport *string `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky *IngressRouteSpecRoutesServicesSticky `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy *string `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight *int `pulumi:"weight"`
}

// IngressRouteSpecRoutesServicesInput is an input type that accepts IngressRouteSpecRoutesServicesArgs and IngressRouteSpecRoutesServicesOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesInput` via:
//
//	IngressRouteSpecRoutesServicesArgs{...}
type IngressRouteSpecRoutesServicesInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesOutput() IngressRouteSpecRoutesServicesOutput
	ToIngressRouteSpecRoutesServicesOutputWithContext(context.Context) IngressRouteSpecRoutesServicesOutput
}

// Service defines an upstream HTTP service to proxy traffic to.
type IngressRouteSpecRoutesServicesArgs struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck IngressRouteSpecRoutesServicesHealthCheckPtrInput `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind pulumi.StringPtrInput `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader pulumi.BoolPtrInput `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding IngressRouteSpecRoutesServicesResponseForwardingPtrInput `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport pulumi.StringPtrInput `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky IngressRouteSpecRoutesServicesStickyPtrInput `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy pulumi.StringPtrInput `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (IngressRouteSpecRoutesServicesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServices)(nil)).Elem()
}

func (i IngressRouteSpecRoutesServicesArgs) ToIngressRouteSpecRoutesServicesOutput() IngressRouteSpecRoutesServicesOutput {
	return i.ToIngressRouteSpecRoutesServicesOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesArgs) ToIngressRouteSpecRoutesServicesOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesOutput)
}

func (i IngressRouteSpecRoutesServicesArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServices] {
	return pulumix.Output[IngressRouteSpecRoutesServices]{
		OutputState: i.ToIngressRouteSpecRoutesServicesOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteSpecRoutesServicesArrayInput is an input type that accepts IngressRouteSpecRoutesServicesArray and IngressRouteSpecRoutesServicesArrayOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesArrayInput` via:
//
//	IngressRouteSpecRoutesServicesArray{ IngressRouteSpecRoutesServicesArgs{...} }
type IngressRouteSpecRoutesServicesArrayInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesArrayOutput() IngressRouteSpecRoutesServicesArrayOutput
	ToIngressRouteSpecRoutesServicesArrayOutputWithContext(context.Context) IngressRouteSpecRoutesServicesArrayOutput
}

type IngressRouteSpecRoutesServicesArray []IngressRouteSpecRoutesServicesInput

func (IngressRouteSpecRoutesServicesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecRoutesServices)(nil)).Elem()
}

func (i IngressRouteSpecRoutesServicesArray) ToIngressRouteSpecRoutesServicesArrayOutput() IngressRouteSpecRoutesServicesArrayOutput {
	return i.ToIngressRouteSpecRoutesServicesArrayOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesArray) ToIngressRouteSpecRoutesServicesArrayOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesArrayOutput)
}

func (i IngressRouteSpecRoutesServicesArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecRoutesServices] {
	return pulumix.Output[[]IngressRouteSpecRoutesServices]{
		OutputState: i.ToIngressRouteSpecRoutesServicesArrayOutputWithContext(ctx).OutputState,
	}
}

// Service defines an upstream HTTP service to proxy traffic to.
type IngressRouteSpecRoutesServicesOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServices)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesOutput) ToIngressRouteSpecRoutesServicesOutput() IngressRouteSpecRoutesServicesOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesOutput) ToIngressRouteSpecRoutesServicesOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServices] {
	return pulumix.Output[IngressRouteSpecRoutesServices]{
		OutputState: o.OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
func (o IngressRouteSpecRoutesServicesOutput) HealthCheck() IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *IngressRouteSpecRoutesServicesHealthCheck {
		return v.HealthCheck
	}).(IngressRouteSpecRoutesServicesHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o IngressRouteSpecRoutesServicesOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *string { return v.Kind }).(pulumi.StringPtrOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o IngressRouteSpecRoutesServicesOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o IngressRouteSpecRoutesServicesOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o IngressRouteSpecRoutesServicesOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o IngressRouteSpecRoutesServicesOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o IngressRouteSpecRoutesServicesOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *bool { return v.PassHostHeader }).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o IngressRouteSpecRoutesServicesOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o IngressRouteSpecRoutesServicesOutput) ResponseForwarding() IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *IngressRouteSpecRoutesServicesResponseForwarding {
		return v.ResponseForwarding
	}).(IngressRouteSpecRoutesServicesResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o IngressRouteSpecRoutesServicesOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o IngressRouteSpecRoutesServicesOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *string { return v.ServersTransport }).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o IngressRouteSpecRoutesServicesOutput) Sticky() IngressRouteSpecRoutesServicesStickyPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *IngressRouteSpecRoutesServicesSticky { return v.Sticky }).(IngressRouteSpecRoutesServicesStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o IngressRouteSpecRoutesServicesOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *string { return v.Strategy }).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o IngressRouteSpecRoutesServicesOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServices) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type IngressRouteSpecRoutesServicesArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecRoutesServices)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesArrayOutput) ToIngressRouteSpecRoutesServicesArrayOutput() IngressRouteSpecRoutesServicesArrayOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesArrayOutput) ToIngressRouteSpecRoutesServicesArrayOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesArrayOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecRoutesServices] {
	return pulumix.Output[[]IngressRouteSpecRoutesServices]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesServicesArrayOutput) Index(i pulumi.IntInput) IngressRouteSpecRoutesServicesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteSpecRoutesServices {
		return vs[0].([]IngressRouteSpecRoutesServices)[vs[1].(int)]
	}).(IngressRouteSpecRoutesServicesOutput)
}

// Healthcheck defines health checks for ExternalName services.
type IngressRouteSpecRoutesServicesHealthCheck struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects *bool `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers map[string]string `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname *string `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval interface{} `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method *string `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode *string `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path *string `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port *int `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme *string `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status *int `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout interface{} `pulumi:"timeout"`
}

// IngressRouteSpecRoutesServicesHealthCheckInput is an input type that accepts IngressRouteSpecRoutesServicesHealthCheckArgs and IngressRouteSpecRoutesServicesHealthCheckOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesHealthCheckInput` via:
//
//	IngressRouteSpecRoutesServicesHealthCheckArgs{...}
type IngressRouteSpecRoutesServicesHealthCheckInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesHealthCheckOutput() IngressRouteSpecRoutesServicesHealthCheckOutput
	ToIngressRouteSpecRoutesServicesHealthCheckOutputWithContext(context.Context) IngressRouteSpecRoutesServicesHealthCheckOutput
}

// Healthcheck defines health checks for ExternalName services.
type IngressRouteSpecRoutesServicesHealthCheckArgs struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects pulumi.BoolPtrInput `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers pulumi.StringMapInput `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname pulumi.StringPtrInput `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval pulumi.Input `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method pulumi.StringPtrInput `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode pulumi.StringPtrInput `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path pulumi.StringPtrInput `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port pulumi.IntPtrInput `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status pulumi.IntPtrInput `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout pulumi.Input `pulumi:"timeout"`
}

func (IngressRouteSpecRoutesServicesHealthCheckArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesHealthCheck)(nil)).Elem()
}

func (i IngressRouteSpecRoutesServicesHealthCheckArgs) ToIngressRouteSpecRoutesServicesHealthCheckOutput() IngressRouteSpecRoutesServicesHealthCheckOutput {
	return i.ToIngressRouteSpecRoutesServicesHealthCheckOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesHealthCheckArgs) ToIngressRouteSpecRoutesServicesHealthCheckOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesHealthCheckOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesHealthCheckOutput)
}

func (i IngressRouteSpecRoutesServicesHealthCheckArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesHealthCheck] {
	return pulumix.Output[IngressRouteSpecRoutesServicesHealthCheck]{
		OutputState: i.ToIngressRouteSpecRoutesServicesHealthCheckOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecRoutesServicesHealthCheckArgs) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutput() IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return i.ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesHealthCheckArgs) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesHealthCheckOutput).ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(ctx)
}

// IngressRouteSpecRoutesServicesHealthCheckPtrInput is an input type that accepts IngressRouteSpecRoutesServicesHealthCheckArgs, IngressRouteSpecRoutesServicesHealthCheckPtr and IngressRouteSpecRoutesServicesHealthCheckPtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesHealthCheckPtrInput` via:
//
//	        IngressRouteSpecRoutesServicesHealthCheckArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecRoutesServicesHealthCheckPtrInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesHealthCheckPtrOutput() IngressRouteSpecRoutesServicesHealthCheckPtrOutput
	ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(context.Context) IngressRouteSpecRoutesServicesHealthCheckPtrOutput
}

type ingressRouteSpecRoutesServicesHealthCheckPtrType IngressRouteSpecRoutesServicesHealthCheckArgs

func IngressRouteSpecRoutesServicesHealthCheckPtr(v *IngressRouteSpecRoutesServicesHealthCheckArgs) IngressRouteSpecRoutesServicesHealthCheckPtrInput {
	return (*ingressRouteSpecRoutesServicesHealthCheckPtrType)(v)
}

func (*ingressRouteSpecRoutesServicesHealthCheckPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesHealthCheck)(nil)).Elem()
}

func (i *ingressRouteSpecRoutesServicesHealthCheckPtrType) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutput() IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return i.ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecRoutesServicesHealthCheckPtrType) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesHealthCheckPtrOutput)
}

func (i *ingressRouteSpecRoutesServicesHealthCheckPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesHealthCheck] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesHealthCheck]{
		OutputState: i.ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(ctx).OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
type IngressRouteSpecRoutesServicesHealthCheckOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesHealthCheckOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesHealthCheck)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesHealthCheckOutput) ToIngressRouteSpecRoutesServicesHealthCheckOutput() IngressRouteSpecRoutesServicesHealthCheckOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesHealthCheckOutput) ToIngressRouteSpecRoutesServicesHealthCheckOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesHealthCheckOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesHealthCheckOutput) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutput() IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return o.ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecRoutesServicesHealthCheckOutput) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecRoutesServicesHealthCheck) *IngressRouteSpecRoutesServicesHealthCheck {
		return &v
	}).(IngressRouteSpecRoutesServicesHealthCheckPtrOutput)
}

func (o IngressRouteSpecRoutesServicesHealthCheckOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesHealthCheck] {
	return pulumix.Output[IngressRouteSpecRoutesServicesHealthCheck]{
		OutputState: o.OutputState,
	}
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *bool { return v.FollowRedirects }).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) map[string]string { return v.Headers }).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *string { return v.Hostname }).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) interface{} { return v.Interval }).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *string { return v.Method }).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *string { return v.Mode }).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *string { return v.Path }).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *int { return v.Port }).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) *int { return v.Status }).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o IngressRouteSpecRoutesServicesHealthCheckOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesHealthCheck) interface{} { return v.Timeout }).(pulumi.AnyOutput)
}

type IngressRouteSpecRoutesServicesHealthCheckPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesHealthCheckPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesHealthCheck)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutput() IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) ToIngressRouteSpecRoutesServicesHealthCheckPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesHealthCheckPtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesHealthCheck] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesHealthCheck]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Elem() IngressRouteSpecRoutesServicesHealthCheckOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) IngressRouteSpecRoutesServicesHealthCheck {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecRoutesServicesHealthCheck
		return ret
	}).(IngressRouteSpecRoutesServicesHealthCheckOutput)
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *bool {
		if v == nil {
			return nil
		}
		return v.FollowRedirects
	}).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) map[string]string {
		if v == nil {
			return nil
		}
		return v.Headers
	}).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Hostname
	}).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Interval
	}).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Method
	}).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Mode
	}).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Path
	}).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Status
	}).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o IngressRouteSpecRoutesServicesHealthCheckPtrOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Timeout
	}).(pulumi.AnyOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
type IngressRouteSpecRoutesServicesHealthCheckHeaders struct {
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type IngressRouteSpecRoutesServicesResponseForwarding struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval *string `pulumi:"flushInterval"`
}

// IngressRouteSpecRoutesServicesResponseForwardingInput is an input type that accepts IngressRouteSpecRoutesServicesResponseForwardingArgs and IngressRouteSpecRoutesServicesResponseForwardingOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesResponseForwardingInput` via:
//
//	IngressRouteSpecRoutesServicesResponseForwardingArgs{...}
type IngressRouteSpecRoutesServicesResponseForwardingInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesResponseForwardingOutput() IngressRouteSpecRoutesServicesResponseForwardingOutput
	ToIngressRouteSpecRoutesServicesResponseForwardingOutputWithContext(context.Context) IngressRouteSpecRoutesServicesResponseForwardingOutput
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type IngressRouteSpecRoutesServicesResponseForwardingArgs struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval pulumi.StringPtrInput `pulumi:"flushInterval"`
}

func (IngressRouteSpecRoutesServicesResponseForwardingArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesResponseForwarding)(nil)).Elem()
}

func (i IngressRouteSpecRoutesServicesResponseForwardingArgs) ToIngressRouteSpecRoutesServicesResponseForwardingOutput() IngressRouteSpecRoutesServicesResponseForwardingOutput {
	return i.ToIngressRouteSpecRoutesServicesResponseForwardingOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesResponseForwardingArgs) ToIngressRouteSpecRoutesServicesResponseForwardingOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesResponseForwardingOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesResponseForwardingOutput)
}

func (i IngressRouteSpecRoutesServicesResponseForwardingArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesResponseForwarding] {
	return pulumix.Output[IngressRouteSpecRoutesServicesResponseForwarding]{
		OutputState: i.ToIngressRouteSpecRoutesServicesResponseForwardingOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecRoutesServicesResponseForwardingArgs) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutput() IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return i.ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesResponseForwardingArgs) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesResponseForwardingOutput).ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(ctx)
}

// IngressRouteSpecRoutesServicesResponseForwardingPtrInput is an input type that accepts IngressRouteSpecRoutesServicesResponseForwardingArgs, IngressRouteSpecRoutesServicesResponseForwardingPtr and IngressRouteSpecRoutesServicesResponseForwardingPtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesResponseForwardingPtrInput` via:
//
//	        IngressRouteSpecRoutesServicesResponseForwardingArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecRoutesServicesResponseForwardingPtrInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutput() IngressRouteSpecRoutesServicesResponseForwardingPtrOutput
	ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(context.Context) IngressRouteSpecRoutesServicesResponseForwardingPtrOutput
}

type ingressRouteSpecRoutesServicesResponseForwardingPtrType IngressRouteSpecRoutesServicesResponseForwardingArgs

func IngressRouteSpecRoutesServicesResponseForwardingPtr(v *IngressRouteSpecRoutesServicesResponseForwardingArgs) IngressRouteSpecRoutesServicesResponseForwardingPtrInput {
	return (*ingressRouteSpecRoutesServicesResponseForwardingPtrType)(v)
}

func (*ingressRouteSpecRoutesServicesResponseForwardingPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesResponseForwarding)(nil)).Elem()
}

func (i *ingressRouteSpecRoutesServicesResponseForwardingPtrType) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutput() IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return i.ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecRoutesServicesResponseForwardingPtrType) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesResponseForwardingPtrOutput)
}

func (i *ingressRouteSpecRoutesServicesResponseForwardingPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesResponseForwarding] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesResponseForwarding]{
		OutputState: i.ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(ctx).OutputState,
	}
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type IngressRouteSpecRoutesServicesResponseForwardingOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesResponseForwardingOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesResponseForwarding)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesResponseForwardingOutput) ToIngressRouteSpecRoutesServicesResponseForwardingOutput() IngressRouteSpecRoutesServicesResponseForwardingOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesResponseForwardingOutput) ToIngressRouteSpecRoutesServicesResponseForwardingOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesResponseForwardingOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesResponseForwardingOutput) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutput() IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return o.ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecRoutesServicesResponseForwardingOutput) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecRoutesServicesResponseForwarding) *IngressRouteSpecRoutesServicesResponseForwarding {
		return &v
	}).(IngressRouteSpecRoutesServicesResponseForwardingPtrOutput)
}

func (o IngressRouteSpecRoutesServicesResponseForwardingOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesResponseForwarding] {
	return pulumix.Output[IngressRouteSpecRoutesServicesResponseForwarding]{
		OutputState: o.OutputState,
	}
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o IngressRouteSpecRoutesServicesResponseForwardingOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesResponseForwarding) *string { return v.FlushInterval }).(pulumi.StringPtrOutput)
}

type IngressRouteSpecRoutesServicesResponseForwardingPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesResponseForwardingPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesResponseForwarding)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesResponseForwardingPtrOutput) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutput() IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesResponseForwardingPtrOutput) ToIngressRouteSpecRoutesServicesResponseForwardingPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesResponseForwardingPtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesResponseForwardingPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesResponseForwarding] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesResponseForwarding]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesServicesResponseForwardingPtrOutput) Elem() IngressRouteSpecRoutesServicesResponseForwardingOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesResponseForwarding) IngressRouteSpecRoutesServicesResponseForwarding {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecRoutesServicesResponseForwarding
		return ret
	}).(IngressRouteSpecRoutesServicesResponseForwardingOutput)
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o IngressRouteSpecRoutesServicesResponseForwardingPtrOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesResponseForwarding) *string {
		if v == nil {
			return nil
		}
		return v.FlushInterval
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type IngressRouteSpecRoutesServicesSticky struct {
	// Cookie defines the sticky cookie configuration.
	Cookie *IngressRouteSpecRoutesServicesStickyCookie `pulumi:"cookie"`
}

// IngressRouteSpecRoutesServicesStickyInput is an input type that accepts IngressRouteSpecRoutesServicesStickyArgs and IngressRouteSpecRoutesServicesStickyOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesStickyInput` via:
//
//	IngressRouteSpecRoutesServicesStickyArgs{...}
type IngressRouteSpecRoutesServicesStickyInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesStickyOutput() IngressRouteSpecRoutesServicesStickyOutput
	ToIngressRouteSpecRoutesServicesStickyOutputWithContext(context.Context) IngressRouteSpecRoutesServicesStickyOutput
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type IngressRouteSpecRoutesServicesStickyArgs struct {
	// Cookie defines the sticky cookie configuration.
	Cookie IngressRouteSpecRoutesServicesStickyCookiePtrInput `pulumi:"cookie"`
}

func (IngressRouteSpecRoutesServicesStickyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesSticky)(nil)).Elem()
}

func (i IngressRouteSpecRoutesServicesStickyArgs) ToIngressRouteSpecRoutesServicesStickyOutput() IngressRouteSpecRoutesServicesStickyOutput {
	return i.ToIngressRouteSpecRoutesServicesStickyOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesStickyArgs) ToIngressRouteSpecRoutesServicesStickyOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesStickyOutput)
}

func (i IngressRouteSpecRoutesServicesStickyArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesSticky] {
	return pulumix.Output[IngressRouteSpecRoutesServicesSticky]{
		OutputState: i.ToIngressRouteSpecRoutesServicesStickyOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecRoutesServicesStickyArgs) ToIngressRouteSpecRoutesServicesStickyPtrOutput() IngressRouteSpecRoutesServicesStickyPtrOutput {
	return i.ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesStickyArgs) ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesStickyOutput).ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(ctx)
}

// IngressRouteSpecRoutesServicesStickyPtrInput is an input type that accepts IngressRouteSpecRoutesServicesStickyArgs, IngressRouteSpecRoutesServicesStickyPtr and IngressRouteSpecRoutesServicesStickyPtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesStickyPtrInput` via:
//
//	        IngressRouteSpecRoutesServicesStickyArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecRoutesServicesStickyPtrInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesStickyPtrOutput() IngressRouteSpecRoutesServicesStickyPtrOutput
	ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(context.Context) IngressRouteSpecRoutesServicesStickyPtrOutput
}

type ingressRouteSpecRoutesServicesStickyPtrType IngressRouteSpecRoutesServicesStickyArgs

func IngressRouteSpecRoutesServicesStickyPtr(v *IngressRouteSpecRoutesServicesStickyArgs) IngressRouteSpecRoutesServicesStickyPtrInput {
	return (*ingressRouteSpecRoutesServicesStickyPtrType)(v)
}

func (*ingressRouteSpecRoutesServicesStickyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesSticky)(nil)).Elem()
}

func (i *ingressRouteSpecRoutesServicesStickyPtrType) ToIngressRouteSpecRoutesServicesStickyPtrOutput() IngressRouteSpecRoutesServicesStickyPtrOutput {
	return i.ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecRoutesServicesStickyPtrType) ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesStickyPtrOutput)
}

func (i *ingressRouteSpecRoutesServicesStickyPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesSticky] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesSticky]{
		OutputState: i.ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(ctx).OutputState,
	}
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type IngressRouteSpecRoutesServicesStickyOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesStickyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesSticky)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesStickyOutput) ToIngressRouteSpecRoutesServicesStickyOutput() IngressRouteSpecRoutesServicesStickyOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyOutput) ToIngressRouteSpecRoutesServicesStickyOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyOutput) ToIngressRouteSpecRoutesServicesStickyPtrOutput() IngressRouteSpecRoutesServicesStickyPtrOutput {
	return o.ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecRoutesServicesStickyOutput) ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecRoutesServicesSticky) *IngressRouteSpecRoutesServicesSticky {
		return &v
	}).(IngressRouteSpecRoutesServicesStickyPtrOutput)
}

func (o IngressRouteSpecRoutesServicesStickyOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesSticky] {
	return pulumix.Output[IngressRouteSpecRoutesServicesSticky]{
		OutputState: o.OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
func (o IngressRouteSpecRoutesServicesStickyOutput) Cookie() IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesSticky) *IngressRouteSpecRoutesServicesStickyCookie {
		return v.Cookie
	}).(IngressRouteSpecRoutesServicesStickyCookiePtrOutput)
}

type IngressRouteSpecRoutesServicesStickyPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesStickyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesSticky)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesStickyPtrOutput) ToIngressRouteSpecRoutesServicesStickyPtrOutput() IngressRouteSpecRoutesServicesStickyPtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyPtrOutput) ToIngressRouteSpecRoutesServicesStickyPtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyPtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesSticky] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesSticky]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesServicesStickyPtrOutput) Elem() IngressRouteSpecRoutesServicesStickyOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesSticky) IngressRouteSpecRoutesServicesSticky {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecRoutesServicesSticky
		return ret
	}).(IngressRouteSpecRoutesServicesStickyOutput)
}

// Cookie defines the sticky cookie configuration.
func (o IngressRouteSpecRoutesServicesStickyPtrOutput) Cookie() IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesSticky) *IngressRouteSpecRoutesServicesStickyCookie {
		if v == nil {
			return nil
		}
		return v.Cookie
	}).(IngressRouteSpecRoutesServicesStickyCookiePtrOutput)
}

// Cookie defines the sticky cookie configuration.
type IngressRouteSpecRoutesServicesStickyCookie struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly *bool `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge *int `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name *string `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite *string `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure *bool `pulumi:"secure"`
}

// IngressRouteSpecRoutesServicesStickyCookieInput is an input type that accepts IngressRouteSpecRoutesServicesStickyCookieArgs and IngressRouteSpecRoutesServicesStickyCookieOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesStickyCookieInput` via:
//
//	IngressRouteSpecRoutesServicesStickyCookieArgs{...}
type IngressRouteSpecRoutesServicesStickyCookieInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesStickyCookieOutput() IngressRouteSpecRoutesServicesStickyCookieOutput
	ToIngressRouteSpecRoutesServicesStickyCookieOutputWithContext(context.Context) IngressRouteSpecRoutesServicesStickyCookieOutput
}

// Cookie defines the sticky cookie configuration.
type IngressRouteSpecRoutesServicesStickyCookieArgs struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly pulumi.BoolPtrInput `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge pulumi.IntPtrInput `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name pulumi.StringPtrInput `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite pulumi.StringPtrInput `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure pulumi.BoolPtrInput `pulumi:"secure"`
}

func (IngressRouteSpecRoutesServicesStickyCookieArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesStickyCookie)(nil)).Elem()
}

func (i IngressRouteSpecRoutesServicesStickyCookieArgs) ToIngressRouteSpecRoutesServicesStickyCookieOutput() IngressRouteSpecRoutesServicesStickyCookieOutput {
	return i.ToIngressRouteSpecRoutesServicesStickyCookieOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesStickyCookieArgs) ToIngressRouteSpecRoutesServicesStickyCookieOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyCookieOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesStickyCookieOutput)
}

func (i IngressRouteSpecRoutesServicesStickyCookieArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesStickyCookie] {
	return pulumix.Output[IngressRouteSpecRoutesServicesStickyCookie]{
		OutputState: i.ToIngressRouteSpecRoutesServicesStickyCookieOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecRoutesServicesStickyCookieArgs) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutput() IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return i.ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecRoutesServicesStickyCookieArgs) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesStickyCookieOutput).ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(ctx)
}

// IngressRouteSpecRoutesServicesStickyCookiePtrInput is an input type that accepts IngressRouteSpecRoutesServicesStickyCookieArgs, IngressRouteSpecRoutesServicesStickyCookiePtr and IngressRouteSpecRoutesServicesStickyCookiePtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecRoutesServicesStickyCookiePtrInput` via:
//
//	        IngressRouteSpecRoutesServicesStickyCookieArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecRoutesServicesStickyCookiePtrInput interface {
	pulumi.Input

	ToIngressRouteSpecRoutesServicesStickyCookiePtrOutput() IngressRouteSpecRoutesServicesStickyCookiePtrOutput
	ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(context.Context) IngressRouteSpecRoutesServicesStickyCookiePtrOutput
}

type ingressRouteSpecRoutesServicesStickyCookiePtrType IngressRouteSpecRoutesServicesStickyCookieArgs

func IngressRouteSpecRoutesServicesStickyCookiePtr(v *IngressRouteSpecRoutesServicesStickyCookieArgs) IngressRouteSpecRoutesServicesStickyCookiePtrInput {
	return (*ingressRouteSpecRoutesServicesStickyCookiePtrType)(v)
}

func (*ingressRouteSpecRoutesServicesStickyCookiePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesStickyCookie)(nil)).Elem()
}

func (i *ingressRouteSpecRoutesServicesStickyCookiePtrType) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutput() IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return i.ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecRoutesServicesStickyCookiePtrType) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecRoutesServicesStickyCookiePtrOutput)
}

func (i *ingressRouteSpecRoutesServicesStickyCookiePtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesStickyCookie] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesStickyCookie]{
		OutputState: i.ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(ctx).OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
type IngressRouteSpecRoutesServicesStickyCookieOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesStickyCookieOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecRoutesServicesStickyCookie)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesStickyCookieOutput) ToIngressRouteSpecRoutesServicesStickyCookieOutput() IngressRouteSpecRoutesServicesStickyCookieOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyCookieOutput) ToIngressRouteSpecRoutesServicesStickyCookieOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyCookieOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyCookieOutput) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutput() IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return o.ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecRoutesServicesStickyCookieOutput) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecRoutesServicesStickyCookie) *IngressRouteSpecRoutesServicesStickyCookie {
		return &v
	}).(IngressRouteSpecRoutesServicesStickyCookiePtrOutput)
}

func (o IngressRouteSpecRoutesServicesStickyCookieOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecRoutesServicesStickyCookie] {
	return pulumix.Output[IngressRouteSpecRoutesServicesStickyCookie]{
		OutputState: o.OutputState,
	}
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o IngressRouteSpecRoutesServicesStickyCookieOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesStickyCookie) *bool { return v.HttpOnly }).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o IngressRouteSpecRoutesServicesStickyCookieOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesStickyCookie) *int { return v.MaxAge }).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o IngressRouteSpecRoutesServicesStickyCookieOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesStickyCookie) *string { return v.Name }).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o IngressRouteSpecRoutesServicesStickyCookieOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesStickyCookie) *string { return v.SameSite }).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o IngressRouteSpecRoutesServicesStickyCookieOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecRoutesServicesStickyCookie) *bool { return v.Secure }).(pulumi.BoolPtrOutput)
}

type IngressRouteSpecRoutesServicesStickyCookiePtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecRoutesServicesStickyCookiePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecRoutesServicesStickyCookie)(nil)).Elem()
}

func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutput() IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) ToIngressRouteSpecRoutesServicesStickyCookiePtrOutputWithContext(ctx context.Context) IngressRouteSpecRoutesServicesStickyCookiePtrOutput {
	return o
}

func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecRoutesServicesStickyCookie] {
	return pulumix.Output[*IngressRouteSpecRoutesServicesStickyCookie]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) Elem() IngressRouteSpecRoutesServicesStickyCookieOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesStickyCookie) IngressRouteSpecRoutesServicesStickyCookie {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecRoutesServicesStickyCookie
		return ret
	}).(IngressRouteSpecRoutesServicesStickyCookieOutput)
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.HttpOnly
	}).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesStickyCookie) *int {
		if v == nil {
			return nil
		}
		return v.MaxAge
	}).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.Name
	}).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.SameSite
	}).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o IngressRouteSpecRoutesServicesStickyCookiePtrOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecRoutesServicesStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.Secure
	}).(pulumi.BoolPtrOutput)
}

// TLS defines the TLS configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
type IngressRouteSpecTls struct {
	// CertResolver defines the name of the certificate resolver to use.
	// Cert resolvers have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
	CertResolver *string `pulumi:"certResolver"`
	// Domains defines the list of domains that will be used to issue certificates.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
	Domains []IngressRouteSpecTlsDomains `pulumi:"domains"`
	// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
	// If not defined, the `default` TLSOption is used.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
	Options *IngressRouteSpecTlsOptions `pulumi:"options"`
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName *string `pulumi:"secretName"`
	// Store defines the reference to the TLSStore, that will be used to store certificates.
	// Please note that only `default` TLSStore can be used.
	Store *IngressRouteSpecTlsStore `pulumi:"store"`
}

// IngressRouteSpecTlsInput is an input type that accepts IngressRouteSpecTlsArgs and IngressRouteSpecTlsOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsInput` via:
//
//	IngressRouteSpecTlsArgs{...}
type IngressRouteSpecTlsInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsOutput() IngressRouteSpecTlsOutput
	ToIngressRouteSpecTlsOutputWithContext(context.Context) IngressRouteSpecTlsOutput
}

// TLS defines the TLS configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
type IngressRouteSpecTlsArgs struct {
	// CertResolver defines the name of the certificate resolver to use.
	// Cert resolvers have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
	CertResolver pulumi.StringPtrInput `pulumi:"certResolver"`
	// Domains defines the list of domains that will be used to issue certificates.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
	Domains IngressRouteSpecTlsDomainsArrayInput `pulumi:"domains"`
	// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
	// If not defined, the `default` TLSOption is used.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
	Options IngressRouteSpecTlsOptionsPtrInput `pulumi:"options"`
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName pulumi.StringPtrInput `pulumi:"secretName"`
	// Store defines the reference to the TLSStore, that will be used to store certificates.
	// Please note that only `default` TLSStore can be used.
	Store IngressRouteSpecTlsStorePtrInput `pulumi:"store"`
}

func (IngressRouteSpecTlsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTls)(nil)).Elem()
}

func (i IngressRouteSpecTlsArgs) ToIngressRouteSpecTlsOutput() IngressRouteSpecTlsOutput {
	return i.ToIngressRouteSpecTlsOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsArgs) ToIngressRouteSpecTlsOutputWithContext(ctx context.Context) IngressRouteSpecTlsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsOutput)
}

func (i IngressRouteSpecTlsArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTls] {
	return pulumix.Output[IngressRouteSpecTls]{
		OutputState: i.ToIngressRouteSpecTlsOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecTlsArgs) ToIngressRouteSpecTlsPtrOutput() IngressRouteSpecTlsPtrOutput {
	return i.ToIngressRouteSpecTlsPtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsArgs) ToIngressRouteSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsOutput).ToIngressRouteSpecTlsPtrOutputWithContext(ctx)
}

// IngressRouteSpecTlsPtrInput is an input type that accepts IngressRouteSpecTlsArgs, IngressRouteSpecTlsPtr and IngressRouteSpecTlsPtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsPtrInput` via:
//
//	        IngressRouteSpecTlsArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecTlsPtrInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsPtrOutput() IngressRouteSpecTlsPtrOutput
	ToIngressRouteSpecTlsPtrOutputWithContext(context.Context) IngressRouteSpecTlsPtrOutput
}

type ingressRouteSpecTlsPtrType IngressRouteSpecTlsArgs

func IngressRouteSpecTlsPtr(v *IngressRouteSpecTlsArgs) IngressRouteSpecTlsPtrInput {
	return (*ingressRouteSpecTlsPtrType)(v)
}

func (*ingressRouteSpecTlsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecTls)(nil)).Elem()
}

func (i *ingressRouteSpecTlsPtrType) ToIngressRouteSpecTlsPtrOutput() IngressRouteSpecTlsPtrOutput {
	return i.ToIngressRouteSpecTlsPtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecTlsPtrType) ToIngressRouteSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsPtrOutput)
}

func (i *ingressRouteSpecTlsPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecTls] {
	return pulumix.Output[*IngressRouteSpecTls]{
		OutputState: i.ToIngressRouteSpecTlsPtrOutputWithContext(ctx).OutputState,
	}
}

// TLS defines the TLS configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls
type IngressRouteSpecTlsOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTls)(nil)).Elem()
}

func (o IngressRouteSpecTlsOutput) ToIngressRouteSpecTlsOutput() IngressRouteSpecTlsOutput {
	return o
}

func (o IngressRouteSpecTlsOutput) ToIngressRouteSpecTlsOutputWithContext(ctx context.Context) IngressRouteSpecTlsOutput {
	return o
}

func (o IngressRouteSpecTlsOutput) ToIngressRouteSpecTlsPtrOutput() IngressRouteSpecTlsPtrOutput {
	return o.ToIngressRouteSpecTlsPtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecTlsOutput) ToIngressRouteSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecTls) *IngressRouteSpecTls {
		return &v
	}).(IngressRouteSpecTlsPtrOutput)
}

func (o IngressRouteSpecTlsOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTls] {
	return pulumix.Output[IngressRouteSpecTls]{
		OutputState: o.OutputState,
	}
}

// CertResolver defines the name of the certificate resolver to use.
// Cert resolvers have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
func (o IngressRouteSpecTlsOutput) CertResolver() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTls) *string { return v.CertResolver }).(pulumi.StringPtrOutput)
}

// Domains defines the list of domains that will be used to issue certificates.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
func (o IngressRouteSpecTlsOutput) Domains() IngressRouteSpecTlsDomainsArrayOutput {
	return o.ApplyT(func(v IngressRouteSpecTls) []IngressRouteSpecTlsDomains { return v.Domains }).(IngressRouteSpecTlsDomainsArrayOutput)
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
func (o IngressRouteSpecTlsOutput) Options() IngressRouteSpecTlsOptionsPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTls) *IngressRouteSpecTlsOptions { return v.Options }).(IngressRouteSpecTlsOptionsPtrOutput)
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o IngressRouteSpecTlsOutput) SecretName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTls) *string { return v.SecretName }).(pulumi.StringPtrOutput)
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
func (o IngressRouteSpecTlsOutput) Store() IngressRouteSpecTlsStorePtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTls) *IngressRouteSpecTlsStore { return v.Store }).(IngressRouteSpecTlsStorePtrOutput)
}

type IngressRouteSpecTlsPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecTls)(nil)).Elem()
}

func (o IngressRouteSpecTlsPtrOutput) ToIngressRouteSpecTlsPtrOutput() IngressRouteSpecTlsPtrOutput {
	return o
}

func (o IngressRouteSpecTlsPtrOutput) ToIngressRouteSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsPtrOutput {
	return o
}

func (o IngressRouteSpecTlsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecTls] {
	return pulumix.Output[*IngressRouteSpecTls]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecTlsPtrOutput) Elem() IngressRouteSpecTlsOutput {
	return o.ApplyT(func(v *IngressRouteSpecTls) IngressRouteSpecTls {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecTls
		return ret
	}).(IngressRouteSpecTlsOutput)
}

// CertResolver defines the name of the certificate resolver to use.
// Cert resolvers have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
func (o IngressRouteSpecTlsPtrOutput) CertResolver() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTls) *string {
		if v == nil {
			return nil
		}
		return v.CertResolver
	}).(pulumi.StringPtrOutput)
}

// Domains defines the list of domains that will be used to issue certificates.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
func (o IngressRouteSpecTlsPtrOutput) Domains() IngressRouteSpecTlsDomainsArrayOutput {
	return o.ApplyT(func(v *IngressRouteSpecTls) []IngressRouteSpecTlsDomains {
		if v == nil {
			return nil
		}
		return v.Domains
	}).(IngressRouteSpecTlsDomainsArrayOutput)
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
func (o IngressRouteSpecTlsPtrOutput) Options() IngressRouteSpecTlsOptionsPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTls) *IngressRouteSpecTlsOptions {
		if v == nil {
			return nil
		}
		return v.Options
	}).(IngressRouteSpecTlsOptionsPtrOutput)
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o IngressRouteSpecTlsPtrOutput) SecretName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTls) *string {
		if v == nil {
			return nil
		}
		return v.SecretName
	}).(pulumi.StringPtrOutput)
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
func (o IngressRouteSpecTlsPtrOutput) Store() IngressRouteSpecTlsStorePtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTls) *IngressRouteSpecTlsStore {
		if v == nil {
			return nil
		}
		return v.Store
	}).(IngressRouteSpecTlsStorePtrOutput)
}

// Domain holds a domain name with SANs.
type IngressRouteSpecTlsDomains struct {
	// Main defines the main domain name.
	Main *string `pulumi:"main"`
	// SANs defines the subject alternative domain names.
	Sans []string `pulumi:"sans"`
}

// IngressRouteSpecTlsDomainsInput is an input type that accepts IngressRouteSpecTlsDomainsArgs and IngressRouteSpecTlsDomainsOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsDomainsInput` via:
//
//	IngressRouteSpecTlsDomainsArgs{...}
type IngressRouteSpecTlsDomainsInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsDomainsOutput() IngressRouteSpecTlsDomainsOutput
	ToIngressRouteSpecTlsDomainsOutputWithContext(context.Context) IngressRouteSpecTlsDomainsOutput
}

// Domain holds a domain name with SANs.
type IngressRouteSpecTlsDomainsArgs struct {
	// Main defines the main domain name.
	Main pulumi.StringPtrInput `pulumi:"main"`
	// SANs defines the subject alternative domain names.
	Sans pulumi.StringArrayInput `pulumi:"sans"`
}

func (IngressRouteSpecTlsDomainsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTlsDomains)(nil)).Elem()
}

func (i IngressRouteSpecTlsDomainsArgs) ToIngressRouteSpecTlsDomainsOutput() IngressRouteSpecTlsDomainsOutput {
	return i.ToIngressRouteSpecTlsDomainsOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsDomainsArgs) ToIngressRouteSpecTlsDomainsOutputWithContext(ctx context.Context) IngressRouteSpecTlsDomainsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsDomainsOutput)
}

func (i IngressRouteSpecTlsDomainsArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTlsDomains] {
	return pulumix.Output[IngressRouteSpecTlsDomains]{
		OutputState: i.ToIngressRouteSpecTlsDomainsOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteSpecTlsDomainsArrayInput is an input type that accepts IngressRouteSpecTlsDomainsArray and IngressRouteSpecTlsDomainsArrayOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsDomainsArrayInput` via:
//
//	IngressRouteSpecTlsDomainsArray{ IngressRouteSpecTlsDomainsArgs{...} }
type IngressRouteSpecTlsDomainsArrayInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsDomainsArrayOutput() IngressRouteSpecTlsDomainsArrayOutput
	ToIngressRouteSpecTlsDomainsArrayOutputWithContext(context.Context) IngressRouteSpecTlsDomainsArrayOutput
}

type IngressRouteSpecTlsDomainsArray []IngressRouteSpecTlsDomainsInput

func (IngressRouteSpecTlsDomainsArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecTlsDomains)(nil)).Elem()
}

func (i IngressRouteSpecTlsDomainsArray) ToIngressRouteSpecTlsDomainsArrayOutput() IngressRouteSpecTlsDomainsArrayOutput {
	return i.ToIngressRouteSpecTlsDomainsArrayOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsDomainsArray) ToIngressRouteSpecTlsDomainsArrayOutputWithContext(ctx context.Context) IngressRouteSpecTlsDomainsArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsDomainsArrayOutput)
}

func (i IngressRouteSpecTlsDomainsArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecTlsDomains] {
	return pulumix.Output[[]IngressRouteSpecTlsDomains]{
		OutputState: i.ToIngressRouteSpecTlsDomainsArrayOutputWithContext(ctx).OutputState,
	}
}

// Domain holds a domain name with SANs.
type IngressRouteSpecTlsDomainsOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsDomainsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTlsDomains)(nil)).Elem()
}

func (o IngressRouteSpecTlsDomainsOutput) ToIngressRouteSpecTlsDomainsOutput() IngressRouteSpecTlsDomainsOutput {
	return o
}

func (o IngressRouteSpecTlsDomainsOutput) ToIngressRouteSpecTlsDomainsOutputWithContext(ctx context.Context) IngressRouteSpecTlsDomainsOutput {
	return o
}

func (o IngressRouteSpecTlsDomainsOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTlsDomains] {
	return pulumix.Output[IngressRouteSpecTlsDomains]{
		OutputState: o.OutputState,
	}
}

// Main defines the main domain name.
func (o IngressRouteSpecTlsDomainsOutput) Main() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTlsDomains) *string { return v.Main }).(pulumi.StringPtrOutput)
}

// SANs defines the subject alternative domain names.
func (o IngressRouteSpecTlsDomainsOutput) Sans() pulumi.StringArrayOutput {
	return o.ApplyT(func(v IngressRouteSpecTlsDomains) []string { return v.Sans }).(pulumi.StringArrayOutput)
}

type IngressRouteSpecTlsDomainsArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsDomainsArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteSpecTlsDomains)(nil)).Elem()
}

func (o IngressRouteSpecTlsDomainsArrayOutput) ToIngressRouteSpecTlsDomainsArrayOutput() IngressRouteSpecTlsDomainsArrayOutput {
	return o
}

func (o IngressRouteSpecTlsDomainsArrayOutput) ToIngressRouteSpecTlsDomainsArrayOutputWithContext(ctx context.Context) IngressRouteSpecTlsDomainsArrayOutput {
	return o
}

func (o IngressRouteSpecTlsDomainsArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteSpecTlsDomains] {
	return pulumix.Output[[]IngressRouteSpecTlsDomains]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecTlsDomainsArrayOutput) Index(i pulumi.IntInput) IngressRouteSpecTlsDomainsOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteSpecTlsDomains {
		return vs[0].([]IngressRouteSpecTlsDomains)[vs[1].(int)]
	}).(IngressRouteSpecTlsDomainsOutput)
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type IngressRouteSpecTlsOptions struct {
	// Name defines the name of the referenced TLSOption.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced TLSOption.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
	Namespace *string `pulumi:"namespace"`
}

// IngressRouteSpecTlsOptionsInput is an input type that accepts IngressRouteSpecTlsOptionsArgs and IngressRouteSpecTlsOptionsOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsOptionsInput` via:
//
//	IngressRouteSpecTlsOptionsArgs{...}
type IngressRouteSpecTlsOptionsInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsOptionsOutput() IngressRouteSpecTlsOptionsOutput
	ToIngressRouteSpecTlsOptionsOutputWithContext(context.Context) IngressRouteSpecTlsOptionsOutput
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type IngressRouteSpecTlsOptionsArgs struct {
	// Name defines the name of the referenced TLSOption.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced TLSOption.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (IngressRouteSpecTlsOptionsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTlsOptions)(nil)).Elem()
}

func (i IngressRouteSpecTlsOptionsArgs) ToIngressRouteSpecTlsOptionsOutput() IngressRouteSpecTlsOptionsOutput {
	return i.ToIngressRouteSpecTlsOptionsOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsOptionsArgs) ToIngressRouteSpecTlsOptionsOutputWithContext(ctx context.Context) IngressRouteSpecTlsOptionsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsOptionsOutput)
}

func (i IngressRouteSpecTlsOptionsArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTlsOptions] {
	return pulumix.Output[IngressRouteSpecTlsOptions]{
		OutputState: i.ToIngressRouteSpecTlsOptionsOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecTlsOptionsArgs) ToIngressRouteSpecTlsOptionsPtrOutput() IngressRouteSpecTlsOptionsPtrOutput {
	return i.ToIngressRouteSpecTlsOptionsPtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsOptionsArgs) ToIngressRouteSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsOptionsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsOptionsOutput).ToIngressRouteSpecTlsOptionsPtrOutputWithContext(ctx)
}

// IngressRouteSpecTlsOptionsPtrInput is an input type that accepts IngressRouteSpecTlsOptionsArgs, IngressRouteSpecTlsOptionsPtr and IngressRouteSpecTlsOptionsPtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsOptionsPtrInput` via:
//
//	        IngressRouteSpecTlsOptionsArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecTlsOptionsPtrInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsOptionsPtrOutput() IngressRouteSpecTlsOptionsPtrOutput
	ToIngressRouteSpecTlsOptionsPtrOutputWithContext(context.Context) IngressRouteSpecTlsOptionsPtrOutput
}

type ingressRouteSpecTlsOptionsPtrType IngressRouteSpecTlsOptionsArgs

func IngressRouteSpecTlsOptionsPtr(v *IngressRouteSpecTlsOptionsArgs) IngressRouteSpecTlsOptionsPtrInput {
	return (*ingressRouteSpecTlsOptionsPtrType)(v)
}

func (*ingressRouteSpecTlsOptionsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecTlsOptions)(nil)).Elem()
}

func (i *ingressRouteSpecTlsOptionsPtrType) ToIngressRouteSpecTlsOptionsPtrOutput() IngressRouteSpecTlsOptionsPtrOutput {
	return i.ToIngressRouteSpecTlsOptionsPtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecTlsOptionsPtrType) ToIngressRouteSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsOptionsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsOptionsPtrOutput)
}

func (i *ingressRouteSpecTlsOptionsPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecTlsOptions] {
	return pulumix.Output[*IngressRouteSpecTlsOptions]{
		OutputState: i.ToIngressRouteSpecTlsOptionsPtrOutputWithContext(ctx).OutputState,
	}
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type IngressRouteSpecTlsOptionsOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsOptionsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTlsOptions)(nil)).Elem()
}

func (o IngressRouteSpecTlsOptionsOutput) ToIngressRouteSpecTlsOptionsOutput() IngressRouteSpecTlsOptionsOutput {
	return o
}

func (o IngressRouteSpecTlsOptionsOutput) ToIngressRouteSpecTlsOptionsOutputWithContext(ctx context.Context) IngressRouteSpecTlsOptionsOutput {
	return o
}

func (o IngressRouteSpecTlsOptionsOutput) ToIngressRouteSpecTlsOptionsPtrOutput() IngressRouteSpecTlsOptionsPtrOutput {
	return o.ToIngressRouteSpecTlsOptionsPtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecTlsOptionsOutput) ToIngressRouteSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsOptionsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecTlsOptions) *IngressRouteSpecTlsOptions {
		return &v
	}).(IngressRouteSpecTlsOptionsPtrOutput)
}

func (o IngressRouteSpecTlsOptionsOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTlsOptions] {
	return pulumix.Output[IngressRouteSpecTlsOptions]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced TLSOption.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
func (o IngressRouteSpecTlsOptionsOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteSpecTlsOptions) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced TLSOption.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
func (o IngressRouteSpecTlsOptionsOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTlsOptions) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type IngressRouteSpecTlsOptionsPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsOptionsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecTlsOptions)(nil)).Elem()
}

func (o IngressRouteSpecTlsOptionsPtrOutput) ToIngressRouteSpecTlsOptionsPtrOutput() IngressRouteSpecTlsOptionsPtrOutput {
	return o
}

func (o IngressRouteSpecTlsOptionsPtrOutput) ToIngressRouteSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsOptionsPtrOutput {
	return o
}

func (o IngressRouteSpecTlsOptionsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecTlsOptions] {
	return pulumix.Output[*IngressRouteSpecTlsOptions]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecTlsOptionsPtrOutput) Elem() IngressRouteSpecTlsOptionsOutput {
	return o.ApplyT(func(v *IngressRouteSpecTlsOptions) IngressRouteSpecTlsOptions {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecTlsOptions
		return ret
	}).(IngressRouteSpecTlsOptionsOutput)
}

// Name defines the name of the referenced TLSOption.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
func (o IngressRouteSpecTlsOptionsPtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTlsOptions) *string {
		if v == nil {
			return nil
		}
		return &v.Name
	}).(pulumi.StringPtrOutput)
}

// Namespace defines the namespace of the referenced TLSOption.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsoption
func (o IngressRouteSpecTlsOptionsPtrOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTlsOptions) *string {
		if v == nil {
			return nil
		}
		return v.Namespace
	}).(pulumi.StringPtrOutput)
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
type IngressRouteSpecTlsStore struct {
	// Name defines the name of the referenced TLSStore.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced TLSStore.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
	Namespace *string `pulumi:"namespace"`
}

// IngressRouteSpecTlsStoreInput is an input type that accepts IngressRouteSpecTlsStoreArgs and IngressRouteSpecTlsStoreOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsStoreInput` via:
//
//	IngressRouteSpecTlsStoreArgs{...}
type IngressRouteSpecTlsStoreInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsStoreOutput() IngressRouteSpecTlsStoreOutput
	ToIngressRouteSpecTlsStoreOutputWithContext(context.Context) IngressRouteSpecTlsStoreOutput
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
type IngressRouteSpecTlsStoreArgs struct {
	// Name defines the name of the referenced TLSStore.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced TLSStore.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (IngressRouteSpecTlsStoreArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTlsStore)(nil)).Elem()
}

func (i IngressRouteSpecTlsStoreArgs) ToIngressRouteSpecTlsStoreOutput() IngressRouteSpecTlsStoreOutput {
	return i.ToIngressRouteSpecTlsStoreOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsStoreArgs) ToIngressRouteSpecTlsStoreOutputWithContext(ctx context.Context) IngressRouteSpecTlsStoreOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsStoreOutput)
}

func (i IngressRouteSpecTlsStoreArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTlsStore] {
	return pulumix.Output[IngressRouteSpecTlsStore]{
		OutputState: i.ToIngressRouteSpecTlsStoreOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteSpecTlsStoreArgs) ToIngressRouteSpecTlsStorePtrOutput() IngressRouteSpecTlsStorePtrOutput {
	return i.ToIngressRouteSpecTlsStorePtrOutputWithContext(context.Background())
}

func (i IngressRouteSpecTlsStoreArgs) ToIngressRouteSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsStorePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsStoreOutput).ToIngressRouteSpecTlsStorePtrOutputWithContext(ctx)
}

// IngressRouteSpecTlsStorePtrInput is an input type that accepts IngressRouteSpecTlsStoreArgs, IngressRouteSpecTlsStorePtr and IngressRouteSpecTlsStorePtrOutput values.
// You can construct a concrete instance of `IngressRouteSpecTlsStorePtrInput` via:
//
//	        IngressRouteSpecTlsStoreArgs{...}
//
//	or:
//
//	        nil
type IngressRouteSpecTlsStorePtrInput interface {
	pulumi.Input

	ToIngressRouteSpecTlsStorePtrOutput() IngressRouteSpecTlsStorePtrOutput
	ToIngressRouteSpecTlsStorePtrOutputWithContext(context.Context) IngressRouteSpecTlsStorePtrOutput
}

type ingressRouteSpecTlsStorePtrType IngressRouteSpecTlsStoreArgs

func IngressRouteSpecTlsStorePtr(v *IngressRouteSpecTlsStoreArgs) IngressRouteSpecTlsStorePtrInput {
	return (*ingressRouteSpecTlsStorePtrType)(v)
}

func (*ingressRouteSpecTlsStorePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecTlsStore)(nil)).Elem()
}

func (i *ingressRouteSpecTlsStorePtrType) ToIngressRouteSpecTlsStorePtrOutput() IngressRouteSpecTlsStorePtrOutput {
	return i.ToIngressRouteSpecTlsStorePtrOutputWithContext(context.Background())
}

func (i *ingressRouteSpecTlsStorePtrType) ToIngressRouteSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsStorePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteSpecTlsStorePtrOutput)
}

func (i *ingressRouteSpecTlsStorePtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecTlsStore] {
	return pulumix.Output[*IngressRouteSpecTlsStore]{
		OutputState: i.ToIngressRouteSpecTlsStorePtrOutputWithContext(ctx).OutputState,
	}
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
type IngressRouteSpecTlsStoreOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsStoreOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteSpecTlsStore)(nil)).Elem()
}

func (o IngressRouteSpecTlsStoreOutput) ToIngressRouteSpecTlsStoreOutput() IngressRouteSpecTlsStoreOutput {
	return o
}

func (o IngressRouteSpecTlsStoreOutput) ToIngressRouteSpecTlsStoreOutputWithContext(ctx context.Context) IngressRouteSpecTlsStoreOutput {
	return o
}

func (o IngressRouteSpecTlsStoreOutput) ToIngressRouteSpecTlsStorePtrOutput() IngressRouteSpecTlsStorePtrOutput {
	return o.ToIngressRouteSpecTlsStorePtrOutputWithContext(context.Background())
}

func (o IngressRouteSpecTlsStoreOutput) ToIngressRouteSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsStorePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteSpecTlsStore) *IngressRouteSpecTlsStore {
		return &v
	}).(IngressRouteSpecTlsStorePtrOutput)
}

func (o IngressRouteSpecTlsStoreOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteSpecTlsStore] {
	return pulumix.Output[IngressRouteSpecTlsStore]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced TLSStore.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
func (o IngressRouteSpecTlsStoreOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteSpecTlsStore) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced TLSStore.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
func (o IngressRouteSpecTlsStoreOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteSpecTlsStore) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type IngressRouteSpecTlsStorePtrOutput struct{ *pulumi.OutputState }

func (IngressRouteSpecTlsStorePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteSpecTlsStore)(nil)).Elem()
}

func (o IngressRouteSpecTlsStorePtrOutput) ToIngressRouteSpecTlsStorePtrOutput() IngressRouteSpecTlsStorePtrOutput {
	return o
}

func (o IngressRouteSpecTlsStorePtrOutput) ToIngressRouteSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteSpecTlsStorePtrOutput {
	return o
}

func (o IngressRouteSpecTlsStorePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteSpecTlsStore] {
	return pulumix.Output[*IngressRouteSpecTlsStore]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteSpecTlsStorePtrOutput) Elem() IngressRouteSpecTlsStoreOutput {
	return o.ApplyT(func(v *IngressRouteSpecTlsStore) IngressRouteSpecTlsStore {
		if v != nil {
			return *v
		}
		var ret IngressRouteSpecTlsStore
		return ret
	}).(IngressRouteSpecTlsStoreOutput)
}

// Name defines the name of the referenced TLSStore.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
func (o IngressRouteSpecTlsStorePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTlsStore) *string {
		if v == nil {
			return nil
		}
		return &v.Name
	}).(pulumi.StringPtrOutput)
}

// Namespace defines the namespace of the referenced TLSStore.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-tlsstore
func (o IngressRouteSpecTlsStorePtrOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteSpecTlsStore) *string {
		if v == nil {
			return nil
		}
		return v.Namespace
	}).(pulumi.StringPtrOutput)
}

// IngressRouteTCP is the CRD implementation of a Traefik TCP Router.
type IngressRouteTCPType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// IngressRouteTCPSpec defines the desired state of IngressRouteTCP.
	Spec IngressRouteTCPSpec `pulumi:"spec"`
}

type IngressRouteTCPMetadata struct {
}

// IngressRouteTCPSpec defines the desired state of IngressRouteTCP.
type IngressRouteTCPSpec struct {
	// EntryPoints defines the list of entry point names to bind to.
	// Entry points have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
	// Default: all.
	EntryPoints []string `pulumi:"entryPoints"`
	// Routes defines the list of routes.
	Routes []IngressRouteTCPSpecRoutes `pulumi:"routes"`
	// TLS defines the TLS configuration on a layer 4 / TCP Route.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
	Tls *IngressRouteTCPSpecTls `pulumi:"tls"`
}

// IngressRouteTCPSpecInput is an input type that accepts IngressRouteTCPSpecArgs and IngressRouteTCPSpecOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecInput` via:
//
//	IngressRouteTCPSpecArgs{...}
type IngressRouteTCPSpecInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecOutput() IngressRouteTCPSpecOutput
	ToIngressRouteTCPSpecOutputWithContext(context.Context) IngressRouteTCPSpecOutput
}

// IngressRouteTCPSpec defines the desired state of IngressRouteTCP.
type IngressRouteTCPSpecArgs struct {
	// EntryPoints defines the list of entry point names to bind to.
	// Entry points have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
	// Default: all.
	EntryPoints pulumi.StringArrayInput `pulumi:"entryPoints"`
	// Routes defines the list of routes.
	Routes IngressRouteTCPSpecRoutesArrayInput `pulumi:"routes"`
	// TLS defines the TLS configuration on a layer 4 / TCP Route.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
	Tls IngressRouteTCPSpecTlsPtrInput `pulumi:"tls"`
}

func (IngressRouteTCPSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpec)(nil)).Elem()
}

func (i IngressRouteTCPSpecArgs) ToIngressRouteTCPSpecOutput() IngressRouteTCPSpecOutput {
	return i.ToIngressRouteTCPSpecOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecArgs) ToIngressRouteTCPSpecOutputWithContext(ctx context.Context) IngressRouteTCPSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecOutput)
}

func (i IngressRouteTCPSpecArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpec] {
	return pulumix.Output[IngressRouteTCPSpec]{
		OutputState: i.ToIngressRouteTCPSpecOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteTCPSpecArgs) ToIngressRouteTCPSpecPtrOutput() IngressRouteTCPSpecPtrOutput {
	return i.ToIngressRouteTCPSpecPtrOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecArgs) ToIngressRouteTCPSpecPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecOutput).ToIngressRouteTCPSpecPtrOutputWithContext(ctx)
}

// IngressRouteTCPSpecPtrInput is an input type that accepts IngressRouteTCPSpecArgs, IngressRouteTCPSpecPtr and IngressRouteTCPSpecPtrOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecPtrInput` via:
//
//	        IngressRouteTCPSpecArgs{...}
//
//	or:
//
//	        nil
type IngressRouteTCPSpecPtrInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecPtrOutput() IngressRouteTCPSpecPtrOutput
	ToIngressRouteTCPSpecPtrOutputWithContext(context.Context) IngressRouteTCPSpecPtrOutput
}

type ingressRouteTCPSpecPtrType IngressRouteTCPSpecArgs

func IngressRouteTCPSpecPtr(v *IngressRouteTCPSpecArgs) IngressRouteTCPSpecPtrInput {
	return (*ingressRouteTCPSpecPtrType)(v)
}

func (*ingressRouteTCPSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpec)(nil)).Elem()
}

func (i *ingressRouteTCPSpecPtrType) ToIngressRouteTCPSpecPtrOutput() IngressRouteTCPSpecPtrOutput {
	return i.ToIngressRouteTCPSpecPtrOutputWithContext(context.Background())
}

func (i *ingressRouteTCPSpecPtrType) ToIngressRouteTCPSpecPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecPtrOutput)
}

func (i *ingressRouteTCPSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpec] {
	return pulumix.Output[*IngressRouteTCPSpec]{
		OutputState: i.ToIngressRouteTCPSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteTCPSpec defines the desired state of IngressRouteTCP.
type IngressRouteTCPSpecOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpec)(nil)).Elem()
}

func (o IngressRouteTCPSpecOutput) ToIngressRouteTCPSpecOutput() IngressRouteTCPSpecOutput {
	return o
}

func (o IngressRouteTCPSpecOutput) ToIngressRouteTCPSpecOutputWithContext(ctx context.Context) IngressRouteTCPSpecOutput {
	return o
}

func (o IngressRouteTCPSpecOutput) ToIngressRouteTCPSpecPtrOutput() IngressRouteTCPSpecPtrOutput {
	return o.ToIngressRouteTCPSpecPtrOutputWithContext(context.Background())
}

func (o IngressRouteTCPSpecOutput) ToIngressRouteTCPSpecPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteTCPSpec) *IngressRouteTCPSpec {
		return &v
	}).(IngressRouteTCPSpecPtrOutput)
}

func (o IngressRouteTCPSpecOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpec] {
	return pulumix.Output[IngressRouteTCPSpec]{
		OutputState: o.OutputState,
	}
}

// EntryPoints defines the list of entry point names to bind to.
// Entry points have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
// Default: all.
func (o IngressRouteTCPSpecOutput) EntryPoints() pulumi.StringArrayOutput {
	return o.ApplyT(func(v IngressRouteTCPSpec) []string { return v.EntryPoints }).(pulumi.StringArrayOutput)
}

// Routes defines the list of routes.
func (o IngressRouteTCPSpecOutput) Routes() IngressRouteTCPSpecRoutesArrayOutput {
	return o.ApplyT(func(v IngressRouteTCPSpec) []IngressRouteTCPSpecRoutes { return v.Routes }).(IngressRouteTCPSpecRoutesArrayOutput)
}

// TLS defines the TLS configuration on a layer 4 / TCP Route.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
func (o IngressRouteTCPSpecOutput) Tls() IngressRouteTCPSpecTlsPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpec) *IngressRouteTCPSpecTls { return v.Tls }).(IngressRouteTCPSpecTlsPtrOutput)
}

type IngressRouteTCPSpecPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpec)(nil)).Elem()
}

func (o IngressRouteTCPSpecPtrOutput) ToIngressRouteTCPSpecPtrOutput() IngressRouteTCPSpecPtrOutput {
	return o
}

func (o IngressRouteTCPSpecPtrOutput) ToIngressRouteTCPSpecPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecPtrOutput {
	return o
}

func (o IngressRouteTCPSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpec] {
	return pulumix.Output[*IngressRouteTCPSpec]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecPtrOutput) Elem() IngressRouteTCPSpecOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpec) IngressRouteTCPSpec {
		if v != nil {
			return *v
		}
		var ret IngressRouteTCPSpec
		return ret
	}).(IngressRouteTCPSpecOutput)
}

// EntryPoints defines the list of entry point names to bind to.
// Entry points have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
// Default: all.
func (o IngressRouteTCPSpecPtrOutput) EntryPoints() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpec) []string {
		if v == nil {
			return nil
		}
		return v.EntryPoints
	}).(pulumi.StringArrayOutput)
}

// Routes defines the list of routes.
func (o IngressRouteTCPSpecPtrOutput) Routes() IngressRouteTCPSpecRoutesArrayOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpec) []IngressRouteTCPSpecRoutes {
		if v == nil {
			return nil
		}
		return v.Routes
	}).(IngressRouteTCPSpecRoutesArrayOutput)
}

// TLS defines the TLS configuration on a layer 4 / TCP Route.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
func (o IngressRouteTCPSpecPtrOutput) Tls() IngressRouteTCPSpecTlsPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpec) *IngressRouteTCPSpecTls {
		if v == nil {
			return nil
		}
		return v.Tls
	}).(IngressRouteTCPSpecTlsPtrOutput)
}

// RouteTCP holds the TCP route configuration.
type IngressRouteTCPSpecRoutes struct {
	// Match defines the router's rule.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rule_1
	Match string `pulumi:"match"`
	// Middlewares defines the list of references to MiddlewareTCP resources.
	Middlewares []IngressRouteTCPSpecRoutesMiddlewares `pulumi:"middlewares"`
	// Priority defines the router's priority.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#priority_1
	Priority *int `pulumi:"priority"`
	// Services defines the list of TCP services.
	Services []IngressRouteTCPSpecRoutesServices `pulumi:"services"`
	// Syntax defines the router's rule syntax.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rulesyntax_1
	Syntax *string `pulumi:"syntax"`
}

// IngressRouteTCPSpecRoutesInput is an input type that accepts IngressRouteTCPSpecRoutesArgs and IngressRouteTCPSpecRoutesOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesInput` via:
//
//	IngressRouteTCPSpecRoutesArgs{...}
type IngressRouteTCPSpecRoutesInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesOutput() IngressRouteTCPSpecRoutesOutput
	ToIngressRouteTCPSpecRoutesOutputWithContext(context.Context) IngressRouteTCPSpecRoutesOutput
}

// RouteTCP holds the TCP route configuration.
type IngressRouteTCPSpecRoutesArgs struct {
	// Match defines the router's rule.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rule_1
	Match pulumi.StringInput `pulumi:"match"`
	// Middlewares defines the list of references to MiddlewareTCP resources.
	Middlewares IngressRouteTCPSpecRoutesMiddlewaresArrayInput `pulumi:"middlewares"`
	// Priority defines the router's priority.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#priority_1
	Priority pulumi.IntPtrInput `pulumi:"priority"`
	// Services defines the list of TCP services.
	Services IngressRouteTCPSpecRoutesServicesArrayInput `pulumi:"services"`
	// Syntax defines the router's rule syntax.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rulesyntax_1
	Syntax pulumi.StringPtrInput `pulumi:"syntax"`
}

func (IngressRouteTCPSpecRoutesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutes)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesArgs) ToIngressRouteTCPSpecRoutesOutput() IngressRouteTCPSpecRoutesOutput {
	return i.ToIngressRouteTCPSpecRoutesOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesArgs) ToIngressRouteTCPSpecRoutesOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesOutput)
}

func (i IngressRouteTCPSpecRoutesArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutes] {
	return pulumix.Output[IngressRouteTCPSpecRoutes]{
		OutputState: i.ToIngressRouteTCPSpecRoutesOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteTCPSpecRoutesArrayInput is an input type that accepts IngressRouteTCPSpecRoutesArray and IngressRouteTCPSpecRoutesArrayOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesArrayInput` via:
//
//	IngressRouteTCPSpecRoutesArray{ IngressRouteTCPSpecRoutesArgs{...} }
type IngressRouteTCPSpecRoutesArrayInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesArrayOutput() IngressRouteTCPSpecRoutesArrayOutput
	ToIngressRouteTCPSpecRoutesArrayOutputWithContext(context.Context) IngressRouteTCPSpecRoutesArrayOutput
}

type IngressRouteTCPSpecRoutesArray []IngressRouteTCPSpecRoutesInput

func (IngressRouteTCPSpecRoutesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecRoutes)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesArray) ToIngressRouteTCPSpecRoutesArrayOutput() IngressRouteTCPSpecRoutesArrayOutput {
	return i.ToIngressRouteTCPSpecRoutesArrayOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesArray) ToIngressRouteTCPSpecRoutesArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesArrayOutput)
}

func (i IngressRouteTCPSpecRoutesArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecRoutes] {
	return pulumix.Output[[]IngressRouteTCPSpecRoutes]{
		OutputState: i.ToIngressRouteTCPSpecRoutesArrayOutputWithContext(ctx).OutputState,
	}
}

// RouteTCP holds the TCP route configuration.
type IngressRouteTCPSpecRoutesOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutes)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesOutput) ToIngressRouteTCPSpecRoutesOutput() IngressRouteTCPSpecRoutesOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesOutput) ToIngressRouteTCPSpecRoutesOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutes] {
	return pulumix.Output[IngressRouteTCPSpecRoutes]{
		OutputState: o.OutputState,
	}
}

// Match defines the router's rule.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rule_1
func (o IngressRouteTCPSpecRoutesOutput) Match() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutes) string { return v.Match }).(pulumi.StringOutput)
}

// Middlewares defines the list of references to MiddlewareTCP resources.
func (o IngressRouteTCPSpecRoutesOutput) Middlewares() IngressRouteTCPSpecRoutesMiddlewaresArrayOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutes) []IngressRouteTCPSpecRoutesMiddlewares { return v.Middlewares }).(IngressRouteTCPSpecRoutesMiddlewaresArrayOutput)
}

// Priority defines the router's priority.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#priority_1
func (o IngressRouteTCPSpecRoutesOutput) Priority() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutes) *int { return v.Priority }).(pulumi.IntPtrOutput)
}

// Services defines the list of TCP services.
func (o IngressRouteTCPSpecRoutesOutput) Services() IngressRouteTCPSpecRoutesServicesArrayOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutes) []IngressRouteTCPSpecRoutesServices { return v.Services }).(IngressRouteTCPSpecRoutesServicesArrayOutput)
}

// Syntax defines the router's rule syntax.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#rulesyntax_1
func (o IngressRouteTCPSpecRoutesOutput) Syntax() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutes) *string { return v.Syntax }).(pulumi.StringPtrOutput)
}

type IngressRouteTCPSpecRoutesArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecRoutes)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesArrayOutput) ToIngressRouteTCPSpecRoutesArrayOutput() IngressRouteTCPSpecRoutesArrayOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesArrayOutput) ToIngressRouteTCPSpecRoutesArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesArrayOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecRoutes] {
	return pulumix.Output[[]IngressRouteTCPSpecRoutes]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecRoutesArrayOutput) Index(i pulumi.IntInput) IngressRouteTCPSpecRoutesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteTCPSpecRoutes {
		return vs[0].([]IngressRouteTCPSpecRoutes)[vs[1].(int)]
	}).(IngressRouteTCPSpecRoutesOutput)
}

// ObjectReference is a generic reference to a Traefik resource.
type IngressRouteTCPSpecRoutesMiddlewares struct {
	// Name defines the name of the referenced Traefik resource.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Traefik resource.
	Namespace *string `pulumi:"namespace"`
}

// IngressRouteTCPSpecRoutesMiddlewaresInput is an input type that accepts IngressRouteTCPSpecRoutesMiddlewaresArgs and IngressRouteTCPSpecRoutesMiddlewaresOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesMiddlewaresInput` via:
//
//	IngressRouteTCPSpecRoutesMiddlewaresArgs{...}
type IngressRouteTCPSpecRoutesMiddlewaresInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesMiddlewaresOutput() IngressRouteTCPSpecRoutesMiddlewaresOutput
	ToIngressRouteTCPSpecRoutesMiddlewaresOutputWithContext(context.Context) IngressRouteTCPSpecRoutesMiddlewaresOutput
}

// ObjectReference is a generic reference to a Traefik resource.
type IngressRouteTCPSpecRoutesMiddlewaresArgs struct {
	// Name defines the name of the referenced Traefik resource.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Traefik resource.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (IngressRouteTCPSpecRoutesMiddlewaresArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutesMiddlewares)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesMiddlewaresArgs) ToIngressRouteTCPSpecRoutesMiddlewaresOutput() IngressRouteTCPSpecRoutesMiddlewaresOutput {
	return i.ToIngressRouteTCPSpecRoutesMiddlewaresOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesMiddlewaresArgs) ToIngressRouteTCPSpecRoutesMiddlewaresOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesMiddlewaresOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesMiddlewaresOutput)
}

func (i IngressRouteTCPSpecRoutesMiddlewaresArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutesMiddlewares] {
	return pulumix.Output[IngressRouteTCPSpecRoutesMiddlewares]{
		OutputState: i.ToIngressRouteTCPSpecRoutesMiddlewaresOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteTCPSpecRoutesMiddlewaresArrayInput is an input type that accepts IngressRouteTCPSpecRoutesMiddlewaresArray and IngressRouteTCPSpecRoutesMiddlewaresArrayOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesMiddlewaresArrayInput` via:
//
//	IngressRouteTCPSpecRoutesMiddlewaresArray{ IngressRouteTCPSpecRoutesMiddlewaresArgs{...} }
type IngressRouteTCPSpecRoutesMiddlewaresArrayInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutput() IngressRouteTCPSpecRoutesMiddlewaresArrayOutput
	ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutputWithContext(context.Context) IngressRouteTCPSpecRoutesMiddlewaresArrayOutput
}

type IngressRouteTCPSpecRoutesMiddlewaresArray []IngressRouteTCPSpecRoutesMiddlewaresInput

func (IngressRouteTCPSpecRoutesMiddlewaresArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecRoutesMiddlewares)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesMiddlewaresArray) ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutput() IngressRouteTCPSpecRoutesMiddlewaresArrayOutput {
	return i.ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesMiddlewaresArray) ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesMiddlewaresArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesMiddlewaresArrayOutput)
}

func (i IngressRouteTCPSpecRoutesMiddlewaresArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecRoutesMiddlewares] {
	return pulumix.Output[[]IngressRouteTCPSpecRoutesMiddlewares]{
		OutputState: i.ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutputWithContext(ctx).OutputState,
	}
}

// ObjectReference is a generic reference to a Traefik resource.
type IngressRouteTCPSpecRoutesMiddlewaresOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesMiddlewaresOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutesMiddlewares)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesMiddlewaresOutput) ToIngressRouteTCPSpecRoutesMiddlewaresOutput() IngressRouteTCPSpecRoutesMiddlewaresOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesMiddlewaresOutput) ToIngressRouteTCPSpecRoutesMiddlewaresOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesMiddlewaresOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesMiddlewaresOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutesMiddlewares] {
	return pulumix.Output[IngressRouteTCPSpecRoutesMiddlewares]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Traefik resource.
func (o IngressRouteTCPSpecRoutesMiddlewaresOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesMiddlewares) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Traefik resource.
func (o IngressRouteTCPSpecRoutesMiddlewaresOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesMiddlewares) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type IngressRouteTCPSpecRoutesMiddlewaresArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesMiddlewaresArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecRoutesMiddlewares)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesMiddlewaresArrayOutput) ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutput() IngressRouteTCPSpecRoutesMiddlewaresArrayOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesMiddlewaresArrayOutput) ToIngressRouteTCPSpecRoutesMiddlewaresArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesMiddlewaresArrayOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesMiddlewaresArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecRoutesMiddlewares] {
	return pulumix.Output[[]IngressRouteTCPSpecRoutesMiddlewares]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecRoutesMiddlewaresArrayOutput) Index(i pulumi.IntInput) IngressRouteTCPSpecRoutesMiddlewaresOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteTCPSpecRoutesMiddlewares {
		return vs[0].([]IngressRouteTCPSpecRoutesMiddlewares)[vs[1].(int)]
	}).(IngressRouteTCPSpecRoutesMiddlewaresOutput)
}

// ServiceTCP defines an upstream TCP service to proxy traffic to.
type IngressRouteTCPSpecRoutesServices struct {
	// Name defines the name of the referenced Kubernetes Service.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// ProxyProtocol defines the PROXY protocol configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#proxy-protocol
	ProxyProtocol *IngressRouteTCPSpecRoutesServicesProxyProtocol `pulumi:"proxyProtocol"`
	// ServersTransport defines the name of ServersTransportTCP resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport *string `pulumi:"serversTransport"`
	// TerminationDelay defines the deadline that the proxy sets, after one of its connected peers indicates
	// it has closed the writing capability of its connection, to close the reading capability as well,
	// hence fully terminating the connection.
	// It is a duration in milliseconds, defaulting to 100.
	// A negative value means an infinite deadline (i.e. the reading capability is never closed).
	// Deprecated: TerminationDelay is not supported APIVersion traefik.io/v1, please use ServersTransport to configure the TerminationDelay instead.
	TerminationDelay *int `pulumi:"terminationDelay"`
	// TLS determines whether to use TLS when dialing with the backend.
	Tls *bool `pulumi:"tls"`
	// Weight defines the weight used when balancing requests between multiple Kubernetes Service.
	Weight *int `pulumi:"weight"`
}

// IngressRouteTCPSpecRoutesServicesInput is an input type that accepts IngressRouteTCPSpecRoutesServicesArgs and IngressRouteTCPSpecRoutesServicesOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesServicesInput` via:
//
//	IngressRouteTCPSpecRoutesServicesArgs{...}
type IngressRouteTCPSpecRoutesServicesInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesServicesOutput() IngressRouteTCPSpecRoutesServicesOutput
	ToIngressRouteTCPSpecRoutesServicesOutputWithContext(context.Context) IngressRouteTCPSpecRoutesServicesOutput
}

// ServiceTCP defines an upstream TCP service to proxy traffic to.
type IngressRouteTCPSpecRoutesServicesArgs struct {
	// Name defines the name of the referenced Kubernetes Service.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// ProxyProtocol defines the PROXY protocol configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#proxy-protocol
	ProxyProtocol IngressRouteTCPSpecRoutesServicesProxyProtocolPtrInput `pulumi:"proxyProtocol"`
	// ServersTransport defines the name of ServersTransportTCP resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport pulumi.StringPtrInput `pulumi:"serversTransport"`
	// TerminationDelay defines the deadline that the proxy sets, after one of its connected peers indicates
	// it has closed the writing capability of its connection, to close the reading capability as well,
	// hence fully terminating the connection.
	// It is a duration in milliseconds, defaulting to 100.
	// A negative value means an infinite deadline (i.e. the reading capability is never closed).
	// Deprecated: TerminationDelay is not supported APIVersion traefik.io/v1, please use ServersTransport to configure the TerminationDelay instead.
	TerminationDelay pulumi.IntPtrInput `pulumi:"terminationDelay"`
	// TLS determines whether to use TLS when dialing with the backend.
	Tls pulumi.BoolPtrInput `pulumi:"tls"`
	// Weight defines the weight used when balancing requests between multiple Kubernetes Service.
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (IngressRouteTCPSpecRoutesServicesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutesServices)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesServicesArgs) ToIngressRouteTCPSpecRoutesServicesOutput() IngressRouteTCPSpecRoutesServicesOutput {
	return i.ToIngressRouteTCPSpecRoutesServicesOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesServicesArgs) ToIngressRouteTCPSpecRoutesServicesOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesServicesOutput)
}

func (i IngressRouteTCPSpecRoutesServicesArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutesServices] {
	return pulumix.Output[IngressRouteTCPSpecRoutesServices]{
		OutputState: i.ToIngressRouteTCPSpecRoutesServicesOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteTCPSpecRoutesServicesArrayInput is an input type that accepts IngressRouteTCPSpecRoutesServicesArray and IngressRouteTCPSpecRoutesServicesArrayOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesServicesArrayInput` via:
//
//	IngressRouteTCPSpecRoutesServicesArray{ IngressRouteTCPSpecRoutesServicesArgs{...} }
type IngressRouteTCPSpecRoutesServicesArrayInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesServicesArrayOutput() IngressRouteTCPSpecRoutesServicesArrayOutput
	ToIngressRouteTCPSpecRoutesServicesArrayOutputWithContext(context.Context) IngressRouteTCPSpecRoutesServicesArrayOutput
}

type IngressRouteTCPSpecRoutesServicesArray []IngressRouteTCPSpecRoutesServicesInput

func (IngressRouteTCPSpecRoutesServicesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecRoutesServices)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesServicesArray) ToIngressRouteTCPSpecRoutesServicesArrayOutput() IngressRouteTCPSpecRoutesServicesArrayOutput {
	return i.ToIngressRouteTCPSpecRoutesServicesArrayOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesServicesArray) ToIngressRouteTCPSpecRoutesServicesArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesServicesArrayOutput)
}

func (i IngressRouteTCPSpecRoutesServicesArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecRoutesServices] {
	return pulumix.Output[[]IngressRouteTCPSpecRoutesServices]{
		OutputState: i.ToIngressRouteTCPSpecRoutesServicesArrayOutputWithContext(ctx).OutputState,
	}
}

// ServiceTCP defines an upstream TCP service to proxy traffic to.
type IngressRouteTCPSpecRoutesServicesOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesServicesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutesServices)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesServicesOutput) ToIngressRouteTCPSpecRoutesServicesOutput() IngressRouteTCPSpecRoutesServicesOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesOutput) ToIngressRouteTCPSpecRoutesServicesOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutesServices] {
	return pulumix.Output[IngressRouteTCPSpecRoutesServices]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Kubernetes Service.
func (o IngressRouteTCPSpecRoutesServicesOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service.
func (o IngressRouteTCPSpecRoutesServicesOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o IngressRouteTCPSpecRoutesServicesOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o IngressRouteTCPSpecRoutesServicesOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o IngressRouteTCPSpecRoutesServicesOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// ProxyProtocol defines the PROXY protocol configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#proxy-protocol
func (o IngressRouteTCPSpecRoutesServicesOutput) ProxyProtocol() IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *IngressRouteTCPSpecRoutesServicesProxyProtocol {
		return v.ProxyProtocol
	}).(IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput)
}

// ServersTransport defines the name of ServersTransportTCP resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o IngressRouteTCPSpecRoutesServicesOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *string { return v.ServersTransport }).(pulumi.StringPtrOutput)
}

// TerminationDelay defines the deadline that the proxy sets, after one of its connected peers indicates
// it has closed the writing capability of its connection, to close the reading capability as well,
// hence fully terminating the connection.
// It is a duration in milliseconds, defaulting to 100.
// A negative value means an infinite deadline (i.e. the reading capability is never closed).
// Deprecated: TerminationDelay is not supported APIVersion traefik.io/v1, please use ServersTransport to configure the TerminationDelay instead.
func (o IngressRouteTCPSpecRoutesServicesOutput) TerminationDelay() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *int { return v.TerminationDelay }).(pulumi.IntPtrOutput)
}

// TLS determines whether to use TLS when dialing with the backend.
func (o IngressRouteTCPSpecRoutesServicesOutput) Tls() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *bool { return v.Tls }).(pulumi.BoolPtrOutput)
}

// Weight defines the weight used when balancing requests between multiple Kubernetes Service.
func (o IngressRouteTCPSpecRoutesServicesOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServices) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type IngressRouteTCPSpecRoutesServicesArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesServicesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecRoutesServices)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesServicesArrayOutput) ToIngressRouteTCPSpecRoutesServicesArrayOutput() IngressRouteTCPSpecRoutesServicesArrayOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesArrayOutput) ToIngressRouteTCPSpecRoutesServicesArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesArrayOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecRoutesServices] {
	return pulumix.Output[[]IngressRouteTCPSpecRoutesServices]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecRoutesServicesArrayOutput) Index(i pulumi.IntInput) IngressRouteTCPSpecRoutesServicesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteTCPSpecRoutesServices {
		return vs[0].([]IngressRouteTCPSpecRoutesServices)[vs[1].(int)]
	}).(IngressRouteTCPSpecRoutesServicesOutput)
}

// ProxyProtocol defines the PROXY protocol configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#proxy-protocol
type IngressRouteTCPSpecRoutesServicesProxyProtocol struct {
	// Version defines the PROXY Protocol version to use.
	Version *int `pulumi:"version"`
}

// IngressRouteTCPSpecRoutesServicesProxyProtocolInput is an input type that accepts IngressRouteTCPSpecRoutesServicesProxyProtocolArgs and IngressRouteTCPSpecRoutesServicesProxyProtocolOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesServicesProxyProtocolInput` via:
//
//	IngressRouteTCPSpecRoutesServicesProxyProtocolArgs{...}
type IngressRouteTCPSpecRoutesServicesProxyProtocolInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolOutput
	ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutputWithContext(context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolOutput
}

// ProxyProtocol defines the PROXY protocol configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#proxy-protocol
type IngressRouteTCPSpecRoutesServicesProxyProtocolArgs struct {
	// Version defines the PROXY Protocol version to use.
	Version pulumi.IntPtrInput `pulumi:"version"`
}

func (IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutesServicesProxyProtocol)(nil)).Elem()
}

func (i IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolOutput {
	return i.ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesServicesProxyProtocolOutput)
}

func (i IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutesServicesProxyProtocol] {
	return pulumix.Output[IngressRouteTCPSpecRoutesServicesProxyProtocol]{
		OutputState: i.ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return i.ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesServicesProxyProtocolOutput).ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(ctx)
}

// IngressRouteTCPSpecRoutesServicesProxyProtocolPtrInput is an input type that accepts IngressRouteTCPSpecRoutesServicesProxyProtocolArgs, IngressRouteTCPSpecRoutesServicesProxyProtocolPtr and IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecRoutesServicesProxyProtocolPtrInput` via:
//
//	        IngressRouteTCPSpecRoutesServicesProxyProtocolArgs{...}
//
//	or:
//
//	        nil
type IngressRouteTCPSpecRoutesServicesProxyProtocolPtrInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput
	ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput
}

type ingressRouteTCPSpecRoutesServicesProxyProtocolPtrType IngressRouteTCPSpecRoutesServicesProxyProtocolArgs

func IngressRouteTCPSpecRoutesServicesProxyProtocolPtr(v *IngressRouteTCPSpecRoutesServicesProxyProtocolArgs) IngressRouteTCPSpecRoutesServicesProxyProtocolPtrInput {
	return (*ingressRouteTCPSpecRoutesServicesProxyProtocolPtrType)(v)
}

func (*ingressRouteTCPSpecRoutesServicesProxyProtocolPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecRoutesServicesProxyProtocol)(nil)).Elem()
}

func (i *ingressRouteTCPSpecRoutesServicesProxyProtocolPtrType) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return i.ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(context.Background())
}

func (i *ingressRouteTCPSpecRoutesServicesProxyProtocolPtrType) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput)
}

func (i *ingressRouteTCPSpecRoutesServicesProxyProtocolPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecRoutesServicesProxyProtocol] {
	return pulumix.Output[*IngressRouteTCPSpecRoutesServicesProxyProtocol]{
		OutputState: i.ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(ctx).OutputState,
	}
}

// ProxyProtocol defines the PROXY protocol configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#proxy-protocol
type IngressRouteTCPSpecRoutesServicesProxyProtocolOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecRoutesServicesProxyProtocol)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) ToIngressRouteTCPSpecRoutesServicesProxyProtocolOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return o.ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(context.Background())
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteTCPSpecRoutesServicesProxyProtocol) *IngressRouteTCPSpecRoutesServicesProxyProtocol {
		return &v
	}).(IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput)
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecRoutesServicesProxyProtocol] {
	return pulumix.Output[IngressRouteTCPSpecRoutesServicesProxyProtocol]{
		OutputState: o.OutputState,
	}
}

// Version defines the PROXY Protocol version to use.
func (o IngressRouteTCPSpecRoutesServicesProxyProtocolOutput) Version() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecRoutesServicesProxyProtocol) *int { return v.Version }).(pulumi.IntPtrOutput)
}

type IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecRoutesServicesProxyProtocol)(nil)).Elem()
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput() IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput) ToIngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput {
	return o
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecRoutesServicesProxyProtocol] {
	return pulumix.Output[*IngressRouteTCPSpecRoutesServicesProxyProtocol]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput) Elem() IngressRouteTCPSpecRoutesServicesProxyProtocolOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecRoutesServicesProxyProtocol) IngressRouteTCPSpecRoutesServicesProxyProtocol {
		if v != nil {
			return *v
		}
		var ret IngressRouteTCPSpecRoutesServicesProxyProtocol
		return ret
	}).(IngressRouteTCPSpecRoutesServicesProxyProtocolOutput)
}

// Version defines the PROXY Protocol version to use.
func (o IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput) Version() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecRoutesServicesProxyProtocol) *int {
		if v == nil {
			return nil
		}
		return v.Version
	}).(pulumi.IntPtrOutput)
}

// TLS defines the TLS configuration on a layer 4 / TCP Route.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
type IngressRouteTCPSpecTls struct {
	// CertResolver defines the name of the certificate resolver to use.
	// Cert resolvers have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
	CertResolver *string `pulumi:"certResolver"`
	// Domains defines the list of domains that will be used to issue certificates.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
	Domains []IngressRouteTCPSpecTlsDomains `pulumi:"domains"`
	// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
	// If not defined, the `default` TLSOption is used.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
	Options *IngressRouteTCPSpecTlsOptions `pulumi:"options"`
	// Passthrough defines whether a TLS router will terminate the TLS connection.
	Passthrough *bool `pulumi:"passthrough"`
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName *string `pulumi:"secretName"`
	// Store defines the reference to the TLSStore, that will be used to store certificates.
	// Please note that only `default` TLSStore can be used.
	Store *IngressRouteTCPSpecTlsStore `pulumi:"store"`
}

// IngressRouteTCPSpecTlsInput is an input type that accepts IngressRouteTCPSpecTlsArgs and IngressRouteTCPSpecTlsOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsInput` via:
//
//	IngressRouteTCPSpecTlsArgs{...}
type IngressRouteTCPSpecTlsInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsOutput() IngressRouteTCPSpecTlsOutput
	ToIngressRouteTCPSpecTlsOutputWithContext(context.Context) IngressRouteTCPSpecTlsOutput
}

// TLS defines the TLS configuration on a layer 4 / TCP Route.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
type IngressRouteTCPSpecTlsArgs struct {
	// CertResolver defines the name of the certificate resolver to use.
	// Cert resolvers have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
	CertResolver pulumi.StringPtrInput `pulumi:"certResolver"`
	// Domains defines the list of domains that will be used to issue certificates.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
	Domains IngressRouteTCPSpecTlsDomainsArrayInput `pulumi:"domains"`
	// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
	// If not defined, the `default` TLSOption is used.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
	Options IngressRouteTCPSpecTlsOptionsPtrInput `pulumi:"options"`
	// Passthrough defines whether a TLS router will terminate the TLS connection.
	Passthrough pulumi.BoolPtrInput `pulumi:"passthrough"`
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName pulumi.StringPtrInput `pulumi:"secretName"`
	// Store defines the reference to the TLSStore, that will be used to store certificates.
	// Please note that only `default` TLSStore can be used.
	Store IngressRouteTCPSpecTlsStorePtrInput `pulumi:"store"`
}

func (IngressRouteTCPSpecTlsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTls)(nil)).Elem()
}

func (i IngressRouteTCPSpecTlsArgs) ToIngressRouteTCPSpecTlsOutput() IngressRouteTCPSpecTlsOutput {
	return i.ToIngressRouteTCPSpecTlsOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsArgs) ToIngressRouteTCPSpecTlsOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsOutput)
}

func (i IngressRouteTCPSpecTlsArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTls] {
	return pulumix.Output[IngressRouteTCPSpecTls]{
		OutputState: i.ToIngressRouteTCPSpecTlsOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteTCPSpecTlsArgs) ToIngressRouteTCPSpecTlsPtrOutput() IngressRouteTCPSpecTlsPtrOutput {
	return i.ToIngressRouteTCPSpecTlsPtrOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsArgs) ToIngressRouteTCPSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsOutput).ToIngressRouteTCPSpecTlsPtrOutputWithContext(ctx)
}

// IngressRouteTCPSpecTlsPtrInput is an input type that accepts IngressRouteTCPSpecTlsArgs, IngressRouteTCPSpecTlsPtr and IngressRouteTCPSpecTlsPtrOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsPtrInput` via:
//
//	        IngressRouteTCPSpecTlsArgs{...}
//
//	or:
//
//	        nil
type IngressRouteTCPSpecTlsPtrInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsPtrOutput() IngressRouteTCPSpecTlsPtrOutput
	ToIngressRouteTCPSpecTlsPtrOutputWithContext(context.Context) IngressRouteTCPSpecTlsPtrOutput
}

type ingressRouteTCPSpecTlsPtrType IngressRouteTCPSpecTlsArgs

func IngressRouteTCPSpecTlsPtr(v *IngressRouteTCPSpecTlsArgs) IngressRouteTCPSpecTlsPtrInput {
	return (*ingressRouteTCPSpecTlsPtrType)(v)
}

func (*ingressRouteTCPSpecTlsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecTls)(nil)).Elem()
}

func (i *ingressRouteTCPSpecTlsPtrType) ToIngressRouteTCPSpecTlsPtrOutput() IngressRouteTCPSpecTlsPtrOutput {
	return i.ToIngressRouteTCPSpecTlsPtrOutputWithContext(context.Background())
}

func (i *ingressRouteTCPSpecTlsPtrType) ToIngressRouteTCPSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsPtrOutput)
}

func (i *ingressRouteTCPSpecTlsPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecTls] {
	return pulumix.Output[*IngressRouteTCPSpecTls]{
		OutputState: i.ToIngressRouteTCPSpecTlsPtrOutputWithContext(ctx).OutputState,
	}
}

// TLS defines the TLS configuration on a layer 4 / TCP Route.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#tls_1
type IngressRouteTCPSpecTlsOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTls)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsOutput) ToIngressRouteTCPSpecTlsOutput() IngressRouteTCPSpecTlsOutput {
	return o
}

func (o IngressRouteTCPSpecTlsOutput) ToIngressRouteTCPSpecTlsOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOutput {
	return o
}

func (o IngressRouteTCPSpecTlsOutput) ToIngressRouteTCPSpecTlsPtrOutput() IngressRouteTCPSpecTlsPtrOutput {
	return o.ToIngressRouteTCPSpecTlsPtrOutputWithContext(context.Background())
}

func (o IngressRouteTCPSpecTlsOutput) ToIngressRouteTCPSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteTCPSpecTls) *IngressRouteTCPSpecTls {
		return &v
	}).(IngressRouteTCPSpecTlsPtrOutput)
}

func (o IngressRouteTCPSpecTlsOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTls] {
	return pulumix.Output[IngressRouteTCPSpecTls]{
		OutputState: o.OutputState,
	}
}

// CertResolver defines the name of the certificate resolver to use.
// Cert resolvers have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
func (o IngressRouteTCPSpecTlsOutput) CertResolver() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTls) *string { return v.CertResolver }).(pulumi.StringPtrOutput)
}

// Domains defines the list of domains that will be used to issue certificates.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
func (o IngressRouteTCPSpecTlsOutput) Domains() IngressRouteTCPSpecTlsDomainsArrayOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTls) []IngressRouteTCPSpecTlsDomains { return v.Domains }).(IngressRouteTCPSpecTlsDomainsArrayOutput)
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
func (o IngressRouteTCPSpecTlsOutput) Options() IngressRouteTCPSpecTlsOptionsPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTls) *IngressRouteTCPSpecTlsOptions { return v.Options }).(IngressRouteTCPSpecTlsOptionsPtrOutput)
}

// Passthrough defines whether a TLS router will terminate the TLS connection.
func (o IngressRouteTCPSpecTlsOutput) Passthrough() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTls) *bool { return v.Passthrough }).(pulumi.BoolPtrOutput)
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o IngressRouteTCPSpecTlsOutput) SecretName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTls) *string { return v.SecretName }).(pulumi.StringPtrOutput)
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
func (o IngressRouteTCPSpecTlsOutput) Store() IngressRouteTCPSpecTlsStorePtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTls) *IngressRouteTCPSpecTlsStore { return v.Store }).(IngressRouteTCPSpecTlsStorePtrOutput)
}

type IngressRouteTCPSpecTlsPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecTls)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsPtrOutput) ToIngressRouteTCPSpecTlsPtrOutput() IngressRouteTCPSpecTlsPtrOutput {
	return o
}

func (o IngressRouteTCPSpecTlsPtrOutput) ToIngressRouteTCPSpecTlsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsPtrOutput {
	return o
}

func (o IngressRouteTCPSpecTlsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecTls] {
	return pulumix.Output[*IngressRouteTCPSpecTls]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecTlsPtrOutput) Elem() IngressRouteTCPSpecTlsOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) IngressRouteTCPSpecTls {
		if v != nil {
			return *v
		}
		var ret IngressRouteTCPSpecTls
		return ret
	}).(IngressRouteTCPSpecTlsOutput)
}

// CertResolver defines the name of the certificate resolver to use.
// Cert resolvers have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/https/acme/#certificate-resolvers
func (o IngressRouteTCPSpecTlsPtrOutput) CertResolver() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) *string {
		if v == nil {
			return nil
		}
		return v.CertResolver
	}).(pulumi.StringPtrOutput)
}

// Domains defines the list of domains that will be used to issue certificates.
// More info: https://doc.traefik.io/traefik/v3.0/routing/routers/#domains
func (o IngressRouteTCPSpecTlsPtrOutput) Domains() IngressRouteTCPSpecTlsDomainsArrayOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) []IngressRouteTCPSpecTlsDomains {
		if v == nil {
			return nil
		}
		return v.Domains
	}).(IngressRouteTCPSpecTlsDomainsArrayOutput)
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
func (o IngressRouteTCPSpecTlsPtrOutput) Options() IngressRouteTCPSpecTlsOptionsPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) *IngressRouteTCPSpecTlsOptions {
		if v == nil {
			return nil
		}
		return v.Options
	}).(IngressRouteTCPSpecTlsOptionsPtrOutput)
}

// Passthrough defines whether a TLS router will terminate the TLS connection.
func (o IngressRouteTCPSpecTlsPtrOutput) Passthrough() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) *bool {
		if v == nil {
			return nil
		}
		return v.Passthrough
	}).(pulumi.BoolPtrOutput)
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o IngressRouteTCPSpecTlsPtrOutput) SecretName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) *string {
		if v == nil {
			return nil
		}
		return v.SecretName
	}).(pulumi.StringPtrOutput)
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
func (o IngressRouteTCPSpecTlsPtrOutput) Store() IngressRouteTCPSpecTlsStorePtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTls) *IngressRouteTCPSpecTlsStore {
		if v == nil {
			return nil
		}
		return v.Store
	}).(IngressRouteTCPSpecTlsStorePtrOutput)
}

// Domain holds a domain name with SANs.
type IngressRouteTCPSpecTlsDomains struct {
	// Main defines the main domain name.
	Main *string `pulumi:"main"`
	// SANs defines the subject alternative domain names.
	Sans []string `pulumi:"sans"`
}

// IngressRouteTCPSpecTlsDomainsInput is an input type that accepts IngressRouteTCPSpecTlsDomainsArgs and IngressRouteTCPSpecTlsDomainsOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsDomainsInput` via:
//
//	IngressRouteTCPSpecTlsDomainsArgs{...}
type IngressRouteTCPSpecTlsDomainsInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsDomainsOutput() IngressRouteTCPSpecTlsDomainsOutput
	ToIngressRouteTCPSpecTlsDomainsOutputWithContext(context.Context) IngressRouteTCPSpecTlsDomainsOutput
}

// Domain holds a domain name with SANs.
type IngressRouteTCPSpecTlsDomainsArgs struct {
	// Main defines the main domain name.
	Main pulumi.StringPtrInput `pulumi:"main"`
	// SANs defines the subject alternative domain names.
	Sans pulumi.StringArrayInput `pulumi:"sans"`
}

func (IngressRouteTCPSpecTlsDomainsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTlsDomains)(nil)).Elem()
}

func (i IngressRouteTCPSpecTlsDomainsArgs) ToIngressRouteTCPSpecTlsDomainsOutput() IngressRouteTCPSpecTlsDomainsOutput {
	return i.ToIngressRouteTCPSpecTlsDomainsOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsDomainsArgs) ToIngressRouteTCPSpecTlsDomainsOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsDomainsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsDomainsOutput)
}

func (i IngressRouteTCPSpecTlsDomainsArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTlsDomains] {
	return pulumix.Output[IngressRouteTCPSpecTlsDomains]{
		OutputState: i.ToIngressRouteTCPSpecTlsDomainsOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteTCPSpecTlsDomainsArrayInput is an input type that accepts IngressRouteTCPSpecTlsDomainsArray and IngressRouteTCPSpecTlsDomainsArrayOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsDomainsArrayInput` via:
//
//	IngressRouteTCPSpecTlsDomainsArray{ IngressRouteTCPSpecTlsDomainsArgs{...} }
type IngressRouteTCPSpecTlsDomainsArrayInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsDomainsArrayOutput() IngressRouteTCPSpecTlsDomainsArrayOutput
	ToIngressRouteTCPSpecTlsDomainsArrayOutputWithContext(context.Context) IngressRouteTCPSpecTlsDomainsArrayOutput
}

type IngressRouteTCPSpecTlsDomainsArray []IngressRouteTCPSpecTlsDomainsInput

func (IngressRouteTCPSpecTlsDomainsArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecTlsDomains)(nil)).Elem()
}

func (i IngressRouteTCPSpecTlsDomainsArray) ToIngressRouteTCPSpecTlsDomainsArrayOutput() IngressRouteTCPSpecTlsDomainsArrayOutput {
	return i.ToIngressRouteTCPSpecTlsDomainsArrayOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsDomainsArray) ToIngressRouteTCPSpecTlsDomainsArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsDomainsArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsDomainsArrayOutput)
}

func (i IngressRouteTCPSpecTlsDomainsArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecTlsDomains] {
	return pulumix.Output[[]IngressRouteTCPSpecTlsDomains]{
		OutputState: i.ToIngressRouteTCPSpecTlsDomainsArrayOutputWithContext(ctx).OutputState,
	}
}

// Domain holds a domain name with SANs.
type IngressRouteTCPSpecTlsDomainsOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsDomainsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTlsDomains)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsDomainsOutput) ToIngressRouteTCPSpecTlsDomainsOutput() IngressRouteTCPSpecTlsDomainsOutput {
	return o
}

func (o IngressRouteTCPSpecTlsDomainsOutput) ToIngressRouteTCPSpecTlsDomainsOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsDomainsOutput {
	return o
}

func (o IngressRouteTCPSpecTlsDomainsOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTlsDomains] {
	return pulumix.Output[IngressRouteTCPSpecTlsDomains]{
		OutputState: o.OutputState,
	}
}

// Main defines the main domain name.
func (o IngressRouteTCPSpecTlsDomainsOutput) Main() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTlsDomains) *string { return v.Main }).(pulumi.StringPtrOutput)
}

// SANs defines the subject alternative domain names.
func (o IngressRouteTCPSpecTlsDomainsOutput) Sans() pulumi.StringArrayOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTlsDomains) []string { return v.Sans }).(pulumi.StringArrayOutput)
}

type IngressRouteTCPSpecTlsDomainsArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsDomainsArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteTCPSpecTlsDomains)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsDomainsArrayOutput) ToIngressRouteTCPSpecTlsDomainsArrayOutput() IngressRouteTCPSpecTlsDomainsArrayOutput {
	return o
}

func (o IngressRouteTCPSpecTlsDomainsArrayOutput) ToIngressRouteTCPSpecTlsDomainsArrayOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsDomainsArrayOutput {
	return o
}

func (o IngressRouteTCPSpecTlsDomainsArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteTCPSpecTlsDomains] {
	return pulumix.Output[[]IngressRouteTCPSpecTlsDomains]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecTlsDomainsArrayOutput) Index(i pulumi.IntInput) IngressRouteTCPSpecTlsDomainsOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteTCPSpecTlsDomains {
		return vs[0].([]IngressRouteTCPSpecTlsDomains)[vs[1].(int)]
	}).(IngressRouteTCPSpecTlsDomainsOutput)
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type IngressRouteTCPSpecTlsOptions struct {
	// Name defines the name of the referenced Traefik resource.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Traefik resource.
	Namespace *string `pulumi:"namespace"`
}

// IngressRouteTCPSpecTlsOptionsInput is an input type that accepts IngressRouteTCPSpecTlsOptionsArgs and IngressRouteTCPSpecTlsOptionsOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsOptionsInput` via:
//
//	IngressRouteTCPSpecTlsOptionsArgs{...}
type IngressRouteTCPSpecTlsOptionsInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsOptionsOutput() IngressRouteTCPSpecTlsOptionsOutput
	ToIngressRouteTCPSpecTlsOptionsOutputWithContext(context.Context) IngressRouteTCPSpecTlsOptionsOutput
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type IngressRouteTCPSpecTlsOptionsArgs struct {
	// Name defines the name of the referenced Traefik resource.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Traefik resource.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (IngressRouteTCPSpecTlsOptionsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTlsOptions)(nil)).Elem()
}

func (i IngressRouteTCPSpecTlsOptionsArgs) ToIngressRouteTCPSpecTlsOptionsOutput() IngressRouteTCPSpecTlsOptionsOutput {
	return i.ToIngressRouteTCPSpecTlsOptionsOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsOptionsArgs) ToIngressRouteTCPSpecTlsOptionsOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOptionsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsOptionsOutput)
}

func (i IngressRouteTCPSpecTlsOptionsArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTlsOptions] {
	return pulumix.Output[IngressRouteTCPSpecTlsOptions]{
		OutputState: i.ToIngressRouteTCPSpecTlsOptionsOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteTCPSpecTlsOptionsArgs) ToIngressRouteTCPSpecTlsOptionsPtrOutput() IngressRouteTCPSpecTlsOptionsPtrOutput {
	return i.ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsOptionsArgs) ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOptionsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsOptionsOutput).ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(ctx)
}

// IngressRouteTCPSpecTlsOptionsPtrInput is an input type that accepts IngressRouteTCPSpecTlsOptionsArgs, IngressRouteTCPSpecTlsOptionsPtr and IngressRouteTCPSpecTlsOptionsPtrOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsOptionsPtrInput` via:
//
//	        IngressRouteTCPSpecTlsOptionsArgs{...}
//
//	or:
//
//	        nil
type IngressRouteTCPSpecTlsOptionsPtrInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsOptionsPtrOutput() IngressRouteTCPSpecTlsOptionsPtrOutput
	ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(context.Context) IngressRouteTCPSpecTlsOptionsPtrOutput
}

type ingressRouteTCPSpecTlsOptionsPtrType IngressRouteTCPSpecTlsOptionsArgs

func IngressRouteTCPSpecTlsOptionsPtr(v *IngressRouteTCPSpecTlsOptionsArgs) IngressRouteTCPSpecTlsOptionsPtrInput {
	return (*ingressRouteTCPSpecTlsOptionsPtrType)(v)
}

func (*ingressRouteTCPSpecTlsOptionsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecTlsOptions)(nil)).Elem()
}

func (i *ingressRouteTCPSpecTlsOptionsPtrType) ToIngressRouteTCPSpecTlsOptionsPtrOutput() IngressRouteTCPSpecTlsOptionsPtrOutput {
	return i.ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(context.Background())
}

func (i *ingressRouteTCPSpecTlsOptionsPtrType) ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOptionsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsOptionsPtrOutput)
}

func (i *ingressRouteTCPSpecTlsOptionsPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecTlsOptions] {
	return pulumix.Output[*IngressRouteTCPSpecTlsOptions]{
		OutputState: i.ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(ctx).OutputState,
	}
}

// Options defines the reference to a TLSOption, that specifies the parameters of the TLS connection.
// If not defined, the `default` TLSOption is used.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type IngressRouteTCPSpecTlsOptionsOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsOptionsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTlsOptions)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsOptionsOutput) ToIngressRouteTCPSpecTlsOptionsOutput() IngressRouteTCPSpecTlsOptionsOutput {
	return o
}

func (o IngressRouteTCPSpecTlsOptionsOutput) ToIngressRouteTCPSpecTlsOptionsOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOptionsOutput {
	return o
}

func (o IngressRouteTCPSpecTlsOptionsOutput) ToIngressRouteTCPSpecTlsOptionsPtrOutput() IngressRouteTCPSpecTlsOptionsPtrOutput {
	return o.ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(context.Background())
}

func (o IngressRouteTCPSpecTlsOptionsOutput) ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOptionsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteTCPSpecTlsOptions) *IngressRouteTCPSpecTlsOptions {
		return &v
	}).(IngressRouteTCPSpecTlsOptionsPtrOutput)
}

func (o IngressRouteTCPSpecTlsOptionsOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTlsOptions] {
	return pulumix.Output[IngressRouteTCPSpecTlsOptions]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsOptionsOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTlsOptions) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsOptionsOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTlsOptions) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type IngressRouteTCPSpecTlsOptionsPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsOptionsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecTlsOptions)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsOptionsPtrOutput) ToIngressRouteTCPSpecTlsOptionsPtrOutput() IngressRouteTCPSpecTlsOptionsPtrOutput {
	return o
}

func (o IngressRouteTCPSpecTlsOptionsPtrOutput) ToIngressRouteTCPSpecTlsOptionsPtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsOptionsPtrOutput {
	return o
}

func (o IngressRouteTCPSpecTlsOptionsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecTlsOptions] {
	return pulumix.Output[*IngressRouteTCPSpecTlsOptions]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecTlsOptionsPtrOutput) Elem() IngressRouteTCPSpecTlsOptionsOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTlsOptions) IngressRouteTCPSpecTlsOptions {
		if v != nil {
			return *v
		}
		var ret IngressRouteTCPSpecTlsOptions
		return ret
	}).(IngressRouteTCPSpecTlsOptionsOutput)
}

// Name defines the name of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsOptionsPtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTlsOptions) *string {
		if v == nil {
			return nil
		}
		return &v.Name
	}).(pulumi.StringPtrOutput)
}

// Namespace defines the namespace of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsOptionsPtrOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTlsOptions) *string {
		if v == nil {
			return nil
		}
		return v.Namespace
	}).(pulumi.StringPtrOutput)
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
type IngressRouteTCPSpecTlsStore struct {
	// Name defines the name of the referenced Traefik resource.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Traefik resource.
	Namespace *string `pulumi:"namespace"`
}

// IngressRouteTCPSpecTlsStoreInput is an input type that accepts IngressRouteTCPSpecTlsStoreArgs and IngressRouteTCPSpecTlsStoreOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsStoreInput` via:
//
//	IngressRouteTCPSpecTlsStoreArgs{...}
type IngressRouteTCPSpecTlsStoreInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsStoreOutput() IngressRouteTCPSpecTlsStoreOutput
	ToIngressRouteTCPSpecTlsStoreOutputWithContext(context.Context) IngressRouteTCPSpecTlsStoreOutput
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
type IngressRouteTCPSpecTlsStoreArgs struct {
	// Name defines the name of the referenced Traefik resource.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Traefik resource.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (IngressRouteTCPSpecTlsStoreArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTlsStore)(nil)).Elem()
}

func (i IngressRouteTCPSpecTlsStoreArgs) ToIngressRouteTCPSpecTlsStoreOutput() IngressRouteTCPSpecTlsStoreOutput {
	return i.ToIngressRouteTCPSpecTlsStoreOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsStoreArgs) ToIngressRouteTCPSpecTlsStoreOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsStoreOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsStoreOutput)
}

func (i IngressRouteTCPSpecTlsStoreArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTlsStore] {
	return pulumix.Output[IngressRouteTCPSpecTlsStore]{
		OutputState: i.ToIngressRouteTCPSpecTlsStoreOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteTCPSpecTlsStoreArgs) ToIngressRouteTCPSpecTlsStorePtrOutput() IngressRouteTCPSpecTlsStorePtrOutput {
	return i.ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(context.Background())
}

func (i IngressRouteTCPSpecTlsStoreArgs) ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsStorePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsStoreOutput).ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(ctx)
}

// IngressRouteTCPSpecTlsStorePtrInput is an input type that accepts IngressRouteTCPSpecTlsStoreArgs, IngressRouteTCPSpecTlsStorePtr and IngressRouteTCPSpecTlsStorePtrOutput values.
// You can construct a concrete instance of `IngressRouteTCPSpecTlsStorePtrInput` via:
//
//	        IngressRouteTCPSpecTlsStoreArgs{...}
//
//	or:
//
//	        nil
type IngressRouteTCPSpecTlsStorePtrInput interface {
	pulumi.Input

	ToIngressRouteTCPSpecTlsStorePtrOutput() IngressRouteTCPSpecTlsStorePtrOutput
	ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(context.Context) IngressRouteTCPSpecTlsStorePtrOutput
}

type ingressRouteTCPSpecTlsStorePtrType IngressRouteTCPSpecTlsStoreArgs

func IngressRouteTCPSpecTlsStorePtr(v *IngressRouteTCPSpecTlsStoreArgs) IngressRouteTCPSpecTlsStorePtrInput {
	return (*ingressRouteTCPSpecTlsStorePtrType)(v)
}

func (*ingressRouteTCPSpecTlsStorePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecTlsStore)(nil)).Elem()
}

func (i *ingressRouteTCPSpecTlsStorePtrType) ToIngressRouteTCPSpecTlsStorePtrOutput() IngressRouteTCPSpecTlsStorePtrOutput {
	return i.ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(context.Background())
}

func (i *ingressRouteTCPSpecTlsStorePtrType) ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsStorePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteTCPSpecTlsStorePtrOutput)
}

func (i *ingressRouteTCPSpecTlsStorePtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecTlsStore] {
	return pulumix.Output[*IngressRouteTCPSpecTlsStore]{
		OutputState: i.ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(ctx).OutputState,
	}
}

// Store defines the reference to the TLSStore, that will be used to store certificates.
// Please note that only `default` TLSStore can be used.
type IngressRouteTCPSpecTlsStoreOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsStoreOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteTCPSpecTlsStore)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsStoreOutput) ToIngressRouteTCPSpecTlsStoreOutput() IngressRouteTCPSpecTlsStoreOutput {
	return o
}

func (o IngressRouteTCPSpecTlsStoreOutput) ToIngressRouteTCPSpecTlsStoreOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsStoreOutput {
	return o
}

func (o IngressRouteTCPSpecTlsStoreOutput) ToIngressRouteTCPSpecTlsStorePtrOutput() IngressRouteTCPSpecTlsStorePtrOutput {
	return o.ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(context.Background())
}

func (o IngressRouteTCPSpecTlsStoreOutput) ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsStorePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteTCPSpecTlsStore) *IngressRouteTCPSpecTlsStore {
		return &v
	}).(IngressRouteTCPSpecTlsStorePtrOutput)
}

func (o IngressRouteTCPSpecTlsStoreOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteTCPSpecTlsStore] {
	return pulumix.Output[IngressRouteTCPSpecTlsStore]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsStoreOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTlsStore) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsStoreOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteTCPSpecTlsStore) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type IngressRouteTCPSpecTlsStorePtrOutput struct{ *pulumi.OutputState }

func (IngressRouteTCPSpecTlsStorePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteTCPSpecTlsStore)(nil)).Elem()
}

func (o IngressRouteTCPSpecTlsStorePtrOutput) ToIngressRouteTCPSpecTlsStorePtrOutput() IngressRouteTCPSpecTlsStorePtrOutput {
	return o
}

func (o IngressRouteTCPSpecTlsStorePtrOutput) ToIngressRouteTCPSpecTlsStorePtrOutputWithContext(ctx context.Context) IngressRouteTCPSpecTlsStorePtrOutput {
	return o
}

func (o IngressRouteTCPSpecTlsStorePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteTCPSpecTlsStore] {
	return pulumix.Output[*IngressRouteTCPSpecTlsStore]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteTCPSpecTlsStorePtrOutput) Elem() IngressRouteTCPSpecTlsStoreOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTlsStore) IngressRouteTCPSpecTlsStore {
		if v != nil {
			return *v
		}
		var ret IngressRouteTCPSpecTlsStore
		return ret
	}).(IngressRouteTCPSpecTlsStoreOutput)
}

// Name defines the name of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsStorePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTlsStore) *string {
		if v == nil {
			return nil
		}
		return &v.Name
	}).(pulumi.StringPtrOutput)
}

// Namespace defines the namespace of the referenced Traefik resource.
func (o IngressRouteTCPSpecTlsStorePtrOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *IngressRouteTCPSpecTlsStore) *string {
		if v == nil {
			return nil
		}
		return v.Namespace
	}).(pulumi.StringPtrOutput)
}

// IngressRouteUDP is a CRD implementation of a Traefik UDP Router.
type IngressRouteUDPType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// IngressRouteUDPSpec defines the desired state of a IngressRouteUDP.
	Spec IngressRouteUDPSpec `pulumi:"spec"`
}

type IngressRouteUDPMetadata struct {
}

// IngressRouteUDPSpec defines the desired state of a IngressRouteUDP.
type IngressRouteUDPSpec struct {
	// EntryPoints defines the list of entry point names to bind to.
	// Entry points have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
	// Default: all.
	EntryPoints []string `pulumi:"entryPoints"`
	// Routes defines the list of routes.
	Routes []IngressRouteUDPSpecRoutes `pulumi:"routes"`
}

// IngressRouteUDPSpecInput is an input type that accepts IngressRouteUDPSpecArgs and IngressRouteUDPSpecOutput values.
// You can construct a concrete instance of `IngressRouteUDPSpecInput` via:
//
//	IngressRouteUDPSpecArgs{...}
type IngressRouteUDPSpecInput interface {
	pulumi.Input

	ToIngressRouteUDPSpecOutput() IngressRouteUDPSpecOutput
	ToIngressRouteUDPSpecOutputWithContext(context.Context) IngressRouteUDPSpecOutput
}

// IngressRouteUDPSpec defines the desired state of a IngressRouteUDP.
type IngressRouteUDPSpecArgs struct {
	// EntryPoints defines the list of entry point names to bind to.
	// Entry points have to be configured in the static configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
	// Default: all.
	EntryPoints pulumi.StringArrayInput `pulumi:"entryPoints"`
	// Routes defines the list of routes.
	Routes IngressRouteUDPSpecRoutesArrayInput `pulumi:"routes"`
}

func (IngressRouteUDPSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteUDPSpec)(nil)).Elem()
}

func (i IngressRouteUDPSpecArgs) ToIngressRouteUDPSpecOutput() IngressRouteUDPSpecOutput {
	return i.ToIngressRouteUDPSpecOutputWithContext(context.Background())
}

func (i IngressRouteUDPSpecArgs) ToIngressRouteUDPSpecOutputWithContext(ctx context.Context) IngressRouteUDPSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecOutput)
}

func (i IngressRouteUDPSpecArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteUDPSpec] {
	return pulumix.Output[IngressRouteUDPSpec]{
		OutputState: i.ToIngressRouteUDPSpecOutputWithContext(ctx).OutputState,
	}
}

func (i IngressRouteUDPSpecArgs) ToIngressRouteUDPSpecPtrOutput() IngressRouteUDPSpecPtrOutput {
	return i.ToIngressRouteUDPSpecPtrOutputWithContext(context.Background())
}

func (i IngressRouteUDPSpecArgs) ToIngressRouteUDPSpecPtrOutputWithContext(ctx context.Context) IngressRouteUDPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecOutput).ToIngressRouteUDPSpecPtrOutputWithContext(ctx)
}

// IngressRouteUDPSpecPtrInput is an input type that accepts IngressRouteUDPSpecArgs, IngressRouteUDPSpecPtr and IngressRouteUDPSpecPtrOutput values.
// You can construct a concrete instance of `IngressRouteUDPSpecPtrInput` via:
//
//	        IngressRouteUDPSpecArgs{...}
//
//	or:
//
//	        nil
type IngressRouteUDPSpecPtrInput interface {
	pulumi.Input

	ToIngressRouteUDPSpecPtrOutput() IngressRouteUDPSpecPtrOutput
	ToIngressRouteUDPSpecPtrOutputWithContext(context.Context) IngressRouteUDPSpecPtrOutput
}

type ingressRouteUDPSpecPtrType IngressRouteUDPSpecArgs

func IngressRouteUDPSpecPtr(v *IngressRouteUDPSpecArgs) IngressRouteUDPSpecPtrInput {
	return (*ingressRouteUDPSpecPtrType)(v)
}

func (*ingressRouteUDPSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteUDPSpec)(nil)).Elem()
}

func (i *ingressRouteUDPSpecPtrType) ToIngressRouteUDPSpecPtrOutput() IngressRouteUDPSpecPtrOutput {
	return i.ToIngressRouteUDPSpecPtrOutputWithContext(context.Background())
}

func (i *ingressRouteUDPSpecPtrType) ToIngressRouteUDPSpecPtrOutputWithContext(ctx context.Context) IngressRouteUDPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecPtrOutput)
}

func (i *ingressRouteUDPSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteUDPSpec] {
	return pulumix.Output[*IngressRouteUDPSpec]{
		OutputState: i.ToIngressRouteUDPSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteUDPSpec defines the desired state of a IngressRouteUDP.
type IngressRouteUDPSpecOutput struct{ *pulumi.OutputState }

func (IngressRouteUDPSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteUDPSpec)(nil)).Elem()
}

func (o IngressRouteUDPSpecOutput) ToIngressRouteUDPSpecOutput() IngressRouteUDPSpecOutput {
	return o
}

func (o IngressRouteUDPSpecOutput) ToIngressRouteUDPSpecOutputWithContext(ctx context.Context) IngressRouteUDPSpecOutput {
	return o
}

func (o IngressRouteUDPSpecOutput) ToIngressRouteUDPSpecPtrOutput() IngressRouteUDPSpecPtrOutput {
	return o.ToIngressRouteUDPSpecPtrOutputWithContext(context.Background())
}

func (o IngressRouteUDPSpecOutput) ToIngressRouteUDPSpecPtrOutputWithContext(ctx context.Context) IngressRouteUDPSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v IngressRouteUDPSpec) *IngressRouteUDPSpec {
		return &v
	}).(IngressRouteUDPSpecPtrOutput)
}

func (o IngressRouteUDPSpecOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteUDPSpec] {
	return pulumix.Output[IngressRouteUDPSpec]{
		OutputState: o.OutputState,
	}
}

// EntryPoints defines the list of entry point names to bind to.
// Entry points have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
// Default: all.
func (o IngressRouteUDPSpecOutput) EntryPoints() pulumi.StringArrayOutput {
	return o.ApplyT(func(v IngressRouteUDPSpec) []string { return v.EntryPoints }).(pulumi.StringArrayOutput)
}

// Routes defines the list of routes.
func (o IngressRouteUDPSpecOutput) Routes() IngressRouteUDPSpecRoutesArrayOutput {
	return o.ApplyT(func(v IngressRouteUDPSpec) []IngressRouteUDPSpecRoutes { return v.Routes }).(IngressRouteUDPSpecRoutesArrayOutput)
}

type IngressRouteUDPSpecPtrOutput struct{ *pulumi.OutputState }

func (IngressRouteUDPSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**IngressRouteUDPSpec)(nil)).Elem()
}

func (o IngressRouteUDPSpecPtrOutput) ToIngressRouteUDPSpecPtrOutput() IngressRouteUDPSpecPtrOutput {
	return o
}

func (o IngressRouteUDPSpecPtrOutput) ToIngressRouteUDPSpecPtrOutputWithContext(ctx context.Context) IngressRouteUDPSpecPtrOutput {
	return o
}

func (o IngressRouteUDPSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*IngressRouteUDPSpec] {
	return pulumix.Output[*IngressRouteUDPSpec]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteUDPSpecPtrOutput) Elem() IngressRouteUDPSpecOutput {
	return o.ApplyT(func(v *IngressRouteUDPSpec) IngressRouteUDPSpec {
		if v != nil {
			return *v
		}
		var ret IngressRouteUDPSpec
		return ret
	}).(IngressRouteUDPSpecOutput)
}

// EntryPoints defines the list of entry point names to bind to.
// Entry points have to be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/entrypoints/
// Default: all.
func (o IngressRouteUDPSpecPtrOutput) EntryPoints() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *IngressRouteUDPSpec) []string {
		if v == nil {
			return nil
		}
		return v.EntryPoints
	}).(pulumi.StringArrayOutput)
}

// Routes defines the list of routes.
func (o IngressRouteUDPSpecPtrOutput) Routes() IngressRouteUDPSpecRoutesArrayOutput {
	return o.ApplyT(func(v *IngressRouteUDPSpec) []IngressRouteUDPSpecRoutes {
		if v == nil {
			return nil
		}
		return v.Routes
	}).(IngressRouteUDPSpecRoutesArrayOutput)
}

// RouteUDP holds the UDP route configuration.
type IngressRouteUDPSpecRoutes struct {
	// Services defines the list of UDP services.
	Services []IngressRouteUDPSpecRoutesServices `pulumi:"services"`
}

// IngressRouteUDPSpecRoutesInput is an input type that accepts IngressRouteUDPSpecRoutesArgs and IngressRouteUDPSpecRoutesOutput values.
// You can construct a concrete instance of `IngressRouteUDPSpecRoutesInput` via:
//
//	IngressRouteUDPSpecRoutesArgs{...}
type IngressRouteUDPSpecRoutesInput interface {
	pulumi.Input

	ToIngressRouteUDPSpecRoutesOutput() IngressRouteUDPSpecRoutesOutput
	ToIngressRouteUDPSpecRoutesOutputWithContext(context.Context) IngressRouteUDPSpecRoutesOutput
}

// RouteUDP holds the UDP route configuration.
type IngressRouteUDPSpecRoutesArgs struct {
	// Services defines the list of UDP services.
	Services IngressRouteUDPSpecRoutesServicesArrayInput `pulumi:"services"`
}

func (IngressRouteUDPSpecRoutesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteUDPSpecRoutes)(nil)).Elem()
}

func (i IngressRouteUDPSpecRoutesArgs) ToIngressRouteUDPSpecRoutesOutput() IngressRouteUDPSpecRoutesOutput {
	return i.ToIngressRouteUDPSpecRoutesOutputWithContext(context.Background())
}

func (i IngressRouteUDPSpecRoutesArgs) ToIngressRouteUDPSpecRoutesOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecRoutesOutput)
}

func (i IngressRouteUDPSpecRoutesArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteUDPSpecRoutes] {
	return pulumix.Output[IngressRouteUDPSpecRoutes]{
		OutputState: i.ToIngressRouteUDPSpecRoutesOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteUDPSpecRoutesArrayInput is an input type that accepts IngressRouteUDPSpecRoutesArray and IngressRouteUDPSpecRoutesArrayOutput values.
// You can construct a concrete instance of `IngressRouteUDPSpecRoutesArrayInput` via:
//
//	IngressRouteUDPSpecRoutesArray{ IngressRouteUDPSpecRoutesArgs{...} }
type IngressRouteUDPSpecRoutesArrayInput interface {
	pulumi.Input

	ToIngressRouteUDPSpecRoutesArrayOutput() IngressRouteUDPSpecRoutesArrayOutput
	ToIngressRouteUDPSpecRoutesArrayOutputWithContext(context.Context) IngressRouteUDPSpecRoutesArrayOutput
}

type IngressRouteUDPSpecRoutesArray []IngressRouteUDPSpecRoutesInput

func (IngressRouteUDPSpecRoutesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteUDPSpecRoutes)(nil)).Elem()
}

func (i IngressRouteUDPSpecRoutesArray) ToIngressRouteUDPSpecRoutesArrayOutput() IngressRouteUDPSpecRoutesArrayOutput {
	return i.ToIngressRouteUDPSpecRoutesArrayOutputWithContext(context.Background())
}

func (i IngressRouteUDPSpecRoutesArray) ToIngressRouteUDPSpecRoutesArrayOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecRoutesArrayOutput)
}

func (i IngressRouteUDPSpecRoutesArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteUDPSpecRoutes] {
	return pulumix.Output[[]IngressRouteUDPSpecRoutes]{
		OutputState: i.ToIngressRouteUDPSpecRoutesArrayOutputWithContext(ctx).OutputState,
	}
}

// RouteUDP holds the UDP route configuration.
type IngressRouteUDPSpecRoutesOutput struct{ *pulumi.OutputState }

func (IngressRouteUDPSpecRoutesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteUDPSpecRoutes)(nil)).Elem()
}

func (o IngressRouteUDPSpecRoutesOutput) ToIngressRouteUDPSpecRoutesOutput() IngressRouteUDPSpecRoutesOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesOutput) ToIngressRouteUDPSpecRoutesOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteUDPSpecRoutes] {
	return pulumix.Output[IngressRouteUDPSpecRoutes]{
		OutputState: o.OutputState,
	}
}

// Services defines the list of UDP services.
func (o IngressRouteUDPSpecRoutesOutput) Services() IngressRouteUDPSpecRoutesServicesArrayOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutes) []IngressRouteUDPSpecRoutesServices { return v.Services }).(IngressRouteUDPSpecRoutesServicesArrayOutput)
}

type IngressRouteUDPSpecRoutesArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteUDPSpecRoutesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteUDPSpecRoutes)(nil)).Elem()
}

func (o IngressRouteUDPSpecRoutesArrayOutput) ToIngressRouteUDPSpecRoutesArrayOutput() IngressRouteUDPSpecRoutesArrayOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesArrayOutput) ToIngressRouteUDPSpecRoutesArrayOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesArrayOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteUDPSpecRoutes] {
	return pulumix.Output[[]IngressRouteUDPSpecRoutes]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteUDPSpecRoutesArrayOutput) Index(i pulumi.IntInput) IngressRouteUDPSpecRoutesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteUDPSpecRoutes {
		return vs[0].([]IngressRouteUDPSpecRoutes)[vs[1].(int)]
	}).(IngressRouteUDPSpecRoutesOutput)
}

// ServiceUDP defines an upstream UDP service to proxy traffic to.
type IngressRouteUDPSpecRoutesServices struct {
	// Name defines the name of the referenced Kubernetes Service.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// Weight defines the weight used when balancing requests between multiple Kubernetes Service.
	Weight *int `pulumi:"weight"`
}

// IngressRouteUDPSpecRoutesServicesInput is an input type that accepts IngressRouteUDPSpecRoutesServicesArgs and IngressRouteUDPSpecRoutesServicesOutput values.
// You can construct a concrete instance of `IngressRouteUDPSpecRoutesServicesInput` via:
//
//	IngressRouteUDPSpecRoutesServicesArgs{...}
type IngressRouteUDPSpecRoutesServicesInput interface {
	pulumi.Input

	ToIngressRouteUDPSpecRoutesServicesOutput() IngressRouteUDPSpecRoutesServicesOutput
	ToIngressRouteUDPSpecRoutesServicesOutputWithContext(context.Context) IngressRouteUDPSpecRoutesServicesOutput
}

// ServiceUDP defines an upstream UDP service to proxy traffic to.
type IngressRouteUDPSpecRoutesServicesArgs struct {
	// Name defines the name of the referenced Kubernetes Service.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// Weight defines the weight used when balancing requests between multiple Kubernetes Service.
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (IngressRouteUDPSpecRoutesServicesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteUDPSpecRoutesServices)(nil)).Elem()
}

func (i IngressRouteUDPSpecRoutesServicesArgs) ToIngressRouteUDPSpecRoutesServicesOutput() IngressRouteUDPSpecRoutesServicesOutput {
	return i.ToIngressRouteUDPSpecRoutesServicesOutputWithContext(context.Background())
}

func (i IngressRouteUDPSpecRoutesServicesArgs) ToIngressRouteUDPSpecRoutesServicesOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesServicesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecRoutesServicesOutput)
}

func (i IngressRouteUDPSpecRoutesServicesArgs) ToOutput(ctx context.Context) pulumix.Output[IngressRouteUDPSpecRoutesServices] {
	return pulumix.Output[IngressRouteUDPSpecRoutesServices]{
		OutputState: i.ToIngressRouteUDPSpecRoutesServicesOutputWithContext(ctx).OutputState,
	}
}

// IngressRouteUDPSpecRoutesServicesArrayInput is an input type that accepts IngressRouteUDPSpecRoutesServicesArray and IngressRouteUDPSpecRoutesServicesArrayOutput values.
// You can construct a concrete instance of `IngressRouteUDPSpecRoutesServicesArrayInput` via:
//
//	IngressRouteUDPSpecRoutesServicesArray{ IngressRouteUDPSpecRoutesServicesArgs{...} }
type IngressRouteUDPSpecRoutesServicesArrayInput interface {
	pulumi.Input

	ToIngressRouteUDPSpecRoutesServicesArrayOutput() IngressRouteUDPSpecRoutesServicesArrayOutput
	ToIngressRouteUDPSpecRoutesServicesArrayOutputWithContext(context.Context) IngressRouteUDPSpecRoutesServicesArrayOutput
}

type IngressRouteUDPSpecRoutesServicesArray []IngressRouteUDPSpecRoutesServicesInput

func (IngressRouteUDPSpecRoutesServicesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteUDPSpecRoutesServices)(nil)).Elem()
}

func (i IngressRouteUDPSpecRoutesServicesArray) ToIngressRouteUDPSpecRoutesServicesArrayOutput() IngressRouteUDPSpecRoutesServicesArrayOutput {
	return i.ToIngressRouteUDPSpecRoutesServicesArrayOutputWithContext(context.Background())
}

func (i IngressRouteUDPSpecRoutesServicesArray) ToIngressRouteUDPSpecRoutesServicesArrayOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesServicesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(IngressRouteUDPSpecRoutesServicesArrayOutput)
}

func (i IngressRouteUDPSpecRoutesServicesArray) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteUDPSpecRoutesServices] {
	return pulumix.Output[[]IngressRouteUDPSpecRoutesServices]{
		OutputState: i.ToIngressRouteUDPSpecRoutesServicesArrayOutputWithContext(ctx).OutputState,
	}
}

// ServiceUDP defines an upstream UDP service to proxy traffic to.
type IngressRouteUDPSpecRoutesServicesOutput struct{ *pulumi.OutputState }

func (IngressRouteUDPSpecRoutesServicesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*IngressRouteUDPSpecRoutesServices)(nil)).Elem()
}

func (o IngressRouteUDPSpecRoutesServicesOutput) ToIngressRouteUDPSpecRoutesServicesOutput() IngressRouteUDPSpecRoutesServicesOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesServicesOutput) ToIngressRouteUDPSpecRoutesServicesOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesServicesOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesServicesOutput) ToOutput(ctx context.Context) pulumix.Output[IngressRouteUDPSpecRoutesServices] {
	return pulumix.Output[IngressRouteUDPSpecRoutesServices]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Kubernetes Service.
func (o IngressRouteUDPSpecRoutesServicesOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutesServices) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service.
func (o IngressRouteUDPSpecRoutesServicesOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutesServices) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o IngressRouteUDPSpecRoutesServicesOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutesServices) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o IngressRouteUDPSpecRoutesServicesOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutesServices) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o IngressRouteUDPSpecRoutesServicesOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutesServices) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// Weight defines the weight used when balancing requests between multiple Kubernetes Service.
func (o IngressRouteUDPSpecRoutesServicesOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v IngressRouteUDPSpecRoutesServices) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type IngressRouteUDPSpecRoutesServicesArrayOutput struct{ *pulumi.OutputState }

func (IngressRouteUDPSpecRoutesServicesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]IngressRouteUDPSpecRoutesServices)(nil)).Elem()
}

func (o IngressRouteUDPSpecRoutesServicesArrayOutput) ToIngressRouteUDPSpecRoutesServicesArrayOutput() IngressRouteUDPSpecRoutesServicesArrayOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesServicesArrayOutput) ToIngressRouteUDPSpecRoutesServicesArrayOutputWithContext(ctx context.Context) IngressRouteUDPSpecRoutesServicesArrayOutput {
	return o
}

func (o IngressRouteUDPSpecRoutesServicesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]IngressRouteUDPSpecRoutesServices] {
	return pulumix.Output[[]IngressRouteUDPSpecRoutesServices]{
		OutputState: o.OutputState,
	}
}

func (o IngressRouteUDPSpecRoutesServicesArrayOutput) Index(i pulumi.IntInput) IngressRouteUDPSpecRoutesServicesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) IngressRouteUDPSpecRoutesServices {
		return vs[0].([]IngressRouteUDPSpecRoutesServices)[vs[1].(int)]
	}).(IngressRouteUDPSpecRoutesServicesOutput)
}

// Middleware is the CRD implementation of a Traefik Middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/overview/
type MiddlewareType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// MiddlewareSpec defines the desired state of a Middleware.
	Spec MiddlewareSpec `pulumi:"spec"`
}

type MiddlewareMetadata struct {
}

// MiddlewareSpec defines the desired state of a Middleware.
type MiddlewareSpec struct {
	// AddPrefix holds the add prefix middleware configuration.
	// This middleware updates the path of a request before forwarding it.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
	AddPrefix *MiddlewareSpecAddPrefix `pulumi:"addPrefix"`
	// BasicAuth holds the basic auth middleware configuration.
	// This middleware restricts access to your services to known users.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
	BasicAuth *MiddlewareSpecBasicAuth `pulumi:"basicAuth"`
	// Buffering holds the buffering middleware configuration.
	// This middleware retries or limits the size of requests that can be forwarded to backends.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
	Buffering *MiddlewareSpecBuffering `pulumi:"buffering"`
	// Chain holds the configuration of the chain middleware.
	// This middleware enables to define reusable combinations of other pieces of middleware.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
	Chain *MiddlewareSpecChain `pulumi:"chain"`
	// CircuitBreaker holds the circuit breaker configuration.
	CircuitBreaker *MiddlewareSpecCircuitBreaker `pulumi:"circuitBreaker"`
	// Compress holds the compress middleware configuration.
	// This middleware compresses responses before sending them to the client, using gzip compression.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
	Compress *MiddlewareSpecCompress `pulumi:"compress"`
	// ContentType holds the content-type middleware configuration.
	// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
	ContentType *MiddlewareSpecContentType `pulumi:"contentType"`
	// DigestAuth holds the digest auth middleware configuration.
	// This middleware restricts access to your services to known users.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
	DigestAuth *MiddlewareSpecDigestAuth `pulumi:"digestAuth"`
	// ErrorPage holds the custom error middleware configuration.
	// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
	Errors *MiddlewareSpecErrors `pulumi:"errors"`
	// ForwardAuth holds the forward auth middleware configuration.
	// This middleware delegates the request authentication to a Service.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
	ForwardAuth *MiddlewareSpecForwardAuth `pulumi:"forwardAuth"`
	// GrpcWeb holds the gRPC web middleware configuration.
	// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
	GrpcWeb *MiddlewareSpecGrpcWeb `pulumi:"grpcWeb"`
	// Headers holds the headers middleware configuration.
	// This middleware manages the requests and responses headers.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
	Headers *MiddlewareSpecHeaders `pulumi:"headers"`
	// InFlightReq holds the in-flight request middleware configuration.
	// This middleware limits the number of requests being processed and served concurrently.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
	InFlightReq *MiddlewareSpecInFlightReq `pulumi:"inFlightReq"`
	// IPAllowList holds the IP allowlist middleware configuration.
	// This middleware limits allowed requests based on the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
	IpAllowList *MiddlewareSpecIpAllowList `pulumi:"ipAllowList"`
	// Deprecated: please use IPAllowList instead.
	IpWhiteList *MiddlewareSpecIpWhiteList `pulumi:"ipWhiteList"`
	// PassTLSClientCert holds the pass TLS client cert middleware configuration.
	// This middleware adds the selected data from the passed client TLS certificate to a header.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
	PassTLSClientCert *MiddlewareSpecPassTLSClientCert `pulumi:"passTLSClientCert"`
	// Plugin defines the middleware plugin configuration.
	// More info: https://doc.traefik.io/traefik/plugins/
	Plugin map[string]map[string]interface{} `pulumi:"plugin"`
	// RateLimit holds the rate limit configuration.
	// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
	RateLimit *MiddlewareSpecRateLimit `pulumi:"rateLimit"`
	// RedirectRegex holds the redirect regex middleware configuration.
	// This middleware redirects a request using regex matching and replacement.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
	RedirectRegex *MiddlewareSpecRedirectRegex `pulumi:"redirectRegex"`
	// RedirectScheme holds the redirect scheme middleware configuration.
	// This middleware redirects requests from a scheme/port to another.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
	RedirectScheme *MiddlewareSpecRedirectScheme `pulumi:"redirectScheme"`
	// ReplacePath holds the replace path middleware configuration.
	// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
	ReplacePath *MiddlewareSpecReplacePath `pulumi:"replacePath"`
	// ReplacePathRegex holds the replace path regex middleware configuration.
	// This middleware replaces the path of a URL using regex matching and replacement.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
	ReplacePathRegex *MiddlewareSpecReplacePathRegex `pulumi:"replacePathRegex"`
	// Retry holds the retry middleware configuration.
	// This middleware reissues requests a given number of times to a backend server if that server does not reply.
	// As soon as the server answers, the middleware stops retrying, regardless of the response status.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
	Retry *MiddlewareSpecRetry `pulumi:"retry"`
	// StripPrefix holds the strip prefix middleware configuration.
	// This middleware removes the specified prefixes from the URL path.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
	StripPrefix *MiddlewareSpecStripPrefix `pulumi:"stripPrefix"`
	// StripPrefixRegex holds the strip prefix regex middleware configuration.
	// This middleware removes the matching prefixes from the URL path.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
	StripPrefixRegex *MiddlewareSpecStripPrefixRegex `pulumi:"stripPrefixRegex"`
}

// MiddlewareSpecInput is an input type that accepts MiddlewareSpecArgs and MiddlewareSpecOutput values.
// You can construct a concrete instance of `MiddlewareSpecInput` via:
//
//	MiddlewareSpecArgs{...}
type MiddlewareSpecInput interface {
	pulumi.Input

	ToMiddlewareSpecOutput() MiddlewareSpecOutput
	ToMiddlewareSpecOutputWithContext(context.Context) MiddlewareSpecOutput
}

// MiddlewareSpec defines the desired state of a Middleware.
type MiddlewareSpecArgs struct {
	// AddPrefix holds the add prefix middleware configuration.
	// This middleware updates the path of a request before forwarding it.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
	AddPrefix MiddlewareSpecAddPrefixPtrInput `pulumi:"addPrefix"`
	// BasicAuth holds the basic auth middleware configuration.
	// This middleware restricts access to your services to known users.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
	BasicAuth MiddlewareSpecBasicAuthPtrInput `pulumi:"basicAuth"`
	// Buffering holds the buffering middleware configuration.
	// This middleware retries or limits the size of requests that can be forwarded to backends.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
	Buffering MiddlewareSpecBufferingPtrInput `pulumi:"buffering"`
	// Chain holds the configuration of the chain middleware.
	// This middleware enables to define reusable combinations of other pieces of middleware.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
	Chain MiddlewareSpecChainPtrInput `pulumi:"chain"`
	// CircuitBreaker holds the circuit breaker configuration.
	CircuitBreaker MiddlewareSpecCircuitBreakerPtrInput `pulumi:"circuitBreaker"`
	// Compress holds the compress middleware configuration.
	// This middleware compresses responses before sending them to the client, using gzip compression.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
	Compress MiddlewareSpecCompressPtrInput `pulumi:"compress"`
	// ContentType holds the content-type middleware configuration.
	// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
	ContentType MiddlewareSpecContentTypePtrInput `pulumi:"contentType"`
	// DigestAuth holds the digest auth middleware configuration.
	// This middleware restricts access to your services to known users.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
	DigestAuth MiddlewareSpecDigestAuthPtrInput `pulumi:"digestAuth"`
	// ErrorPage holds the custom error middleware configuration.
	// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
	Errors MiddlewareSpecErrorsPtrInput `pulumi:"errors"`
	// ForwardAuth holds the forward auth middleware configuration.
	// This middleware delegates the request authentication to a Service.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
	ForwardAuth MiddlewareSpecForwardAuthPtrInput `pulumi:"forwardAuth"`
	// GrpcWeb holds the gRPC web middleware configuration.
	// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
	GrpcWeb MiddlewareSpecGrpcWebPtrInput `pulumi:"grpcWeb"`
	// Headers holds the headers middleware configuration.
	// This middleware manages the requests and responses headers.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
	Headers MiddlewareSpecHeadersPtrInput `pulumi:"headers"`
	// InFlightReq holds the in-flight request middleware configuration.
	// This middleware limits the number of requests being processed and served concurrently.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
	InFlightReq MiddlewareSpecInFlightReqPtrInput `pulumi:"inFlightReq"`
	// IPAllowList holds the IP allowlist middleware configuration.
	// This middleware limits allowed requests based on the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
	IpAllowList MiddlewareSpecIpAllowListPtrInput `pulumi:"ipAllowList"`
	// Deprecated: please use IPAllowList instead.
	IpWhiteList MiddlewareSpecIpWhiteListPtrInput `pulumi:"ipWhiteList"`
	// PassTLSClientCert holds the pass TLS client cert middleware configuration.
	// This middleware adds the selected data from the passed client TLS certificate to a header.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
	PassTLSClientCert MiddlewareSpecPassTLSClientCertPtrInput `pulumi:"passTLSClientCert"`
	// Plugin defines the middleware plugin configuration.
	// More info: https://doc.traefik.io/traefik/plugins/
	Plugin pulumi.MapMapInput `pulumi:"plugin"`
	// RateLimit holds the rate limit configuration.
	// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
	RateLimit MiddlewareSpecRateLimitPtrInput `pulumi:"rateLimit"`
	// RedirectRegex holds the redirect regex middleware configuration.
	// This middleware redirects a request using regex matching and replacement.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
	RedirectRegex MiddlewareSpecRedirectRegexPtrInput `pulumi:"redirectRegex"`
	// RedirectScheme holds the redirect scheme middleware configuration.
	// This middleware redirects requests from a scheme/port to another.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
	RedirectScheme MiddlewareSpecRedirectSchemePtrInput `pulumi:"redirectScheme"`
	// ReplacePath holds the replace path middleware configuration.
	// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
	ReplacePath MiddlewareSpecReplacePathPtrInput `pulumi:"replacePath"`
	// ReplacePathRegex holds the replace path regex middleware configuration.
	// This middleware replaces the path of a URL using regex matching and replacement.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
	ReplacePathRegex MiddlewareSpecReplacePathRegexPtrInput `pulumi:"replacePathRegex"`
	// Retry holds the retry middleware configuration.
	// This middleware reissues requests a given number of times to a backend server if that server does not reply.
	// As soon as the server answers, the middleware stops retrying, regardless of the response status.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
	Retry MiddlewareSpecRetryPtrInput `pulumi:"retry"`
	// StripPrefix holds the strip prefix middleware configuration.
	// This middleware removes the specified prefixes from the URL path.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
	StripPrefix MiddlewareSpecStripPrefixPtrInput `pulumi:"stripPrefix"`
	// StripPrefixRegex holds the strip prefix regex middleware configuration.
	// This middleware removes the matching prefixes from the URL path.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
	StripPrefixRegex MiddlewareSpecStripPrefixRegexPtrInput `pulumi:"stripPrefixRegex"`
}

func (MiddlewareSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpec)(nil)).Elem()
}

func (i MiddlewareSpecArgs) ToMiddlewareSpecOutput() MiddlewareSpecOutput {
	return i.ToMiddlewareSpecOutputWithContext(context.Background())
}

func (i MiddlewareSpecArgs) ToMiddlewareSpecOutputWithContext(ctx context.Context) MiddlewareSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecOutput)
}

func (i MiddlewareSpecArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpec] {
	return pulumix.Output[MiddlewareSpec]{
		OutputState: i.ToMiddlewareSpecOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecArgs) ToMiddlewareSpecPtrOutput() MiddlewareSpecPtrOutput {
	return i.ToMiddlewareSpecPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecArgs) ToMiddlewareSpecPtrOutputWithContext(ctx context.Context) MiddlewareSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecOutput).ToMiddlewareSpecPtrOutputWithContext(ctx)
}

// MiddlewareSpecPtrInput is an input type that accepts MiddlewareSpecArgs, MiddlewareSpecPtr and MiddlewareSpecPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecPtrInput` via:
//
//	        MiddlewareSpecArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecPtrOutput() MiddlewareSpecPtrOutput
	ToMiddlewareSpecPtrOutputWithContext(context.Context) MiddlewareSpecPtrOutput
}

type middlewareSpecPtrType MiddlewareSpecArgs

func MiddlewareSpecPtr(v *MiddlewareSpecArgs) MiddlewareSpecPtrInput {
	return (*middlewareSpecPtrType)(v)
}

func (*middlewareSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpec)(nil)).Elem()
}

func (i *middlewareSpecPtrType) ToMiddlewareSpecPtrOutput() MiddlewareSpecPtrOutput {
	return i.ToMiddlewareSpecPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecPtrType) ToMiddlewareSpecPtrOutputWithContext(ctx context.Context) MiddlewareSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPtrOutput)
}

func (i *middlewareSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpec] {
	return pulumix.Output[*MiddlewareSpec]{
		OutputState: i.ToMiddlewareSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// MiddlewareSpec defines the desired state of a Middleware.
type MiddlewareSpecOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpec)(nil)).Elem()
}

func (o MiddlewareSpecOutput) ToMiddlewareSpecOutput() MiddlewareSpecOutput {
	return o
}

func (o MiddlewareSpecOutput) ToMiddlewareSpecOutputWithContext(ctx context.Context) MiddlewareSpecOutput {
	return o
}

func (o MiddlewareSpecOutput) ToMiddlewareSpecPtrOutput() MiddlewareSpecPtrOutput {
	return o.ToMiddlewareSpecPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecOutput) ToMiddlewareSpecPtrOutputWithContext(ctx context.Context) MiddlewareSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpec) *MiddlewareSpec {
		return &v
	}).(MiddlewareSpecPtrOutput)
}

func (o MiddlewareSpecOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpec] {
	return pulumix.Output[MiddlewareSpec]{
		OutputState: o.OutputState,
	}
}

// AddPrefix holds the add prefix middleware configuration.
// This middleware updates the path of a request before forwarding it.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
func (o MiddlewareSpecOutput) AddPrefix() MiddlewareSpecAddPrefixPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecAddPrefix { return v.AddPrefix }).(MiddlewareSpecAddPrefixPtrOutput)
}

// BasicAuth holds the basic auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
func (o MiddlewareSpecOutput) BasicAuth() MiddlewareSpecBasicAuthPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecBasicAuth { return v.BasicAuth }).(MiddlewareSpecBasicAuthPtrOutput)
}

// Buffering holds the buffering middleware configuration.
// This middleware retries or limits the size of requests that can be forwarded to backends.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
func (o MiddlewareSpecOutput) Buffering() MiddlewareSpecBufferingPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecBuffering { return v.Buffering }).(MiddlewareSpecBufferingPtrOutput)
}

// Chain holds the configuration of the chain middleware.
// This middleware enables to define reusable combinations of other pieces of middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
func (o MiddlewareSpecOutput) Chain() MiddlewareSpecChainPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecChain { return v.Chain }).(MiddlewareSpecChainPtrOutput)
}

// CircuitBreaker holds the circuit breaker configuration.
func (o MiddlewareSpecOutput) CircuitBreaker() MiddlewareSpecCircuitBreakerPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecCircuitBreaker { return v.CircuitBreaker }).(MiddlewareSpecCircuitBreakerPtrOutput)
}

// Compress holds the compress middleware configuration.
// This middleware compresses responses before sending them to the client, using gzip compression.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
func (o MiddlewareSpecOutput) Compress() MiddlewareSpecCompressPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecCompress { return v.Compress }).(MiddlewareSpecCompressPtrOutput)
}

// ContentType holds the content-type middleware configuration.
// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
func (o MiddlewareSpecOutput) ContentType() MiddlewareSpecContentTypePtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecContentType { return v.ContentType }).(MiddlewareSpecContentTypePtrOutput)
}

// DigestAuth holds the digest auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
func (o MiddlewareSpecOutput) DigestAuth() MiddlewareSpecDigestAuthPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecDigestAuth { return v.DigestAuth }).(MiddlewareSpecDigestAuthPtrOutput)
}

// ErrorPage holds the custom error middleware configuration.
// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
func (o MiddlewareSpecOutput) Errors() MiddlewareSpecErrorsPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecErrors { return v.Errors }).(MiddlewareSpecErrorsPtrOutput)
}

// ForwardAuth holds the forward auth middleware configuration.
// This middleware delegates the request authentication to a Service.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
func (o MiddlewareSpecOutput) ForwardAuth() MiddlewareSpecForwardAuthPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecForwardAuth { return v.ForwardAuth }).(MiddlewareSpecForwardAuthPtrOutput)
}

// GrpcWeb holds the gRPC web middleware configuration.
// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
func (o MiddlewareSpecOutput) GrpcWeb() MiddlewareSpecGrpcWebPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecGrpcWeb { return v.GrpcWeb }).(MiddlewareSpecGrpcWebPtrOutput)
}

// Headers holds the headers middleware configuration.
// This middleware manages the requests and responses headers.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
func (o MiddlewareSpecOutput) Headers() MiddlewareSpecHeadersPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecHeaders { return v.Headers }).(MiddlewareSpecHeadersPtrOutput)
}

// InFlightReq holds the in-flight request middleware configuration.
// This middleware limits the number of requests being processed and served concurrently.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
func (o MiddlewareSpecOutput) InFlightReq() MiddlewareSpecInFlightReqPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecInFlightReq { return v.InFlightReq }).(MiddlewareSpecInFlightReqPtrOutput)
}

// IPAllowList holds the IP allowlist middleware configuration.
// This middleware limits allowed requests based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
func (o MiddlewareSpecOutput) IpAllowList() MiddlewareSpecIpAllowListPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecIpAllowList { return v.IpAllowList }).(MiddlewareSpecIpAllowListPtrOutput)
}

// Deprecated: please use IPAllowList instead.
func (o MiddlewareSpecOutput) IpWhiteList() MiddlewareSpecIpWhiteListPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecIpWhiteList { return v.IpWhiteList }).(MiddlewareSpecIpWhiteListPtrOutput)
}

// PassTLSClientCert holds the pass TLS client cert middleware configuration.
// This middleware adds the selected data from the passed client TLS certificate to a header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
func (o MiddlewareSpecOutput) PassTLSClientCert() MiddlewareSpecPassTLSClientCertPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecPassTLSClientCert { return v.PassTLSClientCert }).(MiddlewareSpecPassTLSClientCertPtrOutput)
}

// Plugin defines the middleware plugin configuration.
// More info: https://doc.traefik.io/traefik/plugins/
func (o MiddlewareSpecOutput) Plugin() pulumi.MapMapOutput {
	return o.ApplyT(func(v MiddlewareSpec) map[string]map[string]interface{} { return v.Plugin }).(pulumi.MapMapOutput)
}

// RateLimit holds the rate limit configuration.
// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
func (o MiddlewareSpecOutput) RateLimit() MiddlewareSpecRateLimitPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecRateLimit { return v.RateLimit }).(MiddlewareSpecRateLimitPtrOutput)
}

// RedirectRegex holds the redirect regex middleware configuration.
// This middleware redirects a request using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
func (o MiddlewareSpecOutput) RedirectRegex() MiddlewareSpecRedirectRegexPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecRedirectRegex { return v.RedirectRegex }).(MiddlewareSpecRedirectRegexPtrOutput)
}

// RedirectScheme holds the redirect scheme middleware configuration.
// This middleware redirects requests from a scheme/port to another.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
func (o MiddlewareSpecOutput) RedirectScheme() MiddlewareSpecRedirectSchemePtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecRedirectScheme { return v.RedirectScheme }).(MiddlewareSpecRedirectSchemePtrOutput)
}

// ReplacePath holds the replace path middleware configuration.
// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
func (o MiddlewareSpecOutput) ReplacePath() MiddlewareSpecReplacePathPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecReplacePath { return v.ReplacePath }).(MiddlewareSpecReplacePathPtrOutput)
}

// ReplacePathRegex holds the replace path regex middleware configuration.
// This middleware replaces the path of a URL using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
func (o MiddlewareSpecOutput) ReplacePathRegex() MiddlewareSpecReplacePathRegexPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecReplacePathRegex { return v.ReplacePathRegex }).(MiddlewareSpecReplacePathRegexPtrOutput)
}

// Retry holds the retry middleware configuration.
// This middleware reissues requests a given number of times to a backend server if that server does not reply.
// As soon as the server answers, the middleware stops retrying, regardless of the response status.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
func (o MiddlewareSpecOutput) Retry() MiddlewareSpecRetryPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecRetry { return v.Retry }).(MiddlewareSpecRetryPtrOutput)
}

// StripPrefix holds the strip prefix middleware configuration.
// This middleware removes the specified prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
func (o MiddlewareSpecOutput) StripPrefix() MiddlewareSpecStripPrefixPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecStripPrefix { return v.StripPrefix }).(MiddlewareSpecStripPrefixPtrOutput)
}

// StripPrefixRegex holds the strip prefix regex middleware configuration.
// This middleware removes the matching prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
func (o MiddlewareSpecOutput) StripPrefixRegex() MiddlewareSpecStripPrefixRegexPtrOutput {
	return o.ApplyT(func(v MiddlewareSpec) *MiddlewareSpecStripPrefixRegex { return v.StripPrefixRegex }).(MiddlewareSpecStripPrefixRegexPtrOutput)
}

type MiddlewareSpecPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpec)(nil)).Elem()
}

func (o MiddlewareSpecPtrOutput) ToMiddlewareSpecPtrOutput() MiddlewareSpecPtrOutput {
	return o
}

func (o MiddlewareSpecPtrOutput) ToMiddlewareSpecPtrOutputWithContext(ctx context.Context) MiddlewareSpecPtrOutput {
	return o
}

func (o MiddlewareSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpec] {
	return pulumix.Output[*MiddlewareSpec]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecPtrOutput) Elem() MiddlewareSpecOutput {
	return o.ApplyT(func(v *MiddlewareSpec) MiddlewareSpec {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpec
		return ret
	}).(MiddlewareSpecOutput)
}

// AddPrefix holds the add prefix middleware configuration.
// This middleware updates the path of a request before forwarding it.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
func (o MiddlewareSpecPtrOutput) AddPrefix() MiddlewareSpecAddPrefixPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecAddPrefix {
		if v == nil {
			return nil
		}
		return v.AddPrefix
	}).(MiddlewareSpecAddPrefixPtrOutput)
}

// BasicAuth holds the basic auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
func (o MiddlewareSpecPtrOutput) BasicAuth() MiddlewareSpecBasicAuthPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecBasicAuth {
		if v == nil {
			return nil
		}
		return v.BasicAuth
	}).(MiddlewareSpecBasicAuthPtrOutput)
}

// Buffering holds the buffering middleware configuration.
// This middleware retries or limits the size of requests that can be forwarded to backends.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
func (o MiddlewareSpecPtrOutput) Buffering() MiddlewareSpecBufferingPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecBuffering {
		if v == nil {
			return nil
		}
		return v.Buffering
	}).(MiddlewareSpecBufferingPtrOutput)
}

// Chain holds the configuration of the chain middleware.
// This middleware enables to define reusable combinations of other pieces of middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
func (o MiddlewareSpecPtrOutput) Chain() MiddlewareSpecChainPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecChain {
		if v == nil {
			return nil
		}
		return v.Chain
	}).(MiddlewareSpecChainPtrOutput)
}

// CircuitBreaker holds the circuit breaker configuration.
func (o MiddlewareSpecPtrOutput) CircuitBreaker() MiddlewareSpecCircuitBreakerPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecCircuitBreaker {
		if v == nil {
			return nil
		}
		return v.CircuitBreaker
	}).(MiddlewareSpecCircuitBreakerPtrOutput)
}

// Compress holds the compress middleware configuration.
// This middleware compresses responses before sending them to the client, using gzip compression.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
func (o MiddlewareSpecPtrOutput) Compress() MiddlewareSpecCompressPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecCompress {
		if v == nil {
			return nil
		}
		return v.Compress
	}).(MiddlewareSpecCompressPtrOutput)
}

// ContentType holds the content-type middleware configuration.
// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
func (o MiddlewareSpecPtrOutput) ContentType() MiddlewareSpecContentTypePtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecContentType {
		if v == nil {
			return nil
		}
		return v.ContentType
	}).(MiddlewareSpecContentTypePtrOutput)
}

// DigestAuth holds the digest auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
func (o MiddlewareSpecPtrOutput) DigestAuth() MiddlewareSpecDigestAuthPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecDigestAuth {
		if v == nil {
			return nil
		}
		return v.DigestAuth
	}).(MiddlewareSpecDigestAuthPtrOutput)
}

// ErrorPage holds the custom error middleware configuration.
// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
func (o MiddlewareSpecPtrOutput) Errors() MiddlewareSpecErrorsPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecErrors {
		if v == nil {
			return nil
		}
		return v.Errors
	}).(MiddlewareSpecErrorsPtrOutput)
}

// ForwardAuth holds the forward auth middleware configuration.
// This middleware delegates the request authentication to a Service.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
func (o MiddlewareSpecPtrOutput) ForwardAuth() MiddlewareSpecForwardAuthPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecForwardAuth {
		if v == nil {
			return nil
		}
		return v.ForwardAuth
	}).(MiddlewareSpecForwardAuthPtrOutput)
}

// GrpcWeb holds the gRPC web middleware configuration.
// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
func (o MiddlewareSpecPtrOutput) GrpcWeb() MiddlewareSpecGrpcWebPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecGrpcWeb {
		if v == nil {
			return nil
		}
		return v.GrpcWeb
	}).(MiddlewareSpecGrpcWebPtrOutput)
}

// Headers holds the headers middleware configuration.
// This middleware manages the requests and responses headers.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
func (o MiddlewareSpecPtrOutput) Headers() MiddlewareSpecHeadersPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecHeaders {
		if v == nil {
			return nil
		}
		return v.Headers
	}).(MiddlewareSpecHeadersPtrOutput)
}

// InFlightReq holds the in-flight request middleware configuration.
// This middleware limits the number of requests being processed and served concurrently.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
func (o MiddlewareSpecPtrOutput) InFlightReq() MiddlewareSpecInFlightReqPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecInFlightReq {
		if v == nil {
			return nil
		}
		return v.InFlightReq
	}).(MiddlewareSpecInFlightReqPtrOutput)
}

// IPAllowList holds the IP allowlist middleware configuration.
// This middleware limits allowed requests based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
func (o MiddlewareSpecPtrOutput) IpAllowList() MiddlewareSpecIpAllowListPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecIpAllowList {
		if v == nil {
			return nil
		}
		return v.IpAllowList
	}).(MiddlewareSpecIpAllowListPtrOutput)
}

// Deprecated: please use IPAllowList instead.
func (o MiddlewareSpecPtrOutput) IpWhiteList() MiddlewareSpecIpWhiteListPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecIpWhiteList {
		if v == nil {
			return nil
		}
		return v.IpWhiteList
	}).(MiddlewareSpecIpWhiteListPtrOutput)
}

// PassTLSClientCert holds the pass TLS client cert middleware configuration.
// This middleware adds the selected data from the passed client TLS certificate to a header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
func (o MiddlewareSpecPtrOutput) PassTLSClientCert() MiddlewareSpecPassTLSClientCertPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecPassTLSClientCert {
		if v == nil {
			return nil
		}
		return v.PassTLSClientCert
	}).(MiddlewareSpecPassTLSClientCertPtrOutput)
}

// Plugin defines the middleware plugin configuration.
// More info: https://doc.traefik.io/traefik/plugins/
func (o MiddlewareSpecPtrOutput) Plugin() pulumi.MapMapOutput {
	return o.ApplyT(func(v *MiddlewareSpec) map[string]map[string]interface{} {
		if v == nil {
			return nil
		}
		return v.Plugin
	}).(pulumi.MapMapOutput)
}

// RateLimit holds the rate limit configuration.
// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
func (o MiddlewareSpecPtrOutput) RateLimit() MiddlewareSpecRateLimitPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecRateLimit {
		if v == nil {
			return nil
		}
		return v.RateLimit
	}).(MiddlewareSpecRateLimitPtrOutput)
}

// RedirectRegex holds the redirect regex middleware configuration.
// This middleware redirects a request using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
func (o MiddlewareSpecPtrOutput) RedirectRegex() MiddlewareSpecRedirectRegexPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecRedirectRegex {
		if v == nil {
			return nil
		}
		return v.RedirectRegex
	}).(MiddlewareSpecRedirectRegexPtrOutput)
}

// RedirectScheme holds the redirect scheme middleware configuration.
// This middleware redirects requests from a scheme/port to another.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
func (o MiddlewareSpecPtrOutput) RedirectScheme() MiddlewareSpecRedirectSchemePtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecRedirectScheme {
		if v == nil {
			return nil
		}
		return v.RedirectScheme
	}).(MiddlewareSpecRedirectSchemePtrOutput)
}

// ReplacePath holds the replace path middleware configuration.
// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
func (o MiddlewareSpecPtrOutput) ReplacePath() MiddlewareSpecReplacePathPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecReplacePath {
		if v == nil {
			return nil
		}
		return v.ReplacePath
	}).(MiddlewareSpecReplacePathPtrOutput)
}

// ReplacePathRegex holds the replace path regex middleware configuration.
// This middleware replaces the path of a URL using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
func (o MiddlewareSpecPtrOutput) ReplacePathRegex() MiddlewareSpecReplacePathRegexPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecReplacePathRegex {
		if v == nil {
			return nil
		}
		return v.ReplacePathRegex
	}).(MiddlewareSpecReplacePathRegexPtrOutput)
}

// Retry holds the retry middleware configuration.
// This middleware reissues requests a given number of times to a backend server if that server does not reply.
// As soon as the server answers, the middleware stops retrying, regardless of the response status.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
func (o MiddlewareSpecPtrOutput) Retry() MiddlewareSpecRetryPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecRetry {
		if v == nil {
			return nil
		}
		return v.Retry
	}).(MiddlewareSpecRetryPtrOutput)
}

// StripPrefix holds the strip prefix middleware configuration.
// This middleware removes the specified prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
func (o MiddlewareSpecPtrOutput) StripPrefix() MiddlewareSpecStripPrefixPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecStripPrefix {
		if v == nil {
			return nil
		}
		return v.StripPrefix
	}).(MiddlewareSpecStripPrefixPtrOutput)
}

// StripPrefixRegex holds the strip prefix regex middleware configuration.
// This middleware removes the matching prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
func (o MiddlewareSpecPtrOutput) StripPrefixRegex() MiddlewareSpecStripPrefixRegexPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpec) *MiddlewareSpecStripPrefixRegex {
		if v == nil {
			return nil
		}
		return v.StripPrefixRegex
	}).(MiddlewareSpecStripPrefixRegexPtrOutput)
}

// AddPrefix holds the add prefix middleware configuration.
// This middleware updates the path of a request before forwarding it.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
type MiddlewareSpecAddPrefix struct {
	// Prefix is the string to add before the current path in the requested URL.
	// It should include a leading slash (/).
	Prefix *string `pulumi:"prefix"`
}

// MiddlewareSpecAddPrefixInput is an input type that accepts MiddlewareSpecAddPrefixArgs and MiddlewareSpecAddPrefixOutput values.
// You can construct a concrete instance of `MiddlewareSpecAddPrefixInput` via:
//
//	MiddlewareSpecAddPrefixArgs{...}
type MiddlewareSpecAddPrefixInput interface {
	pulumi.Input

	ToMiddlewareSpecAddPrefixOutput() MiddlewareSpecAddPrefixOutput
	ToMiddlewareSpecAddPrefixOutputWithContext(context.Context) MiddlewareSpecAddPrefixOutput
}

// AddPrefix holds the add prefix middleware configuration.
// This middleware updates the path of a request before forwarding it.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
type MiddlewareSpecAddPrefixArgs struct {
	// Prefix is the string to add before the current path in the requested URL.
	// It should include a leading slash (/).
	Prefix pulumi.StringPtrInput `pulumi:"prefix"`
}

func (MiddlewareSpecAddPrefixArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecAddPrefix)(nil)).Elem()
}

func (i MiddlewareSpecAddPrefixArgs) ToMiddlewareSpecAddPrefixOutput() MiddlewareSpecAddPrefixOutput {
	return i.ToMiddlewareSpecAddPrefixOutputWithContext(context.Background())
}

func (i MiddlewareSpecAddPrefixArgs) ToMiddlewareSpecAddPrefixOutputWithContext(ctx context.Context) MiddlewareSpecAddPrefixOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecAddPrefixOutput)
}

func (i MiddlewareSpecAddPrefixArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecAddPrefix] {
	return pulumix.Output[MiddlewareSpecAddPrefix]{
		OutputState: i.ToMiddlewareSpecAddPrefixOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecAddPrefixArgs) ToMiddlewareSpecAddPrefixPtrOutput() MiddlewareSpecAddPrefixPtrOutput {
	return i.ToMiddlewareSpecAddPrefixPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecAddPrefixArgs) ToMiddlewareSpecAddPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecAddPrefixPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecAddPrefixOutput).ToMiddlewareSpecAddPrefixPtrOutputWithContext(ctx)
}

// MiddlewareSpecAddPrefixPtrInput is an input type that accepts MiddlewareSpecAddPrefixArgs, MiddlewareSpecAddPrefixPtr and MiddlewareSpecAddPrefixPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecAddPrefixPtrInput` via:
//
//	        MiddlewareSpecAddPrefixArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecAddPrefixPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecAddPrefixPtrOutput() MiddlewareSpecAddPrefixPtrOutput
	ToMiddlewareSpecAddPrefixPtrOutputWithContext(context.Context) MiddlewareSpecAddPrefixPtrOutput
}

type middlewareSpecAddPrefixPtrType MiddlewareSpecAddPrefixArgs

func MiddlewareSpecAddPrefixPtr(v *MiddlewareSpecAddPrefixArgs) MiddlewareSpecAddPrefixPtrInput {
	return (*middlewareSpecAddPrefixPtrType)(v)
}

func (*middlewareSpecAddPrefixPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecAddPrefix)(nil)).Elem()
}

func (i *middlewareSpecAddPrefixPtrType) ToMiddlewareSpecAddPrefixPtrOutput() MiddlewareSpecAddPrefixPtrOutput {
	return i.ToMiddlewareSpecAddPrefixPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecAddPrefixPtrType) ToMiddlewareSpecAddPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecAddPrefixPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecAddPrefixPtrOutput)
}

func (i *middlewareSpecAddPrefixPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecAddPrefix] {
	return pulumix.Output[*MiddlewareSpecAddPrefix]{
		OutputState: i.ToMiddlewareSpecAddPrefixPtrOutputWithContext(ctx).OutputState,
	}
}

// AddPrefix holds the add prefix middleware configuration.
// This middleware updates the path of a request before forwarding it.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/addprefix/
type MiddlewareSpecAddPrefixOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecAddPrefixOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecAddPrefix)(nil)).Elem()
}

func (o MiddlewareSpecAddPrefixOutput) ToMiddlewareSpecAddPrefixOutput() MiddlewareSpecAddPrefixOutput {
	return o
}

func (o MiddlewareSpecAddPrefixOutput) ToMiddlewareSpecAddPrefixOutputWithContext(ctx context.Context) MiddlewareSpecAddPrefixOutput {
	return o
}

func (o MiddlewareSpecAddPrefixOutput) ToMiddlewareSpecAddPrefixPtrOutput() MiddlewareSpecAddPrefixPtrOutput {
	return o.ToMiddlewareSpecAddPrefixPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecAddPrefixOutput) ToMiddlewareSpecAddPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecAddPrefixPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecAddPrefix) *MiddlewareSpecAddPrefix {
		return &v
	}).(MiddlewareSpecAddPrefixPtrOutput)
}

func (o MiddlewareSpecAddPrefixOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecAddPrefix] {
	return pulumix.Output[MiddlewareSpecAddPrefix]{
		OutputState: o.OutputState,
	}
}

// Prefix is the string to add before the current path in the requested URL.
// It should include a leading slash (/).
func (o MiddlewareSpecAddPrefixOutput) Prefix() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecAddPrefix) *string { return v.Prefix }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecAddPrefixPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecAddPrefixPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecAddPrefix)(nil)).Elem()
}

func (o MiddlewareSpecAddPrefixPtrOutput) ToMiddlewareSpecAddPrefixPtrOutput() MiddlewareSpecAddPrefixPtrOutput {
	return o
}

func (o MiddlewareSpecAddPrefixPtrOutput) ToMiddlewareSpecAddPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecAddPrefixPtrOutput {
	return o
}

func (o MiddlewareSpecAddPrefixPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecAddPrefix] {
	return pulumix.Output[*MiddlewareSpecAddPrefix]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecAddPrefixPtrOutput) Elem() MiddlewareSpecAddPrefixOutput {
	return o.ApplyT(func(v *MiddlewareSpecAddPrefix) MiddlewareSpecAddPrefix {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecAddPrefix
		return ret
	}).(MiddlewareSpecAddPrefixOutput)
}

// Prefix is the string to add before the current path in the requested URL.
// It should include a leading slash (/).
func (o MiddlewareSpecAddPrefixPtrOutput) Prefix() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecAddPrefix) *string {
		if v == nil {
			return nil
		}
		return v.Prefix
	}).(pulumi.StringPtrOutput)
}

// BasicAuth holds the basic auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
type MiddlewareSpecBasicAuth struct {
	// HeaderField defines a header field to store the authenticated user.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
	HeaderField *string `pulumi:"headerField"`
	// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
	// Default: traefik.
	Realm *string `pulumi:"realm"`
	// RemoveHeader sets the removeHeader option to true to remove the authorization header before forwarding the request to your service.
	// Default: false.
	RemoveHeader *bool `pulumi:"removeHeader"`
	// Secret is the name of the referenced Kubernetes Secret containing user credentials.
	Secret *string `pulumi:"secret"`
}

// MiddlewareSpecBasicAuthInput is an input type that accepts MiddlewareSpecBasicAuthArgs and MiddlewareSpecBasicAuthOutput values.
// You can construct a concrete instance of `MiddlewareSpecBasicAuthInput` via:
//
//	MiddlewareSpecBasicAuthArgs{...}
type MiddlewareSpecBasicAuthInput interface {
	pulumi.Input

	ToMiddlewareSpecBasicAuthOutput() MiddlewareSpecBasicAuthOutput
	ToMiddlewareSpecBasicAuthOutputWithContext(context.Context) MiddlewareSpecBasicAuthOutput
}

// BasicAuth holds the basic auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
type MiddlewareSpecBasicAuthArgs struct {
	// HeaderField defines a header field to store the authenticated user.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
	HeaderField pulumi.StringPtrInput `pulumi:"headerField"`
	// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
	// Default: traefik.
	Realm pulumi.StringPtrInput `pulumi:"realm"`
	// RemoveHeader sets the removeHeader option to true to remove the authorization header before forwarding the request to your service.
	// Default: false.
	RemoveHeader pulumi.BoolPtrInput `pulumi:"removeHeader"`
	// Secret is the name of the referenced Kubernetes Secret containing user credentials.
	Secret pulumi.StringPtrInput `pulumi:"secret"`
}

func (MiddlewareSpecBasicAuthArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecBasicAuth)(nil)).Elem()
}

func (i MiddlewareSpecBasicAuthArgs) ToMiddlewareSpecBasicAuthOutput() MiddlewareSpecBasicAuthOutput {
	return i.ToMiddlewareSpecBasicAuthOutputWithContext(context.Background())
}

func (i MiddlewareSpecBasicAuthArgs) ToMiddlewareSpecBasicAuthOutputWithContext(ctx context.Context) MiddlewareSpecBasicAuthOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecBasicAuthOutput)
}

func (i MiddlewareSpecBasicAuthArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecBasicAuth] {
	return pulumix.Output[MiddlewareSpecBasicAuth]{
		OutputState: i.ToMiddlewareSpecBasicAuthOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecBasicAuthArgs) ToMiddlewareSpecBasicAuthPtrOutput() MiddlewareSpecBasicAuthPtrOutput {
	return i.ToMiddlewareSpecBasicAuthPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecBasicAuthArgs) ToMiddlewareSpecBasicAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecBasicAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecBasicAuthOutput).ToMiddlewareSpecBasicAuthPtrOutputWithContext(ctx)
}

// MiddlewareSpecBasicAuthPtrInput is an input type that accepts MiddlewareSpecBasicAuthArgs, MiddlewareSpecBasicAuthPtr and MiddlewareSpecBasicAuthPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecBasicAuthPtrInput` via:
//
//	        MiddlewareSpecBasicAuthArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecBasicAuthPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecBasicAuthPtrOutput() MiddlewareSpecBasicAuthPtrOutput
	ToMiddlewareSpecBasicAuthPtrOutputWithContext(context.Context) MiddlewareSpecBasicAuthPtrOutput
}

type middlewareSpecBasicAuthPtrType MiddlewareSpecBasicAuthArgs

func MiddlewareSpecBasicAuthPtr(v *MiddlewareSpecBasicAuthArgs) MiddlewareSpecBasicAuthPtrInput {
	return (*middlewareSpecBasicAuthPtrType)(v)
}

func (*middlewareSpecBasicAuthPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecBasicAuth)(nil)).Elem()
}

func (i *middlewareSpecBasicAuthPtrType) ToMiddlewareSpecBasicAuthPtrOutput() MiddlewareSpecBasicAuthPtrOutput {
	return i.ToMiddlewareSpecBasicAuthPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecBasicAuthPtrType) ToMiddlewareSpecBasicAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecBasicAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecBasicAuthPtrOutput)
}

func (i *middlewareSpecBasicAuthPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecBasicAuth] {
	return pulumix.Output[*MiddlewareSpecBasicAuth]{
		OutputState: i.ToMiddlewareSpecBasicAuthPtrOutputWithContext(ctx).OutputState,
	}
}

// BasicAuth holds the basic auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/
type MiddlewareSpecBasicAuthOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecBasicAuthOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecBasicAuth)(nil)).Elem()
}

func (o MiddlewareSpecBasicAuthOutput) ToMiddlewareSpecBasicAuthOutput() MiddlewareSpecBasicAuthOutput {
	return o
}

func (o MiddlewareSpecBasicAuthOutput) ToMiddlewareSpecBasicAuthOutputWithContext(ctx context.Context) MiddlewareSpecBasicAuthOutput {
	return o
}

func (o MiddlewareSpecBasicAuthOutput) ToMiddlewareSpecBasicAuthPtrOutput() MiddlewareSpecBasicAuthPtrOutput {
	return o.ToMiddlewareSpecBasicAuthPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecBasicAuthOutput) ToMiddlewareSpecBasicAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecBasicAuthPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecBasicAuth) *MiddlewareSpecBasicAuth {
		return &v
	}).(MiddlewareSpecBasicAuthPtrOutput)
}

func (o MiddlewareSpecBasicAuthOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecBasicAuth] {
	return pulumix.Output[MiddlewareSpecBasicAuth]{
		OutputState: o.OutputState,
	}
}

// HeaderField defines a header field to store the authenticated user.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
func (o MiddlewareSpecBasicAuthOutput) HeaderField() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBasicAuth) *string { return v.HeaderField }).(pulumi.StringPtrOutput)
}

// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
// Default: traefik.
func (o MiddlewareSpecBasicAuthOutput) Realm() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBasicAuth) *string { return v.Realm }).(pulumi.StringPtrOutput)
}

// RemoveHeader sets the removeHeader option to true to remove the authorization header before forwarding the request to your service.
// Default: false.
func (o MiddlewareSpecBasicAuthOutput) RemoveHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBasicAuth) *bool { return v.RemoveHeader }).(pulumi.BoolPtrOutput)
}

// Secret is the name of the referenced Kubernetes Secret containing user credentials.
func (o MiddlewareSpecBasicAuthOutput) Secret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBasicAuth) *string { return v.Secret }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecBasicAuthPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecBasicAuthPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecBasicAuth)(nil)).Elem()
}

func (o MiddlewareSpecBasicAuthPtrOutput) ToMiddlewareSpecBasicAuthPtrOutput() MiddlewareSpecBasicAuthPtrOutput {
	return o
}

func (o MiddlewareSpecBasicAuthPtrOutput) ToMiddlewareSpecBasicAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecBasicAuthPtrOutput {
	return o
}

func (o MiddlewareSpecBasicAuthPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecBasicAuth] {
	return pulumix.Output[*MiddlewareSpecBasicAuth]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecBasicAuthPtrOutput) Elem() MiddlewareSpecBasicAuthOutput {
	return o.ApplyT(func(v *MiddlewareSpecBasicAuth) MiddlewareSpecBasicAuth {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecBasicAuth
		return ret
	}).(MiddlewareSpecBasicAuthOutput)
}

// HeaderField defines a header field to store the authenticated user.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
func (o MiddlewareSpecBasicAuthPtrOutput) HeaderField() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBasicAuth) *string {
		if v == nil {
			return nil
		}
		return v.HeaderField
	}).(pulumi.StringPtrOutput)
}

// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
// Default: traefik.
func (o MiddlewareSpecBasicAuthPtrOutput) Realm() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBasicAuth) *string {
		if v == nil {
			return nil
		}
		return v.Realm
	}).(pulumi.StringPtrOutput)
}

// RemoveHeader sets the removeHeader option to true to remove the authorization header before forwarding the request to your service.
// Default: false.
func (o MiddlewareSpecBasicAuthPtrOutput) RemoveHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBasicAuth) *bool {
		if v == nil {
			return nil
		}
		return v.RemoveHeader
	}).(pulumi.BoolPtrOutput)
}

// Secret is the name of the referenced Kubernetes Secret containing user credentials.
func (o MiddlewareSpecBasicAuthPtrOutput) Secret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBasicAuth) *string {
		if v == nil {
			return nil
		}
		return v.Secret
	}).(pulumi.StringPtrOutput)
}

// Buffering holds the buffering middleware configuration.
// This middleware retries or limits the size of requests that can be forwarded to backends.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
type MiddlewareSpecBuffering struct {
	// MaxRequestBodyBytes defines the maximum allowed body size for the request (in bytes).
	// If the request exceeds the allowed size, it is not forwarded to the service, and the client gets a 413 (Request Entity Too Large) response.
	// Default: 0 (no maximum).
	MaxRequestBodyBytes *int `pulumi:"maxRequestBodyBytes"`
	// MaxResponseBodyBytes defines the maximum allowed response size from the service (in bytes).
	// If the response exceeds the allowed size, it is not forwarded to the client. The client gets a 500 (Internal Server Error) response instead.
	// Default: 0 (no maximum).
	MaxResponseBodyBytes *int `pulumi:"maxResponseBodyBytes"`
	// MemRequestBodyBytes defines the threshold (in bytes) from which the request will be buffered on disk instead of in memory.
	// Default: 1048576 (1Mi).
	MemRequestBodyBytes *int `pulumi:"memRequestBodyBytes"`
	// MemResponseBodyBytes defines the threshold (in bytes) from which the response will be buffered on disk instead of in memory.
	// Default: 1048576 (1Mi).
	MemResponseBodyBytes *int `pulumi:"memResponseBodyBytes"`
	// RetryExpression defines the retry conditions.
	// It is a logical combination of functions with operators AND (&&) and OR (||).
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#retryexpression
	RetryExpression *string `pulumi:"retryExpression"`
}

// MiddlewareSpecBufferingInput is an input type that accepts MiddlewareSpecBufferingArgs and MiddlewareSpecBufferingOutput values.
// You can construct a concrete instance of `MiddlewareSpecBufferingInput` via:
//
//	MiddlewareSpecBufferingArgs{...}
type MiddlewareSpecBufferingInput interface {
	pulumi.Input

	ToMiddlewareSpecBufferingOutput() MiddlewareSpecBufferingOutput
	ToMiddlewareSpecBufferingOutputWithContext(context.Context) MiddlewareSpecBufferingOutput
}

// Buffering holds the buffering middleware configuration.
// This middleware retries or limits the size of requests that can be forwarded to backends.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
type MiddlewareSpecBufferingArgs struct {
	// MaxRequestBodyBytes defines the maximum allowed body size for the request (in bytes).
	// If the request exceeds the allowed size, it is not forwarded to the service, and the client gets a 413 (Request Entity Too Large) response.
	// Default: 0 (no maximum).
	MaxRequestBodyBytes pulumi.IntPtrInput `pulumi:"maxRequestBodyBytes"`
	// MaxResponseBodyBytes defines the maximum allowed response size from the service (in bytes).
	// If the response exceeds the allowed size, it is not forwarded to the client. The client gets a 500 (Internal Server Error) response instead.
	// Default: 0 (no maximum).
	MaxResponseBodyBytes pulumi.IntPtrInput `pulumi:"maxResponseBodyBytes"`
	// MemRequestBodyBytes defines the threshold (in bytes) from which the request will be buffered on disk instead of in memory.
	// Default: 1048576 (1Mi).
	MemRequestBodyBytes pulumi.IntPtrInput `pulumi:"memRequestBodyBytes"`
	// MemResponseBodyBytes defines the threshold (in bytes) from which the response will be buffered on disk instead of in memory.
	// Default: 1048576 (1Mi).
	MemResponseBodyBytes pulumi.IntPtrInput `pulumi:"memResponseBodyBytes"`
	// RetryExpression defines the retry conditions.
	// It is a logical combination of functions with operators AND (&&) and OR (||).
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#retryexpression
	RetryExpression pulumi.StringPtrInput `pulumi:"retryExpression"`
}

func (MiddlewareSpecBufferingArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecBuffering)(nil)).Elem()
}

func (i MiddlewareSpecBufferingArgs) ToMiddlewareSpecBufferingOutput() MiddlewareSpecBufferingOutput {
	return i.ToMiddlewareSpecBufferingOutputWithContext(context.Background())
}

func (i MiddlewareSpecBufferingArgs) ToMiddlewareSpecBufferingOutputWithContext(ctx context.Context) MiddlewareSpecBufferingOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecBufferingOutput)
}

func (i MiddlewareSpecBufferingArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecBuffering] {
	return pulumix.Output[MiddlewareSpecBuffering]{
		OutputState: i.ToMiddlewareSpecBufferingOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecBufferingArgs) ToMiddlewareSpecBufferingPtrOutput() MiddlewareSpecBufferingPtrOutput {
	return i.ToMiddlewareSpecBufferingPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecBufferingArgs) ToMiddlewareSpecBufferingPtrOutputWithContext(ctx context.Context) MiddlewareSpecBufferingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecBufferingOutput).ToMiddlewareSpecBufferingPtrOutputWithContext(ctx)
}

// MiddlewareSpecBufferingPtrInput is an input type that accepts MiddlewareSpecBufferingArgs, MiddlewareSpecBufferingPtr and MiddlewareSpecBufferingPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecBufferingPtrInput` via:
//
//	        MiddlewareSpecBufferingArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecBufferingPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecBufferingPtrOutput() MiddlewareSpecBufferingPtrOutput
	ToMiddlewareSpecBufferingPtrOutputWithContext(context.Context) MiddlewareSpecBufferingPtrOutput
}

type middlewareSpecBufferingPtrType MiddlewareSpecBufferingArgs

func MiddlewareSpecBufferingPtr(v *MiddlewareSpecBufferingArgs) MiddlewareSpecBufferingPtrInput {
	return (*middlewareSpecBufferingPtrType)(v)
}

func (*middlewareSpecBufferingPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecBuffering)(nil)).Elem()
}

func (i *middlewareSpecBufferingPtrType) ToMiddlewareSpecBufferingPtrOutput() MiddlewareSpecBufferingPtrOutput {
	return i.ToMiddlewareSpecBufferingPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecBufferingPtrType) ToMiddlewareSpecBufferingPtrOutputWithContext(ctx context.Context) MiddlewareSpecBufferingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecBufferingPtrOutput)
}

func (i *middlewareSpecBufferingPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecBuffering] {
	return pulumix.Output[*MiddlewareSpecBuffering]{
		OutputState: i.ToMiddlewareSpecBufferingPtrOutputWithContext(ctx).OutputState,
	}
}

// Buffering holds the buffering middleware configuration.
// This middleware retries or limits the size of requests that can be forwarded to backends.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#maxrequestbodybytes
type MiddlewareSpecBufferingOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecBufferingOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecBuffering)(nil)).Elem()
}

func (o MiddlewareSpecBufferingOutput) ToMiddlewareSpecBufferingOutput() MiddlewareSpecBufferingOutput {
	return o
}

func (o MiddlewareSpecBufferingOutput) ToMiddlewareSpecBufferingOutputWithContext(ctx context.Context) MiddlewareSpecBufferingOutput {
	return o
}

func (o MiddlewareSpecBufferingOutput) ToMiddlewareSpecBufferingPtrOutput() MiddlewareSpecBufferingPtrOutput {
	return o.ToMiddlewareSpecBufferingPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecBufferingOutput) ToMiddlewareSpecBufferingPtrOutputWithContext(ctx context.Context) MiddlewareSpecBufferingPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecBuffering) *MiddlewareSpecBuffering {
		return &v
	}).(MiddlewareSpecBufferingPtrOutput)
}

func (o MiddlewareSpecBufferingOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecBuffering] {
	return pulumix.Output[MiddlewareSpecBuffering]{
		OutputState: o.OutputState,
	}
}

// MaxRequestBodyBytes defines the maximum allowed body size for the request (in bytes).
// If the request exceeds the allowed size, it is not forwarded to the service, and the client gets a 413 (Request Entity Too Large) response.
// Default: 0 (no maximum).
func (o MiddlewareSpecBufferingOutput) MaxRequestBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBuffering) *int { return v.MaxRequestBodyBytes }).(pulumi.IntPtrOutput)
}

// MaxResponseBodyBytes defines the maximum allowed response size from the service (in bytes).
// If the response exceeds the allowed size, it is not forwarded to the client. The client gets a 500 (Internal Server Error) response instead.
// Default: 0 (no maximum).
func (o MiddlewareSpecBufferingOutput) MaxResponseBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBuffering) *int { return v.MaxResponseBodyBytes }).(pulumi.IntPtrOutput)
}

// MemRequestBodyBytes defines the threshold (in bytes) from which the request will be buffered on disk instead of in memory.
// Default: 1048576 (1Mi).
func (o MiddlewareSpecBufferingOutput) MemRequestBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBuffering) *int { return v.MemRequestBodyBytes }).(pulumi.IntPtrOutput)
}

// MemResponseBodyBytes defines the threshold (in bytes) from which the response will be buffered on disk instead of in memory.
// Default: 1048576 (1Mi).
func (o MiddlewareSpecBufferingOutput) MemResponseBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBuffering) *int { return v.MemResponseBodyBytes }).(pulumi.IntPtrOutput)
}

// RetryExpression defines the retry conditions.
// It is a logical combination of functions with operators AND (&&) and OR (||).
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#retryexpression
func (o MiddlewareSpecBufferingOutput) RetryExpression() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecBuffering) *string { return v.RetryExpression }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecBufferingPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecBufferingPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecBuffering)(nil)).Elem()
}

func (o MiddlewareSpecBufferingPtrOutput) ToMiddlewareSpecBufferingPtrOutput() MiddlewareSpecBufferingPtrOutput {
	return o
}

func (o MiddlewareSpecBufferingPtrOutput) ToMiddlewareSpecBufferingPtrOutputWithContext(ctx context.Context) MiddlewareSpecBufferingPtrOutput {
	return o
}

func (o MiddlewareSpecBufferingPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecBuffering] {
	return pulumix.Output[*MiddlewareSpecBuffering]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecBufferingPtrOutput) Elem() MiddlewareSpecBufferingOutput {
	return o.ApplyT(func(v *MiddlewareSpecBuffering) MiddlewareSpecBuffering {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecBuffering
		return ret
	}).(MiddlewareSpecBufferingOutput)
}

// MaxRequestBodyBytes defines the maximum allowed body size for the request (in bytes).
// If the request exceeds the allowed size, it is not forwarded to the service, and the client gets a 413 (Request Entity Too Large) response.
// Default: 0 (no maximum).
func (o MiddlewareSpecBufferingPtrOutput) MaxRequestBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBuffering) *int {
		if v == nil {
			return nil
		}
		return v.MaxRequestBodyBytes
	}).(pulumi.IntPtrOutput)
}

// MaxResponseBodyBytes defines the maximum allowed response size from the service (in bytes).
// If the response exceeds the allowed size, it is not forwarded to the client. The client gets a 500 (Internal Server Error) response instead.
// Default: 0 (no maximum).
func (o MiddlewareSpecBufferingPtrOutput) MaxResponseBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBuffering) *int {
		if v == nil {
			return nil
		}
		return v.MaxResponseBodyBytes
	}).(pulumi.IntPtrOutput)
}

// MemRequestBodyBytes defines the threshold (in bytes) from which the request will be buffered on disk instead of in memory.
// Default: 1048576 (1Mi).
func (o MiddlewareSpecBufferingPtrOutput) MemRequestBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBuffering) *int {
		if v == nil {
			return nil
		}
		return v.MemRequestBodyBytes
	}).(pulumi.IntPtrOutput)
}

// MemResponseBodyBytes defines the threshold (in bytes) from which the response will be buffered on disk instead of in memory.
// Default: 1048576 (1Mi).
func (o MiddlewareSpecBufferingPtrOutput) MemResponseBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBuffering) *int {
		if v == nil {
			return nil
		}
		return v.MemResponseBodyBytes
	}).(pulumi.IntPtrOutput)
}

// RetryExpression defines the retry conditions.
// It is a logical combination of functions with operators AND (&&) and OR (||).
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/buffering/#retryexpression
func (o MiddlewareSpecBufferingPtrOutput) RetryExpression() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecBuffering) *string {
		if v == nil {
			return nil
		}
		return v.RetryExpression
	}).(pulumi.StringPtrOutput)
}

// Chain holds the configuration of the chain middleware.
// This middleware enables to define reusable combinations of other pieces of middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
type MiddlewareSpecChain struct {
	// Middlewares is the list of MiddlewareRef which composes the chain.
	Middlewares []MiddlewareSpecChainMiddlewares `pulumi:"middlewares"`
}

// MiddlewareSpecChainInput is an input type that accepts MiddlewareSpecChainArgs and MiddlewareSpecChainOutput values.
// You can construct a concrete instance of `MiddlewareSpecChainInput` via:
//
//	MiddlewareSpecChainArgs{...}
type MiddlewareSpecChainInput interface {
	pulumi.Input

	ToMiddlewareSpecChainOutput() MiddlewareSpecChainOutput
	ToMiddlewareSpecChainOutputWithContext(context.Context) MiddlewareSpecChainOutput
}

// Chain holds the configuration of the chain middleware.
// This middleware enables to define reusable combinations of other pieces of middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
type MiddlewareSpecChainArgs struct {
	// Middlewares is the list of MiddlewareRef which composes the chain.
	Middlewares MiddlewareSpecChainMiddlewaresArrayInput `pulumi:"middlewares"`
}

func (MiddlewareSpecChainArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecChain)(nil)).Elem()
}

func (i MiddlewareSpecChainArgs) ToMiddlewareSpecChainOutput() MiddlewareSpecChainOutput {
	return i.ToMiddlewareSpecChainOutputWithContext(context.Background())
}

func (i MiddlewareSpecChainArgs) ToMiddlewareSpecChainOutputWithContext(ctx context.Context) MiddlewareSpecChainOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecChainOutput)
}

func (i MiddlewareSpecChainArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecChain] {
	return pulumix.Output[MiddlewareSpecChain]{
		OutputState: i.ToMiddlewareSpecChainOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecChainArgs) ToMiddlewareSpecChainPtrOutput() MiddlewareSpecChainPtrOutput {
	return i.ToMiddlewareSpecChainPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecChainArgs) ToMiddlewareSpecChainPtrOutputWithContext(ctx context.Context) MiddlewareSpecChainPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecChainOutput).ToMiddlewareSpecChainPtrOutputWithContext(ctx)
}

// MiddlewareSpecChainPtrInput is an input type that accepts MiddlewareSpecChainArgs, MiddlewareSpecChainPtr and MiddlewareSpecChainPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecChainPtrInput` via:
//
//	        MiddlewareSpecChainArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecChainPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecChainPtrOutput() MiddlewareSpecChainPtrOutput
	ToMiddlewareSpecChainPtrOutputWithContext(context.Context) MiddlewareSpecChainPtrOutput
}

type middlewareSpecChainPtrType MiddlewareSpecChainArgs

func MiddlewareSpecChainPtr(v *MiddlewareSpecChainArgs) MiddlewareSpecChainPtrInput {
	return (*middlewareSpecChainPtrType)(v)
}

func (*middlewareSpecChainPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecChain)(nil)).Elem()
}

func (i *middlewareSpecChainPtrType) ToMiddlewareSpecChainPtrOutput() MiddlewareSpecChainPtrOutput {
	return i.ToMiddlewareSpecChainPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecChainPtrType) ToMiddlewareSpecChainPtrOutputWithContext(ctx context.Context) MiddlewareSpecChainPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecChainPtrOutput)
}

func (i *middlewareSpecChainPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecChain] {
	return pulumix.Output[*MiddlewareSpecChain]{
		OutputState: i.ToMiddlewareSpecChainPtrOutputWithContext(ctx).OutputState,
	}
}

// Chain holds the configuration of the chain middleware.
// This middleware enables to define reusable combinations of other pieces of middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/chain/
type MiddlewareSpecChainOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecChainOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecChain)(nil)).Elem()
}

func (o MiddlewareSpecChainOutput) ToMiddlewareSpecChainOutput() MiddlewareSpecChainOutput {
	return o
}

func (o MiddlewareSpecChainOutput) ToMiddlewareSpecChainOutputWithContext(ctx context.Context) MiddlewareSpecChainOutput {
	return o
}

func (o MiddlewareSpecChainOutput) ToMiddlewareSpecChainPtrOutput() MiddlewareSpecChainPtrOutput {
	return o.ToMiddlewareSpecChainPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecChainOutput) ToMiddlewareSpecChainPtrOutputWithContext(ctx context.Context) MiddlewareSpecChainPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecChain) *MiddlewareSpecChain {
		return &v
	}).(MiddlewareSpecChainPtrOutput)
}

func (o MiddlewareSpecChainOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecChain] {
	return pulumix.Output[MiddlewareSpecChain]{
		OutputState: o.OutputState,
	}
}

// Middlewares is the list of MiddlewareRef which composes the chain.
func (o MiddlewareSpecChainOutput) Middlewares() MiddlewareSpecChainMiddlewaresArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecChain) []MiddlewareSpecChainMiddlewares { return v.Middlewares }).(MiddlewareSpecChainMiddlewaresArrayOutput)
}

type MiddlewareSpecChainPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecChainPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecChain)(nil)).Elem()
}

func (o MiddlewareSpecChainPtrOutput) ToMiddlewareSpecChainPtrOutput() MiddlewareSpecChainPtrOutput {
	return o
}

func (o MiddlewareSpecChainPtrOutput) ToMiddlewareSpecChainPtrOutputWithContext(ctx context.Context) MiddlewareSpecChainPtrOutput {
	return o
}

func (o MiddlewareSpecChainPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecChain] {
	return pulumix.Output[*MiddlewareSpecChain]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecChainPtrOutput) Elem() MiddlewareSpecChainOutput {
	return o.ApplyT(func(v *MiddlewareSpecChain) MiddlewareSpecChain {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecChain
		return ret
	}).(MiddlewareSpecChainOutput)
}

// Middlewares is the list of MiddlewareRef which composes the chain.
func (o MiddlewareSpecChainPtrOutput) Middlewares() MiddlewareSpecChainMiddlewaresArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecChain) []MiddlewareSpecChainMiddlewares {
		if v == nil {
			return nil
		}
		return v.Middlewares
	}).(MiddlewareSpecChainMiddlewaresArrayOutput)
}

// MiddlewareRef is a reference to a Middleware resource.
type MiddlewareSpecChainMiddlewares struct {
	// Name defines the name of the referenced Middleware resource.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Middleware resource.
	Namespace *string `pulumi:"namespace"`
}

// MiddlewareSpecChainMiddlewaresInput is an input type that accepts MiddlewareSpecChainMiddlewaresArgs and MiddlewareSpecChainMiddlewaresOutput values.
// You can construct a concrete instance of `MiddlewareSpecChainMiddlewaresInput` via:
//
//	MiddlewareSpecChainMiddlewaresArgs{...}
type MiddlewareSpecChainMiddlewaresInput interface {
	pulumi.Input

	ToMiddlewareSpecChainMiddlewaresOutput() MiddlewareSpecChainMiddlewaresOutput
	ToMiddlewareSpecChainMiddlewaresOutputWithContext(context.Context) MiddlewareSpecChainMiddlewaresOutput
}

// MiddlewareRef is a reference to a Middleware resource.
type MiddlewareSpecChainMiddlewaresArgs struct {
	// Name defines the name of the referenced Middleware resource.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Middleware resource.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
}

func (MiddlewareSpecChainMiddlewaresArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecChainMiddlewares)(nil)).Elem()
}

func (i MiddlewareSpecChainMiddlewaresArgs) ToMiddlewareSpecChainMiddlewaresOutput() MiddlewareSpecChainMiddlewaresOutput {
	return i.ToMiddlewareSpecChainMiddlewaresOutputWithContext(context.Background())
}

func (i MiddlewareSpecChainMiddlewaresArgs) ToMiddlewareSpecChainMiddlewaresOutputWithContext(ctx context.Context) MiddlewareSpecChainMiddlewaresOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecChainMiddlewaresOutput)
}

func (i MiddlewareSpecChainMiddlewaresArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecChainMiddlewares] {
	return pulumix.Output[MiddlewareSpecChainMiddlewares]{
		OutputState: i.ToMiddlewareSpecChainMiddlewaresOutputWithContext(ctx).OutputState,
	}
}

// MiddlewareSpecChainMiddlewaresArrayInput is an input type that accepts MiddlewareSpecChainMiddlewaresArray and MiddlewareSpecChainMiddlewaresArrayOutput values.
// You can construct a concrete instance of `MiddlewareSpecChainMiddlewaresArrayInput` via:
//
//	MiddlewareSpecChainMiddlewaresArray{ MiddlewareSpecChainMiddlewaresArgs{...} }
type MiddlewareSpecChainMiddlewaresArrayInput interface {
	pulumi.Input

	ToMiddlewareSpecChainMiddlewaresArrayOutput() MiddlewareSpecChainMiddlewaresArrayOutput
	ToMiddlewareSpecChainMiddlewaresArrayOutputWithContext(context.Context) MiddlewareSpecChainMiddlewaresArrayOutput
}

type MiddlewareSpecChainMiddlewaresArray []MiddlewareSpecChainMiddlewaresInput

func (MiddlewareSpecChainMiddlewaresArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]MiddlewareSpecChainMiddlewares)(nil)).Elem()
}

func (i MiddlewareSpecChainMiddlewaresArray) ToMiddlewareSpecChainMiddlewaresArrayOutput() MiddlewareSpecChainMiddlewaresArrayOutput {
	return i.ToMiddlewareSpecChainMiddlewaresArrayOutputWithContext(context.Background())
}

func (i MiddlewareSpecChainMiddlewaresArray) ToMiddlewareSpecChainMiddlewaresArrayOutputWithContext(ctx context.Context) MiddlewareSpecChainMiddlewaresArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecChainMiddlewaresArrayOutput)
}

func (i MiddlewareSpecChainMiddlewaresArray) ToOutput(ctx context.Context) pulumix.Output[[]MiddlewareSpecChainMiddlewares] {
	return pulumix.Output[[]MiddlewareSpecChainMiddlewares]{
		OutputState: i.ToMiddlewareSpecChainMiddlewaresArrayOutputWithContext(ctx).OutputState,
	}
}

// MiddlewareRef is a reference to a Middleware resource.
type MiddlewareSpecChainMiddlewaresOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecChainMiddlewaresOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecChainMiddlewares)(nil)).Elem()
}

func (o MiddlewareSpecChainMiddlewaresOutput) ToMiddlewareSpecChainMiddlewaresOutput() MiddlewareSpecChainMiddlewaresOutput {
	return o
}

func (o MiddlewareSpecChainMiddlewaresOutput) ToMiddlewareSpecChainMiddlewaresOutputWithContext(ctx context.Context) MiddlewareSpecChainMiddlewaresOutput {
	return o
}

func (o MiddlewareSpecChainMiddlewaresOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecChainMiddlewares] {
	return pulumix.Output[MiddlewareSpecChainMiddlewares]{
		OutputState: o.OutputState,
	}
}

// Name defines the name of the referenced Middleware resource.
func (o MiddlewareSpecChainMiddlewaresOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v MiddlewareSpecChainMiddlewares) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Middleware resource.
func (o MiddlewareSpecChainMiddlewaresOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecChainMiddlewares) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecChainMiddlewaresArrayOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecChainMiddlewaresArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]MiddlewareSpecChainMiddlewares)(nil)).Elem()
}

func (o MiddlewareSpecChainMiddlewaresArrayOutput) ToMiddlewareSpecChainMiddlewaresArrayOutput() MiddlewareSpecChainMiddlewaresArrayOutput {
	return o
}

func (o MiddlewareSpecChainMiddlewaresArrayOutput) ToMiddlewareSpecChainMiddlewaresArrayOutputWithContext(ctx context.Context) MiddlewareSpecChainMiddlewaresArrayOutput {
	return o
}

func (o MiddlewareSpecChainMiddlewaresArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]MiddlewareSpecChainMiddlewares] {
	return pulumix.Output[[]MiddlewareSpecChainMiddlewares]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecChainMiddlewaresArrayOutput) Index(i pulumi.IntInput) MiddlewareSpecChainMiddlewaresOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) MiddlewareSpecChainMiddlewares {
		return vs[0].([]MiddlewareSpecChainMiddlewares)[vs[1].(int)]
	}).(MiddlewareSpecChainMiddlewaresOutput)
}

// CircuitBreaker holds the circuit breaker configuration.
type MiddlewareSpecCircuitBreaker struct {
	// CheckPeriod is the interval between successive checks of the circuit breaker condition (when in standby state).
	CheckPeriod interface{} `pulumi:"checkPeriod"`
	// Expression is the condition that triggers the tripped state.
	Expression *string `pulumi:"expression"`
	// FallbackDuration is the duration for which the circuit breaker will wait before trying to recover (from a tripped state).
	FallbackDuration interface{} `pulumi:"fallbackDuration"`
	// RecoveryDuration is the duration for which the circuit breaker will try to recover (as soon as it is in recovering state).
	RecoveryDuration interface{} `pulumi:"recoveryDuration"`
	// ResponseCode is the status code that the circuit breaker will return while it is in the open state.
	ResponseCode *int `pulumi:"responseCode"`
}

// MiddlewareSpecCircuitBreakerInput is an input type that accepts MiddlewareSpecCircuitBreakerArgs and MiddlewareSpecCircuitBreakerOutput values.
// You can construct a concrete instance of `MiddlewareSpecCircuitBreakerInput` via:
//
//	MiddlewareSpecCircuitBreakerArgs{...}
type MiddlewareSpecCircuitBreakerInput interface {
	pulumi.Input

	ToMiddlewareSpecCircuitBreakerOutput() MiddlewareSpecCircuitBreakerOutput
	ToMiddlewareSpecCircuitBreakerOutputWithContext(context.Context) MiddlewareSpecCircuitBreakerOutput
}

// CircuitBreaker holds the circuit breaker configuration.
type MiddlewareSpecCircuitBreakerArgs struct {
	// CheckPeriod is the interval between successive checks of the circuit breaker condition (when in standby state).
	CheckPeriod pulumi.Input `pulumi:"checkPeriod"`
	// Expression is the condition that triggers the tripped state.
	Expression pulumi.StringPtrInput `pulumi:"expression"`
	// FallbackDuration is the duration for which the circuit breaker will wait before trying to recover (from a tripped state).
	FallbackDuration pulumi.Input `pulumi:"fallbackDuration"`
	// RecoveryDuration is the duration for which the circuit breaker will try to recover (as soon as it is in recovering state).
	RecoveryDuration pulumi.Input `pulumi:"recoveryDuration"`
	// ResponseCode is the status code that the circuit breaker will return while it is in the open state.
	ResponseCode pulumi.IntPtrInput `pulumi:"responseCode"`
}

func (MiddlewareSpecCircuitBreakerArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecCircuitBreaker)(nil)).Elem()
}

func (i MiddlewareSpecCircuitBreakerArgs) ToMiddlewareSpecCircuitBreakerOutput() MiddlewareSpecCircuitBreakerOutput {
	return i.ToMiddlewareSpecCircuitBreakerOutputWithContext(context.Background())
}

func (i MiddlewareSpecCircuitBreakerArgs) ToMiddlewareSpecCircuitBreakerOutputWithContext(ctx context.Context) MiddlewareSpecCircuitBreakerOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecCircuitBreakerOutput)
}

func (i MiddlewareSpecCircuitBreakerArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecCircuitBreaker] {
	return pulumix.Output[MiddlewareSpecCircuitBreaker]{
		OutputState: i.ToMiddlewareSpecCircuitBreakerOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecCircuitBreakerArgs) ToMiddlewareSpecCircuitBreakerPtrOutput() MiddlewareSpecCircuitBreakerPtrOutput {
	return i.ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecCircuitBreakerArgs) ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(ctx context.Context) MiddlewareSpecCircuitBreakerPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecCircuitBreakerOutput).ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(ctx)
}

// MiddlewareSpecCircuitBreakerPtrInput is an input type that accepts MiddlewareSpecCircuitBreakerArgs, MiddlewareSpecCircuitBreakerPtr and MiddlewareSpecCircuitBreakerPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecCircuitBreakerPtrInput` via:
//
//	        MiddlewareSpecCircuitBreakerArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecCircuitBreakerPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecCircuitBreakerPtrOutput() MiddlewareSpecCircuitBreakerPtrOutput
	ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(context.Context) MiddlewareSpecCircuitBreakerPtrOutput
}

type middlewareSpecCircuitBreakerPtrType MiddlewareSpecCircuitBreakerArgs

func MiddlewareSpecCircuitBreakerPtr(v *MiddlewareSpecCircuitBreakerArgs) MiddlewareSpecCircuitBreakerPtrInput {
	return (*middlewareSpecCircuitBreakerPtrType)(v)
}

func (*middlewareSpecCircuitBreakerPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecCircuitBreaker)(nil)).Elem()
}

func (i *middlewareSpecCircuitBreakerPtrType) ToMiddlewareSpecCircuitBreakerPtrOutput() MiddlewareSpecCircuitBreakerPtrOutput {
	return i.ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecCircuitBreakerPtrType) ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(ctx context.Context) MiddlewareSpecCircuitBreakerPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecCircuitBreakerPtrOutput)
}

func (i *middlewareSpecCircuitBreakerPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecCircuitBreaker] {
	return pulumix.Output[*MiddlewareSpecCircuitBreaker]{
		OutputState: i.ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(ctx).OutputState,
	}
}

// CircuitBreaker holds the circuit breaker configuration.
type MiddlewareSpecCircuitBreakerOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecCircuitBreakerOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecCircuitBreaker)(nil)).Elem()
}

func (o MiddlewareSpecCircuitBreakerOutput) ToMiddlewareSpecCircuitBreakerOutput() MiddlewareSpecCircuitBreakerOutput {
	return o
}

func (o MiddlewareSpecCircuitBreakerOutput) ToMiddlewareSpecCircuitBreakerOutputWithContext(ctx context.Context) MiddlewareSpecCircuitBreakerOutput {
	return o
}

func (o MiddlewareSpecCircuitBreakerOutput) ToMiddlewareSpecCircuitBreakerPtrOutput() MiddlewareSpecCircuitBreakerPtrOutput {
	return o.ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecCircuitBreakerOutput) ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(ctx context.Context) MiddlewareSpecCircuitBreakerPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecCircuitBreaker) *MiddlewareSpecCircuitBreaker {
		return &v
	}).(MiddlewareSpecCircuitBreakerPtrOutput)
}

func (o MiddlewareSpecCircuitBreakerOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecCircuitBreaker] {
	return pulumix.Output[MiddlewareSpecCircuitBreaker]{
		OutputState: o.OutputState,
	}
}

// CheckPeriod is the interval between successive checks of the circuit breaker condition (when in standby state).
func (o MiddlewareSpecCircuitBreakerOutput) CheckPeriod() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecCircuitBreaker) interface{} { return v.CheckPeriod }).(pulumi.AnyOutput)
}

// Expression is the condition that triggers the tripped state.
func (o MiddlewareSpecCircuitBreakerOutput) Expression() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecCircuitBreaker) *string { return v.Expression }).(pulumi.StringPtrOutput)
}

// FallbackDuration is the duration for which the circuit breaker will wait before trying to recover (from a tripped state).
func (o MiddlewareSpecCircuitBreakerOutput) FallbackDuration() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecCircuitBreaker) interface{} { return v.FallbackDuration }).(pulumi.AnyOutput)
}

// RecoveryDuration is the duration for which the circuit breaker will try to recover (as soon as it is in recovering state).
func (o MiddlewareSpecCircuitBreakerOutput) RecoveryDuration() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecCircuitBreaker) interface{} { return v.RecoveryDuration }).(pulumi.AnyOutput)
}

// ResponseCode is the status code that the circuit breaker will return while it is in the open state.
func (o MiddlewareSpecCircuitBreakerOutput) ResponseCode() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecCircuitBreaker) *int { return v.ResponseCode }).(pulumi.IntPtrOutput)
}

type MiddlewareSpecCircuitBreakerPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecCircuitBreakerPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecCircuitBreaker)(nil)).Elem()
}

func (o MiddlewareSpecCircuitBreakerPtrOutput) ToMiddlewareSpecCircuitBreakerPtrOutput() MiddlewareSpecCircuitBreakerPtrOutput {
	return o
}

func (o MiddlewareSpecCircuitBreakerPtrOutput) ToMiddlewareSpecCircuitBreakerPtrOutputWithContext(ctx context.Context) MiddlewareSpecCircuitBreakerPtrOutput {
	return o
}

func (o MiddlewareSpecCircuitBreakerPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecCircuitBreaker] {
	return pulumix.Output[*MiddlewareSpecCircuitBreaker]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecCircuitBreakerPtrOutput) Elem() MiddlewareSpecCircuitBreakerOutput {
	return o.ApplyT(func(v *MiddlewareSpecCircuitBreaker) MiddlewareSpecCircuitBreaker {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecCircuitBreaker
		return ret
	}).(MiddlewareSpecCircuitBreakerOutput)
}

// CheckPeriod is the interval between successive checks of the circuit breaker condition (when in standby state).
func (o MiddlewareSpecCircuitBreakerPtrOutput) CheckPeriod() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecCircuitBreaker) interface{} {
		if v == nil {
			return nil
		}
		return v.CheckPeriod
	}).(pulumi.AnyOutput)
}

// Expression is the condition that triggers the tripped state.
func (o MiddlewareSpecCircuitBreakerPtrOutput) Expression() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecCircuitBreaker) *string {
		if v == nil {
			return nil
		}
		return v.Expression
	}).(pulumi.StringPtrOutput)
}

// FallbackDuration is the duration for which the circuit breaker will wait before trying to recover (from a tripped state).
func (o MiddlewareSpecCircuitBreakerPtrOutput) FallbackDuration() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecCircuitBreaker) interface{} {
		if v == nil {
			return nil
		}
		return v.FallbackDuration
	}).(pulumi.AnyOutput)
}

// RecoveryDuration is the duration for which the circuit breaker will try to recover (as soon as it is in recovering state).
func (o MiddlewareSpecCircuitBreakerPtrOutput) RecoveryDuration() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecCircuitBreaker) interface{} {
		if v == nil {
			return nil
		}
		return v.RecoveryDuration
	}).(pulumi.AnyOutput)
}

// ResponseCode is the status code that the circuit breaker will return while it is in the open state.
func (o MiddlewareSpecCircuitBreakerPtrOutput) ResponseCode() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecCircuitBreaker) *int {
		if v == nil {
			return nil
		}
		return v.ResponseCode
	}).(pulumi.IntPtrOutput)
}

// Compress holds the compress middleware configuration.
// This middleware compresses responses before sending them to the client, using gzip compression.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
type MiddlewareSpecCompress struct {
	// DefaultEncoding specifies the default encoding if the `Accept-Encoding` header is not in the request or contains a wildcard (`*`).
	DefaultEncoding *string `pulumi:"defaultEncoding"`
	// ExcludedContentTypes defines the list of content types to compare the Content-Type header of the incoming requests and responses before compressing.
	// `application/grpc` is always excluded.
	ExcludedContentTypes []string `pulumi:"excludedContentTypes"`
	// IncludedContentTypes defines the list of content types to compare the Content-Type header of the responses before compressing.
	IncludedContentTypes []string `pulumi:"includedContentTypes"`
	// MinResponseBodyBytes defines the minimum amount of bytes a response body must have to be compressed.
	// Default: 1024.
	MinResponseBodyBytes *int `pulumi:"minResponseBodyBytes"`
}

// MiddlewareSpecCompressInput is an input type that accepts MiddlewareSpecCompressArgs and MiddlewareSpecCompressOutput values.
// You can construct a concrete instance of `MiddlewareSpecCompressInput` via:
//
//	MiddlewareSpecCompressArgs{...}
type MiddlewareSpecCompressInput interface {
	pulumi.Input

	ToMiddlewareSpecCompressOutput() MiddlewareSpecCompressOutput
	ToMiddlewareSpecCompressOutputWithContext(context.Context) MiddlewareSpecCompressOutput
}

// Compress holds the compress middleware configuration.
// This middleware compresses responses before sending them to the client, using gzip compression.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
type MiddlewareSpecCompressArgs struct {
	// DefaultEncoding specifies the default encoding if the `Accept-Encoding` header is not in the request or contains a wildcard (`*`).
	DefaultEncoding pulumi.StringPtrInput `pulumi:"defaultEncoding"`
	// ExcludedContentTypes defines the list of content types to compare the Content-Type header of the incoming requests and responses before compressing.
	// `application/grpc` is always excluded.
	ExcludedContentTypes pulumi.StringArrayInput `pulumi:"excludedContentTypes"`
	// IncludedContentTypes defines the list of content types to compare the Content-Type header of the responses before compressing.
	IncludedContentTypes pulumi.StringArrayInput `pulumi:"includedContentTypes"`
	// MinResponseBodyBytes defines the minimum amount of bytes a response body must have to be compressed.
	// Default: 1024.
	MinResponseBodyBytes pulumi.IntPtrInput `pulumi:"minResponseBodyBytes"`
}

func (MiddlewareSpecCompressArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecCompress)(nil)).Elem()
}

func (i MiddlewareSpecCompressArgs) ToMiddlewareSpecCompressOutput() MiddlewareSpecCompressOutput {
	return i.ToMiddlewareSpecCompressOutputWithContext(context.Background())
}

func (i MiddlewareSpecCompressArgs) ToMiddlewareSpecCompressOutputWithContext(ctx context.Context) MiddlewareSpecCompressOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecCompressOutput)
}

func (i MiddlewareSpecCompressArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecCompress] {
	return pulumix.Output[MiddlewareSpecCompress]{
		OutputState: i.ToMiddlewareSpecCompressOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecCompressArgs) ToMiddlewareSpecCompressPtrOutput() MiddlewareSpecCompressPtrOutput {
	return i.ToMiddlewareSpecCompressPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecCompressArgs) ToMiddlewareSpecCompressPtrOutputWithContext(ctx context.Context) MiddlewareSpecCompressPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecCompressOutput).ToMiddlewareSpecCompressPtrOutputWithContext(ctx)
}

// MiddlewareSpecCompressPtrInput is an input type that accepts MiddlewareSpecCompressArgs, MiddlewareSpecCompressPtr and MiddlewareSpecCompressPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecCompressPtrInput` via:
//
//	        MiddlewareSpecCompressArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecCompressPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecCompressPtrOutput() MiddlewareSpecCompressPtrOutput
	ToMiddlewareSpecCompressPtrOutputWithContext(context.Context) MiddlewareSpecCompressPtrOutput
}

type middlewareSpecCompressPtrType MiddlewareSpecCompressArgs

func MiddlewareSpecCompressPtr(v *MiddlewareSpecCompressArgs) MiddlewareSpecCompressPtrInput {
	return (*middlewareSpecCompressPtrType)(v)
}

func (*middlewareSpecCompressPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecCompress)(nil)).Elem()
}

func (i *middlewareSpecCompressPtrType) ToMiddlewareSpecCompressPtrOutput() MiddlewareSpecCompressPtrOutput {
	return i.ToMiddlewareSpecCompressPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecCompressPtrType) ToMiddlewareSpecCompressPtrOutputWithContext(ctx context.Context) MiddlewareSpecCompressPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecCompressPtrOutput)
}

func (i *middlewareSpecCompressPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecCompress] {
	return pulumix.Output[*MiddlewareSpecCompress]{
		OutputState: i.ToMiddlewareSpecCompressPtrOutputWithContext(ctx).OutputState,
	}
}

// Compress holds the compress middleware configuration.
// This middleware compresses responses before sending them to the client, using gzip compression.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/compress/
type MiddlewareSpecCompressOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecCompressOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecCompress)(nil)).Elem()
}

func (o MiddlewareSpecCompressOutput) ToMiddlewareSpecCompressOutput() MiddlewareSpecCompressOutput {
	return o
}

func (o MiddlewareSpecCompressOutput) ToMiddlewareSpecCompressOutputWithContext(ctx context.Context) MiddlewareSpecCompressOutput {
	return o
}

func (o MiddlewareSpecCompressOutput) ToMiddlewareSpecCompressPtrOutput() MiddlewareSpecCompressPtrOutput {
	return o.ToMiddlewareSpecCompressPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecCompressOutput) ToMiddlewareSpecCompressPtrOutputWithContext(ctx context.Context) MiddlewareSpecCompressPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecCompress) *MiddlewareSpecCompress {
		return &v
	}).(MiddlewareSpecCompressPtrOutput)
}

func (o MiddlewareSpecCompressOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecCompress] {
	return pulumix.Output[MiddlewareSpecCompress]{
		OutputState: o.OutputState,
	}
}

// DefaultEncoding specifies the default encoding if the `Accept-Encoding` header is not in the request or contains a wildcard (`*`).
func (o MiddlewareSpecCompressOutput) DefaultEncoding() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecCompress) *string { return v.DefaultEncoding }).(pulumi.StringPtrOutput)
}

// ExcludedContentTypes defines the list of content types to compare the Content-Type header of the incoming requests and responses before compressing.
// `application/grpc` is always excluded.
func (o MiddlewareSpecCompressOutput) ExcludedContentTypes() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecCompress) []string { return v.ExcludedContentTypes }).(pulumi.StringArrayOutput)
}

// IncludedContentTypes defines the list of content types to compare the Content-Type header of the responses before compressing.
func (o MiddlewareSpecCompressOutput) IncludedContentTypes() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecCompress) []string { return v.IncludedContentTypes }).(pulumi.StringArrayOutput)
}

// MinResponseBodyBytes defines the minimum amount of bytes a response body must have to be compressed.
// Default: 1024.
func (o MiddlewareSpecCompressOutput) MinResponseBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecCompress) *int { return v.MinResponseBodyBytes }).(pulumi.IntPtrOutput)
}

type MiddlewareSpecCompressPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecCompressPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecCompress)(nil)).Elem()
}

func (o MiddlewareSpecCompressPtrOutput) ToMiddlewareSpecCompressPtrOutput() MiddlewareSpecCompressPtrOutput {
	return o
}

func (o MiddlewareSpecCompressPtrOutput) ToMiddlewareSpecCompressPtrOutputWithContext(ctx context.Context) MiddlewareSpecCompressPtrOutput {
	return o
}

func (o MiddlewareSpecCompressPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecCompress] {
	return pulumix.Output[*MiddlewareSpecCompress]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecCompressPtrOutput) Elem() MiddlewareSpecCompressOutput {
	return o.ApplyT(func(v *MiddlewareSpecCompress) MiddlewareSpecCompress {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecCompress
		return ret
	}).(MiddlewareSpecCompressOutput)
}

// DefaultEncoding specifies the default encoding if the `Accept-Encoding` header is not in the request or contains a wildcard (`*`).
func (o MiddlewareSpecCompressPtrOutput) DefaultEncoding() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecCompress) *string {
		if v == nil {
			return nil
		}
		return v.DefaultEncoding
	}).(pulumi.StringPtrOutput)
}

// ExcludedContentTypes defines the list of content types to compare the Content-Type header of the incoming requests and responses before compressing.
// `application/grpc` is always excluded.
func (o MiddlewareSpecCompressPtrOutput) ExcludedContentTypes() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecCompress) []string {
		if v == nil {
			return nil
		}
		return v.ExcludedContentTypes
	}).(pulumi.StringArrayOutput)
}

// IncludedContentTypes defines the list of content types to compare the Content-Type header of the responses before compressing.
func (o MiddlewareSpecCompressPtrOutput) IncludedContentTypes() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecCompress) []string {
		if v == nil {
			return nil
		}
		return v.IncludedContentTypes
	}).(pulumi.StringArrayOutput)
}

// MinResponseBodyBytes defines the minimum amount of bytes a response body must have to be compressed.
// Default: 1024.
func (o MiddlewareSpecCompressPtrOutput) MinResponseBodyBytes() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecCompress) *int {
		if v == nil {
			return nil
		}
		return v.MinResponseBodyBytes
	}).(pulumi.IntPtrOutput)
}

// ContentType holds the content-type middleware configuration.
// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
type MiddlewareSpecContentType struct {
	// AutoDetect specifies whether to let the `Content-Type` header, if it has not been set by the backend,
	// be automatically set to a value derived from the contents of the response.
	// Deprecated: AutoDetect option is deprecated, Content-Type middleware is only meant to be used to enable the content-type detection, please remove any usage of this option.
	AutoDetect *bool `pulumi:"autoDetect"`
}

// MiddlewareSpecContentTypeInput is an input type that accepts MiddlewareSpecContentTypeArgs and MiddlewareSpecContentTypeOutput values.
// You can construct a concrete instance of `MiddlewareSpecContentTypeInput` via:
//
//	MiddlewareSpecContentTypeArgs{...}
type MiddlewareSpecContentTypeInput interface {
	pulumi.Input

	ToMiddlewareSpecContentTypeOutput() MiddlewareSpecContentTypeOutput
	ToMiddlewareSpecContentTypeOutputWithContext(context.Context) MiddlewareSpecContentTypeOutput
}

// ContentType holds the content-type middleware configuration.
// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
type MiddlewareSpecContentTypeArgs struct {
	// AutoDetect specifies whether to let the `Content-Type` header, if it has not been set by the backend,
	// be automatically set to a value derived from the contents of the response.
	// Deprecated: AutoDetect option is deprecated, Content-Type middleware is only meant to be used to enable the content-type detection, please remove any usage of this option.
	AutoDetect pulumi.BoolPtrInput `pulumi:"autoDetect"`
}

func (MiddlewareSpecContentTypeArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecContentType)(nil)).Elem()
}

func (i MiddlewareSpecContentTypeArgs) ToMiddlewareSpecContentTypeOutput() MiddlewareSpecContentTypeOutput {
	return i.ToMiddlewareSpecContentTypeOutputWithContext(context.Background())
}

func (i MiddlewareSpecContentTypeArgs) ToMiddlewareSpecContentTypeOutputWithContext(ctx context.Context) MiddlewareSpecContentTypeOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecContentTypeOutput)
}

func (i MiddlewareSpecContentTypeArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecContentType] {
	return pulumix.Output[MiddlewareSpecContentType]{
		OutputState: i.ToMiddlewareSpecContentTypeOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecContentTypeArgs) ToMiddlewareSpecContentTypePtrOutput() MiddlewareSpecContentTypePtrOutput {
	return i.ToMiddlewareSpecContentTypePtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecContentTypeArgs) ToMiddlewareSpecContentTypePtrOutputWithContext(ctx context.Context) MiddlewareSpecContentTypePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecContentTypeOutput).ToMiddlewareSpecContentTypePtrOutputWithContext(ctx)
}

// MiddlewareSpecContentTypePtrInput is an input type that accepts MiddlewareSpecContentTypeArgs, MiddlewareSpecContentTypePtr and MiddlewareSpecContentTypePtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecContentTypePtrInput` via:
//
//	        MiddlewareSpecContentTypeArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecContentTypePtrInput interface {
	pulumi.Input

	ToMiddlewareSpecContentTypePtrOutput() MiddlewareSpecContentTypePtrOutput
	ToMiddlewareSpecContentTypePtrOutputWithContext(context.Context) MiddlewareSpecContentTypePtrOutput
}

type middlewareSpecContentTypePtrType MiddlewareSpecContentTypeArgs

func MiddlewareSpecContentTypePtr(v *MiddlewareSpecContentTypeArgs) MiddlewareSpecContentTypePtrInput {
	return (*middlewareSpecContentTypePtrType)(v)
}

func (*middlewareSpecContentTypePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecContentType)(nil)).Elem()
}

func (i *middlewareSpecContentTypePtrType) ToMiddlewareSpecContentTypePtrOutput() MiddlewareSpecContentTypePtrOutput {
	return i.ToMiddlewareSpecContentTypePtrOutputWithContext(context.Background())
}

func (i *middlewareSpecContentTypePtrType) ToMiddlewareSpecContentTypePtrOutputWithContext(ctx context.Context) MiddlewareSpecContentTypePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecContentTypePtrOutput)
}

func (i *middlewareSpecContentTypePtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecContentType] {
	return pulumix.Output[*MiddlewareSpecContentType]{
		OutputState: i.ToMiddlewareSpecContentTypePtrOutputWithContext(ctx).OutputState,
	}
}

// ContentType holds the content-type middleware configuration.
// This middleware exists to enable the correct behavior until at least the default one can be changed in a future version.
type MiddlewareSpecContentTypeOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecContentTypeOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecContentType)(nil)).Elem()
}

func (o MiddlewareSpecContentTypeOutput) ToMiddlewareSpecContentTypeOutput() MiddlewareSpecContentTypeOutput {
	return o
}

func (o MiddlewareSpecContentTypeOutput) ToMiddlewareSpecContentTypeOutputWithContext(ctx context.Context) MiddlewareSpecContentTypeOutput {
	return o
}

func (o MiddlewareSpecContentTypeOutput) ToMiddlewareSpecContentTypePtrOutput() MiddlewareSpecContentTypePtrOutput {
	return o.ToMiddlewareSpecContentTypePtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecContentTypeOutput) ToMiddlewareSpecContentTypePtrOutputWithContext(ctx context.Context) MiddlewareSpecContentTypePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecContentType) *MiddlewareSpecContentType {
		return &v
	}).(MiddlewareSpecContentTypePtrOutput)
}

func (o MiddlewareSpecContentTypeOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecContentType] {
	return pulumix.Output[MiddlewareSpecContentType]{
		OutputState: o.OutputState,
	}
}

// AutoDetect specifies whether to let the `Content-Type` header, if it has not been set by the backend,
// be automatically set to a value derived from the contents of the response.
// Deprecated: AutoDetect option is deprecated, Content-Type middleware is only meant to be used to enable the content-type detection, please remove any usage of this option.
func (o MiddlewareSpecContentTypeOutput) AutoDetect() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecContentType) *bool { return v.AutoDetect }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecContentTypePtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecContentTypePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecContentType)(nil)).Elem()
}

func (o MiddlewareSpecContentTypePtrOutput) ToMiddlewareSpecContentTypePtrOutput() MiddlewareSpecContentTypePtrOutput {
	return o
}

func (o MiddlewareSpecContentTypePtrOutput) ToMiddlewareSpecContentTypePtrOutputWithContext(ctx context.Context) MiddlewareSpecContentTypePtrOutput {
	return o
}

func (o MiddlewareSpecContentTypePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecContentType] {
	return pulumix.Output[*MiddlewareSpecContentType]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecContentTypePtrOutput) Elem() MiddlewareSpecContentTypeOutput {
	return o.ApplyT(func(v *MiddlewareSpecContentType) MiddlewareSpecContentType {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecContentType
		return ret
	}).(MiddlewareSpecContentTypeOutput)
}

// AutoDetect specifies whether to let the `Content-Type` header, if it has not been set by the backend,
// be automatically set to a value derived from the contents of the response.
// Deprecated: AutoDetect option is deprecated, Content-Type middleware is only meant to be used to enable the content-type detection, please remove any usage of this option.
func (o MiddlewareSpecContentTypePtrOutput) AutoDetect() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecContentType) *bool {
		if v == nil {
			return nil
		}
		return v.AutoDetect
	}).(pulumi.BoolPtrOutput)
}

// DigestAuth holds the digest auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
type MiddlewareSpecDigestAuth struct {
	// HeaderField defines a header field to store the authenticated user.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
	HeaderField *string `pulumi:"headerField"`
	// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
	// Default: traefik.
	Realm *string `pulumi:"realm"`
	// RemoveHeader defines whether to remove the authorization header before forwarding the request to the backend.
	RemoveHeader *bool `pulumi:"removeHeader"`
	// Secret is the name of the referenced Kubernetes Secret containing user credentials.
	Secret *string `pulumi:"secret"`
}

// MiddlewareSpecDigestAuthInput is an input type that accepts MiddlewareSpecDigestAuthArgs and MiddlewareSpecDigestAuthOutput values.
// You can construct a concrete instance of `MiddlewareSpecDigestAuthInput` via:
//
//	MiddlewareSpecDigestAuthArgs{...}
type MiddlewareSpecDigestAuthInput interface {
	pulumi.Input

	ToMiddlewareSpecDigestAuthOutput() MiddlewareSpecDigestAuthOutput
	ToMiddlewareSpecDigestAuthOutputWithContext(context.Context) MiddlewareSpecDigestAuthOutput
}

// DigestAuth holds the digest auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
type MiddlewareSpecDigestAuthArgs struct {
	// HeaderField defines a header field to store the authenticated user.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
	HeaderField pulumi.StringPtrInput `pulumi:"headerField"`
	// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
	// Default: traefik.
	Realm pulumi.StringPtrInput `pulumi:"realm"`
	// RemoveHeader defines whether to remove the authorization header before forwarding the request to the backend.
	RemoveHeader pulumi.BoolPtrInput `pulumi:"removeHeader"`
	// Secret is the name of the referenced Kubernetes Secret containing user credentials.
	Secret pulumi.StringPtrInput `pulumi:"secret"`
}

func (MiddlewareSpecDigestAuthArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecDigestAuth)(nil)).Elem()
}

func (i MiddlewareSpecDigestAuthArgs) ToMiddlewareSpecDigestAuthOutput() MiddlewareSpecDigestAuthOutput {
	return i.ToMiddlewareSpecDigestAuthOutputWithContext(context.Background())
}

func (i MiddlewareSpecDigestAuthArgs) ToMiddlewareSpecDigestAuthOutputWithContext(ctx context.Context) MiddlewareSpecDigestAuthOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecDigestAuthOutput)
}

func (i MiddlewareSpecDigestAuthArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecDigestAuth] {
	return pulumix.Output[MiddlewareSpecDigestAuth]{
		OutputState: i.ToMiddlewareSpecDigestAuthOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecDigestAuthArgs) ToMiddlewareSpecDigestAuthPtrOutput() MiddlewareSpecDigestAuthPtrOutput {
	return i.ToMiddlewareSpecDigestAuthPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecDigestAuthArgs) ToMiddlewareSpecDigestAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecDigestAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecDigestAuthOutput).ToMiddlewareSpecDigestAuthPtrOutputWithContext(ctx)
}

// MiddlewareSpecDigestAuthPtrInput is an input type that accepts MiddlewareSpecDigestAuthArgs, MiddlewareSpecDigestAuthPtr and MiddlewareSpecDigestAuthPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecDigestAuthPtrInput` via:
//
//	        MiddlewareSpecDigestAuthArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecDigestAuthPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecDigestAuthPtrOutput() MiddlewareSpecDigestAuthPtrOutput
	ToMiddlewareSpecDigestAuthPtrOutputWithContext(context.Context) MiddlewareSpecDigestAuthPtrOutput
}

type middlewareSpecDigestAuthPtrType MiddlewareSpecDigestAuthArgs

func MiddlewareSpecDigestAuthPtr(v *MiddlewareSpecDigestAuthArgs) MiddlewareSpecDigestAuthPtrInput {
	return (*middlewareSpecDigestAuthPtrType)(v)
}

func (*middlewareSpecDigestAuthPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecDigestAuth)(nil)).Elem()
}

func (i *middlewareSpecDigestAuthPtrType) ToMiddlewareSpecDigestAuthPtrOutput() MiddlewareSpecDigestAuthPtrOutput {
	return i.ToMiddlewareSpecDigestAuthPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecDigestAuthPtrType) ToMiddlewareSpecDigestAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecDigestAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecDigestAuthPtrOutput)
}

func (i *middlewareSpecDigestAuthPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecDigestAuth] {
	return pulumix.Output[*MiddlewareSpecDigestAuth]{
		OutputState: i.ToMiddlewareSpecDigestAuthPtrOutputWithContext(ctx).OutputState,
	}
}

// DigestAuth holds the digest auth middleware configuration.
// This middleware restricts access to your services to known users.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/digestauth/
type MiddlewareSpecDigestAuthOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecDigestAuthOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecDigestAuth)(nil)).Elem()
}

func (o MiddlewareSpecDigestAuthOutput) ToMiddlewareSpecDigestAuthOutput() MiddlewareSpecDigestAuthOutput {
	return o
}

func (o MiddlewareSpecDigestAuthOutput) ToMiddlewareSpecDigestAuthOutputWithContext(ctx context.Context) MiddlewareSpecDigestAuthOutput {
	return o
}

func (o MiddlewareSpecDigestAuthOutput) ToMiddlewareSpecDigestAuthPtrOutput() MiddlewareSpecDigestAuthPtrOutput {
	return o.ToMiddlewareSpecDigestAuthPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecDigestAuthOutput) ToMiddlewareSpecDigestAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecDigestAuthPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecDigestAuth) *MiddlewareSpecDigestAuth {
		return &v
	}).(MiddlewareSpecDigestAuthPtrOutput)
}

func (o MiddlewareSpecDigestAuthOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecDigestAuth] {
	return pulumix.Output[MiddlewareSpecDigestAuth]{
		OutputState: o.OutputState,
	}
}

// HeaderField defines a header field to store the authenticated user.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
func (o MiddlewareSpecDigestAuthOutput) HeaderField() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecDigestAuth) *string { return v.HeaderField }).(pulumi.StringPtrOutput)
}

// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
// Default: traefik.
func (o MiddlewareSpecDigestAuthOutput) Realm() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecDigestAuth) *string { return v.Realm }).(pulumi.StringPtrOutput)
}

// RemoveHeader defines whether to remove the authorization header before forwarding the request to the backend.
func (o MiddlewareSpecDigestAuthOutput) RemoveHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecDigestAuth) *bool { return v.RemoveHeader }).(pulumi.BoolPtrOutput)
}

// Secret is the name of the referenced Kubernetes Secret containing user credentials.
func (o MiddlewareSpecDigestAuthOutput) Secret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecDigestAuth) *string { return v.Secret }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecDigestAuthPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecDigestAuthPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecDigestAuth)(nil)).Elem()
}

func (o MiddlewareSpecDigestAuthPtrOutput) ToMiddlewareSpecDigestAuthPtrOutput() MiddlewareSpecDigestAuthPtrOutput {
	return o
}

func (o MiddlewareSpecDigestAuthPtrOutput) ToMiddlewareSpecDigestAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecDigestAuthPtrOutput {
	return o
}

func (o MiddlewareSpecDigestAuthPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecDigestAuth] {
	return pulumix.Output[*MiddlewareSpecDigestAuth]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecDigestAuthPtrOutput) Elem() MiddlewareSpecDigestAuthOutput {
	return o.ApplyT(func(v *MiddlewareSpecDigestAuth) MiddlewareSpecDigestAuth {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecDigestAuth
		return ret
	}).(MiddlewareSpecDigestAuthOutput)
}

// HeaderField defines a header field to store the authenticated user.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/basicauth/#headerfield
func (o MiddlewareSpecDigestAuthPtrOutput) HeaderField() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecDigestAuth) *string {
		if v == nil {
			return nil
		}
		return v.HeaderField
	}).(pulumi.StringPtrOutput)
}

// Realm allows the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme.
// Default: traefik.
func (o MiddlewareSpecDigestAuthPtrOutput) Realm() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecDigestAuth) *string {
		if v == nil {
			return nil
		}
		return v.Realm
	}).(pulumi.StringPtrOutput)
}

// RemoveHeader defines whether to remove the authorization header before forwarding the request to the backend.
func (o MiddlewareSpecDigestAuthPtrOutput) RemoveHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecDigestAuth) *bool {
		if v == nil {
			return nil
		}
		return v.RemoveHeader
	}).(pulumi.BoolPtrOutput)
}

// Secret is the name of the referenced Kubernetes Secret containing user credentials.
func (o MiddlewareSpecDigestAuthPtrOutput) Secret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecDigestAuth) *string {
		if v == nil {
			return nil
		}
		return v.Secret
	}).(pulumi.StringPtrOutput)
}

// ErrorPage holds the custom error middleware configuration.
// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
type MiddlewareSpecErrors struct {
	// Query defines the URL for the error page (hosted by service).
	// The {status} variable can be used in order to insert the status code in the URL.
	Query *string `pulumi:"query"`
	// Service defines the reference to a Kubernetes Service that will serve the error page.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
	Service *MiddlewareSpecErrorsService `pulumi:"service"`
	// Status defines which status or range of statuses should result in an error page.
	// It can be either a status code as a number (500),
	// as multiple comma-separated numbers (500,502),
	// as ranges by separating two codes with a dash (500-599),
	// or a combination of the two (404,418,500-599).
	Status []string `pulumi:"status"`
}

// MiddlewareSpecErrorsInput is an input type that accepts MiddlewareSpecErrorsArgs and MiddlewareSpecErrorsOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsInput` via:
//
//	MiddlewareSpecErrorsArgs{...}
type MiddlewareSpecErrorsInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsOutput() MiddlewareSpecErrorsOutput
	ToMiddlewareSpecErrorsOutputWithContext(context.Context) MiddlewareSpecErrorsOutput
}

// ErrorPage holds the custom error middleware configuration.
// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
type MiddlewareSpecErrorsArgs struct {
	// Query defines the URL for the error page (hosted by service).
	// The {status} variable can be used in order to insert the status code in the URL.
	Query pulumi.StringPtrInput `pulumi:"query"`
	// Service defines the reference to a Kubernetes Service that will serve the error page.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
	Service MiddlewareSpecErrorsServicePtrInput `pulumi:"service"`
	// Status defines which status or range of statuses should result in an error page.
	// It can be either a status code as a number (500),
	// as multiple comma-separated numbers (500,502),
	// as ranges by separating two codes with a dash (500-599),
	// or a combination of the two (404,418,500-599).
	Status pulumi.StringArrayInput `pulumi:"status"`
}

func (MiddlewareSpecErrorsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrors)(nil)).Elem()
}

func (i MiddlewareSpecErrorsArgs) ToMiddlewareSpecErrorsOutput() MiddlewareSpecErrorsOutput {
	return i.ToMiddlewareSpecErrorsOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsArgs) ToMiddlewareSpecErrorsOutputWithContext(ctx context.Context) MiddlewareSpecErrorsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsOutput)
}

func (i MiddlewareSpecErrorsArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrors] {
	return pulumix.Output[MiddlewareSpecErrors]{
		OutputState: i.ToMiddlewareSpecErrorsOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecErrorsArgs) ToMiddlewareSpecErrorsPtrOutput() MiddlewareSpecErrorsPtrOutput {
	return i.ToMiddlewareSpecErrorsPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsArgs) ToMiddlewareSpecErrorsPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsOutput).ToMiddlewareSpecErrorsPtrOutputWithContext(ctx)
}

// MiddlewareSpecErrorsPtrInput is an input type that accepts MiddlewareSpecErrorsArgs, MiddlewareSpecErrorsPtr and MiddlewareSpecErrorsPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsPtrInput` via:
//
//	        MiddlewareSpecErrorsArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecErrorsPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsPtrOutput() MiddlewareSpecErrorsPtrOutput
	ToMiddlewareSpecErrorsPtrOutputWithContext(context.Context) MiddlewareSpecErrorsPtrOutput
}

type middlewareSpecErrorsPtrType MiddlewareSpecErrorsArgs

func MiddlewareSpecErrorsPtr(v *MiddlewareSpecErrorsArgs) MiddlewareSpecErrorsPtrInput {
	return (*middlewareSpecErrorsPtrType)(v)
}

func (*middlewareSpecErrorsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrors)(nil)).Elem()
}

func (i *middlewareSpecErrorsPtrType) ToMiddlewareSpecErrorsPtrOutput() MiddlewareSpecErrorsPtrOutput {
	return i.ToMiddlewareSpecErrorsPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecErrorsPtrType) ToMiddlewareSpecErrorsPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsPtrOutput)
}

func (i *middlewareSpecErrorsPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrors] {
	return pulumix.Output[*MiddlewareSpecErrors]{
		OutputState: i.ToMiddlewareSpecErrorsPtrOutputWithContext(ctx).OutputState,
	}
}

// ErrorPage holds the custom error middleware configuration.
// This middleware returns a custom page in lieu of the default, according to configured ranges of HTTP Status codes.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/
type MiddlewareSpecErrorsOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrors)(nil)).Elem()
}

func (o MiddlewareSpecErrorsOutput) ToMiddlewareSpecErrorsOutput() MiddlewareSpecErrorsOutput {
	return o
}

func (o MiddlewareSpecErrorsOutput) ToMiddlewareSpecErrorsOutputWithContext(ctx context.Context) MiddlewareSpecErrorsOutput {
	return o
}

func (o MiddlewareSpecErrorsOutput) ToMiddlewareSpecErrorsPtrOutput() MiddlewareSpecErrorsPtrOutput {
	return o.ToMiddlewareSpecErrorsPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecErrorsOutput) ToMiddlewareSpecErrorsPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecErrors) *MiddlewareSpecErrors {
		return &v
	}).(MiddlewareSpecErrorsPtrOutput)
}

func (o MiddlewareSpecErrorsOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrors] {
	return pulumix.Output[MiddlewareSpecErrors]{
		OutputState: o.OutputState,
	}
}

// Query defines the URL for the error page (hosted by service).
// The {status} variable can be used in order to insert the status code in the URL.
func (o MiddlewareSpecErrorsOutput) Query() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrors) *string { return v.Query }).(pulumi.StringPtrOutput)
}

// Service defines the reference to a Kubernetes Service that will serve the error page.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
func (o MiddlewareSpecErrorsOutput) Service() MiddlewareSpecErrorsServicePtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrors) *MiddlewareSpecErrorsService { return v.Service }).(MiddlewareSpecErrorsServicePtrOutput)
}

// Status defines which status or range of statuses should result in an error page.
// It can be either a status code as a number (500),
// as multiple comma-separated numbers (500,502),
// as ranges by separating two codes with a dash (500-599),
// or a combination of the two (404,418,500-599).
func (o MiddlewareSpecErrorsOutput) Status() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecErrors) []string { return v.Status }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecErrorsPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrors)(nil)).Elem()
}

func (o MiddlewareSpecErrorsPtrOutput) ToMiddlewareSpecErrorsPtrOutput() MiddlewareSpecErrorsPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsPtrOutput) ToMiddlewareSpecErrorsPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrors] {
	return pulumix.Output[*MiddlewareSpecErrors]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecErrorsPtrOutput) Elem() MiddlewareSpecErrorsOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrors) MiddlewareSpecErrors {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecErrors
		return ret
	}).(MiddlewareSpecErrorsOutput)
}

// Query defines the URL for the error page (hosted by service).
// The {status} variable can be used in order to insert the status code in the URL.
func (o MiddlewareSpecErrorsPtrOutput) Query() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrors) *string {
		if v == nil {
			return nil
		}
		return v.Query
	}).(pulumi.StringPtrOutput)
}

// Service defines the reference to a Kubernetes Service that will serve the error page.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
func (o MiddlewareSpecErrorsPtrOutput) Service() MiddlewareSpecErrorsServicePtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrors) *MiddlewareSpecErrorsService {
		if v == nil {
			return nil
		}
		return v.Service
	}).(MiddlewareSpecErrorsServicePtrOutput)
}

// Status defines which status or range of statuses should result in an error page.
// It can be either a status code as a number (500),
// as multiple comma-separated numbers (500,502),
// as ranges by separating two codes with a dash (500-599),
// or a combination of the two (404,418,500-599).
func (o MiddlewareSpecErrorsPtrOutput) Status() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrors) []string {
		if v == nil {
			return nil
		}
		return v.Status
	}).(pulumi.StringArrayOutput)
}

// Service defines the reference to a Kubernetes Service that will serve the error page.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
type MiddlewareSpecErrorsService struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck *MiddlewareSpecErrorsServiceHealthCheck `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind *string `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader *bool `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding *MiddlewareSpecErrorsServiceResponseForwarding `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme *string `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport *string `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky *MiddlewareSpecErrorsServiceSticky `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy *string `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight *int `pulumi:"weight"`
}

// MiddlewareSpecErrorsServiceInput is an input type that accepts MiddlewareSpecErrorsServiceArgs and MiddlewareSpecErrorsServiceOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceInput` via:
//
//	MiddlewareSpecErrorsServiceArgs{...}
type MiddlewareSpecErrorsServiceInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceOutput() MiddlewareSpecErrorsServiceOutput
	ToMiddlewareSpecErrorsServiceOutputWithContext(context.Context) MiddlewareSpecErrorsServiceOutput
}

// Service defines the reference to a Kubernetes Service that will serve the error page.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
type MiddlewareSpecErrorsServiceArgs struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck MiddlewareSpecErrorsServiceHealthCheckPtrInput `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind pulumi.StringPtrInput `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader pulumi.BoolPtrInput `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding MiddlewareSpecErrorsServiceResponseForwardingPtrInput `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport pulumi.StringPtrInput `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky MiddlewareSpecErrorsServiceStickyPtrInput `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy pulumi.StringPtrInput `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (MiddlewareSpecErrorsServiceArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsService)(nil)).Elem()
}

func (i MiddlewareSpecErrorsServiceArgs) ToMiddlewareSpecErrorsServiceOutput() MiddlewareSpecErrorsServiceOutput {
	return i.ToMiddlewareSpecErrorsServiceOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceArgs) ToMiddlewareSpecErrorsServiceOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceOutput)
}

func (i MiddlewareSpecErrorsServiceArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsService] {
	return pulumix.Output[MiddlewareSpecErrorsService]{
		OutputState: i.ToMiddlewareSpecErrorsServiceOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecErrorsServiceArgs) ToMiddlewareSpecErrorsServicePtrOutput() MiddlewareSpecErrorsServicePtrOutput {
	return i.ToMiddlewareSpecErrorsServicePtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceArgs) ToMiddlewareSpecErrorsServicePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServicePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceOutput).ToMiddlewareSpecErrorsServicePtrOutputWithContext(ctx)
}

// MiddlewareSpecErrorsServicePtrInput is an input type that accepts MiddlewareSpecErrorsServiceArgs, MiddlewareSpecErrorsServicePtr and MiddlewareSpecErrorsServicePtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServicePtrInput` via:
//
//	        MiddlewareSpecErrorsServiceArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecErrorsServicePtrInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServicePtrOutput() MiddlewareSpecErrorsServicePtrOutput
	ToMiddlewareSpecErrorsServicePtrOutputWithContext(context.Context) MiddlewareSpecErrorsServicePtrOutput
}

type middlewareSpecErrorsServicePtrType MiddlewareSpecErrorsServiceArgs

func MiddlewareSpecErrorsServicePtr(v *MiddlewareSpecErrorsServiceArgs) MiddlewareSpecErrorsServicePtrInput {
	return (*middlewareSpecErrorsServicePtrType)(v)
}

func (*middlewareSpecErrorsServicePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsService)(nil)).Elem()
}

func (i *middlewareSpecErrorsServicePtrType) ToMiddlewareSpecErrorsServicePtrOutput() MiddlewareSpecErrorsServicePtrOutput {
	return i.ToMiddlewareSpecErrorsServicePtrOutputWithContext(context.Background())
}

func (i *middlewareSpecErrorsServicePtrType) ToMiddlewareSpecErrorsServicePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServicePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServicePtrOutput)
}

func (i *middlewareSpecErrorsServicePtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsService] {
	return pulumix.Output[*MiddlewareSpecErrorsService]{
		OutputState: i.ToMiddlewareSpecErrorsServicePtrOutputWithContext(ctx).OutputState,
	}
}

// Service defines the reference to a Kubernetes Service that will serve the error page.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/errorpages/#service
type MiddlewareSpecErrorsServiceOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsService)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceOutput) ToMiddlewareSpecErrorsServiceOutput() MiddlewareSpecErrorsServiceOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceOutput) ToMiddlewareSpecErrorsServiceOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceOutput) ToMiddlewareSpecErrorsServicePtrOutput() MiddlewareSpecErrorsServicePtrOutput {
	return o.ToMiddlewareSpecErrorsServicePtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecErrorsServiceOutput) ToMiddlewareSpecErrorsServicePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServicePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecErrorsService) *MiddlewareSpecErrorsService {
		return &v
	}).(MiddlewareSpecErrorsServicePtrOutput)
}

func (o MiddlewareSpecErrorsServiceOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsService] {
	return pulumix.Output[MiddlewareSpecErrorsService]{
		OutputState: o.OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
func (o MiddlewareSpecErrorsServiceOutput) HealthCheck() MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *MiddlewareSpecErrorsServiceHealthCheck { return v.HealthCheck }).(MiddlewareSpecErrorsServiceHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o MiddlewareSpecErrorsServiceOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *string { return v.Kind }).(pulumi.StringPtrOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o MiddlewareSpecErrorsServiceOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o MiddlewareSpecErrorsServiceOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o MiddlewareSpecErrorsServiceOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o MiddlewareSpecErrorsServiceOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o MiddlewareSpecErrorsServiceOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *bool { return v.PassHostHeader }).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o MiddlewareSpecErrorsServiceOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o MiddlewareSpecErrorsServiceOutput) ResponseForwarding() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *MiddlewareSpecErrorsServiceResponseForwarding {
		return v.ResponseForwarding
	}).(MiddlewareSpecErrorsServiceResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o MiddlewareSpecErrorsServiceOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o MiddlewareSpecErrorsServiceOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *string { return v.ServersTransport }).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o MiddlewareSpecErrorsServiceOutput) Sticky() MiddlewareSpecErrorsServiceStickyPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *MiddlewareSpecErrorsServiceSticky { return v.Sticky }).(MiddlewareSpecErrorsServiceStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o MiddlewareSpecErrorsServiceOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *string { return v.Strategy }).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o MiddlewareSpecErrorsServiceOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsService) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type MiddlewareSpecErrorsServicePtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServicePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsService)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServicePtrOutput) ToMiddlewareSpecErrorsServicePtrOutput() MiddlewareSpecErrorsServicePtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServicePtrOutput) ToMiddlewareSpecErrorsServicePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServicePtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServicePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsService] {
	return pulumix.Output[*MiddlewareSpecErrorsService]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecErrorsServicePtrOutput) Elem() MiddlewareSpecErrorsServiceOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) MiddlewareSpecErrorsService {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecErrorsService
		return ret
	}).(MiddlewareSpecErrorsServiceOutput)
}

// Healthcheck defines health checks for ExternalName services.
func (o MiddlewareSpecErrorsServicePtrOutput) HealthCheck() MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *MiddlewareSpecErrorsServiceHealthCheck {
		if v == nil {
			return nil
		}
		return v.HealthCheck
	}).(MiddlewareSpecErrorsServiceHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o MiddlewareSpecErrorsServicePtrOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *string {
		if v == nil {
			return nil
		}
		return v.Kind
	}).(pulumi.StringPtrOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o MiddlewareSpecErrorsServicePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *string {
		if v == nil {
			return nil
		}
		return &v.Name
	}).(pulumi.StringPtrOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o MiddlewareSpecErrorsServicePtrOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *string {
		if v == nil {
			return nil
		}
		return v.Namespace
	}).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o MiddlewareSpecErrorsServicePtrOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *bool {
		if v == nil {
			return nil
		}
		return v.NativeLB
	}).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o MiddlewareSpecErrorsServicePtrOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *bool {
		if v == nil {
			return nil
		}
		return v.NodePortLB
	}).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o MiddlewareSpecErrorsServicePtrOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *bool {
		if v == nil {
			return nil
		}
		return v.PassHostHeader
	}).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o MiddlewareSpecErrorsServicePtrOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) interface{} {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o MiddlewareSpecErrorsServicePtrOutput) ResponseForwarding() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *MiddlewareSpecErrorsServiceResponseForwarding {
		if v == nil {
			return nil
		}
		return v.ResponseForwarding
	}).(MiddlewareSpecErrorsServiceResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o MiddlewareSpecErrorsServicePtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o MiddlewareSpecErrorsServicePtrOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *string {
		if v == nil {
			return nil
		}
		return v.ServersTransport
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o MiddlewareSpecErrorsServicePtrOutput) Sticky() MiddlewareSpecErrorsServiceStickyPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *MiddlewareSpecErrorsServiceSticky {
		if v == nil {
			return nil
		}
		return v.Sticky
	}).(MiddlewareSpecErrorsServiceStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o MiddlewareSpecErrorsServicePtrOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *string {
		if v == nil {
			return nil
		}
		return v.Strategy
	}).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o MiddlewareSpecErrorsServicePtrOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsService) *int {
		if v == nil {
			return nil
		}
		return v.Weight
	}).(pulumi.IntPtrOutput)
}

// Healthcheck defines health checks for ExternalName services.
type MiddlewareSpecErrorsServiceHealthCheck struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects *bool `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers map[string]string `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname *string `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval interface{} `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method *string `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode *string `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path *string `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port *int `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme *string `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status *int `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout interface{} `pulumi:"timeout"`
}

// MiddlewareSpecErrorsServiceHealthCheckInput is an input type that accepts MiddlewareSpecErrorsServiceHealthCheckArgs and MiddlewareSpecErrorsServiceHealthCheckOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceHealthCheckInput` via:
//
//	MiddlewareSpecErrorsServiceHealthCheckArgs{...}
type MiddlewareSpecErrorsServiceHealthCheckInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceHealthCheckOutput() MiddlewareSpecErrorsServiceHealthCheckOutput
	ToMiddlewareSpecErrorsServiceHealthCheckOutputWithContext(context.Context) MiddlewareSpecErrorsServiceHealthCheckOutput
}

// Healthcheck defines health checks for ExternalName services.
type MiddlewareSpecErrorsServiceHealthCheckArgs struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects pulumi.BoolPtrInput `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers pulumi.StringMapInput `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname pulumi.StringPtrInput `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval pulumi.Input `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method pulumi.StringPtrInput `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode pulumi.StringPtrInput `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path pulumi.StringPtrInput `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port pulumi.IntPtrInput `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status pulumi.IntPtrInput `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout pulumi.Input `pulumi:"timeout"`
}

func (MiddlewareSpecErrorsServiceHealthCheckArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceHealthCheck)(nil)).Elem()
}

func (i MiddlewareSpecErrorsServiceHealthCheckArgs) ToMiddlewareSpecErrorsServiceHealthCheckOutput() MiddlewareSpecErrorsServiceHealthCheckOutput {
	return i.ToMiddlewareSpecErrorsServiceHealthCheckOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceHealthCheckArgs) ToMiddlewareSpecErrorsServiceHealthCheckOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceHealthCheckOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceHealthCheckOutput)
}

func (i MiddlewareSpecErrorsServiceHealthCheckArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceHealthCheck] {
	return pulumix.Output[MiddlewareSpecErrorsServiceHealthCheck]{
		OutputState: i.ToMiddlewareSpecErrorsServiceHealthCheckOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecErrorsServiceHealthCheckArgs) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutput() MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return i.ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceHealthCheckArgs) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceHealthCheckOutput).ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(ctx)
}

// MiddlewareSpecErrorsServiceHealthCheckPtrInput is an input type that accepts MiddlewareSpecErrorsServiceHealthCheckArgs, MiddlewareSpecErrorsServiceHealthCheckPtr and MiddlewareSpecErrorsServiceHealthCheckPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceHealthCheckPtrInput` via:
//
//	        MiddlewareSpecErrorsServiceHealthCheckArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecErrorsServiceHealthCheckPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceHealthCheckPtrOutput() MiddlewareSpecErrorsServiceHealthCheckPtrOutput
	ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(context.Context) MiddlewareSpecErrorsServiceHealthCheckPtrOutput
}

type middlewareSpecErrorsServiceHealthCheckPtrType MiddlewareSpecErrorsServiceHealthCheckArgs

func MiddlewareSpecErrorsServiceHealthCheckPtr(v *MiddlewareSpecErrorsServiceHealthCheckArgs) MiddlewareSpecErrorsServiceHealthCheckPtrInput {
	return (*middlewareSpecErrorsServiceHealthCheckPtrType)(v)
}

func (*middlewareSpecErrorsServiceHealthCheckPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceHealthCheck)(nil)).Elem()
}

func (i *middlewareSpecErrorsServiceHealthCheckPtrType) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutput() MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return i.ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecErrorsServiceHealthCheckPtrType) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceHealthCheckPtrOutput)
}

func (i *middlewareSpecErrorsServiceHealthCheckPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceHealthCheck] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceHealthCheck]{
		OutputState: i.ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(ctx).OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
type MiddlewareSpecErrorsServiceHealthCheckOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceHealthCheckOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceHealthCheck)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceHealthCheckOutput) ToMiddlewareSpecErrorsServiceHealthCheckOutput() MiddlewareSpecErrorsServiceHealthCheckOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceHealthCheckOutput) ToMiddlewareSpecErrorsServiceHealthCheckOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceHealthCheckOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceHealthCheckOutput) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutput() MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return o.ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecErrorsServiceHealthCheckOutput) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecErrorsServiceHealthCheck) *MiddlewareSpecErrorsServiceHealthCheck {
		return &v
	}).(MiddlewareSpecErrorsServiceHealthCheckPtrOutput)
}

func (o MiddlewareSpecErrorsServiceHealthCheckOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceHealthCheck] {
	return pulumix.Output[MiddlewareSpecErrorsServiceHealthCheck]{
		OutputState: o.OutputState,
	}
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *bool { return v.FollowRedirects }).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) map[string]string { return v.Headers }).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *string { return v.Hostname }).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) interface{} { return v.Interval }).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *string { return v.Method }).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *string { return v.Mode }).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *string { return v.Path }).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *int { return v.Port }).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) *int { return v.Status }).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o MiddlewareSpecErrorsServiceHealthCheckOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceHealthCheck) interface{} { return v.Timeout }).(pulumi.AnyOutput)
}

type MiddlewareSpecErrorsServiceHealthCheckPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceHealthCheckPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceHealthCheck)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutput() MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) ToMiddlewareSpecErrorsServiceHealthCheckPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceHealthCheckPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceHealthCheck] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceHealthCheck]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Elem() MiddlewareSpecErrorsServiceHealthCheckOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) MiddlewareSpecErrorsServiceHealthCheck {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecErrorsServiceHealthCheck
		return ret
	}).(MiddlewareSpecErrorsServiceHealthCheckOutput)
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *bool {
		if v == nil {
			return nil
		}
		return v.FollowRedirects
	}).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) map[string]string {
		if v == nil {
			return nil
		}
		return v.Headers
	}).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Hostname
	}).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Interval
	}).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Method
	}).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Mode
	}).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Path
	}).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Status
	}).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o MiddlewareSpecErrorsServiceHealthCheckPtrOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Timeout
	}).(pulumi.AnyOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
type MiddlewareSpecErrorsServiceHealthCheckHeaders struct {
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type MiddlewareSpecErrorsServiceResponseForwarding struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval *string `pulumi:"flushInterval"`
}

// MiddlewareSpecErrorsServiceResponseForwardingInput is an input type that accepts MiddlewareSpecErrorsServiceResponseForwardingArgs and MiddlewareSpecErrorsServiceResponseForwardingOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceResponseForwardingInput` via:
//
//	MiddlewareSpecErrorsServiceResponseForwardingArgs{...}
type MiddlewareSpecErrorsServiceResponseForwardingInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceResponseForwardingOutput() MiddlewareSpecErrorsServiceResponseForwardingOutput
	ToMiddlewareSpecErrorsServiceResponseForwardingOutputWithContext(context.Context) MiddlewareSpecErrorsServiceResponseForwardingOutput
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type MiddlewareSpecErrorsServiceResponseForwardingArgs struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval pulumi.StringPtrInput `pulumi:"flushInterval"`
}

func (MiddlewareSpecErrorsServiceResponseForwardingArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceResponseForwarding)(nil)).Elem()
}

func (i MiddlewareSpecErrorsServiceResponseForwardingArgs) ToMiddlewareSpecErrorsServiceResponseForwardingOutput() MiddlewareSpecErrorsServiceResponseForwardingOutput {
	return i.ToMiddlewareSpecErrorsServiceResponseForwardingOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceResponseForwardingArgs) ToMiddlewareSpecErrorsServiceResponseForwardingOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceResponseForwardingOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceResponseForwardingOutput)
}

func (i MiddlewareSpecErrorsServiceResponseForwardingArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceResponseForwarding] {
	return pulumix.Output[MiddlewareSpecErrorsServiceResponseForwarding]{
		OutputState: i.ToMiddlewareSpecErrorsServiceResponseForwardingOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecErrorsServiceResponseForwardingArgs) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutput() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return i.ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceResponseForwardingArgs) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceResponseForwardingOutput).ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(ctx)
}

// MiddlewareSpecErrorsServiceResponseForwardingPtrInput is an input type that accepts MiddlewareSpecErrorsServiceResponseForwardingArgs, MiddlewareSpecErrorsServiceResponseForwardingPtr and MiddlewareSpecErrorsServiceResponseForwardingPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceResponseForwardingPtrInput` via:
//
//	        MiddlewareSpecErrorsServiceResponseForwardingArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecErrorsServiceResponseForwardingPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutput() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput
	ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(context.Context) MiddlewareSpecErrorsServiceResponseForwardingPtrOutput
}

type middlewareSpecErrorsServiceResponseForwardingPtrType MiddlewareSpecErrorsServiceResponseForwardingArgs

func MiddlewareSpecErrorsServiceResponseForwardingPtr(v *MiddlewareSpecErrorsServiceResponseForwardingArgs) MiddlewareSpecErrorsServiceResponseForwardingPtrInput {
	return (*middlewareSpecErrorsServiceResponseForwardingPtrType)(v)
}

func (*middlewareSpecErrorsServiceResponseForwardingPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceResponseForwarding)(nil)).Elem()
}

func (i *middlewareSpecErrorsServiceResponseForwardingPtrType) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutput() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return i.ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecErrorsServiceResponseForwardingPtrType) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceResponseForwardingPtrOutput)
}

func (i *middlewareSpecErrorsServiceResponseForwardingPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceResponseForwarding] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceResponseForwarding]{
		OutputState: i.ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(ctx).OutputState,
	}
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type MiddlewareSpecErrorsServiceResponseForwardingOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceResponseForwardingOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceResponseForwarding)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceResponseForwardingOutput) ToMiddlewareSpecErrorsServiceResponseForwardingOutput() MiddlewareSpecErrorsServiceResponseForwardingOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceResponseForwardingOutput) ToMiddlewareSpecErrorsServiceResponseForwardingOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceResponseForwardingOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceResponseForwardingOutput) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutput() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return o.ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecErrorsServiceResponseForwardingOutput) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecErrorsServiceResponseForwarding) *MiddlewareSpecErrorsServiceResponseForwarding {
		return &v
	}).(MiddlewareSpecErrorsServiceResponseForwardingPtrOutput)
}

func (o MiddlewareSpecErrorsServiceResponseForwardingOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceResponseForwarding] {
	return pulumix.Output[MiddlewareSpecErrorsServiceResponseForwarding]{
		OutputState: o.OutputState,
	}
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o MiddlewareSpecErrorsServiceResponseForwardingOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceResponseForwarding) *string { return v.FlushInterval }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecErrorsServiceResponseForwardingPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceResponseForwardingPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceResponseForwarding)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceResponseForwardingPtrOutput) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutput() MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceResponseForwardingPtrOutput) ToMiddlewareSpecErrorsServiceResponseForwardingPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceResponseForwardingPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceResponseForwardingPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceResponseForwarding] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceResponseForwarding]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecErrorsServiceResponseForwardingPtrOutput) Elem() MiddlewareSpecErrorsServiceResponseForwardingOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceResponseForwarding) MiddlewareSpecErrorsServiceResponseForwarding {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecErrorsServiceResponseForwarding
		return ret
	}).(MiddlewareSpecErrorsServiceResponseForwardingOutput)
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o MiddlewareSpecErrorsServiceResponseForwardingPtrOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceResponseForwarding) *string {
		if v == nil {
			return nil
		}
		return v.FlushInterval
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type MiddlewareSpecErrorsServiceSticky struct {
	// Cookie defines the sticky cookie configuration.
	Cookie *MiddlewareSpecErrorsServiceStickyCookie `pulumi:"cookie"`
}

// MiddlewareSpecErrorsServiceStickyInput is an input type that accepts MiddlewareSpecErrorsServiceStickyArgs and MiddlewareSpecErrorsServiceStickyOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceStickyInput` via:
//
//	MiddlewareSpecErrorsServiceStickyArgs{...}
type MiddlewareSpecErrorsServiceStickyInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceStickyOutput() MiddlewareSpecErrorsServiceStickyOutput
	ToMiddlewareSpecErrorsServiceStickyOutputWithContext(context.Context) MiddlewareSpecErrorsServiceStickyOutput
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type MiddlewareSpecErrorsServiceStickyArgs struct {
	// Cookie defines the sticky cookie configuration.
	Cookie MiddlewareSpecErrorsServiceStickyCookiePtrInput `pulumi:"cookie"`
}

func (MiddlewareSpecErrorsServiceStickyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceSticky)(nil)).Elem()
}

func (i MiddlewareSpecErrorsServiceStickyArgs) ToMiddlewareSpecErrorsServiceStickyOutput() MiddlewareSpecErrorsServiceStickyOutput {
	return i.ToMiddlewareSpecErrorsServiceStickyOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceStickyArgs) ToMiddlewareSpecErrorsServiceStickyOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceStickyOutput)
}

func (i MiddlewareSpecErrorsServiceStickyArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceSticky] {
	return pulumix.Output[MiddlewareSpecErrorsServiceSticky]{
		OutputState: i.ToMiddlewareSpecErrorsServiceStickyOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecErrorsServiceStickyArgs) ToMiddlewareSpecErrorsServiceStickyPtrOutput() MiddlewareSpecErrorsServiceStickyPtrOutput {
	return i.ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceStickyArgs) ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceStickyOutput).ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(ctx)
}

// MiddlewareSpecErrorsServiceStickyPtrInput is an input type that accepts MiddlewareSpecErrorsServiceStickyArgs, MiddlewareSpecErrorsServiceStickyPtr and MiddlewareSpecErrorsServiceStickyPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceStickyPtrInput` via:
//
//	        MiddlewareSpecErrorsServiceStickyArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecErrorsServiceStickyPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceStickyPtrOutput() MiddlewareSpecErrorsServiceStickyPtrOutput
	ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(context.Context) MiddlewareSpecErrorsServiceStickyPtrOutput
}

type middlewareSpecErrorsServiceStickyPtrType MiddlewareSpecErrorsServiceStickyArgs

func MiddlewareSpecErrorsServiceStickyPtr(v *MiddlewareSpecErrorsServiceStickyArgs) MiddlewareSpecErrorsServiceStickyPtrInput {
	return (*middlewareSpecErrorsServiceStickyPtrType)(v)
}

func (*middlewareSpecErrorsServiceStickyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceSticky)(nil)).Elem()
}

func (i *middlewareSpecErrorsServiceStickyPtrType) ToMiddlewareSpecErrorsServiceStickyPtrOutput() MiddlewareSpecErrorsServiceStickyPtrOutput {
	return i.ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecErrorsServiceStickyPtrType) ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceStickyPtrOutput)
}

func (i *middlewareSpecErrorsServiceStickyPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceSticky] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceSticky]{
		OutputState: i.ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(ctx).OutputState,
	}
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type MiddlewareSpecErrorsServiceStickyOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceStickyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceSticky)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceStickyOutput) ToMiddlewareSpecErrorsServiceStickyOutput() MiddlewareSpecErrorsServiceStickyOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyOutput) ToMiddlewareSpecErrorsServiceStickyOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyOutput) ToMiddlewareSpecErrorsServiceStickyPtrOutput() MiddlewareSpecErrorsServiceStickyPtrOutput {
	return o.ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecErrorsServiceStickyOutput) ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecErrorsServiceSticky) *MiddlewareSpecErrorsServiceSticky {
		return &v
	}).(MiddlewareSpecErrorsServiceStickyPtrOutput)
}

func (o MiddlewareSpecErrorsServiceStickyOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceSticky] {
	return pulumix.Output[MiddlewareSpecErrorsServiceSticky]{
		OutputState: o.OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
func (o MiddlewareSpecErrorsServiceStickyOutput) Cookie() MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceSticky) *MiddlewareSpecErrorsServiceStickyCookie { return v.Cookie }).(MiddlewareSpecErrorsServiceStickyCookiePtrOutput)
}

type MiddlewareSpecErrorsServiceStickyPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceStickyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceSticky)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceStickyPtrOutput) ToMiddlewareSpecErrorsServiceStickyPtrOutput() MiddlewareSpecErrorsServiceStickyPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyPtrOutput) ToMiddlewareSpecErrorsServiceStickyPtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyPtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceSticky] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceSticky]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecErrorsServiceStickyPtrOutput) Elem() MiddlewareSpecErrorsServiceStickyOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceSticky) MiddlewareSpecErrorsServiceSticky {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecErrorsServiceSticky
		return ret
	}).(MiddlewareSpecErrorsServiceStickyOutput)
}

// Cookie defines the sticky cookie configuration.
func (o MiddlewareSpecErrorsServiceStickyPtrOutput) Cookie() MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceSticky) *MiddlewareSpecErrorsServiceStickyCookie {
		if v == nil {
			return nil
		}
		return v.Cookie
	}).(MiddlewareSpecErrorsServiceStickyCookiePtrOutput)
}

// Cookie defines the sticky cookie configuration.
type MiddlewareSpecErrorsServiceStickyCookie struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly *bool `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge *int `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name *string `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite *string `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure *bool `pulumi:"secure"`
}

// MiddlewareSpecErrorsServiceStickyCookieInput is an input type that accepts MiddlewareSpecErrorsServiceStickyCookieArgs and MiddlewareSpecErrorsServiceStickyCookieOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceStickyCookieInput` via:
//
//	MiddlewareSpecErrorsServiceStickyCookieArgs{...}
type MiddlewareSpecErrorsServiceStickyCookieInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceStickyCookieOutput() MiddlewareSpecErrorsServiceStickyCookieOutput
	ToMiddlewareSpecErrorsServiceStickyCookieOutputWithContext(context.Context) MiddlewareSpecErrorsServiceStickyCookieOutput
}

// Cookie defines the sticky cookie configuration.
type MiddlewareSpecErrorsServiceStickyCookieArgs struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly pulumi.BoolPtrInput `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge pulumi.IntPtrInput `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name pulumi.StringPtrInput `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite pulumi.StringPtrInput `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure pulumi.BoolPtrInput `pulumi:"secure"`
}

func (MiddlewareSpecErrorsServiceStickyCookieArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceStickyCookie)(nil)).Elem()
}

func (i MiddlewareSpecErrorsServiceStickyCookieArgs) ToMiddlewareSpecErrorsServiceStickyCookieOutput() MiddlewareSpecErrorsServiceStickyCookieOutput {
	return i.ToMiddlewareSpecErrorsServiceStickyCookieOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceStickyCookieArgs) ToMiddlewareSpecErrorsServiceStickyCookieOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyCookieOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceStickyCookieOutput)
}

func (i MiddlewareSpecErrorsServiceStickyCookieArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceStickyCookie] {
	return pulumix.Output[MiddlewareSpecErrorsServiceStickyCookie]{
		OutputState: i.ToMiddlewareSpecErrorsServiceStickyCookieOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecErrorsServiceStickyCookieArgs) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutput() MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return i.ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecErrorsServiceStickyCookieArgs) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceStickyCookieOutput).ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(ctx)
}

// MiddlewareSpecErrorsServiceStickyCookiePtrInput is an input type that accepts MiddlewareSpecErrorsServiceStickyCookieArgs, MiddlewareSpecErrorsServiceStickyCookiePtr and MiddlewareSpecErrorsServiceStickyCookiePtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecErrorsServiceStickyCookiePtrInput` via:
//
//	        MiddlewareSpecErrorsServiceStickyCookieArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecErrorsServiceStickyCookiePtrInput interface {
	pulumi.Input

	ToMiddlewareSpecErrorsServiceStickyCookiePtrOutput() MiddlewareSpecErrorsServiceStickyCookiePtrOutput
	ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(context.Context) MiddlewareSpecErrorsServiceStickyCookiePtrOutput
}

type middlewareSpecErrorsServiceStickyCookiePtrType MiddlewareSpecErrorsServiceStickyCookieArgs

func MiddlewareSpecErrorsServiceStickyCookiePtr(v *MiddlewareSpecErrorsServiceStickyCookieArgs) MiddlewareSpecErrorsServiceStickyCookiePtrInput {
	return (*middlewareSpecErrorsServiceStickyCookiePtrType)(v)
}

func (*middlewareSpecErrorsServiceStickyCookiePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceStickyCookie)(nil)).Elem()
}

func (i *middlewareSpecErrorsServiceStickyCookiePtrType) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutput() MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return i.ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(context.Background())
}

func (i *middlewareSpecErrorsServiceStickyCookiePtrType) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecErrorsServiceStickyCookiePtrOutput)
}

func (i *middlewareSpecErrorsServiceStickyCookiePtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceStickyCookie] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceStickyCookie]{
		OutputState: i.ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(ctx).OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
type MiddlewareSpecErrorsServiceStickyCookieOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceStickyCookieOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecErrorsServiceStickyCookie)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceStickyCookieOutput) ToMiddlewareSpecErrorsServiceStickyCookieOutput() MiddlewareSpecErrorsServiceStickyCookieOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyCookieOutput) ToMiddlewareSpecErrorsServiceStickyCookieOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyCookieOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyCookieOutput) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutput() MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return o.ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecErrorsServiceStickyCookieOutput) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecErrorsServiceStickyCookie) *MiddlewareSpecErrorsServiceStickyCookie {
		return &v
	}).(MiddlewareSpecErrorsServiceStickyCookiePtrOutput)
}

func (o MiddlewareSpecErrorsServiceStickyCookieOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecErrorsServiceStickyCookie] {
	return pulumix.Output[MiddlewareSpecErrorsServiceStickyCookie]{
		OutputState: o.OutputState,
	}
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o MiddlewareSpecErrorsServiceStickyCookieOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceStickyCookie) *bool { return v.HttpOnly }).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o MiddlewareSpecErrorsServiceStickyCookieOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceStickyCookie) *int { return v.MaxAge }).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o MiddlewareSpecErrorsServiceStickyCookieOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceStickyCookie) *string { return v.Name }).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o MiddlewareSpecErrorsServiceStickyCookieOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceStickyCookie) *string { return v.SameSite }).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o MiddlewareSpecErrorsServiceStickyCookieOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecErrorsServiceStickyCookie) *bool { return v.Secure }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecErrorsServiceStickyCookiePtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecErrorsServiceStickyCookiePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecErrorsServiceStickyCookie)(nil)).Elem()
}

func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutput() MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) ToMiddlewareSpecErrorsServiceStickyCookiePtrOutputWithContext(ctx context.Context) MiddlewareSpecErrorsServiceStickyCookiePtrOutput {
	return o
}

func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecErrorsServiceStickyCookie] {
	return pulumix.Output[*MiddlewareSpecErrorsServiceStickyCookie]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) Elem() MiddlewareSpecErrorsServiceStickyCookieOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceStickyCookie) MiddlewareSpecErrorsServiceStickyCookie {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecErrorsServiceStickyCookie
		return ret
	}).(MiddlewareSpecErrorsServiceStickyCookieOutput)
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.HttpOnly
	}).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceStickyCookie) *int {
		if v == nil {
			return nil
		}
		return v.MaxAge
	}).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.Name
	}).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.SameSite
	}).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o MiddlewareSpecErrorsServiceStickyCookiePtrOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecErrorsServiceStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.Secure
	}).(pulumi.BoolPtrOutput)
}

// ForwardAuth holds the forward auth middleware configuration.
// This middleware delegates the request authentication to a Service.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
type MiddlewareSpecForwardAuth struct {
	// AddAuthCookiesToResponse defines the list of cookies to copy from the authentication server response to the response.
	AddAuthCookiesToResponse []string `pulumi:"addAuthCookiesToResponse"`
	// Address defines the authentication server address.
	Address *string `pulumi:"address"`
	// AuthRequestHeaders defines the list of the headers to copy from the request to the authentication server.
	// If not set or empty then all request headers are passed.
	AuthRequestHeaders []string `pulumi:"authRequestHeaders"`
	// AuthResponseHeaders defines the list of headers to copy from the authentication server response and set on forwarded request, replacing any existing conflicting headers.
	AuthResponseHeaders []string `pulumi:"authResponseHeaders"`
	// AuthResponseHeadersRegex defines the regex to match headers to copy from the authentication server response and set on forwarded request, after stripping all headers that match the regex.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/#authresponseheadersregex
	AuthResponseHeadersRegex *string `pulumi:"authResponseHeadersRegex"`
	// TLS defines the configuration used to secure the connection to the authentication server.
	Tls *MiddlewareSpecForwardAuthTls `pulumi:"tls"`
	// TrustForwardHeader defines whether to trust (ie: forward) all X-Forwarded-* headers.
	TrustForwardHeader *bool `pulumi:"trustForwardHeader"`
}

// MiddlewareSpecForwardAuthInput is an input type that accepts MiddlewareSpecForwardAuthArgs and MiddlewareSpecForwardAuthOutput values.
// You can construct a concrete instance of `MiddlewareSpecForwardAuthInput` via:
//
//	MiddlewareSpecForwardAuthArgs{...}
type MiddlewareSpecForwardAuthInput interface {
	pulumi.Input

	ToMiddlewareSpecForwardAuthOutput() MiddlewareSpecForwardAuthOutput
	ToMiddlewareSpecForwardAuthOutputWithContext(context.Context) MiddlewareSpecForwardAuthOutput
}

// ForwardAuth holds the forward auth middleware configuration.
// This middleware delegates the request authentication to a Service.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
type MiddlewareSpecForwardAuthArgs struct {
	// AddAuthCookiesToResponse defines the list of cookies to copy from the authentication server response to the response.
	AddAuthCookiesToResponse pulumi.StringArrayInput `pulumi:"addAuthCookiesToResponse"`
	// Address defines the authentication server address.
	Address pulumi.StringPtrInput `pulumi:"address"`
	// AuthRequestHeaders defines the list of the headers to copy from the request to the authentication server.
	// If not set or empty then all request headers are passed.
	AuthRequestHeaders pulumi.StringArrayInput `pulumi:"authRequestHeaders"`
	// AuthResponseHeaders defines the list of headers to copy from the authentication server response and set on forwarded request, replacing any existing conflicting headers.
	AuthResponseHeaders pulumi.StringArrayInput `pulumi:"authResponseHeaders"`
	// AuthResponseHeadersRegex defines the regex to match headers to copy from the authentication server response and set on forwarded request, after stripping all headers that match the regex.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/#authresponseheadersregex
	AuthResponseHeadersRegex pulumi.StringPtrInput `pulumi:"authResponseHeadersRegex"`
	// TLS defines the configuration used to secure the connection to the authentication server.
	Tls MiddlewareSpecForwardAuthTlsPtrInput `pulumi:"tls"`
	// TrustForwardHeader defines whether to trust (ie: forward) all X-Forwarded-* headers.
	TrustForwardHeader pulumi.BoolPtrInput `pulumi:"trustForwardHeader"`
}

func (MiddlewareSpecForwardAuthArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecForwardAuth)(nil)).Elem()
}

func (i MiddlewareSpecForwardAuthArgs) ToMiddlewareSpecForwardAuthOutput() MiddlewareSpecForwardAuthOutput {
	return i.ToMiddlewareSpecForwardAuthOutputWithContext(context.Background())
}

func (i MiddlewareSpecForwardAuthArgs) ToMiddlewareSpecForwardAuthOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecForwardAuthOutput)
}

func (i MiddlewareSpecForwardAuthArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecForwardAuth] {
	return pulumix.Output[MiddlewareSpecForwardAuth]{
		OutputState: i.ToMiddlewareSpecForwardAuthOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecForwardAuthArgs) ToMiddlewareSpecForwardAuthPtrOutput() MiddlewareSpecForwardAuthPtrOutput {
	return i.ToMiddlewareSpecForwardAuthPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecForwardAuthArgs) ToMiddlewareSpecForwardAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecForwardAuthOutput).ToMiddlewareSpecForwardAuthPtrOutputWithContext(ctx)
}

// MiddlewareSpecForwardAuthPtrInput is an input type that accepts MiddlewareSpecForwardAuthArgs, MiddlewareSpecForwardAuthPtr and MiddlewareSpecForwardAuthPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecForwardAuthPtrInput` via:
//
//	        MiddlewareSpecForwardAuthArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecForwardAuthPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecForwardAuthPtrOutput() MiddlewareSpecForwardAuthPtrOutput
	ToMiddlewareSpecForwardAuthPtrOutputWithContext(context.Context) MiddlewareSpecForwardAuthPtrOutput
}

type middlewareSpecForwardAuthPtrType MiddlewareSpecForwardAuthArgs

func MiddlewareSpecForwardAuthPtr(v *MiddlewareSpecForwardAuthArgs) MiddlewareSpecForwardAuthPtrInput {
	return (*middlewareSpecForwardAuthPtrType)(v)
}

func (*middlewareSpecForwardAuthPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecForwardAuth)(nil)).Elem()
}

func (i *middlewareSpecForwardAuthPtrType) ToMiddlewareSpecForwardAuthPtrOutput() MiddlewareSpecForwardAuthPtrOutput {
	return i.ToMiddlewareSpecForwardAuthPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecForwardAuthPtrType) ToMiddlewareSpecForwardAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecForwardAuthPtrOutput)
}

func (i *middlewareSpecForwardAuthPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecForwardAuth] {
	return pulumix.Output[*MiddlewareSpecForwardAuth]{
		OutputState: i.ToMiddlewareSpecForwardAuthPtrOutputWithContext(ctx).OutputState,
	}
}

// ForwardAuth holds the forward auth middleware configuration.
// This middleware delegates the request authentication to a Service.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/
type MiddlewareSpecForwardAuthOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecForwardAuthOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecForwardAuth)(nil)).Elem()
}

func (o MiddlewareSpecForwardAuthOutput) ToMiddlewareSpecForwardAuthOutput() MiddlewareSpecForwardAuthOutput {
	return o
}

func (o MiddlewareSpecForwardAuthOutput) ToMiddlewareSpecForwardAuthOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthOutput {
	return o
}

func (o MiddlewareSpecForwardAuthOutput) ToMiddlewareSpecForwardAuthPtrOutput() MiddlewareSpecForwardAuthPtrOutput {
	return o.ToMiddlewareSpecForwardAuthPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecForwardAuthOutput) ToMiddlewareSpecForwardAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecForwardAuth) *MiddlewareSpecForwardAuth {
		return &v
	}).(MiddlewareSpecForwardAuthPtrOutput)
}

func (o MiddlewareSpecForwardAuthOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecForwardAuth] {
	return pulumix.Output[MiddlewareSpecForwardAuth]{
		OutputState: o.OutputState,
	}
}

// AddAuthCookiesToResponse defines the list of cookies to copy from the authentication server response to the response.
func (o MiddlewareSpecForwardAuthOutput) AddAuthCookiesToResponse() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) []string { return v.AddAuthCookiesToResponse }).(pulumi.StringArrayOutput)
}

// Address defines the authentication server address.
func (o MiddlewareSpecForwardAuthOutput) Address() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) *string { return v.Address }).(pulumi.StringPtrOutput)
}

// AuthRequestHeaders defines the list of the headers to copy from the request to the authentication server.
// If not set or empty then all request headers are passed.
func (o MiddlewareSpecForwardAuthOutput) AuthRequestHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) []string { return v.AuthRequestHeaders }).(pulumi.StringArrayOutput)
}

// AuthResponseHeaders defines the list of headers to copy from the authentication server response and set on forwarded request, replacing any existing conflicting headers.
func (o MiddlewareSpecForwardAuthOutput) AuthResponseHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) []string { return v.AuthResponseHeaders }).(pulumi.StringArrayOutput)
}

// AuthResponseHeadersRegex defines the regex to match headers to copy from the authentication server response and set on forwarded request, after stripping all headers that match the regex.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/#authresponseheadersregex
func (o MiddlewareSpecForwardAuthOutput) AuthResponseHeadersRegex() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) *string { return v.AuthResponseHeadersRegex }).(pulumi.StringPtrOutput)
}

// TLS defines the configuration used to secure the connection to the authentication server.
func (o MiddlewareSpecForwardAuthOutput) Tls() MiddlewareSpecForwardAuthTlsPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) *MiddlewareSpecForwardAuthTls { return v.Tls }).(MiddlewareSpecForwardAuthTlsPtrOutput)
}

// TrustForwardHeader defines whether to trust (ie: forward) all X-Forwarded-* headers.
func (o MiddlewareSpecForwardAuthOutput) TrustForwardHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuth) *bool { return v.TrustForwardHeader }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecForwardAuthPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecForwardAuthPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecForwardAuth)(nil)).Elem()
}

func (o MiddlewareSpecForwardAuthPtrOutput) ToMiddlewareSpecForwardAuthPtrOutput() MiddlewareSpecForwardAuthPtrOutput {
	return o
}

func (o MiddlewareSpecForwardAuthPtrOutput) ToMiddlewareSpecForwardAuthPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthPtrOutput {
	return o
}

func (o MiddlewareSpecForwardAuthPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecForwardAuth] {
	return pulumix.Output[*MiddlewareSpecForwardAuth]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecForwardAuthPtrOutput) Elem() MiddlewareSpecForwardAuthOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) MiddlewareSpecForwardAuth {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecForwardAuth
		return ret
	}).(MiddlewareSpecForwardAuthOutput)
}

// AddAuthCookiesToResponse defines the list of cookies to copy from the authentication server response to the response.
func (o MiddlewareSpecForwardAuthPtrOutput) AddAuthCookiesToResponse() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) []string {
		if v == nil {
			return nil
		}
		return v.AddAuthCookiesToResponse
	}).(pulumi.StringArrayOutput)
}

// Address defines the authentication server address.
func (o MiddlewareSpecForwardAuthPtrOutput) Address() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) *string {
		if v == nil {
			return nil
		}
		return v.Address
	}).(pulumi.StringPtrOutput)
}

// AuthRequestHeaders defines the list of the headers to copy from the request to the authentication server.
// If not set or empty then all request headers are passed.
func (o MiddlewareSpecForwardAuthPtrOutput) AuthRequestHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) []string {
		if v == nil {
			return nil
		}
		return v.AuthRequestHeaders
	}).(pulumi.StringArrayOutput)
}

// AuthResponseHeaders defines the list of headers to copy from the authentication server response and set on forwarded request, replacing any existing conflicting headers.
func (o MiddlewareSpecForwardAuthPtrOutput) AuthResponseHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) []string {
		if v == nil {
			return nil
		}
		return v.AuthResponseHeaders
	}).(pulumi.StringArrayOutput)
}

// AuthResponseHeadersRegex defines the regex to match headers to copy from the authentication server response and set on forwarded request, after stripping all headers that match the regex.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/forwardauth/#authresponseheadersregex
func (o MiddlewareSpecForwardAuthPtrOutput) AuthResponseHeadersRegex() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) *string {
		if v == nil {
			return nil
		}
		return v.AuthResponseHeadersRegex
	}).(pulumi.StringPtrOutput)
}

// TLS defines the configuration used to secure the connection to the authentication server.
func (o MiddlewareSpecForwardAuthPtrOutput) Tls() MiddlewareSpecForwardAuthTlsPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) *MiddlewareSpecForwardAuthTls {
		if v == nil {
			return nil
		}
		return v.Tls
	}).(MiddlewareSpecForwardAuthTlsPtrOutput)
}

// TrustForwardHeader defines whether to trust (ie: forward) all X-Forwarded-* headers.
func (o MiddlewareSpecForwardAuthPtrOutput) TrustForwardHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuth) *bool {
		if v == nil {
			return nil
		}
		return v.TrustForwardHeader
	}).(pulumi.BoolPtrOutput)
}

// TLS defines the configuration used to secure the connection to the authentication server.
type MiddlewareSpecForwardAuthTls struct {
	// Deprecated: TLS client authentication is a server side option (see https://github.com/golang/go/blob/740a490f71d026bb7d2d13cb8fa2d6d6e0572b70/src/crypto/tls/common.go#L634).
	CaOptional *bool `pulumi:"caOptional"`
	// CASecret is the name of the referenced Kubernetes Secret containing the CA to validate the server certificate.
	// The CA certificate is extracted from key `tls.ca` or `ca.crt`.
	CaSecret *string `pulumi:"caSecret"`
	// CertSecret is the name of the referenced Kubernetes Secret containing the client certificate.
	// The client certificate is extracted from the keys `tls.crt` and `tls.key`.
	CertSecret *string `pulumi:"certSecret"`
	// InsecureSkipVerify defines whether the server certificates should be validated.
	InsecureSkipVerify *bool `pulumi:"insecureSkipVerify"`
}

// MiddlewareSpecForwardAuthTlsInput is an input type that accepts MiddlewareSpecForwardAuthTlsArgs and MiddlewareSpecForwardAuthTlsOutput values.
// You can construct a concrete instance of `MiddlewareSpecForwardAuthTlsInput` via:
//
//	MiddlewareSpecForwardAuthTlsArgs{...}
type MiddlewareSpecForwardAuthTlsInput interface {
	pulumi.Input

	ToMiddlewareSpecForwardAuthTlsOutput() MiddlewareSpecForwardAuthTlsOutput
	ToMiddlewareSpecForwardAuthTlsOutputWithContext(context.Context) MiddlewareSpecForwardAuthTlsOutput
}

// TLS defines the configuration used to secure the connection to the authentication server.
type MiddlewareSpecForwardAuthTlsArgs struct {
	// Deprecated: TLS client authentication is a server side option (see https://github.com/golang/go/blob/740a490f71d026bb7d2d13cb8fa2d6d6e0572b70/src/crypto/tls/common.go#L634).
	CaOptional pulumi.BoolPtrInput `pulumi:"caOptional"`
	// CASecret is the name of the referenced Kubernetes Secret containing the CA to validate the server certificate.
	// The CA certificate is extracted from key `tls.ca` or `ca.crt`.
	CaSecret pulumi.StringPtrInput `pulumi:"caSecret"`
	// CertSecret is the name of the referenced Kubernetes Secret containing the client certificate.
	// The client certificate is extracted from the keys `tls.crt` and `tls.key`.
	CertSecret pulumi.StringPtrInput `pulumi:"certSecret"`
	// InsecureSkipVerify defines whether the server certificates should be validated.
	InsecureSkipVerify pulumi.BoolPtrInput `pulumi:"insecureSkipVerify"`
}

func (MiddlewareSpecForwardAuthTlsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecForwardAuthTls)(nil)).Elem()
}

func (i MiddlewareSpecForwardAuthTlsArgs) ToMiddlewareSpecForwardAuthTlsOutput() MiddlewareSpecForwardAuthTlsOutput {
	return i.ToMiddlewareSpecForwardAuthTlsOutputWithContext(context.Background())
}

func (i MiddlewareSpecForwardAuthTlsArgs) ToMiddlewareSpecForwardAuthTlsOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthTlsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecForwardAuthTlsOutput)
}

func (i MiddlewareSpecForwardAuthTlsArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecForwardAuthTls] {
	return pulumix.Output[MiddlewareSpecForwardAuthTls]{
		OutputState: i.ToMiddlewareSpecForwardAuthTlsOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecForwardAuthTlsArgs) ToMiddlewareSpecForwardAuthTlsPtrOutput() MiddlewareSpecForwardAuthTlsPtrOutput {
	return i.ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecForwardAuthTlsArgs) ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecForwardAuthTlsOutput).ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(ctx)
}

// MiddlewareSpecForwardAuthTlsPtrInput is an input type that accepts MiddlewareSpecForwardAuthTlsArgs, MiddlewareSpecForwardAuthTlsPtr and MiddlewareSpecForwardAuthTlsPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecForwardAuthTlsPtrInput` via:
//
//	        MiddlewareSpecForwardAuthTlsArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecForwardAuthTlsPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecForwardAuthTlsPtrOutput() MiddlewareSpecForwardAuthTlsPtrOutput
	ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(context.Context) MiddlewareSpecForwardAuthTlsPtrOutput
}

type middlewareSpecForwardAuthTlsPtrType MiddlewareSpecForwardAuthTlsArgs

func MiddlewareSpecForwardAuthTlsPtr(v *MiddlewareSpecForwardAuthTlsArgs) MiddlewareSpecForwardAuthTlsPtrInput {
	return (*middlewareSpecForwardAuthTlsPtrType)(v)
}

func (*middlewareSpecForwardAuthTlsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecForwardAuthTls)(nil)).Elem()
}

func (i *middlewareSpecForwardAuthTlsPtrType) ToMiddlewareSpecForwardAuthTlsPtrOutput() MiddlewareSpecForwardAuthTlsPtrOutput {
	return i.ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecForwardAuthTlsPtrType) ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecForwardAuthTlsPtrOutput)
}

func (i *middlewareSpecForwardAuthTlsPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecForwardAuthTls] {
	return pulumix.Output[*MiddlewareSpecForwardAuthTls]{
		OutputState: i.ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(ctx).OutputState,
	}
}

// TLS defines the configuration used to secure the connection to the authentication server.
type MiddlewareSpecForwardAuthTlsOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecForwardAuthTlsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecForwardAuthTls)(nil)).Elem()
}

func (o MiddlewareSpecForwardAuthTlsOutput) ToMiddlewareSpecForwardAuthTlsOutput() MiddlewareSpecForwardAuthTlsOutput {
	return o
}

func (o MiddlewareSpecForwardAuthTlsOutput) ToMiddlewareSpecForwardAuthTlsOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthTlsOutput {
	return o
}

func (o MiddlewareSpecForwardAuthTlsOutput) ToMiddlewareSpecForwardAuthTlsPtrOutput() MiddlewareSpecForwardAuthTlsPtrOutput {
	return o.ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecForwardAuthTlsOutput) ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthTlsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecForwardAuthTls) *MiddlewareSpecForwardAuthTls {
		return &v
	}).(MiddlewareSpecForwardAuthTlsPtrOutput)
}

func (o MiddlewareSpecForwardAuthTlsOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecForwardAuthTls] {
	return pulumix.Output[MiddlewareSpecForwardAuthTls]{
		OutputState: o.OutputState,
	}
}

// Deprecated: TLS client authentication is a server side option (see https://github.com/golang/go/blob/740a490f71d026bb7d2d13cb8fa2d6d6e0572b70/src/crypto/tls/common.go#L634).
func (o MiddlewareSpecForwardAuthTlsOutput) CaOptional() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuthTls) *bool { return v.CaOptional }).(pulumi.BoolPtrOutput)
}

// CASecret is the name of the referenced Kubernetes Secret containing the CA to validate the server certificate.
// The CA certificate is extracted from key `tls.ca` or `ca.crt`.
func (o MiddlewareSpecForwardAuthTlsOutput) CaSecret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuthTls) *string { return v.CaSecret }).(pulumi.StringPtrOutput)
}

// CertSecret is the name of the referenced Kubernetes Secret containing the client certificate.
// The client certificate is extracted from the keys `tls.crt` and `tls.key`.
func (o MiddlewareSpecForwardAuthTlsOutput) CertSecret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuthTls) *string { return v.CertSecret }).(pulumi.StringPtrOutput)
}

// InsecureSkipVerify defines whether the server certificates should be validated.
func (o MiddlewareSpecForwardAuthTlsOutput) InsecureSkipVerify() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecForwardAuthTls) *bool { return v.InsecureSkipVerify }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecForwardAuthTlsPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecForwardAuthTlsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecForwardAuthTls)(nil)).Elem()
}

func (o MiddlewareSpecForwardAuthTlsPtrOutput) ToMiddlewareSpecForwardAuthTlsPtrOutput() MiddlewareSpecForwardAuthTlsPtrOutput {
	return o
}

func (o MiddlewareSpecForwardAuthTlsPtrOutput) ToMiddlewareSpecForwardAuthTlsPtrOutputWithContext(ctx context.Context) MiddlewareSpecForwardAuthTlsPtrOutput {
	return o
}

func (o MiddlewareSpecForwardAuthTlsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecForwardAuthTls] {
	return pulumix.Output[*MiddlewareSpecForwardAuthTls]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecForwardAuthTlsPtrOutput) Elem() MiddlewareSpecForwardAuthTlsOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuthTls) MiddlewareSpecForwardAuthTls {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecForwardAuthTls
		return ret
	}).(MiddlewareSpecForwardAuthTlsOutput)
}

// Deprecated: TLS client authentication is a server side option (see https://github.com/golang/go/blob/740a490f71d026bb7d2d13cb8fa2d6d6e0572b70/src/crypto/tls/common.go#L634).
func (o MiddlewareSpecForwardAuthTlsPtrOutput) CaOptional() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuthTls) *bool {
		if v == nil {
			return nil
		}
		return v.CaOptional
	}).(pulumi.BoolPtrOutput)
}

// CASecret is the name of the referenced Kubernetes Secret containing the CA to validate the server certificate.
// The CA certificate is extracted from key `tls.ca` or `ca.crt`.
func (o MiddlewareSpecForwardAuthTlsPtrOutput) CaSecret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuthTls) *string {
		if v == nil {
			return nil
		}
		return v.CaSecret
	}).(pulumi.StringPtrOutput)
}

// CertSecret is the name of the referenced Kubernetes Secret containing the client certificate.
// The client certificate is extracted from the keys `tls.crt` and `tls.key`.
func (o MiddlewareSpecForwardAuthTlsPtrOutput) CertSecret() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuthTls) *string {
		if v == nil {
			return nil
		}
		return v.CertSecret
	}).(pulumi.StringPtrOutput)
}

// InsecureSkipVerify defines whether the server certificates should be validated.
func (o MiddlewareSpecForwardAuthTlsPtrOutput) InsecureSkipVerify() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecForwardAuthTls) *bool {
		if v == nil {
			return nil
		}
		return v.InsecureSkipVerify
	}).(pulumi.BoolPtrOutput)
}

// GrpcWeb holds the gRPC web middleware configuration.
// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
type MiddlewareSpecGrpcWeb struct {
	// AllowOrigins is a list of allowable origins.
	// Can also be a wildcard origin "*".
	AllowOrigins []string `pulumi:"allowOrigins"`
}

// MiddlewareSpecGrpcWebInput is an input type that accepts MiddlewareSpecGrpcWebArgs and MiddlewareSpecGrpcWebOutput values.
// You can construct a concrete instance of `MiddlewareSpecGrpcWebInput` via:
//
//	MiddlewareSpecGrpcWebArgs{...}
type MiddlewareSpecGrpcWebInput interface {
	pulumi.Input

	ToMiddlewareSpecGrpcWebOutput() MiddlewareSpecGrpcWebOutput
	ToMiddlewareSpecGrpcWebOutputWithContext(context.Context) MiddlewareSpecGrpcWebOutput
}

// GrpcWeb holds the gRPC web middleware configuration.
// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
type MiddlewareSpecGrpcWebArgs struct {
	// AllowOrigins is a list of allowable origins.
	// Can also be a wildcard origin "*".
	AllowOrigins pulumi.StringArrayInput `pulumi:"allowOrigins"`
}

func (MiddlewareSpecGrpcWebArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecGrpcWeb)(nil)).Elem()
}

func (i MiddlewareSpecGrpcWebArgs) ToMiddlewareSpecGrpcWebOutput() MiddlewareSpecGrpcWebOutput {
	return i.ToMiddlewareSpecGrpcWebOutputWithContext(context.Background())
}

func (i MiddlewareSpecGrpcWebArgs) ToMiddlewareSpecGrpcWebOutputWithContext(ctx context.Context) MiddlewareSpecGrpcWebOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecGrpcWebOutput)
}

func (i MiddlewareSpecGrpcWebArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecGrpcWeb] {
	return pulumix.Output[MiddlewareSpecGrpcWeb]{
		OutputState: i.ToMiddlewareSpecGrpcWebOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecGrpcWebArgs) ToMiddlewareSpecGrpcWebPtrOutput() MiddlewareSpecGrpcWebPtrOutput {
	return i.ToMiddlewareSpecGrpcWebPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecGrpcWebArgs) ToMiddlewareSpecGrpcWebPtrOutputWithContext(ctx context.Context) MiddlewareSpecGrpcWebPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecGrpcWebOutput).ToMiddlewareSpecGrpcWebPtrOutputWithContext(ctx)
}

// MiddlewareSpecGrpcWebPtrInput is an input type that accepts MiddlewareSpecGrpcWebArgs, MiddlewareSpecGrpcWebPtr and MiddlewareSpecGrpcWebPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecGrpcWebPtrInput` via:
//
//	        MiddlewareSpecGrpcWebArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecGrpcWebPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecGrpcWebPtrOutput() MiddlewareSpecGrpcWebPtrOutput
	ToMiddlewareSpecGrpcWebPtrOutputWithContext(context.Context) MiddlewareSpecGrpcWebPtrOutput
}

type middlewareSpecGrpcWebPtrType MiddlewareSpecGrpcWebArgs

func MiddlewareSpecGrpcWebPtr(v *MiddlewareSpecGrpcWebArgs) MiddlewareSpecGrpcWebPtrInput {
	return (*middlewareSpecGrpcWebPtrType)(v)
}

func (*middlewareSpecGrpcWebPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecGrpcWeb)(nil)).Elem()
}

func (i *middlewareSpecGrpcWebPtrType) ToMiddlewareSpecGrpcWebPtrOutput() MiddlewareSpecGrpcWebPtrOutput {
	return i.ToMiddlewareSpecGrpcWebPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecGrpcWebPtrType) ToMiddlewareSpecGrpcWebPtrOutputWithContext(ctx context.Context) MiddlewareSpecGrpcWebPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecGrpcWebPtrOutput)
}

func (i *middlewareSpecGrpcWebPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecGrpcWeb] {
	return pulumix.Output[*MiddlewareSpecGrpcWeb]{
		OutputState: i.ToMiddlewareSpecGrpcWebPtrOutputWithContext(ctx).OutputState,
	}
}

// GrpcWeb holds the gRPC web middleware configuration.
// This middleware converts a gRPC web request to an HTTP/2 gRPC request.
type MiddlewareSpecGrpcWebOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecGrpcWebOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecGrpcWeb)(nil)).Elem()
}

func (o MiddlewareSpecGrpcWebOutput) ToMiddlewareSpecGrpcWebOutput() MiddlewareSpecGrpcWebOutput {
	return o
}

func (o MiddlewareSpecGrpcWebOutput) ToMiddlewareSpecGrpcWebOutputWithContext(ctx context.Context) MiddlewareSpecGrpcWebOutput {
	return o
}

func (o MiddlewareSpecGrpcWebOutput) ToMiddlewareSpecGrpcWebPtrOutput() MiddlewareSpecGrpcWebPtrOutput {
	return o.ToMiddlewareSpecGrpcWebPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecGrpcWebOutput) ToMiddlewareSpecGrpcWebPtrOutputWithContext(ctx context.Context) MiddlewareSpecGrpcWebPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecGrpcWeb) *MiddlewareSpecGrpcWeb {
		return &v
	}).(MiddlewareSpecGrpcWebPtrOutput)
}

func (o MiddlewareSpecGrpcWebOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecGrpcWeb] {
	return pulumix.Output[MiddlewareSpecGrpcWeb]{
		OutputState: o.OutputState,
	}
}

// AllowOrigins is a list of allowable origins.
// Can also be a wildcard origin "*".
func (o MiddlewareSpecGrpcWebOutput) AllowOrigins() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecGrpcWeb) []string { return v.AllowOrigins }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecGrpcWebPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecGrpcWebPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecGrpcWeb)(nil)).Elem()
}

func (o MiddlewareSpecGrpcWebPtrOutput) ToMiddlewareSpecGrpcWebPtrOutput() MiddlewareSpecGrpcWebPtrOutput {
	return o
}

func (o MiddlewareSpecGrpcWebPtrOutput) ToMiddlewareSpecGrpcWebPtrOutputWithContext(ctx context.Context) MiddlewareSpecGrpcWebPtrOutput {
	return o
}

func (o MiddlewareSpecGrpcWebPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecGrpcWeb] {
	return pulumix.Output[*MiddlewareSpecGrpcWeb]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecGrpcWebPtrOutput) Elem() MiddlewareSpecGrpcWebOutput {
	return o.ApplyT(func(v *MiddlewareSpecGrpcWeb) MiddlewareSpecGrpcWeb {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecGrpcWeb
		return ret
	}).(MiddlewareSpecGrpcWebOutput)
}

// AllowOrigins is a list of allowable origins.
// Can also be a wildcard origin "*".
func (o MiddlewareSpecGrpcWebPtrOutput) AllowOrigins() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecGrpcWeb) []string {
		if v == nil {
			return nil
		}
		return v.AllowOrigins
	}).(pulumi.StringArrayOutput)
}

// Headers holds the headers middleware configuration.
// This middleware manages the requests and responses headers.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
type MiddlewareSpecHeaders struct {
	// AccessControlAllowCredentials defines whether the request can include user credentials.
	AccessControlAllowCredentials *bool `pulumi:"accessControlAllowCredentials"`
	// AccessControlAllowHeaders defines the Access-Control-Request-Headers values sent in preflight response.
	AccessControlAllowHeaders []string `pulumi:"accessControlAllowHeaders"`
	// AccessControlAllowMethods defines the Access-Control-Request-Method values sent in preflight response.
	AccessControlAllowMethods []string `pulumi:"accessControlAllowMethods"`
	// AccessControlAllowOriginList is a list of allowable origins. Can also be a wildcard origin "*".
	AccessControlAllowOriginList []string `pulumi:"accessControlAllowOriginList"`
	// AccessControlAllowOriginListRegex is a list of allowable origins written following the Regular Expression syntax (https://golang.org/pkg/regexp/).
	AccessControlAllowOriginListRegex []string `pulumi:"accessControlAllowOriginListRegex"`
	// AccessControlExposeHeaders defines the Access-Control-Expose-Headers values sent in preflight response.
	AccessControlExposeHeaders []string `pulumi:"accessControlExposeHeaders"`
	// AccessControlMaxAge defines the time that a preflight request may be cached.
	AccessControlMaxAge *int `pulumi:"accessControlMaxAge"`
	// AddVaryHeader defines whether the Vary header is automatically added/updated when the AccessControlAllowOriginList is set.
	AddVaryHeader *bool `pulumi:"addVaryHeader"`
	// AllowedHosts defines the fully qualified list of allowed domain names.
	AllowedHosts []string `pulumi:"allowedHosts"`
	// BrowserXSSFilter defines whether to add the X-XSS-Protection header with the value 1; mode=block.
	BrowserXssFilter *bool `pulumi:"browserXssFilter"`
	// ContentSecurityPolicy defines the Content-Security-Policy header value.
	ContentSecurityPolicy *string `pulumi:"contentSecurityPolicy"`
	// ContentSecurityPolicyReportOnly defines the Content-Security-Policy-Report-Only header value.
	ContentSecurityPolicyReportOnly *string `pulumi:"contentSecurityPolicyReportOnly"`
	// ContentTypeNosniff defines whether to add the X-Content-Type-Options header with the nosniff value.
	ContentTypeNosniff *bool `pulumi:"contentTypeNosniff"`
	// CustomBrowserXSSValue defines the X-XSS-Protection header value.
	// This overrides the BrowserXssFilter option.
	CustomBrowserXSSValue *string `pulumi:"customBrowserXSSValue"`
	// CustomFrameOptionsValue defines the X-Frame-Options header value.
	// This overrides the FrameDeny option.
	CustomFrameOptionsValue *string `pulumi:"customFrameOptionsValue"`
	// CustomRequestHeaders defines the header names and values to apply to the request.
	CustomRequestHeaders map[string]string `pulumi:"customRequestHeaders"`
	// CustomResponseHeaders defines the header names and values to apply to the response.
	CustomResponseHeaders map[string]string `pulumi:"customResponseHeaders"`
	// Deprecated: FeaturePolicy option is deprecated, please use PermissionsPolicy instead.
	FeaturePolicy *string `pulumi:"featurePolicy"`
	// ForceSTSHeader defines whether to add the STS header even when the connection is HTTP.
	ForceSTSHeader *bool `pulumi:"forceSTSHeader"`
	// FrameDeny defines whether to add the X-Frame-Options header with the DENY value.
	FrameDeny *bool `pulumi:"frameDeny"`
	// HostsProxyHeaders defines the header keys that may hold a proxied hostname value for the request.
	HostsProxyHeaders []string `pulumi:"hostsProxyHeaders"`
	// IsDevelopment defines whether to mitigate the unwanted effects of the AllowedHosts, SSL, and STS options when developing.
	// Usually testing takes place using HTTP, not HTTPS, and on localhost, not your production domain.
	// If you would like your development environment to mimic production with complete Host blocking, SSL redirects,
	// and STS headers, leave this as false.
	IsDevelopment *bool `pulumi:"isDevelopment"`
	// PermissionsPolicy defines the Permissions-Policy header value.
	// This allows sites to control browser features.
	PermissionsPolicy *string `pulumi:"permissionsPolicy"`
	// PublicKey is the public key that implements HPKP to prevent MITM attacks with forged certificates.
	PublicKey *string `pulumi:"publicKey"`
	// ReferrerPolicy defines the Referrer-Policy header value.
	// This allows sites to control whether browsers forward the Referer header to other sites.
	ReferrerPolicy *string `pulumi:"referrerPolicy"`
	// Deprecated: SSLForceHost option is deprecated, please use RedirectRegex instead.
	SslForceHost *bool `pulumi:"sslForceHost"`
	// Deprecated: SSLHost option is deprecated, please use RedirectRegex instead.
	SslHost *string `pulumi:"sslHost"`
	// SSLProxyHeaders defines the header keys with associated values that would indicate a valid HTTPS request.
	// It can be useful when using other proxies (example: "X-Forwarded-Proto": "https").
	SslProxyHeaders map[string]string `pulumi:"sslProxyHeaders"`
	// Deprecated: SSLRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
	SslRedirect *bool `pulumi:"sslRedirect"`
	// Deprecated: SSLTemporaryRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
	SslTemporaryRedirect *bool `pulumi:"sslTemporaryRedirect"`
	// STSIncludeSubdomains defines whether the includeSubDomains directive is appended to the Strict-Transport-Security header.
	StsIncludeSubdomains *bool `pulumi:"stsIncludeSubdomains"`
	// STSPreload defines whether the preload flag is appended to the Strict-Transport-Security header.
	StsPreload *bool `pulumi:"stsPreload"`
	// STSSeconds defines the max-age of the Strict-Transport-Security header.
	// If set to 0, the header is not set.
	StsSeconds *int `pulumi:"stsSeconds"`
}

// MiddlewareSpecHeadersInput is an input type that accepts MiddlewareSpecHeadersArgs and MiddlewareSpecHeadersOutput values.
// You can construct a concrete instance of `MiddlewareSpecHeadersInput` via:
//
//	MiddlewareSpecHeadersArgs{...}
type MiddlewareSpecHeadersInput interface {
	pulumi.Input

	ToMiddlewareSpecHeadersOutput() MiddlewareSpecHeadersOutput
	ToMiddlewareSpecHeadersOutputWithContext(context.Context) MiddlewareSpecHeadersOutput
}

// Headers holds the headers middleware configuration.
// This middleware manages the requests and responses headers.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
type MiddlewareSpecHeadersArgs struct {
	// AccessControlAllowCredentials defines whether the request can include user credentials.
	AccessControlAllowCredentials pulumi.BoolPtrInput `pulumi:"accessControlAllowCredentials"`
	// AccessControlAllowHeaders defines the Access-Control-Request-Headers values sent in preflight response.
	AccessControlAllowHeaders pulumi.StringArrayInput `pulumi:"accessControlAllowHeaders"`
	// AccessControlAllowMethods defines the Access-Control-Request-Method values sent in preflight response.
	AccessControlAllowMethods pulumi.StringArrayInput `pulumi:"accessControlAllowMethods"`
	// AccessControlAllowOriginList is a list of allowable origins. Can also be a wildcard origin "*".
	AccessControlAllowOriginList pulumi.StringArrayInput `pulumi:"accessControlAllowOriginList"`
	// AccessControlAllowOriginListRegex is a list of allowable origins written following the Regular Expression syntax (https://golang.org/pkg/regexp/).
	AccessControlAllowOriginListRegex pulumi.StringArrayInput `pulumi:"accessControlAllowOriginListRegex"`
	// AccessControlExposeHeaders defines the Access-Control-Expose-Headers values sent in preflight response.
	AccessControlExposeHeaders pulumi.StringArrayInput `pulumi:"accessControlExposeHeaders"`
	// AccessControlMaxAge defines the time that a preflight request may be cached.
	AccessControlMaxAge pulumi.IntPtrInput `pulumi:"accessControlMaxAge"`
	// AddVaryHeader defines whether the Vary header is automatically added/updated when the AccessControlAllowOriginList is set.
	AddVaryHeader pulumi.BoolPtrInput `pulumi:"addVaryHeader"`
	// AllowedHosts defines the fully qualified list of allowed domain names.
	AllowedHosts pulumi.StringArrayInput `pulumi:"allowedHosts"`
	// BrowserXSSFilter defines whether to add the X-XSS-Protection header with the value 1; mode=block.
	BrowserXssFilter pulumi.BoolPtrInput `pulumi:"browserXssFilter"`
	// ContentSecurityPolicy defines the Content-Security-Policy header value.
	ContentSecurityPolicy pulumi.StringPtrInput `pulumi:"contentSecurityPolicy"`
	// ContentSecurityPolicyReportOnly defines the Content-Security-Policy-Report-Only header value.
	ContentSecurityPolicyReportOnly pulumi.StringPtrInput `pulumi:"contentSecurityPolicyReportOnly"`
	// ContentTypeNosniff defines whether to add the X-Content-Type-Options header with the nosniff value.
	ContentTypeNosniff pulumi.BoolPtrInput `pulumi:"contentTypeNosniff"`
	// CustomBrowserXSSValue defines the X-XSS-Protection header value.
	// This overrides the BrowserXssFilter option.
	CustomBrowserXSSValue pulumi.StringPtrInput `pulumi:"customBrowserXSSValue"`
	// CustomFrameOptionsValue defines the X-Frame-Options header value.
	// This overrides the FrameDeny option.
	CustomFrameOptionsValue pulumi.StringPtrInput `pulumi:"customFrameOptionsValue"`
	// CustomRequestHeaders defines the header names and values to apply to the request.
	CustomRequestHeaders pulumi.StringMapInput `pulumi:"customRequestHeaders"`
	// CustomResponseHeaders defines the header names and values to apply to the response.
	CustomResponseHeaders pulumi.StringMapInput `pulumi:"customResponseHeaders"`
	// Deprecated: FeaturePolicy option is deprecated, please use PermissionsPolicy instead.
	FeaturePolicy pulumi.StringPtrInput `pulumi:"featurePolicy"`
	// ForceSTSHeader defines whether to add the STS header even when the connection is HTTP.
	ForceSTSHeader pulumi.BoolPtrInput `pulumi:"forceSTSHeader"`
	// FrameDeny defines whether to add the X-Frame-Options header with the DENY value.
	FrameDeny pulumi.BoolPtrInput `pulumi:"frameDeny"`
	// HostsProxyHeaders defines the header keys that may hold a proxied hostname value for the request.
	HostsProxyHeaders pulumi.StringArrayInput `pulumi:"hostsProxyHeaders"`
	// IsDevelopment defines whether to mitigate the unwanted effects of the AllowedHosts, SSL, and STS options when developing.
	// Usually testing takes place using HTTP, not HTTPS, and on localhost, not your production domain.
	// If you would like your development environment to mimic production with complete Host blocking, SSL redirects,
	// and STS headers, leave this as false.
	IsDevelopment pulumi.BoolPtrInput `pulumi:"isDevelopment"`
	// PermissionsPolicy defines the Permissions-Policy header value.
	// This allows sites to control browser features.
	PermissionsPolicy pulumi.StringPtrInput `pulumi:"permissionsPolicy"`
	// PublicKey is the public key that implements HPKP to prevent MITM attacks with forged certificates.
	PublicKey pulumi.StringPtrInput `pulumi:"publicKey"`
	// ReferrerPolicy defines the Referrer-Policy header value.
	// This allows sites to control whether browsers forward the Referer header to other sites.
	ReferrerPolicy pulumi.StringPtrInput `pulumi:"referrerPolicy"`
	// Deprecated: SSLForceHost option is deprecated, please use RedirectRegex instead.
	SslForceHost pulumi.BoolPtrInput `pulumi:"sslForceHost"`
	// Deprecated: SSLHost option is deprecated, please use RedirectRegex instead.
	SslHost pulumi.StringPtrInput `pulumi:"sslHost"`
	// SSLProxyHeaders defines the header keys with associated values that would indicate a valid HTTPS request.
	// It can be useful when using other proxies (example: "X-Forwarded-Proto": "https").
	SslProxyHeaders pulumi.StringMapInput `pulumi:"sslProxyHeaders"`
	// Deprecated: SSLRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
	SslRedirect pulumi.BoolPtrInput `pulumi:"sslRedirect"`
	// Deprecated: SSLTemporaryRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
	SslTemporaryRedirect pulumi.BoolPtrInput `pulumi:"sslTemporaryRedirect"`
	// STSIncludeSubdomains defines whether the includeSubDomains directive is appended to the Strict-Transport-Security header.
	StsIncludeSubdomains pulumi.BoolPtrInput `pulumi:"stsIncludeSubdomains"`
	// STSPreload defines whether the preload flag is appended to the Strict-Transport-Security header.
	StsPreload pulumi.BoolPtrInput `pulumi:"stsPreload"`
	// STSSeconds defines the max-age of the Strict-Transport-Security header.
	// If set to 0, the header is not set.
	StsSeconds pulumi.IntPtrInput `pulumi:"stsSeconds"`
}

func (MiddlewareSpecHeadersArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecHeaders)(nil)).Elem()
}

func (i MiddlewareSpecHeadersArgs) ToMiddlewareSpecHeadersOutput() MiddlewareSpecHeadersOutput {
	return i.ToMiddlewareSpecHeadersOutputWithContext(context.Background())
}

func (i MiddlewareSpecHeadersArgs) ToMiddlewareSpecHeadersOutputWithContext(ctx context.Context) MiddlewareSpecHeadersOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecHeadersOutput)
}

func (i MiddlewareSpecHeadersArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecHeaders] {
	return pulumix.Output[MiddlewareSpecHeaders]{
		OutputState: i.ToMiddlewareSpecHeadersOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecHeadersArgs) ToMiddlewareSpecHeadersPtrOutput() MiddlewareSpecHeadersPtrOutput {
	return i.ToMiddlewareSpecHeadersPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecHeadersArgs) ToMiddlewareSpecHeadersPtrOutputWithContext(ctx context.Context) MiddlewareSpecHeadersPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecHeadersOutput).ToMiddlewareSpecHeadersPtrOutputWithContext(ctx)
}

// MiddlewareSpecHeadersPtrInput is an input type that accepts MiddlewareSpecHeadersArgs, MiddlewareSpecHeadersPtr and MiddlewareSpecHeadersPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecHeadersPtrInput` via:
//
//	        MiddlewareSpecHeadersArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecHeadersPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecHeadersPtrOutput() MiddlewareSpecHeadersPtrOutput
	ToMiddlewareSpecHeadersPtrOutputWithContext(context.Context) MiddlewareSpecHeadersPtrOutput
}

type middlewareSpecHeadersPtrType MiddlewareSpecHeadersArgs

func MiddlewareSpecHeadersPtr(v *MiddlewareSpecHeadersArgs) MiddlewareSpecHeadersPtrInput {
	return (*middlewareSpecHeadersPtrType)(v)
}

func (*middlewareSpecHeadersPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecHeaders)(nil)).Elem()
}

func (i *middlewareSpecHeadersPtrType) ToMiddlewareSpecHeadersPtrOutput() MiddlewareSpecHeadersPtrOutput {
	return i.ToMiddlewareSpecHeadersPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecHeadersPtrType) ToMiddlewareSpecHeadersPtrOutputWithContext(ctx context.Context) MiddlewareSpecHeadersPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecHeadersPtrOutput)
}

func (i *middlewareSpecHeadersPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecHeaders] {
	return pulumix.Output[*MiddlewareSpecHeaders]{
		OutputState: i.ToMiddlewareSpecHeadersPtrOutputWithContext(ctx).OutputState,
	}
}

// Headers holds the headers middleware configuration.
// This middleware manages the requests and responses headers.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/headers/#customrequestheaders
type MiddlewareSpecHeadersOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecHeadersOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecHeaders)(nil)).Elem()
}

func (o MiddlewareSpecHeadersOutput) ToMiddlewareSpecHeadersOutput() MiddlewareSpecHeadersOutput {
	return o
}

func (o MiddlewareSpecHeadersOutput) ToMiddlewareSpecHeadersOutputWithContext(ctx context.Context) MiddlewareSpecHeadersOutput {
	return o
}

func (o MiddlewareSpecHeadersOutput) ToMiddlewareSpecHeadersPtrOutput() MiddlewareSpecHeadersPtrOutput {
	return o.ToMiddlewareSpecHeadersPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecHeadersOutput) ToMiddlewareSpecHeadersPtrOutputWithContext(ctx context.Context) MiddlewareSpecHeadersPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecHeaders) *MiddlewareSpecHeaders {
		return &v
	}).(MiddlewareSpecHeadersPtrOutput)
}

func (o MiddlewareSpecHeadersOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecHeaders] {
	return pulumix.Output[MiddlewareSpecHeaders]{
		OutputState: o.OutputState,
	}
}

// AccessControlAllowCredentials defines whether the request can include user credentials.
func (o MiddlewareSpecHeadersOutput) AccessControlAllowCredentials() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.AccessControlAllowCredentials }).(pulumi.BoolPtrOutput)
}

// AccessControlAllowHeaders defines the Access-Control-Request-Headers values sent in preflight response.
func (o MiddlewareSpecHeadersOutput) AccessControlAllowHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.AccessControlAllowHeaders }).(pulumi.StringArrayOutput)
}

// AccessControlAllowMethods defines the Access-Control-Request-Method values sent in preflight response.
func (o MiddlewareSpecHeadersOutput) AccessControlAllowMethods() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.AccessControlAllowMethods }).(pulumi.StringArrayOutput)
}

// AccessControlAllowOriginList is a list of allowable origins. Can also be a wildcard origin "*".
func (o MiddlewareSpecHeadersOutput) AccessControlAllowOriginList() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.AccessControlAllowOriginList }).(pulumi.StringArrayOutput)
}

// AccessControlAllowOriginListRegex is a list of allowable origins written following the Regular Expression syntax (https://golang.org/pkg/regexp/).
func (o MiddlewareSpecHeadersOutput) AccessControlAllowOriginListRegex() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.AccessControlAllowOriginListRegex }).(pulumi.StringArrayOutput)
}

// AccessControlExposeHeaders defines the Access-Control-Expose-Headers values sent in preflight response.
func (o MiddlewareSpecHeadersOutput) AccessControlExposeHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.AccessControlExposeHeaders }).(pulumi.StringArrayOutput)
}

// AccessControlMaxAge defines the time that a preflight request may be cached.
func (o MiddlewareSpecHeadersOutput) AccessControlMaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *int { return v.AccessControlMaxAge }).(pulumi.IntPtrOutput)
}

// AddVaryHeader defines whether the Vary header is automatically added/updated when the AccessControlAllowOriginList is set.
func (o MiddlewareSpecHeadersOutput) AddVaryHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.AddVaryHeader }).(pulumi.BoolPtrOutput)
}

// AllowedHosts defines the fully qualified list of allowed domain names.
func (o MiddlewareSpecHeadersOutput) AllowedHosts() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.AllowedHosts }).(pulumi.StringArrayOutput)
}

// BrowserXSSFilter defines whether to add the X-XSS-Protection header with the value 1; mode=block.
func (o MiddlewareSpecHeadersOutput) BrowserXssFilter() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.BrowserXssFilter }).(pulumi.BoolPtrOutput)
}

// ContentSecurityPolicy defines the Content-Security-Policy header value.
func (o MiddlewareSpecHeadersOutput) ContentSecurityPolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.ContentSecurityPolicy }).(pulumi.StringPtrOutput)
}

// ContentSecurityPolicyReportOnly defines the Content-Security-Policy-Report-Only header value.
func (o MiddlewareSpecHeadersOutput) ContentSecurityPolicyReportOnly() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.ContentSecurityPolicyReportOnly }).(pulumi.StringPtrOutput)
}

// ContentTypeNosniff defines whether to add the X-Content-Type-Options header with the nosniff value.
func (o MiddlewareSpecHeadersOutput) ContentTypeNosniff() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.ContentTypeNosniff }).(pulumi.BoolPtrOutput)
}

// CustomBrowserXSSValue defines the X-XSS-Protection header value.
// This overrides the BrowserXssFilter option.
func (o MiddlewareSpecHeadersOutput) CustomBrowserXSSValue() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.CustomBrowserXSSValue }).(pulumi.StringPtrOutput)
}

// CustomFrameOptionsValue defines the X-Frame-Options header value.
// This overrides the FrameDeny option.
func (o MiddlewareSpecHeadersOutput) CustomFrameOptionsValue() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.CustomFrameOptionsValue }).(pulumi.StringPtrOutput)
}

// CustomRequestHeaders defines the header names and values to apply to the request.
func (o MiddlewareSpecHeadersOutput) CustomRequestHeaders() pulumi.StringMapOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) map[string]string { return v.CustomRequestHeaders }).(pulumi.StringMapOutput)
}

// CustomResponseHeaders defines the header names and values to apply to the response.
func (o MiddlewareSpecHeadersOutput) CustomResponseHeaders() pulumi.StringMapOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) map[string]string { return v.CustomResponseHeaders }).(pulumi.StringMapOutput)
}

// Deprecated: FeaturePolicy option is deprecated, please use PermissionsPolicy instead.
func (o MiddlewareSpecHeadersOutput) FeaturePolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.FeaturePolicy }).(pulumi.StringPtrOutput)
}

// ForceSTSHeader defines whether to add the STS header even when the connection is HTTP.
func (o MiddlewareSpecHeadersOutput) ForceSTSHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.ForceSTSHeader }).(pulumi.BoolPtrOutput)
}

// FrameDeny defines whether to add the X-Frame-Options header with the DENY value.
func (o MiddlewareSpecHeadersOutput) FrameDeny() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.FrameDeny }).(pulumi.BoolPtrOutput)
}

// HostsProxyHeaders defines the header keys that may hold a proxied hostname value for the request.
func (o MiddlewareSpecHeadersOutput) HostsProxyHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) []string { return v.HostsProxyHeaders }).(pulumi.StringArrayOutput)
}

// IsDevelopment defines whether to mitigate the unwanted effects of the AllowedHosts, SSL, and STS options when developing.
// Usually testing takes place using HTTP, not HTTPS, and on localhost, not your production domain.
// If you would like your development environment to mimic production with complete Host blocking, SSL redirects,
// and STS headers, leave this as false.
func (o MiddlewareSpecHeadersOutput) IsDevelopment() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.IsDevelopment }).(pulumi.BoolPtrOutput)
}

// PermissionsPolicy defines the Permissions-Policy header value.
// This allows sites to control browser features.
func (o MiddlewareSpecHeadersOutput) PermissionsPolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.PermissionsPolicy }).(pulumi.StringPtrOutput)
}

// PublicKey is the public key that implements HPKP to prevent MITM attacks with forged certificates.
func (o MiddlewareSpecHeadersOutput) PublicKey() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.PublicKey }).(pulumi.StringPtrOutput)
}

// ReferrerPolicy defines the Referrer-Policy header value.
// This allows sites to control whether browsers forward the Referer header to other sites.
func (o MiddlewareSpecHeadersOutput) ReferrerPolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.ReferrerPolicy }).(pulumi.StringPtrOutput)
}

// Deprecated: SSLForceHost option is deprecated, please use RedirectRegex instead.
func (o MiddlewareSpecHeadersOutput) SslForceHost() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.SslForceHost }).(pulumi.BoolPtrOutput)
}

// Deprecated: SSLHost option is deprecated, please use RedirectRegex instead.
func (o MiddlewareSpecHeadersOutput) SslHost() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *string { return v.SslHost }).(pulumi.StringPtrOutput)
}

// SSLProxyHeaders defines the header keys with associated values that would indicate a valid HTTPS request.
// It can be useful when using other proxies (example: "X-Forwarded-Proto": "https").
func (o MiddlewareSpecHeadersOutput) SslProxyHeaders() pulumi.StringMapOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) map[string]string { return v.SslProxyHeaders }).(pulumi.StringMapOutput)
}

// Deprecated: SSLRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
func (o MiddlewareSpecHeadersOutput) SslRedirect() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.SslRedirect }).(pulumi.BoolPtrOutput)
}

// Deprecated: SSLTemporaryRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
func (o MiddlewareSpecHeadersOutput) SslTemporaryRedirect() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.SslTemporaryRedirect }).(pulumi.BoolPtrOutput)
}

// STSIncludeSubdomains defines whether the includeSubDomains directive is appended to the Strict-Transport-Security header.
func (o MiddlewareSpecHeadersOutput) StsIncludeSubdomains() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.StsIncludeSubdomains }).(pulumi.BoolPtrOutput)
}

// STSPreload defines whether the preload flag is appended to the Strict-Transport-Security header.
func (o MiddlewareSpecHeadersOutput) StsPreload() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *bool { return v.StsPreload }).(pulumi.BoolPtrOutput)
}

// STSSeconds defines the max-age of the Strict-Transport-Security header.
// If set to 0, the header is not set.
func (o MiddlewareSpecHeadersOutput) StsSeconds() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecHeaders) *int { return v.StsSeconds }).(pulumi.IntPtrOutput)
}

type MiddlewareSpecHeadersPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecHeadersPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecHeaders)(nil)).Elem()
}

func (o MiddlewareSpecHeadersPtrOutput) ToMiddlewareSpecHeadersPtrOutput() MiddlewareSpecHeadersPtrOutput {
	return o
}

func (o MiddlewareSpecHeadersPtrOutput) ToMiddlewareSpecHeadersPtrOutputWithContext(ctx context.Context) MiddlewareSpecHeadersPtrOutput {
	return o
}

func (o MiddlewareSpecHeadersPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecHeaders] {
	return pulumix.Output[*MiddlewareSpecHeaders]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecHeadersPtrOutput) Elem() MiddlewareSpecHeadersOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) MiddlewareSpecHeaders {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecHeaders
		return ret
	}).(MiddlewareSpecHeadersOutput)
}

// AccessControlAllowCredentials defines whether the request can include user credentials.
func (o MiddlewareSpecHeadersPtrOutput) AccessControlAllowCredentials() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.AccessControlAllowCredentials
	}).(pulumi.BoolPtrOutput)
}

// AccessControlAllowHeaders defines the Access-Control-Request-Headers values sent in preflight response.
func (o MiddlewareSpecHeadersPtrOutput) AccessControlAllowHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.AccessControlAllowHeaders
	}).(pulumi.StringArrayOutput)
}

// AccessControlAllowMethods defines the Access-Control-Request-Method values sent in preflight response.
func (o MiddlewareSpecHeadersPtrOutput) AccessControlAllowMethods() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.AccessControlAllowMethods
	}).(pulumi.StringArrayOutput)
}

// AccessControlAllowOriginList is a list of allowable origins. Can also be a wildcard origin "*".
func (o MiddlewareSpecHeadersPtrOutput) AccessControlAllowOriginList() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.AccessControlAllowOriginList
	}).(pulumi.StringArrayOutput)
}

// AccessControlAllowOriginListRegex is a list of allowable origins written following the Regular Expression syntax (https://golang.org/pkg/regexp/).
func (o MiddlewareSpecHeadersPtrOutput) AccessControlAllowOriginListRegex() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.AccessControlAllowOriginListRegex
	}).(pulumi.StringArrayOutput)
}

// AccessControlExposeHeaders defines the Access-Control-Expose-Headers values sent in preflight response.
func (o MiddlewareSpecHeadersPtrOutput) AccessControlExposeHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.AccessControlExposeHeaders
	}).(pulumi.StringArrayOutput)
}

// AccessControlMaxAge defines the time that a preflight request may be cached.
func (o MiddlewareSpecHeadersPtrOutput) AccessControlMaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *int {
		if v == nil {
			return nil
		}
		return v.AccessControlMaxAge
	}).(pulumi.IntPtrOutput)
}

// AddVaryHeader defines whether the Vary header is automatically added/updated when the AccessControlAllowOriginList is set.
func (o MiddlewareSpecHeadersPtrOutput) AddVaryHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.AddVaryHeader
	}).(pulumi.BoolPtrOutput)
}

// AllowedHosts defines the fully qualified list of allowed domain names.
func (o MiddlewareSpecHeadersPtrOutput) AllowedHosts() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.AllowedHosts
	}).(pulumi.StringArrayOutput)
}

// BrowserXSSFilter defines whether to add the X-XSS-Protection header with the value 1; mode=block.
func (o MiddlewareSpecHeadersPtrOutput) BrowserXssFilter() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.BrowserXssFilter
	}).(pulumi.BoolPtrOutput)
}

// ContentSecurityPolicy defines the Content-Security-Policy header value.
func (o MiddlewareSpecHeadersPtrOutput) ContentSecurityPolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.ContentSecurityPolicy
	}).(pulumi.StringPtrOutput)
}

// ContentSecurityPolicyReportOnly defines the Content-Security-Policy-Report-Only header value.
func (o MiddlewareSpecHeadersPtrOutput) ContentSecurityPolicyReportOnly() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.ContentSecurityPolicyReportOnly
	}).(pulumi.StringPtrOutput)
}

// ContentTypeNosniff defines whether to add the X-Content-Type-Options header with the nosniff value.
func (o MiddlewareSpecHeadersPtrOutput) ContentTypeNosniff() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.ContentTypeNosniff
	}).(pulumi.BoolPtrOutput)
}

// CustomBrowserXSSValue defines the X-XSS-Protection header value.
// This overrides the BrowserXssFilter option.
func (o MiddlewareSpecHeadersPtrOutput) CustomBrowserXSSValue() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.CustomBrowserXSSValue
	}).(pulumi.StringPtrOutput)
}

// CustomFrameOptionsValue defines the X-Frame-Options header value.
// This overrides the FrameDeny option.
func (o MiddlewareSpecHeadersPtrOutput) CustomFrameOptionsValue() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.CustomFrameOptionsValue
	}).(pulumi.StringPtrOutput)
}

// CustomRequestHeaders defines the header names and values to apply to the request.
func (o MiddlewareSpecHeadersPtrOutput) CustomRequestHeaders() pulumi.StringMapOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) map[string]string {
		if v == nil {
			return nil
		}
		return v.CustomRequestHeaders
	}).(pulumi.StringMapOutput)
}

// CustomResponseHeaders defines the header names and values to apply to the response.
func (o MiddlewareSpecHeadersPtrOutput) CustomResponseHeaders() pulumi.StringMapOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) map[string]string {
		if v == nil {
			return nil
		}
		return v.CustomResponseHeaders
	}).(pulumi.StringMapOutput)
}

// Deprecated: FeaturePolicy option is deprecated, please use PermissionsPolicy instead.
func (o MiddlewareSpecHeadersPtrOutput) FeaturePolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.FeaturePolicy
	}).(pulumi.StringPtrOutput)
}

// ForceSTSHeader defines whether to add the STS header even when the connection is HTTP.
func (o MiddlewareSpecHeadersPtrOutput) ForceSTSHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.ForceSTSHeader
	}).(pulumi.BoolPtrOutput)
}

// FrameDeny defines whether to add the X-Frame-Options header with the DENY value.
func (o MiddlewareSpecHeadersPtrOutput) FrameDeny() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.FrameDeny
	}).(pulumi.BoolPtrOutput)
}

// HostsProxyHeaders defines the header keys that may hold a proxied hostname value for the request.
func (o MiddlewareSpecHeadersPtrOutput) HostsProxyHeaders() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) []string {
		if v == nil {
			return nil
		}
		return v.HostsProxyHeaders
	}).(pulumi.StringArrayOutput)
}

// IsDevelopment defines whether to mitigate the unwanted effects of the AllowedHosts, SSL, and STS options when developing.
// Usually testing takes place using HTTP, not HTTPS, and on localhost, not your production domain.
// If you would like your development environment to mimic production with complete Host blocking, SSL redirects,
// and STS headers, leave this as false.
func (o MiddlewareSpecHeadersPtrOutput) IsDevelopment() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.IsDevelopment
	}).(pulumi.BoolPtrOutput)
}

// PermissionsPolicy defines the Permissions-Policy header value.
// This allows sites to control browser features.
func (o MiddlewareSpecHeadersPtrOutput) PermissionsPolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.PermissionsPolicy
	}).(pulumi.StringPtrOutput)
}

// PublicKey is the public key that implements HPKP to prevent MITM attacks with forged certificates.
func (o MiddlewareSpecHeadersPtrOutput) PublicKey() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.PublicKey
	}).(pulumi.StringPtrOutput)
}

// ReferrerPolicy defines the Referrer-Policy header value.
// This allows sites to control whether browsers forward the Referer header to other sites.
func (o MiddlewareSpecHeadersPtrOutput) ReferrerPolicy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.ReferrerPolicy
	}).(pulumi.StringPtrOutput)
}

// Deprecated: SSLForceHost option is deprecated, please use RedirectRegex instead.
func (o MiddlewareSpecHeadersPtrOutput) SslForceHost() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.SslForceHost
	}).(pulumi.BoolPtrOutput)
}

// Deprecated: SSLHost option is deprecated, please use RedirectRegex instead.
func (o MiddlewareSpecHeadersPtrOutput) SslHost() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *string {
		if v == nil {
			return nil
		}
		return v.SslHost
	}).(pulumi.StringPtrOutput)
}

// SSLProxyHeaders defines the header keys with associated values that would indicate a valid HTTPS request.
// It can be useful when using other proxies (example: "X-Forwarded-Proto": "https").
func (o MiddlewareSpecHeadersPtrOutput) SslProxyHeaders() pulumi.StringMapOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) map[string]string {
		if v == nil {
			return nil
		}
		return v.SslProxyHeaders
	}).(pulumi.StringMapOutput)
}

// Deprecated: SSLRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
func (o MiddlewareSpecHeadersPtrOutput) SslRedirect() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.SslRedirect
	}).(pulumi.BoolPtrOutput)
}

// Deprecated: SSLTemporaryRedirect option is deprecated, please use EntryPoint redirection or RedirectScheme instead.
func (o MiddlewareSpecHeadersPtrOutput) SslTemporaryRedirect() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.SslTemporaryRedirect
	}).(pulumi.BoolPtrOutput)
}

// STSIncludeSubdomains defines whether the includeSubDomains directive is appended to the Strict-Transport-Security header.
func (o MiddlewareSpecHeadersPtrOutput) StsIncludeSubdomains() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.StsIncludeSubdomains
	}).(pulumi.BoolPtrOutput)
}

// STSPreload defines whether the preload flag is appended to the Strict-Transport-Security header.
func (o MiddlewareSpecHeadersPtrOutput) StsPreload() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *bool {
		if v == nil {
			return nil
		}
		return v.StsPreload
	}).(pulumi.BoolPtrOutput)
}

// STSSeconds defines the max-age of the Strict-Transport-Security header.
// If set to 0, the header is not set.
func (o MiddlewareSpecHeadersPtrOutput) StsSeconds() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecHeaders) *int {
		if v == nil {
			return nil
		}
		return v.StsSeconds
	}).(pulumi.IntPtrOutput)
}

// CustomRequestHeaders defines the header names and values to apply to the request.
type MiddlewareSpecHeadersCustomRequestHeaders struct {
}

// CustomResponseHeaders defines the header names and values to apply to the response.
type MiddlewareSpecHeadersCustomResponseHeaders struct {
}

// SSLProxyHeaders defines the header keys with associated values that would indicate a valid HTTPS request.
// It can be useful when using other proxies (example: "X-Forwarded-Proto": "https").
type MiddlewareSpecHeadersSslProxyHeaders struct {
}

// InFlightReq holds the in-flight request middleware configuration.
// This middleware limits the number of requests being processed and served concurrently.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
type MiddlewareSpecInFlightReq struct {
	// Amount defines the maximum amount of allowed simultaneous in-flight request.
	// The middleware responds with HTTP 429 Too Many Requests if there are already amount requests in progress (based on the same sourceCriterion strategy).
	Amount *int `pulumi:"amount"`
	// SourceCriterion defines what criterion is used to group requests as originating from a common source.
	// If several strategies are defined at the same time, an error will be raised.
	// If none are set, the default is to use the requestHost.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
	SourceCriterion *MiddlewareSpecInFlightReqSourceCriterion `pulumi:"sourceCriterion"`
}

// MiddlewareSpecInFlightReqInput is an input type that accepts MiddlewareSpecInFlightReqArgs and MiddlewareSpecInFlightReqOutput values.
// You can construct a concrete instance of `MiddlewareSpecInFlightReqInput` via:
//
//	MiddlewareSpecInFlightReqArgs{...}
type MiddlewareSpecInFlightReqInput interface {
	pulumi.Input

	ToMiddlewareSpecInFlightReqOutput() MiddlewareSpecInFlightReqOutput
	ToMiddlewareSpecInFlightReqOutputWithContext(context.Context) MiddlewareSpecInFlightReqOutput
}

// InFlightReq holds the in-flight request middleware configuration.
// This middleware limits the number of requests being processed and served concurrently.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
type MiddlewareSpecInFlightReqArgs struct {
	// Amount defines the maximum amount of allowed simultaneous in-flight request.
	// The middleware responds with HTTP 429 Too Many Requests if there are already amount requests in progress (based on the same sourceCriterion strategy).
	Amount pulumi.IntPtrInput `pulumi:"amount"`
	// SourceCriterion defines what criterion is used to group requests as originating from a common source.
	// If several strategies are defined at the same time, an error will be raised.
	// If none are set, the default is to use the requestHost.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
	SourceCriterion MiddlewareSpecInFlightReqSourceCriterionPtrInput `pulumi:"sourceCriterion"`
}

func (MiddlewareSpecInFlightReqArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecInFlightReq)(nil)).Elem()
}

func (i MiddlewareSpecInFlightReqArgs) ToMiddlewareSpecInFlightReqOutput() MiddlewareSpecInFlightReqOutput {
	return i.ToMiddlewareSpecInFlightReqOutputWithContext(context.Background())
}

func (i MiddlewareSpecInFlightReqArgs) ToMiddlewareSpecInFlightReqOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqOutput)
}

func (i MiddlewareSpecInFlightReqArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecInFlightReq] {
	return pulumix.Output[MiddlewareSpecInFlightReq]{
		OutputState: i.ToMiddlewareSpecInFlightReqOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecInFlightReqArgs) ToMiddlewareSpecInFlightReqPtrOutput() MiddlewareSpecInFlightReqPtrOutput {
	return i.ToMiddlewareSpecInFlightReqPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecInFlightReqArgs) ToMiddlewareSpecInFlightReqPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqOutput).ToMiddlewareSpecInFlightReqPtrOutputWithContext(ctx)
}

// MiddlewareSpecInFlightReqPtrInput is an input type that accepts MiddlewareSpecInFlightReqArgs, MiddlewareSpecInFlightReqPtr and MiddlewareSpecInFlightReqPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecInFlightReqPtrInput` via:
//
//	        MiddlewareSpecInFlightReqArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecInFlightReqPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecInFlightReqPtrOutput() MiddlewareSpecInFlightReqPtrOutput
	ToMiddlewareSpecInFlightReqPtrOutputWithContext(context.Context) MiddlewareSpecInFlightReqPtrOutput
}

type middlewareSpecInFlightReqPtrType MiddlewareSpecInFlightReqArgs

func MiddlewareSpecInFlightReqPtr(v *MiddlewareSpecInFlightReqArgs) MiddlewareSpecInFlightReqPtrInput {
	return (*middlewareSpecInFlightReqPtrType)(v)
}

func (*middlewareSpecInFlightReqPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecInFlightReq)(nil)).Elem()
}

func (i *middlewareSpecInFlightReqPtrType) ToMiddlewareSpecInFlightReqPtrOutput() MiddlewareSpecInFlightReqPtrOutput {
	return i.ToMiddlewareSpecInFlightReqPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecInFlightReqPtrType) ToMiddlewareSpecInFlightReqPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqPtrOutput)
}

func (i *middlewareSpecInFlightReqPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecInFlightReq] {
	return pulumix.Output[*MiddlewareSpecInFlightReq]{
		OutputState: i.ToMiddlewareSpecInFlightReqPtrOutputWithContext(ctx).OutputState,
	}
}

// InFlightReq holds the in-flight request middleware configuration.
// This middleware limits the number of requests being processed and served concurrently.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/
type MiddlewareSpecInFlightReqOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecInFlightReqOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecInFlightReq)(nil)).Elem()
}

func (o MiddlewareSpecInFlightReqOutput) ToMiddlewareSpecInFlightReqOutput() MiddlewareSpecInFlightReqOutput {
	return o
}

func (o MiddlewareSpecInFlightReqOutput) ToMiddlewareSpecInFlightReqOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqOutput {
	return o
}

func (o MiddlewareSpecInFlightReqOutput) ToMiddlewareSpecInFlightReqPtrOutput() MiddlewareSpecInFlightReqPtrOutput {
	return o.ToMiddlewareSpecInFlightReqPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecInFlightReqOutput) ToMiddlewareSpecInFlightReqPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecInFlightReq) *MiddlewareSpecInFlightReq {
		return &v
	}).(MiddlewareSpecInFlightReqPtrOutput)
}

func (o MiddlewareSpecInFlightReqOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecInFlightReq] {
	return pulumix.Output[MiddlewareSpecInFlightReq]{
		OutputState: o.OutputState,
	}
}

// Amount defines the maximum amount of allowed simultaneous in-flight request.
// The middleware responds with HTTP 429 Too Many Requests if there are already amount requests in progress (based on the same sourceCriterion strategy).
func (o MiddlewareSpecInFlightReqOutput) Amount() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReq) *int { return v.Amount }).(pulumi.IntPtrOutput)
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the requestHost.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
func (o MiddlewareSpecInFlightReqOutput) SourceCriterion() MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReq) *MiddlewareSpecInFlightReqSourceCriterion { return v.SourceCriterion }).(MiddlewareSpecInFlightReqSourceCriterionPtrOutput)
}

type MiddlewareSpecInFlightReqPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecInFlightReqPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecInFlightReq)(nil)).Elem()
}

func (o MiddlewareSpecInFlightReqPtrOutput) ToMiddlewareSpecInFlightReqPtrOutput() MiddlewareSpecInFlightReqPtrOutput {
	return o
}

func (o MiddlewareSpecInFlightReqPtrOutput) ToMiddlewareSpecInFlightReqPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqPtrOutput {
	return o
}

func (o MiddlewareSpecInFlightReqPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecInFlightReq] {
	return pulumix.Output[*MiddlewareSpecInFlightReq]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecInFlightReqPtrOutput) Elem() MiddlewareSpecInFlightReqOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReq) MiddlewareSpecInFlightReq {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecInFlightReq
		return ret
	}).(MiddlewareSpecInFlightReqOutput)
}

// Amount defines the maximum amount of allowed simultaneous in-flight request.
// The middleware responds with HTTP 429 Too Many Requests if there are already amount requests in progress (based on the same sourceCriterion strategy).
func (o MiddlewareSpecInFlightReqPtrOutput) Amount() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReq) *int {
		if v == nil {
			return nil
		}
		return v.Amount
	}).(pulumi.IntPtrOutput)
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the requestHost.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
func (o MiddlewareSpecInFlightReqPtrOutput) SourceCriterion() MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReq) *MiddlewareSpecInFlightReqSourceCriterion {
		if v == nil {
			return nil
		}
		return v.SourceCriterion
	}).(MiddlewareSpecInFlightReqSourceCriterionPtrOutput)
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the requestHost.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
type MiddlewareSpecInFlightReqSourceCriterion struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy *MiddlewareSpecInFlightReqSourceCriterionIpStrategy `pulumi:"ipStrategy"`
	// RequestHeaderName defines the name of the header used to group incoming requests.
	RequestHeaderName *string `pulumi:"requestHeaderName"`
	// RequestHost defines whether to consider the request Host as the source.
	RequestHost *bool `pulumi:"requestHost"`
}

// MiddlewareSpecInFlightReqSourceCriterionInput is an input type that accepts MiddlewareSpecInFlightReqSourceCriterionArgs and MiddlewareSpecInFlightReqSourceCriterionOutput values.
// You can construct a concrete instance of `MiddlewareSpecInFlightReqSourceCriterionInput` via:
//
//	MiddlewareSpecInFlightReqSourceCriterionArgs{...}
type MiddlewareSpecInFlightReqSourceCriterionInput interface {
	pulumi.Input

	ToMiddlewareSpecInFlightReqSourceCriterionOutput() MiddlewareSpecInFlightReqSourceCriterionOutput
	ToMiddlewareSpecInFlightReqSourceCriterionOutputWithContext(context.Context) MiddlewareSpecInFlightReqSourceCriterionOutput
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the requestHost.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
type MiddlewareSpecInFlightReqSourceCriterionArgs struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrInput `pulumi:"ipStrategy"`
	// RequestHeaderName defines the name of the header used to group incoming requests.
	RequestHeaderName pulumi.StringPtrInput `pulumi:"requestHeaderName"`
	// RequestHost defines whether to consider the request Host as the source.
	RequestHost pulumi.BoolPtrInput `pulumi:"requestHost"`
}

func (MiddlewareSpecInFlightReqSourceCriterionArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterion)(nil)).Elem()
}

func (i MiddlewareSpecInFlightReqSourceCriterionArgs) ToMiddlewareSpecInFlightReqSourceCriterionOutput() MiddlewareSpecInFlightReqSourceCriterionOutput {
	return i.ToMiddlewareSpecInFlightReqSourceCriterionOutputWithContext(context.Background())
}

func (i MiddlewareSpecInFlightReqSourceCriterionArgs) ToMiddlewareSpecInFlightReqSourceCriterionOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqSourceCriterionOutput)
}

func (i MiddlewareSpecInFlightReqSourceCriterionArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecInFlightReqSourceCriterion] {
	return pulumix.Output[MiddlewareSpecInFlightReqSourceCriterion]{
		OutputState: i.ToMiddlewareSpecInFlightReqSourceCriterionOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecInFlightReqSourceCriterionArgs) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutput() MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return i.ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecInFlightReqSourceCriterionArgs) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqSourceCriterionOutput).ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(ctx)
}

// MiddlewareSpecInFlightReqSourceCriterionPtrInput is an input type that accepts MiddlewareSpecInFlightReqSourceCriterionArgs, MiddlewareSpecInFlightReqSourceCriterionPtr and MiddlewareSpecInFlightReqSourceCriterionPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecInFlightReqSourceCriterionPtrInput` via:
//
//	        MiddlewareSpecInFlightReqSourceCriterionArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecInFlightReqSourceCriterionPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecInFlightReqSourceCriterionPtrOutput() MiddlewareSpecInFlightReqSourceCriterionPtrOutput
	ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(context.Context) MiddlewareSpecInFlightReqSourceCriterionPtrOutput
}

type middlewareSpecInFlightReqSourceCriterionPtrType MiddlewareSpecInFlightReqSourceCriterionArgs

func MiddlewareSpecInFlightReqSourceCriterionPtr(v *MiddlewareSpecInFlightReqSourceCriterionArgs) MiddlewareSpecInFlightReqSourceCriterionPtrInput {
	return (*middlewareSpecInFlightReqSourceCriterionPtrType)(v)
}

func (*middlewareSpecInFlightReqSourceCriterionPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecInFlightReqSourceCriterion)(nil)).Elem()
}

func (i *middlewareSpecInFlightReqSourceCriterionPtrType) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutput() MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return i.ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecInFlightReqSourceCriterionPtrType) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqSourceCriterionPtrOutput)
}

func (i *middlewareSpecInFlightReqSourceCriterionPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterion] {
	return pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterion]{
		OutputState: i.ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(ctx).OutputState,
	}
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the requestHost.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/inflightreq/#sourcecriterion
type MiddlewareSpecInFlightReqSourceCriterionOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecInFlightReqSourceCriterionOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterion)(nil)).Elem()
}

func (o MiddlewareSpecInFlightReqSourceCriterionOutput) ToMiddlewareSpecInFlightReqSourceCriterionOutput() MiddlewareSpecInFlightReqSourceCriterionOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionOutput) ToMiddlewareSpecInFlightReqSourceCriterionOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionOutput) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutput() MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return o.ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecInFlightReqSourceCriterionOutput) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecInFlightReqSourceCriterion) *MiddlewareSpecInFlightReqSourceCriterion {
		return &v
	}).(MiddlewareSpecInFlightReqSourceCriterionPtrOutput)
}

func (o MiddlewareSpecInFlightReqSourceCriterionOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecInFlightReqSourceCriterion] {
	return pulumix.Output[MiddlewareSpecInFlightReqSourceCriterion]{
		OutputState: o.OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecInFlightReqSourceCriterionOutput) IpStrategy() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReqSourceCriterion) *MiddlewareSpecInFlightReqSourceCriterionIpStrategy {
		return v.IpStrategy
	}).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput)
}

// RequestHeaderName defines the name of the header used to group incoming requests.
func (o MiddlewareSpecInFlightReqSourceCriterionOutput) RequestHeaderName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReqSourceCriterion) *string { return v.RequestHeaderName }).(pulumi.StringPtrOutput)
}

// RequestHost defines whether to consider the request Host as the source.
func (o MiddlewareSpecInFlightReqSourceCriterionOutput) RequestHost() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReqSourceCriterion) *bool { return v.RequestHost }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecInFlightReqSourceCriterionPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecInFlightReqSourceCriterionPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecInFlightReqSourceCriterion)(nil)).Elem()
}

func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutput() MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) ToMiddlewareSpecInFlightReqSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionPtrOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterion] {
	return pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterion]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) Elem() MiddlewareSpecInFlightReqSourceCriterionOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterion) MiddlewareSpecInFlightReqSourceCriterion {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecInFlightReqSourceCriterion
		return ret
	}).(MiddlewareSpecInFlightReqSourceCriterionOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) IpStrategy() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterion) *MiddlewareSpecInFlightReqSourceCriterionIpStrategy {
		if v == nil {
			return nil
		}
		return v.IpStrategy
	}).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput)
}

// RequestHeaderName defines the name of the header used to group incoming requests.
func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) RequestHeaderName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterion) *string {
		if v == nil {
			return nil
		}
		return v.RequestHeaderName
	}).(pulumi.StringPtrOutput)
}

// RequestHost defines whether to consider the request Host as the source.
func (o MiddlewareSpecInFlightReqSourceCriterionPtrOutput) RequestHost() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterion) *bool {
		if v == nil {
			return nil
		}
		return v.RequestHost
	}).(pulumi.BoolPtrOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecInFlightReqSourceCriterionIpStrategy struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth *int `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs []string `pulumi:"excludedIPs"`
}

// MiddlewareSpecInFlightReqSourceCriterionIpStrategyInput is an input type that accepts MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs and MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput values.
// You can construct a concrete instance of `MiddlewareSpecInFlightReqSourceCriterionIpStrategyInput` via:
//
//	MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs{...}
type MiddlewareSpecInFlightReqSourceCriterionIpStrategyInput interface {
	pulumi.Input

	ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput
	ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutputWithContext(context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth pulumi.IntPtrInput `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs pulumi.StringArrayInput `pulumi:"excludedIPs"`
}

func (MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterionIpStrategy)(nil)).Elem()
}

func (i MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput {
	return i.ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutputWithContext(context.Background())
}

func (i MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput)
}

func (i MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecInFlightReqSourceCriterionIpStrategy] {
	return pulumix.Output[MiddlewareSpecInFlightReqSourceCriterionIpStrategy]{
		OutputState: i.ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return i.ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput).ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(ctx)
}

// MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrInput is an input type that accepts MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs, MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtr and MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrInput` via:
//
//	        MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput
	ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput
}

type middlewareSpecInFlightReqSourceCriterionIpStrategyPtrType MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs

func MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtr(v *MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs) MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrInput {
	return (*middlewareSpecInFlightReqSourceCriterionIpStrategyPtrType)(v)
}

func (*middlewareSpecInFlightReqSourceCriterionIpStrategyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecInFlightReqSourceCriterionIpStrategy)(nil)).Elem()
}

func (i *middlewareSpecInFlightReqSourceCriterionIpStrategyPtrType) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return i.ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecInFlightReqSourceCriterionIpStrategyPtrType) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput)
}

func (i *middlewareSpecInFlightReqSourceCriterionIpStrategyPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterionIpStrategy] {
	return pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterionIpStrategy]{
		OutputState: i.ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(ctx).OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterionIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return o.ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecInFlightReqSourceCriterionIpStrategy) *MiddlewareSpecInFlightReqSourceCriterionIpStrategy {
		return &v
	}).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput)
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecInFlightReqSourceCriterionIpStrategy] {
	return pulumix.Output[MiddlewareSpecInFlightReqSourceCriterionIpStrategy]{
		OutputState: o.OutputState,
	}
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReqSourceCriterionIpStrategy) *int { return v.Depth }).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecInFlightReqSourceCriterionIpStrategy) []string { return v.ExcludedIPs }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecInFlightReqSourceCriterionIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput() MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) ToMiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterionIpStrategy] {
	return pulumix.Output[*MiddlewareSpecInFlightReqSourceCriterionIpStrategy]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) Elem() MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterionIpStrategy) MiddlewareSpecInFlightReqSourceCriterionIpStrategy {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecInFlightReqSourceCriterionIpStrategy
		return ret
	}).(MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput)
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterionIpStrategy) *int {
		if v == nil {
			return nil
		}
		return v.Depth
	}).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecInFlightReqSourceCriterionIpStrategy) []string {
		if v == nil {
			return nil
		}
		return v.ExcludedIPs
	}).(pulumi.StringArrayOutput)
}

// IPAllowList holds the IP allowlist middleware configuration.
// This middleware limits allowed requests based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
type MiddlewareSpecIpAllowList struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy *MiddlewareSpecIpAllowListIpStrategy `pulumi:"ipStrategy"`
	// RejectStatusCode defines the HTTP status code used for refused requests.
	// If not set, the default is 403 (Forbidden).
	RejectStatusCode *int `pulumi:"rejectStatusCode"`
	// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation).
	SourceRange []string `pulumi:"sourceRange"`
}

// MiddlewareSpecIpAllowListInput is an input type that accepts MiddlewareSpecIpAllowListArgs and MiddlewareSpecIpAllowListOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpAllowListInput` via:
//
//	MiddlewareSpecIpAllowListArgs{...}
type MiddlewareSpecIpAllowListInput interface {
	pulumi.Input

	ToMiddlewareSpecIpAllowListOutput() MiddlewareSpecIpAllowListOutput
	ToMiddlewareSpecIpAllowListOutputWithContext(context.Context) MiddlewareSpecIpAllowListOutput
}

// IPAllowList holds the IP allowlist middleware configuration.
// This middleware limits allowed requests based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
type MiddlewareSpecIpAllowListArgs struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy MiddlewareSpecIpAllowListIpStrategyPtrInput `pulumi:"ipStrategy"`
	// RejectStatusCode defines the HTTP status code used for refused requests.
	// If not set, the default is 403 (Forbidden).
	RejectStatusCode pulumi.IntPtrInput `pulumi:"rejectStatusCode"`
	// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation).
	SourceRange pulumi.StringArrayInput `pulumi:"sourceRange"`
}

func (MiddlewareSpecIpAllowListArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpAllowList)(nil)).Elem()
}

func (i MiddlewareSpecIpAllowListArgs) ToMiddlewareSpecIpAllowListOutput() MiddlewareSpecIpAllowListOutput {
	return i.ToMiddlewareSpecIpAllowListOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpAllowListArgs) ToMiddlewareSpecIpAllowListOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpAllowListOutput)
}

func (i MiddlewareSpecIpAllowListArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpAllowList] {
	return pulumix.Output[MiddlewareSpecIpAllowList]{
		OutputState: i.ToMiddlewareSpecIpAllowListOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecIpAllowListArgs) ToMiddlewareSpecIpAllowListPtrOutput() MiddlewareSpecIpAllowListPtrOutput {
	return i.ToMiddlewareSpecIpAllowListPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpAllowListArgs) ToMiddlewareSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpAllowListOutput).ToMiddlewareSpecIpAllowListPtrOutputWithContext(ctx)
}

// MiddlewareSpecIpAllowListPtrInput is an input type that accepts MiddlewareSpecIpAllowListArgs, MiddlewareSpecIpAllowListPtr and MiddlewareSpecIpAllowListPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpAllowListPtrInput` via:
//
//	        MiddlewareSpecIpAllowListArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecIpAllowListPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecIpAllowListPtrOutput() MiddlewareSpecIpAllowListPtrOutput
	ToMiddlewareSpecIpAllowListPtrOutputWithContext(context.Context) MiddlewareSpecIpAllowListPtrOutput
}

type middlewareSpecIpAllowListPtrType MiddlewareSpecIpAllowListArgs

func MiddlewareSpecIpAllowListPtr(v *MiddlewareSpecIpAllowListArgs) MiddlewareSpecIpAllowListPtrInput {
	return (*middlewareSpecIpAllowListPtrType)(v)
}

func (*middlewareSpecIpAllowListPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpAllowList)(nil)).Elem()
}

func (i *middlewareSpecIpAllowListPtrType) ToMiddlewareSpecIpAllowListPtrOutput() MiddlewareSpecIpAllowListPtrOutput {
	return i.ToMiddlewareSpecIpAllowListPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecIpAllowListPtrType) ToMiddlewareSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpAllowListPtrOutput)
}

func (i *middlewareSpecIpAllowListPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpAllowList] {
	return pulumix.Output[*MiddlewareSpecIpAllowList]{
		OutputState: i.ToMiddlewareSpecIpAllowListPtrOutputWithContext(ctx).OutputState,
	}
}

// IPAllowList holds the IP allowlist middleware configuration.
// This middleware limits allowed requests based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/
type MiddlewareSpecIpAllowListOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpAllowListOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpAllowList)(nil)).Elem()
}

func (o MiddlewareSpecIpAllowListOutput) ToMiddlewareSpecIpAllowListOutput() MiddlewareSpecIpAllowListOutput {
	return o
}

func (o MiddlewareSpecIpAllowListOutput) ToMiddlewareSpecIpAllowListOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListOutput {
	return o
}

func (o MiddlewareSpecIpAllowListOutput) ToMiddlewareSpecIpAllowListPtrOutput() MiddlewareSpecIpAllowListPtrOutput {
	return o.ToMiddlewareSpecIpAllowListPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecIpAllowListOutput) ToMiddlewareSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecIpAllowList) *MiddlewareSpecIpAllowList {
		return &v
	}).(MiddlewareSpecIpAllowListPtrOutput)
}

func (o MiddlewareSpecIpAllowListOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpAllowList] {
	return pulumix.Output[MiddlewareSpecIpAllowList]{
		OutputState: o.OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecIpAllowListOutput) IpStrategy() MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecIpAllowList) *MiddlewareSpecIpAllowListIpStrategy { return v.IpStrategy }).(MiddlewareSpecIpAllowListIpStrategyPtrOutput)
}

// RejectStatusCode defines the HTTP status code used for refused requests.
// If not set, the default is 403 (Forbidden).
func (o MiddlewareSpecIpAllowListOutput) RejectStatusCode() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecIpAllowList) *int { return v.RejectStatusCode }).(pulumi.IntPtrOutput)
}

// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation).
func (o MiddlewareSpecIpAllowListOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecIpAllowList) []string { return v.SourceRange }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecIpAllowListPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpAllowListPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpAllowList)(nil)).Elem()
}

func (o MiddlewareSpecIpAllowListPtrOutput) ToMiddlewareSpecIpAllowListPtrOutput() MiddlewareSpecIpAllowListPtrOutput {
	return o
}

func (o MiddlewareSpecIpAllowListPtrOutput) ToMiddlewareSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListPtrOutput {
	return o
}

func (o MiddlewareSpecIpAllowListPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpAllowList] {
	return pulumix.Output[*MiddlewareSpecIpAllowList]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecIpAllowListPtrOutput) Elem() MiddlewareSpecIpAllowListOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowList) MiddlewareSpecIpAllowList {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecIpAllowList
		return ret
	}).(MiddlewareSpecIpAllowListOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecIpAllowListPtrOutput) IpStrategy() MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowList) *MiddlewareSpecIpAllowListIpStrategy {
		if v == nil {
			return nil
		}
		return v.IpStrategy
	}).(MiddlewareSpecIpAllowListIpStrategyPtrOutput)
}

// RejectStatusCode defines the HTTP status code used for refused requests.
// If not set, the default is 403 (Forbidden).
func (o MiddlewareSpecIpAllowListPtrOutput) RejectStatusCode() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowList) *int {
		if v == nil {
			return nil
		}
		return v.RejectStatusCode
	}).(pulumi.IntPtrOutput)
}

// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation).
func (o MiddlewareSpecIpAllowListPtrOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowList) []string {
		if v == nil {
			return nil
		}
		return v.SourceRange
	}).(pulumi.StringArrayOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecIpAllowListIpStrategy struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth *int `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs []string `pulumi:"excludedIPs"`
}

// MiddlewareSpecIpAllowListIpStrategyInput is an input type that accepts MiddlewareSpecIpAllowListIpStrategyArgs and MiddlewareSpecIpAllowListIpStrategyOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpAllowListIpStrategyInput` via:
//
//	MiddlewareSpecIpAllowListIpStrategyArgs{...}
type MiddlewareSpecIpAllowListIpStrategyInput interface {
	pulumi.Input

	ToMiddlewareSpecIpAllowListIpStrategyOutput() MiddlewareSpecIpAllowListIpStrategyOutput
	ToMiddlewareSpecIpAllowListIpStrategyOutputWithContext(context.Context) MiddlewareSpecIpAllowListIpStrategyOutput
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecIpAllowListIpStrategyArgs struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth pulumi.IntPtrInput `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs pulumi.StringArrayInput `pulumi:"excludedIPs"`
}

func (MiddlewareSpecIpAllowListIpStrategyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpAllowListIpStrategy)(nil)).Elem()
}

func (i MiddlewareSpecIpAllowListIpStrategyArgs) ToMiddlewareSpecIpAllowListIpStrategyOutput() MiddlewareSpecIpAllowListIpStrategyOutput {
	return i.ToMiddlewareSpecIpAllowListIpStrategyOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpAllowListIpStrategyArgs) ToMiddlewareSpecIpAllowListIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListIpStrategyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpAllowListIpStrategyOutput)
}

func (i MiddlewareSpecIpAllowListIpStrategyArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpAllowListIpStrategy] {
	return pulumix.Output[MiddlewareSpecIpAllowListIpStrategy]{
		OutputState: i.ToMiddlewareSpecIpAllowListIpStrategyOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecIpAllowListIpStrategyArgs) ToMiddlewareSpecIpAllowListIpStrategyPtrOutput() MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return i.ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpAllowListIpStrategyArgs) ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpAllowListIpStrategyOutput).ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(ctx)
}

// MiddlewareSpecIpAllowListIpStrategyPtrInput is an input type that accepts MiddlewareSpecIpAllowListIpStrategyArgs, MiddlewareSpecIpAllowListIpStrategyPtr and MiddlewareSpecIpAllowListIpStrategyPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpAllowListIpStrategyPtrInput` via:
//
//	        MiddlewareSpecIpAllowListIpStrategyArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecIpAllowListIpStrategyPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecIpAllowListIpStrategyPtrOutput() MiddlewareSpecIpAllowListIpStrategyPtrOutput
	ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(context.Context) MiddlewareSpecIpAllowListIpStrategyPtrOutput
}

type middlewareSpecIpAllowListIpStrategyPtrType MiddlewareSpecIpAllowListIpStrategyArgs

func MiddlewareSpecIpAllowListIpStrategyPtr(v *MiddlewareSpecIpAllowListIpStrategyArgs) MiddlewareSpecIpAllowListIpStrategyPtrInput {
	return (*middlewareSpecIpAllowListIpStrategyPtrType)(v)
}

func (*middlewareSpecIpAllowListIpStrategyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpAllowListIpStrategy)(nil)).Elem()
}

func (i *middlewareSpecIpAllowListIpStrategyPtrType) ToMiddlewareSpecIpAllowListIpStrategyPtrOutput() MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return i.ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecIpAllowListIpStrategyPtrType) ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpAllowListIpStrategyPtrOutput)
}

func (i *middlewareSpecIpAllowListIpStrategyPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpAllowListIpStrategy] {
	return pulumix.Output[*MiddlewareSpecIpAllowListIpStrategy]{
		OutputState: i.ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(ctx).OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecIpAllowListIpStrategyOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpAllowListIpStrategyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpAllowListIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecIpAllowListIpStrategyOutput) ToMiddlewareSpecIpAllowListIpStrategyOutput() MiddlewareSpecIpAllowListIpStrategyOutput {
	return o
}

func (o MiddlewareSpecIpAllowListIpStrategyOutput) ToMiddlewareSpecIpAllowListIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListIpStrategyOutput {
	return o
}

func (o MiddlewareSpecIpAllowListIpStrategyOutput) ToMiddlewareSpecIpAllowListIpStrategyPtrOutput() MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return o.ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecIpAllowListIpStrategyOutput) ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecIpAllowListIpStrategy) *MiddlewareSpecIpAllowListIpStrategy {
		return &v
	}).(MiddlewareSpecIpAllowListIpStrategyPtrOutput)
}

func (o MiddlewareSpecIpAllowListIpStrategyOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpAllowListIpStrategy] {
	return pulumix.Output[MiddlewareSpecIpAllowListIpStrategy]{
		OutputState: o.OutputState,
	}
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecIpAllowListIpStrategyOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecIpAllowListIpStrategy) *int { return v.Depth }).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecIpAllowListIpStrategyOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecIpAllowListIpStrategy) []string { return v.ExcludedIPs }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecIpAllowListIpStrategyPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpAllowListIpStrategyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpAllowListIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecIpAllowListIpStrategyPtrOutput) ToMiddlewareSpecIpAllowListIpStrategyPtrOutput() MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecIpAllowListIpStrategyPtrOutput) ToMiddlewareSpecIpAllowListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpAllowListIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecIpAllowListIpStrategyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpAllowListIpStrategy] {
	return pulumix.Output[*MiddlewareSpecIpAllowListIpStrategy]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecIpAllowListIpStrategyPtrOutput) Elem() MiddlewareSpecIpAllowListIpStrategyOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowListIpStrategy) MiddlewareSpecIpAllowListIpStrategy {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecIpAllowListIpStrategy
		return ret
	}).(MiddlewareSpecIpAllowListIpStrategyOutput)
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecIpAllowListIpStrategyPtrOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowListIpStrategy) *int {
		if v == nil {
			return nil
		}
		return v.Depth
	}).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecIpAllowListIpStrategyPtrOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpAllowListIpStrategy) []string {
		if v == nil {
			return nil
		}
		return v.ExcludedIPs
	}).(pulumi.StringArrayOutput)
}

// Deprecated: please use IPAllowList instead.
type MiddlewareSpecIpWhiteList struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy *MiddlewareSpecIpWhiteListIpStrategy `pulumi:"ipStrategy"`
	// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation). Required.
	SourceRange []string `pulumi:"sourceRange"`
}

// MiddlewareSpecIpWhiteListInput is an input type that accepts MiddlewareSpecIpWhiteListArgs and MiddlewareSpecIpWhiteListOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpWhiteListInput` via:
//
//	MiddlewareSpecIpWhiteListArgs{...}
type MiddlewareSpecIpWhiteListInput interface {
	pulumi.Input

	ToMiddlewareSpecIpWhiteListOutput() MiddlewareSpecIpWhiteListOutput
	ToMiddlewareSpecIpWhiteListOutputWithContext(context.Context) MiddlewareSpecIpWhiteListOutput
}

// Deprecated: please use IPAllowList instead.
type MiddlewareSpecIpWhiteListArgs struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy MiddlewareSpecIpWhiteListIpStrategyPtrInput `pulumi:"ipStrategy"`
	// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation). Required.
	SourceRange pulumi.StringArrayInput `pulumi:"sourceRange"`
}

func (MiddlewareSpecIpWhiteListArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpWhiteList)(nil)).Elem()
}

func (i MiddlewareSpecIpWhiteListArgs) ToMiddlewareSpecIpWhiteListOutput() MiddlewareSpecIpWhiteListOutput {
	return i.ToMiddlewareSpecIpWhiteListOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpWhiteListArgs) ToMiddlewareSpecIpWhiteListOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpWhiteListOutput)
}

func (i MiddlewareSpecIpWhiteListArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpWhiteList] {
	return pulumix.Output[MiddlewareSpecIpWhiteList]{
		OutputState: i.ToMiddlewareSpecIpWhiteListOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecIpWhiteListArgs) ToMiddlewareSpecIpWhiteListPtrOutput() MiddlewareSpecIpWhiteListPtrOutput {
	return i.ToMiddlewareSpecIpWhiteListPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpWhiteListArgs) ToMiddlewareSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpWhiteListOutput).ToMiddlewareSpecIpWhiteListPtrOutputWithContext(ctx)
}

// MiddlewareSpecIpWhiteListPtrInput is an input type that accepts MiddlewareSpecIpWhiteListArgs, MiddlewareSpecIpWhiteListPtr and MiddlewareSpecIpWhiteListPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpWhiteListPtrInput` via:
//
//	        MiddlewareSpecIpWhiteListArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecIpWhiteListPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecIpWhiteListPtrOutput() MiddlewareSpecIpWhiteListPtrOutput
	ToMiddlewareSpecIpWhiteListPtrOutputWithContext(context.Context) MiddlewareSpecIpWhiteListPtrOutput
}

type middlewareSpecIpWhiteListPtrType MiddlewareSpecIpWhiteListArgs

func MiddlewareSpecIpWhiteListPtr(v *MiddlewareSpecIpWhiteListArgs) MiddlewareSpecIpWhiteListPtrInput {
	return (*middlewareSpecIpWhiteListPtrType)(v)
}

func (*middlewareSpecIpWhiteListPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpWhiteList)(nil)).Elem()
}

func (i *middlewareSpecIpWhiteListPtrType) ToMiddlewareSpecIpWhiteListPtrOutput() MiddlewareSpecIpWhiteListPtrOutput {
	return i.ToMiddlewareSpecIpWhiteListPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecIpWhiteListPtrType) ToMiddlewareSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpWhiteListPtrOutput)
}

func (i *middlewareSpecIpWhiteListPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpWhiteList] {
	return pulumix.Output[*MiddlewareSpecIpWhiteList]{
		OutputState: i.ToMiddlewareSpecIpWhiteListPtrOutputWithContext(ctx).OutputState,
	}
}

// Deprecated: please use IPAllowList instead.
type MiddlewareSpecIpWhiteListOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpWhiteListOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpWhiteList)(nil)).Elem()
}

func (o MiddlewareSpecIpWhiteListOutput) ToMiddlewareSpecIpWhiteListOutput() MiddlewareSpecIpWhiteListOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListOutput) ToMiddlewareSpecIpWhiteListOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListOutput) ToMiddlewareSpecIpWhiteListPtrOutput() MiddlewareSpecIpWhiteListPtrOutput {
	return o.ToMiddlewareSpecIpWhiteListPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecIpWhiteListOutput) ToMiddlewareSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecIpWhiteList) *MiddlewareSpecIpWhiteList {
		return &v
	}).(MiddlewareSpecIpWhiteListPtrOutput)
}

func (o MiddlewareSpecIpWhiteListOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpWhiteList] {
	return pulumix.Output[MiddlewareSpecIpWhiteList]{
		OutputState: o.OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecIpWhiteListOutput) IpStrategy() MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecIpWhiteList) *MiddlewareSpecIpWhiteListIpStrategy { return v.IpStrategy }).(MiddlewareSpecIpWhiteListIpStrategyPtrOutput)
}

// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation). Required.
func (o MiddlewareSpecIpWhiteListOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecIpWhiteList) []string { return v.SourceRange }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecIpWhiteListPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpWhiteListPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpWhiteList)(nil)).Elem()
}

func (o MiddlewareSpecIpWhiteListPtrOutput) ToMiddlewareSpecIpWhiteListPtrOutput() MiddlewareSpecIpWhiteListPtrOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListPtrOutput) ToMiddlewareSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListPtrOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpWhiteList] {
	return pulumix.Output[*MiddlewareSpecIpWhiteList]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecIpWhiteListPtrOutput) Elem() MiddlewareSpecIpWhiteListOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpWhiteList) MiddlewareSpecIpWhiteList {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecIpWhiteList
		return ret
	}).(MiddlewareSpecIpWhiteListOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecIpWhiteListPtrOutput) IpStrategy() MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpWhiteList) *MiddlewareSpecIpWhiteListIpStrategy {
		if v == nil {
			return nil
		}
		return v.IpStrategy
	}).(MiddlewareSpecIpWhiteListIpStrategyPtrOutput)
}

// SourceRange defines the set of allowed IPs (or ranges of allowed IPs by using CIDR notation). Required.
func (o MiddlewareSpecIpWhiteListPtrOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpWhiteList) []string {
		if v == nil {
			return nil
		}
		return v.SourceRange
	}).(pulumi.StringArrayOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecIpWhiteListIpStrategy struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth *int `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs []string `pulumi:"excludedIPs"`
}

// MiddlewareSpecIpWhiteListIpStrategyInput is an input type that accepts MiddlewareSpecIpWhiteListIpStrategyArgs and MiddlewareSpecIpWhiteListIpStrategyOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpWhiteListIpStrategyInput` via:
//
//	MiddlewareSpecIpWhiteListIpStrategyArgs{...}
type MiddlewareSpecIpWhiteListIpStrategyInput interface {
	pulumi.Input

	ToMiddlewareSpecIpWhiteListIpStrategyOutput() MiddlewareSpecIpWhiteListIpStrategyOutput
	ToMiddlewareSpecIpWhiteListIpStrategyOutputWithContext(context.Context) MiddlewareSpecIpWhiteListIpStrategyOutput
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecIpWhiteListIpStrategyArgs struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth pulumi.IntPtrInput `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs pulumi.StringArrayInput `pulumi:"excludedIPs"`
}

func (MiddlewareSpecIpWhiteListIpStrategyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpWhiteListIpStrategy)(nil)).Elem()
}

func (i MiddlewareSpecIpWhiteListIpStrategyArgs) ToMiddlewareSpecIpWhiteListIpStrategyOutput() MiddlewareSpecIpWhiteListIpStrategyOutput {
	return i.ToMiddlewareSpecIpWhiteListIpStrategyOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpWhiteListIpStrategyArgs) ToMiddlewareSpecIpWhiteListIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListIpStrategyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpWhiteListIpStrategyOutput)
}

func (i MiddlewareSpecIpWhiteListIpStrategyArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpWhiteListIpStrategy] {
	return pulumix.Output[MiddlewareSpecIpWhiteListIpStrategy]{
		OutputState: i.ToMiddlewareSpecIpWhiteListIpStrategyOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecIpWhiteListIpStrategyArgs) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutput() MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return i.ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecIpWhiteListIpStrategyArgs) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpWhiteListIpStrategyOutput).ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(ctx)
}

// MiddlewareSpecIpWhiteListIpStrategyPtrInput is an input type that accepts MiddlewareSpecIpWhiteListIpStrategyArgs, MiddlewareSpecIpWhiteListIpStrategyPtr and MiddlewareSpecIpWhiteListIpStrategyPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecIpWhiteListIpStrategyPtrInput` via:
//
//	        MiddlewareSpecIpWhiteListIpStrategyArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecIpWhiteListIpStrategyPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecIpWhiteListIpStrategyPtrOutput() MiddlewareSpecIpWhiteListIpStrategyPtrOutput
	ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(context.Context) MiddlewareSpecIpWhiteListIpStrategyPtrOutput
}

type middlewareSpecIpWhiteListIpStrategyPtrType MiddlewareSpecIpWhiteListIpStrategyArgs

func MiddlewareSpecIpWhiteListIpStrategyPtr(v *MiddlewareSpecIpWhiteListIpStrategyArgs) MiddlewareSpecIpWhiteListIpStrategyPtrInput {
	return (*middlewareSpecIpWhiteListIpStrategyPtrType)(v)
}

func (*middlewareSpecIpWhiteListIpStrategyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpWhiteListIpStrategy)(nil)).Elem()
}

func (i *middlewareSpecIpWhiteListIpStrategyPtrType) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutput() MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return i.ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecIpWhiteListIpStrategyPtrType) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecIpWhiteListIpStrategyPtrOutput)
}

func (i *middlewareSpecIpWhiteListIpStrategyPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpWhiteListIpStrategy] {
	return pulumix.Output[*MiddlewareSpecIpWhiteListIpStrategy]{
		OutputState: i.ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(ctx).OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecIpWhiteListIpStrategyOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpWhiteListIpStrategyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecIpWhiteListIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecIpWhiteListIpStrategyOutput) ToMiddlewareSpecIpWhiteListIpStrategyOutput() MiddlewareSpecIpWhiteListIpStrategyOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListIpStrategyOutput) ToMiddlewareSpecIpWhiteListIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListIpStrategyOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListIpStrategyOutput) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutput() MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return o.ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecIpWhiteListIpStrategyOutput) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecIpWhiteListIpStrategy) *MiddlewareSpecIpWhiteListIpStrategy {
		return &v
	}).(MiddlewareSpecIpWhiteListIpStrategyPtrOutput)
}

func (o MiddlewareSpecIpWhiteListIpStrategyOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecIpWhiteListIpStrategy] {
	return pulumix.Output[MiddlewareSpecIpWhiteListIpStrategy]{
		OutputState: o.OutputState,
	}
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecIpWhiteListIpStrategyOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecIpWhiteListIpStrategy) *int { return v.Depth }).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecIpWhiteListIpStrategyOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecIpWhiteListIpStrategy) []string { return v.ExcludedIPs }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecIpWhiteListIpStrategyPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecIpWhiteListIpStrategyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecIpWhiteListIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecIpWhiteListIpStrategyPtrOutput) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutput() MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListIpStrategyPtrOutput) ToMiddlewareSpecIpWhiteListIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecIpWhiteListIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecIpWhiteListIpStrategyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecIpWhiteListIpStrategy] {
	return pulumix.Output[*MiddlewareSpecIpWhiteListIpStrategy]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecIpWhiteListIpStrategyPtrOutput) Elem() MiddlewareSpecIpWhiteListIpStrategyOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpWhiteListIpStrategy) MiddlewareSpecIpWhiteListIpStrategy {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecIpWhiteListIpStrategy
		return ret
	}).(MiddlewareSpecIpWhiteListIpStrategyOutput)
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecIpWhiteListIpStrategyPtrOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpWhiteListIpStrategy) *int {
		if v == nil {
			return nil
		}
		return v.Depth
	}).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecIpWhiteListIpStrategyPtrOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecIpWhiteListIpStrategy) []string {
		if v == nil {
			return nil
		}
		return v.ExcludedIPs
	}).(pulumi.StringArrayOutput)
}

// PassTLSClientCert holds the pass TLS client cert middleware configuration.
// This middleware adds the selected data from the passed client TLS certificate to a header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
type MiddlewareSpecPassTLSClientCert struct {
	// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
	Info *MiddlewareSpecPassTLSClientCertInfo `pulumi:"info"`
	// PEM sets the X-Forwarded-Tls-Client-Cert header with the certificate.
	Pem *bool `pulumi:"pem"`
}

// MiddlewareSpecPassTLSClientCertInput is an input type that accepts MiddlewareSpecPassTLSClientCertArgs and MiddlewareSpecPassTLSClientCertOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInput` via:
//
//	MiddlewareSpecPassTLSClientCertArgs{...}
type MiddlewareSpecPassTLSClientCertInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertOutput() MiddlewareSpecPassTLSClientCertOutput
	ToMiddlewareSpecPassTLSClientCertOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertOutput
}

// PassTLSClientCert holds the pass TLS client cert middleware configuration.
// This middleware adds the selected data from the passed client TLS certificate to a header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
type MiddlewareSpecPassTLSClientCertArgs struct {
	// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
	Info MiddlewareSpecPassTLSClientCertInfoPtrInput `pulumi:"info"`
	// PEM sets the X-Forwarded-Tls-Client-Cert header with the certificate.
	Pem pulumi.BoolPtrInput `pulumi:"pem"`
}

func (MiddlewareSpecPassTLSClientCertArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCert)(nil)).Elem()
}

func (i MiddlewareSpecPassTLSClientCertArgs) ToMiddlewareSpecPassTLSClientCertOutput() MiddlewareSpecPassTLSClientCertOutput {
	return i.ToMiddlewareSpecPassTLSClientCertOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertArgs) ToMiddlewareSpecPassTLSClientCertOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertOutput)
}

func (i MiddlewareSpecPassTLSClientCertArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCert] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCert]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecPassTLSClientCertArgs) ToMiddlewareSpecPassTLSClientCertPtrOutput() MiddlewareSpecPassTLSClientCertPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertArgs) ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertOutput).ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(ctx)
}

// MiddlewareSpecPassTLSClientCertPtrInput is an input type that accepts MiddlewareSpecPassTLSClientCertArgs, MiddlewareSpecPassTLSClientCertPtr and MiddlewareSpecPassTLSClientCertPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertPtrInput` via:
//
//	        MiddlewareSpecPassTLSClientCertArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecPassTLSClientCertPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertPtrOutput() MiddlewareSpecPassTLSClientCertPtrOutput
	ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertPtrOutput
}

type middlewareSpecPassTLSClientCertPtrType MiddlewareSpecPassTLSClientCertArgs

func MiddlewareSpecPassTLSClientCertPtr(v *MiddlewareSpecPassTLSClientCertArgs) MiddlewareSpecPassTLSClientCertPtrInput {
	return (*middlewareSpecPassTLSClientCertPtrType)(v)
}

func (*middlewareSpecPassTLSClientCertPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCert)(nil)).Elem()
}

func (i *middlewareSpecPassTLSClientCertPtrType) ToMiddlewareSpecPassTLSClientCertPtrOutput() MiddlewareSpecPassTLSClientCertPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecPassTLSClientCertPtrType) ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertPtrOutput)
}

func (i *middlewareSpecPassTLSClientCertPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCert] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCert]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(ctx).OutputState,
	}
}

// PassTLSClientCert holds the pass TLS client cert middleware configuration.
// This middleware adds the selected data from the passed client TLS certificate to a header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/passtlsclientcert/
type MiddlewareSpecPassTLSClientCertOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCert)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertOutput) ToMiddlewareSpecPassTLSClientCertOutput() MiddlewareSpecPassTLSClientCertOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertOutput) ToMiddlewareSpecPassTLSClientCertOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertOutput) ToMiddlewareSpecPassTLSClientCertPtrOutput() MiddlewareSpecPassTLSClientCertPtrOutput {
	return o.ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecPassTLSClientCertOutput) ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecPassTLSClientCert) *MiddlewareSpecPassTLSClientCert {
		return &v
	}).(MiddlewareSpecPassTLSClientCertPtrOutput)
}

func (o MiddlewareSpecPassTLSClientCertOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCert] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCert]{
		OutputState: o.OutputState,
	}
}

// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
func (o MiddlewareSpecPassTLSClientCertOutput) Info() MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCert) *MiddlewareSpecPassTLSClientCertInfo { return v.Info }).(MiddlewareSpecPassTLSClientCertInfoPtrOutput)
}

// PEM sets the X-Forwarded-Tls-Client-Cert header with the certificate.
func (o MiddlewareSpecPassTLSClientCertOutput) Pem() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCert) *bool { return v.Pem }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecPassTLSClientCertPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCert)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertPtrOutput) ToMiddlewareSpecPassTLSClientCertPtrOutput() MiddlewareSpecPassTLSClientCertPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertPtrOutput) ToMiddlewareSpecPassTLSClientCertPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCert] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCert]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecPassTLSClientCertPtrOutput) Elem() MiddlewareSpecPassTLSClientCertOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCert) MiddlewareSpecPassTLSClientCert {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecPassTLSClientCert
		return ret
	}).(MiddlewareSpecPassTLSClientCertOutput)
}

// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
func (o MiddlewareSpecPassTLSClientCertPtrOutput) Info() MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCert) *MiddlewareSpecPassTLSClientCertInfo {
		if v == nil {
			return nil
		}
		return v.Info
	}).(MiddlewareSpecPassTLSClientCertInfoPtrOutput)
}

// PEM sets the X-Forwarded-Tls-Client-Cert header with the certificate.
func (o MiddlewareSpecPassTLSClientCertPtrOutput) Pem() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCert) *bool {
		if v == nil {
			return nil
		}
		return v.Pem
	}).(pulumi.BoolPtrOutput)
}

// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfo struct {
	// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
	Issuer *MiddlewareSpecPassTLSClientCertInfoIssuer `pulumi:"issuer"`
	// NotAfter defines whether to add the Not After information from the Validity part.
	NotAfter *bool `pulumi:"notAfter"`
	// NotBefore defines whether to add the Not Before information from the Validity part.
	NotBefore *bool `pulumi:"notBefore"`
	// Sans defines whether to add the Subject Alternative Name information from the Subject Alternative Name part.
	Sans *bool `pulumi:"sans"`
	// SerialNumber defines whether to add the client serialNumber information.
	SerialNumber *bool `pulumi:"serialNumber"`
	// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
	Subject *MiddlewareSpecPassTLSClientCertInfoSubject `pulumi:"subject"`
}

// MiddlewareSpecPassTLSClientCertInfoInput is an input type that accepts MiddlewareSpecPassTLSClientCertInfoArgs and MiddlewareSpecPassTLSClientCertInfoOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInfoInput` via:
//
//	MiddlewareSpecPassTLSClientCertInfoArgs{...}
type MiddlewareSpecPassTLSClientCertInfoInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertInfoOutput() MiddlewareSpecPassTLSClientCertInfoOutput
	ToMiddlewareSpecPassTLSClientCertInfoOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertInfoOutput
}

// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoArgs struct {
	// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
	Issuer MiddlewareSpecPassTLSClientCertInfoIssuerPtrInput `pulumi:"issuer"`
	// NotAfter defines whether to add the Not After information from the Validity part.
	NotAfter pulumi.BoolPtrInput `pulumi:"notAfter"`
	// NotBefore defines whether to add the Not Before information from the Validity part.
	NotBefore pulumi.BoolPtrInput `pulumi:"notBefore"`
	// Sans defines whether to add the Subject Alternative Name information from the Subject Alternative Name part.
	Sans pulumi.BoolPtrInput `pulumi:"sans"`
	// SerialNumber defines whether to add the client serialNumber information.
	SerialNumber pulumi.BoolPtrInput `pulumi:"serialNumber"`
	// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
	Subject MiddlewareSpecPassTLSClientCertInfoSubjectPtrInput `pulumi:"subject"`
}

func (MiddlewareSpecPassTLSClientCertInfoArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfo)(nil)).Elem()
}

func (i MiddlewareSpecPassTLSClientCertInfoArgs) ToMiddlewareSpecPassTLSClientCertInfoOutput() MiddlewareSpecPassTLSClientCertInfoOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertInfoArgs) ToMiddlewareSpecPassTLSClientCertInfoOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoOutput)
}

func (i MiddlewareSpecPassTLSClientCertInfoArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCertInfo] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCertInfo]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertInfoOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecPassTLSClientCertInfoArgs) ToMiddlewareSpecPassTLSClientCertInfoPtrOutput() MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertInfoArgs) ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoOutput).ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(ctx)
}

// MiddlewareSpecPassTLSClientCertInfoPtrInput is an input type that accepts MiddlewareSpecPassTLSClientCertInfoArgs, MiddlewareSpecPassTLSClientCertInfoPtr and MiddlewareSpecPassTLSClientCertInfoPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInfoPtrInput` via:
//
//	        MiddlewareSpecPassTLSClientCertInfoArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecPassTLSClientCertInfoPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertInfoPtrOutput() MiddlewareSpecPassTLSClientCertInfoPtrOutput
	ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertInfoPtrOutput
}

type middlewareSpecPassTLSClientCertInfoPtrType MiddlewareSpecPassTLSClientCertInfoArgs

func MiddlewareSpecPassTLSClientCertInfoPtr(v *MiddlewareSpecPassTLSClientCertInfoArgs) MiddlewareSpecPassTLSClientCertInfoPtrInput {
	return (*middlewareSpecPassTLSClientCertInfoPtrType)(v)
}

func (*middlewareSpecPassTLSClientCertInfoPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCertInfo)(nil)).Elem()
}

func (i *middlewareSpecPassTLSClientCertInfoPtrType) ToMiddlewareSpecPassTLSClientCertInfoPtrOutput() MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecPassTLSClientCertInfoPtrType) ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoPtrOutput)
}

func (i *middlewareSpecPassTLSClientCertInfoPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCertInfo] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCertInfo]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(ctx).OutputState,
	}
}

// Info selects the specific client certificate details you want to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertInfoOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfo)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertInfoOutput) ToMiddlewareSpecPassTLSClientCertInfoOutput() MiddlewareSpecPassTLSClientCertInfoOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoOutput) ToMiddlewareSpecPassTLSClientCertInfoOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoOutput) ToMiddlewareSpecPassTLSClientCertInfoPtrOutput() MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return o.ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecPassTLSClientCertInfoOutput) ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecPassTLSClientCertInfo) *MiddlewareSpecPassTLSClientCertInfo {
		return &v
	}).(MiddlewareSpecPassTLSClientCertInfoPtrOutput)
}

func (o MiddlewareSpecPassTLSClientCertInfoOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCertInfo] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCertInfo]{
		OutputState: o.OutputState,
	}
}

// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
func (o MiddlewareSpecPassTLSClientCertInfoOutput) Issuer() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfo) *MiddlewareSpecPassTLSClientCertInfoIssuer {
		return v.Issuer
	}).(MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput)
}

// NotAfter defines whether to add the Not After information from the Validity part.
func (o MiddlewareSpecPassTLSClientCertInfoOutput) NotAfter() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfo) *bool { return v.NotAfter }).(pulumi.BoolPtrOutput)
}

// NotBefore defines whether to add the Not Before information from the Validity part.
func (o MiddlewareSpecPassTLSClientCertInfoOutput) NotBefore() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfo) *bool { return v.NotBefore }).(pulumi.BoolPtrOutput)
}

// Sans defines whether to add the Subject Alternative Name information from the Subject Alternative Name part.
func (o MiddlewareSpecPassTLSClientCertInfoOutput) Sans() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfo) *bool { return v.Sans }).(pulumi.BoolPtrOutput)
}

// SerialNumber defines whether to add the client serialNumber information.
func (o MiddlewareSpecPassTLSClientCertInfoOutput) SerialNumber() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfo) *bool { return v.SerialNumber }).(pulumi.BoolPtrOutput)
}

// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
func (o MiddlewareSpecPassTLSClientCertInfoOutput) Subject() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfo) *MiddlewareSpecPassTLSClientCertInfoSubject {
		return v.Subject
	}).(MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput)
}

type MiddlewareSpecPassTLSClientCertInfoPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertInfoPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCertInfo)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) ToMiddlewareSpecPassTLSClientCertInfoPtrOutput() MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) ToMiddlewareSpecPassTLSClientCertInfoPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCertInfo] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCertInfo]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) Elem() MiddlewareSpecPassTLSClientCertInfoOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) MiddlewareSpecPassTLSClientCertInfo {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecPassTLSClientCertInfo
		return ret
	}).(MiddlewareSpecPassTLSClientCertInfoOutput)
}

// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) Issuer() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) *MiddlewareSpecPassTLSClientCertInfoIssuer {
		if v == nil {
			return nil
		}
		return v.Issuer
	}).(MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput)
}

// NotAfter defines whether to add the Not After information from the Validity part.
func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) NotAfter() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) *bool {
		if v == nil {
			return nil
		}
		return v.NotAfter
	}).(pulumi.BoolPtrOutput)
}

// NotBefore defines whether to add the Not Before information from the Validity part.
func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) NotBefore() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) *bool {
		if v == nil {
			return nil
		}
		return v.NotBefore
	}).(pulumi.BoolPtrOutput)
}

// Sans defines whether to add the Subject Alternative Name information from the Subject Alternative Name part.
func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) Sans() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) *bool {
		if v == nil {
			return nil
		}
		return v.Sans
	}).(pulumi.BoolPtrOutput)
}

// SerialNumber defines whether to add the client serialNumber information.
func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) SerialNumber() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) *bool {
		if v == nil {
			return nil
		}
		return v.SerialNumber
	}).(pulumi.BoolPtrOutput)
}

// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
func (o MiddlewareSpecPassTLSClientCertInfoPtrOutput) Subject() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfo) *MiddlewareSpecPassTLSClientCertInfoSubject {
		if v == nil {
			return nil
		}
		return v.Subject
	}).(MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput)
}

// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoIssuer struct {
	// CommonName defines whether to add the organizationalUnit information into the issuer.
	CommonName *bool `pulumi:"commonName"`
	// Country defines whether to add the country information into the issuer.
	Country *bool `pulumi:"country"`
	// DomainComponent defines whether to add the domainComponent information into the issuer.
	DomainComponent *bool `pulumi:"domainComponent"`
	// Locality defines whether to add the locality information into the issuer.
	Locality *bool `pulumi:"locality"`
	// Organization defines whether to add the organization information into the issuer.
	Organization *bool `pulumi:"organization"`
	// Province defines whether to add the province information into the issuer.
	Province *bool `pulumi:"province"`
	// SerialNumber defines whether to add the serialNumber information into the issuer.
	SerialNumber *bool `pulumi:"serialNumber"`
}

// MiddlewareSpecPassTLSClientCertInfoIssuerInput is an input type that accepts MiddlewareSpecPassTLSClientCertInfoIssuerArgs and MiddlewareSpecPassTLSClientCertInfoIssuerOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInfoIssuerInput` via:
//
//	MiddlewareSpecPassTLSClientCertInfoIssuerArgs{...}
type MiddlewareSpecPassTLSClientCertInfoIssuerInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertInfoIssuerOutput() MiddlewareSpecPassTLSClientCertInfoIssuerOutput
	ToMiddlewareSpecPassTLSClientCertInfoIssuerOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerOutput
}

// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoIssuerArgs struct {
	// CommonName defines whether to add the organizationalUnit information into the issuer.
	CommonName pulumi.BoolPtrInput `pulumi:"commonName"`
	// Country defines whether to add the country information into the issuer.
	Country pulumi.BoolPtrInput `pulumi:"country"`
	// DomainComponent defines whether to add the domainComponent information into the issuer.
	DomainComponent pulumi.BoolPtrInput `pulumi:"domainComponent"`
	// Locality defines whether to add the locality information into the issuer.
	Locality pulumi.BoolPtrInput `pulumi:"locality"`
	// Organization defines whether to add the organization information into the issuer.
	Organization pulumi.BoolPtrInput `pulumi:"organization"`
	// Province defines whether to add the province information into the issuer.
	Province pulumi.BoolPtrInput `pulumi:"province"`
	// SerialNumber defines whether to add the serialNumber information into the issuer.
	SerialNumber pulumi.BoolPtrInput `pulumi:"serialNumber"`
}

func (MiddlewareSpecPassTLSClientCertInfoIssuerArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoIssuer)(nil)).Elem()
}

func (i MiddlewareSpecPassTLSClientCertInfoIssuerArgs) ToMiddlewareSpecPassTLSClientCertInfoIssuerOutput() MiddlewareSpecPassTLSClientCertInfoIssuerOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoIssuerOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertInfoIssuerArgs) ToMiddlewareSpecPassTLSClientCertInfoIssuerOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoIssuerOutput)
}

func (i MiddlewareSpecPassTLSClientCertInfoIssuerArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCertInfoIssuer] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCertInfoIssuer]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertInfoIssuerOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecPassTLSClientCertInfoIssuerArgs) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertInfoIssuerArgs) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoIssuerOutput).ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(ctx)
}

// MiddlewareSpecPassTLSClientCertInfoIssuerPtrInput is an input type that accepts MiddlewareSpecPassTLSClientCertInfoIssuerArgs, MiddlewareSpecPassTLSClientCertInfoIssuerPtr and MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInfoIssuerPtrInput` via:
//
//	        MiddlewareSpecPassTLSClientCertInfoIssuerArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecPassTLSClientCertInfoIssuerPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput
	ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput
}

type middlewareSpecPassTLSClientCertInfoIssuerPtrType MiddlewareSpecPassTLSClientCertInfoIssuerArgs

func MiddlewareSpecPassTLSClientCertInfoIssuerPtr(v *MiddlewareSpecPassTLSClientCertInfoIssuerArgs) MiddlewareSpecPassTLSClientCertInfoIssuerPtrInput {
	return (*middlewareSpecPassTLSClientCertInfoIssuerPtrType)(v)
}

func (*middlewareSpecPassTLSClientCertInfoIssuerPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCertInfoIssuer)(nil)).Elem()
}

func (i *middlewareSpecPassTLSClientCertInfoIssuerPtrType) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecPassTLSClientCertInfoIssuerPtrType) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput)
}

func (i *middlewareSpecPassTLSClientCertInfoIssuerPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoIssuer] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoIssuer]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(ctx).OutputState,
	}
}

// Issuer defines the client certificate issuer details to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoIssuerOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertInfoIssuerOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoIssuer)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) ToMiddlewareSpecPassTLSClientCertInfoIssuerOutput() MiddlewareSpecPassTLSClientCertInfoIssuerOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) ToMiddlewareSpecPassTLSClientCertInfoIssuerOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return o.ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecPassTLSClientCertInfoIssuer) *MiddlewareSpecPassTLSClientCertInfoIssuer {
		return &v
	}).(MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput)
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCertInfoIssuer] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCertInfoIssuer]{
		OutputState: o.OutputState,
	}
}

// CommonName defines whether to add the organizationalUnit information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) CommonName() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.CommonName }).(pulumi.BoolPtrOutput)
}

// Country defines whether to add the country information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) Country() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.Country }).(pulumi.BoolPtrOutput)
}

// DomainComponent defines whether to add the domainComponent information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) DomainComponent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.DomainComponent }).(pulumi.BoolPtrOutput)
}

// Locality defines whether to add the locality information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) Locality() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.Locality }).(pulumi.BoolPtrOutput)
}

// Organization defines whether to add the organization information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) Organization() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.Organization }).(pulumi.BoolPtrOutput)
}

// Province defines whether to add the province information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) Province() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.Province }).(pulumi.BoolPtrOutput)
}

// SerialNumber defines whether to add the serialNumber information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerOutput) SerialNumber() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoIssuer) *bool { return v.SerialNumber }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCertInfoIssuer)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput() MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) ToMiddlewareSpecPassTLSClientCertInfoIssuerPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoIssuer] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoIssuer]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) Elem() MiddlewareSpecPassTLSClientCertInfoIssuerOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) MiddlewareSpecPassTLSClientCertInfoIssuer {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecPassTLSClientCertInfoIssuer
		return ret
	}).(MiddlewareSpecPassTLSClientCertInfoIssuerOutput)
}

// CommonName defines whether to add the organizationalUnit information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) CommonName() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.CommonName
	}).(pulumi.BoolPtrOutput)
}

// Country defines whether to add the country information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) Country() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.Country
	}).(pulumi.BoolPtrOutput)
}

// DomainComponent defines whether to add the domainComponent information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) DomainComponent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.DomainComponent
	}).(pulumi.BoolPtrOutput)
}

// Locality defines whether to add the locality information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) Locality() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.Locality
	}).(pulumi.BoolPtrOutput)
}

// Organization defines whether to add the organization information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) Organization() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.Organization
	}).(pulumi.BoolPtrOutput)
}

// Province defines whether to add the province information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) Province() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.Province
	}).(pulumi.BoolPtrOutput)
}

// SerialNumber defines whether to add the serialNumber information into the issuer.
func (o MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput) SerialNumber() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoIssuer) *bool {
		if v == nil {
			return nil
		}
		return v.SerialNumber
	}).(pulumi.BoolPtrOutput)
}

// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoSubject struct {
	// CommonName defines whether to add the organizationalUnit information into the subject.
	CommonName *bool `pulumi:"commonName"`
	// Country defines whether to add the country information into the subject.
	Country *bool `pulumi:"country"`
	// DomainComponent defines whether to add the domainComponent information into the subject.
	DomainComponent *bool `pulumi:"domainComponent"`
	// Locality defines whether to add the locality information into the subject.
	Locality *bool `pulumi:"locality"`
	// Organization defines whether to add the organization information into the subject.
	Organization *bool `pulumi:"organization"`
	// OrganizationalUnit defines whether to add the organizationalUnit information into the subject.
	OrganizationalUnit *bool `pulumi:"organizationalUnit"`
	// Province defines whether to add the province information into the subject.
	Province *bool `pulumi:"province"`
	// SerialNumber defines whether to add the serialNumber information into the subject.
	SerialNumber *bool `pulumi:"serialNumber"`
}

// MiddlewareSpecPassTLSClientCertInfoSubjectInput is an input type that accepts MiddlewareSpecPassTLSClientCertInfoSubjectArgs and MiddlewareSpecPassTLSClientCertInfoSubjectOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInfoSubjectInput` via:
//
//	MiddlewareSpecPassTLSClientCertInfoSubjectArgs{...}
type MiddlewareSpecPassTLSClientCertInfoSubjectInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertInfoSubjectOutput() MiddlewareSpecPassTLSClientCertInfoSubjectOutput
	ToMiddlewareSpecPassTLSClientCertInfoSubjectOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectOutput
}

// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoSubjectArgs struct {
	// CommonName defines whether to add the organizationalUnit information into the subject.
	CommonName pulumi.BoolPtrInput `pulumi:"commonName"`
	// Country defines whether to add the country information into the subject.
	Country pulumi.BoolPtrInput `pulumi:"country"`
	// DomainComponent defines whether to add the domainComponent information into the subject.
	DomainComponent pulumi.BoolPtrInput `pulumi:"domainComponent"`
	// Locality defines whether to add the locality information into the subject.
	Locality pulumi.BoolPtrInput `pulumi:"locality"`
	// Organization defines whether to add the organization information into the subject.
	Organization pulumi.BoolPtrInput `pulumi:"organization"`
	// OrganizationalUnit defines whether to add the organizationalUnit information into the subject.
	OrganizationalUnit pulumi.BoolPtrInput `pulumi:"organizationalUnit"`
	// Province defines whether to add the province information into the subject.
	Province pulumi.BoolPtrInput `pulumi:"province"`
	// SerialNumber defines whether to add the serialNumber information into the subject.
	SerialNumber pulumi.BoolPtrInput `pulumi:"serialNumber"`
}

func (MiddlewareSpecPassTLSClientCertInfoSubjectArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoSubject)(nil)).Elem()
}

func (i MiddlewareSpecPassTLSClientCertInfoSubjectArgs) ToMiddlewareSpecPassTLSClientCertInfoSubjectOutput() MiddlewareSpecPassTLSClientCertInfoSubjectOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoSubjectOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertInfoSubjectArgs) ToMiddlewareSpecPassTLSClientCertInfoSubjectOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoSubjectOutput)
}

func (i MiddlewareSpecPassTLSClientCertInfoSubjectArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCertInfoSubject] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCertInfoSubject]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertInfoSubjectOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecPassTLSClientCertInfoSubjectArgs) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecPassTLSClientCertInfoSubjectArgs) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoSubjectOutput).ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(ctx)
}

// MiddlewareSpecPassTLSClientCertInfoSubjectPtrInput is an input type that accepts MiddlewareSpecPassTLSClientCertInfoSubjectArgs, MiddlewareSpecPassTLSClientCertInfoSubjectPtr and MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecPassTLSClientCertInfoSubjectPtrInput` via:
//
//	        MiddlewareSpecPassTLSClientCertInfoSubjectArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecPassTLSClientCertInfoSubjectPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput
	ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput
}

type middlewareSpecPassTLSClientCertInfoSubjectPtrType MiddlewareSpecPassTLSClientCertInfoSubjectArgs

func MiddlewareSpecPassTLSClientCertInfoSubjectPtr(v *MiddlewareSpecPassTLSClientCertInfoSubjectArgs) MiddlewareSpecPassTLSClientCertInfoSubjectPtrInput {
	return (*middlewareSpecPassTLSClientCertInfoSubjectPtrType)(v)
}

func (*middlewareSpecPassTLSClientCertInfoSubjectPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCertInfoSubject)(nil)).Elem()
}

func (i *middlewareSpecPassTLSClientCertInfoSubjectPtrType) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return i.ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecPassTLSClientCertInfoSubjectPtrType) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput)
}

func (i *middlewareSpecPassTLSClientCertInfoSubjectPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoSubject] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoSubject]{
		OutputState: i.ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(ctx).OutputState,
	}
}

// Subject defines the client certificate subject details to add to the X-Forwarded-Tls-Client-Cert-Info header.
type MiddlewareSpecPassTLSClientCertInfoSubjectOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertInfoSubjectOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoSubject)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) ToMiddlewareSpecPassTLSClientCertInfoSubjectOutput() MiddlewareSpecPassTLSClientCertInfoSubjectOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) ToMiddlewareSpecPassTLSClientCertInfoSubjectOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return o.ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecPassTLSClientCertInfoSubject) *MiddlewareSpecPassTLSClientCertInfoSubject {
		return &v
	}).(MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput)
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecPassTLSClientCertInfoSubject] {
	return pulumix.Output[MiddlewareSpecPassTLSClientCertInfoSubject]{
		OutputState: o.OutputState,
	}
}

// CommonName defines whether to add the organizationalUnit information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) CommonName() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.CommonName }).(pulumi.BoolPtrOutput)
}

// Country defines whether to add the country information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) Country() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.Country }).(pulumi.BoolPtrOutput)
}

// DomainComponent defines whether to add the domainComponent information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) DomainComponent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.DomainComponent }).(pulumi.BoolPtrOutput)
}

// Locality defines whether to add the locality information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) Locality() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.Locality }).(pulumi.BoolPtrOutput)
}

// Organization defines whether to add the organization information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) Organization() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.Organization }).(pulumi.BoolPtrOutput)
}

// OrganizationalUnit defines whether to add the organizationalUnit information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) OrganizationalUnit() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.OrganizationalUnit }).(pulumi.BoolPtrOutput)
}

// Province defines whether to add the province information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) Province() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.Province }).(pulumi.BoolPtrOutput)
}

// SerialNumber defines whether to add the serialNumber information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectOutput) SerialNumber() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecPassTLSClientCertInfoSubject) *bool { return v.SerialNumber }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecPassTLSClientCertInfoSubject)(nil)).Elem()
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput() MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) ToMiddlewareSpecPassTLSClientCertInfoSubjectPtrOutputWithContext(ctx context.Context) MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput {
	return o
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoSubject] {
	return pulumix.Output[*MiddlewareSpecPassTLSClientCertInfoSubject]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) Elem() MiddlewareSpecPassTLSClientCertInfoSubjectOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) MiddlewareSpecPassTLSClientCertInfoSubject {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecPassTLSClientCertInfoSubject
		return ret
	}).(MiddlewareSpecPassTLSClientCertInfoSubjectOutput)
}

// CommonName defines whether to add the organizationalUnit information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) CommonName() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.CommonName
	}).(pulumi.BoolPtrOutput)
}

// Country defines whether to add the country information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) Country() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.Country
	}).(pulumi.BoolPtrOutput)
}

// DomainComponent defines whether to add the domainComponent information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) DomainComponent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.DomainComponent
	}).(pulumi.BoolPtrOutput)
}

// Locality defines whether to add the locality information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) Locality() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.Locality
	}).(pulumi.BoolPtrOutput)
}

// Organization defines whether to add the organization information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) Organization() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.Organization
	}).(pulumi.BoolPtrOutput)
}

// OrganizationalUnit defines whether to add the organizationalUnit information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) OrganizationalUnit() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.OrganizationalUnit
	}).(pulumi.BoolPtrOutput)
}

// Province defines whether to add the province information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) Province() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.Province
	}).(pulumi.BoolPtrOutput)
}

// SerialNumber defines whether to add the serialNumber information into the subject.
func (o MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput) SerialNumber() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecPassTLSClientCertInfoSubject) *bool {
		if v == nil {
			return nil
		}
		return v.SerialNumber
	}).(pulumi.BoolPtrOutput)
}

// Plugin defines the middleware plugin configuration.
// More info: https://doc.traefik.io/traefik/plugins/
type MiddlewareSpecPlugin struct {
}

// RateLimit holds the rate limit configuration.
// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
type MiddlewareSpecRateLimit struct {
	// Average is the maximum rate, by default in requests/s, allowed for the given source.
	// It defaults to 0, which means no rate limiting.
	// The rate is actually defined by dividing Average by Period. So for a rate below 1req/s,
	// one needs to define a Period larger than a second.
	Average *int `pulumi:"average"`
	// Burst is the maximum number of requests allowed to arrive in the same arbitrarily small period of time.
	// It defaults to 1.
	Burst *int `pulumi:"burst"`
	// Period, in combination with Average, defines the actual maximum rate, such as:
	// r = Average / Period. It defaults to a second.
	Period interface{} `pulumi:"period"`
	// SourceCriterion defines what criterion is used to group requests as originating from a common source.
	// If several strategies are defined at the same time, an error will be raised.
	// If none are set, the default is to use the request's remote address field (as an ipStrategy).
	SourceCriterion *MiddlewareSpecRateLimitSourceCriterion `pulumi:"sourceCriterion"`
}

// MiddlewareSpecRateLimitInput is an input type that accepts MiddlewareSpecRateLimitArgs and MiddlewareSpecRateLimitOutput values.
// You can construct a concrete instance of `MiddlewareSpecRateLimitInput` via:
//
//	MiddlewareSpecRateLimitArgs{...}
type MiddlewareSpecRateLimitInput interface {
	pulumi.Input

	ToMiddlewareSpecRateLimitOutput() MiddlewareSpecRateLimitOutput
	ToMiddlewareSpecRateLimitOutputWithContext(context.Context) MiddlewareSpecRateLimitOutput
}

// RateLimit holds the rate limit configuration.
// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
type MiddlewareSpecRateLimitArgs struct {
	// Average is the maximum rate, by default in requests/s, allowed for the given source.
	// It defaults to 0, which means no rate limiting.
	// The rate is actually defined by dividing Average by Period. So for a rate below 1req/s,
	// one needs to define a Period larger than a second.
	Average pulumi.IntPtrInput `pulumi:"average"`
	// Burst is the maximum number of requests allowed to arrive in the same arbitrarily small period of time.
	// It defaults to 1.
	Burst pulumi.IntPtrInput `pulumi:"burst"`
	// Period, in combination with Average, defines the actual maximum rate, such as:
	// r = Average / Period. It defaults to a second.
	Period pulumi.Input `pulumi:"period"`
	// SourceCriterion defines what criterion is used to group requests as originating from a common source.
	// If several strategies are defined at the same time, an error will be raised.
	// If none are set, the default is to use the request's remote address field (as an ipStrategy).
	SourceCriterion MiddlewareSpecRateLimitSourceCriterionPtrInput `pulumi:"sourceCriterion"`
}

func (MiddlewareSpecRateLimitArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRateLimit)(nil)).Elem()
}

func (i MiddlewareSpecRateLimitArgs) ToMiddlewareSpecRateLimitOutput() MiddlewareSpecRateLimitOutput {
	return i.ToMiddlewareSpecRateLimitOutputWithContext(context.Background())
}

func (i MiddlewareSpecRateLimitArgs) ToMiddlewareSpecRateLimitOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitOutput)
}

func (i MiddlewareSpecRateLimitArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRateLimit] {
	return pulumix.Output[MiddlewareSpecRateLimit]{
		OutputState: i.ToMiddlewareSpecRateLimitOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecRateLimitArgs) ToMiddlewareSpecRateLimitPtrOutput() MiddlewareSpecRateLimitPtrOutput {
	return i.ToMiddlewareSpecRateLimitPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecRateLimitArgs) ToMiddlewareSpecRateLimitPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitOutput).ToMiddlewareSpecRateLimitPtrOutputWithContext(ctx)
}

// MiddlewareSpecRateLimitPtrInput is an input type that accepts MiddlewareSpecRateLimitArgs, MiddlewareSpecRateLimitPtr and MiddlewareSpecRateLimitPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecRateLimitPtrInput` via:
//
//	        MiddlewareSpecRateLimitArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecRateLimitPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecRateLimitPtrOutput() MiddlewareSpecRateLimitPtrOutput
	ToMiddlewareSpecRateLimitPtrOutputWithContext(context.Context) MiddlewareSpecRateLimitPtrOutput
}

type middlewareSpecRateLimitPtrType MiddlewareSpecRateLimitArgs

func MiddlewareSpecRateLimitPtr(v *MiddlewareSpecRateLimitArgs) MiddlewareSpecRateLimitPtrInput {
	return (*middlewareSpecRateLimitPtrType)(v)
}

func (*middlewareSpecRateLimitPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRateLimit)(nil)).Elem()
}

func (i *middlewareSpecRateLimitPtrType) ToMiddlewareSpecRateLimitPtrOutput() MiddlewareSpecRateLimitPtrOutput {
	return i.ToMiddlewareSpecRateLimitPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecRateLimitPtrType) ToMiddlewareSpecRateLimitPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitPtrOutput)
}

func (i *middlewareSpecRateLimitPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRateLimit] {
	return pulumix.Output[*MiddlewareSpecRateLimit]{
		OutputState: i.ToMiddlewareSpecRateLimitPtrOutputWithContext(ctx).OutputState,
	}
}

// RateLimit holds the rate limit configuration.
// This middleware ensures that services will receive a fair amount of requests, and allows one to define what fair is.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ratelimit/
type MiddlewareSpecRateLimitOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRateLimitOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRateLimit)(nil)).Elem()
}

func (o MiddlewareSpecRateLimitOutput) ToMiddlewareSpecRateLimitOutput() MiddlewareSpecRateLimitOutput {
	return o
}

func (o MiddlewareSpecRateLimitOutput) ToMiddlewareSpecRateLimitOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitOutput {
	return o
}

func (o MiddlewareSpecRateLimitOutput) ToMiddlewareSpecRateLimitPtrOutput() MiddlewareSpecRateLimitPtrOutput {
	return o.ToMiddlewareSpecRateLimitPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecRateLimitOutput) ToMiddlewareSpecRateLimitPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecRateLimit) *MiddlewareSpecRateLimit {
		return &v
	}).(MiddlewareSpecRateLimitPtrOutput)
}

func (o MiddlewareSpecRateLimitOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRateLimit] {
	return pulumix.Output[MiddlewareSpecRateLimit]{
		OutputState: o.OutputState,
	}
}

// Average is the maximum rate, by default in requests/s, allowed for the given source.
// It defaults to 0, which means no rate limiting.
// The rate is actually defined by dividing Average by Period. So for a rate below 1req/s,
// one needs to define a Period larger than a second.
func (o MiddlewareSpecRateLimitOutput) Average() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimit) *int { return v.Average }).(pulumi.IntPtrOutput)
}

// Burst is the maximum number of requests allowed to arrive in the same arbitrarily small period of time.
// It defaults to 1.
func (o MiddlewareSpecRateLimitOutput) Burst() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimit) *int { return v.Burst }).(pulumi.IntPtrOutput)
}

// Period, in combination with Average, defines the actual maximum rate, such as:
// r = Average / Period. It defaults to a second.
func (o MiddlewareSpecRateLimitOutput) Period() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimit) interface{} { return v.Period }).(pulumi.AnyOutput)
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the request's remote address field (as an ipStrategy).
func (o MiddlewareSpecRateLimitOutput) SourceCriterion() MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimit) *MiddlewareSpecRateLimitSourceCriterion { return v.SourceCriterion }).(MiddlewareSpecRateLimitSourceCriterionPtrOutput)
}

type MiddlewareSpecRateLimitPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRateLimitPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRateLimit)(nil)).Elem()
}

func (o MiddlewareSpecRateLimitPtrOutput) ToMiddlewareSpecRateLimitPtrOutput() MiddlewareSpecRateLimitPtrOutput {
	return o
}

func (o MiddlewareSpecRateLimitPtrOutput) ToMiddlewareSpecRateLimitPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitPtrOutput {
	return o
}

func (o MiddlewareSpecRateLimitPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRateLimit] {
	return pulumix.Output[*MiddlewareSpecRateLimit]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecRateLimitPtrOutput) Elem() MiddlewareSpecRateLimitOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimit) MiddlewareSpecRateLimit {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecRateLimit
		return ret
	}).(MiddlewareSpecRateLimitOutput)
}

// Average is the maximum rate, by default in requests/s, allowed for the given source.
// It defaults to 0, which means no rate limiting.
// The rate is actually defined by dividing Average by Period. So for a rate below 1req/s,
// one needs to define a Period larger than a second.
func (o MiddlewareSpecRateLimitPtrOutput) Average() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimit) *int {
		if v == nil {
			return nil
		}
		return v.Average
	}).(pulumi.IntPtrOutput)
}

// Burst is the maximum number of requests allowed to arrive in the same arbitrarily small period of time.
// It defaults to 1.
func (o MiddlewareSpecRateLimitPtrOutput) Burst() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimit) *int {
		if v == nil {
			return nil
		}
		return v.Burst
	}).(pulumi.IntPtrOutput)
}

// Period, in combination with Average, defines the actual maximum rate, such as:
// r = Average / Period. It defaults to a second.
func (o MiddlewareSpecRateLimitPtrOutput) Period() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimit) interface{} {
		if v == nil {
			return nil
		}
		return v.Period
	}).(pulumi.AnyOutput)
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the request's remote address field (as an ipStrategy).
func (o MiddlewareSpecRateLimitPtrOutput) SourceCriterion() MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimit) *MiddlewareSpecRateLimitSourceCriterion {
		if v == nil {
			return nil
		}
		return v.SourceCriterion
	}).(MiddlewareSpecRateLimitSourceCriterionPtrOutput)
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the request's remote address field (as an ipStrategy).
type MiddlewareSpecRateLimitSourceCriterion struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy *MiddlewareSpecRateLimitSourceCriterionIpStrategy `pulumi:"ipStrategy"`
	// RequestHeaderName defines the name of the header used to group incoming requests.
	RequestHeaderName *string `pulumi:"requestHeaderName"`
	// RequestHost defines whether to consider the request Host as the source.
	RequestHost *bool `pulumi:"requestHost"`
}

// MiddlewareSpecRateLimitSourceCriterionInput is an input type that accepts MiddlewareSpecRateLimitSourceCriterionArgs and MiddlewareSpecRateLimitSourceCriterionOutput values.
// You can construct a concrete instance of `MiddlewareSpecRateLimitSourceCriterionInput` via:
//
//	MiddlewareSpecRateLimitSourceCriterionArgs{...}
type MiddlewareSpecRateLimitSourceCriterionInput interface {
	pulumi.Input

	ToMiddlewareSpecRateLimitSourceCriterionOutput() MiddlewareSpecRateLimitSourceCriterionOutput
	ToMiddlewareSpecRateLimitSourceCriterionOutputWithContext(context.Context) MiddlewareSpecRateLimitSourceCriterionOutput
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the request's remote address field (as an ipStrategy).
type MiddlewareSpecRateLimitSourceCriterionArgs struct {
	// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
	IpStrategy MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrInput `pulumi:"ipStrategy"`
	// RequestHeaderName defines the name of the header used to group incoming requests.
	RequestHeaderName pulumi.StringPtrInput `pulumi:"requestHeaderName"`
	// RequestHost defines whether to consider the request Host as the source.
	RequestHost pulumi.BoolPtrInput `pulumi:"requestHost"`
}

func (MiddlewareSpecRateLimitSourceCriterionArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterion)(nil)).Elem()
}

func (i MiddlewareSpecRateLimitSourceCriterionArgs) ToMiddlewareSpecRateLimitSourceCriterionOutput() MiddlewareSpecRateLimitSourceCriterionOutput {
	return i.ToMiddlewareSpecRateLimitSourceCriterionOutputWithContext(context.Background())
}

func (i MiddlewareSpecRateLimitSourceCriterionArgs) ToMiddlewareSpecRateLimitSourceCriterionOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitSourceCriterionOutput)
}

func (i MiddlewareSpecRateLimitSourceCriterionArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRateLimitSourceCriterion] {
	return pulumix.Output[MiddlewareSpecRateLimitSourceCriterion]{
		OutputState: i.ToMiddlewareSpecRateLimitSourceCriterionOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecRateLimitSourceCriterionArgs) ToMiddlewareSpecRateLimitSourceCriterionPtrOutput() MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return i.ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecRateLimitSourceCriterionArgs) ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitSourceCriterionOutput).ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(ctx)
}

// MiddlewareSpecRateLimitSourceCriterionPtrInput is an input type that accepts MiddlewareSpecRateLimitSourceCriterionArgs, MiddlewareSpecRateLimitSourceCriterionPtr and MiddlewareSpecRateLimitSourceCriterionPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecRateLimitSourceCriterionPtrInput` via:
//
//	        MiddlewareSpecRateLimitSourceCriterionArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecRateLimitSourceCriterionPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecRateLimitSourceCriterionPtrOutput() MiddlewareSpecRateLimitSourceCriterionPtrOutput
	ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(context.Context) MiddlewareSpecRateLimitSourceCriterionPtrOutput
}

type middlewareSpecRateLimitSourceCriterionPtrType MiddlewareSpecRateLimitSourceCriterionArgs

func MiddlewareSpecRateLimitSourceCriterionPtr(v *MiddlewareSpecRateLimitSourceCriterionArgs) MiddlewareSpecRateLimitSourceCriterionPtrInput {
	return (*middlewareSpecRateLimitSourceCriterionPtrType)(v)
}

func (*middlewareSpecRateLimitSourceCriterionPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRateLimitSourceCriterion)(nil)).Elem()
}

func (i *middlewareSpecRateLimitSourceCriterionPtrType) ToMiddlewareSpecRateLimitSourceCriterionPtrOutput() MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return i.ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecRateLimitSourceCriterionPtrType) ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitSourceCriterionPtrOutput)
}

func (i *middlewareSpecRateLimitSourceCriterionPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRateLimitSourceCriterion] {
	return pulumix.Output[*MiddlewareSpecRateLimitSourceCriterion]{
		OutputState: i.ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(ctx).OutputState,
	}
}

// SourceCriterion defines what criterion is used to group requests as originating from a common source.
// If several strategies are defined at the same time, an error will be raised.
// If none are set, the default is to use the request's remote address field (as an ipStrategy).
type MiddlewareSpecRateLimitSourceCriterionOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRateLimitSourceCriterionOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterion)(nil)).Elem()
}

func (o MiddlewareSpecRateLimitSourceCriterionOutput) ToMiddlewareSpecRateLimitSourceCriterionOutput() MiddlewareSpecRateLimitSourceCriterionOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionOutput) ToMiddlewareSpecRateLimitSourceCriterionOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionOutput) ToMiddlewareSpecRateLimitSourceCriterionPtrOutput() MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return o.ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecRateLimitSourceCriterionOutput) ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecRateLimitSourceCriterion) *MiddlewareSpecRateLimitSourceCriterion {
		return &v
	}).(MiddlewareSpecRateLimitSourceCriterionPtrOutput)
}

func (o MiddlewareSpecRateLimitSourceCriterionOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRateLimitSourceCriterion] {
	return pulumix.Output[MiddlewareSpecRateLimitSourceCriterion]{
		OutputState: o.OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecRateLimitSourceCriterionOutput) IpStrategy() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimitSourceCriterion) *MiddlewareSpecRateLimitSourceCriterionIpStrategy {
		return v.IpStrategy
	}).(MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput)
}

// RequestHeaderName defines the name of the header used to group incoming requests.
func (o MiddlewareSpecRateLimitSourceCriterionOutput) RequestHeaderName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimitSourceCriterion) *string { return v.RequestHeaderName }).(pulumi.StringPtrOutput)
}

// RequestHost defines whether to consider the request Host as the source.
func (o MiddlewareSpecRateLimitSourceCriterionOutput) RequestHost() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimitSourceCriterion) *bool { return v.RequestHost }).(pulumi.BoolPtrOutput)
}

type MiddlewareSpecRateLimitSourceCriterionPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRateLimitSourceCriterionPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRateLimitSourceCriterion)(nil)).Elem()
}

func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) ToMiddlewareSpecRateLimitSourceCriterionPtrOutput() MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) ToMiddlewareSpecRateLimitSourceCriterionPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionPtrOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRateLimitSourceCriterion] {
	return pulumix.Output[*MiddlewareSpecRateLimitSourceCriterion]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) Elem() MiddlewareSpecRateLimitSourceCriterionOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterion) MiddlewareSpecRateLimitSourceCriterion {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecRateLimitSourceCriterion
		return ret
	}).(MiddlewareSpecRateLimitSourceCriterionOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) IpStrategy() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterion) *MiddlewareSpecRateLimitSourceCriterionIpStrategy {
		if v == nil {
			return nil
		}
		return v.IpStrategy
	}).(MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput)
}

// RequestHeaderName defines the name of the header used to group incoming requests.
func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) RequestHeaderName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterion) *string {
		if v == nil {
			return nil
		}
		return v.RequestHeaderName
	}).(pulumi.StringPtrOutput)
}

// RequestHost defines whether to consider the request Host as the source.
func (o MiddlewareSpecRateLimitSourceCriterionPtrOutput) RequestHost() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterion) *bool {
		if v == nil {
			return nil
		}
		return v.RequestHost
	}).(pulumi.BoolPtrOutput)
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecRateLimitSourceCriterionIpStrategy struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth *int `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs []string `pulumi:"excludedIPs"`
}

// MiddlewareSpecRateLimitSourceCriterionIpStrategyInput is an input type that accepts MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs and MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput values.
// You can construct a concrete instance of `MiddlewareSpecRateLimitSourceCriterionIpStrategyInput` via:
//
//	MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs{...}
type MiddlewareSpecRateLimitSourceCriterionIpStrategyInput interface {
	pulumi.Input

	ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput
	ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutputWithContext(context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs struct {
	// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
	Depth pulumi.IntPtrInput `pulumi:"depth"`
	// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
	ExcludedIPs pulumi.StringArrayInput `pulumi:"excludedIPs"`
}

func (MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterionIpStrategy)(nil)).Elem()
}

func (i MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput {
	return i.ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutputWithContext(context.Background())
}

func (i MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput)
}

func (i MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRateLimitSourceCriterionIpStrategy] {
	return pulumix.Output[MiddlewareSpecRateLimitSourceCriterionIpStrategy]{
		OutputState: i.ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return i.ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput).ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(ctx)
}

// MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrInput is an input type that accepts MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs, MiddlewareSpecRateLimitSourceCriterionIpStrategyPtr and MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrInput` via:
//
//	        MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput
	ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput
}

type middlewareSpecRateLimitSourceCriterionIpStrategyPtrType MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs

func MiddlewareSpecRateLimitSourceCriterionIpStrategyPtr(v *MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs) MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrInput {
	return (*middlewareSpecRateLimitSourceCriterionIpStrategyPtrType)(v)
}

func (*middlewareSpecRateLimitSourceCriterionIpStrategyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRateLimitSourceCriterionIpStrategy)(nil)).Elem()
}

func (i *middlewareSpecRateLimitSourceCriterionIpStrategyPtrType) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return i.ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecRateLimitSourceCriterionIpStrategyPtrType) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput)
}

func (i *middlewareSpecRateLimitSourceCriterionIpStrategyPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRateLimitSourceCriterionIpStrategy] {
	return pulumix.Output[*MiddlewareSpecRateLimitSourceCriterionIpStrategy]{
		OutputState: i.ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(ctx).OutputState,
	}
}

// IPStrategy holds the IP strategy configuration used by Traefik to determine the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/ipallowlist/#ipstrategy
type MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterionIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return o.ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecRateLimitSourceCriterionIpStrategy) *MiddlewareSpecRateLimitSourceCriterionIpStrategy {
		return &v
	}).(MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput)
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRateLimitSourceCriterionIpStrategy] {
	return pulumix.Output[MiddlewareSpecRateLimitSourceCriterionIpStrategy]{
		OutputState: o.OutputState,
	}
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimitSourceCriterionIpStrategy) *int { return v.Depth }).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecRateLimitSourceCriterionIpStrategy) []string { return v.ExcludedIPs }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRateLimitSourceCriterionIpStrategy)(nil)).Elem()
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput() MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) ToMiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutputWithContext(ctx context.Context) MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput {
	return o
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRateLimitSourceCriterionIpStrategy] {
	return pulumix.Output[*MiddlewareSpecRateLimitSourceCriterionIpStrategy]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) Elem() MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterionIpStrategy) MiddlewareSpecRateLimitSourceCriterionIpStrategy {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecRateLimitSourceCriterionIpStrategy
		return ret
	}).(MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput)
}

// Depth tells Traefik to use the X-Forwarded-For header and take the IP located at the depth position (starting from the right).
func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) Depth() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterionIpStrategy) *int {
		if v == nil {
			return nil
		}
		return v.Depth
	}).(pulumi.IntPtrOutput)
}

// ExcludedIPs configures Traefik to scan the X-Forwarded-For header and select the first IP not in the list.
func (o MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput) ExcludedIPs() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecRateLimitSourceCriterionIpStrategy) []string {
		if v == nil {
			return nil
		}
		return v.ExcludedIPs
	}).(pulumi.StringArrayOutput)
}

// RedirectRegex holds the redirect regex middleware configuration.
// This middleware redirects a request using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
type MiddlewareSpecRedirectRegex struct {
	// Permanent defines whether the redirection is permanent (301).
	Permanent *bool `pulumi:"permanent"`
	// Regex defines the regex used to match and capture elements from the request URL.
	Regex *string `pulumi:"regex"`
	// Replacement defines how to modify the URL to have the new target URL.
	Replacement *string `pulumi:"replacement"`
}

// MiddlewareSpecRedirectRegexInput is an input type that accepts MiddlewareSpecRedirectRegexArgs and MiddlewareSpecRedirectRegexOutput values.
// You can construct a concrete instance of `MiddlewareSpecRedirectRegexInput` via:
//
//	MiddlewareSpecRedirectRegexArgs{...}
type MiddlewareSpecRedirectRegexInput interface {
	pulumi.Input

	ToMiddlewareSpecRedirectRegexOutput() MiddlewareSpecRedirectRegexOutput
	ToMiddlewareSpecRedirectRegexOutputWithContext(context.Context) MiddlewareSpecRedirectRegexOutput
}

// RedirectRegex holds the redirect regex middleware configuration.
// This middleware redirects a request using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
type MiddlewareSpecRedirectRegexArgs struct {
	// Permanent defines whether the redirection is permanent (301).
	Permanent pulumi.BoolPtrInput `pulumi:"permanent"`
	// Regex defines the regex used to match and capture elements from the request URL.
	Regex pulumi.StringPtrInput `pulumi:"regex"`
	// Replacement defines how to modify the URL to have the new target URL.
	Replacement pulumi.StringPtrInput `pulumi:"replacement"`
}

func (MiddlewareSpecRedirectRegexArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRedirectRegex)(nil)).Elem()
}

func (i MiddlewareSpecRedirectRegexArgs) ToMiddlewareSpecRedirectRegexOutput() MiddlewareSpecRedirectRegexOutput {
	return i.ToMiddlewareSpecRedirectRegexOutputWithContext(context.Background())
}

func (i MiddlewareSpecRedirectRegexArgs) ToMiddlewareSpecRedirectRegexOutputWithContext(ctx context.Context) MiddlewareSpecRedirectRegexOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRedirectRegexOutput)
}

func (i MiddlewareSpecRedirectRegexArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRedirectRegex] {
	return pulumix.Output[MiddlewareSpecRedirectRegex]{
		OutputState: i.ToMiddlewareSpecRedirectRegexOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecRedirectRegexArgs) ToMiddlewareSpecRedirectRegexPtrOutput() MiddlewareSpecRedirectRegexPtrOutput {
	return i.ToMiddlewareSpecRedirectRegexPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecRedirectRegexArgs) ToMiddlewareSpecRedirectRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectRegexPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRedirectRegexOutput).ToMiddlewareSpecRedirectRegexPtrOutputWithContext(ctx)
}

// MiddlewareSpecRedirectRegexPtrInput is an input type that accepts MiddlewareSpecRedirectRegexArgs, MiddlewareSpecRedirectRegexPtr and MiddlewareSpecRedirectRegexPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecRedirectRegexPtrInput` via:
//
//	        MiddlewareSpecRedirectRegexArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecRedirectRegexPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecRedirectRegexPtrOutput() MiddlewareSpecRedirectRegexPtrOutput
	ToMiddlewareSpecRedirectRegexPtrOutputWithContext(context.Context) MiddlewareSpecRedirectRegexPtrOutput
}

type middlewareSpecRedirectRegexPtrType MiddlewareSpecRedirectRegexArgs

func MiddlewareSpecRedirectRegexPtr(v *MiddlewareSpecRedirectRegexArgs) MiddlewareSpecRedirectRegexPtrInput {
	return (*middlewareSpecRedirectRegexPtrType)(v)
}

func (*middlewareSpecRedirectRegexPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRedirectRegex)(nil)).Elem()
}

func (i *middlewareSpecRedirectRegexPtrType) ToMiddlewareSpecRedirectRegexPtrOutput() MiddlewareSpecRedirectRegexPtrOutput {
	return i.ToMiddlewareSpecRedirectRegexPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecRedirectRegexPtrType) ToMiddlewareSpecRedirectRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectRegexPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRedirectRegexPtrOutput)
}

func (i *middlewareSpecRedirectRegexPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRedirectRegex] {
	return pulumix.Output[*MiddlewareSpecRedirectRegex]{
		OutputState: i.ToMiddlewareSpecRedirectRegexPtrOutputWithContext(ctx).OutputState,
	}
}

// RedirectRegex holds the redirect regex middleware configuration.
// This middleware redirects a request using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectregex/#regex
type MiddlewareSpecRedirectRegexOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRedirectRegexOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRedirectRegex)(nil)).Elem()
}

func (o MiddlewareSpecRedirectRegexOutput) ToMiddlewareSpecRedirectRegexOutput() MiddlewareSpecRedirectRegexOutput {
	return o
}

func (o MiddlewareSpecRedirectRegexOutput) ToMiddlewareSpecRedirectRegexOutputWithContext(ctx context.Context) MiddlewareSpecRedirectRegexOutput {
	return o
}

func (o MiddlewareSpecRedirectRegexOutput) ToMiddlewareSpecRedirectRegexPtrOutput() MiddlewareSpecRedirectRegexPtrOutput {
	return o.ToMiddlewareSpecRedirectRegexPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecRedirectRegexOutput) ToMiddlewareSpecRedirectRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectRegexPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecRedirectRegex) *MiddlewareSpecRedirectRegex {
		return &v
	}).(MiddlewareSpecRedirectRegexPtrOutput)
}

func (o MiddlewareSpecRedirectRegexOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRedirectRegex] {
	return pulumix.Output[MiddlewareSpecRedirectRegex]{
		OutputState: o.OutputState,
	}
}

// Permanent defines whether the redirection is permanent (301).
func (o MiddlewareSpecRedirectRegexOutput) Permanent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRedirectRegex) *bool { return v.Permanent }).(pulumi.BoolPtrOutput)
}

// Regex defines the regex used to match and capture elements from the request URL.
func (o MiddlewareSpecRedirectRegexOutput) Regex() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRedirectRegex) *string { return v.Regex }).(pulumi.StringPtrOutput)
}

// Replacement defines how to modify the URL to have the new target URL.
func (o MiddlewareSpecRedirectRegexOutput) Replacement() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRedirectRegex) *string { return v.Replacement }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecRedirectRegexPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRedirectRegexPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRedirectRegex)(nil)).Elem()
}

func (o MiddlewareSpecRedirectRegexPtrOutput) ToMiddlewareSpecRedirectRegexPtrOutput() MiddlewareSpecRedirectRegexPtrOutput {
	return o
}

func (o MiddlewareSpecRedirectRegexPtrOutput) ToMiddlewareSpecRedirectRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectRegexPtrOutput {
	return o
}

func (o MiddlewareSpecRedirectRegexPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRedirectRegex] {
	return pulumix.Output[*MiddlewareSpecRedirectRegex]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecRedirectRegexPtrOutput) Elem() MiddlewareSpecRedirectRegexOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectRegex) MiddlewareSpecRedirectRegex {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecRedirectRegex
		return ret
	}).(MiddlewareSpecRedirectRegexOutput)
}

// Permanent defines whether the redirection is permanent (301).
func (o MiddlewareSpecRedirectRegexPtrOutput) Permanent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectRegex) *bool {
		if v == nil {
			return nil
		}
		return v.Permanent
	}).(pulumi.BoolPtrOutput)
}

// Regex defines the regex used to match and capture elements from the request URL.
func (o MiddlewareSpecRedirectRegexPtrOutput) Regex() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectRegex) *string {
		if v == nil {
			return nil
		}
		return v.Regex
	}).(pulumi.StringPtrOutput)
}

// Replacement defines how to modify the URL to have the new target URL.
func (o MiddlewareSpecRedirectRegexPtrOutput) Replacement() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectRegex) *string {
		if v == nil {
			return nil
		}
		return v.Replacement
	}).(pulumi.StringPtrOutput)
}

// RedirectScheme holds the redirect scheme middleware configuration.
// This middleware redirects requests from a scheme/port to another.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
type MiddlewareSpecRedirectScheme struct {
	// Permanent defines whether the redirection is permanent (301).
	Permanent *bool `pulumi:"permanent"`
	// Port defines the port of the new URL.
	Port *string `pulumi:"port"`
	// Scheme defines the scheme of the new URL.
	Scheme *string `pulumi:"scheme"`
}

// MiddlewareSpecRedirectSchemeInput is an input type that accepts MiddlewareSpecRedirectSchemeArgs and MiddlewareSpecRedirectSchemeOutput values.
// You can construct a concrete instance of `MiddlewareSpecRedirectSchemeInput` via:
//
//	MiddlewareSpecRedirectSchemeArgs{...}
type MiddlewareSpecRedirectSchemeInput interface {
	pulumi.Input

	ToMiddlewareSpecRedirectSchemeOutput() MiddlewareSpecRedirectSchemeOutput
	ToMiddlewareSpecRedirectSchemeOutputWithContext(context.Context) MiddlewareSpecRedirectSchemeOutput
}

// RedirectScheme holds the redirect scheme middleware configuration.
// This middleware redirects requests from a scheme/port to another.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
type MiddlewareSpecRedirectSchemeArgs struct {
	// Permanent defines whether the redirection is permanent (301).
	Permanent pulumi.BoolPtrInput `pulumi:"permanent"`
	// Port defines the port of the new URL.
	Port pulumi.StringPtrInput `pulumi:"port"`
	// Scheme defines the scheme of the new URL.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
}

func (MiddlewareSpecRedirectSchemeArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRedirectScheme)(nil)).Elem()
}

func (i MiddlewareSpecRedirectSchemeArgs) ToMiddlewareSpecRedirectSchemeOutput() MiddlewareSpecRedirectSchemeOutput {
	return i.ToMiddlewareSpecRedirectSchemeOutputWithContext(context.Background())
}

func (i MiddlewareSpecRedirectSchemeArgs) ToMiddlewareSpecRedirectSchemeOutputWithContext(ctx context.Context) MiddlewareSpecRedirectSchemeOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRedirectSchemeOutput)
}

func (i MiddlewareSpecRedirectSchemeArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRedirectScheme] {
	return pulumix.Output[MiddlewareSpecRedirectScheme]{
		OutputState: i.ToMiddlewareSpecRedirectSchemeOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecRedirectSchemeArgs) ToMiddlewareSpecRedirectSchemePtrOutput() MiddlewareSpecRedirectSchemePtrOutput {
	return i.ToMiddlewareSpecRedirectSchemePtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecRedirectSchemeArgs) ToMiddlewareSpecRedirectSchemePtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectSchemePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRedirectSchemeOutput).ToMiddlewareSpecRedirectSchemePtrOutputWithContext(ctx)
}

// MiddlewareSpecRedirectSchemePtrInput is an input type that accepts MiddlewareSpecRedirectSchemeArgs, MiddlewareSpecRedirectSchemePtr and MiddlewareSpecRedirectSchemePtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecRedirectSchemePtrInput` via:
//
//	        MiddlewareSpecRedirectSchemeArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecRedirectSchemePtrInput interface {
	pulumi.Input

	ToMiddlewareSpecRedirectSchemePtrOutput() MiddlewareSpecRedirectSchemePtrOutput
	ToMiddlewareSpecRedirectSchemePtrOutputWithContext(context.Context) MiddlewareSpecRedirectSchemePtrOutput
}

type middlewareSpecRedirectSchemePtrType MiddlewareSpecRedirectSchemeArgs

func MiddlewareSpecRedirectSchemePtr(v *MiddlewareSpecRedirectSchemeArgs) MiddlewareSpecRedirectSchemePtrInput {
	return (*middlewareSpecRedirectSchemePtrType)(v)
}

func (*middlewareSpecRedirectSchemePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRedirectScheme)(nil)).Elem()
}

func (i *middlewareSpecRedirectSchemePtrType) ToMiddlewareSpecRedirectSchemePtrOutput() MiddlewareSpecRedirectSchemePtrOutput {
	return i.ToMiddlewareSpecRedirectSchemePtrOutputWithContext(context.Background())
}

func (i *middlewareSpecRedirectSchemePtrType) ToMiddlewareSpecRedirectSchemePtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectSchemePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRedirectSchemePtrOutput)
}

func (i *middlewareSpecRedirectSchemePtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRedirectScheme] {
	return pulumix.Output[*MiddlewareSpecRedirectScheme]{
		OutputState: i.ToMiddlewareSpecRedirectSchemePtrOutputWithContext(ctx).OutputState,
	}
}

// RedirectScheme holds the redirect scheme middleware configuration.
// This middleware redirects requests from a scheme/port to another.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/redirectscheme/
type MiddlewareSpecRedirectSchemeOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRedirectSchemeOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRedirectScheme)(nil)).Elem()
}

func (o MiddlewareSpecRedirectSchemeOutput) ToMiddlewareSpecRedirectSchemeOutput() MiddlewareSpecRedirectSchemeOutput {
	return o
}

func (o MiddlewareSpecRedirectSchemeOutput) ToMiddlewareSpecRedirectSchemeOutputWithContext(ctx context.Context) MiddlewareSpecRedirectSchemeOutput {
	return o
}

func (o MiddlewareSpecRedirectSchemeOutput) ToMiddlewareSpecRedirectSchemePtrOutput() MiddlewareSpecRedirectSchemePtrOutput {
	return o.ToMiddlewareSpecRedirectSchemePtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecRedirectSchemeOutput) ToMiddlewareSpecRedirectSchemePtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectSchemePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecRedirectScheme) *MiddlewareSpecRedirectScheme {
		return &v
	}).(MiddlewareSpecRedirectSchemePtrOutput)
}

func (o MiddlewareSpecRedirectSchemeOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRedirectScheme] {
	return pulumix.Output[MiddlewareSpecRedirectScheme]{
		OutputState: o.OutputState,
	}
}

// Permanent defines whether the redirection is permanent (301).
func (o MiddlewareSpecRedirectSchemeOutput) Permanent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRedirectScheme) *bool { return v.Permanent }).(pulumi.BoolPtrOutput)
}

// Port defines the port of the new URL.
func (o MiddlewareSpecRedirectSchemeOutput) Port() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRedirectScheme) *string { return v.Port }).(pulumi.StringPtrOutput)
}

// Scheme defines the scheme of the new URL.
func (o MiddlewareSpecRedirectSchemeOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRedirectScheme) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecRedirectSchemePtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRedirectSchemePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRedirectScheme)(nil)).Elem()
}

func (o MiddlewareSpecRedirectSchemePtrOutput) ToMiddlewareSpecRedirectSchemePtrOutput() MiddlewareSpecRedirectSchemePtrOutput {
	return o
}

func (o MiddlewareSpecRedirectSchemePtrOutput) ToMiddlewareSpecRedirectSchemePtrOutputWithContext(ctx context.Context) MiddlewareSpecRedirectSchemePtrOutput {
	return o
}

func (o MiddlewareSpecRedirectSchemePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRedirectScheme] {
	return pulumix.Output[*MiddlewareSpecRedirectScheme]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecRedirectSchemePtrOutput) Elem() MiddlewareSpecRedirectSchemeOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectScheme) MiddlewareSpecRedirectScheme {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecRedirectScheme
		return ret
	}).(MiddlewareSpecRedirectSchemeOutput)
}

// Permanent defines whether the redirection is permanent (301).
func (o MiddlewareSpecRedirectSchemePtrOutput) Permanent() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectScheme) *bool {
		if v == nil {
			return nil
		}
		return v.Permanent
	}).(pulumi.BoolPtrOutput)
}

// Port defines the port of the new URL.
func (o MiddlewareSpecRedirectSchemePtrOutput) Port() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectScheme) *string {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.StringPtrOutput)
}

// Scheme defines the scheme of the new URL.
func (o MiddlewareSpecRedirectSchemePtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRedirectScheme) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// ReplacePath holds the replace path middleware configuration.
// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
type MiddlewareSpecReplacePath struct {
	// Path defines the path to use as replacement in the request URL.
	Path *string `pulumi:"path"`
}

// MiddlewareSpecReplacePathInput is an input type that accepts MiddlewareSpecReplacePathArgs and MiddlewareSpecReplacePathOutput values.
// You can construct a concrete instance of `MiddlewareSpecReplacePathInput` via:
//
//	MiddlewareSpecReplacePathArgs{...}
type MiddlewareSpecReplacePathInput interface {
	pulumi.Input

	ToMiddlewareSpecReplacePathOutput() MiddlewareSpecReplacePathOutput
	ToMiddlewareSpecReplacePathOutputWithContext(context.Context) MiddlewareSpecReplacePathOutput
}

// ReplacePath holds the replace path middleware configuration.
// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
type MiddlewareSpecReplacePathArgs struct {
	// Path defines the path to use as replacement in the request URL.
	Path pulumi.StringPtrInput `pulumi:"path"`
}

func (MiddlewareSpecReplacePathArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecReplacePath)(nil)).Elem()
}

func (i MiddlewareSpecReplacePathArgs) ToMiddlewareSpecReplacePathOutput() MiddlewareSpecReplacePathOutput {
	return i.ToMiddlewareSpecReplacePathOutputWithContext(context.Background())
}

func (i MiddlewareSpecReplacePathArgs) ToMiddlewareSpecReplacePathOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecReplacePathOutput)
}

func (i MiddlewareSpecReplacePathArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecReplacePath] {
	return pulumix.Output[MiddlewareSpecReplacePath]{
		OutputState: i.ToMiddlewareSpecReplacePathOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecReplacePathArgs) ToMiddlewareSpecReplacePathPtrOutput() MiddlewareSpecReplacePathPtrOutput {
	return i.ToMiddlewareSpecReplacePathPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecReplacePathArgs) ToMiddlewareSpecReplacePathPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecReplacePathOutput).ToMiddlewareSpecReplacePathPtrOutputWithContext(ctx)
}

// MiddlewareSpecReplacePathPtrInput is an input type that accepts MiddlewareSpecReplacePathArgs, MiddlewareSpecReplacePathPtr and MiddlewareSpecReplacePathPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecReplacePathPtrInput` via:
//
//	        MiddlewareSpecReplacePathArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecReplacePathPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecReplacePathPtrOutput() MiddlewareSpecReplacePathPtrOutput
	ToMiddlewareSpecReplacePathPtrOutputWithContext(context.Context) MiddlewareSpecReplacePathPtrOutput
}

type middlewareSpecReplacePathPtrType MiddlewareSpecReplacePathArgs

func MiddlewareSpecReplacePathPtr(v *MiddlewareSpecReplacePathArgs) MiddlewareSpecReplacePathPtrInput {
	return (*middlewareSpecReplacePathPtrType)(v)
}

func (*middlewareSpecReplacePathPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecReplacePath)(nil)).Elem()
}

func (i *middlewareSpecReplacePathPtrType) ToMiddlewareSpecReplacePathPtrOutput() MiddlewareSpecReplacePathPtrOutput {
	return i.ToMiddlewareSpecReplacePathPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecReplacePathPtrType) ToMiddlewareSpecReplacePathPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecReplacePathPtrOutput)
}

func (i *middlewareSpecReplacePathPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecReplacePath] {
	return pulumix.Output[*MiddlewareSpecReplacePath]{
		OutputState: i.ToMiddlewareSpecReplacePathPtrOutputWithContext(ctx).OutputState,
	}
}

// ReplacePath holds the replace path middleware configuration.
// This middleware replaces the path of the request URL and store the original path in an X-Replaced-Path header.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepath/
type MiddlewareSpecReplacePathOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecReplacePathOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecReplacePath)(nil)).Elem()
}

func (o MiddlewareSpecReplacePathOutput) ToMiddlewareSpecReplacePathOutput() MiddlewareSpecReplacePathOutput {
	return o
}

func (o MiddlewareSpecReplacePathOutput) ToMiddlewareSpecReplacePathOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathOutput {
	return o
}

func (o MiddlewareSpecReplacePathOutput) ToMiddlewareSpecReplacePathPtrOutput() MiddlewareSpecReplacePathPtrOutput {
	return o.ToMiddlewareSpecReplacePathPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecReplacePathOutput) ToMiddlewareSpecReplacePathPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecReplacePath) *MiddlewareSpecReplacePath {
		return &v
	}).(MiddlewareSpecReplacePathPtrOutput)
}

func (o MiddlewareSpecReplacePathOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecReplacePath] {
	return pulumix.Output[MiddlewareSpecReplacePath]{
		OutputState: o.OutputState,
	}
}

// Path defines the path to use as replacement in the request URL.
func (o MiddlewareSpecReplacePathOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecReplacePath) *string { return v.Path }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecReplacePathPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecReplacePathPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecReplacePath)(nil)).Elem()
}

func (o MiddlewareSpecReplacePathPtrOutput) ToMiddlewareSpecReplacePathPtrOutput() MiddlewareSpecReplacePathPtrOutput {
	return o
}

func (o MiddlewareSpecReplacePathPtrOutput) ToMiddlewareSpecReplacePathPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathPtrOutput {
	return o
}

func (o MiddlewareSpecReplacePathPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecReplacePath] {
	return pulumix.Output[*MiddlewareSpecReplacePath]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecReplacePathPtrOutput) Elem() MiddlewareSpecReplacePathOutput {
	return o.ApplyT(func(v *MiddlewareSpecReplacePath) MiddlewareSpecReplacePath {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecReplacePath
		return ret
	}).(MiddlewareSpecReplacePathOutput)
}

// Path defines the path to use as replacement in the request URL.
func (o MiddlewareSpecReplacePathPtrOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecReplacePath) *string {
		if v == nil {
			return nil
		}
		return v.Path
	}).(pulumi.StringPtrOutput)
}

// ReplacePathRegex holds the replace path regex middleware configuration.
// This middleware replaces the path of a URL using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
type MiddlewareSpecReplacePathRegex struct {
	// Regex defines the regular expression used to match and capture the path from the request URL.
	Regex *string `pulumi:"regex"`
	// Replacement defines the replacement path format, which can include captured variables.
	Replacement *string `pulumi:"replacement"`
}

// MiddlewareSpecReplacePathRegexInput is an input type that accepts MiddlewareSpecReplacePathRegexArgs and MiddlewareSpecReplacePathRegexOutput values.
// You can construct a concrete instance of `MiddlewareSpecReplacePathRegexInput` via:
//
//	MiddlewareSpecReplacePathRegexArgs{...}
type MiddlewareSpecReplacePathRegexInput interface {
	pulumi.Input

	ToMiddlewareSpecReplacePathRegexOutput() MiddlewareSpecReplacePathRegexOutput
	ToMiddlewareSpecReplacePathRegexOutputWithContext(context.Context) MiddlewareSpecReplacePathRegexOutput
}

// ReplacePathRegex holds the replace path regex middleware configuration.
// This middleware replaces the path of a URL using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
type MiddlewareSpecReplacePathRegexArgs struct {
	// Regex defines the regular expression used to match and capture the path from the request URL.
	Regex pulumi.StringPtrInput `pulumi:"regex"`
	// Replacement defines the replacement path format, which can include captured variables.
	Replacement pulumi.StringPtrInput `pulumi:"replacement"`
}

func (MiddlewareSpecReplacePathRegexArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecReplacePathRegex)(nil)).Elem()
}

func (i MiddlewareSpecReplacePathRegexArgs) ToMiddlewareSpecReplacePathRegexOutput() MiddlewareSpecReplacePathRegexOutput {
	return i.ToMiddlewareSpecReplacePathRegexOutputWithContext(context.Background())
}

func (i MiddlewareSpecReplacePathRegexArgs) ToMiddlewareSpecReplacePathRegexOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathRegexOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecReplacePathRegexOutput)
}

func (i MiddlewareSpecReplacePathRegexArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecReplacePathRegex] {
	return pulumix.Output[MiddlewareSpecReplacePathRegex]{
		OutputState: i.ToMiddlewareSpecReplacePathRegexOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecReplacePathRegexArgs) ToMiddlewareSpecReplacePathRegexPtrOutput() MiddlewareSpecReplacePathRegexPtrOutput {
	return i.ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecReplacePathRegexArgs) ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathRegexPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecReplacePathRegexOutput).ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(ctx)
}

// MiddlewareSpecReplacePathRegexPtrInput is an input type that accepts MiddlewareSpecReplacePathRegexArgs, MiddlewareSpecReplacePathRegexPtr and MiddlewareSpecReplacePathRegexPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecReplacePathRegexPtrInput` via:
//
//	        MiddlewareSpecReplacePathRegexArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecReplacePathRegexPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecReplacePathRegexPtrOutput() MiddlewareSpecReplacePathRegexPtrOutput
	ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(context.Context) MiddlewareSpecReplacePathRegexPtrOutput
}

type middlewareSpecReplacePathRegexPtrType MiddlewareSpecReplacePathRegexArgs

func MiddlewareSpecReplacePathRegexPtr(v *MiddlewareSpecReplacePathRegexArgs) MiddlewareSpecReplacePathRegexPtrInput {
	return (*middlewareSpecReplacePathRegexPtrType)(v)
}

func (*middlewareSpecReplacePathRegexPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecReplacePathRegex)(nil)).Elem()
}

func (i *middlewareSpecReplacePathRegexPtrType) ToMiddlewareSpecReplacePathRegexPtrOutput() MiddlewareSpecReplacePathRegexPtrOutput {
	return i.ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecReplacePathRegexPtrType) ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathRegexPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecReplacePathRegexPtrOutput)
}

func (i *middlewareSpecReplacePathRegexPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecReplacePathRegex] {
	return pulumix.Output[*MiddlewareSpecReplacePathRegex]{
		OutputState: i.ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(ctx).OutputState,
	}
}

// ReplacePathRegex holds the replace path regex middleware configuration.
// This middleware replaces the path of a URL using regex matching and replacement.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/replacepathregex/
type MiddlewareSpecReplacePathRegexOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecReplacePathRegexOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecReplacePathRegex)(nil)).Elem()
}

func (o MiddlewareSpecReplacePathRegexOutput) ToMiddlewareSpecReplacePathRegexOutput() MiddlewareSpecReplacePathRegexOutput {
	return o
}

func (o MiddlewareSpecReplacePathRegexOutput) ToMiddlewareSpecReplacePathRegexOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathRegexOutput {
	return o
}

func (o MiddlewareSpecReplacePathRegexOutput) ToMiddlewareSpecReplacePathRegexPtrOutput() MiddlewareSpecReplacePathRegexPtrOutput {
	return o.ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecReplacePathRegexOutput) ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathRegexPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecReplacePathRegex) *MiddlewareSpecReplacePathRegex {
		return &v
	}).(MiddlewareSpecReplacePathRegexPtrOutput)
}

func (o MiddlewareSpecReplacePathRegexOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecReplacePathRegex] {
	return pulumix.Output[MiddlewareSpecReplacePathRegex]{
		OutputState: o.OutputState,
	}
}

// Regex defines the regular expression used to match and capture the path from the request URL.
func (o MiddlewareSpecReplacePathRegexOutput) Regex() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecReplacePathRegex) *string { return v.Regex }).(pulumi.StringPtrOutput)
}

// Replacement defines the replacement path format, which can include captured variables.
func (o MiddlewareSpecReplacePathRegexOutput) Replacement() pulumi.StringPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecReplacePathRegex) *string { return v.Replacement }).(pulumi.StringPtrOutput)
}

type MiddlewareSpecReplacePathRegexPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecReplacePathRegexPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecReplacePathRegex)(nil)).Elem()
}

func (o MiddlewareSpecReplacePathRegexPtrOutput) ToMiddlewareSpecReplacePathRegexPtrOutput() MiddlewareSpecReplacePathRegexPtrOutput {
	return o
}

func (o MiddlewareSpecReplacePathRegexPtrOutput) ToMiddlewareSpecReplacePathRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecReplacePathRegexPtrOutput {
	return o
}

func (o MiddlewareSpecReplacePathRegexPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecReplacePathRegex] {
	return pulumix.Output[*MiddlewareSpecReplacePathRegex]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecReplacePathRegexPtrOutput) Elem() MiddlewareSpecReplacePathRegexOutput {
	return o.ApplyT(func(v *MiddlewareSpecReplacePathRegex) MiddlewareSpecReplacePathRegex {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecReplacePathRegex
		return ret
	}).(MiddlewareSpecReplacePathRegexOutput)
}

// Regex defines the regular expression used to match and capture the path from the request URL.
func (o MiddlewareSpecReplacePathRegexPtrOutput) Regex() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecReplacePathRegex) *string {
		if v == nil {
			return nil
		}
		return v.Regex
	}).(pulumi.StringPtrOutput)
}

// Replacement defines the replacement path format, which can include captured variables.
func (o MiddlewareSpecReplacePathRegexPtrOutput) Replacement() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecReplacePathRegex) *string {
		if v == nil {
			return nil
		}
		return v.Replacement
	}).(pulumi.StringPtrOutput)
}

// Retry holds the retry middleware configuration.
// This middleware reissues requests a given number of times to a backend server if that server does not reply.
// As soon as the server answers, the middleware stops retrying, regardless of the response status.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
type MiddlewareSpecRetry struct {
	// Attempts defines how many times the request should be retried.
	Attempts *int `pulumi:"attempts"`
	// InitialInterval defines the first wait time in the exponential backoff series.
	// The maximum interval is calculated as twice the initialInterval.
	// If unspecified, requests will be retried immediately.
	// The value of initialInterval should be provided in seconds or as a valid duration format,
	// see https://pkg.go.dev/time#ParseDuration.
	InitialInterval interface{} `pulumi:"initialInterval"`
}

// MiddlewareSpecRetryInput is an input type that accepts MiddlewareSpecRetryArgs and MiddlewareSpecRetryOutput values.
// You can construct a concrete instance of `MiddlewareSpecRetryInput` via:
//
//	MiddlewareSpecRetryArgs{...}
type MiddlewareSpecRetryInput interface {
	pulumi.Input

	ToMiddlewareSpecRetryOutput() MiddlewareSpecRetryOutput
	ToMiddlewareSpecRetryOutputWithContext(context.Context) MiddlewareSpecRetryOutput
}

// Retry holds the retry middleware configuration.
// This middleware reissues requests a given number of times to a backend server if that server does not reply.
// As soon as the server answers, the middleware stops retrying, regardless of the response status.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
type MiddlewareSpecRetryArgs struct {
	// Attempts defines how many times the request should be retried.
	Attempts pulumi.IntPtrInput `pulumi:"attempts"`
	// InitialInterval defines the first wait time in the exponential backoff series.
	// The maximum interval is calculated as twice the initialInterval.
	// If unspecified, requests will be retried immediately.
	// The value of initialInterval should be provided in seconds or as a valid duration format,
	// see https://pkg.go.dev/time#ParseDuration.
	InitialInterval pulumi.Input `pulumi:"initialInterval"`
}

func (MiddlewareSpecRetryArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRetry)(nil)).Elem()
}

func (i MiddlewareSpecRetryArgs) ToMiddlewareSpecRetryOutput() MiddlewareSpecRetryOutput {
	return i.ToMiddlewareSpecRetryOutputWithContext(context.Background())
}

func (i MiddlewareSpecRetryArgs) ToMiddlewareSpecRetryOutputWithContext(ctx context.Context) MiddlewareSpecRetryOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRetryOutput)
}

func (i MiddlewareSpecRetryArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRetry] {
	return pulumix.Output[MiddlewareSpecRetry]{
		OutputState: i.ToMiddlewareSpecRetryOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecRetryArgs) ToMiddlewareSpecRetryPtrOutput() MiddlewareSpecRetryPtrOutput {
	return i.ToMiddlewareSpecRetryPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecRetryArgs) ToMiddlewareSpecRetryPtrOutputWithContext(ctx context.Context) MiddlewareSpecRetryPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRetryOutput).ToMiddlewareSpecRetryPtrOutputWithContext(ctx)
}

// MiddlewareSpecRetryPtrInput is an input type that accepts MiddlewareSpecRetryArgs, MiddlewareSpecRetryPtr and MiddlewareSpecRetryPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecRetryPtrInput` via:
//
//	        MiddlewareSpecRetryArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecRetryPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecRetryPtrOutput() MiddlewareSpecRetryPtrOutput
	ToMiddlewareSpecRetryPtrOutputWithContext(context.Context) MiddlewareSpecRetryPtrOutput
}

type middlewareSpecRetryPtrType MiddlewareSpecRetryArgs

func MiddlewareSpecRetryPtr(v *MiddlewareSpecRetryArgs) MiddlewareSpecRetryPtrInput {
	return (*middlewareSpecRetryPtrType)(v)
}

func (*middlewareSpecRetryPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRetry)(nil)).Elem()
}

func (i *middlewareSpecRetryPtrType) ToMiddlewareSpecRetryPtrOutput() MiddlewareSpecRetryPtrOutput {
	return i.ToMiddlewareSpecRetryPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecRetryPtrType) ToMiddlewareSpecRetryPtrOutputWithContext(ctx context.Context) MiddlewareSpecRetryPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecRetryPtrOutput)
}

func (i *middlewareSpecRetryPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRetry] {
	return pulumix.Output[*MiddlewareSpecRetry]{
		OutputState: i.ToMiddlewareSpecRetryPtrOutputWithContext(ctx).OutputState,
	}
}

// Retry holds the retry middleware configuration.
// This middleware reissues requests a given number of times to a backend server if that server does not reply.
// As soon as the server answers, the middleware stops retrying, regardless of the response status.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/retry/
type MiddlewareSpecRetryOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRetryOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecRetry)(nil)).Elem()
}

func (o MiddlewareSpecRetryOutput) ToMiddlewareSpecRetryOutput() MiddlewareSpecRetryOutput {
	return o
}

func (o MiddlewareSpecRetryOutput) ToMiddlewareSpecRetryOutputWithContext(ctx context.Context) MiddlewareSpecRetryOutput {
	return o
}

func (o MiddlewareSpecRetryOutput) ToMiddlewareSpecRetryPtrOutput() MiddlewareSpecRetryPtrOutput {
	return o.ToMiddlewareSpecRetryPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecRetryOutput) ToMiddlewareSpecRetryPtrOutputWithContext(ctx context.Context) MiddlewareSpecRetryPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecRetry) *MiddlewareSpecRetry {
		return &v
	}).(MiddlewareSpecRetryPtrOutput)
}

func (o MiddlewareSpecRetryOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecRetry] {
	return pulumix.Output[MiddlewareSpecRetry]{
		OutputState: o.OutputState,
	}
}

// Attempts defines how many times the request should be retried.
func (o MiddlewareSpecRetryOutput) Attempts() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecRetry) *int { return v.Attempts }).(pulumi.IntPtrOutput)
}

// InitialInterval defines the first wait time in the exponential backoff series.
// The maximum interval is calculated as twice the initialInterval.
// If unspecified, requests will be retried immediately.
// The value of initialInterval should be provided in seconds or as a valid duration format,
// see https://pkg.go.dev/time#ParseDuration.
func (o MiddlewareSpecRetryOutput) InitialInterval() pulumi.AnyOutput {
	return o.ApplyT(func(v MiddlewareSpecRetry) interface{} { return v.InitialInterval }).(pulumi.AnyOutput)
}

type MiddlewareSpecRetryPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecRetryPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecRetry)(nil)).Elem()
}

func (o MiddlewareSpecRetryPtrOutput) ToMiddlewareSpecRetryPtrOutput() MiddlewareSpecRetryPtrOutput {
	return o
}

func (o MiddlewareSpecRetryPtrOutput) ToMiddlewareSpecRetryPtrOutputWithContext(ctx context.Context) MiddlewareSpecRetryPtrOutput {
	return o
}

func (o MiddlewareSpecRetryPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecRetry] {
	return pulumix.Output[*MiddlewareSpecRetry]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecRetryPtrOutput) Elem() MiddlewareSpecRetryOutput {
	return o.ApplyT(func(v *MiddlewareSpecRetry) MiddlewareSpecRetry {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecRetry
		return ret
	}).(MiddlewareSpecRetryOutput)
}

// Attempts defines how many times the request should be retried.
func (o MiddlewareSpecRetryPtrOutput) Attempts() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecRetry) *int {
		if v == nil {
			return nil
		}
		return v.Attempts
	}).(pulumi.IntPtrOutput)
}

// InitialInterval defines the first wait time in the exponential backoff series.
// The maximum interval is calculated as twice the initialInterval.
// If unspecified, requests will be retried immediately.
// The value of initialInterval should be provided in seconds or as a valid duration format,
// see https://pkg.go.dev/time#ParseDuration.
func (o MiddlewareSpecRetryPtrOutput) InitialInterval() pulumi.AnyOutput {
	return o.ApplyT(func(v *MiddlewareSpecRetry) interface{} {
		if v == nil {
			return nil
		}
		return v.InitialInterval
	}).(pulumi.AnyOutput)
}

// StripPrefix holds the strip prefix middleware configuration.
// This middleware removes the specified prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
type MiddlewareSpecStripPrefix struct {
	// Deprecated: ForceSlash option is deprecated, please remove any usage of this option.
	// ForceSlash ensures that the resulting stripped path is not the empty string, by replacing it with / when necessary.
	// Default: true.
	ForceSlash *bool `pulumi:"forceSlash"`
	// Prefixes defines the prefixes to strip from the request URL.
	Prefixes []string `pulumi:"prefixes"`
}

// MiddlewareSpecStripPrefixInput is an input type that accepts MiddlewareSpecStripPrefixArgs and MiddlewareSpecStripPrefixOutput values.
// You can construct a concrete instance of `MiddlewareSpecStripPrefixInput` via:
//
//	MiddlewareSpecStripPrefixArgs{...}
type MiddlewareSpecStripPrefixInput interface {
	pulumi.Input

	ToMiddlewareSpecStripPrefixOutput() MiddlewareSpecStripPrefixOutput
	ToMiddlewareSpecStripPrefixOutputWithContext(context.Context) MiddlewareSpecStripPrefixOutput
}

// StripPrefix holds the strip prefix middleware configuration.
// This middleware removes the specified prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
type MiddlewareSpecStripPrefixArgs struct {
	// Deprecated: ForceSlash option is deprecated, please remove any usage of this option.
	// ForceSlash ensures that the resulting stripped path is not the empty string, by replacing it with / when necessary.
	// Default: true.
	ForceSlash pulumi.BoolPtrInput `pulumi:"forceSlash"`
	// Prefixes defines the prefixes to strip from the request URL.
	Prefixes pulumi.StringArrayInput `pulumi:"prefixes"`
}

func (MiddlewareSpecStripPrefixArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecStripPrefix)(nil)).Elem()
}

func (i MiddlewareSpecStripPrefixArgs) ToMiddlewareSpecStripPrefixOutput() MiddlewareSpecStripPrefixOutput {
	return i.ToMiddlewareSpecStripPrefixOutputWithContext(context.Background())
}

func (i MiddlewareSpecStripPrefixArgs) ToMiddlewareSpecStripPrefixOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecStripPrefixOutput)
}

func (i MiddlewareSpecStripPrefixArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecStripPrefix] {
	return pulumix.Output[MiddlewareSpecStripPrefix]{
		OutputState: i.ToMiddlewareSpecStripPrefixOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecStripPrefixArgs) ToMiddlewareSpecStripPrefixPtrOutput() MiddlewareSpecStripPrefixPtrOutput {
	return i.ToMiddlewareSpecStripPrefixPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecStripPrefixArgs) ToMiddlewareSpecStripPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecStripPrefixOutput).ToMiddlewareSpecStripPrefixPtrOutputWithContext(ctx)
}

// MiddlewareSpecStripPrefixPtrInput is an input type that accepts MiddlewareSpecStripPrefixArgs, MiddlewareSpecStripPrefixPtr and MiddlewareSpecStripPrefixPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecStripPrefixPtrInput` via:
//
//	        MiddlewareSpecStripPrefixArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecStripPrefixPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecStripPrefixPtrOutput() MiddlewareSpecStripPrefixPtrOutput
	ToMiddlewareSpecStripPrefixPtrOutputWithContext(context.Context) MiddlewareSpecStripPrefixPtrOutput
}

type middlewareSpecStripPrefixPtrType MiddlewareSpecStripPrefixArgs

func MiddlewareSpecStripPrefixPtr(v *MiddlewareSpecStripPrefixArgs) MiddlewareSpecStripPrefixPtrInput {
	return (*middlewareSpecStripPrefixPtrType)(v)
}

func (*middlewareSpecStripPrefixPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecStripPrefix)(nil)).Elem()
}

func (i *middlewareSpecStripPrefixPtrType) ToMiddlewareSpecStripPrefixPtrOutput() MiddlewareSpecStripPrefixPtrOutput {
	return i.ToMiddlewareSpecStripPrefixPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecStripPrefixPtrType) ToMiddlewareSpecStripPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecStripPrefixPtrOutput)
}

func (i *middlewareSpecStripPrefixPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecStripPrefix] {
	return pulumix.Output[*MiddlewareSpecStripPrefix]{
		OutputState: i.ToMiddlewareSpecStripPrefixPtrOutputWithContext(ctx).OutputState,
	}
}

// StripPrefix holds the strip prefix middleware configuration.
// This middleware removes the specified prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefix/
type MiddlewareSpecStripPrefixOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecStripPrefixOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecStripPrefix)(nil)).Elem()
}

func (o MiddlewareSpecStripPrefixOutput) ToMiddlewareSpecStripPrefixOutput() MiddlewareSpecStripPrefixOutput {
	return o
}

func (o MiddlewareSpecStripPrefixOutput) ToMiddlewareSpecStripPrefixOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixOutput {
	return o
}

func (o MiddlewareSpecStripPrefixOutput) ToMiddlewareSpecStripPrefixPtrOutput() MiddlewareSpecStripPrefixPtrOutput {
	return o.ToMiddlewareSpecStripPrefixPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecStripPrefixOutput) ToMiddlewareSpecStripPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecStripPrefix) *MiddlewareSpecStripPrefix {
		return &v
	}).(MiddlewareSpecStripPrefixPtrOutput)
}

func (o MiddlewareSpecStripPrefixOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecStripPrefix] {
	return pulumix.Output[MiddlewareSpecStripPrefix]{
		OutputState: o.OutputState,
	}
}

// Deprecated: ForceSlash option is deprecated, please remove any usage of this option.
// ForceSlash ensures that the resulting stripped path is not the empty string, by replacing it with / when necessary.
// Default: true.
func (o MiddlewareSpecStripPrefixOutput) ForceSlash() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v MiddlewareSpecStripPrefix) *bool { return v.ForceSlash }).(pulumi.BoolPtrOutput)
}

// Prefixes defines the prefixes to strip from the request URL.
func (o MiddlewareSpecStripPrefixOutput) Prefixes() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecStripPrefix) []string { return v.Prefixes }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecStripPrefixPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecStripPrefixPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecStripPrefix)(nil)).Elem()
}

func (o MiddlewareSpecStripPrefixPtrOutput) ToMiddlewareSpecStripPrefixPtrOutput() MiddlewareSpecStripPrefixPtrOutput {
	return o
}

func (o MiddlewareSpecStripPrefixPtrOutput) ToMiddlewareSpecStripPrefixPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixPtrOutput {
	return o
}

func (o MiddlewareSpecStripPrefixPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecStripPrefix] {
	return pulumix.Output[*MiddlewareSpecStripPrefix]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecStripPrefixPtrOutput) Elem() MiddlewareSpecStripPrefixOutput {
	return o.ApplyT(func(v *MiddlewareSpecStripPrefix) MiddlewareSpecStripPrefix {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecStripPrefix
		return ret
	}).(MiddlewareSpecStripPrefixOutput)
}

// Deprecated: ForceSlash option is deprecated, please remove any usage of this option.
// ForceSlash ensures that the resulting stripped path is not the empty string, by replacing it with / when necessary.
// Default: true.
func (o MiddlewareSpecStripPrefixPtrOutput) ForceSlash() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *MiddlewareSpecStripPrefix) *bool {
		if v == nil {
			return nil
		}
		return v.ForceSlash
	}).(pulumi.BoolPtrOutput)
}

// Prefixes defines the prefixes to strip from the request URL.
func (o MiddlewareSpecStripPrefixPtrOutput) Prefixes() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecStripPrefix) []string {
		if v == nil {
			return nil
		}
		return v.Prefixes
	}).(pulumi.StringArrayOutput)
}

// StripPrefixRegex holds the strip prefix regex middleware configuration.
// This middleware removes the matching prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
type MiddlewareSpecStripPrefixRegex struct {
	// Regex defines the regular expression to match the path prefix from the request URL.
	Regex []string `pulumi:"regex"`
}

// MiddlewareSpecStripPrefixRegexInput is an input type that accepts MiddlewareSpecStripPrefixRegexArgs and MiddlewareSpecStripPrefixRegexOutput values.
// You can construct a concrete instance of `MiddlewareSpecStripPrefixRegexInput` via:
//
//	MiddlewareSpecStripPrefixRegexArgs{...}
type MiddlewareSpecStripPrefixRegexInput interface {
	pulumi.Input

	ToMiddlewareSpecStripPrefixRegexOutput() MiddlewareSpecStripPrefixRegexOutput
	ToMiddlewareSpecStripPrefixRegexOutputWithContext(context.Context) MiddlewareSpecStripPrefixRegexOutput
}

// StripPrefixRegex holds the strip prefix regex middleware configuration.
// This middleware removes the matching prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
type MiddlewareSpecStripPrefixRegexArgs struct {
	// Regex defines the regular expression to match the path prefix from the request URL.
	Regex pulumi.StringArrayInput `pulumi:"regex"`
}

func (MiddlewareSpecStripPrefixRegexArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecStripPrefixRegex)(nil)).Elem()
}

func (i MiddlewareSpecStripPrefixRegexArgs) ToMiddlewareSpecStripPrefixRegexOutput() MiddlewareSpecStripPrefixRegexOutput {
	return i.ToMiddlewareSpecStripPrefixRegexOutputWithContext(context.Background())
}

func (i MiddlewareSpecStripPrefixRegexArgs) ToMiddlewareSpecStripPrefixRegexOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixRegexOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecStripPrefixRegexOutput)
}

func (i MiddlewareSpecStripPrefixRegexArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecStripPrefixRegex] {
	return pulumix.Output[MiddlewareSpecStripPrefixRegex]{
		OutputState: i.ToMiddlewareSpecStripPrefixRegexOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareSpecStripPrefixRegexArgs) ToMiddlewareSpecStripPrefixRegexPtrOutput() MiddlewareSpecStripPrefixRegexPtrOutput {
	return i.ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(context.Background())
}

func (i MiddlewareSpecStripPrefixRegexArgs) ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixRegexPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecStripPrefixRegexOutput).ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(ctx)
}

// MiddlewareSpecStripPrefixRegexPtrInput is an input type that accepts MiddlewareSpecStripPrefixRegexArgs, MiddlewareSpecStripPrefixRegexPtr and MiddlewareSpecStripPrefixRegexPtrOutput values.
// You can construct a concrete instance of `MiddlewareSpecStripPrefixRegexPtrInput` via:
//
//	        MiddlewareSpecStripPrefixRegexArgs{...}
//
//	or:
//
//	        nil
type MiddlewareSpecStripPrefixRegexPtrInput interface {
	pulumi.Input

	ToMiddlewareSpecStripPrefixRegexPtrOutput() MiddlewareSpecStripPrefixRegexPtrOutput
	ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(context.Context) MiddlewareSpecStripPrefixRegexPtrOutput
}

type middlewareSpecStripPrefixRegexPtrType MiddlewareSpecStripPrefixRegexArgs

func MiddlewareSpecStripPrefixRegexPtr(v *MiddlewareSpecStripPrefixRegexArgs) MiddlewareSpecStripPrefixRegexPtrInput {
	return (*middlewareSpecStripPrefixRegexPtrType)(v)
}

func (*middlewareSpecStripPrefixRegexPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecStripPrefixRegex)(nil)).Elem()
}

func (i *middlewareSpecStripPrefixRegexPtrType) ToMiddlewareSpecStripPrefixRegexPtrOutput() MiddlewareSpecStripPrefixRegexPtrOutput {
	return i.ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(context.Background())
}

func (i *middlewareSpecStripPrefixRegexPtrType) ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixRegexPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareSpecStripPrefixRegexPtrOutput)
}

func (i *middlewareSpecStripPrefixRegexPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecStripPrefixRegex] {
	return pulumix.Output[*MiddlewareSpecStripPrefixRegex]{
		OutputState: i.ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(ctx).OutputState,
	}
}

// StripPrefixRegex holds the strip prefix regex middleware configuration.
// This middleware removes the matching prefixes from the URL path.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/http/stripprefixregex/
type MiddlewareSpecStripPrefixRegexOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecStripPrefixRegexOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareSpecStripPrefixRegex)(nil)).Elem()
}

func (o MiddlewareSpecStripPrefixRegexOutput) ToMiddlewareSpecStripPrefixRegexOutput() MiddlewareSpecStripPrefixRegexOutput {
	return o
}

func (o MiddlewareSpecStripPrefixRegexOutput) ToMiddlewareSpecStripPrefixRegexOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixRegexOutput {
	return o
}

func (o MiddlewareSpecStripPrefixRegexOutput) ToMiddlewareSpecStripPrefixRegexPtrOutput() MiddlewareSpecStripPrefixRegexPtrOutput {
	return o.ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(context.Background())
}

func (o MiddlewareSpecStripPrefixRegexOutput) ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixRegexPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareSpecStripPrefixRegex) *MiddlewareSpecStripPrefixRegex {
		return &v
	}).(MiddlewareSpecStripPrefixRegexPtrOutput)
}

func (o MiddlewareSpecStripPrefixRegexOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareSpecStripPrefixRegex] {
	return pulumix.Output[MiddlewareSpecStripPrefixRegex]{
		OutputState: o.OutputState,
	}
}

// Regex defines the regular expression to match the path prefix from the request URL.
func (o MiddlewareSpecStripPrefixRegexOutput) Regex() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareSpecStripPrefixRegex) []string { return v.Regex }).(pulumi.StringArrayOutput)
}

type MiddlewareSpecStripPrefixRegexPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareSpecStripPrefixRegexPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareSpecStripPrefixRegex)(nil)).Elem()
}

func (o MiddlewareSpecStripPrefixRegexPtrOutput) ToMiddlewareSpecStripPrefixRegexPtrOutput() MiddlewareSpecStripPrefixRegexPtrOutput {
	return o
}

func (o MiddlewareSpecStripPrefixRegexPtrOutput) ToMiddlewareSpecStripPrefixRegexPtrOutputWithContext(ctx context.Context) MiddlewareSpecStripPrefixRegexPtrOutput {
	return o
}

func (o MiddlewareSpecStripPrefixRegexPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareSpecStripPrefixRegex] {
	return pulumix.Output[*MiddlewareSpecStripPrefixRegex]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareSpecStripPrefixRegexPtrOutput) Elem() MiddlewareSpecStripPrefixRegexOutput {
	return o.ApplyT(func(v *MiddlewareSpecStripPrefixRegex) MiddlewareSpecStripPrefixRegex {
		if v != nil {
			return *v
		}
		var ret MiddlewareSpecStripPrefixRegex
		return ret
	}).(MiddlewareSpecStripPrefixRegexOutput)
}

// Regex defines the regular expression to match the path prefix from the request URL.
func (o MiddlewareSpecStripPrefixRegexPtrOutput) Regex() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareSpecStripPrefixRegex) []string {
		if v == nil {
			return nil
		}
		return v.Regex
	}).(pulumi.StringArrayOutput)
}

// MiddlewareTCP is the CRD implementation of a Traefik TCP middleware.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/overview/
type MiddlewareTCPType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// MiddlewareTCPSpec defines the desired state of a MiddlewareTCP.
	Spec MiddlewareTCPSpec `pulumi:"spec"`
}

type MiddlewareTCPMetadata struct {
}

// MiddlewareTCPSpec defines the desired state of a MiddlewareTCP.
type MiddlewareTCPSpec struct {
	// InFlightConn defines the InFlightConn middleware configuration.
	InFlightConn *MiddlewareTCPSpecInFlightConn `pulumi:"inFlightConn"`
	// IPAllowList defines the IPAllowList middleware configuration.
	// This middleware accepts/refuses connections based on the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
	IpAllowList *MiddlewareTCPSpecIpAllowList `pulumi:"ipAllowList"`
	// IPWhiteList defines the IPWhiteList middleware configuration.
	// This middleware accepts/refuses connections based on the client IP.
	// Deprecated: please use IPAllowList instead.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
	IpWhiteList *MiddlewareTCPSpecIpWhiteList `pulumi:"ipWhiteList"`
}

// MiddlewareTCPSpecInput is an input type that accepts MiddlewareTCPSpecArgs and MiddlewareTCPSpecOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecInput` via:
//
//	MiddlewareTCPSpecArgs{...}
type MiddlewareTCPSpecInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecOutput() MiddlewareTCPSpecOutput
	ToMiddlewareTCPSpecOutputWithContext(context.Context) MiddlewareTCPSpecOutput
}

// MiddlewareTCPSpec defines the desired state of a MiddlewareTCP.
type MiddlewareTCPSpecArgs struct {
	// InFlightConn defines the InFlightConn middleware configuration.
	InFlightConn MiddlewareTCPSpecInFlightConnPtrInput `pulumi:"inFlightConn"`
	// IPAllowList defines the IPAllowList middleware configuration.
	// This middleware accepts/refuses connections based on the client IP.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
	IpAllowList MiddlewareTCPSpecIpAllowListPtrInput `pulumi:"ipAllowList"`
	// IPWhiteList defines the IPWhiteList middleware configuration.
	// This middleware accepts/refuses connections based on the client IP.
	// Deprecated: please use IPAllowList instead.
	// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
	IpWhiteList MiddlewareTCPSpecIpWhiteListPtrInput `pulumi:"ipWhiteList"`
}

func (MiddlewareTCPSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpec)(nil)).Elem()
}

func (i MiddlewareTCPSpecArgs) ToMiddlewareTCPSpecOutput() MiddlewareTCPSpecOutput {
	return i.ToMiddlewareTCPSpecOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecArgs) ToMiddlewareTCPSpecOutputWithContext(ctx context.Context) MiddlewareTCPSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecOutput)
}

func (i MiddlewareTCPSpecArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpec] {
	return pulumix.Output[MiddlewareTCPSpec]{
		OutputState: i.ToMiddlewareTCPSpecOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareTCPSpecArgs) ToMiddlewareTCPSpecPtrOutput() MiddlewareTCPSpecPtrOutput {
	return i.ToMiddlewareTCPSpecPtrOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecArgs) ToMiddlewareTCPSpecPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecOutput).ToMiddlewareTCPSpecPtrOutputWithContext(ctx)
}

// MiddlewareTCPSpecPtrInput is an input type that accepts MiddlewareTCPSpecArgs, MiddlewareTCPSpecPtr and MiddlewareTCPSpecPtrOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecPtrInput` via:
//
//	        MiddlewareTCPSpecArgs{...}
//
//	or:
//
//	        nil
type MiddlewareTCPSpecPtrInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecPtrOutput() MiddlewareTCPSpecPtrOutput
	ToMiddlewareTCPSpecPtrOutputWithContext(context.Context) MiddlewareTCPSpecPtrOutput
}

type middlewareTCPSpecPtrType MiddlewareTCPSpecArgs

func MiddlewareTCPSpecPtr(v *MiddlewareTCPSpecArgs) MiddlewareTCPSpecPtrInput {
	return (*middlewareTCPSpecPtrType)(v)
}

func (*middlewareTCPSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpec)(nil)).Elem()
}

func (i *middlewareTCPSpecPtrType) ToMiddlewareTCPSpecPtrOutput() MiddlewareTCPSpecPtrOutput {
	return i.ToMiddlewareTCPSpecPtrOutputWithContext(context.Background())
}

func (i *middlewareTCPSpecPtrType) ToMiddlewareTCPSpecPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecPtrOutput)
}

func (i *middlewareTCPSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpec] {
	return pulumix.Output[*MiddlewareTCPSpec]{
		OutputState: i.ToMiddlewareTCPSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// MiddlewareTCPSpec defines the desired state of a MiddlewareTCP.
type MiddlewareTCPSpecOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpec)(nil)).Elem()
}

func (o MiddlewareTCPSpecOutput) ToMiddlewareTCPSpecOutput() MiddlewareTCPSpecOutput {
	return o
}

func (o MiddlewareTCPSpecOutput) ToMiddlewareTCPSpecOutputWithContext(ctx context.Context) MiddlewareTCPSpecOutput {
	return o
}

func (o MiddlewareTCPSpecOutput) ToMiddlewareTCPSpecPtrOutput() MiddlewareTCPSpecPtrOutput {
	return o.ToMiddlewareTCPSpecPtrOutputWithContext(context.Background())
}

func (o MiddlewareTCPSpecOutput) ToMiddlewareTCPSpecPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareTCPSpec) *MiddlewareTCPSpec {
		return &v
	}).(MiddlewareTCPSpecPtrOutput)
}

func (o MiddlewareTCPSpecOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpec] {
	return pulumix.Output[MiddlewareTCPSpec]{
		OutputState: o.OutputState,
	}
}

// InFlightConn defines the InFlightConn middleware configuration.
func (o MiddlewareTCPSpecOutput) InFlightConn() MiddlewareTCPSpecInFlightConnPtrOutput {
	return o.ApplyT(func(v MiddlewareTCPSpec) *MiddlewareTCPSpecInFlightConn { return v.InFlightConn }).(MiddlewareTCPSpecInFlightConnPtrOutput)
}

// IPAllowList defines the IPAllowList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
func (o MiddlewareTCPSpecOutput) IpAllowList() MiddlewareTCPSpecIpAllowListPtrOutput {
	return o.ApplyT(func(v MiddlewareTCPSpec) *MiddlewareTCPSpecIpAllowList { return v.IpAllowList }).(MiddlewareTCPSpecIpAllowListPtrOutput)
}

// IPWhiteList defines the IPWhiteList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// Deprecated: please use IPAllowList instead.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
func (o MiddlewareTCPSpecOutput) IpWhiteList() MiddlewareTCPSpecIpWhiteListPtrOutput {
	return o.ApplyT(func(v MiddlewareTCPSpec) *MiddlewareTCPSpecIpWhiteList { return v.IpWhiteList }).(MiddlewareTCPSpecIpWhiteListPtrOutput)
}

type MiddlewareTCPSpecPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpec)(nil)).Elem()
}

func (o MiddlewareTCPSpecPtrOutput) ToMiddlewareTCPSpecPtrOutput() MiddlewareTCPSpecPtrOutput {
	return o
}

func (o MiddlewareTCPSpecPtrOutput) ToMiddlewareTCPSpecPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecPtrOutput {
	return o
}

func (o MiddlewareTCPSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpec] {
	return pulumix.Output[*MiddlewareTCPSpec]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareTCPSpecPtrOutput) Elem() MiddlewareTCPSpecOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpec) MiddlewareTCPSpec {
		if v != nil {
			return *v
		}
		var ret MiddlewareTCPSpec
		return ret
	}).(MiddlewareTCPSpecOutput)
}

// InFlightConn defines the InFlightConn middleware configuration.
func (o MiddlewareTCPSpecPtrOutput) InFlightConn() MiddlewareTCPSpecInFlightConnPtrOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpec) *MiddlewareTCPSpecInFlightConn {
		if v == nil {
			return nil
		}
		return v.InFlightConn
	}).(MiddlewareTCPSpecInFlightConnPtrOutput)
}

// IPAllowList defines the IPAllowList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
func (o MiddlewareTCPSpecPtrOutput) IpAllowList() MiddlewareTCPSpecIpAllowListPtrOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpec) *MiddlewareTCPSpecIpAllowList {
		if v == nil {
			return nil
		}
		return v.IpAllowList
	}).(MiddlewareTCPSpecIpAllowListPtrOutput)
}

// IPWhiteList defines the IPWhiteList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// Deprecated: please use IPAllowList instead.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
func (o MiddlewareTCPSpecPtrOutput) IpWhiteList() MiddlewareTCPSpecIpWhiteListPtrOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpec) *MiddlewareTCPSpecIpWhiteList {
		if v == nil {
			return nil
		}
		return v.IpWhiteList
	}).(MiddlewareTCPSpecIpWhiteListPtrOutput)
}

// InFlightConn defines the InFlightConn middleware configuration.
type MiddlewareTCPSpecInFlightConn struct {
	// Amount defines the maximum amount of allowed simultaneous connections.
	// The middleware closes the connection if there are already amount connections opened.
	Amount *int `pulumi:"amount"`
}

// MiddlewareTCPSpecInFlightConnInput is an input type that accepts MiddlewareTCPSpecInFlightConnArgs and MiddlewareTCPSpecInFlightConnOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecInFlightConnInput` via:
//
//	MiddlewareTCPSpecInFlightConnArgs{...}
type MiddlewareTCPSpecInFlightConnInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecInFlightConnOutput() MiddlewareTCPSpecInFlightConnOutput
	ToMiddlewareTCPSpecInFlightConnOutputWithContext(context.Context) MiddlewareTCPSpecInFlightConnOutput
}

// InFlightConn defines the InFlightConn middleware configuration.
type MiddlewareTCPSpecInFlightConnArgs struct {
	// Amount defines the maximum amount of allowed simultaneous connections.
	// The middleware closes the connection if there are already amount connections opened.
	Amount pulumi.IntPtrInput `pulumi:"amount"`
}

func (MiddlewareTCPSpecInFlightConnArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpecInFlightConn)(nil)).Elem()
}

func (i MiddlewareTCPSpecInFlightConnArgs) ToMiddlewareTCPSpecInFlightConnOutput() MiddlewareTCPSpecInFlightConnOutput {
	return i.ToMiddlewareTCPSpecInFlightConnOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecInFlightConnArgs) ToMiddlewareTCPSpecInFlightConnOutputWithContext(ctx context.Context) MiddlewareTCPSpecInFlightConnOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecInFlightConnOutput)
}

func (i MiddlewareTCPSpecInFlightConnArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpecInFlightConn] {
	return pulumix.Output[MiddlewareTCPSpecInFlightConn]{
		OutputState: i.ToMiddlewareTCPSpecInFlightConnOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareTCPSpecInFlightConnArgs) ToMiddlewareTCPSpecInFlightConnPtrOutput() MiddlewareTCPSpecInFlightConnPtrOutput {
	return i.ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecInFlightConnArgs) ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecInFlightConnPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecInFlightConnOutput).ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(ctx)
}

// MiddlewareTCPSpecInFlightConnPtrInput is an input type that accepts MiddlewareTCPSpecInFlightConnArgs, MiddlewareTCPSpecInFlightConnPtr and MiddlewareTCPSpecInFlightConnPtrOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecInFlightConnPtrInput` via:
//
//	        MiddlewareTCPSpecInFlightConnArgs{...}
//
//	or:
//
//	        nil
type MiddlewareTCPSpecInFlightConnPtrInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecInFlightConnPtrOutput() MiddlewareTCPSpecInFlightConnPtrOutput
	ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(context.Context) MiddlewareTCPSpecInFlightConnPtrOutput
}

type middlewareTCPSpecInFlightConnPtrType MiddlewareTCPSpecInFlightConnArgs

func MiddlewareTCPSpecInFlightConnPtr(v *MiddlewareTCPSpecInFlightConnArgs) MiddlewareTCPSpecInFlightConnPtrInput {
	return (*middlewareTCPSpecInFlightConnPtrType)(v)
}

func (*middlewareTCPSpecInFlightConnPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpecInFlightConn)(nil)).Elem()
}

func (i *middlewareTCPSpecInFlightConnPtrType) ToMiddlewareTCPSpecInFlightConnPtrOutput() MiddlewareTCPSpecInFlightConnPtrOutput {
	return i.ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(context.Background())
}

func (i *middlewareTCPSpecInFlightConnPtrType) ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecInFlightConnPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecInFlightConnPtrOutput)
}

func (i *middlewareTCPSpecInFlightConnPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpecInFlightConn] {
	return pulumix.Output[*MiddlewareTCPSpecInFlightConn]{
		OutputState: i.ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(ctx).OutputState,
	}
}

// InFlightConn defines the InFlightConn middleware configuration.
type MiddlewareTCPSpecInFlightConnOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecInFlightConnOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpecInFlightConn)(nil)).Elem()
}

func (o MiddlewareTCPSpecInFlightConnOutput) ToMiddlewareTCPSpecInFlightConnOutput() MiddlewareTCPSpecInFlightConnOutput {
	return o
}

func (o MiddlewareTCPSpecInFlightConnOutput) ToMiddlewareTCPSpecInFlightConnOutputWithContext(ctx context.Context) MiddlewareTCPSpecInFlightConnOutput {
	return o
}

func (o MiddlewareTCPSpecInFlightConnOutput) ToMiddlewareTCPSpecInFlightConnPtrOutput() MiddlewareTCPSpecInFlightConnPtrOutput {
	return o.ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(context.Background())
}

func (o MiddlewareTCPSpecInFlightConnOutput) ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecInFlightConnPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareTCPSpecInFlightConn) *MiddlewareTCPSpecInFlightConn {
		return &v
	}).(MiddlewareTCPSpecInFlightConnPtrOutput)
}

func (o MiddlewareTCPSpecInFlightConnOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpecInFlightConn] {
	return pulumix.Output[MiddlewareTCPSpecInFlightConn]{
		OutputState: o.OutputState,
	}
}

// Amount defines the maximum amount of allowed simultaneous connections.
// The middleware closes the connection if there are already amount connections opened.
func (o MiddlewareTCPSpecInFlightConnOutput) Amount() pulumi.IntPtrOutput {
	return o.ApplyT(func(v MiddlewareTCPSpecInFlightConn) *int { return v.Amount }).(pulumi.IntPtrOutput)
}

type MiddlewareTCPSpecInFlightConnPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecInFlightConnPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpecInFlightConn)(nil)).Elem()
}

func (o MiddlewareTCPSpecInFlightConnPtrOutput) ToMiddlewareTCPSpecInFlightConnPtrOutput() MiddlewareTCPSpecInFlightConnPtrOutput {
	return o
}

func (o MiddlewareTCPSpecInFlightConnPtrOutput) ToMiddlewareTCPSpecInFlightConnPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecInFlightConnPtrOutput {
	return o
}

func (o MiddlewareTCPSpecInFlightConnPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpecInFlightConn] {
	return pulumix.Output[*MiddlewareTCPSpecInFlightConn]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareTCPSpecInFlightConnPtrOutput) Elem() MiddlewareTCPSpecInFlightConnOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpecInFlightConn) MiddlewareTCPSpecInFlightConn {
		if v != nil {
			return *v
		}
		var ret MiddlewareTCPSpecInFlightConn
		return ret
	}).(MiddlewareTCPSpecInFlightConnOutput)
}

// Amount defines the maximum amount of allowed simultaneous connections.
// The middleware closes the connection if there are already amount connections opened.
func (o MiddlewareTCPSpecInFlightConnPtrOutput) Amount() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpecInFlightConn) *int {
		if v == nil {
			return nil
		}
		return v.Amount
	}).(pulumi.IntPtrOutput)
}

// IPAllowList defines the IPAllowList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
type MiddlewareTCPSpecIpAllowList struct {
	// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
	SourceRange []string `pulumi:"sourceRange"`
}

// MiddlewareTCPSpecIpAllowListInput is an input type that accepts MiddlewareTCPSpecIpAllowListArgs and MiddlewareTCPSpecIpAllowListOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecIpAllowListInput` via:
//
//	MiddlewareTCPSpecIpAllowListArgs{...}
type MiddlewareTCPSpecIpAllowListInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecIpAllowListOutput() MiddlewareTCPSpecIpAllowListOutput
	ToMiddlewareTCPSpecIpAllowListOutputWithContext(context.Context) MiddlewareTCPSpecIpAllowListOutput
}

// IPAllowList defines the IPAllowList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
type MiddlewareTCPSpecIpAllowListArgs struct {
	// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
	SourceRange pulumi.StringArrayInput `pulumi:"sourceRange"`
}

func (MiddlewareTCPSpecIpAllowListArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpecIpAllowList)(nil)).Elem()
}

func (i MiddlewareTCPSpecIpAllowListArgs) ToMiddlewareTCPSpecIpAllowListOutput() MiddlewareTCPSpecIpAllowListOutput {
	return i.ToMiddlewareTCPSpecIpAllowListOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecIpAllowListArgs) ToMiddlewareTCPSpecIpAllowListOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpAllowListOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecIpAllowListOutput)
}

func (i MiddlewareTCPSpecIpAllowListArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpecIpAllowList] {
	return pulumix.Output[MiddlewareTCPSpecIpAllowList]{
		OutputState: i.ToMiddlewareTCPSpecIpAllowListOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareTCPSpecIpAllowListArgs) ToMiddlewareTCPSpecIpAllowListPtrOutput() MiddlewareTCPSpecIpAllowListPtrOutput {
	return i.ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecIpAllowListArgs) ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpAllowListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecIpAllowListOutput).ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(ctx)
}

// MiddlewareTCPSpecIpAllowListPtrInput is an input type that accepts MiddlewareTCPSpecIpAllowListArgs, MiddlewareTCPSpecIpAllowListPtr and MiddlewareTCPSpecIpAllowListPtrOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecIpAllowListPtrInput` via:
//
//	        MiddlewareTCPSpecIpAllowListArgs{...}
//
//	or:
//
//	        nil
type MiddlewareTCPSpecIpAllowListPtrInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecIpAllowListPtrOutput() MiddlewareTCPSpecIpAllowListPtrOutput
	ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(context.Context) MiddlewareTCPSpecIpAllowListPtrOutput
}

type middlewareTCPSpecIpAllowListPtrType MiddlewareTCPSpecIpAllowListArgs

func MiddlewareTCPSpecIpAllowListPtr(v *MiddlewareTCPSpecIpAllowListArgs) MiddlewareTCPSpecIpAllowListPtrInput {
	return (*middlewareTCPSpecIpAllowListPtrType)(v)
}

func (*middlewareTCPSpecIpAllowListPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpecIpAllowList)(nil)).Elem()
}

func (i *middlewareTCPSpecIpAllowListPtrType) ToMiddlewareTCPSpecIpAllowListPtrOutput() MiddlewareTCPSpecIpAllowListPtrOutput {
	return i.ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(context.Background())
}

func (i *middlewareTCPSpecIpAllowListPtrType) ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpAllowListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecIpAllowListPtrOutput)
}

func (i *middlewareTCPSpecIpAllowListPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpecIpAllowList] {
	return pulumix.Output[*MiddlewareTCPSpecIpAllowList]{
		OutputState: i.ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(ctx).OutputState,
	}
}

// IPAllowList defines the IPAllowList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipallowlist/
type MiddlewareTCPSpecIpAllowListOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecIpAllowListOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpecIpAllowList)(nil)).Elem()
}

func (o MiddlewareTCPSpecIpAllowListOutput) ToMiddlewareTCPSpecIpAllowListOutput() MiddlewareTCPSpecIpAllowListOutput {
	return o
}

func (o MiddlewareTCPSpecIpAllowListOutput) ToMiddlewareTCPSpecIpAllowListOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpAllowListOutput {
	return o
}

func (o MiddlewareTCPSpecIpAllowListOutput) ToMiddlewareTCPSpecIpAllowListPtrOutput() MiddlewareTCPSpecIpAllowListPtrOutput {
	return o.ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(context.Background())
}

func (o MiddlewareTCPSpecIpAllowListOutput) ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpAllowListPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareTCPSpecIpAllowList) *MiddlewareTCPSpecIpAllowList {
		return &v
	}).(MiddlewareTCPSpecIpAllowListPtrOutput)
}

func (o MiddlewareTCPSpecIpAllowListOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpecIpAllowList] {
	return pulumix.Output[MiddlewareTCPSpecIpAllowList]{
		OutputState: o.OutputState,
	}
}

// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
func (o MiddlewareTCPSpecIpAllowListOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareTCPSpecIpAllowList) []string { return v.SourceRange }).(pulumi.StringArrayOutput)
}

type MiddlewareTCPSpecIpAllowListPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecIpAllowListPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpecIpAllowList)(nil)).Elem()
}

func (o MiddlewareTCPSpecIpAllowListPtrOutput) ToMiddlewareTCPSpecIpAllowListPtrOutput() MiddlewareTCPSpecIpAllowListPtrOutput {
	return o
}

func (o MiddlewareTCPSpecIpAllowListPtrOutput) ToMiddlewareTCPSpecIpAllowListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpAllowListPtrOutput {
	return o
}

func (o MiddlewareTCPSpecIpAllowListPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpecIpAllowList] {
	return pulumix.Output[*MiddlewareTCPSpecIpAllowList]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareTCPSpecIpAllowListPtrOutput) Elem() MiddlewareTCPSpecIpAllowListOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpecIpAllowList) MiddlewareTCPSpecIpAllowList {
		if v != nil {
			return *v
		}
		var ret MiddlewareTCPSpecIpAllowList
		return ret
	}).(MiddlewareTCPSpecIpAllowListOutput)
}

// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
func (o MiddlewareTCPSpecIpAllowListPtrOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpecIpAllowList) []string {
		if v == nil {
			return nil
		}
		return v.SourceRange
	}).(pulumi.StringArrayOutput)
}

// IPWhiteList defines the IPWhiteList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// Deprecated: please use IPAllowList instead.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
type MiddlewareTCPSpecIpWhiteList struct {
	// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
	SourceRange []string `pulumi:"sourceRange"`
}

// MiddlewareTCPSpecIpWhiteListInput is an input type that accepts MiddlewareTCPSpecIpWhiteListArgs and MiddlewareTCPSpecIpWhiteListOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecIpWhiteListInput` via:
//
//	MiddlewareTCPSpecIpWhiteListArgs{...}
type MiddlewareTCPSpecIpWhiteListInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecIpWhiteListOutput() MiddlewareTCPSpecIpWhiteListOutput
	ToMiddlewareTCPSpecIpWhiteListOutputWithContext(context.Context) MiddlewareTCPSpecIpWhiteListOutput
}

// IPWhiteList defines the IPWhiteList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// Deprecated: please use IPAllowList instead.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
type MiddlewareTCPSpecIpWhiteListArgs struct {
	// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
	SourceRange pulumi.StringArrayInput `pulumi:"sourceRange"`
}

func (MiddlewareTCPSpecIpWhiteListArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpecIpWhiteList)(nil)).Elem()
}

func (i MiddlewareTCPSpecIpWhiteListArgs) ToMiddlewareTCPSpecIpWhiteListOutput() MiddlewareTCPSpecIpWhiteListOutput {
	return i.ToMiddlewareTCPSpecIpWhiteListOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecIpWhiteListArgs) ToMiddlewareTCPSpecIpWhiteListOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpWhiteListOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecIpWhiteListOutput)
}

func (i MiddlewareTCPSpecIpWhiteListArgs) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpecIpWhiteList] {
	return pulumix.Output[MiddlewareTCPSpecIpWhiteList]{
		OutputState: i.ToMiddlewareTCPSpecIpWhiteListOutputWithContext(ctx).OutputState,
	}
}

func (i MiddlewareTCPSpecIpWhiteListArgs) ToMiddlewareTCPSpecIpWhiteListPtrOutput() MiddlewareTCPSpecIpWhiteListPtrOutput {
	return i.ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(context.Background())
}

func (i MiddlewareTCPSpecIpWhiteListArgs) ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpWhiteListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecIpWhiteListOutput).ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(ctx)
}

// MiddlewareTCPSpecIpWhiteListPtrInput is an input type that accepts MiddlewareTCPSpecIpWhiteListArgs, MiddlewareTCPSpecIpWhiteListPtr and MiddlewareTCPSpecIpWhiteListPtrOutput values.
// You can construct a concrete instance of `MiddlewareTCPSpecIpWhiteListPtrInput` via:
//
//	        MiddlewareTCPSpecIpWhiteListArgs{...}
//
//	or:
//
//	        nil
type MiddlewareTCPSpecIpWhiteListPtrInput interface {
	pulumi.Input

	ToMiddlewareTCPSpecIpWhiteListPtrOutput() MiddlewareTCPSpecIpWhiteListPtrOutput
	ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(context.Context) MiddlewareTCPSpecIpWhiteListPtrOutput
}

type middlewareTCPSpecIpWhiteListPtrType MiddlewareTCPSpecIpWhiteListArgs

func MiddlewareTCPSpecIpWhiteListPtr(v *MiddlewareTCPSpecIpWhiteListArgs) MiddlewareTCPSpecIpWhiteListPtrInput {
	return (*middlewareTCPSpecIpWhiteListPtrType)(v)
}

func (*middlewareTCPSpecIpWhiteListPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpecIpWhiteList)(nil)).Elem()
}

func (i *middlewareTCPSpecIpWhiteListPtrType) ToMiddlewareTCPSpecIpWhiteListPtrOutput() MiddlewareTCPSpecIpWhiteListPtrOutput {
	return i.ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(context.Background())
}

func (i *middlewareTCPSpecIpWhiteListPtrType) ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpWhiteListPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(MiddlewareTCPSpecIpWhiteListPtrOutput)
}

func (i *middlewareTCPSpecIpWhiteListPtrType) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpecIpWhiteList] {
	return pulumix.Output[*MiddlewareTCPSpecIpWhiteList]{
		OutputState: i.ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(ctx).OutputState,
	}
}

// IPWhiteList defines the IPWhiteList middleware configuration.
// This middleware accepts/refuses connections based on the client IP.
// Deprecated: please use IPAllowList instead.
// More info: https://doc.traefik.io/traefik/v3.0/middlewares/tcp/ipwhitelist/
type MiddlewareTCPSpecIpWhiteListOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecIpWhiteListOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*MiddlewareTCPSpecIpWhiteList)(nil)).Elem()
}

func (o MiddlewareTCPSpecIpWhiteListOutput) ToMiddlewareTCPSpecIpWhiteListOutput() MiddlewareTCPSpecIpWhiteListOutput {
	return o
}

func (o MiddlewareTCPSpecIpWhiteListOutput) ToMiddlewareTCPSpecIpWhiteListOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpWhiteListOutput {
	return o
}

func (o MiddlewareTCPSpecIpWhiteListOutput) ToMiddlewareTCPSpecIpWhiteListPtrOutput() MiddlewareTCPSpecIpWhiteListPtrOutput {
	return o.ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(context.Background())
}

func (o MiddlewareTCPSpecIpWhiteListOutput) ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpWhiteListPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v MiddlewareTCPSpecIpWhiteList) *MiddlewareTCPSpecIpWhiteList {
		return &v
	}).(MiddlewareTCPSpecIpWhiteListPtrOutput)
}

func (o MiddlewareTCPSpecIpWhiteListOutput) ToOutput(ctx context.Context) pulumix.Output[MiddlewareTCPSpecIpWhiteList] {
	return pulumix.Output[MiddlewareTCPSpecIpWhiteList]{
		OutputState: o.OutputState,
	}
}

// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
func (o MiddlewareTCPSpecIpWhiteListOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v MiddlewareTCPSpecIpWhiteList) []string { return v.SourceRange }).(pulumi.StringArrayOutput)
}

type MiddlewareTCPSpecIpWhiteListPtrOutput struct{ *pulumi.OutputState }

func (MiddlewareTCPSpecIpWhiteListPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**MiddlewareTCPSpecIpWhiteList)(nil)).Elem()
}

func (o MiddlewareTCPSpecIpWhiteListPtrOutput) ToMiddlewareTCPSpecIpWhiteListPtrOutput() MiddlewareTCPSpecIpWhiteListPtrOutput {
	return o
}

func (o MiddlewareTCPSpecIpWhiteListPtrOutput) ToMiddlewareTCPSpecIpWhiteListPtrOutputWithContext(ctx context.Context) MiddlewareTCPSpecIpWhiteListPtrOutput {
	return o
}

func (o MiddlewareTCPSpecIpWhiteListPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*MiddlewareTCPSpecIpWhiteList] {
	return pulumix.Output[*MiddlewareTCPSpecIpWhiteList]{
		OutputState: o.OutputState,
	}
}

func (o MiddlewareTCPSpecIpWhiteListPtrOutput) Elem() MiddlewareTCPSpecIpWhiteListOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpecIpWhiteList) MiddlewareTCPSpecIpWhiteList {
		if v != nil {
			return *v
		}
		var ret MiddlewareTCPSpecIpWhiteList
		return ret
	}).(MiddlewareTCPSpecIpWhiteListOutput)
}

// SourceRange defines the allowed IPs (or ranges of allowed IPs by using CIDR notation).
func (o MiddlewareTCPSpecIpWhiteListPtrOutput) SourceRange() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *MiddlewareTCPSpecIpWhiteList) []string {
		if v == nil {
			return nil
		}
		return v.SourceRange
	}).(pulumi.StringArrayOutput)
}

// ServersTransport is the CRD implementation of a ServersTransport.
// If no serversTransport is specified, the default@internal will be used.
// The default@internal serversTransport is created from the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#serverstransport_1
type ServersTransportType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// ServersTransportSpec defines the desired state of a ServersTransport.
	Spec ServersTransportSpec `pulumi:"spec"`
}

type ServersTransportMetadata struct {
}

// ServersTransportSpec defines the desired state of a ServersTransport.
type ServersTransportSpec struct {
	// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
	CertificatesSecrets []string `pulumi:"certificatesSecrets"`
	// DisableHTTP2 disables HTTP/2 for connections with backend servers.
	DisableHTTP2 *bool `pulumi:"disableHTTP2"`
	// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
	ForwardingTimeouts *ServersTransportSpecForwardingTimeouts `pulumi:"forwardingTimeouts"`
	// InsecureSkipVerify disables SSL certificate verification.
	InsecureSkipVerify *bool `pulumi:"insecureSkipVerify"`
	// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
	MaxIdleConnsPerHost *int `pulumi:"maxIdleConnsPerHost"`
	// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
	PeerCertURI *string `pulumi:"peerCertURI"`
	// RootCAsSecrets defines a list of CA secret used to validate self-signed certificate.
	RootCAsSecrets []string `pulumi:"rootCAsSecrets"`
	// ServerName defines the server name used to contact the server.
	ServerName *string `pulumi:"serverName"`
	// Spiffe defines the SPIFFE configuration.
	Spiffe *ServersTransportSpecSpiffe `pulumi:"spiffe"`
}

// ServersTransportSpecInput is an input type that accepts ServersTransportSpecArgs and ServersTransportSpecOutput values.
// You can construct a concrete instance of `ServersTransportSpecInput` via:
//
//	ServersTransportSpecArgs{...}
type ServersTransportSpecInput interface {
	pulumi.Input

	ToServersTransportSpecOutput() ServersTransportSpecOutput
	ToServersTransportSpecOutputWithContext(context.Context) ServersTransportSpecOutput
}

// ServersTransportSpec defines the desired state of a ServersTransport.
type ServersTransportSpecArgs struct {
	// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
	CertificatesSecrets pulumi.StringArrayInput `pulumi:"certificatesSecrets"`
	// DisableHTTP2 disables HTTP/2 for connections with backend servers.
	DisableHTTP2 pulumi.BoolPtrInput `pulumi:"disableHTTP2"`
	// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
	ForwardingTimeouts ServersTransportSpecForwardingTimeoutsPtrInput `pulumi:"forwardingTimeouts"`
	// InsecureSkipVerify disables SSL certificate verification.
	InsecureSkipVerify pulumi.BoolPtrInput `pulumi:"insecureSkipVerify"`
	// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
	MaxIdleConnsPerHost pulumi.IntPtrInput `pulumi:"maxIdleConnsPerHost"`
	// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
	PeerCertURI pulumi.StringPtrInput `pulumi:"peerCertURI"`
	// RootCAsSecrets defines a list of CA secret used to validate self-signed certificate.
	RootCAsSecrets pulumi.StringArrayInput `pulumi:"rootCAsSecrets"`
	// ServerName defines the server name used to contact the server.
	ServerName pulumi.StringPtrInput `pulumi:"serverName"`
	// Spiffe defines the SPIFFE configuration.
	Spiffe ServersTransportSpecSpiffePtrInput `pulumi:"spiffe"`
}

func (ServersTransportSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportSpec)(nil)).Elem()
}

func (i ServersTransportSpecArgs) ToServersTransportSpecOutput() ServersTransportSpecOutput {
	return i.ToServersTransportSpecOutputWithContext(context.Background())
}

func (i ServersTransportSpecArgs) ToServersTransportSpecOutputWithContext(ctx context.Context) ServersTransportSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecOutput)
}

func (i ServersTransportSpecArgs) ToOutput(ctx context.Context) pulumix.Output[ServersTransportSpec] {
	return pulumix.Output[ServersTransportSpec]{
		OutputState: i.ToServersTransportSpecOutputWithContext(ctx).OutputState,
	}
}

func (i ServersTransportSpecArgs) ToServersTransportSpecPtrOutput() ServersTransportSpecPtrOutput {
	return i.ToServersTransportSpecPtrOutputWithContext(context.Background())
}

func (i ServersTransportSpecArgs) ToServersTransportSpecPtrOutputWithContext(ctx context.Context) ServersTransportSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecOutput).ToServersTransportSpecPtrOutputWithContext(ctx)
}

// ServersTransportSpecPtrInput is an input type that accepts ServersTransportSpecArgs, ServersTransportSpecPtr and ServersTransportSpecPtrOutput values.
// You can construct a concrete instance of `ServersTransportSpecPtrInput` via:
//
//	        ServersTransportSpecArgs{...}
//
//	or:
//
//	        nil
type ServersTransportSpecPtrInput interface {
	pulumi.Input

	ToServersTransportSpecPtrOutput() ServersTransportSpecPtrOutput
	ToServersTransportSpecPtrOutputWithContext(context.Context) ServersTransportSpecPtrOutput
}

type serversTransportSpecPtrType ServersTransportSpecArgs

func ServersTransportSpecPtr(v *ServersTransportSpecArgs) ServersTransportSpecPtrInput {
	return (*serversTransportSpecPtrType)(v)
}

func (*serversTransportSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportSpec)(nil)).Elem()
}

func (i *serversTransportSpecPtrType) ToServersTransportSpecPtrOutput() ServersTransportSpecPtrOutput {
	return i.ToServersTransportSpecPtrOutputWithContext(context.Background())
}

func (i *serversTransportSpecPtrType) ToServersTransportSpecPtrOutputWithContext(ctx context.Context) ServersTransportSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecPtrOutput)
}

func (i *serversTransportSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportSpec] {
	return pulumix.Output[*ServersTransportSpec]{
		OutputState: i.ToServersTransportSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// ServersTransportSpec defines the desired state of a ServersTransport.
type ServersTransportSpecOutput struct{ *pulumi.OutputState }

func (ServersTransportSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportSpec)(nil)).Elem()
}

func (o ServersTransportSpecOutput) ToServersTransportSpecOutput() ServersTransportSpecOutput {
	return o
}

func (o ServersTransportSpecOutput) ToServersTransportSpecOutputWithContext(ctx context.Context) ServersTransportSpecOutput {
	return o
}

func (o ServersTransportSpecOutput) ToServersTransportSpecPtrOutput() ServersTransportSpecPtrOutput {
	return o.ToServersTransportSpecPtrOutputWithContext(context.Background())
}

func (o ServersTransportSpecOutput) ToServersTransportSpecPtrOutputWithContext(ctx context.Context) ServersTransportSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v ServersTransportSpec) *ServersTransportSpec {
		return &v
	}).(ServersTransportSpecPtrOutput)
}

func (o ServersTransportSpecOutput) ToOutput(ctx context.Context) pulumix.Output[ServersTransportSpec] {
	return pulumix.Output[ServersTransportSpec]{
		OutputState: o.OutputState,
	}
}

// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
func (o ServersTransportSpecOutput) CertificatesSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v ServersTransportSpec) []string { return v.CertificatesSecrets }).(pulumi.StringArrayOutput)
}

// DisableHTTP2 disables HTTP/2 for connections with backend servers.
func (o ServersTransportSpecOutput) DisableHTTP2() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *bool { return v.DisableHTTP2 }).(pulumi.BoolPtrOutput)
}

// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
func (o ServersTransportSpecOutput) ForwardingTimeouts() ServersTransportSpecForwardingTimeoutsPtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *ServersTransportSpecForwardingTimeouts { return v.ForwardingTimeouts }).(ServersTransportSpecForwardingTimeoutsPtrOutput)
}

// InsecureSkipVerify disables SSL certificate verification.
func (o ServersTransportSpecOutput) InsecureSkipVerify() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *bool { return v.InsecureSkipVerify }).(pulumi.BoolPtrOutput)
}

// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
func (o ServersTransportSpecOutput) MaxIdleConnsPerHost() pulumi.IntPtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *int { return v.MaxIdleConnsPerHost }).(pulumi.IntPtrOutput)
}

// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
func (o ServersTransportSpecOutput) PeerCertURI() pulumi.StringPtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *string { return v.PeerCertURI }).(pulumi.StringPtrOutput)
}

// RootCAsSecrets defines a list of CA secret used to validate self-signed certificate.
func (o ServersTransportSpecOutput) RootCAsSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v ServersTransportSpec) []string { return v.RootCAsSecrets }).(pulumi.StringArrayOutput)
}

// ServerName defines the server name used to contact the server.
func (o ServersTransportSpecOutput) ServerName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *string { return v.ServerName }).(pulumi.StringPtrOutput)
}

// Spiffe defines the SPIFFE configuration.
func (o ServersTransportSpecOutput) Spiffe() ServersTransportSpecSpiffePtrOutput {
	return o.ApplyT(func(v ServersTransportSpec) *ServersTransportSpecSpiffe { return v.Spiffe }).(ServersTransportSpecSpiffePtrOutput)
}

type ServersTransportSpecPtrOutput struct{ *pulumi.OutputState }

func (ServersTransportSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportSpec)(nil)).Elem()
}

func (o ServersTransportSpecPtrOutput) ToServersTransportSpecPtrOutput() ServersTransportSpecPtrOutput {
	return o
}

func (o ServersTransportSpecPtrOutput) ToServersTransportSpecPtrOutputWithContext(ctx context.Context) ServersTransportSpecPtrOutput {
	return o
}

func (o ServersTransportSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportSpec] {
	return pulumix.Output[*ServersTransportSpec]{
		OutputState: o.OutputState,
	}
}

func (o ServersTransportSpecPtrOutput) Elem() ServersTransportSpecOutput {
	return o.ApplyT(func(v *ServersTransportSpec) ServersTransportSpec {
		if v != nil {
			return *v
		}
		var ret ServersTransportSpec
		return ret
	}).(ServersTransportSpecOutput)
}

// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
func (o ServersTransportSpecPtrOutput) CertificatesSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *ServersTransportSpec) []string {
		if v == nil {
			return nil
		}
		return v.CertificatesSecrets
	}).(pulumi.StringArrayOutput)
}

// DisableHTTP2 disables HTTP/2 for connections with backend servers.
func (o ServersTransportSpecPtrOutput) DisableHTTP2() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *bool {
		if v == nil {
			return nil
		}
		return v.DisableHTTP2
	}).(pulumi.BoolPtrOutput)
}

// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
func (o ServersTransportSpecPtrOutput) ForwardingTimeouts() ServersTransportSpecForwardingTimeoutsPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *ServersTransportSpecForwardingTimeouts {
		if v == nil {
			return nil
		}
		return v.ForwardingTimeouts
	}).(ServersTransportSpecForwardingTimeoutsPtrOutput)
}

// InsecureSkipVerify disables SSL certificate verification.
func (o ServersTransportSpecPtrOutput) InsecureSkipVerify() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *bool {
		if v == nil {
			return nil
		}
		return v.InsecureSkipVerify
	}).(pulumi.BoolPtrOutput)
}

// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
func (o ServersTransportSpecPtrOutput) MaxIdleConnsPerHost() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *int {
		if v == nil {
			return nil
		}
		return v.MaxIdleConnsPerHost
	}).(pulumi.IntPtrOutput)
}

// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
func (o ServersTransportSpecPtrOutput) PeerCertURI() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *string {
		if v == nil {
			return nil
		}
		return v.PeerCertURI
	}).(pulumi.StringPtrOutput)
}

// RootCAsSecrets defines a list of CA secret used to validate self-signed certificate.
func (o ServersTransportSpecPtrOutput) RootCAsSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *ServersTransportSpec) []string {
		if v == nil {
			return nil
		}
		return v.RootCAsSecrets
	}).(pulumi.StringArrayOutput)
}

// ServerName defines the server name used to contact the server.
func (o ServersTransportSpecPtrOutput) ServerName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *string {
		if v == nil {
			return nil
		}
		return v.ServerName
	}).(pulumi.StringPtrOutput)
}

// Spiffe defines the SPIFFE configuration.
func (o ServersTransportSpecPtrOutput) Spiffe() ServersTransportSpecSpiffePtrOutput {
	return o.ApplyT(func(v *ServersTransportSpec) *ServersTransportSpecSpiffe {
		if v == nil {
			return nil
		}
		return v.Spiffe
	}).(ServersTransportSpecSpiffePtrOutput)
}

// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
type ServersTransportSpecForwardingTimeouts struct {
	// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
	DialTimeout interface{} `pulumi:"dialTimeout"`
	// IdleConnTimeout is the maximum period for which an idle HTTP keep-alive connection will remain open before closing itself.
	IdleConnTimeout interface{} `pulumi:"idleConnTimeout"`
	// PingTimeout is the timeout after which the HTTP/2 connection will be closed if a response to ping is not received.
	PingTimeout interface{} `pulumi:"pingTimeout"`
	// ReadIdleTimeout is the timeout after which a health check using ping frame will be carried out if no frame is received on the HTTP/2 connection.
	ReadIdleTimeout interface{} `pulumi:"readIdleTimeout"`
	// ResponseHeaderTimeout is the amount of time to wait for a server's response headers after fully writing the request (including its body, if any).
	ResponseHeaderTimeout interface{} `pulumi:"responseHeaderTimeout"`
}

// ServersTransportSpecForwardingTimeoutsInput is an input type that accepts ServersTransportSpecForwardingTimeoutsArgs and ServersTransportSpecForwardingTimeoutsOutput values.
// You can construct a concrete instance of `ServersTransportSpecForwardingTimeoutsInput` via:
//
//	ServersTransportSpecForwardingTimeoutsArgs{...}
type ServersTransportSpecForwardingTimeoutsInput interface {
	pulumi.Input

	ToServersTransportSpecForwardingTimeoutsOutput() ServersTransportSpecForwardingTimeoutsOutput
	ToServersTransportSpecForwardingTimeoutsOutputWithContext(context.Context) ServersTransportSpecForwardingTimeoutsOutput
}

// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
type ServersTransportSpecForwardingTimeoutsArgs struct {
	// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
	DialTimeout pulumi.Input `pulumi:"dialTimeout"`
	// IdleConnTimeout is the maximum period for which an idle HTTP keep-alive connection will remain open before closing itself.
	IdleConnTimeout pulumi.Input `pulumi:"idleConnTimeout"`
	// PingTimeout is the timeout after which the HTTP/2 connection will be closed if a response to ping is not received.
	PingTimeout pulumi.Input `pulumi:"pingTimeout"`
	// ReadIdleTimeout is the timeout after which a health check using ping frame will be carried out if no frame is received on the HTTP/2 connection.
	ReadIdleTimeout pulumi.Input `pulumi:"readIdleTimeout"`
	// ResponseHeaderTimeout is the amount of time to wait for a server's response headers after fully writing the request (including its body, if any).
	ResponseHeaderTimeout pulumi.Input `pulumi:"responseHeaderTimeout"`
}

func (ServersTransportSpecForwardingTimeoutsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportSpecForwardingTimeouts)(nil)).Elem()
}

func (i ServersTransportSpecForwardingTimeoutsArgs) ToServersTransportSpecForwardingTimeoutsOutput() ServersTransportSpecForwardingTimeoutsOutput {
	return i.ToServersTransportSpecForwardingTimeoutsOutputWithContext(context.Background())
}

func (i ServersTransportSpecForwardingTimeoutsArgs) ToServersTransportSpecForwardingTimeoutsOutputWithContext(ctx context.Context) ServersTransportSpecForwardingTimeoutsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecForwardingTimeoutsOutput)
}

func (i ServersTransportSpecForwardingTimeoutsArgs) ToOutput(ctx context.Context) pulumix.Output[ServersTransportSpecForwardingTimeouts] {
	return pulumix.Output[ServersTransportSpecForwardingTimeouts]{
		OutputState: i.ToServersTransportSpecForwardingTimeoutsOutputWithContext(ctx).OutputState,
	}
}

func (i ServersTransportSpecForwardingTimeoutsArgs) ToServersTransportSpecForwardingTimeoutsPtrOutput() ServersTransportSpecForwardingTimeoutsPtrOutput {
	return i.ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(context.Background())
}

func (i ServersTransportSpecForwardingTimeoutsArgs) ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(ctx context.Context) ServersTransportSpecForwardingTimeoutsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecForwardingTimeoutsOutput).ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(ctx)
}

// ServersTransportSpecForwardingTimeoutsPtrInput is an input type that accepts ServersTransportSpecForwardingTimeoutsArgs, ServersTransportSpecForwardingTimeoutsPtr and ServersTransportSpecForwardingTimeoutsPtrOutput values.
// You can construct a concrete instance of `ServersTransportSpecForwardingTimeoutsPtrInput` via:
//
//	        ServersTransportSpecForwardingTimeoutsArgs{...}
//
//	or:
//
//	        nil
type ServersTransportSpecForwardingTimeoutsPtrInput interface {
	pulumi.Input

	ToServersTransportSpecForwardingTimeoutsPtrOutput() ServersTransportSpecForwardingTimeoutsPtrOutput
	ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(context.Context) ServersTransportSpecForwardingTimeoutsPtrOutput
}

type serversTransportSpecForwardingTimeoutsPtrType ServersTransportSpecForwardingTimeoutsArgs

func ServersTransportSpecForwardingTimeoutsPtr(v *ServersTransportSpecForwardingTimeoutsArgs) ServersTransportSpecForwardingTimeoutsPtrInput {
	return (*serversTransportSpecForwardingTimeoutsPtrType)(v)
}

func (*serversTransportSpecForwardingTimeoutsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportSpecForwardingTimeouts)(nil)).Elem()
}

func (i *serversTransportSpecForwardingTimeoutsPtrType) ToServersTransportSpecForwardingTimeoutsPtrOutput() ServersTransportSpecForwardingTimeoutsPtrOutput {
	return i.ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(context.Background())
}

func (i *serversTransportSpecForwardingTimeoutsPtrType) ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(ctx context.Context) ServersTransportSpecForwardingTimeoutsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecForwardingTimeoutsPtrOutput)
}

func (i *serversTransportSpecForwardingTimeoutsPtrType) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportSpecForwardingTimeouts] {
	return pulumix.Output[*ServersTransportSpecForwardingTimeouts]{
		OutputState: i.ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(ctx).OutputState,
	}
}

// ForwardingTimeouts defines the timeouts for requests forwarded to the backend servers.
type ServersTransportSpecForwardingTimeoutsOutput struct{ *pulumi.OutputState }

func (ServersTransportSpecForwardingTimeoutsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportSpecForwardingTimeouts)(nil)).Elem()
}

func (o ServersTransportSpecForwardingTimeoutsOutput) ToServersTransportSpecForwardingTimeoutsOutput() ServersTransportSpecForwardingTimeoutsOutput {
	return o
}

func (o ServersTransportSpecForwardingTimeoutsOutput) ToServersTransportSpecForwardingTimeoutsOutputWithContext(ctx context.Context) ServersTransportSpecForwardingTimeoutsOutput {
	return o
}

func (o ServersTransportSpecForwardingTimeoutsOutput) ToServersTransportSpecForwardingTimeoutsPtrOutput() ServersTransportSpecForwardingTimeoutsPtrOutput {
	return o.ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(context.Background())
}

func (o ServersTransportSpecForwardingTimeoutsOutput) ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(ctx context.Context) ServersTransportSpecForwardingTimeoutsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v ServersTransportSpecForwardingTimeouts) *ServersTransportSpecForwardingTimeouts {
		return &v
	}).(ServersTransportSpecForwardingTimeoutsPtrOutput)
}

func (o ServersTransportSpecForwardingTimeoutsOutput) ToOutput(ctx context.Context) pulumix.Output[ServersTransportSpecForwardingTimeouts] {
	return pulumix.Output[ServersTransportSpecForwardingTimeouts]{
		OutputState: o.OutputState,
	}
}

// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
func (o ServersTransportSpecForwardingTimeoutsOutput) DialTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportSpecForwardingTimeouts) interface{} { return v.DialTimeout }).(pulumi.AnyOutput)
}

// IdleConnTimeout is the maximum period for which an idle HTTP keep-alive connection will remain open before closing itself.
func (o ServersTransportSpecForwardingTimeoutsOutput) IdleConnTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportSpecForwardingTimeouts) interface{} { return v.IdleConnTimeout }).(pulumi.AnyOutput)
}

// PingTimeout is the timeout after which the HTTP/2 connection will be closed if a response to ping is not received.
func (o ServersTransportSpecForwardingTimeoutsOutput) PingTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportSpecForwardingTimeouts) interface{} { return v.PingTimeout }).(pulumi.AnyOutput)
}

// ReadIdleTimeout is the timeout after which a health check using ping frame will be carried out if no frame is received on the HTTP/2 connection.
func (o ServersTransportSpecForwardingTimeoutsOutput) ReadIdleTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportSpecForwardingTimeouts) interface{} { return v.ReadIdleTimeout }).(pulumi.AnyOutput)
}

// ResponseHeaderTimeout is the amount of time to wait for a server's response headers after fully writing the request (including its body, if any).
func (o ServersTransportSpecForwardingTimeoutsOutput) ResponseHeaderTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportSpecForwardingTimeouts) interface{} { return v.ResponseHeaderTimeout }).(pulumi.AnyOutput)
}

type ServersTransportSpecForwardingTimeoutsPtrOutput struct{ *pulumi.OutputState }

func (ServersTransportSpecForwardingTimeoutsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportSpecForwardingTimeouts)(nil)).Elem()
}

func (o ServersTransportSpecForwardingTimeoutsPtrOutput) ToServersTransportSpecForwardingTimeoutsPtrOutput() ServersTransportSpecForwardingTimeoutsPtrOutput {
	return o
}

func (o ServersTransportSpecForwardingTimeoutsPtrOutput) ToServersTransportSpecForwardingTimeoutsPtrOutputWithContext(ctx context.Context) ServersTransportSpecForwardingTimeoutsPtrOutput {
	return o
}

func (o ServersTransportSpecForwardingTimeoutsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportSpecForwardingTimeouts] {
	return pulumix.Output[*ServersTransportSpecForwardingTimeouts]{
		OutputState: o.OutputState,
	}
}

func (o ServersTransportSpecForwardingTimeoutsPtrOutput) Elem() ServersTransportSpecForwardingTimeoutsOutput {
	return o.ApplyT(func(v *ServersTransportSpecForwardingTimeouts) ServersTransportSpecForwardingTimeouts {
		if v != nil {
			return *v
		}
		var ret ServersTransportSpecForwardingTimeouts
		return ret
	}).(ServersTransportSpecForwardingTimeoutsOutput)
}

// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
func (o ServersTransportSpecForwardingTimeoutsPtrOutput) DialTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportSpecForwardingTimeouts) interface{} {
		if v == nil {
			return nil
		}
		return v.DialTimeout
	}).(pulumi.AnyOutput)
}

// IdleConnTimeout is the maximum period for which an idle HTTP keep-alive connection will remain open before closing itself.
func (o ServersTransportSpecForwardingTimeoutsPtrOutput) IdleConnTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportSpecForwardingTimeouts) interface{} {
		if v == nil {
			return nil
		}
		return v.IdleConnTimeout
	}).(pulumi.AnyOutput)
}

// PingTimeout is the timeout after which the HTTP/2 connection will be closed if a response to ping is not received.
func (o ServersTransportSpecForwardingTimeoutsPtrOutput) PingTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportSpecForwardingTimeouts) interface{} {
		if v == nil {
			return nil
		}
		return v.PingTimeout
	}).(pulumi.AnyOutput)
}

// ReadIdleTimeout is the timeout after which a health check using ping frame will be carried out if no frame is received on the HTTP/2 connection.
func (o ServersTransportSpecForwardingTimeoutsPtrOutput) ReadIdleTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportSpecForwardingTimeouts) interface{} {
		if v == nil {
			return nil
		}
		return v.ReadIdleTimeout
	}).(pulumi.AnyOutput)
}

// ResponseHeaderTimeout is the amount of time to wait for a server's response headers after fully writing the request (including its body, if any).
func (o ServersTransportSpecForwardingTimeoutsPtrOutput) ResponseHeaderTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportSpecForwardingTimeouts) interface{} {
		if v == nil {
			return nil
		}
		return v.ResponseHeaderTimeout
	}).(pulumi.AnyOutput)
}

// Spiffe defines the SPIFFE configuration.
type ServersTransportSpecSpiffe struct {
	// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
	Ids []string `pulumi:"ids"`
	// TrustDomain defines the allowed SPIFFE trust domain.
	TrustDomain *string `pulumi:"trustDomain"`
}

// ServersTransportSpecSpiffeInput is an input type that accepts ServersTransportSpecSpiffeArgs and ServersTransportSpecSpiffeOutput values.
// You can construct a concrete instance of `ServersTransportSpecSpiffeInput` via:
//
//	ServersTransportSpecSpiffeArgs{...}
type ServersTransportSpecSpiffeInput interface {
	pulumi.Input

	ToServersTransportSpecSpiffeOutput() ServersTransportSpecSpiffeOutput
	ToServersTransportSpecSpiffeOutputWithContext(context.Context) ServersTransportSpecSpiffeOutput
}

// Spiffe defines the SPIFFE configuration.
type ServersTransportSpecSpiffeArgs struct {
	// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
	Ids pulumi.StringArrayInput `pulumi:"ids"`
	// TrustDomain defines the allowed SPIFFE trust domain.
	TrustDomain pulumi.StringPtrInput `pulumi:"trustDomain"`
}

func (ServersTransportSpecSpiffeArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportSpecSpiffe)(nil)).Elem()
}

func (i ServersTransportSpecSpiffeArgs) ToServersTransportSpecSpiffeOutput() ServersTransportSpecSpiffeOutput {
	return i.ToServersTransportSpecSpiffeOutputWithContext(context.Background())
}

func (i ServersTransportSpecSpiffeArgs) ToServersTransportSpecSpiffeOutputWithContext(ctx context.Context) ServersTransportSpecSpiffeOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecSpiffeOutput)
}

func (i ServersTransportSpecSpiffeArgs) ToOutput(ctx context.Context) pulumix.Output[ServersTransportSpecSpiffe] {
	return pulumix.Output[ServersTransportSpecSpiffe]{
		OutputState: i.ToServersTransportSpecSpiffeOutputWithContext(ctx).OutputState,
	}
}

func (i ServersTransportSpecSpiffeArgs) ToServersTransportSpecSpiffePtrOutput() ServersTransportSpecSpiffePtrOutput {
	return i.ToServersTransportSpecSpiffePtrOutputWithContext(context.Background())
}

func (i ServersTransportSpecSpiffeArgs) ToServersTransportSpecSpiffePtrOutputWithContext(ctx context.Context) ServersTransportSpecSpiffePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecSpiffeOutput).ToServersTransportSpecSpiffePtrOutputWithContext(ctx)
}

// ServersTransportSpecSpiffePtrInput is an input type that accepts ServersTransportSpecSpiffeArgs, ServersTransportSpecSpiffePtr and ServersTransportSpecSpiffePtrOutput values.
// You can construct a concrete instance of `ServersTransportSpecSpiffePtrInput` via:
//
//	        ServersTransportSpecSpiffeArgs{...}
//
//	or:
//
//	        nil
type ServersTransportSpecSpiffePtrInput interface {
	pulumi.Input

	ToServersTransportSpecSpiffePtrOutput() ServersTransportSpecSpiffePtrOutput
	ToServersTransportSpecSpiffePtrOutputWithContext(context.Context) ServersTransportSpecSpiffePtrOutput
}

type serversTransportSpecSpiffePtrType ServersTransportSpecSpiffeArgs

func ServersTransportSpecSpiffePtr(v *ServersTransportSpecSpiffeArgs) ServersTransportSpecSpiffePtrInput {
	return (*serversTransportSpecSpiffePtrType)(v)
}

func (*serversTransportSpecSpiffePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportSpecSpiffe)(nil)).Elem()
}

func (i *serversTransportSpecSpiffePtrType) ToServersTransportSpecSpiffePtrOutput() ServersTransportSpecSpiffePtrOutput {
	return i.ToServersTransportSpecSpiffePtrOutputWithContext(context.Background())
}

func (i *serversTransportSpecSpiffePtrType) ToServersTransportSpecSpiffePtrOutputWithContext(ctx context.Context) ServersTransportSpecSpiffePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportSpecSpiffePtrOutput)
}

func (i *serversTransportSpecSpiffePtrType) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportSpecSpiffe] {
	return pulumix.Output[*ServersTransportSpecSpiffe]{
		OutputState: i.ToServersTransportSpecSpiffePtrOutputWithContext(ctx).OutputState,
	}
}

// Spiffe defines the SPIFFE configuration.
type ServersTransportSpecSpiffeOutput struct{ *pulumi.OutputState }

func (ServersTransportSpecSpiffeOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportSpecSpiffe)(nil)).Elem()
}

func (o ServersTransportSpecSpiffeOutput) ToServersTransportSpecSpiffeOutput() ServersTransportSpecSpiffeOutput {
	return o
}

func (o ServersTransportSpecSpiffeOutput) ToServersTransportSpecSpiffeOutputWithContext(ctx context.Context) ServersTransportSpecSpiffeOutput {
	return o
}

func (o ServersTransportSpecSpiffeOutput) ToServersTransportSpecSpiffePtrOutput() ServersTransportSpecSpiffePtrOutput {
	return o.ToServersTransportSpecSpiffePtrOutputWithContext(context.Background())
}

func (o ServersTransportSpecSpiffeOutput) ToServersTransportSpecSpiffePtrOutputWithContext(ctx context.Context) ServersTransportSpecSpiffePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v ServersTransportSpecSpiffe) *ServersTransportSpecSpiffe {
		return &v
	}).(ServersTransportSpecSpiffePtrOutput)
}

func (o ServersTransportSpecSpiffeOutput) ToOutput(ctx context.Context) pulumix.Output[ServersTransportSpecSpiffe] {
	return pulumix.Output[ServersTransportSpecSpiffe]{
		OutputState: o.OutputState,
	}
}

// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
func (o ServersTransportSpecSpiffeOutput) Ids() pulumi.StringArrayOutput {
	return o.ApplyT(func(v ServersTransportSpecSpiffe) []string { return v.Ids }).(pulumi.StringArrayOutput)
}

// TrustDomain defines the allowed SPIFFE trust domain.
func (o ServersTransportSpecSpiffeOutput) TrustDomain() pulumi.StringPtrOutput {
	return o.ApplyT(func(v ServersTransportSpecSpiffe) *string { return v.TrustDomain }).(pulumi.StringPtrOutput)
}

type ServersTransportSpecSpiffePtrOutput struct{ *pulumi.OutputState }

func (ServersTransportSpecSpiffePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportSpecSpiffe)(nil)).Elem()
}

func (o ServersTransportSpecSpiffePtrOutput) ToServersTransportSpecSpiffePtrOutput() ServersTransportSpecSpiffePtrOutput {
	return o
}

func (o ServersTransportSpecSpiffePtrOutput) ToServersTransportSpecSpiffePtrOutputWithContext(ctx context.Context) ServersTransportSpecSpiffePtrOutput {
	return o
}

func (o ServersTransportSpecSpiffePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportSpecSpiffe] {
	return pulumix.Output[*ServersTransportSpecSpiffe]{
		OutputState: o.OutputState,
	}
}

func (o ServersTransportSpecSpiffePtrOutput) Elem() ServersTransportSpecSpiffeOutput {
	return o.ApplyT(func(v *ServersTransportSpecSpiffe) ServersTransportSpecSpiffe {
		if v != nil {
			return *v
		}
		var ret ServersTransportSpecSpiffe
		return ret
	}).(ServersTransportSpecSpiffeOutput)
}

// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
func (o ServersTransportSpecSpiffePtrOutput) Ids() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *ServersTransportSpecSpiffe) []string {
		if v == nil {
			return nil
		}
		return v.Ids
	}).(pulumi.StringArrayOutput)
}

// TrustDomain defines the allowed SPIFFE trust domain.
func (o ServersTransportSpecSpiffePtrOutput) TrustDomain() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *ServersTransportSpecSpiffe) *string {
		if v == nil {
			return nil
		}
		return v.TrustDomain
	}).(pulumi.StringPtrOutput)
}

// ServersTransportTCP is the CRD implementation of a TCPServersTransport.
// If no tcpServersTransport is specified, a default one named default@internal will be used.
// The default@internal tcpServersTransport can be configured in the static configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#serverstransport_3
type ServersTransportTCPType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// ServersTransportTCPSpec defines the desired state of a ServersTransportTCP.
	Spec ServersTransportTCPSpec `pulumi:"spec"`
}

type ServersTransportTCPMetadata struct {
}

// ServersTransportTCPSpec defines the desired state of a ServersTransportTCP.
type ServersTransportTCPSpec struct {
	// DialKeepAlive is the interval between keep-alive probes for an active network connection. If zero, keep-alive probes are sent with a default value (currently 15 seconds), if supported by the protocol and operating system. Network protocols or operating systems that do not support keep-alives ignore this field. If negative, keep-alive probes are disabled.
	DialKeepAlive interface{} `pulumi:"dialKeepAlive"`
	// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
	DialTimeout interface{} `pulumi:"dialTimeout"`
	// TerminationDelay defines the delay to wait before fully terminating the connection, after one connected peer has closed its writing capability.
	TerminationDelay interface{} `pulumi:"terminationDelay"`
	// TLS defines the TLS configuration
	Tls *ServersTransportTCPSpecTls `pulumi:"tls"`
}

// ServersTransportTCPSpecInput is an input type that accepts ServersTransportTCPSpecArgs and ServersTransportTCPSpecOutput values.
// You can construct a concrete instance of `ServersTransportTCPSpecInput` via:
//
//	ServersTransportTCPSpecArgs{...}
type ServersTransportTCPSpecInput interface {
	pulumi.Input

	ToServersTransportTCPSpecOutput() ServersTransportTCPSpecOutput
	ToServersTransportTCPSpecOutputWithContext(context.Context) ServersTransportTCPSpecOutput
}

// ServersTransportTCPSpec defines the desired state of a ServersTransportTCP.
type ServersTransportTCPSpecArgs struct {
	// DialKeepAlive is the interval between keep-alive probes for an active network connection. If zero, keep-alive probes are sent with a default value (currently 15 seconds), if supported by the protocol and operating system. Network protocols or operating systems that do not support keep-alives ignore this field. If negative, keep-alive probes are disabled.
	DialKeepAlive pulumi.Input `pulumi:"dialKeepAlive"`
	// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
	DialTimeout pulumi.Input `pulumi:"dialTimeout"`
	// TerminationDelay defines the delay to wait before fully terminating the connection, after one connected peer has closed its writing capability.
	TerminationDelay pulumi.Input `pulumi:"terminationDelay"`
	// TLS defines the TLS configuration
	Tls ServersTransportTCPSpecTlsPtrInput `pulumi:"tls"`
}

func (ServersTransportTCPSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportTCPSpec)(nil)).Elem()
}

func (i ServersTransportTCPSpecArgs) ToServersTransportTCPSpecOutput() ServersTransportTCPSpecOutput {
	return i.ToServersTransportTCPSpecOutputWithContext(context.Background())
}

func (i ServersTransportTCPSpecArgs) ToServersTransportTCPSpecOutputWithContext(ctx context.Context) ServersTransportTCPSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecOutput)
}

func (i ServersTransportTCPSpecArgs) ToOutput(ctx context.Context) pulumix.Output[ServersTransportTCPSpec] {
	return pulumix.Output[ServersTransportTCPSpec]{
		OutputState: i.ToServersTransportTCPSpecOutputWithContext(ctx).OutputState,
	}
}

func (i ServersTransportTCPSpecArgs) ToServersTransportTCPSpecPtrOutput() ServersTransportTCPSpecPtrOutput {
	return i.ToServersTransportTCPSpecPtrOutputWithContext(context.Background())
}

func (i ServersTransportTCPSpecArgs) ToServersTransportTCPSpecPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecOutput).ToServersTransportTCPSpecPtrOutputWithContext(ctx)
}

// ServersTransportTCPSpecPtrInput is an input type that accepts ServersTransportTCPSpecArgs, ServersTransportTCPSpecPtr and ServersTransportTCPSpecPtrOutput values.
// You can construct a concrete instance of `ServersTransportTCPSpecPtrInput` via:
//
//	        ServersTransportTCPSpecArgs{...}
//
//	or:
//
//	        nil
type ServersTransportTCPSpecPtrInput interface {
	pulumi.Input

	ToServersTransportTCPSpecPtrOutput() ServersTransportTCPSpecPtrOutput
	ToServersTransportTCPSpecPtrOutputWithContext(context.Context) ServersTransportTCPSpecPtrOutput
}

type serversTransportTCPSpecPtrType ServersTransportTCPSpecArgs

func ServersTransportTCPSpecPtr(v *ServersTransportTCPSpecArgs) ServersTransportTCPSpecPtrInput {
	return (*serversTransportTCPSpecPtrType)(v)
}

func (*serversTransportTCPSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportTCPSpec)(nil)).Elem()
}

func (i *serversTransportTCPSpecPtrType) ToServersTransportTCPSpecPtrOutput() ServersTransportTCPSpecPtrOutput {
	return i.ToServersTransportTCPSpecPtrOutputWithContext(context.Background())
}

func (i *serversTransportTCPSpecPtrType) ToServersTransportTCPSpecPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecPtrOutput)
}

func (i *serversTransportTCPSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportTCPSpec] {
	return pulumix.Output[*ServersTransportTCPSpec]{
		OutputState: i.ToServersTransportTCPSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// ServersTransportTCPSpec defines the desired state of a ServersTransportTCP.
type ServersTransportTCPSpecOutput struct{ *pulumi.OutputState }

func (ServersTransportTCPSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportTCPSpec)(nil)).Elem()
}

func (o ServersTransportTCPSpecOutput) ToServersTransportTCPSpecOutput() ServersTransportTCPSpecOutput {
	return o
}

func (o ServersTransportTCPSpecOutput) ToServersTransportTCPSpecOutputWithContext(ctx context.Context) ServersTransportTCPSpecOutput {
	return o
}

func (o ServersTransportTCPSpecOutput) ToServersTransportTCPSpecPtrOutput() ServersTransportTCPSpecPtrOutput {
	return o.ToServersTransportTCPSpecPtrOutputWithContext(context.Background())
}

func (o ServersTransportTCPSpecOutput) ToServersTransportTCPSpecPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v ServersTransportTCPSpec) *ServersTransportTCPSpec {
		return &v
	}).(ServersTransportTCPSpecPtrOutput)
}

func (o ServersTransportTCPSpecOutput) ToOutput(ctx context.Context) pulumix.Output[ServersTransportTCPSpec] {
	return pulumix.Output[ServersTransportTCPSpec]{
		OutputState: o.OutputState,
	}
}

// DialKeepAlive is the interval between keep-alive probes for an active network connection. If zero, keep-alive probes are sent with a default value (currently 15 seconds), if supported by the protocol and operating system. Network protocols or operating systems that do not support keep-alives ignore this field. If negative, keep-alive probes are disabled.
func (o ServersTransportTCPSpecOutput) DialKeepAlive() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportTCPSpec) interface{} { return v.DialKeepAlive }).(pulumi.AnyOutput)
}

// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
func (o ServersTransportTCPSpecOutput) DialTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportTCPSpec) interface{} { return v.DialTimeout }).(pulumi.AnyOutput)
}

// TerminationDelay defines the delay to wait before fully terminating the connection, after one connected peer has closed its writing capability.
func (o ServersTransportTCPSpecOutput) TerminationDelay() pulumi.AnyOutput {
	return o.ApplyT(func(v ServersTransportTCPSpec) interface{} { return v.TerminationDelay }).(pulumi.AnyOutput)
}

// TLS defines the TLS configuration
func (o ServersTransportTCPSpecOutput) Tls() ServersTransportTCPSpecTlsPtrOutput {
	return o.ApplyT(func(v ServersTransportTCPSpec) *ServersTransportTCPSpecTls { return v.Tls }).(ServersTransportTCPSpecTlsPtrOutput)
}

type ServersTransportTCPSpecPtrOutput struct{ *pulumi.OutputState }

func (ServersTransportTCPSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportTCPSpec)(nil)).Elem()
}

func (o ServersTransportTCPSpecPtrOutput) ToServersTransportTCPSpecPtrOutput() ServersTransportTCPSpecPtrOutput {
	return o
}

func (o ServersTransportTCPSpecPtrOutput) ToServersTransportTCPSpecPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecPtrOutput {
	return o
}

func (o ServersTransportTCPSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportTCPSpec] {
	return pulumix.Output[*ServersTransportTCPSpec]{
		OutputState: o.OutputState,
	}
}

func (o ServersTransportTCPSpecPtrOutput) Elem() ServersTransportTCPSpecOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpec) ServersTransportTCPSpec {
		if v != nil {
			return *v
		}
		var ret ServersTransportTCPSpec
		return ret
	}).(ServersTransportTCPSpecOutput)
}

// DialKeepAlive is the interval between keep-alive probes for an active network connection. If zero, keep-alive probes are sent with a default value (currently 15 seconds), if supported by the protocol and operating system. Network protocols or operating systems that do not support keep-alives ignore this field. If negative, keep-alive probes are disabled.
func (o ServersTransportTCPSpecPtrOutput) DialKeepAlive() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpec) interface{} {
		if v == nil {
			return nil
		}
		return v.DialKeepAlive
	}).(pulumi.AnyOutput)
}

// DialTimeout is the amount of time to wait until a connection to a backend server can be established.
func (o ServersTransportTCPSpecPtrOutput) DialTimeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpec) interface{} {
		if v == nil {
			return nil
		}
		return v.DialTimeout
	}).(pulumi.AnyOutput)
}

// TerminationDelay defines the delay to wait before fully terminating the connection, after one connected peer has closed its writing capability.
func (o ServersTransportTCPSpecPtrOutput) TerminationDelay() pulumi.AnyOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpec) interface{} {
		if v == nil {
			return nil
		}
		return v.TerminationDelay
	}).(pulumi.AnyOutput)
}

// TLS defines the TLS configuration
func (o ServersTransportTCPSpecPtrOutput) Tls() ServersTransportTCPSpecTlsPtrOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpec) *ServersTransportTCPSpecTls {
		if v == nil {
			return nil
		}
		return v.Tls
	}).(ServersTransportTCPSpecTlsPtrOutput)
}

// TLS defines the TLS configuration
type ServersTransportTCPSpecTls struct {
	// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
	CertificatesSecrets []string `pulumi:"certificatesSecrets"`
	// InsecureSkipVerify disables TLS certificate verification.
	InsecureSkipVerify *bool `pulumi:"insecureSkipVerify"`
	// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
	// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
	PeerCertURI *string `pulumi:"peerCertURI"`
	// RootCAsSecrets defines a list of CA secret used to validate self-signed certificates.
	RootCAsSecrets []string `pulumi:"rootCAsSecrets"`
	// ServerName defines the server name used to contact the server.
	ServerName *string `pulumi:"serverName"`
	// Spiffe defines the SPIFFE configuration.
	Spiffe *ServersTransportTCPSpecTlsSpiffe `pulumi:"spiffe"`
}

// ServersTransportTCPSpecTlsInput is an input type that accepts ServersTransportTCPSpecTlsArgs and ServersTransportTCPSpecTlsOutput values.
// You can construct a concrete instance of `ServersTransportTCPSpecTlsInput` via:
//
//	ServersTransportTCPSpecTlsArgs{...}
type ServersTransportTCPSpecTlsInput interface {
	pulumi.Input

	ToServersTransportTCPSpecTlsOutput() ServersTransportTCPSpecTlsOutput
	ToServersTransportTCPSpecTlsOutputWithContext(context.Context) ServersTransportTCPSpecTlsOutput
}

// TLS defines the TLS configuration
type ServersTransportTCPSpecTlsArgs struct {
	// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
	CertificatesSecrets pulumi.StringArrayInput `pulumi:"certificatesSecrets"`
	// InsecureSkipVerify disables TLS certificate verification.
	InsecureSkipVerify pulumi.BoolPtrInput `pulumi:"insecureSkipVerify"`
	// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
	// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
	PeerCertURI pulumi.StringPtrInput `pulumi:"peerCertURI"`
	// RootCAsSecrets defines a list of CA secret used to validate self-signed certificates.
	RootCAsSecrets pulumi.StringArrayInput `pulumi:"rootCAsSecrets"`
	// ServerName defines the server name used to contact the server.
	ServerName pulumi.StringPtrInput `pulumi:"serverName"`
	// Spiffe defines the SPIFFE configuration.
	Spiffe ServersTransportTCPSpecTlsSpiffePtrInput `pulumi:"spiffe"`
}

func (ServersTransportTCPSpecTlsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportTCPSpecTls)(nil)).Elem()
}

func (i ServersTransportTCPSpecTlsArgs) ToServersTransportTCPSpecTlsOutput() ServersTransportTCPSpecTlsOutput {
	return i.ToServersTransportTCPSpecTlsOutputWithContext(context.Background())
}

func (i ServersTransportTCPSpecTlsArgs) ToServersTransportTCPSpecTlsOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecTlsOutput)
}

func (i ServersTransportTCPSpecTlsArgs) ToOutput(ctx context.Context) pulumix.Output[ServersTransportTCPSpecTls] {
	return pulumix.Output[ServersTransportTCPSpecTls]{
		OutputState: i.ToServersTransportTCPSpecTlsOutputWithContext(ctx).OutputState,
	}
}

func (i ServersTransportTCPSpecTlsArgs) ToServersTransportTCPSpecTlsPtrOutput() ServersTransportTCPSpecTlsPtrOutput {
	return i.ToServersTransportTCPSpecTlsPtrOutputWithContext(context.Background())
}

func (i ServersTransportTCPSpecTlsArgs) ToServersTransportTCPSpecTlsPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecTlsOutput).ToServersTransportTCPSpecTlsPtrOutputWithContext(ctx)
}

// ServersTransportTCPSpecTlsPtrInput is an input type that accepts ServersTransportTCPSpecTlsArgs, ServersTransportTCPSpecTlsPtr and ServersTransportTCPSpecTlsPtrOutput values.
// You can construct a concrete instance of `ServersTransportTCPSpecTlsPtrInput` via:
//
//	        ServersTransportTCPSpecTlsArgs{...}
//
//	or:
//
//	        nil
type ServersTransportTCPSpecTlsPtrInput interface {
	pulumi.Input

	ToServersTransportTCPSpecTlsPtrOutput() ServersTransportTCPSpecTlsPtrOutput
	ToServersTransportTCPSpecTlsPtrOutputWithContext(context.Context) ServersTransportTCPSpecTlsPtrOutput
}

type serversTransportTCPSpecTlsPtrType ServersTransportTCPSpecTlsArgs

func ServersTransportTCPSpecTlsPtr(v *ServersTransportTCPSpecTlsArgs) ServersTransportTCPSpecTlsPtrInput {
	return (*serversTransportTCPSpecTlsPtrType)(v)
}

func (*serversTransportTCPSpecTlsPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportTCPSpecTls)(nil)).Elem()
}

func (i *serversTransportTCPSpecTlsPtrType) ToServersTransportTCPSpecTlsPtrOutput() ServersTransportTCPSpecTlsPtrOutput {
	return i.ToServersTransportTCPSpecTlsPtrOutputWithContext(context.Background())
}

func (i *serversTransportTCPSpecTlsPtrType) ToServersTransportTCPSpecTlsPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecTlsPtrOutput)
}

func (i *serversTransportTCPSpecTlsPtrType) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportTCPSpecTls] {
	return pulumix.Output[*ServersTransportTCPSpecTls]{
		OutputState: i.ToServersTransportTCPSpecTlsPtrOutputWithContext(ctx).OutputState,
	}
}

// TLS defines the TLS configuration
type ServersTransportTCPSpecTlsOutput struct{ *pulumi.OutputState }

func (ServersTransportTCPSpecTlsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportTCPSpecTls)(nil)).Elem()
}

func (o ServersTransportTCPSpecTlsOutput) ToServersTransportTCPSpecTlsOutput() ServersTransportTCPSpecTlsOutput {
	return o
}

func (o ServersTransportTCPSpecTlsOutput) ToServersTransportTCPSpecTlsOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsOutput {
	return o
}

func (o ServersTransportTCPSpecTlsOutput) ToServersTransportTCPSpecTlsPtrOutput() ServersTransportTCPSpecTlsPtrOutput {
	return o.ToServersTransportTCPSpecTlsPtrOutputWithContext(context.Background())
}

func (o ServersTransportTCPSpecTlsOutput) ToServersTransportTCPSpecTlsPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v ServersTransportTCPSpecTls) *ServersTransportTCPSpecTls {
		return &v
	}).(ServersTransportTCPSpecTlsPtrOutput)
}

func (o ServersTransportTCPSpecTlsOutput) ToOutput(ctx context.Context) pulumix.Output[ServersTransportTCPSpecTls] {
	return pulumix.Output[ServersTransportTCPSpecTls]{
		OutputState: o.OutputState,
	}
}

// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
func (o ServersTransportTCPSpecTlsOutput) CertificatesSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTls) []string { return v.CertificatesSecrets }).(pulumi.StringArrayOutput)
}

// InsecureSkipVerify disables TLS certificate verification.
func (o ServersTransportTCPSpecTlsOutput) InsecureSkipVerify() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTls) *bool { return v.InsecureSkipVerify }).(pulumi.BoolPtrOutput)
}

// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
func (o ServersTransportTCPSpecTlsOutput) PeerCertURI() pulumi.StringPtrOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTls) *string { return v.PeerCertURI }).(pulumi.StringPtrOutput)
}

// RootCAsSecrets defines a list of CA secret used to validate self-signed certificates.
func (o ServersTransportTCPSpecTlsOutput) RootCAsSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTls) []string { return v.RootCAsSecrets }).(pulumi.StringArrayOutput)
}

// ServerName defines the server name used to contact the server.
func (o ServersTransportTCPSpecTlsOutput) ServerName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTls) *string { return v.ServerName }).(pulumi.StringPtrOutput)
}

// Spiffe defines the SPIFFE configuration.
func (o ServersTransportTCPSpecTlsOutput) Spiffe() ServersTransportTCPSpecTlsSpiffePtrOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTls) *ServersTransportTCPSpecTlsSpiffe { return v.Spiffe }).(ServersTransportTCPSpecTlsSpiffePtrOutput)
}

type ServersTransportTCPSpecTlsPtrOutput struct{ *pulumi.OutputState }

func (ServersTransportTCPSpecTlsPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportTCPSpecTls)(nil)).Elem()
}

func (o ServersTransportTCPSpecTlsPtrOutput) ToServersTransportTCPSpecTlsPtrOutput() ServersTransportTCPSpecTlsPtrOutput {
	return o
}

func (o ServersTransportTCPSpecTlsPtrOutput) ToServersTransportTCPSpecTlsPtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsPtrOutput {
	return o
}

func (o ServersTransportTCPSpecTlsPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportTCPSpecTls] {
	return pulumix.Output[*ServersTransportTCPSpecTls]{
		OutputState: o.OutputState,
	}
}

func (o ServersTransportTCPSpecTlsPtrOutput) Elem() ServersTransportTCPSpecTlsOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) ServersTransportTCPSpecTls {
		if v != nil {
			return *v
		}
		var ret ServersTransportTCPSpecTls
		return ret
	}).(ServersTransportTCPSpecTlsOutput)
}

// CertificatesSecrets defines a list of secret storing client certificates for mTLS.
func (o ServersTransportTCPSpecTlsPtrOutput) CertificatesSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) []string {
		if v == nil {
			return nil
		}
		return v.CertificatesSecrets
	}).(pulumi.StringArrayOutput)
}

// InsecureSkipVerify disables TLS certificate verification.
func (o ServersTransportTCPSpecTlsPtrOutput) InsecureSkipVerify() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) *bool {
		if v == nil {
			return nil
		}
		return v.InsecureSkipVerify
	}).(pulumi.BoolPtrOutput)
}

// MaxIdleConnsPerHost controls the maximum idle (keep-alive) to keep per-host.
// PeerCertURI defines the peer cert URI used to match against SAN URI during the peer certificate verification.
func (o ServersTransportTCPSpecTlsPtrOutput) PeerCertURI() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) *string {
		if v == nil {
			return nil
		}
		return v.PeerCertURI
	}).(pulumi.StringPtrOutput)
}

// RootCAsSecrets defines a list of CA secret used to validate self-signed certificates.
func (o ServersTransportTCPSpecTlsPtrOutput) RootCAsSecrets() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) []string {
		if v == nil {
			return nil
		}
		return v.RootCAsSecrets
	}).(pulumi.StringArrayOutput)
}

// ServerName defines the server name used to contact the server.
func (o ServersTransportTCPSpecTlsPtrOutput) ServerName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) *string {
		if v == nil {
			return nil
		}
		return v.ServerName
	}).(pulumi.StringPtrOutput)
}

// Spiffe defines the SPIFFE configuration.
func (o ServersTransportTCPSpecTlsPtrOutput) Spiffe() ServersTransportTCPSpecTlsSpiffePtrOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTls) *ServersTransportTCPSpecTlsSpiffe {
		if v == nil {
			return nil
		}
		return v.Spiffe
	}).(ServersTransportTCPSpecTlsSpiffePtrOutput)
}

// Spiffe defines the SPIFFE configuration.
type ServersTransportTCPSpecTlsSpiffe struct {
	// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
	Ids []string `pulumi:"ids"`
	// TrustDomain defines the allowed SPIFFE trust domain.
	TrustDomain *string `pulumi:"trustDomain"`
}

// ServersTransportTCPSpecTlsSpiffeInput is an input type that accepts ServersTransportTCPSpecTlsSpiffeArgs and ServersTransportTCPSpecTlsSpiffeOutput values.
// You can construct a concrete instance of `ServersTransportTCPSpecTlsSpiffeInput` via:
//
//	ServersTransportTCPSpecTlsSpiffeArgs{...}
type ServersTransportTCPSpecTlsSpiffeInput interface {
	pulumi.Input

	ToServersTransportTCPSpecTlsSpiffeOutput() ServersTransportTCPSpecTlsSpiffeOutput
	ToServersTransportTCPSpecTlsSpiffeOutputWithContext(context.Context) ServersTransportTCPSpecTlsSpiffeOutput
}

// Spiffe defines the SPIFFE configuration.
type ServersTransportTCPSpecTlsSpiffeArgs struct {
	// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
	Ids pulumi.StringArrayInput `pulumi:"ids"`
	// TrustDomain defines the allowed SPIFFE trust domain.
	TrustDomain pulumi.StringPtrInput `pulumi:"trustDomain"`
}

func (ServersTransportTCPSpecTlsSpiffeArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportTCPSpecTlsSpiffe)(nil)).Elem()
}

func (i ServersTransportTCPSpecTlsSpiffeArgs) ToServersTransportTCPSpecTlsSpiffeOutput() ServersTransportTCPSpecTlsSpiffeOutput {
	return i.ToServersTransportTCPSpecTlsSpiffeOutputWithContext(context.Background())
}

func (i ServersTransportTCPSpecTlsSpiffeArgs) ToServersTransportTCPSpecTlsSpiffeOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsSpiffeOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecTlsSpiffeOutput)
}

func (i ServersTransportTCPSpecTlsSpiffeArgs) ToOutput(ctx context.Context) pulumix.Output[ServersTransportTCPSpecTlsSpiffe] {
	return pulumix.Output[ServersTransportTCPSpecTlsSpiffe]{
		OutputState: i.ToServersTransportTCPSpecTlsSpiffeOutputWithContext(ctx).OutputState,
	}
}

func (i ServersTransportTCPSpecTlsSpiffeArgs) ToServersTransportTCPSpecTlsSpiffePtrOutput() ServersTransportTCPSpecTlsSpiffePtrOutput {
	return i.ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(context.Background())
}

func (i ServersTransportTCPSpecTlsSpiffeArgs) ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsSpiffePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecTlsSpiffeOutput).ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(ctx)
}

// ServersTransportTCPSpecTlsSpiffePtrInput is an input type that accepts ServersTransportTCPSpecTlsSpiffeArgs, ServersTransportTCPSpecTlsSpiffePtr and ServersTransportTCPSpecTlsSpiffePtrOutput values.
// You can construct a concrete instance of `ServersTransportTCPSpecTlsSpiffePtrInput` via:
//
//	        ServersTransportTCPSpecTlsSpiffeArgs{...}
//
//	or:
//
//	        nil
type ServersTransportTCPSpecTlsSpiffePtrInput interface {
	pulumi.Input

	ToServersTransportTCPSpecTlsSpiffePtrOutput() ServersTransportTCPSpecTlsSpiffePtrOutput
	ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(context.Context) ServersTransportTCPSpecTlsSpiffePtrOutput
}

type serversTransportTCPSpecTlsSpiffePtrType ServersTransportTCPSpecTlsSpiffeArgs

func ServersTransportTCPSpecTlsSpiffePtr(v *ServersTransportTCPSpecTlsSpiffeArgs) ServersTransportTCPSpecTlsSpiffePtrInput {
	return (*serversTransportTCPSpecTlsSpiffePtrType)(v)
}

func (*serversTransportTCPSpecTlsSpiffePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportTCPSpecTlsSpiffe)(nil)).Elem()
}

func (i *serversTransportTCPSpecTlsSpiffePtrType) ToServersTransportTCPSpecTlsSpiffePtrOutput() ServersTransportTCPSpecTlsSpiffePtrOutput {
	return i.ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(context.Background())
}

func (i *serversTransportTCPSpecTlsSpiffePtrType) ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsSpiffePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ServersTransportTCPSpecTlsSpiffePtrOutput)
}

func (i *serversTransportTCPSpecTlsSpiffePtrType) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportTCPSpecTlsSpiffe] {
	return pulumix.Output[*ServersTransportTCPSpecTlsSpiffe]{
		OutputState: i.ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(ctx).OutputState,
	}
}

// Spiffe defines the SPIFFE configuration.
type ServersTransportTCPSpecTlsSpiffeOutput struct{ *pulumi.OutputState }

func (ServersTransportTCPSpecTlsSpiffeOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*ServersTransportTCPSpecTlsSpiffe)(nil)).Elem()
}

func (o ServersTransportTCPSpecTlsSpiffeOutput) ToServersTransportTCPSpecTlsSpiffeOutput() ServersTransportTCPSpecTlsSpiffeOutput {
	return o
}

func (o ServersTransportTCPSpecTlsSpiffeOutput) ToServersTransportTCPSpecTlsSpiffeOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsSpiffeOutput {
	return o
}

func (o ServersTransportTCPSpecTlsSpiffeOutput) ToServersTransportTCPSpecTlsSpiffePtrOutput() ServersTransportTCPSpecTlsSpiffePtrOutput {
	return o.ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(context.Background())
}

func (o ServersTransportTCPSpecTlsSpiffeOutput) ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsSpiffePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v ServersTransportTCPSpecTlsSpiffe) *ServersTransportTCPSpecTlsSpiffe {
		return &v
	}).(ServersTransportTCPSpecTlsSpiffePtrOutput)
}

func (o ServersTransportTCPSpecTlsSpiffeOutput) ToOutput(ctx context.Context) pulumix.Output[ServersTransportTCPSpecTlsSpiffe] {
	return pulumix.Output[ServersTransportTCPSpecTlsSpiffe]{
		OutputState: o.OutputState,
	}
}

// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
func (o ServersTransportTCPSpecTlsSpiffeOutput) Ids() pulumi.StringArrayOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTlsSpiffe) []string { return v.Ids }).(pulumi.StringArrayOutput)
}

// TrustDomain defines the allowed SPIFFE trust domain.
func (o ServersTransportTCPSpecTlsSpiffeOutput) TrustDomain() pulumi.StringPtrOutput {
	return o.ApplyT(func(v ServersTransportTCPSpecTlsSpiffe) *string { return v.TrustDomain }).(pulumi.StringPtrOutput)
}

type ServersTransportTCPSpecTlsSpiffePtrOutput struct{ *pulumi.OutputState }

func (ServersTransportTCPSpecTlsSpiffePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**ServersTransportTCPSpecTlsSpiffe)(nil)).Elem()
}

func (o ServersTransportTCPSpecTlsSpiffePtrOutput) ToServersTransportTCPSpecTlsSpiffePtrOutput() ServersTransportTCPSpecTlsSpiffePtrOutput {
	return o
}

func (o ServersTransportTCPSpecTlsSpiffePtrOutput) ToServersTransportTCPSpecTlsSpiffePtrOutputWithContext(ctx context.Context) ServersTransportTCPSpecTlsSpiffePtrOutput {
	return o
}

func (o ServersTransportTCPSpecTlsSpiffePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*ServersTransportTCPSpecTlsSpiffe] {
	return pulumix.Output[*ServersTransportTCPSpecTlsSpiffe]{
		OutputState: o.OutputState,
	}
}

func (o ServersTransportTCPSpecTlsSpiffePtrOutput) Elem() ServersTransportTCPSpecTlsSpiffeOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTlsSpiffe) ServersTransportTCPSpecTlsSpiffe {
		if v != nil {
			return *v
		}
		var ret ServersTransportTCPSpecTlsSpiffe
		return ret
	}).(ServersTransportTCPSpecTlsSpiffeOutput)
}

// IDs defines the allowed SPIFFE IDs (takes precedence over the SPIFFE TrustDomain).
func (o ServersTransportTCPSpecTlsSpiffePtrOutput) Ids() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTlsSpiffe) []string {
		if v == nil {
			return nil
		}
		return v.Ids
	}).(pulumi.StringArrayOutput)
}

// TrustDomain defines the allowed SPIFFE trust domain.
func (o ServersTransportTCPSpecTlsSpiffePtrOutput) TrustDomain() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *ServersTransportTCPSpecTlsSpiffe) *string {
		if v == nil {
			return nil
		}
		return v.TrustDomain
	}).(pulumi.StringPtrOutput)
}

// TLSOption is the CRD implementation of a Traefik TLS Option, allowing to configure some parameters of the TLS connection.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#tls-options
type TLSOptionType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// TLSOptionSpec defines the desired state of a TLSOption.
	Spec TLSOptionSpec `pulumi:"spec"`
}

type TLSOptionMetadata struct {
}

// TLSOptionSpec defines the desired state of a TLSOption.
type TLSOptionSpec struct {
	// ALPNProtocols defines the list of supported application level protocols for the TLS handshake, in order of preference.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#alpn-protocols
	AlpnProtocols []string `pulumi:"alpnProtocols"`
	// CipherSuites defines the list of supported cipher suites for TLS versions up to TLS 1.2.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#cipher-suites
	CipherSuites []string `pulumi:"cipherSuites"`
	// ClientAuth defines the server's policy for TLS Client Authentication.
	ClientAuth *TLSOptionSpecClientAuth `pulumi:"clientAuth"`
	// CurvePreferences defines the preferred elliptic curves in a specific order.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#curve-preferences
	CurvePreferences []string `pulumi:"curvePreferences"`
	// MaxVersion defines the maximum TLS version that Traefik will accept.
	// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
	// Default: None.
	MaxVersion *string `pulumi:"maxVersion"`
	// MinVersion defines the minimum TLS version that Traefik will accept.
	// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
	// Default: VersionTLS10.
	MinVersion *string `pulumi:"minVersion"`
	// PreferServerCipherSuites defines whether the server chooses a cipher suite among his own instead of among the client's.
	// It is enabled automatically when minVersion or maxVersion is set.
	// Deprecated: https://github.com/golang/go/issues/45430
	PreferServerCipherSuites *bool `pulumi:"preferServerCipherSuites"`
	// SniStrict defines whether Traefik allows connections from clients connections that do not specify a server_name extension.
	SniStrict *bool `pulumi:"sniStrict"`
}

// TLSOptionSpecInput is an input type that accepts TLSOptionSpecArgs and TLSOptionSpecOutput values.
// You can construct a concrete instance of `TLSOptionSpecInput` via:
//
//	TLSOptionSpecArgs{...}
type TLSOptionSpecInput interface {
	pulumi.Input

	ToTLSOptionSpecOutput() TLSOptionSpecOutput
	ToTLSOptionSpecOutputWithContext(context.Context) TLSOptionSpecOutput
}

// TLSOptionSpec defines the desired state of a TLSOption.
type TLSOptionSpecArgs struct {
	// ALPNProtocols defines the list of supported application level protocols for the TLS handshake, in order of preference.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#alpn-protocols
	AlpnProtocols pulumi.StringArrayInput `pulumi:"alpnProtocols"`
	// CipherSuites defines the list of supported cipher suites for TLS versions up to TLS 1.2.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#cipher-suites
	CipherSuites pulumi.StringArrayInput `pulumi:"cipherSuites"`
	// ClientAuth defines the server's policy for TLS Client Authentication.
	ClientAuth TLSOptionSpecClientAuthPtrInput `pulumi:"clientAuth"`
	// CurvePreferences defines the preferred elliptic curves in a specific order.
	// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#curve-preferences
	CurvePreferences pulumi.StringArrayInput `pulumi:"curvePreferences"`
	// MaxVersion defines the maximum TLS version that Traefik will accept.
	// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
	// Default: None.
	MaxVersion pulumi.StringPtrInput `pulumi:"maxVersion"`
	// MinVersion defines the minimum TLS version that Traefik will accept.
	// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
	// Default: VersionTLS10.
	MinVersion pulumi.StringPtrInput `pulumi:"minVersion"`
	// PreferServerCipherSuites defines whether the server chooses a cipher suite among his own instead of among the client's.
	// It is enabled automatically when minVersion or maxVersion is set.
	// Deprecated: https://github.com/golang/go/issues/45430
	PreferServerCipherSuites pulumi.BoolPtrInput `pulumi:"preferServerCipherSuites"`
	// SniStrict defines whether Traefik allows connections from clients connections that do not specify a server_name extension.
	SniStrict pulumi.BoolPtrInput `pulumi:"sniStrict"`
}

func (TLSOptionSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSOptionSpec)(nil)).Elem()
}

func (i TLSOptionSpecArgs) ToTLSOptionSpecOutput() TLSOptionSpecOutput {
	return i.ToTLSOptionSpecOutputWithContext(context.Background())
}

func (i TLSOptionSpecArgs) ToTLSOptionSpecOutputWithContext(ctx context.Context) TLSOptionSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSOptionSpecOutput)
}

func (i TLSOptionSpecArgs) ToOutput(ctx context.Context) pulumix.Output[TLSOptionSpec] {
	return pulumix.Output[TLSOptionSpec]{
		OutputState: i.ToTLSOptionSpecOutputWithContext(ctx).OutputState,
	}
}

func (i TLSOptionSpecArgs) ToTLSOptionSpecPtrOutput() TLSOptionSpecPtrOutput {
	return i.ToTLSOptionSpecPtrOutputWithContext(context.Background())
}

func (i TLSOptionSpecArgs) ToTLSOptionSpecPtrOutputWithContext(ctx context.Context) TLSOptionSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSOptionSpecOutput).ToTLSOptionSpecPtrOutputWithContext(ctx)
}

// TLSOptionSpecPtrInput is an input type that accepts TLSOptionSpecArgs, TLSOptionSpecPtr and TLSOptionSpecPtrOutput values.
// You can construct a concrete instance of `TLSOptionSpecPtrInput` via:
//
//	        TLSOptionSpecArgs{...}
//
//	or:
//
//	        nil
type TLSOptionSpecPtrInput interface {
	pulumi.Input

	ToTLSOptionSpecPtrOutput() TLSOptionSpecPtrOutput
	ToTLSOptionSpecPtrOutputWithContext(context.Context) TLSOptionSpecPtrOutput
}

type tlsoptionSpecPtrType TLSOptionSpecArgs

func TLSOptionSpecPtr(v *TLSOptionSpecArgs) TLSOptionSpecPtrInput {
	return (*tlsoptionSpecPtrType)(v)
}

func (*tlsoptionSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSOptionSpec)(nil)).Elem()
}

func (i *tlsoptionSpecPtrType) ToTLSOptionSpecPtrOutput() TLSOptionSpecPtrOutput {
	return i.ToTLSOptionSpecPtrOutputWithContext(context.Background())
}

func (i *tlsoptionSpecPtrType) ToTLSOptionSpecPtrOutputWithContext(ctx context.Context) TLSOptionSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSOptionSpecPtrOutput)
}

func (i *tlsoptionSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*TLSOptionSpec] {
	return pulumix.Output[*TLSOptionSpec]{
		OutputState: i.ToTLSOptionSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// TLSOptionSpec defines the desired state of a TLSOption.
type TLSOptionSpecOutput struct{ *pulumi.OutputState }

func (TLSOptionSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSOptionSpec)(nil)).Elem()
}

func (o TLSOptionSpecOutput) ToTLSOptionSpecOutput() TLSOptionSpecOutput {
	return o
}

func (o TLSOptionSpecOutput) ToTLSOptionSpecOutputWithContext(ctx context.Context) TLSOptionSpecOutput {
	return o
}

func (o TLSOptionSpecOutput) ToTLSOptionSpecPtrOutput() TLSOptionSpecPtrOutput {
	return o.ToTLSOptionSpecPtrOutputWithContext(context.Background())
}

func (o TLSOptionSpecOutput) ToTLSOptionSpecPtrOutputWithContext(ctx context.Context) TLSOptionSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TLSOptionSpec) *TLSOptionSpec {
		return &v
	}).(TLSOptionSpecPtrOutput)
}

func (o TLSOptionSpecOutput) ToOutput(ctx context.Context) pulumix.Output[TLSOptionSpec] {
	return pulumix.Output[TLSOptionSpec]{
		OutputState: o.OutputState,
	}
}

// ALPNProtocols defines the list of supported application level protocols for the TLS handshake, in order of preference.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#alpn-protocols
func (o TLSOptionSpecOutput) AlpnProtocols() pulumi.StringArrayOutput {
	return o.ApplyT(func(v TLSOptionSpec) []string { return v.AlpnProtocols }).(pulumi.StringArrayOutput)
}

// CipherSuites defines the list of supported cipher suites for TLS versions up to TLS 1.2.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#cipher-suites
func (o TLSOptionSpecOutput) CipherSuites() pulumi.StringArrayOutput {
	return o.ApplyT(func(v TLSOptionSpec) []string { return v.CipherSuites }).(pulumi.StringArrayOutput)
}

// ClientAuth defines the server's policy for TLS Client Authentication.
func (o TLSOptionSpecOutput) ClientAuth() TLSOptionSpecClientAuthPtrOutput {
	return o.ApplyT(func(v TLSOptionSpec) *TLSOptionSpecClientAuth { return v.ClientAuth }).(TLSOptionSpecClientAuthPtrOutput)
}

// CurvePreferences defines the preferred elliptic curves in a specific order.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#curve-preferences
func (o TLSOptionSpecOutput) CurvePreferences() pulumi.StringArrayOutput {
	return o.ApplyT(func(v TLSOptionSpec) []string { return v.CurvePreferences }).(pulumi.StringArrayOutput)
}

// MaxVersion defines the maximum TLS version that Traefik will accept.
// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
// Default: None.
func (o TLSOptionSpecOutput) MaxVersion() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TLSOptionSpec) *string { return v.MaxVersion }).(pulumi.StringPtrOutput)
}

// MinVersion defines the minimum TLS version that Traefik will accept.
// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
// Default: VersionTLS10.
func (o TLSOptionSpecOutput) MinVersion() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TLSOptionSpec) *string { return v.MinVersion }).(pulumi.StringPtrOutput)
}

// PreferServerCipherSuites defines whether the server chooses a cipher suite among his own instead of among the client's.
// It is enabled automatically when minVersion or maxVersion is set.
// Deprecated: https://github.com/golang/go/issues/45430
func (o TLSOptionSpecOutput) PreferServerCipherSuites() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TLSOptionSpec) *bool { return v.PreferServerCipherSuites }).(pulumi.BoolPtrOutput)
}

// SniStrict defines whether Traefik allows connections from clients connections that do not specify a server_name extension.
func (o TLSOptionSpecOutput) SniStrict() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TLSOptionSpec) *bool { return v.SniStrict }).(pulumi.BoolPtrOutput)
}

type TLSOptionSpecPtrOutput struct{ *pulumi.OutputState }

func (TLSOptionSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSOptionSpec)(nil)).Elem()
}

func (o TLSOptionSpecPtrOutput) ToTLSOptionSpecPtrOutput() TLSOptionSpecPtrOutput {
	return o
}

func (o TLSOptionSpecPtrOutput) ToTLSOptionSpecPtrOutputWithContext(ctx context.Context) TLSOptionSpecPtrOutput {
	return o
}

func (o TLSOptionSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TLSOptionSpec] {
	return pulumix.Output[*TLSOptionSpec]{
		OutputState: o.OutputState,
	}
}

func (o TLSOptionSpecPtrOutput) Elem() TLSOptionSpecOutput {
	return o.ApplyT(func(v *TLSOptionSpec) TLSOptionSpec {
		if v != nil {
			return *v
		}
		var ret TLSOptionSpec
		return ret
	}).(TLSOptionSpecOutput)
}

// ALPNProtocols defines the list of supported application level protocols for the TLS handshake, in order of preference.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#alpn-protocols
func (o TLSOptionSpecPtrOutput) AlpnProtocols() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *TLSOptionSpec) []string {
		if v == nil {
			return nil
		}
		return v.AlpnProtocols
	}).(pulumi.StringArrayOutput)
}

// CipherSuites defines the list of supported cipher suites for TLS versions up to TLS 1.2.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#cipher-suites
func (o TLSOptionSpecPtrOutput) CipherSuites() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *TLSOptionSpec) []string {
		if v == nil {
			return nil
		}
		return v.CipherSuites
	}).(pulumi.StringArrayOutput)
}

// ClientAuth defines the server's policy for TLS Client Authentication.
func (o TLSOptionSpecPtrOutput) ClientAuth() TLSOptionSpecClientAuthPtrOutput {
	return o.ApplyT(func(v *TLSOptionSpec) *TLSOptionSpecClientAuth {
		if v == nil {
			return nil
		}
		return v.ClientAuth
	}).(TLSOptionSpecClientAuthPtrOutput)
}

// CurvePreferences defines the preferred elliptic curves in a specific order.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#curve-preferences
func (o TLSOptionSpecPtrOutput) CurvePreferences() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *TLSOptionSpec) []string {
		if v == nil {
			return nil
		}
		return v.CurvePreferences
	}).(pulumi.StringArrayOutput)
}

// MaxVersion defines the maximum TLS version that Traefik will accept.
// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
// Default: None.
func (o TLSOptionSpecPtrOutput) MaxVersion() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TLSOptionSpec) *string {
		if v == nil {
			return nil
		}
		return v.MaxVersion
	}).(pulumi.StringPtrOutput)
}

// MinVersion defines the minimum TLS version that Traefik will accept.
// Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13.
// Default: VersionTLS10.
func (o TLSOptionSpecPtrOutput) MinVersion() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TLSOptionSpec) *string {
		if v == nil {
			return nil
		}
		return v.MinVersion
	}).(pulumi.StringPtrOutput)
}

// PreferServerCipherSuites defines whether the server chooses a cipher suite among his own instead of among the client's.
// It is enabled automatically when minVersion or maxVersion is set.
// Deprecated: https://github.com/golang/go/issues/45430
func (o TLSOptionSpecPtrOutput) PreferServerCipherSuites() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TLSOptionSpec) *bool {
		if v == nil {
			return nil
		}
		return v.PreferServerCipherSuites
	}).(pulumi.BoolPtrOutput)
}

// SniStrict defines whether Traefik allows connections from clients connections that do not specify a server_name extension.
func (o TLSOptionSpecPtrOutput) SniStrict() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TLSOptionSpec) *bool {
		if v == nil {
			return nil
		}
		return v.SniStrict
	}).(pulumi.BoolPtrOutput)
}

// ClientAuth defines the server's policy for TLS Client Authentication.
type TLSOptionSpecClientAuth struct {
	// ClientAuthType defines the client authentication type to apply.
	ClientAuthType *string `pulumi:"clientAuthType"`
	// SecretNames defines the names of the referenced Kubernetes Secret storing certificate details.
	SecretNames []string `pulumi:"secretNames"`
}

// TLSOptionSpecClientAuthInput is an input type that accepts TLSOptionSpecClientAuthArgs and TLSOptionSpecClientAuthOutput values.
// You can construct a concrete instance of `TLSOptionSpecClientAuthInput` via:
//
//	TLSOptionSpecClientAuthArgs{...}
type TLSOptionSpecClientAuthInput interface {
	pulumi.Input

	ToTLSOptionSpecClientAuthOutput() TLSOptionSpecClientAuthOutput
	ToTLSOptionSpecClientAuthOutputWithContext(context.Context) TLSOptionSpecClientAuthOutput
}

// ClientAuth defines the server's policy for TLS Client Authentication.
type TLSOptionSpecClientAuthArgs struct {
	// ClientAuthType defines the client authentication type to apply.
	ClientAuthType pulumi.StringPtrInput `pulumi:"clientAuthType"`
	// SecretNames defines the names of the referenced Kubernetes Secret storing certificate details.
	SecretNames pulumi.StringArrayInput `pulumi:"secretNames"`
}

func (TLSOptionSpecClientAuthArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSOptionSpecClientAuth)(nil)).Elem()
}

func (i TLSOptionSpecClientAuthArgs) ToTLSOptionSpecClientAuthOutput() TLSOptionSpecClientAuthOutput {
	return i.ToTLSOptionSpecClientAuthOutputWithContext(context.Background())
}

func (i TLSOptionSpecClientAuthArgs) ToTLSOptionSpecClientAuthOutputWithContext(ctx context.Context) TLSOptionSpecClientAuthOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSOptionSpecClientAuthOutput)
}

func (i TLSOptionSpecClientAuthArgs) ToOutput(ctx context.Context) pulumix.Output[TLSOptionSpecClientAuth] {
	return pulumix.Output[TLSOptionSpecClientAuth]{
		OutputState: i.ToTLSOptionSpecClientAuthOutputWithContext(ctx).OutputState,
	}
}

func (i TLSOptionSpecClientAuthArgs) ToTLSOptionSpecClientAuthPtrOutput() TLSOptionSpecClientAuthPtrOutput {
	return i.ToTLSOptionSpecClientAuthPtrOutputWithContext(context.Background())
}

func (i TLSOptionSpecClientAuthArgs) ToTLSOptionSpecClientAuthPtrOutputWithContext(ctx context.Context) TLSOptionSpecClientAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSOptionSpecClientAuthOutput).ToTLSOptionSpecClientAuthPtrOutputWithContext(ctx)
}

// TLSOptionSpecClientAuthPtrInput is an input type that accepts TLSOptionSpecClientAuthArgs, TLSOptionSpecClientAuthPtr and TLSOptionSpecClientAuthPtrOutput values.
// You can construct a concrete instance of `TLSOptionSpecClientAuthPtrInput` via:
//
//	        TLSOptionSpecClientAuthArgs{...}
//
//	or:
//
//	        nil
type TLSOptionSpecClientAuthPtrInput interface {
	pulumi.Input

	ToTLSOptionSpecClientAuthPtrOutput() TLSOptionSpecClientAuthPtrOutput
	ToTLSOptionSpecClientAuthPtrOutputWithContext(context.Context) TLSOptionSpecClientAuthPtrOutput
}

type tlsoptionSpecClientAuthPtrType TLSOptionSpecClientAuthArgs

func TLSOptionSpecClientAuthPtr(v *TLSOptionSpecClientAuthArgs) TLSOptionSpecClientAuthPtrInput {
	return (*tlsoptionSpecClientAuthPtrType)(v)
}

func (*tlsoptionSpecClientAuthPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSOptionSpecClientAuth)(nil)).Elem()
}

func (i *tlsoptionSpecClientAuthPtrType) ToTLSOptionSpecClientAuthPtrOutput() TLSOptionSpecClientAuthPtrOutput {
	return i.ToTLSOptionSpecClientAuthPtrOutputWithContext(context.Background())
}

func (i *tlsoptionSpecClientAuthPtrType) ToTLSOptionSpecClientAuthPtrOutputWithContext(ctx context.Context) TLSOptionSpecClientAuthPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSOptionSpecClientAuthPtrOutput)
}

func (i *tlsoptionSpecClientAuthPtrType) ToOutput(ctx context.Context) pulumix.Output[*TLSOptionSpecClientAuth] {
	return pulumix.Output[*TLSOptionSpecClientAuth]{
		OutputState: i.ToTLSOptionSpecClientAuthPtrOutputWithContext(ctx).OutputState,
	}
}

// ClientAuth defines the server's policy for TLS Client Authentication.
type TLSOptionSpecClientAuthOutput struct{ *pulumi.OutputState }

func (TLSOptionSpecClientAuthOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSOptionSpecClientAuth)(nil)).Elem()
}

func (o TLSOptionSpecClientAuthOutput) ToTLSOptionSpecClientAuthOutput() TLSOptionSpecClientAuthOutput {
	return o
}

func (o TLSOptionSpecClientAuthOutput) ToTLSOptionSpecClientAuthOutputWithContext(ctx context.Context) TLSOptionSpecClientAuthOutput {
	return o
}

func (o TLSOptionSpecClientAuthOutput) ToTLSOptionSpecClientAuthPtrOutput() TLSOptionSpecClientAuthPtrOutput {
	return o.ToTLSOptionSpecClientAuthPtrOutputWithContext(context.Background())
}

func (o TLSOptionSpecClientAuthOutput) ToTLSOptionSpecClientAuthPtrOutputWithContext(ctx context.Context) TLSOptionSpecClientAuthPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TLSOptionSpecClientAuth) *TLSOptionSpecClientAuth {
		return &v
	}).(TLSOptionSpecClientAuthPtrOutput)
}

func (o TLSOptionSpecClientAuthOutput) ToOutput(ctx context.Context) pulumix.Output[TLSOptionSpecClientAuth] {
	return pulumix.Output[TLSOptionSpecClientAuth]{
		OutputState: o.OutputState,
	}
}

// ClientAuthType defines the client authentication type to apply.
func (o TLSOptionSpecClientAuthOutput) ClientAuthType() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TLSOptionSpecClientAuth) *string { return v.ClientAuthType }).(pulumi.StringPtrOutput)
}

// SecretNames defines the names of the referenced Kubernetes Secret storing certificate details.
func (o TLSOptionSpecClientAuthOutput) SecretNames() pulumi.StringArrayOutput {
	return o.ApplyT(func(v TLSOptionSpecClientAuth) []string { return v.SecretNames }).(pulumi.StringArrayOutput)
}

type TLSOptionSpecClientAuthPtrOutput struct{ *pulumi.OutputState }

func (TLSOptionSpecClientAuthPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSOptionSpecClientAuth)(nil)).Elem()
}

func (o TLSOptionSpecClientAuthPtrOutput) ToTLSOptionSpecClientAuthPtrOutput() TLSOptionSpecClientAuthPtrOutput {
	return o
}

func (o TLSOptionSpecClientAuthPtrOutput) ToTLSOptionSpecClientAuthPtrOutputWithContext(ctx context.Context) TLSOptionSpecClientAuthPtrOutput {
	return o
}

func (o TLSOptionSpecClientAuthPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TLSOptionSpecClientAuth] {
	return pulumix.Output[*TLSOptionSpecClientAuth]{
		OutputState: o.OutputState,
	}
}

func (o TLSOptionSpecClientAuthPtrOutput) Elem() TLSOptionSpecClientAuthOutput {
	return o.ApplyT(func(v *TLSOptionSpecClientAuth) TLSOptionSpecClientAuth {
		if v != nil {
			return *v
		}
		var ret TLSOptionSpecClientAuth
		return ret
	}).(TLSOptionSpecClientAuthOutput)
}

// ClientAuthType defines the client authentication type to apply.
func (o TLSOptionSpecClientAuthPtrOutput) ClientAuthType() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TLSOptionSpecClientAuth) *string {
		if v == nil {
			return nil
		}
		return v.ClientAuthType
	}).(pulumi.StringPtrOutput)
}

// SecretNames defines the names of the referenced Kubernetes Secret storing certificate details.
func (o TLSOptionSpecClientAuthPtrOutput) SecretNames() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *TLSOptionSpecClientAuth) []string {
		if v == nil {
			return nil
		}
		return v.SecretNames
	}).(pulumi.StringArrayOutput)
}

// TLSStore is the CRD implementation of a Traefik TLS Store.
// For the time being, only the TLSStore named default is supported.
// This means that you cannot have two stores that are named default in different Kubernetes namespaces.
// More info: https://doc.traefik.io/traefik/v3.0/https/tls/#certificates-stores
type TLSStoreType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// TLSStoreSpec defines the desired state of a TLSStore.
	Spec TLSStoreSpec `pulumi:"spec"`
}

type TLSStoreMetadata struct {
}

// TLSStoreSpec defines the desired state of a TLSStore.
type TLSStoreSpec struct {
	// Certificates is a list of secret names, each secret holding a key/certificate pair to add to the store.
	Certificates []TLSStoreSpecCertificates `pulumi:"certificates"`
	// DefaultCertificate defines the default certificate configuration.
	DefaultCertificate *TLSStoreSpecDefaultCertificate `pulumi:"defaultCertificate"`
	// DefaultGeneratedCert defines the default generated certificate configuration.
	DefaultGeneratedCert *TLSStoreSpecDefaultGeneratedCert `pulumi:"defaultGeneratedCert"`
}

// TLSStoreSpecInput is an input type that accepts TLSStoreSpecArgs and TLSStoreSpecOutput values.
// You can construct a concrete instance of `TLSStoreSpecInput` via:
//
//	TLSStoreSpecArgs{...}
type TLSStoreSpecInput interface {
	pulumi.Input

	ToTLSStoreSpecOutput() TLSStoreSpecOutput
	ToTLSStoreSpecOutputWithContext(context.Context) TLSStoreSpecOutput
}

// TLSStoreSpec defines the desired state of a TLSStore.
type TLSStoreSpecArgs struct {
	// Certificates is a list of secret names, each secret holding a key/certificate pair to add to the store.
	Certificates TLSStoreSpecCertificatesArrayInput `pulumi:"certificates"`
	// DefaultCertificate defines the default certificate configuration.
	DefaultCertificate TLSStoreSpecDefaultCertificatePtrInput `pulumi:"defaultCertificate"`
	// DefaultGeneratedCert defines the default generated certificate configuration.
	DefaultGeneratedCert TLSStoreSpecDefaultGeneratedCertPtrInput `pulumi:"defaultGeneratedCert"`
}

func (TLSStoreSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpec)(nil)).Elem()
}

func (i TLSStoreSpecArgs) ToTLSStoreSpecOutput() TLSStoreSpecOutput {
	return i.ToTLSStoreSpecOutputWithContext(context.Background())
}

func (i TLSStoreSpecArgs) ToTLSStoreSpecOutputWithContext(ctx context.Context) TLSStoreSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecOutput)
}

func (i TLSStoreSpecArgs) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpec] {
	return pulumix.Output[TLSStoreSpec]{
		OutputState: i.ToTLSStoreSpecOutputWithContext(ctx).OutputState,
	}
}

func (i TLSStoreSpecArgs) ToTLSStoreSpecPtrOutput() TLSStoreSpecPtrOutput {
	return i.ToTLSStoreSpecPtrOutputWithContext(context.Background())
}

func (i TLSStoreSpecArgs) ToTLSStoreSpecPtrOutputWithContext(ctx context.Context) TLSStoreSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecOutput).ToTLSStoreSpecPtrOutputWithContext(ctx)
}

// TLSStoreSpecPtrInput is an input type that accepts TLSStoreSpecArgs, TLSStoreSpecPtr and TLSStoreSpecPtrOutput values.
// You can construct a concrete instance of `TLSStoreSpecPtrInput` via:
//
//	        TLSStoreSpecArgs{...}
//
//	or:
//
//	        nil
type TLSStoreSpecPtrInput interface {
	pulumi.Input

	ToTLSStoreSpecPtrOutput() TLSStoreSpecPtrOutput
	ToTLSStoreSpecPtrOutputWithContext(context.Context) TLSStoreSpecPtrOutput
}

type tlsstoreSpecPtrType TLSStoreSpecArgs

func TLSStoreSpecPtr(v *TLSStoreSpecArgs) TLSStoreSpecPtrInput {
	return (*tlsstoreSpecPtrType)(v)
}

func (*tlsstoreSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpec)(nil)).Elem()
}

func (i *tlsstoreSpecPtrType) ToTLSStoreSpecPtrOutput() TLSStoreSpecPtrOutput {
	return i.ToTLSStoreSpecPtrOutputWithContext(context.Background())
}

func (i *tlsstoreSpecPtrType) ToTLSStoreSpecPtrOutputWithContext(ctx context.Context) TLSStoreSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecPtrOutput)
}

func (i *tlsstoreSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpec] {
	return pulumix.Output[*TLSStoreSpec]{
		OutputState: i.ToTLSStoreSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// TLSStoreSpec defines the desired state of a TLSStore.
type TLSStoreSpecOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpec)(nil)).Elem()
}

func (o TLSStoreSpecOutput) ToTLSStoreSpecOutput() TLSStoreSpecOutput {
	return o
}

func (o TLSStoreSpecOutput) ToTLSStoreSpecOutputWithContext(ctx context.Context) TLSStoreSpecOutput {
	return o
}

func (o TLSStoreSpecOutput) ToTLSStoreSpecPtrOutput() TLSStoreSpecPtrOutput {
	return o.ToTLSStoreSpecPtrOutputWithContext(context.Background())
}

func (o TLSStoreSpecOutput) ToTLSStoreSpecPtrOutputWithContext(ctx context.Context) TLSStoreSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TLSStoreSpec) *TLSStoreSpec {
		return &v
	}).(TLSStoreSpecPtrOutput)
}

func (o TLSStoreSpecOutput) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpec] {
	return pulumix.Output[TLSStoreSpec]{
		OutputState: o.OutputState,
	}
}

// Certificates is a list of secret names, each secret holding a key/certificate pair to add to the store.
func (o TLSStoreSpecOutput) Certificates() TLSStoreSpecCertificatesArrayOutput {
	return o.ApplyT(func(v TLSStoreSpec) []TLSStoreSpecCertificates { return v.Certificates }).(TLSStoreSpecCertificatesArrayOutput)
}

// DefaultCertificate defines the default certificate configuration.
func (o TLSStoreSpecOutput) DefaultCertificate() TLSStoreSpecDefaultCertificatePtrOutput {
	return o.ApplyT(func(v TLSStoreSpec) *TLSStoreSpecDefaultCertificate { return v.DefaultCertificate }).(TLSStoreSpecDefaultCertificatePtrOutput)
}

// DefaultGeneratedCert defines the default generated certificate configuration.
func (o TLSStoreSpecOutput) DefaultGeneratedCert() TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return o.ApplyT(func(v TLSStoreSpec) *TLSStoreSpecDefaultGeneratedCert { return v.DefaultGeneratedCert }).(TLSStoreSpecDefaultGeneratedCertPtrOutput)
}

type TLSStoreSpecPtrOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpec)(nil)).Elem()
}

func (o TLSStoreSpecPtrOutput) ToTLSStoreSpecPtrOutput() TLSStoreSpecPtrOutput {
	return o
}

func (o TLSStoreSpecPtrOutput) ToTLSStoreSpecPtrOutputWithContext(ctx context.Context) TLSStoreSpecPtrOutput {
	return o
}

func (o TLSStoreSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpec] {
	return pulumix.Output[*TLSStoreSpec]{
		OutputState: o.OutputState,
	}
}

func (o TLSStoreSpecPtrOutput) Elem() TLSStoreSpecOutput {
	return o.ApplyT(func(v *TLSStoreSpec) TLSStoreSpec {
		if v != nil {
			return *v
		}
		var ret TLSStoreSpec
		return ret
	}).(TLSStoreSpecOutput)
}

// Certificates is a list of secret names, each secret holding a key/certificate pair to add to the store.
func (o TLSStoreSpecPtrOutput) Certificates() TLSStoreSpecCertificatesArrayOutput {
	return o.ApplyT(func(v *TLSStoreSpec) []TLSStoreSpecCertificates {
		if v == nil {
			return nil
		}
		return v.Certificates
	}).(TLSStoreSpecCertificatesArrayOutput)
}

// DefaultCertificate defines the default certificate configuration.
func (o TLSStoreSpecPtrOutput) DefaultCertificate() TLSStoreSpecDefaultCertificatePtrOutput {
	return o.ApplyT(func(v *TLSStoreSpec) *TLSStoreSpecDefaultCertificate {
		if v == nil {
			return nil
		}
		return v.DefaultCertificate
	}).(TLSStoreSpecDefaultCertificatePtrOutput)
}

// DefaultGeneratedCert defines the default generated certificate configuration.
func (o TLSStoreSpecPtrOutput) DefaultGeneratedCert() TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return o.ApplyT(func(v *TLSStoreSpec) *TLSStoreSpecDefaultGeneratedCert {
		if v == nil {
			return nil
		}
		return v.DefaultGeneratedCert
	}).(TLSStoreSpecDefaultGeneratedCertPtrOutput)
}

// Certificate holds a secret name for the TLSStore resource.
type TLSStoreSpecCertificates struct {
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName string `pulumi:"secretName"`
}

// TLSStoreSpecCertificatesInput is an input type that accepts TLSStoreSpecCertificatesArgs and TLSStoreSpecCertificatesOutput values.
// You can construct a concrete instance of `TLSStoreSpecCertificatesInput` via:
//
//	TLSStoreSpecCertificatesArgs{...}
type TLSStoreSpecCertificatesInput interface {
	pulumi.Input

	ToTLSStoreSpecCertificatesOutput() TLSStoreSpecCertificatesOutput
	ToTLSStoreSpecCertificatesOutputWithContext(context.Context) TLSStoreSpecCertificatesOutput
}

// Certificate holds a secret name for the TLSStore resource.
type TLSStoreSpecCertificatesArgs struct {
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName pulumi.StringInput `pulumi:"secretName"`
}

func (TLSStoreSpecCertificatesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecCertificates)(nil)).Elem()
}

func (i TLSStoreSpecCertificatesArgs) ToTLSStoreSpecCertificatesOutput() TLSStoreSpecCertificatesOutput {
	return i.ToTLSStoreSpecCertificatesOutputWithContext(context.Background())
}

func (i TLSStoreSpecCertificatesArgs) ToTLSStoreSpecCertificatesOutputWithContext(ctx context.Context) TLSStoreSpecCertificatesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecCertificatesOutput)
}

func (i TLSStoreSpecCertificatesArgs) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecCertificates] {
	return pulumix.Output[TLSStoreSpecCertificates]{
		OutputState: i.ToTLSStoreSpecCertificatesOutputWithContext(ctx).OutputState,
	}
}

// TLSStoreSpecCertificatesArrayInput is an input type that accepts TLSStoreSpecCertificatesArray and TLSStoreSpecCertificatesArrayOutput values.
// You can construct a concrete instance of `TLSStoreSpecCertificatesArrayInput` via:
//
//	TLSStoreSpecCertificatesArray{ TLSStoreSpecCertificatesArgs{...} }
type TLSStoreSpecCertificatesArrayInput interface {
	pulumi.Input

	ToTLSStoreSpecCertificatesArrayOutput() TLSStoreSpecCertificatesArrayOutput
	ToTLSStoreSpecCertificatesArrayOutputWithContext(context.Context) TLSStoreSpecCertificatesArrayOutput
}

type TLSStoreSpecCertificatesArray []TLSStoreSpecCertificatesInput

func (TLSStoreSpecCertificatesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]TLSStoreSpecCertificates)(nil)).Elem()
}

func (i TLSStoreSpecCertificatesArray) ToTLSStoreSpecCertificatesArrayOutput() TLSStoreSpecCertificatesArrayOutput {
	return i.ToTLSStoreSpecCertificatesArrayOutputWithContext(context.Background())
}

func (i TLSStoreSpecCertificatesArray) ToTLSStoreSpecCertificatesArrayOutputWithContext(ctx context.Context) TLSStoreSpecCertificatesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecCertificatesArrayOutput)
}

func (i TLSStoreSpecCertificatesArray) ToOutput(ctx context.Context) pulumix.Output[[]TLSStoreSpecCertificates] {
	return pulumix.Output[[]TLSStoreSpecCertificates]{
		OutputState: i.ToTLSStoreSpecCertificatesArrayOutputWithContext(ctx).OutputState,
	}
}

// Certificate holds a secret name for the TLSStore resource.
type TLSStoreSpecCertificatesOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecCertificatesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecCertificates)(nil)).Elem()
}

func (o TLSStoreSpecCertificatesOutput) ToTLSStoreSpecCertificatesOutput() TLSStoreSpecCertificatesOutput {
	return o
}

func (o TLSStoreSpecCertificatesOutput) ToTLSStoreSpecCertificatesOutputWithContext(ctx context.Context) TLSStoreSpecCertificatesOutput {
	return o
}

func (o TLSStoreSpecCertificatesOutput) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecCertificates] {
	return pulumix.Output[TLSStoreSpecCertificates]{
		OutputState: o.OutputState,
	}
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o TLSStoreSpecCertificatesOutput) SecretName() pulumi.StringOutput {
	return o.ApplyT(func(v TLSStoreSpecCertificates) string { return v.SecretName }).(pulumi.StringOutput)
}

type TLSStoreSpecCertificatesArrayOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecCertificatesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]TLSStoreSpecCertificates)(nil)).Elem()
}

func (o TLSStoreSpecCertificatesArrayOutput) ToTLSStoreSpecCertificatesArrayOutput() TLSStoreSpecCertificatesArrayOutput {
	return o
}

func (o TLSStoreSpecCertificatesArrayOutput) ToTLSStoreSpecCertificatesArrayOutputWithContext(ctx context.Context) TLSStoreSpecCertificatesArrayOutput {
	return o
}

func (o TLSStoreSpecCertificatesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]TLSStoreSpecCertificates] {
	return pulumix.Output[[]TLSStoreSpecCertificates]{
		OutputState: o.OutputState,
	}
}

func (o TLSStoreSpecCertificatesArrayOutput) Index(i pulumi.IntInput) TLSStoreSpecCertificatesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) TLSStoreSpecCertificates {
		return vs[0].([]TLSStoreSpecCertificates)[vs[1].(int)]
	}).(TLSStoreSpecCertificatesOutput)
}

// DefaultCertificate defines the default certificate configuration.
type TLSStoreSpecDefaultCertificate struct {
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName string `pulumi:"secretName"`
}

// TLSStoreSpecDefaultCertificateInput is an input type that accepts TLSStoreSpecDefaultCertificateArgs and TLSStoreSpecDefaultCertificateOutput values.
// You can construct a concrete instance of `TLSStoreSpecDefaultCertificateInput` via:
//
//	TLSStoreSpecDefaultCertificateArgs{...}
type TLSStoreSpecDefaultCertificateInput interface {
	pulumi.Input

	ToTLSStoreSpecDefaultCertificateOutput() TLSStoreSpecDefaultCertificateOutput
	ToTLSStoreSpecDefaultCertificateOutputWithContext(context.Context) TLSStoreSpecDefaultCertificateOutput
}

// DefaultCertificate defines the default certificate configuration.
type TLSStoreSpecDefaultCertificateArgs struct {
	// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
	SecretName pulumi.StringInput `pulumi:"secretName"`
}

func (TLSStoreSpecDefaultCertificateArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecDefaultCertificate)(nil)).Elem()
}

func (i TLSStoreSpecDefaultCertificateArgs) ToTLSStoreSpecDefaultCertificateOutput() TLSStoreSpecDefaultCertificateOutput {
	return i.ToTLSStoreSpecDefaultCertificateOutputWithContext(context.Background())
}

func (i TLSStoreSpecDefaultCertificateArgs) ToTLSStoreSpecDefaultCertificateOutputWithContext(ctx context.Context) TLSStoreSpecDefaultCertificateOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultCertificateOutput)
}

func (i TLSStoreSpecDefaultCertificateArgs) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecDefaultCertificate] {
	return pulumix.Output[TLSStoreSpecDefaultCertificate]{
		OutputState: i.ToTLSStoreSpecDefaultCertificateOutputWithContext(ctx).OutputState,
	}
}

func (i TLSStoreSpecDefaultCertificateArgs) ToTLSStoreSpecDefaultCertificatePtrOutput() TLSStoreSpecDefaultCertificatePtrOutput {
	return i.ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(context.Background())
}

func (i TLSStoreSpecDefaultCertificateArgs) ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultCertificatePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultCertificateOutput).ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(ctx)
}

// TLSStoreSpecDefaultCertificatePtrInput is an input type that accepts TLSStoreSpecDefaultCertificateArgs, TLSStoreSpecDefaultCertificatePtr and TLSStoreSpecDefaultCertificatePtrOutput values.
// You can construct a concrete instance of `TLSStoreSpecDefaultCertificatePtrInput` via:
//
//	        TLSStoreSpecDefaultCertificateArgs{...}
//
//	or:
//
//	        nil
type TLSStoreSpecDefaultCertificatePtrInput interface {
	pulumi.Input

	ToTLSStoreSpecDefaultCertificatePtrOutput() TLSStoreSpecDefaultCertificatePtrOutput
	ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(context.Context) TLSStoreSpecDefaultCertificatePtrOutput
}

type tlsstoreSpecDefaultCertificatePtrType TLSStoreSpecDefaultCertificateArgs

func TLSStoreSpecDefaultCertificatePtr(v *TLSStoreSpecDefaultCertificateArgs) TLSStoreSpecDefaultCertificatePtrInput {
	return (*tlsstoreSpecDefaultCertificatePtrType)(v)
}

func (*tlsstoreSpecDefaultCertificatePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpecDefaultCertificate)(nil)).Elem()
}

func (i *tlsstoreSpecDefaultCertificatePtrType) ToTLSStoreSpecDefaultCertificatePtrOutput() TLSStoreSpecDefaultCertificatePtrOutput {
	return i.ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(context.Background())
}

func (i *tlsstoreSpecDefaultCertificatePtrType) ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultCertificatePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultCertificatePtrOutput)
}

func (i *tlsstoreSpecDefaultCertificatePtrType) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpecDefaultCertificate] {
	return pulumix.Output[*TLSStoreSpecDefaultCertificate]{
		OutputState: i.ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(ctx).OutputState,
	}
}

// DefaultCertificate defines the default certificate configuration.
type TLSStoreSpecDefaultCertificateOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecDefaultCertificateOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecDefaultCertificate)(nil)).Elem()
}

func (o TLSStoreSpecDefaultCertificateOutput) ToTLSStoreSpecDefaultCertificateOutput() TLSStoreSpecDefaultCertificateOutput {
	return o
}

func (o TLSStoreSpecDefaultCertificateOutput) ToTLSStoreSpecDefaultCertificateOutputWithContext(ctx context.Context) TLSStoreSpecDefaultCertificateOutput {
	return o
}

func (o TLSStoreSpecDefaultCertificateOutput) ToTLSStoreSpecDefaultCertificatePtrOutput() TLSStoreSpecDefaultCertificatePtrOutput {
	return o.ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(context.Background())
}

func (o TLSStoreSpecDefaultCertificateOutput) ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultCertificatePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TLSStoreSpecDefaultCertificate) *TLSStoreSpecDefaultCertificate {
		return &v
	}).(TLSStoreSpecDefaultCertificatePtrOutput)
}

func (o TLSStoreSpecDefaultCertificateOutput) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecDefaultCertificate] {
	return pulumix.Output[TLSStoreSpecDefaultCertificate]{
		OutputState: o.OutputState,
	}
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o TLSStoreSpecDefaultCertificateOutput) SecretName() pulumi.StringOutput {
	return o.ApplyT(func(v TLSStoreSpecDefaultCertificate) string { return v.SecretName }).(pulumi.StringOutput)
}

type TLSStoreSpecDefaultCertificatePtrOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecDefaultCertificatePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpecDefaultCertificate)(nil)).Elem()
}

func (o TLSStoreSpecDefaultCertificatePtrOutput) ToTLSStoreSpecDefaultCertificatePtrOutput() TLSStoreSpecDefaultCertificatePtrOutput {
	return o
}

func (o TLSStoreSpecDefaultCertificatePtrOutput) ToTLSStoreSpecDefaultCertificatePtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultCertificatePtrOutput {
	return o
}

func (o TLSStoreSpecDefaultCertificatePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpecDefaultCertificate] {
	return pulumix.Output[*TLSStoreSpecDefaultCertificate]{
		OutputState: o.OutputState,
	}
}

func (o TLSStoreSpecDefaultCertificatePtrOutput) Elem() TLSStoreSpecDefaultCertificateOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultCertificate) TLSStoreSpecDefaultCertificate {
		if v != nil {
			return *v
		}
		var ret TLSStoreSpecDefaultCertificate
		return ret
	}).(TLSStoreSpecDefaultCertificateOutput)
}

// SecretName is the name of the referenced Kubernetes Secret to specify the certificate details.
func (o TLSStoreSpecDefaultCertificatePtrOutput) SecretName() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultCertificate) *string {
		if v == nil {
			return nil
		}
		return &v.SecretName
	}).(pulumi.StringPtrOutput)
}

// DefaultGeneratedCert defines the default generated certificate configuration.
type TLSStoreSpecDefaultGeneratedCert struct {
	// Domain is the domain definition for the DefaultCertificate.
	Domain *TLSStoreSpecDefaultGeneratedCertDomain `pulumi:"domain"`
	// Resolver is the name of the resolver that will be used to issue the DefaultCertificate.
	Resolver *string `pulumi:"resolver"`
}

// TLSStoreSpecDefaultGeneratedCertInput is an input type that accepts TLSStoreSpecDefaultGeneratedCertArgs and TLSStoreSpecDefaultGeneratedCertOutput values.
// You can construct a concrete instance of `TLSStoreSpecDefaultGeneratedCertInput` via:
//
//	TLSStoreSpecDefaultGeneratedCertArgs{...}
type TLSStoreSpecDefaultGeneratedCertInput interface {
	pulumi.Input

	ToTLSStoreSpecDefaultGeneratedCertOutput() TLSStoreSpecDefaultGeneratedCertOutput
	ToTLSStoreSpecDefaultGeneratedCertOutputWithContext(context.Context) TLSStoreSpecDefaultGeneratedCertOutput
}

// DefaultGeneratedCert defines the default generated certificate configuration.
type TLSStoreSpecDefaultGeneratedCertArgs struct {
	// Domain is the domain definition for the DefaultCertificate.
	Domain TLSStoreSpecDefaultGeneratedCertDomainPtrInput `pulumi:"domain"`
	// Resolver is the name of the resolver that will be used to issue the DefaultCertificate.
	Resolver pulumi.StringPtrInput `pulumi:"resolver"`
}

func (TLSStoreSpecDefaultGeneratedCertArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCert)(nil)).Elem()
}

func (i TLSStoreSpecDefaultGeneratedCertArgs) ToTLSStoreSpecDefaultGeneratedCertOutput() TLSStoreSpecDefaultGeneratedCertOutput {
	return i.ToTLSStoreSpecDefaultGeneratedCertOutputWithContext(context.Background())
}

func (i TLSStoreSpecDefaultGeneratedCertArgs) ToTLSStoreSpecDefaultGeneratedCertOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultGeneratedCertOutput)
}

func (i TLSStoreSpecDefaultGeneratedCertArgs) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecDefaultGeneratedCert] {
	return pulumix.Output[TLSStoreSpecDefaultGeneratedCert]{
		OutputState: i.ToTLSStoreSpecDefaultGeneratedCertOutputWithContext(ctx).OutputState,
	}
}

func (i TLSStoreSpecDefaultGeneratedCertArgs) ToTLSStoreSpecDefaultGeneratedCertPtrOutput() TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return i.ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(context.Background())
}

func (i TLSStoreSpecDefaultGeneratedCertArgs) ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultGeneratedCertOutput).ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(ctx)
}

// TLSStoreSpecDefaultGeneratedCertPtrInput is an input type that accepts TLSStoreSpecDefaultGeneratedCertArgs, TLSStoreSpecDefaultGeneratedCertPtr and TLSStoreSpecDefaultGeneratedCertPtrOutput values.
// You can construct a concrete instance of `TLSStoreSpecDefaultGeneratedCertPtrInput` via:
//
//	        TLSStoreSpecDefaultGeneratedCertArgs{...}
//
//	or:
//
//	        nil
type TLSStoreSpecDefaultGeneratedCertPtrInput interface {
	pulumi.Input

	ToTLSStoreSpecDefaultGeneratedCertPtrOutput() TLSStoreSpecDefaultGeneratedCertPtrOutput
	ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(context.Context) TLSStoreSpecDefaultGeneratedCertPtrOutput
}

type tlsstoreSpecDefaultGeneratedCertPtrType TLSStoreSpecDefaultGeneratedCertArgs

func TLSStoreSpecDefaultGeneratedCertPtr(v *TLSStoreSpecDefaultGeneratedCertArgs) TLSStoreSpecDefaultGeneratedCertPtrInput {
	return (*tlsstoreSpecDefaultGeneratedCertPtrType)(v)
}

func (*tlsstoreSpecDefaultGeneratedCertPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpecDefaultGeneratedCert)(nil)).Elem()
}

func (i *tlsstoreSpecDefaultGeneratedCertPtrType) ToTLSStoreSpecDefaultGeneratedCertPtrOutput() TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return i.ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(context.Background())
}

func (i *tlsstoreSpecDefaultGeneratedCertPtrType) ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultGeneratedCertPtrOutput)
}

func (i *tlsstoreSpecDefaultGeneratedCertPtrType) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpecDefaultGeneratedCert] {
	return pulumix.Output[*TLSStoreSpecDefaultGeneratedCert]{
		OutputState: i.ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(ctx).OutputState,
	}
}

// DefaultGeneratedCert defines the default generated certificate configuration.
type TLSStoreSpecDefaultGeneratedCertOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecDefaultGeneratedCertOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCert)(nil)).Elem()
}

func (o TLSStoreSpecDefaultGeneratedCertOutput) ToTLSStoreSpecDefaultGeneratedCertOutput() TLSStoreSpecDefaultGeneratedCertOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertOutput) ToTLSStoreSpecDefaultGeneratedCertOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertOutput) ToTLSStoreSpecDefaultGeneratedCertPtrOutput() TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return o.ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(context.Background())
}

func (o TLSStoreSpecDefaultGeneratedCertOutput) ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TLSStoreSpecDefaultGeneratedCert) *TLSStoreSpecDefaultGeneratedCert {
		return &v
	}).(TLSStoreSpecDefaultGeneratedCertPtrOutput)
}

func (o TLSStoreSpecDefaultGeneratedCertOutput) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecDefaultGeneratedCert] {
	return pulumix.Output[TLSStoreSpecDefaultGeneratedCert]{
		OutputState: o.OutputState,
	}
}

// Domain is the domain definition for the DefaultCertificate.
func (o TLSStoreSpecDefaultGeneratedCertOutput) Domain() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return o.ApplyT(func(v TLSStoreSpecDefaultGeneratedCert) *TLSStoreSpecDefaultGeneratedCertDomain { return v.Domain }).(TLSStoreSpecDefaultGeneratedCertDomainPtrOutput)
}

// Resolver is the name of the resolver that will be used to issue the DefaultCertificate.
func (o TLSStoreSpecDefaultGeneratedCertOutput) Resolver() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TLSStoreSpecDefaultGeneratedCert) *string { return v.Resolver }).(pulumi.StringPtrOutput)
}

type TLSStoreSpecDefaultGeneratedCertPtrOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecDefaultGeneratedCertPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpecDefaultGeneratedCert)(nil)).Elem()
}

func (o TLSStoreSpecDefaultGeneratedCertPtrOutput) ToTLSStoreSpecDefaultGeneratedCertPtrOutput() TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertPtrOutput) ToTLSStoreSpecDefaultGeneratedCertPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertPtrOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpecDefaultGeneratedCert] {
	return pulumix.Output[*TLSStoreSpecDefaultGeneratedCert]{
		OutputState: o.OutputState,
	}
}

func (o TLSStoreSpecDefaultGeneratedCertPtrOutput) Elem() TLSStoreSpecDefaultGeneratedCertOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultGeneratedCert) TLSStoreSpecDefaultGeneratedCert {
		if v != nil {
			return *v
		}
		var ret TLSStoreSpecDefaultGeneratedCert
		return ret
	}).(TLSStoreSpecDefaultGeneratedCertOutput)
}

// Domain is the domain definition for the DefaultCertificate.
func (o TLSStoreSpecDefaultGeneratedCertPtrOutput) Domain() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultGeneratedCert) *TLSStoreSpecDefaultGeneratedCertDomain {
		if v == nil {
			return nil
		}
		return v.Domain
	}).(TLSStoreSpecDefaultGeneratedCertDomainPtrOutput)
}

// Resolver is the name of the resolver that will be used to issue the DefaultCertificate.
func (o TLSStoreSpecDefaultGeneratedCertPtrOutput) Resolver() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultGeneratedCert) *string {
		if v == nil {
			return nil
		}
		return v.Resolver
	}).(pulumi.StringPtrOutput)
}

// Domain is the domain definition for the DefaultCertificate.
type TLSStoreSpecDefaultGeneratedCertDomain struct {
	// Main defines the main domain name.
	Main *string `pulumi:"main"`
	// SANs defines the subject alternative domain names.
	Sans []string `pulumi:"sans"`
}

// TLSStoreSpecDefaultGeneratedCertDomainInput is an input type that accepts TLSStoreSpecDefaultGeneratedCertDomainArgs and TLSStoreSpecDefaultGeneratedCertDomainOutput values.
// You can construct a concrete instance of `TLSStoreSpecDefaultGeneratedCertDomainInput` via:
//
//	TLSStoreSpecDefaultGeneratedCertDomainArgs{...}
type TLSStoreSpecDefaultGeneratedCertDomainInput interface {
	pulumi.Input

	ToTLSStoreSpecDefaultGeneratedCertDomainOutput() TLSStoreSpecDefaultGeneratedCertDomainOutput
	ToTLSStoreSpecDefaultGeneratedCertDomainOutputWithContext(context.Context) TLSStoreSpecDefaultGeneratedCertDomainOutput
}

// Domain is the domain definition for the DefaultCertificate.
type TLSStoreSpecDefaultGeneratedCertDomainArgs struct {
	// Main defines the main domain name.
	Main pulumi.StringPtrInput `pulumi:"main"`
	// SANs defines the subject alternative domain names.
	Sans pulumi.StringArrayInput `pulumi:"sans"`
}

func (TLSStoreSpecDefaultGeneratedCertDomainArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCertDomain)(nil)).Elem()
}

func (i TLSStoreSpecDefaultGeneratedCertDomainArgs) ToTLSStoreSpecDefaultGeneratedCertDomainOutput() TLSStoreSpecDefaultGeneratedCertDomainOutput {
	return i.ToTLSStoreSpecDefaultGeneratedCertDomainOutputWithContext(context.Background())
}

func (i TLSStoreSpecDefaultGeneratedCertDomainArgs) ToTLSStoreSpecDefaultGeneratedCertDomainOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertDomainOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultGeneratedCertDomainOutput)
}

func (i TLSStoreSpecDefaultGeneratedCertDomainArgs) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecDefaultGeneratedCertDomain] {
	return pulumix.Output[TLSStoreSpecDefaultGeneratedCertDomain]{
		OutputState: i.ToTLSStoreSpecDefaultGeneratedCertDomainOutputWithContext(ctx).OutputState,
	}
}

func (i TLSStoreSpecDefaultGeneratedCertDomainArgs) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutput() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return i.ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(context.Background())
}

func (i TLSStoreSpecDefaultGeneratedCertDomainArgs) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultGeneratedCertDomainOutput).ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(ctx)
}

// TLSStoreSpecDefaultGeneratedCertDomainPtrInput is an input type that accepts TLSStoreSpecDefaultGeneratedCertDomainArgs, TLSStoreSpecDefaultGeneratedCertDomainPtr and TLSStoreSpecDefaultGeneratedCertDomainPtrOutput values.
// You can construct a concrete instance of `TLSStoreSpecDefaultGeneratedCertDomainPtrInput` via:
//
//	        TLSStoreSpecDefaultGeneratedCertDomainArgs{...}
//
//	or:
//
//	        nil
type TLSStoreSpecDefaultGeneratedCertDomainPtrInput interface {
	pulumi.Input

	ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutput() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput
	ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(context.Context) TLSStoreSpecDefaultGeneratedCertDomainPtrOutput
}

type tlsstoreSpecDefaultGeneratedCertDomainPtrType TLSStoreSpecDefaultGeneratedCertDomainArgs

func TLSStoreSpecDefaultGeneratedCertDomainPtr(v *TLSStoreSpecDefaultGeneratedCertDomainArgs) TLSStoreSpecDefaultGeneratedCertDomainPtrInput {
	return (*tlsstoreSpecDefaultGeneratedCertDomainPtrType)(v)
}

func (*tlsstoreSpecDefaultGeneratedCertDomainPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpecDefaultGeneratedCertDomain)(nil)).Elem()
}

func (i *tlsstoreSpecDefaultGeneratedCertDomainPtrType) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutput() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return i.ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(context.Background())
}

func (i *tlsstoreSpecDefaultGeneratedCertDomainPtrType) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TLSStoreSpecDefaultGeneratedCertDomainPtrOutput)
}

func (i *tlsstoreSpecDefaultGeneratedCertDomainPtrType) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpecDefaultGeneratedCertDomain] {
	return pulumix.Output[*TLSStoreSpecDefaultGeneratedCertDomain]{
		OutputState: i.ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(ctx).OutputState,
	}
}

// Domain is the domain definition for the DefaultCertificate.
type TLSStoreSpecDefaultGeneratedCertDomainOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecDefaultGeneratedCertDomainOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCertDomain)(nil)).Elem()
}

func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) ToTLSStoreSpecDefaultGeneratedCertDomainOutput() TLSStoreSpecDefaultGeneratedCertDomainOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) ToTLSStoreSpecDefaultGeneratedCertDomainOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertDomainOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutput() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return o.ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(context.Background())
}

func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TLSStoreSpecDefaultGeneratedCertDomain) *TLSStoreSpecDefaultGeneratedCertDomain {
		return &v
	}).(TLSStoreSpecDefaultGeneratedCertDomainPtrOutput)
}

func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) ToOutput(ctx context.Context) pulumix.Output[TLSStoreSpecDefaultGeneratedCertDomain] {
	return pulumix.Output[TLSStoreSpecDefaultGeneratedCertDomain]{
		OutputState: o.OutputState,
	}
}

// Main defines the main domain name.
func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) Main() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TLSStoreSpecDefaultGeneratedCertDomain) *string { return v.Main }).(pulumi.StringPtrOutput)
}

// SANs defines the subject alternative domain names.
func (o TLSStoreSpecDefaultGeneratedCertDomainOutput) Sans() pulumi.StringArrayOutput {
	return o.ApplyT(func(v TLSStoreSpecDefaultGeneratedCertDomain) []string { return v.Sans }).(pulumi.StringArrayOutput)
}

type TLSStoreSpecDefaultGeneratedCertDomainPtrOutput struct{ *pulumi.OutputState }

func (TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TLSStoreSpecDefaultGeneratedCertDomain)(nil)).Elem()
}

func (o TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutput() TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) ToTLSStoreSpecDefaultGeneratedCertDomainPtrOutputWithContext(ctx context.Context) TLSStoreSpecDefaultGeneratedCertDomainPtrOutput {
	return o
}

func (o TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TLSStoreSpecDefaultGeneratedCertDomain] {
	return pulumix.Output[*TLSStoreSpecDefaultGeneratedCertDomain]{
		OutputState: o.OutputState,
	}
}

func (o TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) Elem() TLSStoreSpecDefaultGeneratedCertDomainOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultGeneratedCertDomain) TLSStoreSpecDefaultGeneratedCertDomain {
		if v != nil {
			return *v
		}
		var ret TLSStoreSpecDefaultGeneratedCertDomain
		return ret
	}).(TLSStoreSpecDefaultGeneratedCertDomainOutput)
}

// Main defines the main domain name.
func (o TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) Main() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultGeneratedCertDomain) *string {
		if v == nil {
			return nil
		}
		return v.Main
	}).(pulumi.StringPtrOutput)
}

// SANs defines the subject alternative domain names.
func (o TLSStoreSpecDefaultGeneratedCertDomainPtrOutput) Sans() pulumi.StringArrayOutput {
	return o.ApplyT(func(v *TLSStoreSpecDefaultGeneratedCertDomain) []string {
		if v == nil {
			return nil
		}
		return v.Sans
	}).(pulumi.StringArrayOutput)
}

// TraefikService is the CRD implementation of a Traefik Service.
// TraefikService object allows to:
//   - Apply weight to Services on load-balancing
//   - Mirror traffic on services
//     More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#kind-traefikservice
type TraefikServiceType struct {
	ApiVersion *string       `pulumi:"apiVersion"`
	Kind       *string       `pulumi:"kind"`
	Metadata   v1.ObjectMeta `pulumi:"metadata"`
	// TraefikServiceSpec defines the desired state of a TraefikService.
	Spec TraefikServiceSpec `pulumi:"spec"`
}

type TraefikServiceMetadata struct {
}

// TraefikServiceSpec defines the desired state of a TraefikService.
type TraefikServiceSpec struct {
	// Mirroring defines the Mirroring service configuration.
	Mirroring *TraefikServiceSpecMirroring `pulumi:"mirroring"`
	// Weighted defines the Weighted Round Robin configuration.
	Weighted *TraefikServiceSpecWeighted `pulumi:"weighted"`
}

// TraefikServiceSpecInput is an input type that accepts TraefikServiceSpecArgs and TraefikServiceSpecOutput values.
// You can construct a concrete instance of `TraefikServiceSpecInput` via:
//
//	TraefikServiceSpecArgs{...}
type TraefikServiceSpecInput interface {
	pulumi.Input

	ToTraefikServiceSpecOutput() TraefikServiceSpecOutput
	ToTraefikServiceSpecOutputWithContext(context.Context) TraefikServiceSpecOutput
}

// TraefikServiceSpec defines the desired state of a TraefikService.
type TraefikServiceSpecArgs struct {
	// Mirroring defines the Mirroring service configuration.
	Mirroring TraefikServiceSpecMirroringPtrInput `pulumi:"mirroring"`
	// Weighted defines the Weighted Round Robin configuration.
	Weighted TraefikServiceSpecWeightedPtrInput `pulumi:"weighted"`
}

func (TraefikServiceSpecArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpec)(nil)).Elem()
}

func (i TraefikServiceSpecArgs) ToTraefikServiceSpecOutput() TraefikServiceSpecOutput {
	return i.ToTraefikServiceSpecOutputWithContext(context.Background())
}

func (i TraefikServiceSpecArgs) ToTraefikServiceSpecOutputWithContext(ctx context.Context) TraefikServiceSpecOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecOutput)
}

func (i TraefikServiceSpecArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpec] {
	return pulumix.Output[TraefikServiceSpec]{
		OutputState: i.ToTraefikServiceSpecOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecArgs) ToTraefikServiceSpecPtrOutput() TraefikServiceSpecPtrOutput {
	return i.ToTraefikServiceSpecPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecArgs) ToTraefikServiceSpecPtrOutputWithContext(ctx context.Context) TraefikServiceSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecOutput).ToTraefikServiceSpecPtrOutputWithContext(ctx)
}

// TraefikServiceSpecPtrInput is an input type that accepts TraefikServiceSpecArgs, TraefikServiceSpecPtr and TraefikServiceSpecPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecPtrInput` via:
//
//	        TraefikServiceSpecArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecPtrOutput() TraefikServiceSpecPtrOutput
	ToTraefikServiceSpecPtrOutputWithContext(context.Context) TraefikServiceSpecPtrOutput
}

type traefikServiceSpecPtrType TraefikServiceSpecArgs

func TraefikServiceSpecPtr(v *TraefikServiceSpecArgs) TraefikServiceSpecPtrInput {
	return (*traefikServiceSpecPtrType)(v)
}

func (*traefikServiceSpecPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpec)(nil)).Elem()
}

func (i *traefikServiceSpecPtrType) ToTraefikServiceSpecPtrOutput() TraefikServiceSpecPtrOutput {
	return i.ToTraefikServiceSpecPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecPtrType) ToTraefikServiceSpecPtrOutputWithContext(ctx context.Context) TraefikServiceSpecPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecPtrOutput)
}

func (i *traefikServiceSpecPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpec] {
	return pulumix.Output[*TraefikServiceSpec]{
		OutputState: i.ToTraefikServiceSpecPtrOutputWithContext(ctx).OutputState,
	}
}

// TraefikServiceSpec defines the desired state of a TraefikService.
type TraefikServiceSpecOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpec)(nil)).Elem()
}

func (o TraefikServiceSpecOutput) ToTraefikServiceSpecOutput() TraefikServiceSpecOutput {
	return o
}

func (o TraefikServiceSpecOutput) ToTraefikServiceSpecOutputWithContext(ctx context.Context) TraefikServiceSpecOutput {
	return o
}

func (o TraefikServiceSpecOutput) ToTraefikServiceSpecPtrOutput() TraefikServiceSpecPtrOutput {
	return o.ToTraefikServiceSpecPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecOutput) ToTraefikServiceSpecPtrOutputWithContext(ctx context.Context) TraefikServiceSpecPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpec) *TraefikServiceSpec {
		return &v
	}).(TraefikServiceSpecPtrOutput)
}

func (o TraefikServiceSpecOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpec] {
	return pulumix.Output[TraefikServiceSpec]{
		OutputState: o.OutputState,
	}
}

// Mirroring defines the Mirroring service configuration.
func (o TraefikServiceSpecOutput) Mirroring() TraefikServiceSpecMirroringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpec) *TraefikServiceSpecMirroring { return v.Mirroring }).(TraefikServiceSpecMirroringPtrOutput)
}

// Weighted defines the Weighted Round Robin configuration.
func (o TraefikServiceSpecOutput) Weighted() TraefikServiceSpecWeightedPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpec) *TraefikServiceSpecWeighted { return v.Weighted }).(TraefikServiceSpecWeightedPtrOutput)
}

type TraefikServiceSpecPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpec)(nil)).Elem()
}

func (o TraefikServiceSpecPtrOutput) ToTraefikServiceSpecPtrOutput() TraefikServiceSpecPtrOutput {
	return o
}

func (o TraefikServiceSpecPtrOutput) ToTraefikServiceSpecPtrOutputWithContext(ctx context.Context) TraefikServiceSpecPtrOutput {
	return o
}

func (o TraefikServiceSpecPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpec] {
	return pulumix.Output[*TraefikServiceSpec]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecPtrOutput) Elem() TraefikServiceSpecOutput {
	return o.ApplyT(func(v *TraefikServiceSpec) TraefikServiceSpec {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpec
		return ret
	}).(TraefikServiceSpecOutput)
}

// Mirroring defines the Mirroring service configuration.
func (o TraefikServiceSpecPtrOutput) Mirroring() TraefikServiceSpecMirroringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpec) *TraefikServiceSpecMirroring {
		if v == nil {
			return nil
		}
		return v.Mirroring
	}).(TraefikServiceSpecMirroringPtrOutput)
}

// Weighted defines the Weighted Round Robin configuration.
func (o TraefikServiceSpecPtrOutput) Weighted() TraefikServiceSpecWeightedPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpec) *TraefikServiceSpecWeighted {
		if v == nil {
			return nil
		}
		return v.Weighted
	}).(TraefikServiceSpecWeightedPtrOutput)
}

// Mirroring defines the Mirroring service configuration.
type TraefikServiceSpecMirroring struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck *TraefikServiceSpecMirroringHealthCheck `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind *string `pulumi:"kind"`
	// MaxBodySize defines the maximum size allowed for the body of the request.
	// If the body is larger, the request is not mirrored.
	// Default value is -1, which means unlimited size.
	MaxBodySize *int `pulumi:"maxBodySize"`
	// Mirrors defines the list of mirrors where Traefik will duplicate the traffic.
	Mirrors []TraefikServiceSpecMirroringMirrors `pulumi:"mirrors"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader *bool `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding *TraefikServiceSpecMirroringResponseForwarding `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme *string `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport *string `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky *TraefikServiceSpecMirroringSticky `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy *string `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight *int `pulumi:"weight"`
}

// TraefikServiceSpecMirroringInput is an input type that accepts TraefikServiceSpecMirroringArgs and TraefikServiceSpecMirroringOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringInput` via:
//
//	TraefikServiceSpecMirroringArgs{...}
type TraefikServiceSpecMirroringInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringOutput() TraefikServiceSpecMirroringOutput
	ToTraefikServiceSpecMirroringOutputWithContext(context.Context) TraefikServiceSpecMirroringOutput
}

// Mirroring defines the Mirroring service configuration.
type TraefikServiceSpecMirroringArgs struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck TraefikServiceSpecMirroringHealthCheckPtrInput `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind pulumi.StringPtrInput `pulumi:"kind"`
	// MaxBodySize defines the maximum size allowed for the body of the request.
	// If the body is larger, the request is not mirrored.
	// Default value is -1, which means unlimited size.
	MaxBodySize pulumi.IntPtrInput `pulumi:"maxBodySize"`
	// Mirrors defines the list of mirrors where Traefik will duplicate the traffic.
	Mirrors TraefikServiceSpecMirroringMirrorsArrayInput `pulumi:"mirrors"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader pulumi.BoolPtrInput `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding TraefikServiceSpecMirroringResponseForwardingPtrInput `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport pulumi.StringPtrInput `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky TraefikServiceSpecMirroringStickyPtrInput `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy pulumi.StringPtrInput `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (TraefikServiceSpecMirroringArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroring)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringArgs) ToTraefikServiceSpecMirroringOutput() TraefikServiceSpecMirroringOutput {
	return i.ToTraefikServiceSpecMirroringOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringArgs) ToTraefikServiceSpecMirroringOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringOutput)
}

func (i TraefikServiceSpecMirroringArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroring] {
	return pulumix.Output[TraefikServiceSpecMirroring]{
		OutputState: i.ToTraefikServiceSpecMirroringOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringArgs) ToTraefikServiceSpecMirroringPtrOutput() TraefikServiceSpecMirroringPtrOutput {
	return i.ToTraefikServiceSpecMirroringPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringArgs) ToTraefikServiceSpecMirroringPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringOutput).ToTraefikServiceSpecMirroringPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringPtrInput is an input type that accepts TraefikServiceSpecMirroringArgs, TraefikServiceSpecMirroringPtr and TraefikServiceSpecMirroringPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringPtrInput` via:
//
//	        TraefikServiceSpecMirroringArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringPtrOutput() TraefikServiceSpecMirroringPtrOutput
	ToTraefikServiceSpecMirroringPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringPtrOutput
}

type traefikServiceSpecMirroringPtrType TraefikServiceSpecMirroringArgs

func TraefikServiceSpecMirroringPtr(v *TraefikServiceSpecMirroringArgs) TraefikServiceSpecMirroringPtrInput {
	return (*traefikServiceSpecMirroringPtrType)(v)
}

func (*traefikServiceSpecMirroringPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroring)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringPtrType) ToTraefikServiceSpecMirroringPtrOutput() TraefikServiceSpecMirroringPtrOutput {
	return i.ToTraefikServiceSpecMirroringPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringPtrType) ToTraefikServiceSpecMirroringPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringPtrOutput)
}

func (i *traefikServiceSpecMirroringPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroring] {
	return pulumix.Output[*TraefikServiceSpecMirroring]{
		OutputState: i.ToTraefikServiceSpecMirroringPtrOutputWithContext(ctx).OutputState,
	}
}

// Mirroring defines the Mirroring service configuration.
type TraefikServiceSpecMirroringOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroring)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringOutput) ToTraefikServiceSpecMirroringOutput() TraefikServiceSpecMirroringOutput {
	return o
}

func (o TraefikServiceSpecMirroringOutput) ToTraefikServiceSpecMirroringOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringOutput {
	return o
}

func (o TraefikServiceSpecMirroringOutput) ToTraefikServiceSpecMirroringPtrOutput() TraefikServiceSpecMirroringPtrOutput {
	return o.ToTraefikServiceSpecMirroringPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringOutput) ToTraefikServiceSpecMirroringPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroring) *TraefikServiceSpecMirroring {
		return &v
	}).(TraefikServiceSpecMirroringPtrOutput)
}

func (o TraefikServiceSpecMirroringOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroring] {
	return pulumix.Output[TraefikServiceSpecMirroring]{
		OutputState: o.OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
func (o TraefikServiceSpecMirroringOutput) HealthCheck() TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *TraefikServiceSpecMirroringHealthCheck { return v.HealthCheck }).(TraefikServiceSpecMirroringHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o TraefikServiceSpecMirroringOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *string { return v.Kind }).(pulumi.StringPtrOutput)
}

// MaxBodySize defines the maximum size allowed for the body of the request.
// If the body is larger, the request is not mirrored.
// Default value is -1, which means unlimited size.
func (o TraefikServiceSpecMirroringOutput) MaxBodySize() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *int { return v.MaxBodySize }).(pulumi.IntPtrOutput)
}

// Mirrors defines the list of mirrors where Traefik will duplicate the traffic.
func (o TraefikServiceSpecMirroringOutput) Mirrors() TraefikServiceSpecMirroringMirrorsArrayOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) []TraefikServiceSpecMirroringMirrors { return v.Mirrors }).(TraefikServiceSpecMirroringMirrorsArrayOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o TraefikServiceSpecMirroringOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o TraefikServiceSpecMirroringOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o TraefikServiceSpecMirroringOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o TraefikServiceSpecMirroringOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o TraefikServiceSpecMirroringOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *bool { return v.PassHostHeader }).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o TraefikServiceSpecMirroringOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o TraefikServiceSpecMirroringOutput) ResponseForwarding() TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *TraefikServiceSpecMirroringResponseForwarding {
		return v.ResponseForwarding
	}).(TraefikServiceSpecMirroringResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o TraefikServiceSpecMirroringOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o TraefikServiceSpecMirroringOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *string { return v.ServersTransport }).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o TraefikServiceSpecMirroringOutput) Sticky() TraefikServiceSpecMirroringStickyPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *TraefikServiceSpecMirroringSticky { return v.Sticky }).(TraefikServiceSpecMirroringStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o TraefikServiceSpecMirroringOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *string { return v.Strategy }).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o TraefikServiceSpecMirroringOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroring) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type TraefikServiceSpecMirroringPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroring)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringPtrOutput) ToTraefikServiceSpecMirroringPtrOutput() TraefikServiceSpecMirroringPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringPtrOutput) ToTraefikServiceSpecMirroringPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroring] {
	return pulumix.Output[*TraefikServiceSpecMirroring]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringPtrOutput) Elem() TraefikServiceSpecMirroringOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) TraefikServiceSpecMirroring {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroring
		return ret
	}).(TraefikServiceSpecMirroringOutput)
}

// Healthcheck defines health checks for ExternalName services.
func (o TraefikServiceSpecMirroringPtrOutput) HealthCheck() TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *TraefikServiceSpecMirroringHealthCheck {
		if v == nil {
			return nil
		}
		return v.HealthCheck
	}).(TraefikServiceSpecMirroringHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o TraefikServiceSpecMirroringPtrOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *string {
		if v == nil {
			return nil
		}
		return v.Kind
	}).(pulumi.StringPtrOutput)
}

// MaxBodySize defines the maximum size allowed for the body of the request.
// If the body is larger, the request is not mirrored.
// Default value is -1, which means unlimited size.
func (o TraefikServiceSpecMirroringPtrOutput) MaxBodySize() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *int {
		if v == nil {
			return nil
		}
		return v.MaxBodySize
	}).(pulumi.IntPtrOutput)
}

// Mirrors defines the list of mirrors where Traefik will duplicate the traffic.
func (o TraefikServiceSpecMirroringPtrOutput) Mirrors() TraefikServiceSpecMirroringMirrorsArrayOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) []TraefikServiceSpecMirroringMirrors {
		if v == nil {
			return nil
		}
		return v.Mirrors
	}).(TraefikServiceSpecMirroringMirrorsArrayOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o TraefikServiceSpecMirroringPtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *string {
		if v == nil {
			return nil
		}
		return &v.Name
	}).(pulumi.StringPtrOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o TraefikServiceSpecMirroringPtrOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *string {
		if v == nil {
			return nil
		}
		return v.Namespace
	}).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o TraefikServiceSpecMirroringPtrOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *bool {
		if v == nil {
			return nil
		}
		return v.NativeLB
	}).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o TraefikServiceSpecMirroringPtrOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *bool {
		if v == nil {
			return nil
		}
		return v.NodePortLB
	}).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o TraefikServiceSpecMirroringPtrOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *bool {
		if v == nil {
			return nil
		}
		return v.PassHostHeader
	}).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o TraefikServiceSpecMirroringPtrOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) interface{} {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o TraefikServiceSpecMirroringPtrOutput) ResponseForwarding() TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *TraefikServiceSpecMirroringResponseForwarding {
		if v == nil {
			return nil
		}
		return v.ResponseForwarding
	}).(TraefikServiceSpecMirroringResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o TraefikServiceSpecMirroringPtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o TraefikServiceSpecMirroringPtrOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *string {
		if v == nil {
			return nil
		}
		return v.ServersTransport
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o TraefikServiceSpecMirroringPtrOutput) Sticky() TraefikServiceSpecMirroringStickyPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *TraefikServiceSpecMirroringSticky {
		if v == nil {
			return nil
		}
		return v.Sticky
	}).(TraefikServiceSpecMirroringStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o TraefikServiceSpecMirroringPtrOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *string {
		if v == nil {
			return nil
		}
		return v.Strategy
	}).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o TraefikServiceSpecMirroringPtrOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroring) *int {
		if v == nil {
			return nil
		}
		return v.Weight
	}).(pulumi.IntPtrOutput)
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecMirroringHealthCheck struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects *bool `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers map[string]string `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname *string `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval interface{} `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method *string `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode *string `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path *string `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port *int `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme *string `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status *int `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout interface{} `pulumi:"timeout"`
}

// TraefikServiceSpecMirroringHealthCheckInput is an input type that accepts TraefikServiceSpecMirroringHealthCheckArgs and TraefikServiceSpecMirroringHealthCheckOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringHealthCheckInput` via:
//
//	TraefikServiceSpecMirroringHealthCheckArgs{...}
type TraefikServiceSpecMirroringHealthCheckInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringHealthCheckOutput() TraefikServiceSpecMirroringHealthCheckOutput
	ToTraefikServiceSpecMirroringHealthCheckOutputWithContext(context.Context) TraefikServiceSpecMirroringHealthCheckOutput
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecMirroringHealthCheckArgs struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects pulumi.BoolPtrInput `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers pulumi.StringMapInput `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname pulumi.StringPtrInput `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval pulumi.Input `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method pulumi.StringPtrInput `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode pulumi.StringPtrInput `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path pulumi.StringPtrInput `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port pulumi.IntPtrInput `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status pulumi.IntPtrInput `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout pulumi.Input `pulumi:"timeout"`
}

func (TraefikServiceSpecMirroringHealthCheckArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringHealthCheck)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringHealthCheckArgs) ToTraefikServiceSpecMirroringHealthCheckOutput() TraefikServiceSpecMirroringHealthCheckOutput {
	return i.ToTraefikServiceSpecMirroringHealthCheckOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringHealthCheckArgs) ToTraefikServiceSpecMirroringHealthCheckOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringHealthCheckOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringHealthCheckOutput)
}

func (i TraefikServiceSpecMirroringHealthCheckArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringHealthCheck] {
	return pulumix.Output[TraefikServiceSpecMirroringHealthCheck]{
		OutputState: i.ToTraefikServiceSpecMirroringHealthCheckOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringHealthCheckArgs) ToTraefikServiceSpecMirroringHealthCheckPtrOutput() TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return i.ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringHealthCheckArgs) ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringHealthCheckOutput).ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringHealthCheckPtrInput is an input type that accepts TraefikServiceSpecMirroringHealthCheckArgs, TraefikServiceSpecMirroringHealthCheckPtr and TraefikServiceSpecMirroringHealthCheckPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringHealthCheckPtrInput` via:
//
//	        TraefikServiceSpecMirroringHealthCheckArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringHealthCheckPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringHealthCheckPtrOutput() TraefikServiceSpecMirroringHealthCheckPtrOutput
	ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringHealthCheckPtrOutput
}

type traefikServiceSpecMirroringHealthCheckPtrType TraefikServiceSpecMirroringHealthCheckArgs

func TraefikServiceSpecMirroringHealthCheckPtr(v *TraefikServiceSpecMirroringHealthCheckArgs) TraefikServiceSpecMirroringHealthCheckPtrInput {
	return (*traefikServiceSpecMirroringHealthCheckPtrType)(v)
}

func (*traefikServiceSpecMirroringHealthCheckPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringHealthCheck)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringHealthCheckPtrType) ToTraefikServiceSpecMirroringHealthCheckPtrOutput() TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return i.ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringHealthCheckPtrType) ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringHealthCheckPtrOutput)
}

func (i *traefikServiceSpecMirroringHealthCheckPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringHealthCheck] {
	return pulumix.Output[*TraefikServiceSpecMirroringHealthCheck]{
		OutputState: i.ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(ctx).OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecMirroringHealthCheckOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringHealthCheckOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringHealthCheck)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringHealthCheckOutput) ToTraefikServiceSpecMirroringHealthCheckOutput() TraefikServiceSpecMirroringHealthCheckOutput {
	return o
}

func (o TraefikServiceSpecMirroringHealthCheckOutput) ToTraefikServiceSpecMirroringHealthCheckOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringHealthCheckOutput {
	return o
}

func (o TraefikServiceSpecMirroringHealthCheckOutput) ToTraefikServiceSpecMirroringHealthCheckPtrOutput() TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return o.ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringHealthCheckOutput) ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringHealthCheck) *TraefikServiceSpecMirroringHealthCheck {
		return &v
	}).(TraefikServiceSpecMirroringHealthCheckPtrOutput)
}

func (o TraefikServiceSpecMirroringHealthCheckOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringHealthCheck] {
	return pulumix.Output[TraefikServiceSpecMirroringHealthCheck]{
		OutputState: o.OutputState,
	}
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o TraefikServiceSpecMirroringHealthCheckOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *bool { return v.FollowRedirects }).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) map[string]string { return v.Headers }).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *string { return v.Hostname }).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o TraefikServiceSpecMirroringHealthCheckOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) interface{} { return v.Interval }).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *string { return v.Method }).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o TraefikServiceSpecMirroringHealthCheckOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *string { return v.Mode }).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *string { return v.Path }).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *int { return v.Port }).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o TraefikServiceSpecMirroringHealthCheckOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) *int { return v.Status }).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o TraefikServiceSpecMirroringHealthCheckOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringHealthCheck) interface{} { return v.Timeout }).(pulumi.AnyOutput)
}

type TraefikServiceSpecMirroringHealthCheckPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringHealthCheckPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringHealthCheck)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) ToTraefikServiceSpecMirroringHealthCheckPtrOutput() TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) ToTraefikServiceSpecMirroringHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringHealthCheckPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringHealthCheck] {
	return pulumix.Output[*TraefikServiceSpecMirroringHealthCheck]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Elem() TraefikServiceSpecMirroringHealthCheckOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) TraefikServiceSpecMirroringHealthCheck {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringHealthCheck
		return ret
	}).(TraefikServiceSpecMirroringHealthCheckOutput)
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *bool {
		if v == nil {
			return nil
		}
		return v.FollowRedirects
	}).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) map[string]string {
		if v == nil {
			return nil
		}
		return v.Headers
	}).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Hostname
	}).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Interval
	}).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Method
	}).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Mode
	}).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Path
	}).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Status
	}).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o TraefikServiceSpecMirroringHealthCheckPtrOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Timeout
	}).(pulumi.AnyOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
type TraefikServiceSpecMirroringHealthCheckHeaders struct {
}

// MirrorService holds the mirror configuration.
type TraefikServiceSpecMirroringMirrors struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck *TraefikServiceSpecMirroringMirrorsHealthCheck `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind *string `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader *bool `pulumi:"passHostHeader"`
	// Percent defines the part of the traffic to mirror.
	// Supported values: 0 to 100.
	Percent *int `pulumi:"percent"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding *TraefikServiceSpecMirroringMirrorsResponseForwarding `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme *string `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport *string `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky *TraefikServiceSpecMirroringMirrorsSticky `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy *string `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight *int `pulumi:"weight"`
}

// TraefikServiceSpecMirroringMirrorsInput is an input type that accepts TraefikServiceSpecMirroringMirrorsArgs and TraefikServiceSpecMirroringMirrorsOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsInput` via:
//
//	TraefikServiceSpecMirroringMirrorsArgs{...}
type TraefikServiceSpecMirroringMirrorsInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsOutput() TraefikServiceSpecMirroringMirrorsOutput
	ToTraefikServiceSpecMirroringMirrorsOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsOutput
}

// MirrorService holds the mirror configuration.
type TraefikServiceSpecMirroringMirrorsArgs struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck TraefikServiceSpecMirroringMirrorsHealthCheckPtrInput `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind pulumi.StringPtrInput `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader pulumi.BoolPtrInput `pulumi:"passHostHeader"`
	// Percent defines the part of the traffic to mirror.
	// Supported values: 0 to 100.
	Percent pulumi.IntPtrInput `pulumi:"percent"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding TraefikServiceSpecMirroringMirrorsResponseForwardingPtrInput `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport pulumi.StringPtrInput `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky TraefikServiceSpecMirroringMirrorsStickyPtrInput `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy pulumi.StringPtrInput `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (TraefikServiceSpecMirroringMirrorsArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrors)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringMirrorsArgs) ToTraefikServiceSpecMirroringMirrorsOutput() TraefikServiceSpecMirroringMirrorsOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsArgs) ToTraefikServiceSpecMirroringMirrorsOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsOutput)
}

func (i TraefikServiceSpecMirroringMirrorsArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrors] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrors]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsOutputWithContext(ctx).OutputState,
	}
}

// TraefikServiceSpecMirroringMirrorsArrayInput is an input type that accepts TraefikServiceSpecMirroringMirrorsArray and TraefikServiceSpecMirroringMirrorsArrayOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsArrayInput` via:
//
//	TraefikServiceSpecMirroringMirrorsArray{ TraefikServiceSpecMirroringMirrorsArgs{...} }
type TraefikServiceSpecMirroringMirrorsArrayInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsArrayOutput() TraefikServiceSpecMirroringMirrorsArrayOutput
	ToTraefikServiceSpecMirroringMirrorsArrayOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsArrayOutput
}

type TraefikServiceSpecMirroringMirrorsArray []TraefikServiceSpecMirroringMirrorsInput

func (TraefikServiceSpecMirroringMirrorsArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]TraefikServiceSpecMirroringMirrors)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringMirrorsArray) ToTraefikServiceSpecMirroringMirrorsArrayOutput() TraefikServiceSpecMirroringMirrorsArrayOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsArrayOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsArray) ToTraefikServiceSpecMirroringMirrorsArrayOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsArrayOutput)
}

func (i TraefikServiceSpecMirroringMirrorsArray) ToOutput(ctx context.Context) pulumix.Output[[]TraefikServiceSpecMirroringMirrors] {
	return pulumix.Output[[]TraefikServiceSpecMirroringMirrors]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsArrayOutputWithContext(ctx).OutputState,
	}
}

// MirrorService holds the mirror configuration.
type TraefikServiceSpecMirroringMirrorsOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrors)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsOutput) ToTraefikServiceSpecMirroringMirrorsOutput() TraefikServiceSpecMirroringMirrorsOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsOutput) ToTraefikServiceSpecMirroringMirrorsOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrors] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrors]{
		OutputState: o.OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
func (o TraefikServiceSpecMirroringMirrorsOutput) HealthCheck() TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *TraefikServiceSpecMirroringMirrorsHealthCheck {
		return v.HealthCheck
	}).(TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o TraefikServiceSpecMirroringMirrorsOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *string { return v.Kind }).(pulumi.StringPtrOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o TraefikServiceSpecMirroringMirrorsOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o TraefikServiceSpecMirroringMirrorsOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o TraefikServiceSpecMirroringMirrorsOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o TraefikServiceSpecMirroringMirrorsOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o TraefikServiceSpecMirroringMirrorsOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *bool { return v.PassHostHeader }).(pulumi.BoolPtrOutput)
}

// Percent defines the part of the traffic to mirror.
// Supported values: 0 to 100.
func (o TraefikServiceSpecMirroringMirrorsOutput) Percent() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *int { return v.Percent }).(pulumi.IntPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o TraefikServiceSpecMirroringMirrorsOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o TraefikServiceSpecMirroringMirrorsOutput) ResponseForwarding() TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *TraefikServiceSpecMirroringMirrorsResponseForwarding {
		return v.ResponseForwarding
	}).(TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o TraefikServiceSpecMirroringMirrorsOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o TraefikServiceSpecMirroringMirrorsOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *string { return v.ServersTransport }).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o TraefikServiceSpecMirroringMirrorsOutput) Sticky() TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *TraefikServiceSpecMirroringMirrorsSticky { return v.Sticky }).(TraefikServiceSpecMirroringMirrorsStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o TraefikServiceSpecMirroringMirrorsOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *string { return v.Strategy }).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o TraefikServiceSpecMirroringMirrorsOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrors) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type TraefikServiceSpecMirroringMirrorsArrayOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]TraefikServiceSpecMirroringMirrors)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsArrayOutput) ToTraefikServiceSpecMirroringMirrorsArrayOutput() TraefikServiceSpecMirroringMirrorsArrayOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsArrayOutput) ToTraefikServiceSpecMirroringMirrorsArrayOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsArrayOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]TraefikServiceSpecMirroringMirrors] {
	return pulumix.Output[[]TraefikServiceSpecMirroringMirrors]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringMirrorsArrayOutput) Index(i pulumi.IntInput) TraefikServiceSpecMirroringMirrorsOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) TraefikServiceSpecMirroringMirrors {
		return vs[0].([]TraefikServiceSpecMirroringMirrors)[vs[1].(int)]
	}).(TraefikServiceSpecMirroringMirrorsOutput)
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecMirroringMirrorsHealthCheck struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects *bool `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers map[string]string `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname *string `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval interface{} `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method *string `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode *string `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path *string `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port *int `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme *string `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status *int `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout interface{} `pulumi:"timeout"`
}

// TraefikServiceSpecMirroringMirrorsHealthCheckInput is an input type that accepts TraefikServiceSpecMirroringMirrorsHealthCheckArgs and TraefikServiceSpecMirroringMirrorsHealthCheckOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsHealthCheckInput` via:
//
//	TraefikServiceSpecMirroringMirrorsHealthCheckArgs{...}
type TraefikServiceSpecMirroringMirrorsHealthCheckInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsHealthCheckOutput() TraefikServiceSpecMirroringMirrorsHealthCheckOutput
	ToTraefikServiceSpecMirroringMirrorsHealthCheckOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckOutput
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecMirroringMirrorsHealthCheckArgs struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects pulumi.BoolPtrInput `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers pulumi.StringMapInput `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname pulumi.StringPtrInput `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval pulumi.Input `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method pulumi.StringPtrInput `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode pulumi.StringPtrInput `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path pulumi.StringPtrInput `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port pulumi.IntPtrInput `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status pulumi.IntPtrInput `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout pulumi.Input `pulumi:"timeout"`
}

func (TraefikServiceSpecMirroringMirrorsHealthCheckArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsHealthCheck)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringMirrorsHealthCheckArgs) ToTraefikServiceSpecMirroringMirrorsHealthCheckOutput() TraefikServiceSpecMirroringMirrorsHealthCheckOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsHealthCheckOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsHealthCheckArgs) ToTraefikServiceSpecMirroringMirrorsHealthCheckOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsHealthCheckOutput)
}

func (i TraefikServiceSpecMirroringMirrorsHealthCheckArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsHealthCheck] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsHealthCheck]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsHealthCheckOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringMirrorsHealthCheckArgs) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput() TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsHealthCheckArgs) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsHealthCheckOutput).ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringMirrorsHealthCheckPtrInput is an input type that accepts TraefikServiceSpecMirroringMirrorsHealthCheckArgs, TraefikServiceSpecMirroringMirrorsHealthCheckPtr and TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsHealthCheckPtrInput` via:
//
//	        TraefikServiceSpecMirroringMirrorsHealthCheckArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringMirrorsHealthCheckPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput() TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput
	ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput
}

type traefikServiceSpecMirroringMirrorsHealthCheckPtrType TraefikServiceSpecMirroringMirrorsHealthCheckArgs

func TraefikServiceSpecMirroringMirrorsHealthCheckPtr(v *TraefikServiceSpecMirroringMirrorsHealthCheckArgs) TraefikServiceSpecMirroringMirrorsHealthCheckPtrInput {
	return (*traefikServiceSpecMirroringMirrorsHealthCheckPtrType)(v)
}

func (*traefikServiceSpecMirroringMirrorsHealthCheckPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsHealthCheck)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringMirrorsHealthCheckPtrType) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput() TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringMirrorsHealthCheckPtrType) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput)
}

func (i *traefikServiceSpecMirroringMirrorsHealthCheckPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsHealthCheck] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsHealthCheck]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(ctx).OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecMirroringMirrorsHealthCheckOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsHealthCheckOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsHealthCheck)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) ToTraefikServiceSpecMirroringMirrorsHealthCheckOutput() TraefikServiceSpecMirroringMirrorsHealthCheckOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) ToTraefikServiceSpecMirroringMirrorsHealthCheckOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput() TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return o.ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringMirrorsHealthCheck) *TraefikServiceSpecMirroringMirrorsHealthCheck {
		return &v
	}).(TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput)
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsHealthCheck] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsHealthCheck]{
		OutputState: o.OutputState,
	}
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *bool { return v.FollowRedirects }).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) map[string]string { return v.Headers }).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *string { return v.Hostname }).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) interface{} { return v.Interval }).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *string { return v.Method }).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *string { return v.Mode }).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *string { return v.Path }).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *int { return v.Port }).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) *int { return v.Status }).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o TraefikServiceSpecMirroringMirrorsHealthCheckOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsHealthCheck) interface{} { return v.Timeout }).(pulumi.AnyOutput)
}

type TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsHealthCheck)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput() TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) ToTraefikServiceSpecMirroringMirrorsHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsHealthCheck] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsHealthCheck]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Elem() TraefikServiceSpecMirroringMirrorsHealthCheckOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) TraefikServiceSpecMirroringMirrorsHealthCheck {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringMirrorsHealthCheck
		return ret
	}).(TraefikServiceSpecMirroringMirrorsHealthCheckOutput)
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *bool {
		if v == nil {
			return nil
		}
		return v.FollowRedirects
	}).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) map[string]string {
		if v == nil {
			return nil
		}
		return v.Headers
	}).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Hostname
	}).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Interval
	}).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Method
	}).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Mode
	}).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Path
	}).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Status
	}).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Timeout
	}).(pulumi.AnyOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
type TraefikServiceSpecMirroringMirrorsHealthCheckHeaders struct {
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecMirroringMirrorsResponseForwarding struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval *string `pulumi:"flushInterval"`
}

// TraefikServiceSpecMirroringMirrorsResponseForwardingInput is an input type that accepts TraefikServiceSpecMirroringMirrorsResponseForwardingArgs and TraefikServiceSpecMirroringMirrorsResponseForwardingOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsResponseForwardingInput` via:
//
//	TraefikServiceSpecMirroringMirrorsResponseForwardingArgs{...}
type TraefikServiceSpecMirroringMirrorsResponseForwardingInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingOutput
	ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingOutput
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecMirroringMirrorsResponseForwardingArgs struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval pulumi.StringPtrInput `pulumi:"flushInterval"`
}

func (TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsResponseForwarding)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsResponseForwardingOutput)
}

func (i TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsResponseForwarding] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsResponseForwarding]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsResponseForwardingOutput).ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringMirrorsResponseForwardingPtrInput is an input type that accepts TraefikServiceSpecMirroringMirrorsResponseForwardingArgs, TraefikServiceSpecMirroringMirrorsResponseForwardingPtr and TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsResponseForwardingPtrInput` via:
//
//	        TraefikServiceSpecMirroringMirrorsResponseForwardingArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringMirrorsResponseForwardingPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput
	ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput
}

type traefikServiceSpecMirroringMirrorsResponseForwardingPtrType TraefikServiceSpecMirroringMirrorsResponseForwardingArgs

func TraefikServiceSpecMirroringMirrorsResponseForwardingPtr(v *TraefikServiceSpecMirroringMirrorsResponseForwardingArgs) TraefikServiceSpecMirroringMirrorsResponseForwardingPtrInput {
	return (*traefikServiceSpecMirroringMirrorsResponseForwardingPtrType)(v)
}

func (*traefikServiceSpecMirroringMirrorsResponseForwardingPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsResponseForwarding)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringMirrorsResponseForwardingPtrType) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringMirrorsResponseForwardingPtrType) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput)
}

func (i *traefikServiceSpecMirroringMirrorsResponseForwardingPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsResponseForwarding] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsResponseForwarding]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(ctx).OutputState,
	}
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecMirroringMirrorsResponseForwardingOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsResponseForwarding)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) ToTraefikServiceSpecMirroringMirrorsResponseForwardingOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return o.ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringMirrorsResponseForwarding) *TraefikServiceSpecMirroringMirrorsResponseForwarding {
		return &v
	}).(TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput)
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsResponseForwarding] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsResponseForwarding]{
		OutputState: o.OutputState,
	}
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o TraefikServiceSpecMirroringMirrorsResponseForwardingOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsResponseForwarding) *string { return v.FlushInterval }).(pulumi.StringPtrOutput)
}

type TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsResponseForwarding)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput() TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput) ToTraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsResponseForwarding] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsResponseForwarding]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput) Elem() TraefikServiceSpecMirroringMirrorsResponseForwardingOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsResponseForwarding) TraefikServiceSpecMirroringMirrorsResponseForwarding {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringMirrorsResponseForwarding
		return ret
	}).(TraefikServiceSpecMirroringMirrorsResponseForwardingOutput)
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsResponseForwarding) *string {
		if v == nil {
			return nil
		}
		return v.FlushInterval
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecMirroringMirrorsSticky struct {
	// Cookie defines the sticky cookie configuration.
	Cookie *TraefikServiceSpecMirroringMirrorsStickyCookie `pulumi:"cookie"`
}

// TraefikServiceSpecMirroringMirrorsStickyInput is an input type that accepts TraefikServiceSpecMirroringMirrorsStickyArgs and TraefikServiceSpecMirroringMirrorsStickyOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsStickyInput` via:
//
//	TraefikServiceSpecMirroringMirrorsStickyArgs{...}
type TraefikServiceSpecMirroringMirrorsStickyInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsStickyOutput() TraefikServiceSpecMirroringMirrorsStickyOutput
	ToTraefikServiceSpecMirroringMirrorsStickyOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsStickyOutput
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecMirroringMirrorsStickyArgs struct {
	// Cookie defines the sticky cookie configuration.
	Cookie TraefikServiceSpecMirroringMirrorsStickyCookiePtrInput `pulumi:"cookie"`
}

func (TraefikServiceSpecMirroringMirrorsStickyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsSticky)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringMirrorsStickyArgs) ToTraefikServiceSpecMirroringMirrorsStickyOutput() TraefikServiceSpecMirroringMirrorsStickyOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsStickyOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsStickyArgs) ToTraefikServiceSpecMirroringMirrorsStickyOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsStickyOutput)
}

func (i TraefikServiceSpecMirroringMirrorsStickyArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsSticky] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsSticky]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsStickyOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringMirrorsStickyArgs) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutput() TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsStickyArgs) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsStickyOutput).ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringMirrorsStickyPtrInput is an input type that accepts TraefikServiceSpecMirroringMirrorsStickyArgs, TraefikServiceSpecMirroringMirrorsStickyPtr and TraefikServiceSpecMirroringMirrorsStickyPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsStickyPtrInput` via:
//
//	        TraefikServiceSpecMirroringMirrorsStickyArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringMirrorsStickyPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsStickyPtrOutput() TraefikServiceSpecMirroringMirrorsStickyPtrOutput
	ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsStickyPtrOutput
}

type traefikServiceSpecMirroringMirrorsStickyPtrType TraefikServiceSpecMirroringMirrorsStickyArgs

func TraefikServiceSpecMirroringMirrorsStickyPtr(v *TraefikServiceSpecMirroringMirrorsStickyArgs) TraefikServiceSpecMirroringMirrorsStickyPtrInput {
	return (*traefikServiceSpecMirroringMirrorsStickyPtrType)(v)
}

func (*traefikServiceSpecMirroringMirrorsStickyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsSticky)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringMirrorsStickyPtrType) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutput() TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringMirrorsStickyPtrType) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsStickyPtrOutput)
}

func (i *traefikServiceSpecMirroringMirrorsStickyPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsSticky] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsSticky]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(ctx).OutputState,
	}
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecMirroringMirrorsStickyOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsStickyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsSticky)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsStickyOutput) ToTraefikServiceSpecMirroringMirrorsStickyOutput() TraefikServiceSpecMirroringMirrorsStickyOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyOutput) ToTraefikServiceSpecMirroringMirrorsStickyOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyOutput) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutput() TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return o.ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringMirrorsStickyOutput) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringMirrorsSticky) *TraefikServiceSpecMirroringMirrorsSticky {
		return &v
	}).(TraefikServiceSpecMirroringMirrorsStickyPtrOutput)
}

func (o TraefikServiceSpecMirroringMirrorsStickyOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsSticky] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsSticky]{
		OutputState: o.OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecMirroringMirrorsStickyOutput) Cookie() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsSticky) *TraefikServiceSpecMirroringMirrorsStickyCookie {
		return v.Cookie
	}).(TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput)
}

type TraefikServiceSpecMirroringMirrorsStickyPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsStickyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsSticky)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsStickyPtrOutput) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutput() TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyPtrOutput) ToTraefikServiceSpecMirroringMirrorsStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsSticky] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsSticky]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringMirrorsStickyPtrOutput) Elem() TraefikServiceSpecMirroringMirrorsStickyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsSticky) TraefikServiceSpecMirroringMirrorsSticky {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringMirrorsSticky
		return ret
	}).(TraefikServiceSpecMirroringMirrorsStickyOutput)
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecMirroringMirrorsStickyPtrOutput) Cookie() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsSticky) *TraefikServiceSpecMirroringMirrorsStickyCookie {
		if v == nil {
			return nil
		}
		return v.Cookie
	}).(TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput)
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecMirroringMirrorsStickyCookie struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly *bool `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge *int `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name *string `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite *string `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure *bool `pulumi:"secure"`
}

// TraefikServiceSpecMirroringMirrorsStickyCookieInput is an input type that accepts TraefikServiceSpecMirroringMirrorsStickyCookieArgs and TraefikServiceSpecMirroringMirrorsStickyCookieOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsStickyCookieInput` via:
//
//	TraefikServiceSpecMirroringMirrorsStickyCookieArgs{...}
type TraefikServiceSpecMirroringMirrorsStickyCookieInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsStickyCookieOutput() TraefikServiceSpecMirroringMirrorsStickyCookieOutput
	ToTraefikServiceSpecMirroringMirrorsStickyCookieOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsStickyCookieOutput
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecMirroringMirrorsStickyCookieArgs struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly pulumi.BoolPtrInput `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge pulumi.IntPtrInput `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name pulumi.StringPtrInput `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite pulumi.StringPtrInput `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure pulumi.BoolPtrInput `pulumi:"secure"`
}

func (TraefikServiceSpecMirroringMirrorsStickyCookieArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsStickyCookie)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringMirrorsStickyCookieArgs) ToTraefikServiceSpecMirroringMirrorsStickyCookieOutput() TraefikServiceSpecMirroringMirrorsStickyCookieOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsStickyCookieOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsStickyCookieArgs) ToTraefikServiceSpecMirroringMirrorsStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyCookieOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsStickyCookieOutput)
}

func (i TraefikServiceSpecMirroringMirrorsStickyCookieArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsStickyCookie] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsStickyCookie]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsStickyCookieOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringMirrorsStickyCookieArgs) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringMirrorsStickyCookieArgs) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsStickyCookieOutput).ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringMirrorsStickyCookiePtrInput is an input type that accepts TraefikServiceSpecMirroringMirrorsStickyCookieArgs, TraefikServiceSpecMirroringMirrorsStickyCookiePtr and TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringMirrorsStickyCookiePtrInput` via:
//
//	        TraefikServiceSpecMirroringMirrorsStickyCookieArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringMirrorsStickyCookiePtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput
	ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(context.Context) TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput
}

type traefikServiceSpecMirroringMirrorsStickyCookiePtrType TraefikServiceSpecMirroringMirrorsStickyCookieArgs

func TraefikServiceSpecMirroringMirrorsStickyCookiePtr(v *TraefikServiceSpecMirroringMirrorsStickyCookieArgs) TraefikServiceSpecMirroringMirrorsStickyCookiePtrInput {
	return (*traefikServiceSpecMirroringMirrorsStickyCookiePtrType)(v)
}

func (*traefikServiceSpecMirroringMirrorsStickyCookiePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsStickyCookie)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringMirrorsStickyCookiePtrType) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringMirrorsStickyCookiePtrType) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput)
}

func (i *traefikServiceSpecMirroringMirrorsStickyCookiePtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsStickyCookie]{
		OutputState: i.ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(ctx).OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecMirroringMirrorsStickyCookieOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsStickyCookieOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) ToTraefikServiceSpecMirroringMirrorsStickyCookieOutput() TraefikServiceSpecMirroringMirrorsStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) ToTraefikServiceSpecMirroringMirrorsStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return o.ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringMirrorsStickyCookie) *TraefikServiceSpecMirroringMirrorsStickyCookie {
		return &v
	}).(TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput)
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringMirrorsStickyCookie] {
	return pulumix.Output[TraefikServiceSpecMirroringMirrorsStickyCookie]{
		OutputState: o.OutputState,
	}
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsStickyCookie) *bool { return v.HttpOnly }).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsStickyCookie) *int { return v.MaxAge }).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsStickyCookie) *string { return v.Name }).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsStickyCookie) *string { return v.SameSite }).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecMirroringMirrorsStickyCookieOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringMirrorsStickyCookie) *bool { return v.Secure }).(pulumi.BoolPtrOutput)
}

type TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringMirrorsStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput() TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) ToTraefikServiceSpecMirroringMirrorsStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringMirrorsStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecMirroringMirrorsStickyCookie]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) Elem() TraefikServiceSpecMirroringMirrorsStickyCookieOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsStickyCookie) TraefikServiceSpecMirroringMirrorsStickyCookie {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringMirrorsStickyCookie
		return ret
	}).(TraefikServiceSpecMirroringMirrorsStickyCookieOutput)
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.HttpOnly
	}).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsStickyCookie) *int {
		if v == nil {
			return nil
		}
		return v.MaxAge
	}).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.Name
	}).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.SameSite
	}).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringMirrorsStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.Secure
	}).(pulumi.BoolPtrOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecMirroringResponseForwarding struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval *string `pulumi:"flushInterval"`
}

// TraefikServiceSpecMirroringResponseForwardingInput is an input type that accepts TraefikServiceSpecMirroringResponseForwardingArgs and TraefikServiceSpecMirroringResponseForwardingOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringResponseForwardingInput` via:
//
//	TraefikServiceSpecMirroringResponseForwardingArgs{...}
type TraefikServiceSpecMirroringResponseForwardingInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringResponseForwardingOutput() TraefikServiceSpecMirroringResponseForwardingOutput
	ToTraefikServiceSpecMirroringResponseForwardingOutputWithContext(context.Context) TraefikServiceSpecMirroringResponseForwardingOutput
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecMirroringResponseForwardingArgs struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval pulumi.StringPtrInput `pulumi:"flushInterval"`
}

func (TraefikServiceSpecMirroringResponseForwardingArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringResponseForwarding)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringResponseForwardingArgs) ToTraefikServiceSpecMirroringResponseForwardingOutput() TraefikServiceSpecMirroringResponseForwardingOutput {
	return i.ToTraefikServiceSpecMirroringResponseForwardingOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringResponseForwardingArgs) ToTraefikServiceSpecMirroringResponseForwardingOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringResponseForwardingOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringResponseForwardingOutput)
}

func (i TraefikServiceSpecMirroringResponseForwardingArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringResponseForwarding] {
	return pulumix.Output[TraefikServiceSpecMirroringResponseForwarding]{
		OutputState: i.ToTraefikServiceSpecMirroringResponseForwardingOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringResponseForwardingArgs) ToTraefikServiceSpecMirroringResponseForwardingPtrOutput() TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return i.ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringResponseForwardingArgs) ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringResponseForwardingOutput).ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringResponseForwardingPtrInput is an input type that accepts TraefikServiceSpecMirroringResponseForwardingArgs, TraefikServiceSpecMirroringResponseForwardingPtr and TraefikServiceSpecMirroringResponseForwardingPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringResponseForwardingPtrInput` via:
//
//	        TraefikServiceSpecMirroringResponseForwardingArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringResponseForwardingPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringResponseForwardingPtrOutput() TraefikServiceSpecMirroringResponseForwardingPtrOutput
	ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringResponseForwardingPtrOutput
}

type traefikServiceSpecMirroringResponseForwardingPtrType TraefikServiceSpecMirroringResponseForwardingArgs

func TraefikServiceSpecMirroringResponseForwardingPtr(v *TraefikServiceSpecMirroringResponseForwardingArgs) TraefikServiceSpecMirroringResponseForwardingPtrInput {
	return (*traefikServiceSpecMirroringResponseForwardingPtrType)(v)
}

func (*traefikServiceSpecMirroringResponseForwardingPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringResponseForwarding)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringResponseForwardingPtrType) ToTraefikServiceSpecMirroringResponseForwardingPtrOutput() TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return i.ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringResponseForwardingPtrType) ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringResponseForwardingPtrOutput)
}

func (i *traefikServiceSpecMirroringResponseForwardingPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringResponseForwarding] {
	return pulumix.Output[*TraefikServiceSpecMirroringResponseForwarding]{
		OutputState: i.ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(ctx).OutputState,
	}
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecMirroringResponseForwardingOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringResponseForwardingOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringResponseForwarding)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringResponseForwardingOutput) ToTraefikServiceSpecMirroringResponseForwardingOutput() TraefikServiceSpecMirroringResponseForwardingOutput {
	return o
}

func (o TraefikServiceSpecMirroringResponseForwardingOutput) ToTraefikServiceSpecMirroringResponseForwardingOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringResponseForwardingOutput {
	return o
}

func (o TraefikServiceSpecMirroringResponseForwardingOutput) ToTraefikServiceSpecMirroringResponseForwardingPtrOutput() TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return o.ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringResponseForwardingOutput) ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringResponseForwarding) *TraefikServiceSpecMirroringResponseForwarding {
		return &v
	}).(TraefikServiceSpecMirroringResponseForwardingPtrOutput)
}

func (o TraefikServiceSpecMirroringResponseForwardingOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringResponseForwarding] {
	return pulumix.Output[TraefikServiceSpecMirroringResponseForwarding]{
		OutputState: o.OutputState,
	}
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o TraefikServiceSpecMirroringResponseForwardingOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringResponseForwarding) *string { return v.FlushInterval }).(pulumi.StringPtrOutput)
}

type TraefikServiceSpecMirroringResponseForwardingPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringResponseForwardingPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringResponseForwarding)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringResponseForwardingPtrOutput) ToTraefikServiceSpecMirroringResponseForwardingPtrOutput() TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringResponseForwardingPtrOutput) ToTraefikServiceSpecMirroringResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringResponseForwardingPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringResponseForwardingPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringResponseForwarding] {
	return pulumix.Output[*TraefikServiceSpecMirroringResponseForwarding]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringResponseForwardingPtrOutput) Elem() TraefikServiceSpecMirroringResponseForwardingOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringResponseForwarding) TraefikServiceSpecMirroringResponseForwarding {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringResponseForwarding
		return ret
	}).(TraefikServiceSpecMirroringResponseForwardingOutput)
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o TraefikServiceSpecMirroringResponseForwardingPtrOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringResponseForwarding) *string {
		if v == nil {
			return nil
		}
		return v.FlushInterval
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecMirroringSticky struct {
	// Cookie defines the sticky cookie configuration.
	Cookie *TraefikServiceSpecMirroringStickyCookie `pulumi:"cookie"`
}

// TraefikServiceSpecMirroringStickyInput is an input type that accepts TraefikServiceSpecMirroringStickyArgs and TraefikServiceSpecMirroringStickyOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringStickyInput` via:
//
//	TraefikServiceSpecMirroringStickyArgs{...}
type TraefikServiceSpecMirroringStickyInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringStickyOutput() TraefikServiceSpecMirroringStickyOutput
	ToTraefikServiceSpecMirroringStickyOutputWithContext(context.Context) TraefikServiceSpecMirroringStickyOutput
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecMirroringStickyArgs struct {
	// Cookie defines the sticky cookie configuration.
	Cookie TraefikServiceSpecMirroringStickyCookiePtrInput `pulumi:"cookie"`
}

func (TraefikServiceSpecMirroringStickyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringSticky)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringStickyArgs) ToTraefikServiceSpecMirroringStickyOutput() TraefikServiceSpecMirroringStickyOutput {
	return i.ToTraefikServiceSpecMirroringStickyOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringStickyArgs) ToTraefikServiceSpecMirroringStickyOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringStickyOutput)
}

func (i TraefikServiceSpecMirroringStickyArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringSticky] {
	return pulumix.Output[TraefikServiceSpecMirroringSticky]{
		OutputState: i.ToTraefikServiceSpecMirroringStickyOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringStickyArgs) ToTraefikServiceSpecMirroringStickyPtrOutput() TraefikServiceSpecMirroringStickyPtrOutput {
	return i.ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringStickyArgs) ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringStickyOutput).ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringStickyPtrInput is an input type that accepts TraefikServiceSpecMirroringStickyArgs, TraefikServiceSpecMirroringStickyPtr and TraefikServiceSpecMirroringStickyPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringStickyPtrInput` via:
//
//	        TraefikServiceSpecMirroringStickyArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringStickyPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringStickyPtrOutput() TraefikServiceSpecMirroringStickyPtrOutput
	ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(context.Context) TraefikServiceSpecMirroringStickyPtrOutput
}

type traefikServiceSpecMirroringStickyPtrType TraefikServiceSpecMirroringStickyArgs

func TraefikServiceSpecMirroringStickyPtr(v *TraefikServiceSpecMirroringStickyArgs) TraefikServiceSpecMirroringStickyPtrInput {
	return (*traefikServiceSpecMirroringStickyPtrType)(v)
}

func (*traefikServiceSpecMirroringStickyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringSticky)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringStickyPtrType) ToTraefikServiceSpecMirroringStickyPtrOutput() TraefikServiceSpecMirroringStickyPtrOutput {
	return i.ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringStickyPtrType) ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringStickyPtrOutput)
}

func (i *traefikServiceSpecMirroringStickyPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringSticky] {
	return pulumix.Output[*TraefikServiceSpecMirroringSticky]{
		OutputState: i.ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(ctx).OutputState,
	}
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecMirroringStickyOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringStickyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringSticky)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringStickyOutput) ToTraefikServiceSpecMirroringStickyOutput() TraefikServiceSpecMirroringStickyOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyOutput) ToTraefikServiceSpecMirroringStickyOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyOutput) ToTraefikServiceSpecMirroringStickyPtrOutput() TraefikServiceSpecMirroringStickyPtrOutput {
	return o.ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringStickyOutput) ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringSticky) *TraefikServiceSpecMirroringSticky {
		return &v
	}).(TraefikServiceSpecMirroringStickyPtrOutput)
}

func (o TraefikServiceSpecMirroringStickyOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringSticky] {
	return pulumix.Output[TraefikServiceSpecMirroringSticky]{
		OutputState: o.OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecMirroringStickyOutput) Cookie() TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringSticky) *TraefikServiceSpecMirroringStickyCookie { return v.Cookie }).(TraefikServiceSpecMirroringStickyCookiePtrOutput)
}

type TraefikServiceSpecMirroringStickyPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringStickyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringSticky)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringStickyPtrOutput) ToTraefikServiceSpecMirroringStickyPtrOutput() TraefikServiceSpecMirroringStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyPtrOutput) ToTraefikServiceSpecMirroringStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringSticky] {
	return pulumix.Output[*TraefikServiceSpecMirroringSticky]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringStickyPtrOutput) Elem() TraefikServiceSpecMirroringStickyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringSticky) TraefikServiceSpecMirroringSticky {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringSticky
		return ret
	}).(TraefikServiceSpecMirroringStickyOutput)
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecMirroringStickyPtrOutput) Cookie() TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringSticky) *TraefikServiceSpecMirroringStickyCookie {
		if v == nil {
			return nil
		}
		return v.Cookie
	}).(TraefikServiceSpecMirroringStickyCookiePtrOutput)
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecMirroringStickyCookie struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly *bool `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge *int `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name *string `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite *string `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure *bool `pulumi:"secure"`
}

// TraefikServiceSpecMirroringStickyCookieInput is an input type that accepts TraefikServiceSpecMirroringStickyCookieArgs and TraefikServiceSpecMirroringStickyCookieOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringStickyCookieInput` via:
//
//	TraefikServiceSpecMirroringStickyCookieArgs{...}
type TraefikServiceSpecMirroringStickyCookieInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringStickyCookieOutput() TraefikServiceSpecMirroringStickyCookieOutput
	ToTraefikServiceSpecMirroringStickyCookieOutputWithContext(context.Context) TraefikServiceSpecMirroringStickyCookieOutput
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecMirroringStickyCookieArgs struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly pulumi.BoolPtrInput `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge pulumi.IntPtrInput `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name pulumi.StringPtrInput `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite pulumi.StringPtrInput `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure pulumi.BoolPtrInput `pulumi:"secure"`
}

func (TraefikServiceSpecMirroringStickyCookieArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringStickyCookie)(nil)).Elem()
}

func (i TraefikServiceSpecMirroringStickyCookieArgs) ToTraefikServiceSpecMirroringStickyCookieOutput() TraefikServiceSpecMirroringStickyCookieOutput {
	return i.ToTraefikServiceSpecMirroringStickyCookieOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringStickyCookieArgs) ToTraefikServiceSpecMirroringStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyCookieOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringStickyCookieOutput)
}

func (i TraefikServiceSpecMirroringStickyCookieArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringStickyCookie] {
	return pulumix.Output[TraefikServiceSpecMirroringStickyCookie]{
		OutputState: i.ToTraefikServiceSpecMirroringStickyCookieOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecMirroringStickyCookieArgs) ToTraefikServiceSpecMirroringStickyCookiePtrOutput() TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecMirroringStickyCookieArgs) ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringStickyCookieOutput).ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(ctx)
}

// TraefikServiceSpecMirroringStickyCookiePtrInput is an input type that accepts TraefikServiceSpecMirroringStickyCookieArgs, TraefikServiceSpecMirroringStickyCookiePtr and TraefikServiceSpecMirroringStickyCookiePtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecMirroringStickyCookiePtrInput` via:
//
//	        TraefikServiceSpecMirroringStickyCookieArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecMirroringStickyCookiePtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecMirroringStickyCookiePtrOutput() TraefikServiceSpecMirroringStickyCookiePtrOutput
	ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(context.Context) TraefikServiceSpecMirroringStickyCookiePtrOutput
}

type traefikServiceSpecMirroringStickyCookiePtrType TraefikServiceSpecMirroringStickyCookieArgs

func TraefikServiceSpecMirroringStickyCookiePtr(v *TraefikServiceSpecMirroringStickyCookieArgs) TraefikServiceSpecMirroringStickyCookiePtrInput {
	return (*traefikServiceSpecMirroringStickyCookiePtrType)(v)
}

func (*traefikServiceSpecMirroringStickyCookiePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringStickyCookie)(nil)).Elem()
}

func (i *traefikServiceSpecMirroringStickyCookiePtrType) ToTraefikServiceSpecMirroringStickyCookiePtrOutput() TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecMirroringStickyCookiePtrType) ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecMirroringStickyCookiePtrOutput)
}

func (i *traefikServiceSpecMirroringStickyCookiePtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecMirroringStickyCookie]{
		OutputState: i.ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(ctx).OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecMirroringStickyCookieOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringStickyCookieOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecMirroringStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringStickyCookieOutput) ToTraefikServiceSpecMirroringStickyCookieOutput() TraefikServiceSpecMirroringStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyCookieOutput) ToTraefikServiceSpecMirroringStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyCookieOutput) ToTraefikServiceSpecMirroringStickyCookiePtrOutput() TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return o.ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecMirroringStickyCookieOutput) ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecMirroringStickyCookie) *TraefikServiceSpecMirroringStickyCookie {
		return &v
	}).(TraefikServiceSpecMirroringStickyCookiePtrOutput)
}

func (o TraefikServiceSpecMirroringStickyCookieOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecMirroringStickyCookie] {
	return pulumix.Output[TraefikServiceSpecMirroringStickyCookie]{
		OutputState: o.OutputState,
	}
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecMirroringStickyCookieOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringStickyCookie) *bool { return v.HttpOnly }).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecMirroringStickyCookieOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringStickyCookie) *int { return v.MaxAge }).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecMirroringStickyCookieOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringStickyCookie) *string { return v.Name }).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecMirroringStickyCookieOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringStickyCookie) *string { return v.SameSite }).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecMirroringStickyCookieOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecMirroringStickyCookie) *bool { return v.Secure }).(pulumi.BoolPtrOutput)
}

type TraefikServiceSpecMirroringStickyCookiePtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecMirroringStickyCookiePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecMirroringStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) ToTraefikServiceSpecMirroringStickyCookiePtrOutput() TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) ToTraefikServiceSpecMirroringStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecMirroringStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecMirroringStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecMirroringStickyCookie]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) Elem() TraefikServiceSpecMirroringStickyCookieOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringStickyCookie) TraefikServiceSpecMirroringStickyCookie {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecMirroringStickyCookie
		return ret
	}).(TraefikServiceSpecMirroringStickyCookieOutput)
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.HttpOnly
	}).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringStickyCookie) *int {
		if v == nil {
			return nil
		}
		return v.MaxAge
	}).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.Name
	}).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.SameSite
	}).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecMirroringStickyCookiePtrOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecMirroringStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.Secure
	}).(pulumi.BoolPtrOutput)
}

// Weighted defines the Weighted Round Robin configuration.
type TraefikServiceSpecWeighted struct {
	// Services defines the list of Kubernetes Service and/or TraefikService to load-balance, with weight.
	Services []TraefikServiceSpecWeightedServices `pulumi:"services"`
	// Sticky defines whether sticky sessions are enabled.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
	Sticky *TraefikServiceSpecWeightedSticky `pulumi:"sticky"`
}

// TraefikServiceSpecWeightedInput is an input type that accepts TraefikServiceSpecWeightedArgs and TraefikServiceSpecWeightedOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedInput` via:
//
//	TraefikServiceSpecWeightedArgs{...}
type TraefikServiceSpecWeightedInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedOutput() TraefikServiceSpecWeightedOutput
	ToTraefikServiceSpecWeightedOutputWithContext(context.Context) TraefikServiceSpecWeightedOutput
}

// Weighted defines the Weighted Round Robin configuration.
type TraefikServiceSpecWeightedArgs struct {
	// Services defines the list of Kubernetes Service and/or TraefikService to load-balance, with weight.
	Services TraefikServiceSpecWeightedServicesArrayInput `pulumi:"services"`
	// Sticky defines whether sticky sessions are enabled.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
	Sticky TraefikServiceSpecWeightedStickyPtrInput `pulumi:"sticky"`
}

func (TraefikServiceSpecWeightedArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeighted)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedArgs) ToTraefikServiceSpecWeightedOutput() TraefikServiceSpecWeightedOutput {
	return i.ToTraefikServiceSpecWeightedOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedArgs) ToTraefikServiceSpecWeightedOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedOutput)
}

func (i TraefikServiceSpecWeightedArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeighted] {
	return pulumix.Output[TraefikServiceSpecWeighted]{
		OutputState: i.ToTraefikServiceSpecWeightedOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedArgs) ToTraefikServiceSpecWeightedPtrOutput() TraefikServiceSpecWeightedPtrOutput {
	return i.ToTraefikServiceSpecWeightedPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedArgs) ToTraefikServiceSpecWeightedPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedOutput).ToTraefikServiceSpecWeightedPtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedPtrInput is an input type that accepts TraefikServiceSpecWeightedArgs, TraefikServiceSpecWeightedPtr and TraefikServiceSpecWeightedPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedPtrInput` via:
//
//	        TraefikServiceSpecWeightedArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedPtrOutput() TraefikServiceSpecWeightedPtrOutput
	ToTraefikServiceSpecWeightedPtrOutputWithContext(context.Context) TraefikServiceSpecWeightedPtrOutput
}

type traefikServiceSpecWeightedPtrType TraefikServiceSpecWeightedArgs

func TraefikServiceSpecWeightedPtr(v *TraefikServiceSpecWeightedArgs) TraefikServiceSpecWeightedPtrInput {
	return (*traefikServiceSpecWeightedPtrType)(v)
}

func (*traefikServiceSpecWeightedPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeighted)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedPtrType) ToTraefikServiceSpecWeightedPtrOutput() TraefikServiceSpecWeightedPtrOutput {
	return i.ToTraefikServiceSpecWeightedPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedPtrType) ToTraefikServiceSpecWeightedPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedPtrOutput)
}

func (i *traefikServiceSpecWeightedPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeighted] {
	return pulumix.Output[*TraefikServiceSpecWeighted]{
		OutputState: i.ToTraefikServiceSpecWeightedPtrOutputWithContext(ctx).OutputState,
	}
}

// Weighted defines the Weighted Round Robin configuration.
type TraefikServiceSpecWeightedOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeighted)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedOutput) ToTraefikServiceSpecWeightedOutput() TraefikServiceSpecWeightedOutput {
	return o
}

func (o TraefikServiceSpecWeightedOutput) ToTraefikServiceSpecWeightedOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedOutput {
	return o
}

func (o TraefikServiceSpecWeightedOutput) ToTraefikServiceSpecWeightedPtrOutput() TraefikServiceSpecWeightedPtrOutput {
	return o.ToTraefikServiceSpecWeightedPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedOutput) ToTraefikServiceSpecWeightedPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeighted) *TraefikServiceSpecWeighted {
		return &v
	}).(TraefikServiceSpecWeightedPtrOutput)
}

func (o TraefikServiceSpecWeightedOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeighted] {
	return pulumix.Output[TraefikServiceSpecWeighted]{
		OutputState: o.OutputState,
	}
}

// Services defines the list of Kubernetes Service and/or TraefikService to load-balance, with weight.
func (o TraefikServiceSpecWeightedOutput) Services() TraefikServiceSpecWeightedServicesArrayOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeighted) []TraefikServiceSpecWeightedServices { return v.Services }).(TraefikServiceSpecWeightedServicesArrayOutput)
}

// Sticky defines whether sticky sessions are enabled.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
func (o TraefikServiceSpecWeightedOutput) Sticky() TraefikServiceSpecWeightedStickyPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeighted) *TraefikServiceSpecWeightedSticky { return v.Sticky }).(TraefikServiceSpecWeightedStickyPtrOutput)
}

type TraefikServiceSpecWeightedPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeighted)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedPtrOutput) ToTraefikServiceSpecWeightedPtrOutput() TraefikServiceSpecWeightedPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedPtrOutput) ToTraefikServiceSpecWeightedPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeighted] {
	return pulumix.Output[*TraefikServiceSpecWeighted]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedPtrOutput) Elem() TraefikServiceSpecWeightedOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeighted) TraefikServiceSpecWeighted {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeighted
		return ret
	}).(TraefikServiceSpecWeightedOutput)
}

// Services defines the list of Kubernetes Service and/or TraefikService to load-balance, with weight.
func (o TraefikServiceSpecWeightedPtrOutput) Services() TraefikServiceSpecWeightedServicesArrayOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeighted) []TraefikServiceSpecWeightedServices {
		if v == nil {
			return nil
		}
		return v.Services
	}).(TraefikServiceSpecWeightedServicesArrayOutput)
}

// Sticky defines whether sticky sessions are enabled.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
func (o TraefikServiceSpecWeightedPtrOutput) Sticky() TraefikServiceSpecWeightedStickyPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeighted) *TraefikServiceSpecWeightedSticky {
		if v == nil {
			return nil
		}
		return v.Sticky
	}).(TraefikServiceSpecWeightedStickyPtrOutput)
}

// Service defines an upstream HTTP service to proxy traffic to.
type TraefikServiceSpecWeightedServices struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck *TraefikServiceSpecWeightedServicesHealthCheck `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind *string `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name string `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace *string `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB *bool `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB *bool `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader *bool `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port interface{} `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding *TraefikServiceSpecWeightedServicesResponseForwarding `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme *string `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport *string `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky *TraefikServiceSpecWeightedServicesSticky `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy *string `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight *int `pulumi:"weight"`
}

// TraefikServiceSpecWeightedServicesInput is an input type that accepts TraefikServiceSpecWeightedServicesArgs and TraefikServiceSpecWeightedServicesOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesInput` via:
//
//	TraefikServiceSpecWeightedServicesArgs{...}
type TraefikServiceSpecWeightedServicesInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesOutput() TraefikServiceSpecWeightedServicesOutput
	ToTraefikServiceSpecWeightedServicesOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesOutput
}

// Service defines an upstream HTTP service to proxy traffic to.
type TraefikServiceSpecWeightedServicesArgs struct {
	// Healthcheck defines health checks for ExternalName services.
	HealthCheck TraefikServiceSpecWeightedServicesHealthCheckPtrInput `pulumi:"healthCheck"`
	// Kind defines the kind of the Service.
	Kind pulumi.StringPtrInput `pulumi:"kind"`
	// Name defines the name of the referenced Kubernetes Service or TraefikService.
	// The differentiation between the two is specified in the Kind field.
	Name pulumi.StringInput `pulumi:"name"`
	// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
	Namespace pulumi.StringPtrInput `pulumi:"namespace"`
	// NativeLB controls, when creating the load-balancer,
	// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
	// The Kubernetes Service itself does load-balance to the pods.
	// By default, NativeLB is false.
	NativeLB pulumi.BoolPtrInput `pulumi:"nativeLB"`
	// NodePortLB controls, when creating the load-balancer,
	// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
	// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
	// By default, NodePortLB is false.
	NodePortLB pulumi.BoolPtrInput `pulumi:"nodePortLB"`
	// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
	// By default, passHostHeader is true.
	PassHostHeader pulumi.BoolPtrInput `pulumi:"passHostHeader"`
	// Port defines the port of a Kubernetes Service.
	// This can be a reference to a named port.
	Port pulumi.Input `pulumi:"port"`
	// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
	ResponseForwarding TraefikServiceSpecWeightedServicesResponseForwardingPtrInput `pulumi:"responseForwarding"`
	// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
	// It defaults to https when Kubernetes Service port is 443, http otherwise.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// ServersTransport defines the name of ServersTransport resource to use.
	// It allows to configure the transport between Traefik and your servers.
	// Can only be used on a Kubernetes Service.
	ServersTransport pulumi.StringPtrInput `pulumi:"serversTransport"`
	// Sticky defines the sticky sessions configuration.
	// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
	Sticky TraefikServiceSpecWeightedServicesStickyPtrInput `pulumi:"sticky"`
	// Strategy defines the load balancing strategy between the servers.
	// RoundRobin is the only supported value at the moment.
	Strategy pulumi.StringPtrInput `pulumi:"strategy"`
	// Weight defines the weight and should only be specified when Name references a TraefikService object
	// (and to be precise, one that embeds a Weighted Round Robin).
	Weight pulumi.IntPtrInput `pulumi:"weight"`
}

func (TraefikServiceSpecWeightedServicesArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServices)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedServicesArgs) ToTraefikServiceSpecWeightedServicesOutput() TraefikServiceSpecWeightedServicesOutput {
	return i.ToTraefikServiceSpecWeightedServicesOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesArgs) ToTraefikServiceSpecWeightedServicesOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesOutput)
}

func (i TraefikServiceSpecWeightedServicesArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServices] {
	return pulumix.Output[TraefikServiceSpecWeightedServices]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesOutputWithContext(ctx).OutputState,
	}
}

// TraefikServiceSpecWeightedServicesArrayInput is an input type that accepts TraefikServiceSpecWeightedServicesArray and TraefikServiceSpecWeightedServicesArrayOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesArrayInput` via:
//
//	TraefikServiceSpecWeightedServicesArray{ TraefikServiceSpecWeightedServicesArgs{...} }
type TraefikServiceSpecWeightedServicesArrayInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesArrayOutput() TraefikServiceSpecWeightedServicesArrayOutput
	ToTraefikServiceSpecWeightedServicesArrayOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesArrayOutput
}

type TraefikServiceSpecWeightedServicesArray []TraefikServiceSpecWeightedServicesInput

func (TraefikServiceSpecWeightedServicesArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]TraefikServiceSpecWeightedServices)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedServicesArray) ToTraefikServiceSpecWeightedServicesArrayOutput() TraefikServiceSpecWeightedServicesArrayOutput {
	return i.ToTraefikServiceSpecWeightedServicesArrayOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesArray) ToTraefikServiceSpecWeightedServicesArrayOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesArrayOutput)
}

func (i TraefikServiceSpecWeightedServicesArray) ToOutput(ctx context.Context) pulumix.Output[[]TraefikServiceSpecWeightedServices] {
	return pulumix.Output[[]TraefikServiceSpecWeightedServices]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesArrayOutputWithContext(ctx).OutputState,
	}
}

// Service defines an upstream HTTP service to proxy traffic to.
type TraefikServiceSpecWeightedServicesOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServices)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesOutput) ToTraefikServiceSpecWeightedServicesOutput() TraefikServiceSpecWeightedServicesOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesOutput) ToTraefikServiceSpecWeightedServicesOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServices] {
	return pulumix.Output[TraefikServiceSpecWeightedServices]{
		OutputState: o.OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
func (o TraefikServiceSpecWeightedServicesOutput) HealthCheck() TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *TraefikServiceSpecWeightedServicesHealthCheck {
		return v.HealthCheck
	}).(TraefikServiceSpecWeightedServicesHealthCheckPtrOutput)
}

// Kind defines the kind of the Service.
func (o TraefikServiceSpecWeightedServicesOutput) Kind() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *string { return v.Kind }).(pulumi.StringPtrOutput)
}

// Name defines the name of the referenced Kubernetes Service or TraefikService.
// The differentiation between the two is specified in the Kind field.
func (o TraefikServiceSpecWeightedServicesOutput) Name() pulumi.StringOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) string { return v.Name }).(pulumi.StringOutput)
}

// Namespace defines the namespace of the referenced Kubernetes Service or TraefikService.
func (o TraefikServiceSpecWeightedServicesOutput) Namespace() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *string { return v.Namespace }).(pulumi.StringPtrOutput)
}

// NativeLB controls, when creating the load-balancer,
// whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP.
// The Kubernetes Service itself does load-balance to the pods.
// By default, NativeLB is false.
func (o TraefikServiceSpecWeightedServicesOutput) NativeLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *bool { return v.NativeLB }).(pulumi.BoolPtrOutput)
}

// NodePortLB controls, when creating the load-balancer,
// whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort.
// It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
// By default, NodePortLB is false.
func (o TraefikServiceSpecWeightedServicesOutput) NodePortLB() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *bool { return v.NodePortLB }).(pulumi.BoolPtrOutput)
}

// PassHostHeader defines whether the client Host header is forwarded to the upstream Kubernetes Service.
// By default, passHostHeader is true.
func (o TraefikServiceSpecWeightedServicesOutput) PassHostHeader() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *bool { return v.PassHostHeader }).(pulumi.BoolPtrOutput)
}

// Port defines the port of a Kubernetes Service.
// This can be a reference to a named port.
func (o TraefikServiceSpecWeightedServicesOutput) Port() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) interface{} { return v.Port }).(pulumi.AnyOutput)
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
func (o TraefikServiceSpecWeightedServicesOutput) ResponseForwarding() TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *TraefikServiceSpecWeightedServicesResponseForwarding {
		return v.ResponseForwarding
	}).(TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput)
}

// Scheme defines the scheme to use for the request to the upstream Kubernetes Service.
// It defaults to https when Kubernetes Service port is 443, http otherwise.
func (o TraefikServiceSpecWeightedServicesOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// ServersTransport defines the name of ServersTransport resource to use.
// It allows to configure the transport between Traefik and your servers.
// Can only be used on a Kubernetes Service.
func (o TraefikServiceSpecWeightedServicesOutput) ServersTransport() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *string { return v.ServersTransport }).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
func (o TraefikServiceSpecWeightedServicesOutput) Sticky() TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *TraefikServiceSpecWeightedServicesSticky { return v.Sticky }).(TraefikServiceSpecWeightedServicesStickyPtrOutput)
}

// Strategy defines the load balancing strategy between the servers.
// RoundRobin is the only supported value at the moment.
func (o TraefikServiceSpecWeightedServicesOutput) Strategy() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *string { return v.Strategy }).(pulumi.StringPtrOutput)
}

// Weight defines the weight and should only be specified when Name references a TraefikService object
// (and to be precise, one that embeds a Weighted Round Robin).
func (o TraefikServiceSpecWeightedServicesOutput) Weight() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServices) *int { return v.Weight }).(pulumi.IntPtrOutput)
}

type TraefikServiceSpecWeightedServicesArrayOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]TraefikServiceSpecWeightedServices)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesArrayOutput) ToTraefikServiceSpecWeightedServicesArrayOutput() TraefikServiceSpecWeightedServicesArrayOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesArrayOutput) ToTraefikServiceSpecWeightedServicesArrayOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesArrayOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]TraefikServiceSpecWeightedServices] {
	return pulumix.Output[[]TraefikServiceSpecWeightedServices]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedServicesArrayOutput) Index(i pulumi.IntInput) TraefikServiceSpecWeightedServicesOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) TraefikServiceSpecWeightedServices {
		return vs[0].([]TraefikServiceSpecWeightedServices)[vs[1].(int)]
	}).(TraefikServiceSpecWeightedServicesOutput)
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecWeightedServicesHealthCheck struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects *bool `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers map[string]string `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname *string `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval interface{} `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method *string `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode *string `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path *string `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port *int `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme *string `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status *int `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout interface{} `pulumi:"timeout"`
}

// TraefikServiceSpecWeightedServicesHealthCheckInput is an input type that accepts TraefikServiceSpecWeightedServicesHealthCheckArgs and TraefikServiceSpecWeightedServicesHealthCheckOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesHealthCheckInput` via:
//
//	TraefikServiceSpecWeightedServicesHealthCheckArgs{...}
type TraefikServiceSpecWeightedServicesHealthCheckInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesHealthCheckOutput() TraefikServiceSpecWeightedServicesHealthCheckOutput
	ToTraefikServiceSpecWeightedServicesHealthCheckOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesHealthCheckOutput
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecWeightedServicesHealthCheckArgs struct {
	// FollowRedirects defines whether redirects should be followed during the health check calls.
	// Default: true
	FollowRedirects pulumi.BoolPtrInput `pulumi:"followRedirects"`
	// Headers defines custom headers to be sent to the health check endpoint.
	Headers pulumi.StringMapInput `pulumi:"headers"`
	// Hostname defines the value of hostname in the Host header of the health check request.
	Hostname pulumi.StringPtrInput `pulumi:"hostname"`
	// Interval defines the frequency of the health check calls.
	// Default: 30s
	Interval pulumi.Input `pulumi:"interval"`
	// Method defines the healthcheck method.
	Method pulumi.StringPtrInput `pulumi:"method"`
	// Mode defines the health check mode.
	// If defined to grpc, will use the gRPC health check protocol to probe the server.
	// Default: http
	Mode pulumi.StringPtrInput `pulumi:"mode"`
	// Path defines the server URL path for the health check endpoint.
	Path pulumi.StringPtrInput `pulumi:"path"`
	// Port defines the server URL port for the health check endpoint.
	Port pulumi.IntPtrInput `pulumi:"port"`
	// Scheme replaces the server URL scheme for the health check endpoint.
	Scheme pulumi.StringPtrInput `pulumi:"scheme"`
	// Status defines the expected HTTP status code of the response to the health check request.
	Status pulumi.IntPtrInput `pulumi:"status"`
	// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
	// Default: 5s
	Timeout pulumi.Input `pulumi:"timeout"`
}

func (TraefikServiceSpecWeightedServicesHealthCheckArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesHealthCheck)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedServicesHealthCheckArgs) ToTraefikServiceSpecWeightedServicesHealthCheckOutput() TraefikServiceSpecWeightedServicesHealthCheckOutput {
	return i.ToTraefikServiceSpecWeightedServicesHealthCheckOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesHealthCheckArgs) ToTraefikServiceSpecWeightedServicesHealthCheckOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesHealthCheckOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesHealthCheckOutput)
}

func (i TraefikServiceSpecWeightedServicesHealthCheckArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesHealthCheck] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesHealthCheck]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesHealthCheckOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedServicesHealthCheckArgs) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutput() TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesHealthCheckArgs) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesHealthCheckOutput).ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedServicesHealthCheckPtrInput is an input type that accepts TraefikServiceSpecWeightedServicesHealthCheckArgs, TraefikServiceSpecWeightedServicesHealthCheckPtr and TraefikServiceSpecWeightedServicesHealthCheckPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesHealthCheckPtrInput` via:
//
//	        TraefikServiceSpecWeightedServicesHealthCheckArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedServicesHealthCheckPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutput() TraefikServiceSpecWeightedServicesHealthCheckPtrOutput
	ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesHealthCheckPtrOutput
}

type traefikServiceSpecWeightedServicesHealthCheckPtrType TraefikServiceSpecWeightedServicesHealthCheckArgs

func TraefikServiceSpecWeightedServicesHealthCheckPtr(v *TraefikServiceSpecWeightedServicesHealthCheckArgs) TraefikServiceSpecWeightedServicesHealthCheckPtrInput {
	return (*traefikServiceSpecWeightedServicesHealthCheckPtrType)(v)
}

func (*traefikServiceSpecWeightedServicesHealthCheckPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesHealthCheck)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedServicesHealthCheckPtrType) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutput() TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedServicesHealthCheckPtrType) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesHealthCheckPtrOutput)
}

func (i *traefikServiceSpecWeightedServicesHealthCheckPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesHealthCheck] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesHealthCheck]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(ctx).OutputState,
	}
}

// Healthcheck defines health checks for ExternalName services.
type TraefikServiceSpecWeightedServicesHealthCheckOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesHealthCheckOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesHealthCheck)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) ToTraefikServiceSpecWeightedServicesHealthCheckOutput() TraefikServiceSpecWeightedServicesHealthCheckOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) ToTraefikServiceSpecWeightedServicesHealthCheckOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesHealthCheckOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutput() TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return o.ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeightedServicesHealthCheck) *TraefikServiceSpecWeightedServicesHealthCheck {
		return &v
	}).(TraefikServiceSpecWeightedServicesHealthCheckPtrOutput)
}

func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesHealthCheck] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesHealthCheck]{
		OutputState: o.OutputState,
	}
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *bool { return v.FollowRedirects }).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) map[string]string { return v.Headers }).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *string { return v.Hostname }).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) interface{} { return v.Interval }).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *string { return v.Method }).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *string { return v.Mode }).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *string { return v.Path }).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *int { return v.Port }).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *string { return v.Scheme }).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) *int { return v.Status }).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o TraefikServiceSpecWeightedServicesHealthCheckOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesHealthCheck) interface{} { return v.Timeout }).(pulumi.AnyOutput)
}

type TraefikServiceSpecWeightedServicesHealthCheckPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesHealthCheck)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutput() TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) ToTraefikServiceSpecWeightedServicesHealthCheckPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesHealthCheckPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesHealthCheck] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesHealthCheck]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Elem() TraefikServiceSpecWeightedServicesHealthCheckOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) TraefikServiceSpecWeightedServicesHealthCheck {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeightedServicesHealthCheck
		return ret
	}).(TraefikServiceSpecWeightedServicesHealthCheckOutput)
}

// FollowRedirects defines whether redirects should be followed during the health check calls.
// Default: true
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) FollowRedirects() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *bool {
		if v == nil {
			return nil
		}
		return v.FollowRedirects
	}).(pulumi.BoolPtrOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Headers() pulumi.StringMapOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) map[string]string {
		if v == nil {
			return nil
		}
		return v.Headers
	}).(pulumi.StringMapOutput)
}

// Hostname defines the value of hostname in the Host header of the health check request.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Hostname() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Hostname
	}).(pulumi.StringPtrOutput)
}

// Interval defines the frequency of the health check calls.
// Default: 30s
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Interval() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Interval
	}).(pulumi.AnyOutput)
}

// Method defines the healthcheck method.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Method() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Method
	}).(pulumi.StringPtrOutput)
}

// Mode defines the health check mode.
// If defined to grpc, will use the gRPC health check protocol to probe the server.
// Default: http
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Mode() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Mode
	}).(pulumi.StringPtrOutput)
}

// Path defines the server URL path for the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Path() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Path
	}).(pulumi.StringPtrOutput)
}

// Port defines the server URL port for the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Port() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Port
	}).(pulumi.IntPtrOutput)
}

// Scheme replaces the server URL scheme for the health check endpoint.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Scheme() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *string {
		if v == nil {
			return nil
		}
		return v.Scheme
	}).(pulumi.StringPtrOutput)
}

// Status defines the expected HTTP status code of the response to the health check request.
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Status() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) *int {
		if v == nil {
			return nil
		}
		return v.Status
	}).(pulumi.IntPtrOutput)
}

// Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy.
// Default: 5s
func (o TraefikServiceSpecWeightedServicesHealthCheckPtrOutput) Timeout() pulumi.AnyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesHealthCheck) interface{} {
		if v == nil {
			return nil
		}
		return v.Timeout
	}).(pulumi.AnyOutput)
}

// Headers defines custom headers to be sent to the health check endpoint.
type TraefikServiceSpecWeightedServicesHealthCheckHeaders struct {
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecWeightedServicesResponseForwarding struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval *string `pulumi:"flushInterval"`
}

// TraefikServiceSpecWeightedServicesResponseForwardingInput is an input type that accepts TraefikServiceSpecWeightedServicesResponseForwardingArgs and TraefikServiceSpecWeightedServicesResponseForwardingOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesResponseForwardingInput` via:
//
//	TraefikServiceSpecWeightedServicesResponseForwardingArgs{...}
type TraefikServiceSpecWeightedServicesResponseForwardingInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesResponseForwardingOutput() TraefikServiceSpecWeightedServicesResponseForwardingOutput
	ToTraefikServiceSpecWeightedServicesResponseForwardingOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesResponseForwardingOutput
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecWeightedServicesResponseForwardingArgs struct {
	// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
	// A negative value means to flush immediately after each write to the client.
	// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
	// for such responses, writes are flushed to the client immediately.
	// Default: 100ms
	FlushInterval pulumi.StringPtrInput `pulumi:"flushInterval"`
}

func (TraefikServiceSpecWeightedServicesResponseForwardingArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesResponseForwarding)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedServicesResponseForwardingArgs) ToTraefikServiceSpecWeightedServicesResponseForwardingOutput() TraefikServiceSpecWeightedServicesResponseForwardingOutput {
	return i.ToTraefikServiceSpecWeightedServicesResponseForwardingOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesResponseForwardingArgs) ToTraefikServiceSpecWeightedServicesResponseForwardingOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesResponseForwardingOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesResponseForwardingOutput)
}

func (i TraefikServiceSpecWeightedServicesResponseForwardingArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesResponseForwarding] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesResponseForwarding]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesResponseForwardingOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedServicesResponseForwardingArgs) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutput() TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesResponseForwardingArgs) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesResponseForwardingOutput).ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedServicesResponseForwardingPtrInput is an input type that accepts TraefikServiceSpecWeightedServicesResponseForwardingArgs, TraefikServiceSpecWeightedServicesResponseForwardingPtr and TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesResponseForwardingPtrInput` via:
//
//	        TraefikServiceSpecWeightedServicesResponseForwardingArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedServicesResponseForwardingPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutput() TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput
	ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput
}

type traefikServiceSpecWeightedServicesResponseForwardingPtrType TraefikServiceSpecWeightedServicesResponseForwardingArgs

func TraefikServiceSpecWeightedServicesResponseForwardingPtr(v *TraefikServiceSpecWeightedServicesResponseForwardingArgs) TraefikServiceSpecWeightedServicesResponseForwardingPtrInput {
	return (*traefikServiceSpecWeightedServicesResponseForwardingPtrType)(v)
}

func (*traefikServiceSpecWeightedServicesResponseForwardingPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesResponseForwarding)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedServicesResponseForwardingPtrType) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutput() TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedServicesResponseForwardingPtrType) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput)
}

func (i *traefikServiceSpecWeightedServicesResponseForwardingPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesResponseForwarding] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesResponseForwarding]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(ctx).OutputState,
	}
}

// ResponseForwarding defines how Traefik forwards the response from the upstream Kubernetes Service to the client.
type TraefikServiceSpecWeightedServicesResponseForwardingOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesResponseForwardingOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesResponseForwarding)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingOutput) ToTraefikServiceSpecWeightedServicesResponseForwardingOutput() TraefikServiceSpecWeightedServicesResponseForwardingOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingOutput) ToTraefikServiceSpecWeightedServicesResponseForwardingOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesResponseForwardingOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingOutput) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutput() TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return o.ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingOutput) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeightedServicesResponseForwarding) *TraefikServiceSpecWeightedServicesResponseForwarding {
		return &v
	}).(TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput)
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesResponseForwarding] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesResponseForwarding]{
		OutputState: o.OutputState,
	}
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o TraefikServiceSpecWeightedServicesResponseForwardingOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesResponseForwarding) *string { return v.FlushInterval }).(pulumi.StringPtrOutput)
}

type TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesResponseForwarding)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutput() TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput) ToTraefikServiceSpecWeightedServicesResponseForwardingPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesResponseForwarding] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesResponseForwarding]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput) Elem() TraefikServiceSpecWeightedServicesResponseForwardingOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesResponseForwarding) TraefikServiceSpecWeightedServicesResponseForwarding {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeightedServicesResponseForwarding
		return ret
	}).(TraefikServiceSpecWeightedServicesResponseForwardingOutput)
}

// FlushInterval defines the interval, in milliseconds, in between flushes to the client while copying the response body.
// A negative value means to flush immediately after each write to the client.
// This configuration is ignored when ReverseProxy recognizes a response as a streaming response;
// for such responses, writes are flushed to the client immediately.
// Default: 100ms
func (o TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput) FlushInterval() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesResponseForwarding) *string {
		if v == nil {
			return nil
		}
		return v.FlushInterval
	}).(pulumi.StringPtrOutput)
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecWeightedServicesSticky struct {
	// Cookie defines the sticky cookie configuration.
	Cookie *TraefikServiceSpecWeightedServicesStickyCookie `pulumi:"cookie"`
}

// TraefikServiceSpecWeightedServicesStickyInput is an input type that accepts TraefikServiceSpecWeightedServicesStickyArgs and TraefikServiceSpecWeightedServicesStickyOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesStickyInput` via:
//
//	TraefikServiceSpecWeightedServicesStickyArgs{...}
type TraefikServiceSpecWeightedServicesStickyInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesStickyOutput() TraefikServiceSpecWeightedServicesStickyOutput
	ToTraefikServiceSpecWeightedServicesStickyOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesStickyOutput
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecWeightedServicesStickyArgs struct {
	// Cookie defines the sticky cookie configuration.
	Cookie TraefikServiceSpecWeightedServicesStickyCookiePtrInput `pulumi:"cookie"`
}

func (TraefikServiceSpecWeightedServicesStickyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesSticky)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedServicesStickyArgs) ToTraefikServiceSpecWeightedServicesStickyOutput() TraefikServiceSpecWeightedServicesStickyOutput {
	return i.ToTraefikServiceSpecWeightedServicesStickyOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesStickyArgs) ToTraefikServiceSpecWeightedServicesStickyOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesStickyOutput)
}

func (i TraefikServiceSpecWeightedServicesStickyArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesSticky] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesSticky]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesStickyOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedServicesStickyArgs) ToTraefikServiceSpecWeightedServicesStickyPtrOutput() TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesStickyArgs) ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesStickyOutput).ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedServicesStickyPtrInput is an input type that accepts TraefikServiceSpecWeightedServicesStickyArgs, TraefikServiceSpecWeightedServicesStickyPtr and TraefikServiceSpecWeightedServicesStickyPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesStickyPtrInput` via:
//
//	        TraefikServiceSpecWeightedServicesStickyArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedServicesStickyPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesStickyPtrOutput() TraefikServiceSpecWeightedServicesStickyPtrOutput
	ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesStickyPtrOutput
}

type traefikServiceSpecWeightedServicesStickyPtrType TraefikServiceSpecWeightedServicesStickyArgs

func TraefikServiceSpecWeightedServicesStickyPtr(v *TraefikServiceSpecWeightedServicesStickyArgs) TraefikServiceSpecWeightedServicesStickyPtrInput {
	return (*traefikServiceSpecWeightedServicesStickyPtrType)(v)
}

func (*traefikServiceSpecWeightedServicesStickyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesSticky)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedServicesStickyPtrType) ToTraefikServiceSpecWeightedServicesStickyPtrOutput() TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedServicesStickyPtrType) ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesStickyPtrOutput)
}

func (i *traefikServiceSpecWeightedServicesStickyPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesSticky] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesSticky]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(ctx).OutputState,
	}
}

// Sticky defines the sticky sessions configuration.
// More info: https://doc.traefik.io/traefik/v3.0/routing/services/#sticky-sessions
type TraefikServiceSpecWeightedServicesStickyOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesStickyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesSticky)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesStickyOutput) ToTraefikServiceSpecWeightedServicesStickyOutput() TraefikServiceSpecWeightedServicesStickyOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyOutput) ToTraefikServiceSpecWeightedServicesStickyOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyOutput) ToTraefikServiceSpecWeightedServicesStickyPtrOutput() TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return o.ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedServicesStickyOutput) ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeightedServicesSticky) *TraefikServiceSpecWeightedServicesSticky {
		return &v
	}).(TraefikServiceSpecWeightedServicesStickyPtrOutput)
}

func (o TraefikServiceSpecWeightedServicesStickyOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesSticky] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesSticky]{
		OutputState: o.OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecWeightedServicesStickyOutput) Cookie() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesSticky) *TraefikServiceSpecWeightedServicesStickyCookie {
		return v.Cookie
	}).(TraefikServiceSpecWeightedServicesStickyCookiePtrOutput)
}

type TraefikServiceSpecWeightedServicesStickyPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesStickyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesSticky)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesStickyPtrOutput) ToTraefikServiceSpecWeightedServicesStickyPtrOutput() TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyPtrOutput) ToTraefikServiceSpecWeightedServicesStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesSticky] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesSticky]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedServicesStickyPtrOutput) Elem() TraefikServiceSpecWeightedServicesStickyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesSticky) TraefikServiceSpecWeightedServicesSticky {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeightedServicesSticky
		return ret
	}).(TraefikServiceSpecWeightedServicesStickyOutput)
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecWeightedServicesStickyPtrOutput) Cookie() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesSticky) *TraefikServiceSpecWeightedServicesStickyCookie {
		if v == nil {
			return nil
		}
		return v.Cookie
	}).(TraefikServiceSpecWeightedServicesStickyCookiePtrOutput)
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecWeightedServicesStickyCookie struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly *bool `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge *int `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name *string `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite *string `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure *bool `pulumi:"secure"`
}

// TraefikServiceSpecWeightedServicesStickyCookieInput is an input type that accepts TraefikServiceSpecWeightedServicesStickyCookieArgs and TraefikServiceSpecWeightedServicesStickyCookieOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesStickyCookieInput` via:
//
//	TraefikServiceSpecWeightedServicesStickyCookieArgs{...}
type TraefikServiceSpecWeightedServicesStickyCookieInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesStickyCookieOutput() TraefikServiceSpecWeightedServicesStickyCookieOutput
	ToTraefikServiceSpecWeightedServicesStickyCookieOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesStickyCookieOutput
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecWeightedServicesStickyCookieArgs struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly pulumi.BoolPtrInput `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge pulumi.IntPtrInput `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name pulumi.StringPtrInput `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite pulumi.StringPtrInput `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure pulumi.BoolPtrInput `pulumi:"secure"`
}

func (TraefikServiceSpecWeightedServicesStickyCookieArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesStickyCookie)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedServicesStickyCookieArgs) ToTraefikServiceSpecWeightedServicesStickyCookieOutput() TraefikServiceSpecWeightedServicesStickyCookieOutput {
	return i.ToTraefikServiceSpecWeightedServicesStickyCookieOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesStickyCookieArgs) ToTraefikServiceSpecWeightedServicesStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyCookieOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesStickyCookieOutput)
}

func (i TraefikServiceSpecWeightedServicesStickyCookieArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesStickyCookie] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesStickyCookie]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesStickyCookieOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedServicesStickyCookieArgs) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutput() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedServicesStickyCookieArgs) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesStickyCookieOutput).ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedServicesStickyCookiePtrInput is an input type that accepts TraefikServiceSpecWeightedServicesStickyCookieArgs, TraefikServiceSpecWeightedServicesStickyCookiePtr and TraefikServiceSpecWeightedServicesStickyCookiePtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedServicesStickyCookiePtrInput` via:
//
//	        TraefikServiceSpecWeightedServicesStickyCookieArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedServicesStickyCookiePtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutput() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput
	ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(context.Context) TraefikServiceSpecWeightedServicesStickyCookiePtrOutput
}

type traefikServiceSpecWeightedServicesStickyCookiePtrType TraefikServiceSpecWeightedServicesStickyCookieArgs

func TraefikServiceSpecWeightedServicesStickyCookiePtr(v *TraefikServiceSpecWeightedServicesStickyCookieArgs) TraefikServiceSpecWeightedServicesStickyCookiePtrInput {
	return (*traefikServiceSpecWeightedServicesStickyCookiePtrType)(v)
}

func (*traefikServiceSpecWeightedServicesStickyCookiePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesStickyCookie)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedServicesStickyCookiePtrType) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutput() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedServicesStickyCookiePtrType) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedServicesStickyCookiePtrOutput)
}

func (i *traefikServiceSpecWeightedServicesStickyCookiePtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesStickyCookie]{
		OutputState: i.ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(ctx).OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecWeightedServicesStickyCookieOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesStickyCookieOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedServicesStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) ToTraefikServiceSpecWeightedServicesStickyCookieOutput() TraefikServiceSpecWeightedServicesStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) ToTraefikServiceSpecWeightedServicesStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutput() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return o.ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeightedServicesStickyCookie) *TraefikServiceSpecWeightedServicesStickyCookie {
		return &v
	}).(TraefikServiceSpecWeightedServicesStickyCookiePtrOutput)
}

func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedServicesStickyCookie] {
	return pulumix.Output[TraefikServiceSpecWeightedServicesStickyCookie]{
		OutputState: o.OutputState,
	}
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesStickyCookie) *bool { return v.HttpOnly }).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesStickyCookie) *int { return v.MaxAge }).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesStickyCookie) *string { return v.Name }).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesStickyCookie) *string { return v.SameSite }).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecWeightedServicesStickyCookieOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedServicesStickyCookie) *bool { return v.Secure }).(pulumi.BoolPtrOutput)
}

type TraefikServiceSpecWeightedServicesStickyCookiePtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedServicesStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutput() TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) ToTraefikServiceSpecWeightedServicesStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedServicesStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedServicesStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecWeightedServicesStickyCookie]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) Elem() TraefikServiceSpecWeightedServicesStickyCookieOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesStickyCookie) TraefikServiceSpecWeightedServicesStickyCookie {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeightedServicesStickyCookie
		return ret
	}).(TraefikServiceSpecWeightedServicesStickyCookieOutput)
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.HttpOnly
	}).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesStickyCookie) *int {
		if v == nil {
			return nil
		}
		return v.MaxAge
	}).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.Name
	}).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.SameSite
	}).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecWeightedServicesStickyCookiePtrOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedServicesStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.Secure
	}).(pulumi.BoolPtrOutput)
}

// Sticky defines whether sticky sessions are enabled.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
type TraefikServiceSpecWeightedSticky struct {
	// Cookie defines the sticky cookie configuration.
	Cookie *TraefikServiceSpecWeightedStickyCookie `pulumi:"cookie"`
}

// TraefikServiceSpecWeightedStickyInput is an input type that accepts TraefikServiceSpecWeightedStickyArgs and TraefikServiceSpecWeightedStickyOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedStickyInput` via:
//
//	TraefikServiceSpecWeightedStickyArgs{...}
type TraefikServiceSpecWeightedStickyInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedStickyOutput() TraefikServiceSpecWeightedStickyOutput
	ToTraefikServiceSpecWeightedStickyOutputWithContext(context.Context) TraefikServiceSpecWeightedStickyOutput
}

// Sticky defines whether sticky sessions are enabled.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
type TraefikServiceSpecWeightedStickyArgs struct {
	// Cookie defines the sticky cookie configuration.
	Cookie TraefikServiceSpecWeightedStickyCookiePtrInput `pulumi:"cookie"`
}

func (TraefikServiceSpecWeightedStickyArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedSticky)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedStickyArgs) ToTraefikServiceSpecWeightedStickyOutput() TraefikServiceSpecWeightedStickyOutput {
	return i.ToTraefikServiceSpecWeightedStickyOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedStickyArgs) ToTraefikServiceSpecWeightedStickyOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedStickyOutput)
}

func (i TraefikServiceSpecWeightedStickyArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedSticky] {
	return pulumix.Output[TraefikServiceSpecWeightedSticky]{
		OutputState: i.ToTraefikServiceSpecWeightedStickyOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedStickyArgs) ToTraefikServiceSpecWeightedStickyPtrOutput() TraefikServiceSpecWeightedStickyPtrOutput {
	return i.ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedStickyArgs) ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedStickyOutput).ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedStickyPtrInput is an input type that accepts TraefikServiceSpecWeightedStickyArgs, TraefikServiceSpecWeightedStickyPtr and TraefikServiceSpecWeightedStickyPtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedStickyPtrInput` via:
//
//	        TraefikServiceSpecWeightedStickyArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedStickyPtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedStickyPtrOutput() TraefikServiceSpecWeightedStickyPtrOutput
	ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(context.Context) TraefikServiceSpecWeightedStickyPtrOutput
}

type traefikServiceSpecWeightedStickyPtrType TraefikServiceSpecWeightedStickyArgs

func TraefikServiceSpecWeightedStickyPtr(v *TraefikServiceSpecWeightedStickyArgs) TraefikServiceSpecWeightedStickyPtrInput {
	return (*traefikServiceSpecWeightedStickyPtrType)(v)
}

func (*traefikServiceSpecWeightedStickyPtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedSticky)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedStickyPtrType) ToTraefikServiceSpecWeightedStickyPtrOutput() TraefikServiceSpecWeightedStickyPtrOutput {
	return i.ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedStickyPtrType) ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyPtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedStickyPtrOutput)
}

func (i *traefikServiceSpecWeightedStickyPtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedSticky] {
	return pulumix.Output[*TraefikServiceSpecWeightedSticky]{
		OutputState: i.ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(ctx).OutputState,
	}
}

// Sticky defines whether sticky sessions are enabled.
// More info: https://doc.traefik.io/traefik/v3.0/routing/providers/kubernetes-crd/#stickiness-and-load-balancing
type TraefikServiceSpecWeightedStickyOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedStickyOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedSticky)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedStickyOutput) ToTraefikServiceSpecWeightedStickyOutput() TraefikServiceSpecWeightedStickyOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyOutput) ToTraefikServiceSpecWeightedStickyOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyOutput) ToTraefikServiceSpecWeightedStickyPtrOutput() TraefikServiceSpecWeightedStickyPtrOutput {
	return o.ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedStickyOutput) ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyPtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeightedSticky) *TraefikServiceSpecWeightedSticky {
		return &v
	}).(TraefikServiceSpecWeightedStickyPtrOutput)
}

func (o TraefikServiceSpecWeightedStickyOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedSticky] {
	return pulumix.Output[TraefikServiceSpecWeightedSticky]{
		OutputState: o.OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecWeightedStickyOutput) Cookie() TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedSticky) *TraefikServiceSpecWeightedStickyCookie { return v.Cookie }).(TraefikServiceSpecWeightedStickyCookiePtrOutput)
}

type TraefikServiceSpecWeightedStickyPtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedStickyPtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedSticky)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedStickyPtrOutput) ToTraefikServiceSpecWeightedStickyPtrOutput() TraefikServiceSpecWeightedStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyPtrOutput) ToTraefikServiceSpecWeightedStickyPtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyPtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedSticky] {
	return pulumix.Output[*TraefikServiceSpecWeightedSticky]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedStickyPtrOutput) Elem() TraefikServiceSpecWeightedStickyOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedSticky) TraefikServiceSpecWeightedSticky {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeightedSticky
		return ret
	}).(TraefikServiceSpecWeightedStickyOutput)
}

// Cookie defines the sticky cookie configuration.
func (o TraefikServiceSpecWeightedStickyPtrOutput) Cookie() TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedSticky) *TraefikServiceSpecWeightedStickyCookie {
		if v == nil {
			return nil
		}
		return v.Cookie
	}).(TraefikServiceSpecWeightedStickyCookiePtrOutput)
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecWeightedStickyCookie struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly *bool `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge *int `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name *string `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite *string `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure *bool `pulumi:"secure"`
}

// TraefikServiceSpecWeightedStickyCookieInput is an input type that accepts TraefikServiceSpecWeightedStickyCookieArgs and TraefikServiceSpecWeightedStickyCookieOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedStickyCookieInput` via:
//
//	TraefikServiceSpecWeightedStickyCookieArgs{...}
type TraefikServiceSpecWeightedStickyCookieInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedStickyCookieOutput() TraefikServiceSpecWeightedStickyCookieOutput
	ToTraefikServiceSpecWeightedStickyCookieOutputWithContext(context.Context) TraefikServiceSpecWeightedStickyCookieOutput
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecWeightedStickyCookieArgs struct {
	// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
	HttpOnly pulumi.BoolPtrInput `pulumi:"httpOnly"`
	// MaxAge indicates the number of seconds until the cookie expires.
	// When set to a negative number, the cookie expires immediately.
	// When set to zero, the cookie never expires.
	MaxAge pulumi.IntPtrInput `pulumi:"maxAge"`
	// Name defines the Cookie name.
	Name pulumi.StringPtrInput `pulumi:"name"`
	// SameSite defines the same site policy.
	// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
	SameSite pulumi.StringPtrInput `pulumi:"sameSite"`
	// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
	Secure pulumi.BoolPtrInput `pulumi:"secure"`
}

func (TraefikServiceSpecWeightedStickyCookieArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedStickyCookie)(nil)).Elem()
}

func (i TraefikServiceSpecWeightedStickyCookieArgs) ToTraefikServiceSpecWeightedStickyCookieOutput() TraefikServiceSpecWeightedStickyCookieOutput {
	return i.ToTraefikServiceSpecWeightedStickyCookieOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedStickyCookieArgs) ToTraefikServiceSpecWeightedStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyCookieOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedStickyCookieOutput)
}

func (i TraefikServiceSpecWeightedStickyCookieArgs) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedStickyCookie] {
	return pulumix.Output[TraefikServiceSpecWeightedStickyCookie]{
		OutputState: i.ToTraefikServiceSpecWeightedStickyCookieOutputWithContext(ctx).OutputState,
	}
}

func (i TraefikServiceSpecWeightedStickyCookieArgs) ToTraefikServiceSpecWeightedStickyCookiePtrOutput() TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(context.Background())
}

func (i TraefikServiceSpecWeightedStickyCookieArgs) ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedStickyCookieOutput).ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(ctx)
}

// TraefikServiceSpecWeightedStickyCookiePtrInput is an input type that accepts TraefikServiceSpecWeightedStickyCookieArgs, TraefikServiceSpecWeightedStickyCookiePtr and TraefikServiceSpecWeightedStickyCookiePtrOutput values.
// You can construct a concrete instance of `TraefikServiceSpecWeightedStickyCookiePtrInput` via:
//
//	        TraefikServiceSpecWeightedStickyCookieArgs{...}
//
//	or:
//
//	        nil
type TraefikServiceSpecWeightedStickyCookiePtrInput interface {
	pulumi.Input

	ToTraefikServiceSpecWeightedStickyCookiePtrOutput() TraefikServiceSpecWeightedStickyCookiePtrOutput
	ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(context.Context) TraefikServiceSpecWeightedStickyCookiePtrOutput
}

type traefikServiceSpecWeightedStickyCookiePtrType TraefikServiceSpecWeightedStickyCookieArgs

func TraefikServiceSpecWeightedStickyCookiePtr(v *TraefikServiceSpecWeightedStickyCookieArgs) TraefikServiceSpecWeightedStickyCookiePtrInput {
	return (*traefikServiceSpecWeightedStickyCookiePtrType)(v)
}

func (*traefikServiceSpecWeightedStickyCookiePtrType) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedStickyCookie)(nil)).Elem()
}

func (i *traefikServiceSpecWeightedStickyCookiePtrType) ToTraefikServiceSpecWeightedStickyCookiePtrOutput() TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return i.ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(context.Background())
}

func (i *traefikServiceSpecWeightedStickyCookiePtrType) ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return pulumi.ToOutputWithContext(ctx, i).(TraefikServiceSpecWeightedStickyCookiePtrOutput)
}

func (i *traefikServiceSpecWeightedStickyCookiePtrType) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecWeightedStickyCookie]{
		OutputState: i.ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(ctx).OutputState,
	}
}

// Cookie defines the sticky cookie configuration.
type TraefikServiceSpecWeightedStickyCookieOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedStickyCookieOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*TraefikServiceSpecWeightedStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedStickyCookieOutput) ToTraefikServiceSpecWeightedStickyCookieOutput() TraefikServiceSpecWeightedStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyCookieOutput) ToTraefikServiceSpecWeightedStickyCookieOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyCookieOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyCookieOutput) ToTraefikServiceSpecWeightedStickyCookiePtrOutput() TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return o.ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(context.Background())
}

func (o TraefikServiceSpecWeightedStickyCookieOutput) ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return o.ApplyTWithContext(ctx, func(_ context.Context, v TraefikServiceSpecWeightedStickyCookie) *TraefikServiceSpecWeightedStickyCookie {
		return &v
	}).(TraefikServiceSpecWeightedStickyCookiePtrOutput)
}

func (o TraefikServiceSpecWeightedStickyCookieOutput) ToOutput(ctx context.Context) pulumix.Output[TraefikServiceSpecWeightedStickyCookie] {
	return pulumix.Output[TraefikServiceSpecWeightedStickyCookie]{
		OutputState: o.OutputState,
	}
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecWeightedStickyCookieOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedStickyCookie) *bool { return v.HttpOnly }).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecWeightedStickyCookieOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedStickyCookie) *int { return v.MaxAge }).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecWeightedStickyCookieOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedStickyCookie) *string { return v.Name }).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecWeightedStickyCookieOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedStickyCookie) *string { return v.SameSite }).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecWeightedStickyCookieOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v TraefikServiceSpecWeightedStickyCookie) *bool { return v.Secure }).(pulumi.BoolPtrOutput)
}

type TraefikServiceSpecWeightedStickyCookiePtrOutput struct{ *pulumi.OutputState }

func (TraefikServiceSpecWeightedStickyCookiePtrOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**TraefikServiceSpecWeightedStickyCookie)(nil)).Elem()
}

func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) ToTraefikServiceSpecWeightedStickyCookiePtrOutput() TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) ToTraefikServiceSpecWeightedStickyCookiePtrOutputWithContext(ctx context.Context) TraefikServiceSpecWeightedStickyCookiePtrOutput {
	return o
}

func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) ToOutput(ctx context.Context) pulumix.Output[*TraefikServiceSpecWeightedStickyCookie] {
	return pulumix.Output[*TraefikServiceSpecWeightedStickyCookie]{
		OutputState: o.OutputState,
	}
}

func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) Elem() TraefikServiceSpecWeightedStickyCookieOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedStickyCookie) TraefikServiceSpecWeightedStickyCookie {
		if v != nil {
			return *v
		}
		var ret TraefikServiceSpecWeightedStickyCookie
		return ret
	}).(TraefikServiceSpecWeightedStickyCookieOutput)
}

// HTTPOnly defines whether the cookie can be accessed by client-side APIs, such as JavaScript.
func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) HttpOnly() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.HttpOnly
	}).(pulumi.BoolPtrOutput)
}

// MaxAge indicates the number of seconds until the cookie expires.
// When set to a negative number, the cookie expires immediately.
// When set to zero, the cookie never expires.
func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) MaxAge() pulumi.IntPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedStickyCookie) *int {
		if v == nil {
			return nil
		}
		return v.MaxAge
	}).(pulumi.IntPtrOutput)
}

// Name defines the Cookie name.
func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.Name
	}).(pulumi.StringPtrOutput)
}

// SameSite defines the same site policy.
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) SameSite() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedStickyCookie) *string {
		if v == nil {
			return nil
		}
		return v.SameSite
	}).(pulumi.StringPtrOutput)
}

// Secure defines whether the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
func (o TraefikServiceSpecWeightedStickyCookiePtrOutput) Secure() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *TraefikServiceSpecWeightedStickyCookie) *bool {
		if v == nil {
			return nil
		}
		return v.Secure
	}).(pulumi.BoolPtrOutput)
}

func init() {
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecInput)(nil)).Elem(), IngressRouteSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecPtrInput)(nil)).Elem(), IngressRouteSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesInput)(nil)).Elem(), IngressRouteSpecRoutesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesArrayInput)(nil)).Elem(), IngressRouteSpecRoutesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesMiddlewaresInput)(nil)).Elem(), IngressRouteSpecRoutesMiddlewaresArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesMiddlewaresArrayInput)(nil)).Elem(), IngressRouteSpecRoutesMiddlewaresArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesInput)(nil)).Elem(), IngressRouteSpecRoutesServicesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesArrayInput)(nil)).Elem(), IngressRouteSpecRoutesServicesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesHealthCheckInput)(nil)).Elem(), IngressRouteSpecRoutesServicesHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesHealthCheckPtrInput)(nil)).Elem(), IngressRouteSpecRoutesServicesHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesResponseForwardingInput)(nil)).Elem(), IngressRouteSpecRoutesServicesResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesResponseForwardingPtrInput)(nil)).Elem(), IngressRouteSpecRoutesServicesResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesStickyInput)(nil)).Elem(), IngressRouteSpecRoutesServicesStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesStickyPtrInput)(nil)).Elem(), IngressRouteSpecRoutesServicesStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesStickyCookieInput)(nil)).Elem(), IngressRouteSpecRoutesServicesStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecRoutesServicesStickyCookiePtrInput)(nil)).Elem(), IngressRouteSpecRoutesServicesStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsInput)(nil)).Elem(), IngressRouteSpecTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsPtrInput)(nil)).Elem(), IngressRouteSpecTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsDomainsInput)(nil)).Elem(), IngressRouteSpecTlsDomainsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsDomainsArrayInput)(nil)).Elem(), IngressRouteSpecTlsDomainsArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsOptionsInput)(nil)).Elem(), IngressRouteSpecTlsOptionsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsOptionsPtrInput)(nil)).Elem(), IngressRouteSpecTlsOptionsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsStoreInput)(nil)).Elem(), IngressRouteSpecTlsStoreArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteSpecTlsStorePtrInput)(nil)).Elem(), IngressRouteSpecTlsStoreArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecInput)(nil)).Elem(), IngressRouteTCPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecPtrInput)(nil)).Elem(), IngressRouteTCPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesInput)(nil)).Elem(), IngressRouteTCPSpecRoutesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesArrayInput)(nil)).Elem(), IngressRouteTCPSpecRoutesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesMiddlewaresInput)(nil)).Elem(), IngressRouteTCPSpecRoutesMiddlewaresArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesMiddlewaresArrayInput)(nil)).Elem(), IngressRouteTCPSpecRoutesMiddlewaresArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesServicesInput)(nil)).Elem(), IngressRouteTCPSpecRoutesServicesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesServicesArrayInput)(nil)).Elem(), IngressRouteTCPSpecRoutesServicesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesServicesProxyProtocolInput)(nil)).Elem(), IngressRouteTCPSpecRoutesServicesProxyProtocolArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecRoutesServicesProxyProtocolPtrInput)(nil)).Elem(), IngressRouteTCPSpecRoutesServicesProxyProtocolArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsInput)(nil)).Elem(), IngressRouteTCPSpecTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsPtrInput)(nil)).Elem(), IngressRouteTCPSpecTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsDomainsInput)(nil)).Elem(), IngressRouteTCPSpecTlsDomainsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsDomainsArrayInput)(nil)).Elem(), IngressRouteTCPSpecTlsDomainsArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsOptionsInput)(nil)).Elem(), IngressRouteTCPSpecTlsOptionsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsOptionsPtrInput)(nil)).Elem(), IngressRouteTCPSpecTlsOptionsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsStoreInput)(nil)).Elem(), IngressRouteTCPSpecTlsStoreArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteTCPSpecTlsStorePtrInput)(nil)).Elem(), IngressRouteTCPSpecTlsStoreArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteUDPSpecInput)(nil)).Elem(), IngressRouteUDPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteUDPSpecPtrInput)(nil)).Elem(), IngressRouteUDPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteUDPSpecRoutesInput)(nil)).Elem(), IngressRouteUDPSpecRoutesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteUDPSpecRoutesArrayInput)(nil)).Elem(), IngressRouteUDPSpecRoutesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteUDPSpecRoutesServicesInput)(nil)).Elem(), IngressRouteUDPSpecRoutesServicesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*IngressRouteUDPSpecRoutesServicesArrayInput)(nil)).Elem(), IngressRouteUDPSpecRoutesServicesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInput)(nil)).Elem(), MiddlewareSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPtrInput)(nil)).Elem(), MiddlewareSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecAddPrefixInput)(nil)).Elem(), MiddlewareSpecAddPrefixArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecAddPrefixPtrInput)(nil)).Elem(), MiddlewareSpecAddPrefixArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecBasicAuthInput)(nil)).Elem(), MiddlewareSpecBasicAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecBasicAuthPtrInput)(nil)).Elem(), MiddlewareSpecBasicAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecBufferingInput)(nil)).Elem(), MiddlewareSpecBufferingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecBufferingPtrInput)(nil)).Elem(), MiddlewareSpecBufferingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecChainInput)(nil)).Elem(), MiddlewareSpecChainArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecChainPtrInput)(nil)).Elem(), MiddlewareSpecChainArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecChainMiddlewaresInput)(nil)).Elem(), MiddlewareSpecChainMiddlewaresArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecChainMiddlewaresArrayInput)(nil)).Elem(), MiddlewareSpecChainMiddlewaresArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecCircuitBreakerInput)(nil)).Elem(), MiddlewareSpecCircuitBreakerArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecCircuitBreakerPtrInput)(nil)).Elem(), MiddlewareSpecCircuitBreakerArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecCompressInput)(nil)).Elem(), MiddlewareSpecCompressArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecCompressPtrInput)(nil)).Elem(), MiddlewareSpecCompressArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecContentTypeInput)(nil)).Elem(), MiddlewareSpecContentTypeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecContentTypePtrInput)(nil)).Elem(), MiddlewareSpecContentTypeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecDigestAuthInput)(nil)).Elem(), MiddlewareSpecDigestAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecDigestAuthPtrInput)(nil)).Elem(), MiddlewareSpecDigestAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsInput)(nil)).Elem(), MiddlewareSpecErrorsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsPtrInput)(nil)).Elem(), MiddlewareSpecErrorsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceInput)(nil)).Elem(), MiddlewareSpecErrorsServiceArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServicePtrInput)(nil)).Elem(), MiddlewareSpecErrorsServiceArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceHealthCheckInput)(nil)).Elem(), MiddlewareSpecErrorsServiceHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceHealthCheckPtrInput)(nil)).Elem(), MiddlewareSpecErrorsServiceHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceResponseForwardingInput)(nil)).Elem(), MiddlewareSpecErrorsServiceResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceResponseForwardingPtrInput)(nil)).Elem(), MiddlewareSpecErrorsServiceResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceStickyInput)(nil)).Elem(), MiddlewareSpecErrorsServiceStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceStickyPtrInput)(nil)).Elem(), MiddlewareSpecErrorsServiceStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceStickyCookieInput)(nil)).Elem(), MiddlewareSpecErrorsServiceStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecErrorsServiceStickyCookiePtrInput)(nil)).Elem(), MiddlewareSpecErrorsServiceStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecForwardAuthInput)(nil)).Elem(), MiddlewareSpecForwardAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecForwardAuthPtrInput)(nil)).Elem(), MiddlewareSpecForwardAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecForwardAuthTlsInput)(nil)).Elem(), MiddlewareSpecForwardAuthTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecForwardAuthTlsPtrInput)(nil)).Elem(), MiddlewareSpecForwardAuthTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecGrpcWebInput)(nil)).Elem(), MiddlewareSpecGrpcWebArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecGrpcWebPtrInput)(nil)).Elem(), MiddlewareSpecGrpcWebArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecHeadersInput)(nil)).Elem(), MiddlewareSpecHeadersArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecHeadersPtrInput)(nil)).Elem(), MiddlewareSpecHeadersArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInFlightReqInput)(nil)).Elem(), MiddlewareSpecInFlightReqArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInFlightReqPtrInput)(nil)).Elem(), MiddlewareSpecInFlightReqArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterionInput)(nil)).Elem(), MiddlewareSpecInFlightReqSourceCriterionArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterionPtrInput)(nil)).Elem(), MiddlewareSpecInFlightReqSourceCriterionArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterionIpStrategyInput)(nil)).Elem(), MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrInput)(nil)).Elem(), MiddlewareSpecInFlightReqSourceCriterionIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpAllowListInput)(nil)).Elem(), MiddlewareSpecIpAllowListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpAllowListPtrInput)(nil)).Elem(), MiddlewareSpecIpAllowListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpAllowListIpStrategyInput)(nil)).Elem(), MiddlewareSpecIpAllowListIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpAllowListIpStrategyPtrInput)(nil)).Elem(), MiddlewareSpecIpAllowListIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpWhiteListInput)(nil)).Elem(), MiddlewareSpecIpWhiteListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpWhiteListPtrInput)(nil)).Elem(), MiddlewareSpecIpWhiteListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpWhiteListIpStrategyInput)(nil)).Elem(), MiddlewareSpecIpWhiteListIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecIpWhiteListIpStrategyPtrInput)(nil)).Elem(), MiddlewareSpecIpWhiteListIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertPtrInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertInfoArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoPtrInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertInfoArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoIssuerInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertInfoIssuerArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoIssuerPtrInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertInfoIssuerArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoSubjectInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertInfoSubjectArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecPassTLSClientCertInfoSubjectPtrInput)(nil)).Elem(), MiddlewareSpecPassTLSClientCertInfoSubjectArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRateLimitInput)(nil)).Elem(), MiddlewareSpecRateLimitArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRateLimitPtrInput)(nil)).Elem(), MiddlewareSpecRateLimitArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterionInput)(nil)).Elem(), MiddlewareSpecRateLimitSourceCriterionArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterionPtrInput)(nil)).Elem(), MiddlewareSpecRateLimitSourceCriterionArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterionIpStrategyInput)(nil)).Elem(), MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrInput)(nil)).Elem(), MiddlewareSpecRateLimitSourceCriterionIpStrategyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRedirectRegexInput)(nil)).Elem(), MiddlewareSpecRedirectRegexArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRedirectRegexPtrInput)(nil)).Elem(), MiddlewareSpecRedirectRegexArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRedirectSchemeInput)(nil)).Elem(), MiddlewareSpecRedirectSchemeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRedirectSchemePtrInput)(nil)).Elem(), MiddlewareSpecRedirectSchemeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecReplacePathInput)(nil)).Elem(), MiddlewareSpecReplacePathArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecReplacePathPtrInput)(nil)).Elem(), MiddlewareSpecReplacePathArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecReplacePathRegexInput)(nil)).Elem(), MiddlewareSpecReplacePathRegexArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecReplacePathRegexPtrInput)(nil)).Elem(), MiddlewareSpecReplacePathRegexArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRetryInput)(nil)).Elem(), MiddlewareSpecRetryArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecRetryPtrInput)(nil)).Elem(), MiddlewareSpecRetryArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecStripPrefixInput)(nil)).Elem(), MiddlewareSpecStripPrefixArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecStripPrefixPtrInput)(nil)).Elem(), MiddlewareSpecStripPrefixArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecStripPrefixRegexInput)(nil)).Elem(), MiddlewareSpecStripPrefixRegexArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareSpecStripPrefixRegexPtrInput)(nil)).Elem(), MiddlewareSpecStripPrefixRegexArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecInput)(nil)).Elem(), MiddlewareTCPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecPtrInput)(nil)).Elem(), MiddlewareTCPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecInFlightConnInput)(nil)).Elem(), MiddlewareTCPSpecInFlightConnArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecInFlightConnPtrInput)(nil)).Elem(), MiddlewareTCPSpecInFlightConnArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecIpAllowListInput)(nil)).Elem(), MiddlewareTCPSpecIpAllowListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecIpAllowListPtrInput)(nil)).Elem(), MiddlewareTCPSpecIpAllowListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecIpWhiteListInput)(nil)).Elem(), MiddlewareTCPSpecIpWhiteListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*MiddlewareTCPSpecIpWhiteListPtrInput)(nil)).Elem(), MiddlewareTCPSpecIpWhiteListArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportSpecInput)(nil)).Elem(), ServersTransportSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportSpecPtrInput)(nil)).Elem(), ServersTransportSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportSpecForwardingTimeoutsInput)(nil)).Elem(), ServersTransportSpecForwardingTimeoutsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportSpecForwardingTimeoutsPtrInput)(nil)).Elem(), ServersTransportSpecForwardingTimeoutsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportSpecSpiffeInput)(nil)).Elem(), ServersTransportSpecSpiffeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportSpecSpiffePtrInput)(nil)).Elem(), ServersTransportSpecSpiffeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportTCPSpecInput)(nil)).Elem(), ServersTransportTCPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportTCPSpecPtrInput)(nil)).Elem(), ServersTransportTCPSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportTCPSpecTlsInput)(nil)).Elem(), ServersTransportTCPSpecTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportTCPSpecTlsPtrInput)(nil)).Elem(), ServersTransportTCPSpecTlsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportTCPSpecTlsSpiffeInput)(nil)).Elem(), ServersTransportTCPSpecTlsSpiffeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*ServersTransportTCPSpecTlsSpiffePtrInput)(nil)).Elem(), ServersTransportTCPSpecTlsSpiffeArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSOptionSpecInput)(nil)).Elem(), TLSOptionSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSOptionSpecPtrInput)(nil)).Elem(), TLSOptionSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSOptionSpecClientAuthInput)(nil)).Elem(), TLSOptionSpecClientAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSOptionSpecClientAuthPtrInput)(nil)).Elem(), TLSOptionSpecClientAuthArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecInput)(nil)).Elem(), TLSStoreSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecPtrInput)(nil)).Elem(), TLSStoreSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecCertificatesInput)(nil)).Elem(), TLSStoreSpecCertificatesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecCertificatesArrayInput)(nil)).Elem(), TLSStoreSpecCertificatesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecDefaultCertificateInput)(nil)).Elem(), TLSStoreSpecDefaultCertificateArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecDefaultCertificatePtrInput)(nil)).Elem(), TLSStoreSpecDefaultCertificateArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCertInput)(nil)).Elem(), TLSStoreSpecDefaultGeneratedCertArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCertPtrInput)(nil)).Elem(), TLSStoreSpecDefaultGeneratedCertArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCertDomainInput)(nil)).Elem(), TLSStoreSpecDefaultGeneratedCertDomainArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TLSStoreSpecDefaultGeneratedCertDomainPtrInput)(nil)).Elem(), TLSStoreSpecDefaultGeneratedCertDomainArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecInput)(nil)).Elem(), TraefikServiceSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecPtrInput)(nil)).Elem(), TraefikServiceSpecArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringInput)(nil)).Elem(), TraefikServiceSpecMirroringArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringHealthCheckInput)(nil)).Elem(), TraefikServiceSpecMirroringHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringHealthCheckPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsArrayInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsHealthCheckInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsHealthCheckPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsResponseForwardingInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsResponseForwardingPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsStickyInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsStickyPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsStickyCookieInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringMirrorsStickyCookiePtrInput)(nil)).Elem(), TraefikServiceSpecMirroringMirrorsStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringResponseForwardingInput)(nil)).Elem(), TraefikServiceSpecMirroringResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringResponseForwardingPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringStickyInput)(nil)).Elem(), TraefikServiceSpecMirroringStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringStickyPtrInput)(nil)).Elem(), TraefikServiceSpecMirroringStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringStickyCookieInput)(nil)).Elem(), TraefikServiceSpecMirroringStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecMirroringStickyCookiePtrInput)(nil)).Elem(), TraefikServiceSpecMirroringStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedInput)(nil)).Elem(), TraefikServiceSpecWeightedArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedPtrInput)(nil)).Elem(), TraefikServiceSpecWeightedArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesArrayInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesHealthCheckInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesHealthCheckPtrInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesHealthCheckArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesResponseForwardingInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesResponseForwardingPtrInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesResponseForwardingArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesStickyInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesStickyPtrInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesStickyCookieInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedServicesStickyCookiePtrInput)(nil)).Elem(), TraefikServiceSpecWeightedServicesStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedStickyInput)(nil)).Elem(), TraefikServiceSpecWeightedStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedStickyPtrInput)(nil)).Elem(), TraefikServiceSpecWeightedStickyArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedStickyCookieInput)(nil)).Elem(), TraefikServiceSpecWeightedStickyCookieArgs{})
	pulumi.RegisterInputType(reflect.TypeOf((*TraefikServiceSpecWeightedStickyCookiePtrInput)(nil)).Elem(), TraefikServiceSpecWeightedStickyCookieArgs{})
	pulumi.RegisterOutputType(IngressRouteSpecOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesMiddlewaresOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesMiddlewaresArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesHealthCheckOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesHealthCheckPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesResponseForwardingOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesResponseForwardingPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesStickyOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesStickyPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesStickyCookieOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecRoutesServicesStickyCookiePtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsDomainsOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsDomainsArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsOptionsOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsOptionsPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsStoreOutput{})
	pulumi.RegisterOutputType(IngressRouteSpecTlsStorePtrOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesMiddlewaresOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesMiddlewaresArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesServicesOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesServicesArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesServicesProxyProtocolOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecRoutesServicesProxyProtocolPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsDomainsOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsDomainsArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsOptionsOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsOptionsPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsStoreOutput{})
	pulumi.RegisterOutputType(IngressRouteTCPSpecTlsStorePtrOutput{})
	pulumi.RegisterOutputType(IngressRouteUDPSpecOutput{})
	pulumi.RegisterOutputType(IngressRouteUDPSpecPtrOutput{})
	pulumi.RegisterOutputType(IngressRouteUDPSpecRoutesOutput{})
	pulumi.RegisterOutputType(IngressRouteUDPSpecRoutesArrayOutput{})
	pulumi.RegisterOutputType(IngressRouteUDPSpecRoutesServicesOutput{})
	pulumi.RegisterOutputType(IngressRouteUDPSpecRoutesServicesArrayOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecAddPrefixOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecAddPrefixPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecBasicAuthOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecBasicAuthPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecBufferingOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecBufferingPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecChainOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecChainPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecChainMiddlewaresOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecChainMiddlewaresArrayOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecCircuitBreakerOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecCircuitBreakerPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecCompressOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecCompressPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecContentTypeOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecContentTypePtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecDigestAuthOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecDigestAuthPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServicePtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceHealthCheckOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceHealthCheckPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceResponseForwardingOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceResponseForwardingPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceStickyOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceStickyPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceStickyCookieOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecErrorsServiceStickyCookiePtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecForwardAuthOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecForwardAuthPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecForwardAuthTlsOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecForwardAuthTlsPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecGrpcWebOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecGrpcWebPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecHeadersOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecHeadersPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecInFlightReqOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecInFlightReqPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecInFlightReqSourceCriterionOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecInFlightReqSourceCriterionPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecInFlightReqSourceCriterionIpStrategyOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecInFlightReqSourceCriterionIpStrategyPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpAllowListOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpAllowListPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpAllowListIpStrategyOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpAllowListIpStrategyPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpWhiteListOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpWhiteListPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpWhiteListIpStrategyOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecIpWhiteListIpStrategyPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertInfoOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertInfoPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertInfoIssuerOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertInfoIssuerPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertInfoSubjectOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecPassTLSClientCertInfoSubjectPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRateLimitOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRateLimitPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRateLimitSourceCriterionOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRateLimitSourceCriterionPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRateLimitSourceCriterionIpStrategyOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRateLimitSourceCriterionIpStrategyPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRedirectRegexOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRedirectRegexPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRedirectSchemeOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRedirectSchemePtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecReplacePathOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecReplacePathPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecReplacePathRegexOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecReplacePathRegexPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRetryOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecRetryPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecStripPrefixOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecStripPrefixPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecStripPrefixRegexOutput{})
	pulumi.RegisterOutputType(MiddlewareSpecStripPrefixRegexPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecInFlightConnOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecInFlightConnPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecIpAllowListOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecIpAllowListPtrOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecIpWhiteListOutput{})
	pulumi.RegisterOutputType(MiddlewareTCPSpecIpWhiteListPtrOutput{})
	pulumi.RegisterOutputType(ServersTransportSpecOutput{})
	pulumi.RegisterOutputType(ServersTransportSpecPtrOutput{})
	pulumi.RegisterOutputType(ServersTransportSpecForwardingTimeoutsOutput{})
	pulumi.RegisterOutputType(ServersTransportSpecForwardingTimeoutsPtrOutput{})
	pulumi.RegisterOutputType(ServersTransportSpecSpiffeOutput{})
	pulumi.RegisterOutputType(ServersTransportSpecSpiffePtrOutput{})
	pulumi.RegisterOutputType(ServersTransportTCPSpecOutput{})
	pulumi.RegisterOutputType(ServersTransportTCPSpecPtrOutput{})
	pulumi.RegisterOutputType(ServersTransportTCPSpecTlsOutput{})
	pulumi.RegisterOutputType(ServersTransportTCPSpecTlsPtrOutput{})
	pulumi.RegisterOutputType(ServersTransportTCPSpecTlsSpiffeOutput{})
	pulumi.RegisterOutputType(ServersTransportTCPSpecTlsSpiffePtrOutput{})
	pulumi.RegisterOutputType(TLSOptionSpecOutput{})
	pulumi.RegisterOutputType(TLSOptionSpecPtrOutput{})
	pulumi.RegisterOutputType(TLSOptionSpecClientAuthOutput{})
	pulumi.RegisterOutputType(TLSOptionSpecClientAuthPtrOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecPtrOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecCertificatesOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecCertificatesArrayOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecDefaultCertificateOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecDefaultCertificatePtrOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecDefaultGeneratedCertOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecDefaultGeneratedCertPtrOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecDefaultGeneratedCertDomainOutput{})
	pulumi.RegisterOutputType(TLSStoreSpecDefaultGeneratedCertDomainPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringHealthCheckOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringHealthCheckPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsArrayOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsHealthCheckOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsHealthCheckPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsResponseForwardingOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsResponseForwardingPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsStickyOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsStickyPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsStickyCookieOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringMirrorsStickyCookiePtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringResponseForwardingOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringResponseForwardingPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringStickyOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringStickyPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringStickyCookieOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecMirroringStickyCookiePtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesArrayOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesHealthCheckOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesHealthCheckPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesResponseForwardingOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesResponseForwardingPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesStickyOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesStickyPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesStickyCookieOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedServicesStickyCookiePtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedStickyOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedStickyPtrOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedStickyCookieOutput{})
	pulumi.RegisterOutputType(TraefikServiceSpecWeightedStickyCookiePtrOutput{})
}
