// Package v3 provides primitives to interact with the openapi HTTP API.
//
// Code generated by github.com/egoscale/v3/generator version v0.0.1 DO NOT EDIT.
package v3

import (
	"net"
	"time"
)

type AccessKeyType string

const (
	AccessKeyTypeRestricted   AccessKeyType = "restricted"
	AccessKeyTypeUnrestricted AccessKeyType = "unrestricted"
)

type AccessKeyVersion string

const (
	AccessKeyVersionV2 AccessKeyVersion = "v2"
	AccessKeyVersionV1 AccessKeyVersion = "v1"
)

// IAM Access Key
type AccessKey struct {
	// IAM Access Key
	Key string `json:"key,omitempty"`
	// IAM Access Key name
	Name string `json:"name,omitempty"`
	// IAM Access Key operations
	Operations []string `json:"operations,omitempty"`
	// IAM Access Key Resources
	Resources []AccessKeyResource `json:"resources,omitempty"`
	// IAM Access Key Secret
	Secret string `json:"secret,omitempty"`
	// IAM Access Key tags
	Tags []string `json:"tags,omitempty"`
	// IAM Access Key type
	Type AccessKeyType `json:"type,omitempty"`
	// IAM Access Key version
	Version AccessKeyVersion `json:"version,omitempty"`
}

// Access key operation
type AccessKeyOperation struct {
	// Name of the operation
	Operation string `json:"operation,omitempty"`
	// Tags associated with the operation
	Tags []string `json:"tags,omitempty"`
}

type AccessKeyResourceDomain string

const (
	AccessKeyResourceDomainPartner AccessKeyResourceDomain = "partner"
	AccessKeyResourceDomainSOS     AccessKeyResourceDomain = "sos"
)

type AccessKeyResourceResourceType string

const (
	AccessKeyResourceResourceTypeProduct AccessKeyResourceResourceType = "product"
	AccessKeyResourceResourceTypeBucket  AccessKeyResourceResourceType = "bucket"
)

// Access key resource
type AccessKeyResource struct {
	// Resource domain
	Domain AccessKeyResourceDomain `json:"domain,omitempty"`
	// Resource name
	ResourceName string `json:"resource-name,omitempty"`
	// Resource type
	ResourceType AccessKeyResourceResourceType `json:"resource-type,omitempty"`
}

// Anti-affinity Group
type AntiAffinityGroup struct {
	// Anti-affinity Group description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Anti-affinity Group ID
	ID UUID `json:"id,omitempty"`
	// Anti-affinity Group instances
	Instances []Instance `json:"instances,omitempty"`
	// Anti-affinity Group name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
}

// Anti-affinity group reference
type AntiAffinityGroupRef struct {
	// Anti-affinity group ID
	ID UUID `json:"id,omitempty"`
}

type BlockStorageSnapshotState string

const (
	BlockStorageSnapshotStatePartiallyDestroyed BlockStorageSnapshotState = "partially-destroyed"
	BlockStorageSnapshotStateDestroying         BlockStorageSnapshotState = "destroying"
	BlockStorageSnapshotStateCreating           BlockStorageSnapshotState = "creating"
	BlockStorageSnapshotStateCreated            BlockStorageSnapshotState = "created"
	BlockStorageSnapshotStatePromoting          BlockStorageSnapshotState = "promoting"
	BlockStorageSnapshotStateError              BlockStorageSnapshotState = "error"
	BlockStorageSnapshotStateDestroyed          BlockStorageSnapshotState = "destroyed"
	BlockStorageSnapshotStateAllocated          BlockStorageSnapshotState = "allocated"
)

// Block storage snapshot
type BlockStorageSnapshot struct {
	// Target block storage volume
	BlockStorageVolume *BlockStorageVolumeTarget `json:"block-storage-volume,omitempty"`
	// Snapshot creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Snapshot ID
	ID     UUID   `json:"id,omitempty"`
	Labels Labels `json:"labels,omitempty"`
	// Snapshot name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Snapshot size
	Size int64 `json:"size,omitempty" validate:"omitempty,gte=1"`
	// Snapshot state
	State BlockStorageSnapshotState `json:"state,omitempty"`
	// Original Volume size
	VolumeSize int64 `json:"volume-size,omitempty" validate:"omitempty,gte=0"`
}

// Target block storage snapshot
type BlockStorageSnapshotRef struct {
	// Block storage snapshot ID
	ID UUID `json:"id,omitempty"`
}

type BlockStorageVolumeState string

const (
	BlockStorageVolumeStateSnapshotting BlockStorageVolumeState = "snapshotting"
	BlockStorageVolumeStateDeleted      BlockStorageVolumeState = "deleted"
	BlockStorageVolumeStateCreating     BlockStorageVolumeState = "creating"
	BlockStorageVolumeStateDetached     BlockStorageVolumeState = "detached"
	BlockStorageVolumeStateDeleting     BlockStorageVolumeState = "deleting"
	BlockStorageVolumeStateAttaching    BlockStorageVolumeState = "attaching"
	BlockStorageVolumeStateError        BlockStorageVolumeState = "error"
	BlockStorageVolumeStateAttached     BlockStorageVolumeState = "attached"
	BlockStorageVolumeStateDetaching    BlockStorageVolumeState = "detaching"
)

// Block storage volume
type BlockStorageVolume struct {
	// Volume snapshots, if any
	BlockStorageSnapshots []BlockStorageSnapshotTarget `json:"block-storage-snapshots,omitempty"`
	// Volume block size
	Blocksize int64 `json:"blocksize,omitempty" validate:"omitempty,gte=0"`
	// Volume creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Volume ID
	ID UUID `json:"id,omitempty"`
	// Target Instance
	Instance *InstanceTarget `json:"instance,omitempty"`
	Labels   Labels          `json:"labels,omitempty"`
	// Volume name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Volume size
	Size int64 `json:"size,omitempty" validate:"omitempty,gte=1"`
	// Volume state
	State BlockStorageVolumeState `json:"state,omitempty"`
}

// Target block storage volume
type BlockStorageVolumeRef struct {
	// Block storage volume ID
	ID UUID `json:"id,omitempty"`
}

// Deployment an AI model onto a set of GPUs
type CreateDeploymentRequest struct {
	// Number of GPUs (1-8)
	GpuCount int64 `json:"gpu-count" validate:"required,gte=1"`
	// GPU type family (e.g., gpua5000, gpu3080ti)
	GpuType string `json:"gpu-type" validate:"required"`
	// Optional extra inference engine server CLI args
	InferenceEngineParameters []string `json:"inference-engine-parameters,omitempty"`
	// Inference engine version
	InferenceEngineVersion InferenceEngineVersion `json:"inference-engine-version,omitempty"`
	Model                  *ModelRef              `json:"model" validate:"required"`
	// Deployment name
	Name string `json:"name" validate:"required,gte=1"`
	// Number of replicas (>=1)
	Replicas int64 `json:"replicas" validate:"required,gte=1"`
}

// AI model
type CreateModelRequest struct {
	// Huggingface Token
	HuggingfaceToken string `json:"huggingface-token,omitempty"`
	// Model name
	Name string `json:"name" validate:"required,gte=1"`
}

// DBaaS plan backup config
type DBAASBackupConfig struct {
	// Interval of taking a frequent backup in service types supporting different backup schedules
	FrequentIntervalMinutes int64 `json:"frequent-interval-minutes,omitempty" validate:"omitempty,gte=0"`
	// Maximum age of the oldest frequent backup in service types supporting different backup schedules
	FrequentOldestAgeMinutes int64 `json:"frequent-oldest-age-minutes,omitempty" validate:"omitempty,gte=0"`
	// Interval of taking a frequent backup in service types supporting different backup schedules
	InfrequentIntervalMinutes int64 `json:"infrequent-interval-minutes,omitempty" validate:"omitempty,gte=0"`
	// Maximum age of the oldest infrequent backup in service types supporting different backup schedules
	InfrequentOldestAgeMinutes int64 `json:"infrequent-oldest-age-minutes,omitempty" validate:"omitempty,gte=0"`
	// The interval, in hours, at which backups are generated.
	// For some services, like PostgreSQL, this is the interval
	// at which full snapshots are taken and continuous incremental
	// backup stream is maintained in addition to that.
	Interval int64 `json:"interval,omitempty" validate:"omitempty,gt=0"`
	// Maximum number of backups to keep. Zero when no backups are created.
	MaxCount int64 `json:"max-count,omitempty" validate:"omitempty,gte=0"`
	// Mechanism how backups can be restored. 'regular'
	// means a backup is restored as is so that the system
	// is restored to the state it was when the backup was generated.
	// 'pitr' means point-in-time-recovery, which allows restoring the system to any state since the first available full snapshot.
	RecoveryMode string `json:"recovery-mode,omitempty"`
}

type DBAASDatabaseName string

type DBAASDatadogTag struct {
	// Optional tag explanation
	Comment string `json:"comment,omitempty" validate:"omitempty,lte=1024"`
	// Tag value
	Tag string `json:"tag" validate:"required,gte=1,lte=200"`
}

type DBAASEndpointDatadogCommon struct {
	// Custom tags provided by user
	DatadogTags []DBAASDatadogTag `json:"datadog-tags,omitempty"`
	// Disable kafka consumer group metrics. Applies only when attached to kafka services.
	DisableConsumerStats *bool `json:"disable-consumer-stats,omitempty"`
	// Number of separate instances to fetch kafka consumer statistics with. Applies only when attached to kafka services.
	KafkaConsumerCheckInstances int64 `json:"kafka-consumer-check-instances,omitempty" validate:"omitempty,gte=1,lte=100"`
	// Number of seconds that datadog will wait to get consumer statistics from brokers. Applies only when attached to kafka services.
	KafkaConsumerStatsTimeout int64 `json:"kafka-consumer-stats-timeout,omitempty" validate:"omitempty,gte=2,lte=300"`
	// Maximum number of partition contexts to send. Applies only when attached to kafka services.
	MaxPartitionContexts int64 `json:"max-partition-contexts,omitempty" validate:"omitempty,gte=200,lte=200000"`
}

type DBAASEndpointDatadogInputCreateSettings struct {
	// Datadog API key
	DatadogAPIKey string `json:"datadog-api-key" validate:"required,gte=1,lte=256"`
	// Custom tags provided by user
	DatadogTags []DBAASDatadogTag `json:"datadog-tags,omitempty"`
	// Disable kafka consumer group metrics. Applies only when attached to kafka services.
	DisableConsumerStats *bool `json:"disable-consumer-stats,omitempty"`
	// Number of separate instances to fetch kafka consumer statistics with. Applies only when attached to kafka services.
	KafkaConsumerCheckInstances int64 `json:"kafka-consumer-check-instances,omitempty" validate:"omitempty,gte=1,lte=100"`
	// Number of seconds that datadog will wait to get consumer statistics from brokers. Applies only when attached to kafka services.
	KafkaConsumerStatsTimeout int64 `json:"kafka-consumer-stats-timeout,omitempty" validate:"omitempty,gte=2,lte=300"`
	// Maximum number of partition contexts to send. Applies only when attached to kafka services.
	MaxPartitionContexts int64           `json:"max-partition-contexts,omitempty" validate:"omitempty,gte=200,lte=200000"`
	Site                 EnumDatadogSite `json:"site" validate:"required"`
}

type DBAASEndpointDatadogInputCreate struct {
	Settings *DBAASEndpointDatadogInputCreateSettings `json:"settings,omitempty"`
}

type DBAASEndpointDatadogInputUpdateSettings struct {
	// Datadog API key
	DatadogAPIKey string `json:"datadog-api-key" validate:"required,gte=1,lte=256"`
	// Custom tags provided by user
	DatadogTags []DBAASDatadogTag `json:"datadog-tags,omitempty"`
	// Disable kafka consumer group metrics. Applies only when attached to kafka services.
	DisableConsumerStats *bool `json:"disable-consumer-stats,omitempty"`
	// Number of separate instances to fetch kafka consumer statistics with. Applies only when attached to kafka services.
	KafkaConsumerCheckInstances int64 `json:"kafka-consumer-check-instances,omitempty" validate:"omitempty,gte=1,lte=100"`
	// Number of seconds that datadog will wait to get consumer statistics from brokers. Applies only when attached to kafka services.
	KafkaConsumerStatsTimeout int64 `json:"kafka-consumer-stats-timeout,omitempty" validate:"omitempty,gte=2,lte=300"`
	// Maximum number of partition contexts to send. Applies only when attached to kafka services.
	MaxPartitionContexts int64           `json:"max-partition-contexts,omitempty" validate:"omitempty,gte=200,lte=200000"`
	Site                 EnumDatadogSite `json:"site,omitempty"`
}

type DBAASEndpointDatadogInputUpdate struct {
	Settings *DBAASEndpointDatadogInputUpdateSettings `json:"settings,omitempty"`
}

// External integration DataDog configuration
type DBAASEndpointDatadogSettingsSettings struct {
	// Custom tags provided by user
	DatadogTags []DBAASDatadogTag `json:"datadog-tags,omitempty"`
	// Disable kafka consumer group metrics. Applies only when attached to kafka services.
	DisableConsumerStats *bool `json:"disable-consumer-stats,omitempty"`
	// Number of separate instances to fetch kafka consumer statistics with. Applies only when attached to kafka services.
	KafkaConsumerCheckInstances int64 `json:"kafka-consumer-check-instances,omitempty" validate:"omitempty,gte=1,lte=100"`
	// Number of seconds that datadog will wait to get consumer statistics from brokers. Applies only when attached to kafka services.
	KafkaConsumerStatsTimeout int64 `json:"kafka-consumer-stats-timeout,omitempty" validate:"omitempty,gte=2,lte=300"`
	// Maximum number of partition contexts to send. Applies only when attached to kafka services.
	MaxPartitionContexts int64           `json:"max-partition-contexts,omitempty" validate:"omitempty,gte=200,lte=200000"`
	Site                 EnumDatadogSite `json:"site,omitempty"`
}

type DBAASEndpointDatadogSettings struct {
	// External integration DataDog configuration
	Settings *DBAASEndpointDatadogSettingsSettings `json:"settings,omitempty"`
}

type DBAASEndpointElasticsearch struct {
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// Elasticsearch index prefix
	IndexPrefix string `json:"index-prefix" validate:"required,gte=1,lte=1000"`
	// Elasticsearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// Elasticsearch connection URL
	URL string `json:"url" validate:"required,gte=12,lte=2048"`
}

type DBAASEndpointElasticsearchInputCreateSettings struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// Elasticsearch index prefix
	IndexPrefix string `json:"index-prefix" validate:"required,gte=1,lte=1000"`
	// Elasticsearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// Elasticsearch connection URL
	URL string `json:"url" validate:"required,gte=12,lte=2048"`
}

type DBAASEndpointElasticsearchInputCreate struct {
	Settings *DBAASEndpointElasticsearchInputCreateSettings `json:"settings,omitempty"`
}

type DBAASEndpointElasticsearchInputUpdateSettings struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// Elasticsearch index prefix
	IndexPrefix string `json:"index-prefix,omitempty" validate:"omitempty,gte=1,lte=1000"`
	// Elasticsearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// Elasticsearch connection URL
	URL string `json:"url,omitempty" validate:"omitempty,gte=12,lte=2048"`
}

type DBAASEndpointElasticsearchInputUpdate struct {
	Settings *DBAASEndpointElasticsearchInputUpdateSettings `json:"settings,omitempty"`
}

type DBAASEndpointElasticsearchOptionalFields struct {
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// Elasticsearch index prefix
	IndexPrefix string `json:"index-prefix,omitempty" validate:"omitempty,gte=1,lte=1000"`
	// Elasticsearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// Elasticsearch connection URL
	URL string `json:"url,omitempty" validate:"omitempty,gte=12,lte=2048"`
}

type DBAASEndpointElasticsearchOutput struct {
	// External integration endpoint id
	ID UUID `json:"id,omitempty"`
	// External integration endpoint name
	Name     string                                    `json:"name,omitempty"`
	Settings *DBAASEndpointElasticsearchOptionalFields `json:"settings,omitempty"`
	Type     EnumExternalEndpointTypes                 `json:"type,omitempty"`
}

type DBAASEndpointElasticsearchSecrets struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
}

// External integration Prometheus configuration
type DBAASEndpointExternalPrometheusOutputSettings struct {
	// Prometheus basic authentication username
	BasicAuthUsername string `json:"basic-auth-username,omitempty" validate:"omitempty,gte=5,lte=32"`
}

type DBAASEndpointExternalPrometheusOutput struct {
	// External integration endpoint id
	ID UUID `json:"id,omitempty"`
	// External integration endpoint name
	Name string `json:"name,omitempty"`
	// External integration Prometheus configuration
	Settings *DBAASEndpointExternalPrometheusOutputSettings `json:"settings,omitempty"`
	Type     EnumExternalEndpointTypes                      `json:"type,omitempty"`
}

type DBAASEndpointOpensearch struct {
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// OpenSearch index prefix
	IndexPrefix string `json:"index-prefix" validate:"required,gte=1,lte=1000"`
	// OpenSearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// OpenSearch connection URL
	URL string `json:"url" validate:"required,gte=12,lte=2048"`
}

type DBAASEndpointOpensearchInputCreateSettings struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// OpenSearch index prefix
	IndexPrefix string `json:"index-prefix" validate:"required,gte=1,lte=1000"`
	// OpenSearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// OpenSearch connection URL
	URL string `json:"url" validate:"required,gte=12,lte=2048"`
}

type DBAASEndpointOpensearchInputCreate struct {
	Settings *DBAASEndpointOpensearchInputCreateSettings `json:"settings,omitempty"`
}

type DBAASEndpointOpensearchInputUpdateSettings struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// OpenSearch index prefix
	IndexPrefix string `json:"index-prefix,omitempty" validate:"omitempty,gte=1,lte=1000"`
	// OpenSearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// OpenSearch connection URL
	URL string `json:"url,omitempty" validate:"omitempty,gte=12,lte=2048"`
}

type DBAASEndpointOpensearchInputUpdate struct {
	Settings *DBAASEndpointOpensearchInputUpdateSettings `json:"settings,omitempty"`
}

type DBAASEndpointOpensearchOptionalFields struct {
	// Maximum number of days of logs to keep
	IndexDaysMax int64 `json:"index-days-max,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// OpenSearch index prefix
	IndexPrefix string `json:"index-prefix,omitempty" validate:"omitempty,gte=1,lte=1000"`
	// OpenSearch request timeout limit
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=10,lte=120"`
	// OpenSearch connection URL
	URL string `json:"url,omitempty" validate:"omitempty,gte=12,lte=2048"`
}

type DBAASEndpointOpensearchOutput struct {
	// External integration endpoint id
	ID UUID `json:"id,omitempty"`
	// External integration endpoint name
	Name     string                                 `json:"name,omitempty"`
	Settings *DBAASEndpointOpensearchOptionalFields `json:"settings,omitempty"`
	Type     EnumExternalEndpointTypes              `json:"type,omitempty"`
}

type DBAASEndpointOpensearchSecrets struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
}

type DBAASEndpointPrometheus struct {
	// Prometheus basic authentication username
	BasicAuthUsername string `json:"basic-auth-username,omitempty" validate:"omitempty,gte=5,lte=32"`
}

type DBAASEndpointPrometheusPayloadSettings struct {
	// Prometheus basic authentication password
	BasicAuthPassword string `json:"basic-auth-password,omitempty" validate:"omitempty,gte=8,lte=64"`
	// Prometheus basic authentication username
	BasicAuthUsername string `json:"basic-auth-username,omitempty" validate:"omitempty,gte=5,lte=32"`
}

type DBAASEndpointPrometheusPayload struct {
	Settings *DBAASEndpointPrometheusPayloadSettings `json:"settings,omitempty"`
}

type DBAASEndpointPrometheusSecrets struct {
	// Prometheus basic authentication password
	BasicAuthPassword string `json:"basic-auth-password,omitempty" validate:"omitempty,gte=8,lte=64"`
}

type DBAASEndpointRsyslog struct {
	Format EnumRsyslogFormat `json:"format" validate:"required"`
	// Custom syslog message format
	Logline string `json:"logline,omitempty" validate:"omitempty,gte=1,lte=512"`
	// Rsyslog max message size
	MaxMessageSize int64 `json:"max-message-size,omitempty" validate:"omitempty,gte=2048,lte=2.147483647e+09"`
	// Rsyslog server port
	Port int64 `json:"port" validate:"required,gte=1,lte=65535"`
	// Structured data block for log message
	SD string `json:"sd,omitempty" validate:"omitempty,lte=1024"`
	// Rsyslog server IP address or hostname
	Server string `json:"server" validate:"required,gte=4,lte=255"`
	// Require TLS
	Tls *bool `json:"tls" validate:"required"`
}

type DBAASEndpointRsyslogInputCreateSettings struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// PEM encoded client certificate
	Cert   string            `json:"cert,omitempty" validate:"omitempty,lte=16384"`
	Format EnumRsyslogFormat `json:"format" validate:"required"`
	// PEM encoded client key
	Key string `json:"key,omitempty" validate:"omitempty,lte=16384"`
	// Custom syslog message format
	Logline string `json:"logline,omitempty" validate:"omitempty,gte=1,lte=512"`
	// Rsyslog max message size
	MaxMessageSize int64 `json:"max-message-size,omitempty" validate:"omitempty,gte=2048,lte=2.147483647e+09"`
	// Rsyslog server port
	Port int64 `json:"port" validate:"required,gte=1,lte=65535"`
	// Structured data block for log message
	SD string `json:"sd,omitempty" validate:"omitempty,lte=1024"`
	// Rsyslog server IP address or hostname
	Server string `json:"server" validate:"required,gte=4,lte=255"`
	// Require TLS
	Tls *bool `json:"tls" validate:"required"`
}

type DBAASEndpointRsyslogInputCreate struct {
	Settings *DBAASEndpointRsyslogInputCreateSettings `json:"settings,omitempty"`
}

type DBAASEndpointRsyslogInputUpdateSettings struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// PEM encoded client certificate
	Cert   string            `json:"cert,omitempty" validate:"omitempty,lte=16384"`
	Format EnumRsyslogFormat `json:"format,omitempty"`
	// PEM encoded client key
	Key string `json:"key,omitempty" validate:"omitempty,lte=16384"`
	// Custom syslog message format
	Logline string `json:"logline,omitempty" validate:"omitempty,gte=1,lte=512"`
	// Rsyslog max message size
	MaxMessageSize int64 `json:"max-message-size,omitempty" validate:"omitempty,gte=2048,lte=2.147483647e+09"`
	// Rsyslog server port
	Port int64 `json:"port,omitempty" validate:"omitempty,gte=1,lte=65535"`
	// Structured data block for log message
	SD string `json:"sd,omitempty" validate:"omitempty,lte=1024"`
	// Rsyslog server IP address or hostname
	Server string `json:"server,omitempty" validate:"omitempty,gte=4,lte=255"`
	// Require TLS
	Tls *bool `json:"tls,omitempty"`
}

type DBAASEndpointRsyslogInputUpdate struct {
	Settings *DBAASEndpointRsyslogInputUpdateSettings `json:"settings,omitempty"`
}

type DBAASEndpointRsyslogOptionalFields struct {
	Format EnumRsyslogFormat `json:"format,omitempty"`
	// Custom syslog message format
	Logline string `json:"logline,omitempty" validate:"omitempty,gte=1,lte=512"`
	// Rsyslog max message size
	MaxMessageSize int64 `json:"max-message-size,omitempty" validate:"omitempty,gte=2048,lte=2.147483647e+09"`
	// Rsyslog server port
	Port int64 `json:"port,omitempty" validate:"omitempty,gte=1,lte=65535"`
	// Structured data block for log message
	SD string `json:"sd,omitempty" validate:"omitempty,lte=1024"`
	// Rsyslog server IP address or hostname
	Server string `json:"server,omitempty" validate:"omitempty,gte=4,lte=255"`
	// Require TLS
	Tls *bool `json:"tls,omitempty"`
}

type DBAASEndpointRsyslogSecrets struct {
	// PEM encoded CA certificate
	CA string `json:"ca,omitempty" validate:"omitempty,lte=16384"`
	// PEM encoded client certificate
	Cert string `json:"cert,omitempty" validate:"omitempty,lte=16384"`
	// PEM encoded client key
	Key string `json:"key,omitempty" validate:"omitempty,lte=16384"`
}

type DBAASExternalEndpoint struct {
	// External integration endpoint id
	ID UUID `json:"id,omitempty"`
	// External integration endpoint name
	Name string                    `json:"name,omitempty"`
	Type EnumExternalEndpointTypes `json:"type,omitempty"`
}

// External integration DataDog configuration
type DBAASExternalEndpointDatadogOutputSettings struct {
	// Custom tags provided by user
	DatadogTags []DBAASDatadogTag `json:"datadog-tags,omitempty"`
	// Disable kafka consumer group metrics. Applies only when attached to kafka services.
	DisableConsumerStats *bool `json:"disable-consumer-stats,omitempty"`
	// Number of separate instances to fetch kafka consumer statistics with. Applies only when attached to kafka services.
	KafkaConsumerCheckInstances int64 `json:"kafka-consumer-check-instances,omitempty" validate:"omitempty,gte=1,lte=100"`
	// Number of seconds that datadog will wait to get consumer statistics from brokers. Applies only when attached to kafka services.
	KafkaConsumerStatsTimeout int64 `json:"kafka-consumer-stats-timeout,omitempty" validate:"omitempty,gte=2,lte=300"`
	// Maximum number of partition contexts to send. Applies only when attached to kafka services.
	MaxPartitionContexts int64           `json:"max-partition-contexts,omitempty" validate:"omitempty,gte=200,lte=200000"`
	Site                 EnumDatadogSite `json:"site,omitempty"`
}

type DBAASExternalEndpointDatadogOutput struct {
	// External integration endpoint id
	ID UUID `json:"id,omitempty"`
	// External integration endpoint name
	Name string `json:"name,omitempty"`
	// External integration DataDog configuration
	Settings *DBAASExternalEndpointDatadogOutputSettings `json:"settings,omitempty"`
	Type     EnumExternalEndpointTypes                   `json:"type,omitempty"`
}

type DBAASExternalEndpointRsyslogOutput struct {
	// External integration endpoint id
	ID UUID `json:"id,omitempty"`
	// External integration endpoint name
	Name     string                              `json:"name,omitempty"`
	Settings *DBAASEndpointRsyslogOptionalFields `json:"settings,omitempty"`
	Type     EnumExternalEndpointTypes           `json:"type,omitempty"`
}

// Integrations with other services
type DBAASExternalIntegration struct {
	// Description of the integration
	Description string `json:"description" validate:"required"`
	// External destination endpoint id
	DestEndpointID string `json:"dest-endpoint-id,omitempty"`
	// External destination endpoint name
	DestEndpointName string `json:"dest-endpoint-name,omitempty"`
	// Endpoint integration UUID
	IntegrationID UUID `json:"integration-id,omitempty"`
	// DBaaS source service name
	SourceServiceName string               `json:"source-service-name" validate:"required"`
	SourceServiceType DBAASServiceTypeName `json:"source-service-type" validate:"required,gte=0,lte=64"`
	// Integration status
	Status string                    `json:"status,omitempty"`
	Type   EnumExternalEndpointTypes `json:"type" validate:"required"`
}

type DBAASIntegration struct {
	// Description of the integration
	Description string `json:"description,omitempty"`
	// Destination service name
	Dest string `json:"dest,omitempty"`
	// Integration id
	ID UUID `json:"id,omitempty"`
	// Whether the integration is active or not
	ISActive *bool `json:"is-active,omitempty"`
	// Whether the integration is enabled or not
	ISEnabled *bool `json:"is-enabled,omitempty"`
	// Integration settings
	Settings map[string]any `json:"settings,omitempty"`
	// Source service name
	Source string `json:"source,omitempty"`
	// Integration status
	Status string `json:"status,omitempty"`
	// Integration type
	Type string `json:"type,omitempty"`
}

type DBAASIntegrationSettingsDatadog struct {
	// Database monitoring: view query metrics, explain plans, and execution details. Correlate queries with host metrics.
	DatadogDbmEnabled *bool `json:"datadog-dbm-enabled,omitempty"`
	// Integrate PgBouncer with Datadog to track connection pool metrics and monitor application traffic.
	DatadogPgbouncerEnabled *bool `json:"datadog-pgbouncer-enabled,omitempty"`
}

// A JSON schema of additional settings of the integration.
type DBAASIntegrationTypeSettings struct {
	AdditionalProperties *bool          `json:"additionalProperties,omitempty"`
	Properties           map[string]any `json:"properties,omitempty"`
	Title                string         `json:"title,omitempty"`
	Type                 string         `json:"type,omitempty"`
}

type DBAASIntegrationType struct {
	// The description of the destination service types.
	DestDescription string `json:"dest-description,omitempty"`
	// A list of the destination service types the integration supports.
	DestServiceTypes []string `json:"dest-service-types,omitempty"`
	// A JSON schema of additional settings of the integration.
	Settings *DBAASIntegrationTypeSettings `json:"settings,omitempty"`
	// The description of the source service types.
	SourceDescription string `json:"source-description,omitempty"`
	// A list of the source service types the integration supports.
	SourceServiceTypes []string `json:"source-service-types,omitempty"`
	// The type of the integration.
	Type string `json:"type,omitempty"`
}

type DBAASKafkaAclID string

type DBAASKafkaAcls struct {
	SchemaRegistryAcl []DBAASKafkaSchemaRegistryAclEntry `json:"schema-registry-acl,omitempty"`
	TopicAcl          []DBAASKafkaTopicAclEntry          `json:"topic-acl,omitempty"`
}

type DBAASKafkaSchemaRegistryAclEntryPermission string

const (
	DBAASKafkaSchemaRegistryAclEntryPermissionSchemaRegistryRead  DBAASKafkaSchemaRegistryAclEntryPermission = "schema_registry_read"
	DBAASKafkaSchemaRegistryAclEntryPermissionSchemaRegistryWrite DBAASKafkaSchemaRegistryAclEntryPermission = "schema_registry_write"
)

type DBAASKafkaSchemaRegistryAclEntry struct {
	ID DBAASKafkaAclID `json:"id,omitempty" validate:"omitempty,gte=1,lte=40"`
	// Kafka Schema Registry permission
	Permission DBAASKafkaSchemaRegistryAclEntryPermission `json:"permission" validate:"required"`
	// Kafka Schema Registry name or pattern
	Resource string `json:"resource" validate:"required,gte=1,lte=249"`
	// Kafka username or username pattern
	Username string `json:"username" validate:"required,gte=1,lte=64"`
}

type DBAASKafkaTopicAclEntryPermission string

const (
	DBAASKafkaTopicAclEntryPermissionAdmin     DBAASKafkaTopicAclEntryPermission = "admin"
	DBAASKafkaTopicAclEntryPermissionRead      DBAASKafkaTopicAclEntryPermission = "read"
	DBAASKafkaTopicAclEntryPermissionReadwrite DBAASKafkaTopicAclEntryPermission = "readwrite"
	DBAASKafkaTopicAclEntryPermissionWrite     DBAASKafkaTopicAclEntryPermission = "write"
)

type DBAASKafkaTopicAclEntry struct {
	ID DBAASKafkaAclID `json:"id,omitempty" validate:"omitempty,gte=1,lte=40"`
	// Kafka permission
	Permission DBAASKafkaTopicAclEntryPermission `json:"permission" validate:"required"`
	// Kafka topic name or pattern
	Topic string `json:"topic" validate:"required,gte=1,lte=249"`
	// Kafka username or username pattern
	Username string `json:"username" validate:"required,gte=1,lte=64"`
}

type DBAASMigrationStatusDetails struct {
	// Migrated db name
	Dbname string `json:"dbname,omitempty"`
	// Error message in case that migration has failed
	Error string `json:"error,omitempty"`
	// Migration method
	Method string              `json:"method,omitempty"`
	Status EnumMigrationStatus `json:"status,omitempty"`
}

type DBAASMigrationStatus struct {
	// Migration status per database
	Details []DBAASMigrationStatusDetails `json:"details,omitempty"`
	// Error message in case that migration has failed
	Error string `json:"error,omitempty"`
	// Migration method. Empty in case of multiple methods or error
	Method string `json:"method,omitempty"`
	// Migration status
	Status string `json:"status,omitempty"`
}

type DBAASMysqlDatabaseName string

type DBAASMysqlUserPassword string

type DBAASNodeStateRole string

const (
	DBAASNodeStateRoleStandby     DBAASNodeStateRole = "standby"
	DBAASNodeStateRoleMaster      DBAASNodeStateRole = "master"
	DBAASNodeStateRoleReadReplica DBAASNodeStateRole = "read-replica"
)

type DBAASNodeStateState string

const (
	DBAASNodeStateStateLeaving     DBAASNodeStateState = "leaving"
	DBAASNodeStateStateRunning     DBAASNodeStateState = "running"
	DBAASNodeStateStateSyncingData DBAASNodeStateState = "syncing_data"
	DBAASNodeStateStateSettingUPVm DBAASNodeStateState = "setting_up_vm"
	DBAASNodeStateStateUnknown     DBAASNodeStateState = "unknown"
)

// Automatic maintenance settings
type DBAASNodeState struct {
	// Name of the service node
	Name string `json:"name" validate:"required"`
	// Extra information regarding the progress for current state
	ProgressUpdates []DBAASNodeStateProgressUpdate `json:"progress-updates,omitempty"`
	// Role of this node. Only returned for a subset of service types
	Role DBAASNodeStateRole `json:"role,omitempty"`
	// Current state of the service node
	State DBAASNodeStateState `json:"state" validate:"required"`
}

type DBAASNodeStateProgressUpdatePhase string

const (
	DBAASNodeStateProgressUpdatePhaseStream     DBAASNodeStateProgressUpdatePhase = "stream"
	DBAASNodeStateProgressUpdatePhaseBasebackup DBAASNodeStateProgressUpdatePhase = "basebackup"
	DBAASNodeStateProgressUpdatePhasePrepare    DBAASNodeStateProgressUpdatePhase = "prepare"
	DBAASNodeStateProgressUpdatePhaseFinalize   DBAASNodeStateProgressUpdatePhase = "finalize"
)

// Extra information regarding the progress for current state
type DBAASNodeStateProgressUpdate struct {
	// Indicates whether this phase has been completed or not
	Completed *bool `json:"completed" validate:"required"`
	// Current progress for this phase. May be missing or null.
	Current int64 `json:"current,omitempty" validate:"omitempty,gte=0"`
	// Maximum progress value for this phase. May be missing or null. May change.
	Max int64 `json:"max,omitempty" validate:"omitempty,gte=0"`
	// Minimum progress value for this phase. May be missing or null.
	Min int64 `json:"min,omitempty" validate:"omitempty,gte=0"`
	// Key identifying this phase
	Phase DBAASNodeStateProgressUpdatePhase `json:"phase" validate:"required"`
	// Unit for current/min/max values. New units may be added.
	// If null should be treated as generic unit
	Unit string `json:"unit,omitempty"`
}

type DBAASOpensearchAclConfigAclsRules struct {
	// OpenSearch index pattern
	Index      string                       `json:"index" validate:"required,lte=249"`
	Permission EnumOpensearchRulePermission `json:"permission,omitempty"`
}

type DBAASOpensearchAclConfigAcls struct {
	Rules    []DBAASOpensearchAclConfigAclsRules `json:"rules,omitempty"`
	Username DBAASUserUsername                   `json:"username,omitempty" validate:"omitempty,gte=1,lte=64"`
}

type DBAASOpensearchAclConfig struct {
	// Enable OpenSearch ACLs. When disabled authenticated service users have unrestricted access.
	AclEnabled *bool `json:"acl-enabled,omitempty"`
	// List of OpenSearch ACLs
	Acls []DBAASOpensearchAclConfigAcls `json:"acls,omitempty"`
	// Enable to enforce index rules in a limited fashion for requests that use the _mget, _msearch, and _bulk APIs
	ExtendedAclEnabled *bool `json:"extended-acl-enabled,omitempty"`
}

type DBAASPGDatabaseName string

type DBAASPGPoolName string

type DBAASPGPoolSize int64

type DBAASPGPoolUsername string

type DBAASPGTargetVersions string

const (
	DBAASPGTargetVersions14 DBAASPGTargetVersions = "14"
	DBAASPGTargetVersions17 DBAASPGTargetVersions = "17"
	DBAASPGTargetVersions15 DBAASPGTargetVersions = "15"
	DBAASPGTargetVersions18 DBAASPGTargetVersions = "18"
	DBAASPGTargetVersions13 DBAASPGTargetVersions = "13"
	DBAASPGTargetVersions16 DBAASPGTargetVersions = "16"
)

// DBaaS plan
type DBAASPlan struct {
	// Requires authorization or publicly available
	Authorized *bool `json:"authorized,omitempty"`
	// DBaaS plan backup config
	BackupConfig *DBAASBackupConfig `json:"backup-config,omitempty"`
	// DBaaS plan disk space
	DiskSpace int64 `json:"disk-space,omitempty"`
	// Instance family subset which the service can use
	Family string `json:"family,omitempty"`
	// DBaaS plan max memory allocated percentage
	MaxMemoryPercent int64 `json:"max-memory-percent,omitempty" validate:"omitempty,gt=0"`
	// DBaaS plan name
	Name string `json:"name,omitempty"`
	// DBaaS plan node count
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gt=0"`
	// DBaaS plan CPU count per node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gt=0"`
	// DBaaS plan memory count per node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gt=0"`
	// Zones where the plan is available
	Zones []string `json:"zones,omitempty"`
}

type DBAASPostgresUsersUsers struct {
	AllowReplication *bool             `json:"allow-replication,omitempty"`
	Username         DBAASUserUsername `json:"username" validate:"required,gte=1,lte=64"`
}

type DBAASPostgresUsers struct {
	Users []DBAASPostgresUsersUsers `json:"users,omitempty"`
}

// List of backups for the service
type DBAASServiceBackup struct {
	// Internal name of this backup
	BackupName string `json:"backup-name" validate:"required"`
	// Backup timestamp (ISO 8601)
	BackupTime time.Time `json:"backup-time" validate:"required"`
	// Backup's original size before compression
	DataSize int64 `json:"data-size" validate:"required,gte=0"`
}

type DBAASServiceCommon struct {
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	Name         DBAASServiceName   `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// Subscription plan
	Plan  string           `json:"plan" validate:"required"`
	State EnumServiceState `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool                `json:"termination-protection,omitempty"`
	Type                  DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

type DBAASServiceComponentsRoute string

const (
	DBAASServiceComponentsRouteDynamic     DBAASServiceComponentsRoute = "dynamic"
	DBAASServiceComponentsRoutePrivate     DBAASServiceComponentsRoute = "private"
	DBAASServiceComponentsRoutePublic      DBAASServiceComponentsRoute = "public"
	DBAASServiceComponentsRoutePrivatelink DBAASServiceComponentsRoute = "privatelink"
)

type DBAASServiceComponentsUsage string

const (
	DBAASServiceComponentsUsagePrimary DBAASServiceComponentsUsage = "primary"
	DBAASServiceComponentsUsageReplica DBAASServiceComponentsUsage = "replica"
)

// Service component information objects
type DBAASServiceComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host                      string              `json:"host" validate:"required"`
	KafkaAuthenticationMethod EnumKafkaAuthMethod `json:"kafka-authentication-method,omitempty"`
	// Path component of the service URL (useful only if service component is HTTP or HTTPS endpoint)
	Path string `json:"path,omitempty"`
	// Port number for connecting to the service component
	Port int64 `json:"port" validate:"required,gte=0,lte=65535"`
	// Network access route
	Route DBAASServiceComponentsRoute `json:"route" validate:"required"`
	// Whether the endpoint is encrypted or accepts plaintext.
	// By default endpoints are always encrypted and
	// this property is only included for service components that may disable encryption.
	SSL *bool `json:"ssl,omitempty"`
	// DNS usage name
	Usage DBAASServiceComponentsUsage `json:"usage" validate:"required"`
}

type DBAASServiceGrafanaComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host string `json:"host" validate:"required"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// Grafana connection information properties
type DBAASServiceGrafanaConnectionInfo struct {
	Password string `json:"password,omitempty"`
	URI      string `json:"uri,omitempty"`
	Username string `json:"username,omitempty"`
}

// Prometheus integration URI
type DBAASServiceGrafanaPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

type DBAASServiceGrafanaUsers struct {
	Password string `json:"password,omitempty"`
	Type     string `json:"type,omitempty"`
	Username string `json:"username,omitempty"`
}

type DBAASServiceGrafana struct {
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServiceGrafanaComponents `json:"components,omitempty"`
	// Grafana connection information properties
	ConnectionInfo *DBAASServiceGrafanaConnectionInfo `json:"connection-info,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// DbaaS service description
	Description string `json:"description,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Grafana settings
	GrafanaSettings *JSONSchemaGrafana `json:"grafana-settings,omitempty"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allowed CIDR address blocks for incoming connections
	IPFilter []string `json:"ip-filter,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	Name        DBAASServiceName         `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServiceGrafanaPrometheusURI `json:"prometheus-uri" validate:"required"`
	State         EnumServiceState                  `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool                `json:"termination-protection,omitempty"`
	Type                  DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServiceGrafanaUsers `json:"users,omitempty"`
	// Grafana version
	Version string `json:"version,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

// Kafka authentication methods
type DBAASServiceKafkaAuthenticationMethods struct {
	// Whether certificate/SSL authentication is enabled
	Certificate *bool `json:"certificate,omitempty"`
	// Whether SASL authentication is enabled
	Sasl *bool `json:"sasl,omitempty"`
}

type DBAASServiceKafkaComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host                      string              `json:"host" validate:"required"`
	KafkaAuthenticationMethod EnumKafkaAuthMethod `json:"kafka-authentication-method,omitempty"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// Kafka connection information properties
type DBAASServiceKafkaConnectionInfo struct {
	AccessCert  string   `json:"access-cert,omitempty"`
	AccessKey   string   `json:"access-key,omitempty"`
	ConnectURI  string   `json:"connect-uri,omitempty"`
	Nodes       []string `json:"nodes,omitempty"`
	RegistryURI string   `json:"registry-uri,omitempty"`
	RestURI     string   `json:"rest-uri,omitempty"`
}

// Prometheus integration URI
type DBAASServiceKafkaPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

type DBAASServiceKafkaUsers struct {
	AccessCert       string    `json:"access-cert,omitempty"`
	AccessCertExpiry time.Time `json:"access-cert-expiry,omitempty"`
	AccessKey        string    `json:"access-key,omitempty"`
	Password         string    `json:"password,omitempty"`
	Type             string    `json:"type,omitempty"`
	Username         string    `json:"username,omitempty"`
}

type DBAASServiceKafka struct {
	// Kafka authentication methods
	AuthenticationMethods *DBAASServiceKafkaAuthenticationMethods `json:"authentication-methods,omitempty"`
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServiceKafkaComponents `json:"components,omitempty"`
	// Kafka connection information properties
	ConnectionInfo *DBAASServiceKafkaConnectionInfo `json:"connection-info,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allow incoming connections from CIDR address block, e.g. '10.20.0.0/16'
	IPFilter []string `json:"ip-filter,omitempty"`
	// Whether Kafka Connect is enabled
	KafkaConnectEnabled *bool `json:"kafka-connect-enabled,omitempty"`
	// Kafka Connect configuration values
	KafkaConnectSettings *JSONSchemaKafkaConnect `json:"kafka-connect-settings,omitempty"`
	// Whether Kafka REST is enabled
	KafkaRestEnabled *bool `json:"kafka-rest-enabled,omitempty"`
	// Kafka REST configuration
	KafkaRestSettings *JSONSchemaKafkaRest `json:"kafka-rest-settings,omitempty"`
	// Kafka broker configuration values
	KafkaSettings *JSONSchemaKafka `json:"kafka-settings,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	Name        DBAASServiceName         `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServiceKafkaPrometheusURI `json:"prometheus-uri" validate:"required"`
	// Whether Schema-Registry is enabled
	SchemaRegistryEnabled *bool `json:"schema-registry-enabled,omitempty"`
	// Schema Registry configuration
	SchemaRegistrySettings *JSONSchemaSchemaRegistry `json:"schema-registry-settings,omitempty"`
	State                  EnumServiceState          `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool                `json:"termination-protection,omitempty"`
	Type                  DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServiceKafkaUsers `json:"users,omitempty"`
	// Kafka version
	Version string `json:"version,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

type DBAASServiceLogsLogs struct {
	Message string `json:"message,omitempty"`
	Node    string `json:"node,omitempty"`
	Time    string `json:"time,omitempty"`
	Unit    string `json:"unit,omitempty"`
}

type DBAASServiceLogs struct {
	FirstLogOffset string                 `json:"first-log-offset,omitempty"`
	Logs           []DBAASServiceLogsLogs `json:"logs,omitempty"`
	Offset         string                 `json:"offset,omitempty"`
}

type DBAASServiceMaintenanceDow string

const (
	DBAASServiceMaintenanceDowSaturday  DBAASServiceMaintenanceDow = "saturday"
	DBAASServiceMaintenanceDowTuesday   DBAASServiceMaintenanceDow = "tuesday"
	DBAASServiceMaintenanceDowNever     DBAASServiceMaintenanceDow = "never"
	DBAASServiceMaintenanceDowWednesday DBAASServiceMaintenanceDow = "wednesday"
	DBAASServiceMaintenanceDowSunday    DBAASServiceMaintenanceDow = "sunday"
	DBAASServiceMaintenanceDowFriday    DBAASServiceMaintenanceDow = "friday"
	DBAASServiceMaintenanceDowMonday    DBAASServiceMaintenanceDow = "monday"
	DBAASServiceMaintenanceDowThursday  DBAASServiceMaintenanceDow = "thursday"
)

// Automatic maintenance settings
type DBAASServiceMaintenance struct {
	// Day of week for installing updates
	Dow DBAASServiceMaintenanceDow `json:"dow" validate:"required"`
	// Time for installing updates, UTC
	Time string `json:"time" validate:"required,gte=8,lte=8"`
	// List of updates waiting to be installed
	Updates []DBAASServiceUpdate `json:"updates" validate:"required"`
}

// Backup schedule
type DBAASServiceMysqlBackupSchedule struct {
	// The hour of day (in UTC) when backup for the service is started. New backup is only started if previous backup has already completed.
	BackupHour int64 `json:"backup-hour,omitempty" validate:"omitempty,gte=0,lte=23"`
	// The minute of an hour when backup for the service is started. New backup is only started if previous backup has already completed.
	BackupMinute int64 `json:"backup-minute,omitempty" validate:"omitempty,gte=0,lte=59"`
}

type DBAASServiceMysqlComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host string `json:"host" validate:"required"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// MySQL connection information properties
type DBAASServiceMysqlConnectionInfo struct {
	Params  []map[string]string `json:"params,omitempty"`
	Standby []string            `json:"standby,omitempty"`
	URI     []string            `json:"uri,omitempty"`
}

// Prometheus integration URI
type DBAASServiceMysqlPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

type DBAASServiceMysqlUsers struct {
	Authentication string `json:"authentication,omitempty"`
	Password       string `json:"password,omitempty"`
	Type           string `json:"type,omitempty"`
	Username       string `json:"username,omitempty"`
}

type DBAASServiceMysql struct {
	// Backup schedule
	BackupSchedule *DBAASServiceMysqlBackupSchedule `json:"backup-schedule,omitempty"`
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServiceMysqlComponents `json:"components,omitempty"`
	// MySQL connection information properties
	ConnectionInfo *DBAASServiceMysqlConnectionInfo `json:"connection-info,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// List of MySQL databases
	Databases []DBAASMysqlDatabaseName `json:"databases,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allowed CIDR address blocks for incoming connections
	IPFilter []string `json:"ip-filter,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	// mysql.conf configuration values
	MysqlSettings *JSONSchemaMysql `json:"mysql-settings,omitempty"`
	Name          DBAASServiceName `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServiceMysqlPrometheusURI `json:"prometheus-uri" validate:"required"`
	State         EnumServiceState                `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool                `json:"termination-protection,omitempty"`
	Type                  DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServiceMysqlUsers `json:"users,omitempty"`
	// MySQL version
	Version string `json:"version,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

type DBAASServiceName string

type DBAASServiceNotificationLevel string

const (
	DBAASServiceNotificationLevelWarning DBAASServiceNotificationLevel = "warning"
	DBAASServiceNotificationLevelNotice  DBAASServiceNotificationLevel = "notice"
)

type DBAASServiceNotificationType string

const (
	DBAASServiceNotificationTypeServicePoweredOffRemoval DBAASServiceNotificationType = "service_powered_off_removal"
	DBAASServiceNotificationTypeServiceEndOfLife         DBAASServiceNotificationType = "service_end_of_life"
)

// Service notifications
type DBAASServiceNotification struct {
	// Notification level
	Level DBAASServiceNotificationLevel `json:"level" validate:"required"`
	// Human notification message
	Message string `json:"message" validate:"required,gte=1,lte=1024"`
	// Notification type
	Metadata map[string]any `json:"metadata" validate:"required"`
	// Notification type
	Type DBAASServiceNotificationType `json:"type" validate:"required"`
}

type DBAASServiceOpensearchComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host string `json:"host" validate:"required"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// Opensearch connection information properties
type DBAASServiceOpensearchConnectionInfo struct {
	DashboardURI string   `json:"dashboard-uri,omitempty"`
	Password     string   `json:"password,omitempty"`
	URI          []string `json:"uri,omitempty"`
	Username     string   `json:"username,omitempty"`
}

type DBAASServiceOpensearchIndexPatternsSortingAlgorithm string

const (
	DBAASServiceOpensearchIndexPatternsSortingAlgorithmAlphabetical DBAASServiceOpensearchIndexPatternsSortingAlgorithm = "alphabetical"
	DBAASServiceOpensearchIndexPatternsSortingAlgorithmCreationDate DBAASServiceOpensearchIndexPatternsSortingAlgorithm = "creation_date"
)

type DBAASServiceOpensearchIndexPatterns struct {
	// Maximum number of indexes to keep
	MaxIndexCount *int64 `json:"max-index-count,omitempty" validate:"omitempty,gte=0"`
	// fnmatch pattern
	Pattern string `json:"pattern,omitempty" validate:"omitempty,lte=1024"`
	// Deletion sorting algorithm
	SortingAlgorithm DBAASServiceOpensearchIndexPatternsSortingAlgorithm `json:"sorting-algorithm,omitempty"`
}

// Template settings for all new indexes
type DBAASServiceOpensearchIndexTemplate struct {
	// The maximum number of nested JSON objects that a single document can contain across all nested types. This limit helps to prevent out of memory errors when a document contains too many nested objects. Default is 10000.
	MappingNestedObjectsLimit int64 `json:"mapping-nested-objects-limit,omitempty" validate:"omitempty,gte=0,lte=100000"`
	// The number of replicas each primary shard has.
	NumberOfReplicas int64 `json:"number-of-replicas,omitempty" validate:"omitempty,gte=0,lte=29"`
	// The number of primary shards that an index should have.
	NumberOfShards int64 `json:"number-of-shards,omitempty" validate:"omitempty,gte=1,lte=1024"`
}

// OpenSearch Dashboards settings
type DBAASServiceOpensearchOpensearchDashboards struct {
	// Enable or disable OpenSearch Dashboards (default: true)
	Enabled *bool `json:"enabled,omitempty"`
	// Limits the maximum amount of memory (in MiB) the OpenSearch Dashboards process can use. This sets the max_old_space_size option of the nodejs running the OpenSearch Dashboards. Note: the memory reserved by OpenSearch Dashboards is not available for OpenSearch. (default: 128)
	MaxOldSpaceSize int64 `json:"max-old-space-size,omitempty" validate:"omitempty,gte=64,lte=1024"`
	// Timeout in milliseconds for requests made by OpenSearch Dashboards towards OpenSearch (default: 30000)
	OpensearchRequestTimeout int64 `json:"opensearch-request-timeout,omitempty" validate:"omitempty,gte=5000,lte=120000"`
}

// Prometheus integration URI
type DBAASServiceOpensearchPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

type DBAASServiceOpensearchUsers struct {
	Password string `json:"password,omitempty"`
	Type     string `json:"type,omitempty"`
	Username string `json:"username,omitempty"`
}

type DBAASServiceOpensearch struct {
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServiceOpensearchComponents `json:"components,omitempty"`
	// Opensearch connection information properties
	ConnectionInfo *DBAASServiceOpensearchConnectionInfo `json:"connection-info,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// DbaaS service description
	Description string `json:"description,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Allows you to create glob style patterns and set a max number of indexes matching this pattern you want to keep. Creating indexes exceeding this value will cause the oldest one to get deleted. You could for example create a pattern looking like 'logs.?' and then create index logs.1, logs.2 etc, it will delete logs.1 once you create logs.6. Do note 'logs.?' does not apply to logs.10. Note: Setting max_index_count to 0 will do nothing and the pattern gets ignored.
	IndexPatterns []DBAASServiceOpensearchIndexPatterns `json:"index-patterns,omitempty"`
	// Template settings for all new indexes
	IndexTemplate *DBAASServiceOpensearchIndexTemplate `json:"index-template,omitempty"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allowed CIDR address blocks for incoming connections
	IPFilter []string `json:"ip-filter,omitempty"`
	// Aiven automation resets index.refresh_interval to default value for every index to be sure that indices are always visible to search. If it doesn't fit your case, you can disable this by setting up this flag to true.
	KeepIndexRefreshInterval *bool `json:"keep-index-refresh-interval,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	// Maximum number of indexes to keep before deleting the oldest one
	MaxIndexCount *int64           `json:"max-index-count,omitempty" validate:"omitempty,gte=0"`
	Name          DBAASServiceName `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// OpenSearch Dashboards settings
	OpensearchDashboards *DBAASServiceOpensearchOpensearchDashboards `json:"opensearch-dashboards,omitempty"`
	// OpenSearch settings
	OpensearchSettings *JSONSchemaOpensearch `json:"opensearch-settings,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServiceOpensearchPrometheusURI `json:"prometheus-uri" validate:"required"`
	State         EnumServiceState                     `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool                `json:"termination-protection,omitempty"`
	Type                  DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServiceOpensearchUsers `json:"users,omitempty"`
	// OpenSearch version
	Version string `json:"version,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

// Backup schedule
type DBAASServicePGBackupSchedule struct {
	// The hour of day (in UTC) when backup for the service is started. New backup is only started if previous backup has already completed.
	BackupHour int64 `json:"backup-hour,omitempty" validate:"omitempty,gte=0,lte=23"`
	// The minute of an hour when backup for the service is started. New backup is only started if previous backup has already completed.
	BackupMinute int64 `json:"backup-minute,omitempty" validate:"omitempty,gte=0,lte=59"`
}

type DBAASServicePGComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host string `json:"host" validate:"required"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// PG connection information properties
type DBAASServicePGConnectionInfo struct {
	Params  []map[string]string `json:"params,omitempty"`
	Standby []string            `json:"standby,omitempty"`
	Syncing []string            `json:"syncing,omitempty"`
	URI     []string            `json:"uri,omitempty"`
}

type DBAASServicePGConnectionPools struct {
	// Connection URI for the DB pool
	ConnectionURI string              `json:"connection-uri" validate:"required"`
	Database      DBAASDatabaseName   `json:"database" validate:"required,gte=1,lte=40"`
	Mode          EnumPGPoolMode      `json:"mode" validate:"required"`
	Name          DBAASPGPoolName     `json:"name" validate:"required,gte=1,lte=63"`
	Size          DBAASPGPoolSize     `json:"size" validate:"required,gte=1,lte=10000"`
	Username      DBAASPGPoolUsername `json:"username" validate:"required,gte=1,lte=64"`
}

// Prometheus integration URI
type DBAASServicePGPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

// List of service users
type DBAASServicePGUsers struct {
	AllowReplication *bool `json:"allow-replication,omitempty"`
	// Account password. A missing field indicates a user overridden password.
	Password string `json:"password,omitempty"`
	// Account type
	Type string `json:"type" validate:"required"`
	// Account username
	Username string `json:"username" validate:"required"`
}

type DBAASServicePG struct {
	// Backup schedule
	BackupSchedule *DBAASServicePGBackupSchedule `json:"backup-schedule,omitempty"`
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServicePGComponents `json:"components,omitempty"`
	// PG connection information properties
	ConnectionInfo *DBAASServicePGConnectionInfo `json:"connection-info,omitempty"`
	// PostgreSQL PGBouncer connection pools
	ConnectionPools []DBAASServicePGConnectionPools `json:"connection-pools,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// List of PostgreSQL databases
	Databases []DBAASDatabaseName `json:"databases,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allowed CIDR address blocks for incoming connections
	IPFilter []string `json:"ip-filter,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	// Maximum number of connections allowed to an instance
	MaxConnections int64            `json:"max-connections,omitempty" validate:"omitempty,gt=0"`
	Name           DBAASServiceName `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// postgresql.conf configuration values
	PGSettings *JSONSchemaPG `json:"pg-settings,omitempty"`
	// System-wide settings for pgbouncer.
	PgbouncerSettings *JSONSchemaPgbouncer `json:"pgbouncer-settings,omitempty"`
	// System-wide settings for pglookout.
	PglookoutSettings *JSONSchemaPglookout `json:"pglookout-settings,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServicePGPrometheusURI `json:"prometheus-uri" validate:"required"`
	// Percentage of total RAM that the database server uses for shared memory buffers. Valid range is 20-60 (float), which corresponds to 20% - 60%. This setting adjusts the shared_buffers configuration value.
	SharedBuffersPercentage int64                        `json:"shared-buffers-percentage,omitempty" validate:"omitempty,gte=20,lte=60"`
	State                   EnumServiceState             `json:"state,omitempty"`
	SynchronousReplication  EnumPGSynchronousReplication `json:"synchronous-replication,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool `json:"termination-protection,omitempty"`
	// System-wide settings for the timescaledb extension
	TimescaledbSettings *JSONSchemaTimescaledb `json:"timescaledb-settings,omitempty"`
	Type                DBAASServiceTypeName   `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServicePGUsers `json:"users,omitempty"`
	// PostgreSQL version
	Version string `json:"version,omitempty"`
	// Sets the maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files, in MB. Default is 1MB + 0.075% of total RAM (up to 32MB).
	WorkMem int64 `json:"work-mem,omitempty" validate:"omitempty,gte=1,lte=1024"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

type DBAASServiceThanosComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host string `json:"host" validate:"required"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	// Whether the endpoint is encrypted or accepts plaintext.
	// By default endpoints are always encrypted and
	// this property is only included for service components that may disable encryption.
	SSL   *bool              `json:"ssl,omitempty"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// Thanos connection information properties
type DBAASServiceThanosConnectionInfo struct {
	QueryFrontendURI       string `json:"query-frontend-uri,omitempty"`
	QueryURI               string `json:"query-uri,omitempty"`
	ReceiverRemoteWriteURI string `json:"receiver-remote-write-uri,omitempty"`
	RulerURI               string `json:"ruler-uri,omitempty"`
}

// Prometheus integration URI
type DBAASServiceThanosPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

type DBAASServiceThanosUsers struct {
	Password string `json:"password,omitempty"`
	Type     string `json:"type,omitempty"`
	Username string `json:"username,omitempty"`
}

type DBAASServiceThanos struct {
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServiceThanosComponents `json:"components,omitempty"`
	// Thanos connection information properties
	ConnectionInfo *DBAASServiceThanosConnectionInfo `json:"connection-info,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allowed CIDR address blocks for incoming connections
	IPFilter []string `json:"ip-filter,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	Name        DBAASServiceName         `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServiceThanosPrometheusURI `json:"prometheus-uri" validate:"required"`
	State         EnumServiceState                 `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool `json:"termination-protection,omitempty"`
	// Thanos settings
	ThanosSettings *JSONSchemaThanos    `json:"thanos-settings,omitempty"`
	Type           DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServiceThanosUsers `json:"users,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

// DBaaS service
type DBAASServiceType struct {
	// DbaaS service available versions
	AvailableVersions []string `json:"available-versions,omitempty"`
	// DbaaS service default version
	DefaultVersion string `json:"default-version,omitempty"`
	// DbaaS service description
	Description string               `json:"description,omitempty"`
	Name        DBAASServiceTypeName `json:"name,omitempty" validate:"omitempty,gte=0,lte=64"`
	// DbaaS service plans
	Plans []DBAASPlan `json:"plans,omitempty"`
}

type DBAASServiceTypeName string

// Update waiting to be installed
type DBAASServiceUpdate struct {
	// Deadline for installing the update
	Deadline time.Time `json:"deadline,omitempty"`
	// Description of the update
	Description string `json:"description,omitempty"`
	// The earliest time the update will be automatically applied
	StartAfter time.Time `json:"start-after,omitempty"`
	// The time when the update will be automatically applied
	StartAT time.Time `json:"start-at,omitempty"`
}

type DBAASServiceValkeyComponents struct {
	// Service component name
	Component string `json:"component" validate:"required"`
	// DNS name for connecting to the service component
	Host string `json:"host" validate:"required"`
	// Port number for connecting to the service component
	Port  int64              `json:"port" validate:"required,gte=0,lte=65535"`
	Route EnumComponentRoute `json:"route" validate:"required"`
	// Whether the endpoint is encrypted or accepts plaintext.
	// By default endpoints are always encrypted and
	// this property is only included for service components that may disable encryption.
	SSL   *bool              `json:"ssl,omitempty"`
	Usage EnumComponentUsage `json:"usage" validate:"required"`
}

// Valkey connection information properties
type DBAASServiceValkeyConnectionInfo struct {
	Password string   `json:"password,omitempty"`
	Slave    []string `json:"slave,omitempty"`
	URI      []string `json:"uri,omitempty"`
}

// Prometheus integration URI
type DBAASServiceValkeyPrometheusURI struct {
	Host string `json:"host,omitempty"`
	Port int64  `json:"port,omitempty" validate:"omitempty,gte=0,lte=65535"`
}

type DBAASServiceValkeyUsersAccessControl struct {
	Categories []string `json:"categories,omitempty"`
	Channels   []string `json:"channels,omitempty"`
	Commands   []string `json:"commands,omitempty"`
	Keys       []string `json:"keys,omitempty"`
}

type DBAASServiceValkeyUsers struct {
	AccessControl *DBAASServiceValkeyUsersAccessControl `json:"access-control,omitempty"`
	Password      string                                `json:"password,omitempty"`
	Type          string                                `json:"type,omitempty"`
	Username      string                                `json:"username,omitempty"`
}

type DBAASServiceValkey struct {
	// List of backups for the service
	Backups []DBAASServiceBackup `json:"backups,omitempty"`
	// Service component information objects
	Components []DBAASServiceValkeyComponents `json:"components,omitempty"`
	// Valkey connection information properties
	ConnectionInfo *DBAASServiceValkeyConnectionInfo `json:"connection-info,omitempty"`
	// Service creation timestamp (ISO 8601)
	CreatedAT time.Time `json:"created-at,omitempty"`
	// TODO UNIT disk space for data storage
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=0"`
	// Service integrations
	Integrations []DBAASIntegration `json:"integrations,omitempty"`
	// Allowed CIDR address blocks for incoming connections
	IPFilter []string `json:"ip-filter,omitempty"`
	// Automatic maintenance settings
	Maintenance *DBAASServiceMaintenance `json:"maintenance,omitempty"`
	Name        DBAASServiceName         `json:"name" validate:"required,gte=0,lte=63"`
	// Number of service nodes in the active plan
	NodeCount int64 `json:"node-count,omitempty" validate:"omitempty,gte=0"`
	// Number of CPUs for each node
	NodeCPUCount int64 `json:"node-cpu-count,omitempty" validate:"omitempty,gte=0"`
	// TODO UNIT of memory for each node
	NodeMemory int64 `json:"node-memory,omitempty" validate:"omitempty,gte=0"`
	// State of individual service nodes
	NodeStates []DBAASNodeState `json:"node-states,omitempty"`
	// Service notifications
	Notifications []DBAASServiceNotification `json:"notifications,omitempty"`
	// Subscription plan
	Plan string `json:"plan" validate:"required"`
	// Prometheus integration URI
	PrometheusURI *DBAASServiceValkeyPrometheusURI `json:"prometheus-uri" validate:"required"`
	State         EnumServiceState                 `json:"state,omitempty"`
	// Service is protected against termination and powering off
	TerminationProtection *bool                `json:"termination-protection,omitempty"`
	Type                  DBAASServiceTypeName `json:"type" validate:"required,gte=0,lte=64"`
	// Service last update timestamp (ISO 8601)
	UpdatedAT time.Time `json:"updated-at,omitempty"`
	// URI for connecting to the service (may be absent)
	URI string `json:"uri,omitempty"`
	// service_uri parameterized into key-value pairs
	URIParams map[string]any `json:"uri-params,omitempty"`
	// List of service users
	Users []DBAASServiceValkeyUsers `json:"users,omitempty"`
	// Valkey settings
	ValkeySettings *JSONSchemaValkey `json:"valkey-settings,omitempty"`
	// Valkey version
	Version string `json:"version,omitempty"`
	// The zone where the service is running
	Zone string `json:"zone,omitempty"`
}

type DBAASTaskResultCodes struct {
	Code   string `json:"code,omitempty"`
	Dbname string `json:"dbname,omitempty"`
}

type DBAASTask struct {
	CreateTime  time.Time              `json:"create-time,omitempty"`
	ID          UUID                   `json:"id,omitempty"`
	Result      string                 `json:"result,omitempty"`
	ResultCodes []DBAASTaskResultCodes `json:"result-codes,omitempty"`
	Success     *bool                  `json:"success,omitempty"`
	TaskType    string                 `json:"task-type,omitempty"`
}

// Grafana User secrets
type DBAASUserGrafanaSecrets struct {
	// Grafana password
	Password string `json:"password,omitempty"`
	// Grafana username
	Username string `json:"username,omitempty"`
}

// Kafka Connect secrets
type DBAASUserKafkaConnectSecrets struct {
	// Kafka Connect password
	Password string `json:"password,omitempty"`
	// Kafka Connect username
	Username string `json:"username,omitempty"`
}

// Kafka User secrets
type DBAASUserKafkaSecrets struct {
	// Kafka certificate
	AccessCert       string    `json:"access-cert,omitempty"`
	AccessCertExpiry time.Time `json:"access-cert-expiry,omitempty"`
	// Kafka access key
	AccessKey string `json:"access-key,omitempty"`
	// Kafka password
	Password string `json:"password,omitempty"`
	// Kafka username
	Username string `json:"username,omitempty"`
}

// MySQL User secrets
type DBAASUserMysqlSecrets struct {
	// MySQL password
	Password string `json:"password,omitempty"`
	// MySQL username
	Username string `json:"username,omitempty"`
}

// Opensearch User secrets
type DBAASUserOpensearchSecrets struct {
	// Opensearch password
	Password string `json:"password,omitempty"`
	// Opensearch username
	Username string `json:"username,omitempty"`
}

type DBAASUserPassword string

// Postgres User secrets
type DBAASUserPostgresSecrets struct {
	// Postgres password
	Password string `json:"password,omitempty"`
	// Postgres username
	Username string `json:"username,omitempty"`
}

// Thanos User secrets
type DBAASUserThanosSecrets struct {
	// Thanos password
	Password string `json:"password,omitempty"`
	// Thanos username
	Username string `json:"username,omitempty"`
}

type DBAASUserUsername string

// Valkey User secrets
type DBAASUserValkeySecrets struct {
	// Valkey password
	Password string `json:"password,omitempty"`
	// Valkey username
	Username string `json:"username,omitempty"`
}

// Model is in use: deletion forbidden
type DeleteModelConflictResponse struct {
	// Deployments using models
	Deployments []string `json:"deployments,omitempty"`
}

type DeployTargetType string

const (
	DeployTargetTypeEdge      DeployTargetType = "edge"
	DeployTargetTypeDedicated DeployTargetType = "dedicated"
)

// Deploy target
type DeployTarget struct {
	// Deploy Target description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Deploy Target ID
	ID UUID `json:"id" validate:"required"`
	// Deploy Target name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Deploy Target type
	Type DeployTargetType `json:"type,omitempty"`
}

// Deploy target reference
type DeployTargetRef struct {
	// Deploy target ID
	ID UUID `json:"id,omitempty"`
}

// DNS domain
type DNSDomain struct {
	// DNS domain creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// DNS domain ID
	ID UUID `json:"id,omitempty"`
	// DNS domain unicode name
	UnicodeName string `json:"unicode-name,omitempty" validate:"omitempty,gte=1,lte=255"`
}

type DNSDomainRecordType string

const (
	DNSDomainRecordTypeNS    DNSDomainRecordType = "NS"
	DNSDomainRecordTypeCAA   DNSDomainRecordType = "CAA"
	DNSDomainRecordTypeNAPTR DNSDomainRecordType = "NAPTR"
	DNSDomainRecordTypePOOL  DNSDomainRecordType = "POOL"
	DNSDomainRecordTypeA     DNSDomainRecordType = "A"
	DNSDomainRecordTypeHINFO DNSDomainRecordType = "HINFO"
	DNSDomainRecordTypeCNAME DNSDomainRecordType = "CNAME"
	DNSDomainRecordTypeSOA   DNSDomainRecordType = "SOA"
	DNSDomainRecordTypeSSHFP DNSDomainRecordType = "SSHFP"
	DNSDomainRecordTypeSRV   DNSDomainRecordType = "SRV"
	DNSDomainRecordTypeAAAA  DNSDomainRecordType = "AAAA"
	DNSDomainRecordTypeMX    DNSDomainRecordType = "MX"
	DNSDomainRecordTypeTXT   DNSDomainRecordType = "TXT"
	DNSDomainRecordTypeALIAS DNSDomainRecordType = "ALIAS"
	DNSDomainRecordTypeURL   DNSDomainRecordType = "URL"
	DNSDomainRecordTypeSPF   DNSDomainRecordType = "SPF"
)

// DNS domain record
type DNSDomainRecord struct {
	// DNS domain record content
	Content string `json:"content,omitempty"`
	// DNS domain record creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// DNS domain record ID
	ID UUID `json:"id,omitempty"`
	// DNS domain record name
	Name string `json:"name,omitempty"`
	// DNS domain record priority
	Priority int64 `json:"priority,omitempty" validate:"omitempty,gte=0"`
	// DNS domain record system status
	SystemRecord *bool `json:"system-record,omitempty"`
	// DNS domain record TTL
	Ttl int64 `json:"ttl,omitempty" validate:"omitempty,gte=0"`
	// DNS domain record type
	Type DNSDomainRecordType `json:"type,omitempty"`
	// DNS domain record update date
	UpdatedAT time.Time `json:"updated-at,omitempty"`
}

type DomainName string

type ElasticIPAddressfamily string

const (
	ElasticIPAddressfamilyInet4 ElasticIPAddressfamily = "inet4"
	ElasticIPAddressfamilyInet6 ElasticIPAddressfamily = "inet6"
)

// Elastic IP
type ElasticIP struct {
	// Elastic IP address family
	Addressfamily ElasticIPAddressfamily `json:"addressfamily,omitempty"`
	// Elastic IP cidr
	Cidr string `json:"cidr,omitempty"`
	// Elastic IP description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Elastic IP address healthcheck
	Healthcheck *ElasticIPHealthcheck `json:"healthcheck,omitempty"`
	// Elastic IP ID
	ID UUID `json:"id,omitempty"`
	// Elastic IP address
	IP     string `json:"ip,omitempty"`
	Labels Labels `json:"labels,omitempty"`
}

type ElasticIPHealthcheckMode string

const (
	ElasticIPHealthcheckModeTCP   ElasticIPHealthcheckMode = "tcp"
	ElasticIPHealthcheckModeHTTP  ElasticIPHealthcheckMode = "http"
	ElasticIPHealthcheckModeHttps ElasticIPHealthcheckMode = "https"
)

// Elastic IP address healthcheck
type ElasticIPHealthcheck struct {
	// Interval between the checks in seconds (default: 10)
	Interval int64 `json:"interval,omitempty" validate:"omitempty,gte=5,lte=300"`
	// Health check mode
	Mode ElasticIPHealthcheckMode `json:"mode" validate:"required"`
	// Health check port
	Port int64 `json:"port" validate:"required,gte=1,lte=65535"`
	// Number of attempts before considering the target unhealthy (default: 3)
	StrikesFail int64 `json:"strikes-fail,omitempty" validate:"omitempty,gte=1,lte=20"`
	// Number of attempts before considering the target healthy (default: 2)
	StrikesOk int64 `json:"strikes-ok,omitempty" validate:"omitempty,gte=1,lte=20"`
	// Health check timeout value in seconds (default: 2)
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=2,lte=60"`
	// Skip TLS verification
	TlsSkipVerify *bool `json:"tls-skip-verify,omitempty"`
	// An optional domain or subdomain to check TLS against
	TlsSNI string `json:"tls-sni,omitempty" validate:"omitempty,gte=1,lte=255"`
	// An endpoint to use for the health check, for example '/status'
	URI string `json:"uri,omitempty" validate:"omitempty,gte=1,lte=255"`
}

// Elastic IP reference
type ElasticIPRef struct {
	// Elastic IP ID
	ID UUID `json:"id,omitempty"`
}

type EnumComponentRoute string

const (
	EnumComponentRouteDynamic     EnumComponentRoute = "dynamic"
	EnumComponentRoutePrivate     EnumComponentRoute = "private"
	EnumComponentRoutePublic      EnumComponentRoute = "public"
	EnumComponentRoutePrivatelink EnumComponentRoute = "privatelink"
)

type EnumComponentUsage string

const (
	EnumComponentUsagePrimary EnumComponentUsage = "primary"
	EnumComponentUsageReplica EnumComponentUsage = "replica"
)

type EnumDatadogSite string

const (
	EnumDatadogSiteUs3DatadoghqCom EnumDatadogSite = "us3.datadoghq.com"
	EnumDatadogSiteDdogGovCom      EnumDatadogSite = "ddog-gov.com"
	EnumDatadogSiteDatadoghqEU     EnumDatadogSite = "datadoghq.eu"
	EnumDatadogSiteUs5DatadoghqCom EnumDatadogSite = "us5.datadoghq.com"
	EnumDatadogSiteAp1DatadoghqCom EnumDatadogSite = "ap1.datadoghq.com"
	EnumDatadogSiteDatadoghqCom    EnumDatadogSite = "datadoghq.com"
)

type EnumExternalEndpointTypes string

const (
	EnumExternalEndpointTypesPrometheus    EnumExternalEndpointTypes = "prometheus"
	EnumExternalEndpointTypesOpensearch    EnumExternalEndpointTypes = "opensearch"
	EnumExternalEndpointTypesRsyslog       EnumExternalEndpointTypes = "rsyslog"
	EnumExternalEndpointTypesDatadog       EnumExternalEndpointTypes = "datadog"
	EnumExternalEndpointTypesElasticsearch EnumExternalEndpointTypes = "elasticsearch"
)

type EnumIntegrationTypes string

const (
	EnumIntegrationTypesDatasource EnumIntegrationTypes = "datasource"
	EnumIntegrationTypesLogs       EnumIntegrationTypes = "logs"
	EnumIntegrationTypesMetrics    EnumIntegrationTypes = "metrics"
)

type EnumKafkaAuthMethod string

const (
	EnumKafkaAuthMethodCertificate EnumKafkaAuthMethod = "certificate"
	EnumKafkaAuthMethodSasl        EnumKafkaAuthMethod = "sasl"
)

type EnumMasterLinkStatus string

const (
	EnumMasterLinkStatusUP   EnumMasterLinkStatus = "up"
	EnumMasterLinkStatusDown EnumMasterLinkStatus = "down"
)

type EnumMigrationMethod string

const (
	EnumMigrationMethodDump        EnumMigrationMethod = "dump"
	EnumMigrationMethodReplication EnumMigrationMethod = "replication"
)

type EnumMigrationStatus string

const (
	EnumMigrationStatusRunning EnumMigrationStatus = "running"
	EnumMigrationStatusSyncing EnumMigrationStatus = "syncing"
	EnumMigrationStatusFailed  EnumMigrationStatus = "failed"
	EnumMigrationStatusDone    EnumMigrationStatus = "done"
)

type EnumMysqlAuthenticationPlugin string

const (
	EnumMysqlAuthenticationPluginCachingSha2Password EnumMysqlAuthenticationPlugin = "caching_sha2_password"
	EnumMysqlAuthenticationPluginMysqlNativePassword EnumMysqlAuthenticationPlugin = "mysql_native_password"
)

type EnumOpensearchRulePermission string

const (
	EnumOpensearchRulePermissionAdmin     EnumOpensearchRulePermission = "admin"
	EnumOpensearchRulePermissionRead      EnumOpensearchRulePermission = "read"
	EnumOpensearchRulePermissionDeny      EnumOpensearchRulePermission = "deny"
	EnumOpensearchRulePermissionReadwrite EnumOpensearchRulePermission = "readwrite"
	EnumOpensearchRulePermissionWrite     EnumOpensearchRulePermission = "write"
)

type EnumPGPoolMode string

const (
	EnumPGPoolModeTransaction EnumPGPoolMode = "transaction"
	EnumPGPoolModeStatement   EnumPGPoolMode = "statement"
	EnumPGPoolModeSession     EnumPGPoolMode = "session"
)

type EnumPGSynchronousReplication string

const (
	EnumPGSynchronousReplicationQuorum EnumPGSynchronousReplication = "quorum"
	EnumPGSynchronousReplicationOff    EnumPGSynchronousReplication = "off"
)

type EnumPGVariant string

const (
	EnumPGVariantTimescale EnumPGVariant = "timescale"
	EnumPGVariantAiven     EnumPGVariant = "aiven"
)

type EnumRsyslogFormat string

const (
	EnumRsyslogFormatCustom  EnumRsyslogFormat = "custom"
	EnumRsyslogFormatRfc3164 EnumRsyslogFormat = "rfc3164"
	EnumRsyslogFormatRfc5424 EnumRsyslogFormat = "rfc5424"
)

type EnumServiceState string

const (
	EnumServiceStateRunning     EnumServiceState = "running"
	EnumServiceStateRebuilding  EnumServiceState = "rebuilding"
	EnumServiceStateRebalancing EnumServiceState = "rebalancing"
	EnumServiceStatePoweroff    EnumServiceState = "poweroff"
)

type EnumSortOrder string

const (
	EnumSortOrderDesc EnumSortOrder = "desc"
	EnumSortOrderAsc  EnumSortOrder = "asc"
)

type EnvImpactDetail struct {
	// Amount
	Amount float64 `json:"amount,omitempty"`
	// Unit
	Unit string `json:"unit,omitempty"`
	// Value
	Value string `json:"value,omitempty"`
}

type EnvImpactIndicator struct {
	// Amount
	Amount float64 `json:"amount,omitempty"`
	// Details
	Details []EnvImpactDetail `json:"details,omitempty"`
	// Unit
	Unit string `json:"unit,omitempty"`
	// Value
	Value string `json:"value,omitempty"`
}

type EnvImpactReport struct {
	// Metadata
	Metadata []EnvMetadataEntry `json:"metadata,omitempty"`
	// Products
	Products []EnvProduct `json:"products,omitempty"`
}

type EnvMetadataEntry struct {
	// Amount
	Amount float64 `json:"amount,omitempty"`
	// Unit
	Unit string `json:"unit,omitempty"`
	// Value
	Value string `json:"value,omitempty"`
}

type EnvProduct struct {
	// Impacts
	Impacts []EnvImpactIndicator `json:"impacts,omitempty"`
	// Metadata
	Metadata []EnvMetadataEntry `json:"metadata,omitempty"`
	// Value
	Value string `json:"value,omitempty"`
}

// Error
type ErrorResponse struct {
	// Error description
	Error string `json:"error,omitempty"`
}

// A notable Mutation Event which happened on the infrastructure
type Event struct {
	// Body parameters (free form map)
	BodyParams map[string]any `json:"body-params,omitempty"`
	// Operation processing time
	ElapsedMS int64 `json:"elapsed-ms,omitempty" validate:"omitempty,gt=0"`
	// Query string parameters (free form map)
	GetParams map[string]any `json:"get-params,omitempty"`
	// Operation handler name
	Handler string `json:"handler,omitempty"`
	// IAM API Key
	IAMAPIKey *IAMAPIKey `json:"iam-api-key,omitempty"`
	// IAM Role
	IAMRole *IAMRole `json:"iam-role,omitempty"`
	// User
	IAMUser *User `json:"iam-user,omitempty"`
	// Operation message
	Message string `json:"message,omitempty"`
	// URI path parameters (free form map)
	PathParams map[string]any `json:"path-params,omitempty"`
	// Operation unique identifier
	RequestID string `json:"request-id,omitempty"`
	// Client IP address
	SourceIP string `json:"source-ip,omitempty"`
	// Operation HTTP status
	Status int64 `json:"status,omitempty" validate:"omitempty,gt=0"`
	// Time at which the event happened, millisecond resolution
	Timestamp time.Time `json:"timestamp,omitempty"`
	// Operation request URI
	URI string `json:"uri,omitempty"`
	// Operation targeted zone
	Zone string `json:"zone,omitempty"`
}

// GPU usage for all organizations
type GetConfederatioUsageResponse struct {
	OrganizationsUsages map[string]OrganizationUsage `json:"organizations_usages" validate:"required"`
}

// A single log entry
type GetDeploymentLogsEntry struct {
	// Log message content
	Message string `json:"message,omitempty"`
	// Node identifier
	Node string `json:"node,omitempty"`
	// Timestamp of the log entry
	Time string `json:"time,omitempty"`
}

// Deployment logs
type GetDeploymentLogsResponse struct {
	// List of log entries
	Logs []GetDeploymentLogsEntry `json:"logs,omitempty"`
}

type GetDeploymentResponseState string

const (
	GetDeploymentResponseStateReady     GetDeploymentResponseState = "ready"
	GetDeploymentResponseStateCreating  GetDeploymentResponseState = "creating"
	GetDeploymentResponseStateError     GetDeploymentResponseState = "error"
	GetDeploymentResponseStateDeploying GetDeploymentResponseState = "deploying"
)

// AI deployment
type GetDeploymentResponse struct {
	// Creation time
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Deployment URL (nullable)
	DeploymentURL string `json:"deployment-url,omitempty"`
	// Number of GPUs
	GpuCount int64 `json:"gpu-count,omitempty" validate:"omitempty,gte=1"`
	// GPU type family
	GpuType string `json:"gpu-type,omitempty" validate:"omitempty,gte=1"`
	// Deployment ID
	ID UUID `json:"id,omitempty"`
	// Optional extra inference engine server CLI args
	InferenceEngineParameters []string `json:"inference-engine-parameters,omitempty"`
	// Inference engine version
	InferenceEngineVersion InferenceEngineVersion `json:"inference-engine-version,omitempty"`
	Model                  *ModelRef              `json:"model,omitempty"`
	// Deployment name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1"`
	// Number of replicas (>=0)
	Replicas int64 `json:"replicas,omitempty" validate:"omitempty,gte=0"`
	// Service level
	ServiceLevel string `json:"service-level,omitempty" validate:"omitempty,gte=1"`
	// Deployment state
	State GetDeploymentResponseState `json:"state,omitempty"`
	// Deployment state details
	StateDetails string `json:"state-details,omitempty"`
	// Update time
	UpdatedAT time.Time `json:"updated-at,omitempty"`
}

// List of allowed inference-engine parameters
type GetInferenceEngineHelpResponse struct {
	Parameters []InferenceEngineParameterEntry `json:"parameters,omitempty"`
}

type GetModelResponseState string

const (
	GetModelResponseStateReady       GetModelResponseState = "ready"
	GetModelResponseStateCreating    GetModelResponseState = "creating"
	GetModelResponseStateDownloading GetModelResponseState = "downloading"
	GetModelResponseStateError       GetModelResponseState = "error"
	GetModelResponseStateCreated     GetModelResponseState = "created"
)

// AI model
type GetModelResponse struct {
	// Creation time
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Model ID
	ID UUID `json:"id,omitempty"`
	// Model size (nullable)
	ModelSize int64 `json:"model-size,omitempty" validate:"omitempty,gte=0"`
	// Model name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1"`
	// Model state
	State GetModelResponseState `json:"state,omitempty"`
	// Update time
	UpdatedAT time.Time `json:"updated-at,omitempty"`
}

// GPU usage for an organization
type GetOrganizationUsageResponse struct {
	// Total GPU count
	Gpu int64 `json:"gpu,omitempty" validate:"omitempty,gte=0"`
}

// IAM API Key
type IAMAPIKey struct {
	// IAM API Key
	Key string `json:"key,omitempty"`
	// IAM API Key name
	Name string `json:"name,omitempty"`
	// IAM API Key Role ID
	RoleID UUID `json:"role-id,omitempty"`
}

// IAM API Key
type IAMAPIKeyCreated struct {
	// IAM API Key
	Key string `json:"key,omitempty"`
	// IAM API Key name
	Name string `json:"name,omitempty"`
	// IAM API Key Role ID
	RoleID UUID `json:"role-id,omitempty"`
	// IAM API Key Secret
	Secret string `json:"secret,omitempty"`
}

type IAMPolicyDefaultServiceStrategy string

const (
	IAMPolicyDefaultServiceStrategyAllow IAMPolicyDefaultServiceStrategy = "allow"
	IAMPolicyDefaultServiceStrategyDeny  IAMPolicyDefaultServiceStrategy = "deny"
)

// Policy
type IAMPolicy struct {
	// IAM default service strategy
	DefaultServiceStrategy IAMPolicyDefaultServiceStrategy `json:"default-service-strategy" validate:"required"`
	// IAM services
	Services map[string]IAMServicePolicy `json:"services" validate:"required"`
}

// IAM Role
type IAMRole struct {
	// Policy
	AssumeRolePolicy *IAMPolicy `json:"assume-role-policy,omitempty"`
	// IAM Role description
	Description string `json:"description,omitempty" validate:"omitempty,gte=1,lte=255"`
	// IAM Role mutability
	Editable *bool `json:"editable,omitempty"`
	// IAM Role ID
	ID     UUID   `json:"id,omitempty"`
	Labels Labels `json:"labels,omitempty"`
	// Maximum TTL requester is allowed to ask for when assuming a role
	MaxSessionTtl int64 `json:"max-session-ttl,omitempty" validate:"omitempty,gt=0"`
	// IAM Role name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// IAM Role permissions
	Permissions []string `json:"permissions,omitempty"`
	// Policy
	Policy *IAMPolicy `json:"policy,omitempty"`
}

type IAMServicePolicyType string

const (
	IAMServicePolicyTypeRules IAMServicePolicyType = "rules"
	IAMServicePolicyTypeAllow IAMServicePolicyType = "allow"
	IAMServicePolicyTypeDeny  IAMServicePolicyType = "deny"
)

type IAMServicePolicy struct {
	Rules []IAMServicePolicyRule `json:"rules,omitempty"`
	Type  IAMServicePolicyType   `json:"type,omitempty"`
}

type IAMServicePolicyRuleAction string

const (
	IAMServicePolicyRuleActionAllow IAMServicePolicyRuleAction = "allow"
	IAMServicePolicyRuleActionDeny  IAMServicePolicyRuleAction = "deny"
)

type IAMServicePolicyRule struct {
	Action     IAMServicePolicyRuleAction `json:"action,omitempty"`
	Expression string                     `json:"expression,omitempty"`
	Resources  []string                   `json:"resources,omitempty"`
}

// inference-engine parameter definition
type InferenceEngineParameterEntry struct {
	// Allowed values
	AllowedValues []string `json:"allowed-values,omitempty"`
	// Default value if nothing is specified
	Default string `json:"default,omitempty"`
	// Parameter description
	Description string `json:"description,omitempty"`
	// Flag name
	Flags []string `json:"flags,omitempty"`
	// Parameter name
	Name string `json:"name,omitempty"`
	// Section
	Section string `json:"section,omitempty"`
	// Parameter type
	Type string `json:"type,omitempty"`
}

// Inference engine version
type InferenceEngineVersion string

const (
	InferenceEngineVersion0120 InferenceEngineVersion = "0.12.0"
	InferenceEngineVersion0151 InferenceEngineVersion = "0.15.1"
)

// Private Network
type InstancePrivateNetworks struct {
	// Private Network ID
	ID UUID `json:"id,omitempty"`
	// Private Network MAC address
	MACAddress string `json:"mac-address,omitempty"`
}

// Instance
type Instance struct {
	// Instance Anti-affinity Groups
	AntiAffinityGroups []AntiAffinityGroup `json:"anti-affinity-groups,omitempty"`
	// Indicates if the instance will take application-consistent snapshots
	ApplicationConsistentSnapshotEnabled *bool `json:"application-consistent-snapshot-enabled,omitempty"`
	// Instance creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Deploy target reference
	DeployTarget *DeployTarget `json:"deploy-target,omitempty"`
	// Instance disk size in GiB
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=10,lte=51200"`
	// Instance Elastic IPs
	ElasticIPS []ElasticIP `json:"elastic-ips,omitempty"`
	// Instance ID
	ID UUID `json:"id,omitempty"`
	// Compute instance type
	InstanceType *InstanceType `json:"instance-type,omitempty"`
	// Instance IPv6 address
	Ipv6Address string `json:"ipv6-address,omitempty"`
	Labels      Labels `json:"labels,omitempty"`
	// Instance MAC address
	MACAddress string `json:"mac-address,omitempty"`
	// Resource manager
	Manager *Manager `json:"manager,omitempty"`
	// Instance name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Instance Private Networks
	PrivateNetworks []InstancePrivateNetworks `json:"private-networks,omitempty"`
	// Instance public IPv4 address
	PublicIP           net.IP             `json:"public-ip,omitempty"`
	PublicIPAssignment PublicIPAssignment `json:"public-ip-assignment,omitempty"`
	// Indicates if the instance has secure boot enabled
	SecurebootEnabled *bool `json:"secureboot-enabled,omitempty"`
	// Instance Security Groups
	SecurityGroups []SecurityGroup `json:"security-groups,omitempty"`
	// Instance Snapshots
	Snapshots []Snapshot `json:"snapshots,omitempty"`
	// SSH key
	SSHKey *SSHKey `json:"ssh-key,omitempty"`
	// Instance SSH Keys
	SSHKeys []SSHKey      `json:"ssh-keys,omitempty"`
	State   InstanceState `json:"state,omitempty"`
	// Instance template
	Template *Template `json:"template,omitempty"`
	// Indicates if the instance has tpm enabled
	TpmEnabled *bool `json:"tpm-enabled,omitempty"`
	// Instance Cloud-init user-data (base64 encoded)
	UserData string `json:"user-data,omitempty" validate:"omitempty,gte=1"`
}

// Instance password
type InstancePassword struct {
	// Password
	Password string `json:"password,omitempty"`
}

type InstancePoolState string

const (
	InstancePoolStateScalingUP   InstancePoolState = "scaling-up"
	InstancePoolStateScalingDown InstancePoolState = "scaling-down"
	InstancePoolStateDestroying  InstancePoolState = "destroying"
	InstancePoolStateCreating    InstancePoolState = "creating"
	InstancePoolStateSuspended   InstancePoolState = "suspended"
	InstancePoolStateRunning     InstancePoolState = "running"
	InstancePoolStateUpdating    InstancePoolState = "updating"
)

// Instance Pool
type InstancePool struct {
	// Instance Pool Anti-affinity Groups
	AntiAffinityGroups []AntiAffinityGroup `json:"anti-affinity-groups,omitempty"`
	// Enable application consistent snapshots
	ApplicationConsistentSnapshotEnabled *bool `json:"application-consistent-snapshot-enabled,omitempty"`
	// Deploy target reference
	DeployTarget *DeployTarget `json:"deploy-target,omitempty"`
	// Instance Pool description
	Description string `json:"description,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Instances disk size in GiB
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=10,lte=51200"`
	// Instances Elastic IPs
	ElasticIPS []ElasticIP `json:"elastic-ips,omitempty"`
	// Instance Pool ID
	ID UUID `json:"id,omitempty"`
	// The instances created by the Instance Pool will be prefixed with this value (default: pool)
	InstancePrefix string `json:"instance-prefix,omitempty" validate:"omitempty,gte=1,lte=30"`
	// Instance type reference
	InstanceType *InstanceType `json:"instance-type,omitempty"`
	// Instances
	Instances []Instance `json:"instances,omitempty"`
	// Enable IPv6 for instances
	Ipv6Enabled *bool  `json:"ipv6-enabled,omitempty"`
	Labels      Labels `json:"labels,omitempty"`
	// Resource manager
	Manager *Manager `json:"manager,omitempty"`
	// Minimum number of running instances
	MinAvailable int64 `json:"min-available,omitempty" validate:"omitempty,gte=0"`
	// Instance Pool name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Instance Pool Private Networks
	PrivateNetworks    []PrivateNetwork   `json:"private-networks,omitempty"`
	PublicIPAssignment PublicIPAssignment `json:"public-ip-assignment,omitempty"`
	// Instance Pool Security Groups
	SecurityGroups []SecurityGroup `json:"security-groups,omitempty"`
	// Number of instances
	Size int64 `json:"size,omitempty" validate:"omitempty,gt=0"`
	// SSH key reference
	SSHKey *SSHKey `json:"ssh-key,omitempty"`
	// Instances SSH keys
	SSHKeys []SSHKey `json:"ssh-keys,omitempty"`
	// Instance Pool state
	State InstancePoolState `json:"state,omitempty"`
	// Template reference
	Template *Template `json:"template,omitempty"`
	// Instances Cloud-init user-data
	UserData string `json:"user-data,omitempty" validate:"omitempty,gte=1"`
}

// Target Instance Pool
type InstancePoolRef struct {
	// Instance Pool ID
	ID UUID `json:"id,omitempty"`
}

// Target Instance
type InstanceRef struct {
	// Instance ID
	ID UUID `json:"id,omitempty"`
}

type InstanceState string

const (
	InstanceStateExpunging  InstanceState = "expunging"
	InstanceStateStarting   InstanceState = "starting"
	InstanceStateDestroying InstanceState = "destroying"
	InstanceStateRunning    InstanceState = "running"
	InstanceStateStopping   InstanceState = "stopping"
	InstanceStateStopped    InstanceState = "stopped"
	InstanceStateMigrating  InstanceState = "migrating"
	InstanceStateError      InstanceState = "error"
	InstanceStateDestroyed  InstanceState = "destroyed"
)

type InstanceTypeFamily string

const (
	InstanceTypeFamilyGpu3          InstanceTypeFamily = "gpu3"
	InstanceTypeFamilyGpua30        InstanceTypeFamily = "gpua30"
	InstanceTypeFamilyGpu3080ti     InstanceTypeFamily = "gpu3080ti"
	InstanceTypeFamilyGpu2          InstanceTypeFamily = "gpu2"
	InstanceTypeFamilyGpu           InstanceTypeFamily = "gpu"
	InstanceTypeFamilyMemory        InstanceTypeFamily = "memory"
	InstanceTypeFamilyGpua5000      InstanceTypeFamily = "gpua5000"
	InstanceTypeFamilyGpurtx6000pro InstanceTypeFamily = "gpurtx6000pro"
	InstanceTypeFamilyStorage       InstanceTypeFamily = "storage"
	InstanceTypeFamilyStandard      InstanceTypeFamily = "standard"
	InstanceTypeFamilyColossus      InstanceTypeFamily = "colossus"
	InstanceTypeFamilyCPU           InstanceTypeFamily = "cpu"
)

type InstanceTypeSize string

const (
	InstanceTypeSizeLarge      InstanceTypeSize = "large"
	InstanceTypeSizeHuge       InstanceTypeSize = "huge"
	InstanceTypeSizeJumbo      InstanceTypeSize = "jumbo"
	InstanceTypeSizeMedium     InstanceTypeSize = "medium"
	InstanceTypeSizeMega       InstanceTypeSize = "mega"
	InstanceTypeSizeSmall      InstanceTypeSize = "small"
	InstanceTypeSizeExtraLarge InstanceTypeSize = "extra-large"
	InstanceTypeSizeTitan48c   InstanceTypeSize = "titan48c"
	InstanceTypeSizeTitan      InstanceTypeSize = "titan"
	InstanceTypeSizeMicro      InstanceTypeSize = "micro"
	InstanceTypeSizeColossus   InstanceTypeSize = "colossus"
	InstanceTypeSizeTiny       InstanceTypeSize = "tiny"
)

// Compute instance type
type InstanceType struct {
	// Requires authorization or publicly available
	Authorized *bool `json:"authorized,omitempty"`
	// CPU count
	Cpus int64 `json:"cpus,omitempty" validate:"omitempty,gt=0"`
	// Instance type family
	Family InstanceTypeFamily `json:"family,omitempty"`
	// GPU count
	Gpus int64 `json:"gpus,omitempty" validate:"omitempty,gt=0"`
	// Instance type ID
	ID UUID `json:"id,omitempty"`
	// Available memory
	Memory int64 `json:"memory,omitempty" validate:"omitempty,gt=0"`
	// Instance type size
	Size InstanceTypeSize `json:"size,omitempty"`
	// Instance Type available zones
	Zones []ZoneName `json:"zones,omitempty"`
}

// Instance type with authorization status
type InstanceTypeEntry struct {
	// Whether this instance type is authorized based on server availability
	Authorized *bool `json:"authorized,omitempty"`
	// GPU family name
	Family string `json:"family,omitempty"`
}

// Instance type reference
type InstanceTypeRef struct {
	// Instance type ID
	ID UUID `json:"id,omitempty"`
}

type JSONSchemaGrafanaAlertingErrorORTimeout string

const (
	JSONSchemaGrafanaAlertingErrorORTimeoutAlerting  JSONSchemaGrafanaAlertingErrorORTimeout = "alerting"
	JSONSchemaGrafanaAlertingErrorORTimeoutKeepState JSONSchemaGrafanaAlertingErrorORTimeout = "keep_state"
)

type JSONSchemaGrafanaAlertingNodataORNullvalues string

const (
	JSONSchemaGrafanaAlertingNodataORNullvaluesAlerting  JSONSchemaGrafanaAlertingNodataORNullvalues = "alerting"
	JSONSchemaGrafanaAlertingNodataORNullvaluesNOData    JSONSchemaGrafanaAlertingNodataORNullvalues = "no_data"
	JSONSchemaGrafanaAlertingNodataORNullvaluesKeepState JSONSchemaGrafanaAlertingNodataORNullvalues = "keep_state"
	JSONSchemaGrafanaAlertingNodataORNullvaluesOk        JSONSchemaGrafanaAlertingNodataORNullvalues = "ok"
)

// Azure AD OAuth integration
type JSONSchemaGrafanaAuthAzuread struct {
	// Automatically sign-up users on successful sign-in
	AllowSignUP *bool `json:"allow_sign_up,omitempty"`
	// Allowed domains
	AllowedDomains []string `json:"allowed_domains,omitempty"`
	// Require users to belong to one of given groups
	AllowedGroups []string `json:"allowed_groups,omitempty"`
	// Authorization URL
	AuthURL string `json:"auth_url" validate:"required,lte=2048"`
	// Client ID from provider
	ClientID string `json:"client_id" validate:"required,lte=1024"`
	// Client secret from provider
	ClientSecret string `json:"client_secret" validate:"required,lte=1024"`
	// Token URL
	TokenURL string `json:"token_url" validate:"required,lte=2048"`
}

// Generic OAuth integration
type JSONSchemaGrafanaAuthGenericOauth struct {
	// Automatically sign-up users on successful sign-in
	AllowSignUP *bool `json:"allow_sign_up,omitempty"`
	// Allowed domains
	AllowedDomains []string `json:"allowed_domains,omitempty"`
	// Require user to be member of one of the listed organizations
	AllowedOrganizations []string `json:"allowed_organizations,omitempty"`
	// API URL
	APIURL string `json:"api_url" validate:"required,lte=2048"`
	// Authorization URL
	AuthURL string `json:"auth_url" validate:"required,lte=2048"`
	// Allow users to bypass the login screen and automatically log in
	AutoLogin *bool `json:"auto_login,omitempty"`
	// Client ID from provider
	ClientID string `json:"client_id" validate:"required,lte=1024"`
	// Client secret from provider
	ClientSecret string `json:"client_secret" validate:"required,lte=1024"`
	// Name of the OAuth integration
	Name string `json:"name,omitempty" validate:"omitempty,lte=128"`
	// OAuth scopes
	Scopes []string `json:"scopes,omitempty"`
	// Token URL
	TokenURL string `json:"token_url" validate:"required,lte=2048"`
}

// Github Auth integration
type JSONSchemaGrafanaAuthGithub struct {
	// Automatically sign-up users on successful sign-in
	AllowSignUP *bool `json:"allow_sign_up,omitempty"`
	// Require users to belong to one of given organizations
	AllowedOrganizations []string `json:"allowed_organizations,omitempty"`
	// Allow users to bypass the login screen and automatically log in
	AutoLogin *bool `json:"auto_login,omitempty"`
	// Client ID from provider
	ClientID string `json:"client_id" validate:"required,lte=1024"`
	// Client secret from provider
	ClientSecret string `json:"client_secret" validate:"required,lte=1024"`
	// Stop automatically syncing user roles
	SkipOrgRoleSync *bool `json:"skip_org_role_sync,omitempty"`
	// Require users to belong to one of given team IDs
	TeamIDS []int `json:"team_ids,omitempty"`
}

// GitLab Auth integration
type JSONSchemaGrafanaAuthGitlab struct {
	// Automatically sign-up users on successful sign-in
	AllowSignUP *bool `json:"allow_sign_up,omitempty"`
	// Require users to belong to one of given groups
	AllowedGroups []string `json:"allowed_groups" validate:"required"`
	// API URL. This only needs to be set when using self hosted GitLab
	APIURL string `json:"api_url,omitempty" validate:"omitempty,lte=2048"`
	// Authorization URL. This only needs to be set when using self hosted GitLab
	AuthURL string `json:"auth_url,omitempty" validate:"omitempty,lte=2048"`
	// Client ID from provider
	ClientID string `json:"client_id" validate:"required,lte=1024"`
	// Client secret from provider
	ClientSecret string `json:"client_secret" validate:"required,lte=1024"`
	// Token URL. This only needs to be set when using self hosted GitLab
	TokenURL string `json:"token_url,omitempty" validate:"omitempty,lte=2048"`
}

// Google Auth integration
type JSONSchemaGrafanaAuthGoogle struct {
	// Automatically sign-up users on successful sign-in
	AllowSignUP *bool `json:"allow_sign_up,omitempty"`
	// Domains allowed to sign-in to this Grafana
	AllowedDomains []string `json:"allowed_domains" validate:"required"`
	// Client ID from provider
	ClientID string `json:"client_id" validate:"required,lte=1024"`
	// Client secret from provider
	ClientSecret string `json:"client_secret" validate:"required,lte=1024"`
}

type JSONSchemaGrafanaCookieSamesite string

const (
	JSONSchemaGrafanaCookieSamesiteLax    JSONSchemaGrafanaCookieSamesite = "lax"
	JSONSchemaGrafanaCookieSamesiteStrict JSONSchemaGrafanaCookieSamesite = "strict"
	JSONSchemaGrafanaCookieSamesiteNone   JSONSchemaGrafanaCookieSamesite = "none"
)

// Grafana date format specifications
type JSONSchemaGrafanaDateFormats struct {
	// Default time zone for user preferences. Value 'browser' uses browser local time zone.
	DefaultTimezone string `json:"default_timezone,omitempty" validate:"omitempty,lte=64"`
	// Moment.js style format string for cases where full date is shown
	FullDate string `json:"full_date,omitempty" validate:"omitempty,lte=128"`
	// Moment.js style format string used when a time requiring day accuracy is shown
	IntervalDay string `json:"interval_day,omitempty" validate:"omitempty,lte=128"`
	// Moment.js style format string used when a time requiring hour accuracy is shown
	IntervalHour string `json:"interval_hour,omitempty" validate:"omitempty,lte=128"`
	// Moment.js style format string used when a time requiring minute accuracy is shown
	IntervalMinute string `json:"interval_minute,omitempty" validate:"omitempty,lte=128"`
	// Moment.js style format string used when a time requiring month accuracy is shown
	IntervalMonth string `json:"interval_month,omitempty" validate:"omitempty,lte=128"`
	// Moment.js style format string used when a time requiring second accuracy is shown
	IntervalSecond string `json:"interval_second,omitempty" validate:"omitempty,lte=128"`
	// Moment.js style format string used when a time requiring year accuracy is shown
	IntervalYear string `json:"interval_year,omitempty" validate:"omitempty,lte=128"`
}

type JSONSchemaGrafanaSMTPServerStarttlsPolicy string

const (
	JSONSchemaGrafanaSMTPServerStarttlsPolicyOpportunisticStartTLS JSONSchemaGrafanaSMTPServerStarttlsPolicy = "OpportunisticStartTLS"
	JSONSchemaGrafanaSMTPServerStarttlsPolicyMandatoryStartTLS     JSONSchemaGrafanaSMTPServerStarttlsPolicy = "MandatoryStartTLS"
	JSONSchemaGrafanaSMTPServerStarttlsPolicyNoStartTLS            JSONSchemaGrafanaSMTPServerStarttlsPolicy = "NoStartTLS"
)

// SMTP server settings
type JSONSchemaGrafanaSMTPServer struct {
	// Address used for sending emails
	FromAddress string `json:"from_address" validate:"required,lte=319"`
	// Name used in outgoing emails, defaults to Grafana
	FromName *string `json:"from_name,omitempty" validate:"omitempty,lte=128"`
	// Server hostname or IP
	Host string `json:"host" validate:"required,lte=255"`
	// Password for SMTP authentication
	Password *string `json:"password,omitempty" validate:"omitempty,lte=255"`
	// SMTP server port
	Port int `json:"port" validate:"required,gte=1,lte=65535"`
	// Skip verifying server certificate. Defaults to false
	SkipVerify *bool `json:"skip_verify,omitempty"`
	// Either OpportunisticStartTLS, MandatoryStartTLS or NoStartTLS. Default is OpportunisticStartTLS.
	StarttlsPolicy JSONSchemaGrafanaSMTPServerStarttlsPolicy `json:"starttls_policy,omitempty"`
	// Username for SMTP authentication
	Username *string `json:"username,omitempty" validate:"omitempty,lte=255"`
}

type JSONSchemaGrafanaUserAutoAssignOrgRole string

const (
	JSONSchemaGrafanaUserAutoAssignOrgRoleViewer JSONSchemaGrafanaUserAutoAssignOrgRole = "Viewer"
	JSONSchemaGrafanaUserAutoAssignOrgRoleAdmin  JSONSchemaGrafanaUserAutoAssignOrgRole = "Admin"
	JSONSchemaGrafanaUserAutoAssignOrgRoleEditor JSONSchemaGrafanaUserAutoAssignOrgRole = "Editor"
)

// Grafana settings
type JSONSchemaGrafana struct {
	// Enable or disable Grafana legacy alerting functionality. This should not be enabled with unified_alerting_enabled.
	AlertingEnabled *bool `json:"alerting_enabled,omitempty"`
	// Default error or timeout setting for new alerting rules
	AlertingErrorORTimeout JSONSchemaGrafanaAlertingErrorORTimeout `json:"alerting_error_or_timeout,omitempty"`
	// Max number of alert annotations that Grafana stores. 0 (default) keeps all alert annotations.
	AlertingMaxAnnotationsToKeep int `json:"alerting_max_annotations_to_keep,omitempty" validate:"omitempty,gte=0,lte=1e+06"`
	// Default value for 'no data or null values' for new alerting rules
	AlertingNodataORNullvalues JSONSchemaGrafanaAlertingNodataORNullvalues `json:"alerting_nodata_or_nullvalues,omitempty"`
	// Allow embedding Grafana dashboards with iframe/frame/object/embed tags. Disabled by default to limit impact of clickjacking
	AllowEmbedding *bool `json:"allow_embedding,omitempty"`
	// Azure AD OAuth integration
	AuthAzuread *JSONSchemaGrafanaAuthAzuread `json:"auth_azuread,omitempty"`
	// Enable or disable basic authentication form, used by Grafana built-in login
	AuthBasicEnabled *bool `json:"auth_basic_enabled,omitempty"`
	// Generic OAuth integration
	AuthGenericOauth *JSONSchemaGrafanaAuthGenericOauth `json:"auth_generic_oauth,omitempty"`
	// Github Auth integration
	AuthGithub *JSONSchemaGrafanaAuthGithub `json:"auth_github,omitempty"`
	// GitLab Auth integration
	AuthGitlab *JSONSchemaGrafanaAuthGitlab `json:"auth_gitlab,omitempty"`
	// Google Auth integration
	AuthGoogle *JSONSchemaGrafanaAuthGoogle `json:"auth_google,omitempty"`
	// Cookie SameSite attribute: 'strict' prevents sending cookie for cross-site requests, effectively disabling direct linking from other sites to Grafana. 'lax' is the default value.
	CookieSamesite JSONSchemaGrafanaCookieSamesite `json:"cookie_samesite,omitempty"`
	// Serve the web frontend using a custom CNAME pointing to the Aiven DNS name
	CustomDomain *string `json:"custom_domain,omitempty" validate:"omitempty,lte=255"`
	// This feature is new in Grafana 9 and is quite resource intensive. It may cause low-end plans to work more slowly while the dashboard previews are rendering.
	DashboardPreviewsEnabled *bool `json:"dashboard_previews_enabled,omitempty"`
	// Signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s, 1h
	DashboardsMinRefreshInterval string `json:"dashboards_min_refresh_interval,omitempty" validate:"omitempty,lte=16"`
	// Dashboard versions to keep per dashboard
	DashboardsVersionsToKeep int `json:"dashboards_versions_to_keep,omitempty" validate:"omitempty,gte=1,lte=100"`
	// Send 'X-Grafana-User' header to data source
	DataproxySendUserHeader *bool `json:"dataproxy_send_user_header,omitempty"`
	// Timeout for data proxy requests in seconds
	DataproxyTimeout int `json:"dataproxy_timeout,omitempty" validate:"omitempty,gte=15,lte=90"`
	// Grafana date format specifications
	DateFormats *JSONSchemaGrafanaDateFormats `json:"date_formats,omitempty"`
	// Set to true to disable gravatar. Defaults to false (gravatar is enabled)
	DisableGravatar *bool `json:"disable_gravatar,omitempty"`
	// Editors can manage folders, teams and dashboards created by them
	EditorsCanAdmin *bool `json:"editors_can_admin,omitempty"`
	// Google Analytics ID
	GoogleAnalyticsUAID string `json:"google_analytics_ua_id,omitempty" validate:"omitempty,lte=64"`
	// Enable Grafana /metrics endpoint
	MetricsEnabled *bool `json:"metrics_enabled,omitempty"`
	// Enforce user lookup based on email instead of the unique ID provided by the IdP
	OauthAllowInsecureEmailLookup *bool `json:"oauth_allow_insecure_email_lookup,omitempty"`
	// Store logs for the service so that they are available in the HTTP API and console.
	ServiceLog *bool `json:"service_log,omitempty"`
	// SMTP server settings
	SMTPServer *JSONSchemaGrafanaSMTPServer `json:"smtp_server,omitempty"`
	// Enable or disable Grafana unified alerting functionality. By default this is enabled and any legacy alerts will be migrated on upgrade to Grafana 9+. To stay on legacy alerting, set unified_alerting_enabled to false and alerting_enabled to true. See https://grafana.com/docs/grafana/latest/alerting/set-up/migrating-alerts/ for more details.
	UnifiedAlertingEnabled *bool `json:"unified_alerting_enabled,omitempty"`
	// Auto-assign new users on signup to main organization. Defaults to false
	UserAutoAssignOrg *bool `json:"user_auto_assign_org,omitempty"`
	// Set role for new signups. Defaults to Viewer
	UserAutoAssignOrgRole JSONSchemaGrafanaUserAutoAssignOrgRole `json:"user_auto_assign_org_role,omitempty"`
	// Users with view-only permission can edit but not save dashboards
	ViewersCanEdit *bool `json:"viewers_can_edit,omitempty"`
	// Setting to enable/disable Write-Ahead Logging. The default value is false (disabled).
	Wal *bool `json:"wal,omitempty"`
}

type JSONSchemaKafkaCompressionType string

const (
	JSONSchemaKafkaCompressionTypeGzip         JSONSchemaKafkaCompressionType = "gzip"
	JSONSchemaKafkaCompressionTypeSnappy       JSONSchemaKafkaCompressionType = "snappy"
	JSONSchemaKafkaCompressionTypeLz4          JSONSchemaKafkaCompressionType = "lz4"
	JSONSchemaKafkaCompressionTypeZstd         JSONSchemaKafkaCompressionType = "zstd"
	JSONSchemaKafkaCompressionTypeUncompressed JSONSchemaKafkaCompressionType = "uncompressed"
	JSONSchemaKafkaCompressionTypeProducer     JSONSchemaKafkaCompressionType = "producer"
)

// Configure log cleaner for topic compaction
type JSONSchemaKafkaLogCleanupAndCompaction struct {
	// How long are delete records retained?
	LogCleanerDeleteRetentionMS int `json:"log_cleaner_delete_retention_ms,omitempty" validate:"omitempty,gte=0,lte=3.1556926e+11"`
	// The maximum amount of time message will remain uncompacted. Only applicable for logs that are being compacted
	LogCleanerMaxCompactionLagMS int `json:"log_cleaner_max_compaction_lag_ms,omitempty" validate:"omitempty,gte=30000,lte=9.223372036854776e+18"`
	// Controls log compactor frequency. Larger value means more frequent compactions but also more space wasted for logs. Consider setting log.cleaner.max.compaction.lag.ms to enforce compactions sooner, instead of setting a very high value for this option.
	LogCleanerMinCleanableRatio float64 `json:"log_cleaner_min_cleanable_ratio,omitempty" validate:"omitempty,gte=0.2,lte=0.9"`
	// The minimum time a message will remain uncompacted in the log. Only applicable for logs that are being compacted.
	LogCleanerMinCompactionLagMS int `json:"log_cleaner_min_compaction_lag_ms,omitempty" validate:"omitempty,gte=0,lte=9.223372036854776e+18"`
	// The default cleanup policy for segments beyond the retention window
	LogCleanupPolicy string `json:"log_cleanup_policy,omitempty"`
}

type JSONSchemaKafkaLogMessageTimestampType string

const (
	JSONSchemaKafkaLogMessageTimestampTypeCreateTime    JSONSchemaKafkaLogMessageTimestampType = "CreateTime"
	JSONSchemaKafkaLogMessageTimestampTypeLogAppendTime JSONSchemaKafkaLogMessageTimestampType = "LogAppendTime"
)

// Kafka broker configuration values
type JSONSchemaKafka struct {
	// Enable auto creation of topics
	AutoCreateTopicsEnable *bool `json:"auto_create_topics_enable,omitempty"`
	// Specify the final compression type for a given topic. This configuration accepts the standard compression codecs ('gzip', 'snappy', 'lz4', 'zstd'). It additionally accepts 'uncompressed' which is equivalent to no compression; and 'producer' which means retain the original compression codec set by the producer.
	CompressionType JSONSchemaKafkaCompressionType `json:"compression_type,omitempty"`
	// Idle connections timeout: the server socket processor threads close the connections that idle for longer than this.
	ConnectionsMaxIdleMS int `json:"connections_max_idle_ms,omitempty" validate:"omitempty,gte=1000,lte=3.6e+06"`
	// Replication factor for autocreated topics
	DefaultReplicationFactor int `json:"default_replication_factor,omitempty" validate:"omitempty,gte=1,lte=10"`
	// The amount of time, in milliseconds, the group coordinator will wait for more consumers to join a new group before performing the first rebalance. A longer delay means potentially fewer rebalances, but increases the time until processing begins. The default value for this is 3 seconds. During development and testing it might be desirable to set this to 0 in order to not delay test execution time.
	GroupInitialRebalanceDelayMS int `json:"group_initial_rebalance_delay_ms,omitempty" validate:"omitempty,gte=0,lte=300000"`
	// The maximum allowed session timeout for registered consumers. Longer timeouts give consumers more time to process messages in between heartbeats at the cost of a longer time to detect failures.
	GroupMaxSessionTimeoutMS int `json:"group_max_session_timeout_ms,omitempty" validate:"omitempty,gte=0,lte=1.8e+06"`
	// The minimum allowed session timeout for registered consumers. Longer timeouts give consumers more time to process messages in between heartbeats at the cost of a longer time to detect failures.
	GroupMinSessionTimeoutMS int `json:"group_min_session_timeout_ms,omitempty" validate:"omitempty,gte=0,lte=60000"`
	// Configure log cleaner for topic compaction
	LogCleanupAndCompaction *JSONSchemaKafkaLogCleanupAndCompaction `json:"log-cleanup-and-compaction,omitempty"`
	// The number of messages accumulated on a log partition before messages are flushed to disk
	LogFlushIntervalMessages int `json:"log_flush_interval_messages,omitempty" validate:"omitempty,gte=1,lte=9.223372036854776e+18"`
	// The maximum time in ms that a message in any topic is kept in memory before flushed to disk. If not set, the value in log.flush.scheduler.interval.ms is used
	LogFlushIntervalMS int `json:"log_flush_interval_ms,omitempty" validate:"omitempty,gte=0,lte=9.223372036854776e+18"`
	// The interval with which Kafka adds an entry to the offset index
	LogIndexIntervalBytes int `json:"log_index_interval_bytes,omitempty" validate:"omitempty,gte=0,lte=1.048576e+08"`
	// The maximum size in bytes of the offset index
	LogIndexSizeMaxBytes int `json:"log_index_size_max_bytes,omitempty" validate:"omitempty,gte=1.048576e+06,lte=1.048576e+08"`
	// The maximum size of local log segments that can grow for a partition before it gets eligible for deletion. If set to -2, the value of log.retention.bytes is used. The effective value should always be less than or equal to log.retention.bytes value.
	LogLocalRetentionBytes int `json:"log_local_retention_bytes,omitempty" validate:"omitempty,gte=-2,lte=9.223372036854776e+18"`
	// The number of milliseconds to keep the local log segments before it gets eligible for deletion. If set to -2, the value of log.retention.ms is used. The effective value should always be less than or equal to log.retention.ms value.
	LogLocalRetentionMS int `json:"log_local_retention_ms,omitempty" validate:"omitempty,gte=-2,lte=9.223372036854776e+18"`
	// This configuration controls whether down-conversion of message formats is enabled to satisfy consume requests.
	LogMessageDownconversionEnable *bool `json:"log_message_downconversion_enable,omitempty"`
	// The maximum difference allowed between the timestamp when a broker receives a message and the timestamp specified in the message
	LogMessageTimestampDifferenceMaxMS int `json:"log_message_timestamp_difference_max_ms,omitempty" validate:"omitempty,gte=0,lte=9.223372036854776e+18"`
	// Define whether the timestamp in the message is message create time or log append time.
	LogMessageTimestampType JSONSchemaKafkaLogMessageTimestampType `json:"log_message_timestamp_type,omitempty"`
	// Should pre allocate file when create new segment?
	LogPreallocate *bool `json:"log_preallocate,omitempty"`
	// The maximum size of the log before deleting messages
	LogRetentionBytes int `json:"log_retention_bytes,omitempty" validate:"omitempty,gte=-1,lte=9.223372036854776e+18"`
	// The number of hours to keep a log file before deleting it
	LogRetentionHours int `json:"log_retention_hours,omitempty" validate:"omitempty,gte=-1,lte=2.147483647e+09"`
	// The number of milliseconds to keep a log file before deleting it (in milliseconds), If not set, the value in log.retention.minutes is used. If set to -1, no time limit is applied.
	LogRetentionMS int `json:"log_retention_ms,omitempty" validate:"omitempty,gte=-1,lte=9.223372036854776e+18"`
	// The maximum jitter to subtract from logRollTimeMillis (in milliseconds). If not set, the value in log.roll.jitter.hours is used
	LogRollJitterMS int `json:"log_roll_jitter_ms,omitempty" validate:"omitempty,gte=0,lte=9.223372036854776e+18"`
	// The maximum time before a new log segment is rolled out (in milliseconds).
	LogRollMS int `json:"log_roll_ms,omitempty" validate:"omitempty,gte=1,lte=9.223372036854776e+18"`
	// The maximum size of a single log file
	LogSegmentBytes int `json:"log_segment_bytes,omitempty" validate:"omitempty,gte=1.048576e+07,lte=1.073741824e+09"`
	// The amount of time to wait before deleting a file from the filesystem
	LogSegmentDeleteDelayMS int `json:"log_segment_delete_delay_ms,omitempty" validate:"omitempty,gte=0,lte=3.6e+06"`
	// The maximum number of connections allowed from each ip address (defaults to 2147483647).
	MaxConnectionsPerIP int `json:"max_connections_per_ip,omitempty" validate:"omitempty,gte=256,lte=2.147483647e+09"`
	// The maximum number of incremental fetch sessions that the broker will maintain.
	MaxIncrementalFetchSessionCacheSlots int `json:"max_incremental_fetch_session_cache_slots,omitempty" validate:"omitempty,gte=1000,lte=10000"`
	// The maximum size of message that the server can receive.
	MessageMaxBytes int `json:"message_max_bytes,omitempty" validate:"omitempty,gte=0,lte=1.000012e+08"`
	// When a producer sets acks to 'all' (or '-1'), min.insync.replicas specifies the minimum number of replicas that must acknowledge a write for the write to be considered successful.
	MinInsyncReplicas int `json:"min_insync_replicas,omitempty" validate:"omitempty,gte=1,lte=7"`
	// Number of partitions for autocreated topics
	NumPartitions int `json:"num_partitions,omitempty" validate:"omitempty,gte=1,lte=1000"`
	// Log retention window in minutes for offsets topic
	OffsetsRetentionMinutes int `json:"offsets_retention_minutes,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// The purge interval (in number of requests) of the producer request purgatory(defaults to 1000).
	ProducerPurgatoryPurgeIntervalRequests int `json:"producer_purgatory_purge_interval_requests,omitempty" validate:"omitempty,gte=10,lte=10000"`
	// The number of bytes of messages to attempt to fetch for each partition (defaults to 1048576). This is not an absolute maximum, if the first record batch in the first non-empty partition of the fetch is larger than this value, the record batch will still be returned to ensure that progress can be made.
	ReplicaFetchMaxBytes int `json:"replica_fetch_max_bytes,omitempty" validate:"omitempty,gte=1.048576e+06,lte=1.048576e+08"`
	// Maximum bytes expected for the entire fetch response (defaults to 10485760). Records are fetched in batches, and if the first record batch in the first non-empty partition of the fetch is larger than this value, the record batch will still be returned to ensure that progress can be made. As such, this is not an absolute maximum.
	ReplicaFetchResponseMaxBytes int `json:"replica_fetch_response_max_bytes,omitempty" validate:"omitempty,gte=1.048576e+07,lte=1.048576e+09"`
	// The (optional) comma-delimited setting for the broker to use to verify that the JWT was issued for one of the expected audiences.
	SaslOauthbearerExpectedAudience string `json:"sasl_oauthbearer_expected_audience,omitempty" validate:"omitempty,lte=128"`
	// Optional setting for the broker to use to verify that the JWT was created by the expected issuer.
	SaslOauthbearerExpectedIssuer string `json:"sasl_oauthbearer_expected_issuer,omitempty" validate:"omitempty,lte=128"`
	// OIDC JWKS endpoint URL. By setting this the SASL SSL OAuth2/OIDC authentication is enabled. See also other options for SASL OAuth2/OIDC.
	SaslOauthbearerJwksEndpointURL string `json:"sasl_oauthbearer_jwks_endpoint_url,omitempty" validate:"omitempty,lte=2048"`
	// Name of the scope from which to extract the subject claim from the JWT. Defaults to sub.
	SaslOauthbearerSubClaimName string `json:"sasl_oauthbearer_sub_claim_name,omitempty" validate:"omitempty,lte=128"`
	// The maximum number of bytes in a socket request (defaults to 104857600).
	SocketRequestMaxBytes int `json:"socket_request_max_bytes,omitempty" validate:"omitempty,gte=1.048576e+07,lte=2.097152e+08"`
	// Enable verification that checks that the partition has been added to the transaction before writing transactional records to the partition
	TransactionPartitionVerificationEnable *bool `json:"transaction_partition_verification_enable,omitempty"`
	// The interval at which to remove transactions that have expired due to transactional.id.expiration.ms passing (defaults to 3600000 (1 hour)).
	TransactionRemoveExpiredTransactionCleanupIntervalMS int `json:"transaction_remove_expired_transaction_cleanup_interval_ms,omitempty" validate:"omitempty,gte=600000,lte=3.6e+06"`
	// The transaction topic segment bytes should be kept relatively small in order to facilitate faster log compaction and cache loads (defaults to 104857600 (100 mebibytes)).
	TransactionStateLogSegmentBytes int `json:"transaction_state_log_segment_bytes,omitempty" validate:"omitempty,gte=1.048576e+06,lte=2.147483647e+09"`
}

type JSONSchemaKafkaConnectConnectorClientConfigOverridePolicy string

const (
	JSONSchemaKafkaConnectConnectorClientConfigOverridePolicyNone JSONSchemaKafkaConnectConnectorClientConfigOverridePolicy = "None"
	JSONSchemaKafkaConnectConnectorClientConfigOverridePolicyAll  JSONSchemaKafkaConnectConnectorClientConfigOverridePolicy = "All"
)

type JSONSchemaKafkaConnectConsumerAutoOffsetReset string

const (
	JSONSchemaKafkaConnectConsumerAutoOffsetResetEarliest JSONSchemaKafkaConnectConsumerAutoOffsetReset = "earliest"
	JSONSchemaKafkaConnectConsumerAutoOffsetResetLatest   JSONSchemaKafkaConnectConsumerAutoOffsetReset = "latest"
)

type JSONSchemaKafkaConnectConsumerIsolationLevel string

const (
	JSONSchemaKafkaConnectConsumerIsolationLevelReadUncommitted JSONSchemaKafkaConnectConsumerIsolationLevel = "read_uncommitted"
	JSONSchemaKafkaConnectConsumerIsolationLevelReadCommitted   JSONSchemaKafkaConnectConsumerIsolationLevel = "read_committed"
)

type JSONSchemaKafkaConnectProducerCompressionType string

const (
	JSONSchemaKafkaConnectProducerCompressionTypeGzip   JSONSchemaKafkaConnectProducerCompressionType = "gzip"
	JSONSchemaKafkaConnectProducerCompressionTypeSnappy JSONSchemaKafkaConnectProducerCompressionType = "snappy"
	JSONSchemaKafkaConnectProducerCompressionTypeLz4    JSONSchemaKafkaConnectProducerCompressionType = "lz4"
	JSONSchemaKafkaConnectProducerCompressionTypeZstd   JSONSchemaKafkaConnectProducerCompressionType = "zstd"
	JSONSchemaKafkaConnectProducerCompressionTypeNone   JSONSchemaKafkaConnectProducerCompressionType = "none"
)

// Kafka Connect configuration values
type JSONSchemaKafkaConnect struct {
	// Defines what client configurations can be overridden by the connector. Default is None
	ConnectorClientConfigOverridePolicy JSONSchemaKafkaConnectConnectorClientConfigOverridePolicy `json:"connector_client_config_override_policy,omitempty"`
	// What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server. Default is earliest
	ConsumerAutoOffsetReset JSONSchemaKafkaConnectConsumerAutoOffsetReset `json:"consumer_auto_offset_reset,omitempty"`
	// Records are fetched in batches by the consumer, and if the first record batch in the first non-empty partition of the fetch is larger than this value, the record batch will still be returned to ensure that the consumer can make progress. As such, this is not a absolute maximum.
	ConsumerFetchMaxBytes int `json:"consumer_fetch_max_bytes,omitempty" validate:"omitempty,gte=1.048576e+06,lte=1.048576e+08"`
	// Transaction read isolation level. read_uncommitted is the default, but read_committed can be used if consume-exactly-once behavior is desired.
	ConsumerIsolationLevel JSONSchemaKafkaConnectConsumerIsolationLevel `json:"consumer_isolation_level,omitempty"`
	// Records are fetched in batches by the consumer.If the first record batch in the first non-empty partition of the fetch is larger than this limit, the batch will still be returned to ensure that the consumer can make progress.
	ConsumerMaxPartitionFetchBytes int `json:"consumer_max_partition_fetch_bytes,omitempty" validate:"omitempty,gte=1.048576e+06,lte=1.048576e+08"`
	// The maximum delay in milliseconds between invocations of poll() when using consumer group management (defaults to 300000).
	ConsumerMaxPollIntervalMS int `json:"consumer_max_poll_interval_ms,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// The maximum number of records returned in a single call to poll() (defaults to 500).
	ConsumerMaxPollRecords int `json:"consumer_max_poll_records,omitempty" validate:"omitempty,gte=1,lte=10000"`
	// The interval at which to try committing offsets for tasks (defaults to 60000).
	OffsetFlushIntervalMS int `json:"offset_flush_interval_ms,omitempty" validate:"omitempty,gte=1,lte=1e+08"`
	// Maximum number of milliseconds to wait for records to flush and partition offset data to be committed to offset storage before cancelling the process and restoring the offset data to be committed in a future attempt (defaults to 5000).
	OffsetFlushTimeoutMS int `json:"offset_flush_timeout_ms,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// This setting gives the upper bound of the batch size to be sent. If there are fewer than this many bytes accumulated for this partition, the producer will 'linger' for the linger.ms time waiting for more records to show up. A batch size of zero will disable batching entirely (defaults to 16384).
	ProducerBatchSize int `json:"producer_batch_size,omitempty" validate:"omitempty,gte=0,lte=5.24288e+06"`
	// The total bytes of memory the producer can use to buffer records waiting to be sent to the broker (defaults to 33554432).
	ProducerBufferMemory int `json:"producer_buffer_memory,omitempty" validate:"omitempty,gte=5.24288e+06,lte=1.34217728e+08"`
	// Specify the default compression type for producers. This configuration accepts the standard compression codecs ('gzip', 'snappy', 'lz4', 'zstd'). It additionally accepts 'none' which is the default and equivalent to no compression.
	ProducerCompressionType JSONSchemaKafkaConnectProducerCompressionType `json:"producer_compression_type,omitempty"`
	// This setting gives the upper bound on the delay for batching: once there is batch.size worth of records for a partition it will be sent immediately regardless of this setting, however if there are fewer than this many bytes accumulated for this partition the producer will 'linger' for the specified time waiting for more records to show up. Defaults to 0.
	ProducerLingerMS int `json:"producer_linger_ms,omitempty" validate:"omitempty,gte=0,lte=5000"`
	// This setting will limit the number of record batches the producer will send in a single request to avoid sending huge requests.
	ProducerMaxRequestSize int `json:"producer_max_request_size,omitempty" validate:"omitempty,gte=131072,lte=6.7108864e+07"`
	// The maximum delay that is scheduled in order to wait for the return of one or more departed workers before rebalancing and reassigning their connectors and tasks to the group. During this period the connectors and tasks of the departed workers remain unassigned. Defaults to 5 minutes.
	ScheduledRebalanceMaxDelayMS int `json:"scheduled_rebalance_max_delay_ms,omitempty" validate:"omitempty,gte=0,lte=600000"`
	// The timeout in milliseconds used to detect failures when using Kafka’s group management facilities (defaults to 10000).
	SessionTimeoutMS int `json:"session_timeout_ms,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
}

type JSONSchemaKafkaRestConsumerRequestTimeoutMS int

const (
	JSONSchemaKafkaRestConsumerRequestTimeoutMS1000  JSONSchemaKafkaRestConsumerRequestTimeoutMS = 1000
	JSONSchemaKafkaRestConsumerRequestTimeoutMS15000 JSONSchemaKafkaRestConsumerRequestTimeoutMS = 15000
	JSONSchemaKafkaRestConsumerRequestTimeoutMS30000 JSONSchemaKafkaRestConsumerRequestTimeoutMS = 30000
)

type JSONSchemaKafkaRestNameStrategy string

const (
	JSONSchemaKafkaRestNameStrategyTopicName       JSONSchemaKafkaRestNameStrategy = "topic_name"
	JSONSchemaKafkaRestNameStrategyRecordName      JSONSchemaKafkaRestNameStrategy = "record_name"
	JSONSchemaKafkaRestNameStrategyTopicRecordName JSONSchemaKafkaRestNameStrategy = "topic_record_name"
)

type JSONSchemaKafkaRestProducerCompressionType string

const (
	JSONSchemaKafkaRestProducerCompressionTypeGzip   JSONSchemaKafkaRestProducerCompressionType = "gzip"
	JSONSchemaKafkaRestProducerCompressionTypeSnappy JSONSchemaKafkaRestProducerCompressionType = "snappy"
	JSONSchemaKafkaRestProducerCompressionTypeLz4    JSONSchemaKafkaRestProducerCompressionType = "lz4"
	JSONSchemaKafkaRestProducerCompressionTypeZstd   JSONSchemaKafkaRestProducerCompressionType = "zstd"
	JSONSchemaKafkaRestProducerCompressionTypeNone   JSONSchemaKafkaRestProducerCompressionType = "none"
)

// Kafka REST configuration
type JSONSchemaKafkaRest struct {
	// If true the consumer's offset will be periodically committed to Kafka in the background
	ConsumerEnableAutoCommit *bool `json:"consumer_enable_auto_commit,omitempty"`
	// Maximum number of bytes in unencoded message keys and values by a single request
	ConsumerRequestMaxBytes int `json:"consumer_request_max_bytes,omitempty" validate:"omitempty,gte=0,lte=6.7108864e+08"`
	// The maximum total time to wait for messages for a request if the maximum number of messages has not yet been reached
	ConsumerRequestTimeoutMS JSONSchemaKafkaRestConsumerRequestTimeoutMS `json:"consumer_request_timeout_ms,omitempty"`
	// Name strategy to use when selecting subject for storing schemas
	NameStrategy JSONSchemaKafkaRestNameStrategy `json:"name_strategy,omitempty"`
	// If true, validate that given schema is registered under expected subject name by the used name strategy when producing messages.
	NameStrategyValidation *bool `json:"name_strategy_validation,omitempty"`
	// The number of acknowledgments the producer requires the leader to have received before considering a request complete. If set to 'all' or '-1', the leader will wait for the full set of in-sync replicas to acknowledge the record.
	ProducerAcks string `json:"producer_acks,omitempty"`
	// Specify the default compression type for producers. This configuration accepts the standard compression codecs ('gzip', 'snappy', 'lz4', 'zstd'). It additionally accepts 'none' which is the default and equivalent to no compression.
	ProducerCompressionType JSONSchemaKafkaRestProducerCompressionType `json:"producer_compression_type,omitempty"`
	// Wait for up to the given delay to allow batching records together
	ProducerLingerMS int `json:"producer_linger_ms,omitempty" validate:"omitempty,gte=0,lte=5000"`
	// The maximum size of a request in bytes. Note that Kafka broker can also cap the record batch size.
	ProducerMaxRequestSize int `json:"producer_max_request_size,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// Maximum number of SimpleConsumers that can be instantiated per broker
	SimpleconsumerPoolSizeMax int `json:"simpleconsumer_pool_size_max,omitempty" validate:"omitempty,gte=10,lte=250"`
}

type JSONSchemaMysqlInternalTmpMemStorageEngine string

const (
	JSONSchemaMysqlInternalTmpMemStorageEngineTempTable JSONSchemaMysqlInternalTmpMemStorageEngine = "TempTable"
	JSONSchemaMysqlInternalTmpMemStorageEngineMEMORY    JSONSchemaMysqlInternalTmpMemStorageEngine = "MEMORY"
)

// mysql.conf configuration values
type JSONSchemaMysql struct {
	// The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake
	ConnectTimeout int `json:"connect_timeout,omitempty" validate:"omitempty,gte=2,lte=3600"`
	// Default server time zone as an offset from UTC (from -12:00 to +12:00), a time zone name, or 'SYSTEM' to use the MySQL server default.
	DefaultTimeZone string `json:"default_time_zone,omitempty" validate:"omitempty,gte=2,lte=100"`
	// The maximum permitted result length in bytes for the GROUP_CONCAT() function.
	GroupConcatMaxLen int `json:"group_concat_max_len,omitempty" validate:"omitempty,gte=4,lte=1.8446744073709552e+19"`
	// The time, in seconds, before cached statistics expire
	InformationSchemaStatsExpiry int `json:"information_schema_stats_expiry,omitempty" validate:"omitempty,gte=900,lte=3.1536e+07"`
	// Maximum size for the InnoDB change buffer, as a percentage of the total size of the buffer pool. Default is 25
	InnodbChangeBufferMaxSize int `json:"innodb_change_buffer_max_size,omitempty" validate:"omitempty,gte=0,lte=50"`
	// Specifies whether flushing a page from the InnoDB buffer pool also flushes other dirty pages in the same extent (default is 1): 0 - dirty pages in the same extent are not flushed, 1 - flush contiguous dirty pages in the same extent, 2 - flush dirty pages in the same extent
	InnodbFlushNeighbors int `json:"innodb_flush_neighbors,omitempty" validate:"omitempty,gte=0,lte=2"`
	// Minimum length of words that are stored in an InnoDB FULLTEXT index. Changing this parameter will lead to a restart of the MySQL service.
	InnodbFTMinTokenSize int `json:"innodb_ft_min_token_size,omitempty" validate:"omitempty,gte=0,lte=16"`
	// This option is used to specify your own InnoDB FULLTEXT index stopword list for all InnoDB tables.
	InnodbFTServerStopwordTable *string `json:"innodb_ft_server_stopword_table,omitempty" validate:"omitempty,lte=1024"`
	// The length of time in seconds an InnoDB transaction waits for a row lock before giving up. Default is 120.
	InnodbLockWaitTimeout int `json:"innodb_lock_wait_timeout,omitempty" validate:"omitempty,gte=1,lte=3600"`
	// The size in bytes of the buffer that InnoDB uses to write to the log files on disk.
	InnodbLogBufferSize int `json:"innodb_log_buffer_size,omitempty" validate:"omitempty,gte=1.048576e+06,lte=4.294967295e+09"`
	// The upper limit in bytes on the size of the temporary log files used during online DDL operations for InnoDB tables.
	InnodbOnlineAlterLogMaxSize int `json:"innodb_online_alter_log_max_size,omitempty" validate:"omitempty,gte=65536,lte=1.099511627776e+12"`
	// When enabled, information about all deadlocks in InnoDB user transactions is recorded in the error log. Disabled by default.
	InnodbPrintAllDeadlocks *bool `json:"innodb_print_all_deadlocks,omitempty"`
	// The number of I/O threads for read operations in InnoDB. Default is 4. Changing this parameter will lead to a restart of the MySQL service.
	InnodbReadIoThreads int `json:"innodb_read_io_threads,omitempty" validate:"omitempty,gte=1,lte=64"`
	// When enabled a transaction timeout causes InnoDB to abort and roll back the entire transaction. Changing this parameter will lead to a restart of the MySQL service.
	InnodbRollbackOnTimeout *bool `json:"innodb_rollback_on_timeout,omitempty"`
	// Defines the maximum number of threads permitted inside of InnoDB. Default is 0 (infinite concurrency - no limit)
	InnodbThreadConcurrency int `json:"innodb_thread_concurrency,omitempty" validate:"omitempty,gte=0,lte=1000"`
	// The number of I/O threads for write operations in InnoDB. Default is 4. Changing this parameter will lead to a restart of the MySQL service.
	InnodbWriteIoThreads int `json:"innodb_write_io_threads,omitempty" validate:"omitempty,gte=1,lte=64"`
	// The number of seconds the server waits for activity on an interactive connection before closing it.
	InteractiveTimeout int `json:"interactive_timeout,omitempty" validate:"omitempty,gte=30,lte=604800"`
	// The storage engine for in-memory internal temporary tables.
	InternalTmpMemStorageEngine JSONSchemaMysqlInternalTmpMemStorageEngine `json:"internal_tmp_mem_storage_engine,omitempty"`
	// The slow log output destination when slow_query_log is ON. To enable MySQL AI Insights, choose INSIGHTS. To use MySQL AI Insights and the mysql.slow_log table at the same time, choose INSIGHTS,TABLE. To only use the mysql.slow_log table, choose TABLE. To silence slow logs, choose NONE.
	LogOutput string `json:"log_output,omitempty"`
	// The slow_query_logs work as SQL statements that take more than long_query_time seconds to execute. Default is 10s
	LongQueryTime float64 `json:"long_query_time,omitempty" validate:"omitempty,gte=0,lte=3600"`
	// Size of the largest message in bytes that can be received by the server. Default is 67108864 (64M)
	MaxAllowedPacket int `json:"max_allowed_packet,omitempty" validate:"omitempty,gte=102400,lte=1.073741824e+09"`
	// Limits the size of internal in-memory tables. Also set tmp_table_size. Default is 16777216 (16M)
	MaxHeapTableSize int `json:"max_heap_table_size,omitempty" validate:"omitempty,gte=1.048576e+06,lte=1.073741824e+09"`
	// Start sizes of connection buffer and result buffer. Default is 16384 (16K). Changing this parameter will lead to a restart of the MySQL service.
	NetBufferLength int `json:"net_buffer_length,omitempty" validate:"omitempty,gte=1024,lte=1.048576e+06"`
	// The number of seconds to wait for more data from a connection before aborting the read.
	NetReadTimeout int `json:"net_read_timeout,omitempty" validate:"omitempty,gte=1,lte=3600"`
	// The number of seconds to wait for a block to be written to a connection before aborting the write.
	NetWriteTimeout int `json:"net_write_timeout,omitempty" validate:"omitempty,gte=1,lte=3600"`
	// Slow query log enables capturing of slow queries. Setting slow_query_log to false also truncates the mysql.slow_log table. Default is off
	SlowQueryLog *bool `json:"slow_query_log,omitempty"`
	// Sort buffer size in bytes for ORDER BY optimization. Default is 262144 (256K)
	SortBufferSize int `json:"sort_buffer_size,omitempty" validate:"omitempty,gte=32768,lte=1.073741824e+09"`
	// Global SQL mode. Set to empty to use MySQL server defaults. When creating a new service and not setting this field Aiven default SQL mode (strict, SQL standard compliant) will be assigned.
	SQLMode string `json:"sql_mode,omitempty" validate:"omitempty,lte=1024"`
	// Require primary key to be defined for new tables or old tables modified with ALTER TABLE and fail if missing. It is recommended to always have primary keys because various functionality may break if any large table is missing them.
	SQLRequirePrimaryKey *bool `json:"sql_require_primary_key,omitempty"`
	// Limits the size of internal in-memory tables. Also set max_heap_table_size. Default is 16777216 (16M)
	TmpTableSize int `json:"tmp_table_size,omitempty" validate:"omitempty,gte=1.048576e+06,lte=1.073741824e+09"`
	// The number of seconds the server waits for activity on a noninteractive connection before closing it.
	WaitTimeout int `json:"wait_timeout,omitempty" validate:"omitempty,gte=1,lte=2.147483e+06"`
}

type JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingAuthenticationBackend string

const (
	JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingAuthenticationBackendInternal JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingAuthenticationBackend = "internal"
)

type JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingType string

const (
	JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingTypeUsername JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingType = "username"
)

// Internal Authentication Backend Limiting
type JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimiting struct {
	// The number of login attempts allowed before login is blocked
	AllowedTries int `json:"allowed_tries,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The internal backend. Enter `internal`
	AuthenticationBackend JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingAuthenticationBackend `json:"authentication_backend,omitempty" validate:"omitempty,lte=1024"`
	// The duration of time that login remains blocked after a failed login
	BlockExpirySeconds int `json:"block_expiry_seconds,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The maximum number of blocked IP addresses
	MaxBlockedClients int `json:"max_blocked_clients,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The maximum number of tracked IP addresses that have failed login
	MaxTrackedClients int `json:"max_tracked_clients,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The window of time in which the value for `allowed_tries` is enforced
	TimeWindowSeconds int `json:"time_window_seconds,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The type of rate limiting
	Type JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimitingType `json:"type,omitempty" validate:"omitempty,lte=1024"`
}

type JSONSchemaOpensearchAuthFailureListenersIPRateLimitingType string

const (
	JSONSchemaOpensearchAuthFailureListenersIPRateLimitingTypeIP JSONSchemaOpensearchAuthFailureListenersIPRateLimitingType = "ip"
)

// IP address rate limiting settings
type JSONSchemaOpensearchAuthFailureListenersIPRateLimiting struct {
	// The number of login attempts allowed before login is blocked
	AllowedTries int `json:"allowed_tries,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// The duration of time that login remains blocked after a failed login
	BlockExpirySeconds int `json:"block_expiry_seconds,omitempty" validate:"omitempty,gte=1,lte=36000"`
	// The maximum number of blocked IP addresses
	MaxBlockedClients int `json:"max_blocked_clients,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The maximum number of tracked IP addresses that have failed login
	MaxTrackedClients int `json:"max_tracked_clients,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// The window of time in which the value for `allowed_tries` is enforced
	TimeWindowSeconds int `json:"time_window_seconds,omitempty" validate:"omitempty,gte=1,lte=36000"`
	// The type of rate limiting
	Type JSONSchemaOpensearchAuthFailureListenersIPRateLimitingType `json:"type,omitempty" validate:"omitempty,lte=1024"`
}

// Opensearch Security Plugin Settings
type JSONSchemaOpensearchAuthFailureListeners struct {
	// Internal Authentication Backend Limiting
	InternalAuthenticationBackendLimiting *JSONSchemaOpensearchAuthFailureListenersInternalAuthenticationBackendLimiting `json:"internal_authentication_backend_limiting,omitempty"`
	// IP address rate limiting settings
	IPRateLimiting *JSONSchemaOpensearchAuthFailureListenersIPRateLimiting `json:"ip_rate_limiting,omitempty"`
}

// Opensearch Email Sender Settings
type JSONSchemaOpensearchEmailSender struct {
	// This should be identical to the Sender name defined in Opensearch dashboards
	EmailSenderName string `json:"email_sender_name" validate:"required,lte=40"`
	// Sender password for Opensearch alerts to authenticate with SMTP server
	EmailSenderPassword string `json:"email_sender_password" validate:"required,lte=1024"`
	// Sender username for Opensearch alerts
	EmailSenderUsername string `json:"email_sender_username" validate:"required,lte=320"`
}

// Opensearch ISM History Settings
type JSONSchemaOpensearchIsmHistory struct {
	// Specifies whether ISM is enabled or not
	IsmEnabled *bool `json:"ism_enabled" validate:"required"`
	// Specifies whether audit history is enabled or not. The logs from ISM are automatically indexed to a logs document.
	IsmHistoryEnabled *bool `json:"ism_history_enabled,omitempty"`
	// The maximum age before rolling over the audit history index in hours
	IsmHistoryMaxAge int `json:"ism_history_max_age,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// The maximum number of documents before rolling over the audit history index.
	IsmHistoryMaxDocs int `json:"ism_history_max_docs,omitempty" validate:"omitempty,gte=1,lte=9.223372036854776e+18"`
	// The time between rollover checks for the audit history index in hours.
	IsmHistoryRolloverCheckPeriod int `json:"ism_history_rollover_check_period,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// How long audit history indices are kept in days.
	IsmHistoryRolloverRetentionPeriod int `json:"ism_history_rollover_retention_period,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
}

type JSONSchemaOpensearchSearchBackpressureMode string

const (
	JSONSchemaOpensearchSearchBackpressureModeMonitorOnly JSONSchemaOpensearchSearchBackpressureMode = "monitor_only"
	JSONSchemaOpensearchSearchBackpressureModeEnforced    JSONSchemaOpensearchSearchBackpressureMode = "enforced"
	JSONSchemaOpensearchSearchBackpressureModeDisabled    JSONSchemaOpensearchSearchBackpressureMode = "disabled"
)

// Node duress settings
type JSONSchemaOpensearchSearchBackpressureNodeDuress struct {
	// The CPU usage threshold (as a percentage) required for a node to be considered to be under duress. Default is 0.9
	CPUThreshold float64 `json:"cpu_threshold,omitempty" validate:"omitempty,gte=0,lte=1"`
	// The heap usage threshold (as a percentage) required for a node to be considered to be under duress. Default is 0.7
	HeapThreshold float64 `json:"heap_threshold,omitempty" validate:"omitempty,gte=0,lte=1"`
	// The number of successive limit breaches after which the node is considered to be under duress. Default is 3
	NumSuccessiveBreaches int `json:"num_successive_breaches,omitempty" validate:"omitempty,gte=1"`
}

// Search shard settings
type JSONSchemaOpensearchSearchBackpressureSearchShardTask struct {
	// The maximum number of search tasks to cancel in a single iteration of the observer thread. Default is 10.0
	CancellationBurst float64 `json:"cancellation_burst,omitempty" validate:"omitempty,gte=1"`
	// The maximum number of tasks to cancel per millisecond of elapsed time. Default is 0.003
	CancellationRate float64 `json:"cancellation_rate,omitempty" validate:"omitempty,gte=0"`
	// The maximum number of tasks to cancel, as a percentage of successful task completions. Default is 0.1
	CancellationRatio float64 `json:"cancellation_ratio,omitempty" validate:"omitempty,gte=0,lte=1"`
	// The CPU usage threshold (in milliseconds) required for a single search shard task before it is considered for cancellation. Default is 15000
	CPUTimeMillisThreshold int `json:"cpu_time_millis_threshold,omitempty" validate:"omitempty,gte=0"`
	// The elapsed time threshold (in milliseconds) required for a single search shard task before it is considered for cancellation. Default is 30000
	ElapsedTimeMillisThreshold int `json:"elapsed_time_millis_threshold,omitempty" validate:"omitempty,gte=0"`
	// The number of previously completed search shard tasks to consider when calculating the rolling average of heap usage. Default is 100
	HeapMovingAverageWindowSize int `json:"heap_moving_average_window_size,omitempty" validate:"omitempty,gte=0"`
	// The heap usage threshold (as a percentage) required for a single search shard task before it is considered for cancellation. Default is 0.5
	HeapPercentThreshold float64 `json:"heap_percent_threshold,omitempty" validate:"omitempty,gte=0,lte=1"`
	// The minimum variance required for a single search shard task’s heap usage compared to the rolling average of previously completed tasks before it is considered for cancellation. Default is 2.0
	HeapVariance float64 `json:"heap_variance,omitempty" validate:"omitempty,gte=0"`
	// The heap usage threshold (as a percentage) required for the sum of heap usages of all search shard tasks before cancellation is applied. Default is 0.5
	TotalHeapPercentThreshold float64 `json:"total_heap_percent_threshold,omitempty" validate:"omitempty,gte=0,lte=1"`
}

// Search task settings
type JSONSchemaOpensearchSearchBackpressureSearchTask struct {
	// The maximum number of search tasks to cancel in a single iteration of the observer thread. Default is 5.0
	CancellationBurst float64 `json:"cancellation_burst,omitempty" validate:"omitempty,gte=1"`
	// The maximum number of search tasks to cancel per millisecond of elapsed time. Default is 0.003
	CancellationRate float64 `json:"cancellation_rate,omitempty" validate:"omitempty,gte=0"`
	// The maximum number of search tasks to cancel, as a percentage of successful search task completions. Default is 0.1
	CancellationRatio float64 `json:"cancellation_ratio,omitempty" validate:"omitempty,gte=0,lte=1"`
	// The CPU usage threshold (in milliseconds) required for an individual parent task before it is considered for cancellation. Default is 30000
	CPUTimeMillisThreshold int `json:"cpu_time_millis_threshold,omitempty" validate:"omitempty,gte=0"`
	// The elapsed time threshold (in milliseconds) required for an individual parent task before it is considered for cancellation. Default is 45000
	ElapsedTimeMillisThreshold int `json:"elapsed_time_millis_threshold,omitempty" validate:"omitempty,gte=0"`
	// The window size used to calculate the rolling average of the heap usage for the completed parent tasks. Default is 10
	HeapMovingAverageWindowSize int `json:"heap_moving_average_window_size,omitempty" validate:"omitempty,gte=0"`
	// The heap usage threshold (as a percentage) required for an individual parent task before it is considered for cancellation. Default is 0.2
	HeapPercentThreshold float64 `json:"heap_percent_threshold,omitempty" validate:"omitempty,gte=0,lte=1"`
	// The heap usage variance required for an individual parent task before it is considered for cancellation. A task is considered for cancellation when taskHeapUsage is greater than or equal to heapUsageMovingAverage * variance. Default is 2.0
	HeapVariance float64 `json:"heap_variance,omitempty" validate:"omitempty,gte=0"`
	// The heap usage threshold (as a percentage) required for the sum of heap usages of all search tasks before cancellation is applied. Default is 0.5
	TotalHeapPercentThreshold float64 `json:"total_heap_percent_threshold,omitempty" validate:"omitempty,gte=0,lte=1"`
}

// Search Backpressure Settings
type JSONSchemaOpensearchSearchBackpressure struct {
	// The search backpressure mode. Valid values are monitor_only, enforced, or disabled. Default is monitor_only
	Mode JSONSchemaOpensearchSearchBackpressureMode `json:"mode,omitempty"`
	// Node duress settings
	NodeDuress *JSONSchemaOpensearchSearchBackpressureNodeDuress `json:"node_duress,omitempty"`
	// Search shard settings
	SearchShardTask *JSONSchemaOpensearchSearchBackpressureSearchShardTask `json:"search_shard_task,omitempty"`
	// Search task settings
	SearchTask *JSONSchemaOpensearchSearchBackpressureSearchTask `json:"search_task,omitempty"`
}

// Operating factor
type JSONSchemaOpensearchShardIndexingPressureOperatingFactor struct {
	// Specify the lower occupancy limit of the allocated quota of memory for the shard. If the total memory usage of a shard is below this limit, shard indexing backpressure decreases the current allocated memory for that shard. Default is 0.75
	Lower float64 `json:"lower,omitempty" validate:"omitempty,gte=0"`
	// Specify the optimal occupancy of the allocated quota of memory for the shard. If the total memory usage of a shard is at this level, shard indexing backpressure doesn’t change the current allocated memory for that shard. Default is 0.85
	Optimal float64 `json:"optimal,omitempty" validate:"omitempty,gte=0"`
	// Specify the upper occupancy limit of the allocated quota of memory for the shard. If the total memory usage of a shard is above this limit, shard indexing backpressure increases the current allocated memory for that shard. Default is 0.95
	Upper float64 `json:"upper,omitempty" validate:"omitempty,gte=0"`
}

type JSONSchemaOpensearchShardIndexingPressurePrimaryParameterNode struct {
	// Define the percentage of the node-level memory threshold that acts as a soft indicator for strain on a node. Default is 0.7
	SoftLimit float64 `json:"soft_limit,omitempty" validate:"omitempty,gte=0"`
}

type JSONSchemaOpensearchShardIndexingPressurePrimaryParameterShard struct {
	// Specify the minimum assigned quota for a new shard in any role (coordinator, primary, or replica). Shard indexing backpressure increases or decreases this allocated quota based on the inflow of traffic for the shard. Default is 0.001
	MinLimit float64 `json:"min_limit,omitempty" validate:"omitempty,gte=0"`
}

// Primary parameter
type JSONSchemaOpensearchShardIndexingPressurePrimaryParameter struct {
	Node  *JSONSchemaOpensearchShardIndexingPressurePrimaryParameterNode  `json:"node,omitempty"`
	Shard *JSONSchemaOpensearchShardIndexingPressurePrimaryParameterShard `json:"shard,omitempty"`
}

// Shard indexing back pressure settings
type JSONSchemaOpensearchShardIndexingPressure struct {
	// Enable or disable shard indexing backpressure. Default is false
	Enabled *bool `json:"enabled,omitempty"`
	// Run shard indexing backpressure in shadow mode or enforced mode. In shadow mode (value set as false), shard indexing backpressure tracks all granular-level metrics, but it doesn’t actually reject any indexing requests. In enforced mode (value set as true), shard indexing backpressure rejects any requests to the cluster that might cause a dip in its performance. Default is false
	Enforced *bool `json:"enforced,omitempty"`
	// Operating factor
	OperatingFactor *JSONSchemaOpensearchShardIndexingPressureOperatingFactor `json:"operating_factor,omitempty"`
	// Primary parameter
	PrimaryParameter *JSONSchemaOpensearchShardIndexingPressurePrimaryParameter `json:"primary_parameter,omitempty"`
}

// OpenSearch settings
type JSONSchemaOpensearch struct {
	// Explicitly allow or block automatic creation of indices. Defaults to true
	ActionAutoCreateIndexEnabled *bool `json:"action_auto_create_index_enabled,omitempty"`
	// Require explicit index names when deleting
	ActionDestructiveRequiresName *bool `json:"action_destructive_requires_name,omitempty"`
	// Opensearch Security Plugin Settings
	AuthFailureListeners *JSONSchemaOpensearchAuthFailureListeners `json:"auth_failure_listeners,omitempty"`
	// Controls the number of shards allowed in the cluster per data node
	ClusterMaxShardsPerNode int `json:"cluster_max_shards_per_node,omitempty" validate:"omitempty,gte=100,lte=10000"`
	// How many concurrent incoming/outgoing shard recoveries (normally replicas) are allowed to happen on a node. Defaults to 2.
	ClusterRoutingAllocationNodeConcurrentRecoveries int `json:"cluster_routing_allocation_node_concurrent_recoveries,omitempty" validate:"omitempty,gte=2,lte=16"`
	// Opensearch Email Sender Settings
	EmailSender *JSONSchemaOpensearchEmailSender `json:"email-sender,omitempty"`
	// Enable/Disable security audit
	EnableSecurityAudit *bool `json:"enable_security_audit,omitempty"`
	// Maximum content length for HTTP requests to the OpenSearch HTTP API, in bytes.
	HTTPMaxContentLength int `json:"http_max_content_length,omitempty" validate:"omitempty,gte=1,lte=2.147483647e+09"`
	// The max size of allowed headers, in bytes
	HTTPMaxHeaderSize int `json:"http_max_header_size,omitempty" validate:"omitempty,gte=1024,lte=262144"`
	// The max length of an HTTP URL, in bytes
	HTTPMaxInitialLineLength int `json:"http_max_initial_line_length,omitempty" validate:"omitempty,gte=1024,lte=65536"`
	// Relative amount. Maximum amount of heap memory used for field data cache. This is an expert setting; decreasing the value too much will increase overhead of loading field data; too much memory used for field data cache will decrease amount of heap available for other operations.
	IndicesFielddataCacheSize *int `json:"indices_fielddata_cache_size,omitempty" validate:"omitempty,gte=3,lte=100"`
	// Percentage value. Default is 10%. Total amount of heap used for indexing buffer, before writing segments to disk. This is an expert setting. Too low value will slow down indexing; too high value will increase indexing performance but causes performance issues for query performance.
	IndicesMemoryIndexBufferSize int `json:"indices_memory_index_buffer_size,omitempty" validate:"omitempty,gte=3,lte=40"`
	// Absolute value. Default is unbound. Doesn't work without indices.memory.index_buffer_size. Maximum amount of heap used for query cache, an absolute indices.memory.index_buffer_size maximum hard limit.
	IndicesMemoryMaxIndexBufferSize int `json:"indices_memory_max_index_buffer_size,omitempty" validate:"omitempty,gte=3,lte=2048"`
	// Absolute value. Default is 48mb. Doesn't work without indices.memory.index_buffer_size. Minimum amount of heap used for query cache, an absolute indices.memory.index_buffer_size minimal hard limit.
	IndicesMemoryMinIndexBufferSize int `json:"indices_memory_min_index_buffer_size,omitempty" validate:"omitempty,gte=3,lte=2048"`
	// Percentage value. Default is 10%. Maximum amount of heap used for query cache. This is an expert setting. Too low value will decrease query performance and increase performance for other operations; too high value will cause issues with other OpenSearch functionality.
	IndicesQueriesCacheSize int `json:"indices_queries_cache_size,omitempty" validate:"omitempty,gte=3,lte=40"`
	// Maximum number of clauses Lucene BooleanQuery can have. The default value (1024) is relatively high, and increasing it may cause performance issues. Investigate other approaches first before increasing this value.
	IndicesQueryBoolMaxClauseCount int `json:"indices_query_bool_max_clause_count,omitempty" validate:"omitempty,gte=64,lte=4096"`
	// Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to 40mb
	IndicesRecoveryMaxBytesPerSec int `json:"indices_recovery_max_bytes_per_sec,omitempty" validate:"omitempty,gte=40,lte=400"`
	// Number of file chunks sent in parallel for each recovery. Defaults to 2.
	IndicesRecoveryMaxConcurrentFileChunks int `json:"indices_recovery_max_concurrent_file_chunks,omitempty" validate:"omitempty,gte=2,lte=5"`
	// Opensearch ISM History Settings
	IsmHistory *JSONSchemaOpensearchIsmHistory `json:"ism-history,omitempty"`
	// Enable or disable KNN memory circuit breaker. Defaults to true.
	KnnMemoryCircuitBreakerEnabled *bool `json:"knn_memory_circuit_breaker_enabled,omitempty"`
	// Maximum amount of memory that can be used for KNN index. Defaults to 50% of the JVM heap size.
	KnnMemoryCircuitBreakerLimit int `json:"knn_memory_circuit_breaker_limit,omitempty" validate:"omitempty,gte=3,lte=100"`
	// Compatibility mode sets OpenSearch to report its version as 7.10 so clients continue to work. Default is false
	OverrideMainResponseVersion *bool `json:"override_main_response_version,omitempty"`
	// Enable or disable filtering of alerting by backend roles. Requires Security plugin. Defaults to false
	PluginsAlertingFilterByBackendRoles *bool `json:"plugins_alerting_filter_by_backend_roles,omitempty"`
	// Whitelisted addresses for reindexing. Changing this value will cause all OpenSearch instances to restart.
	ReindexRemoteWhitelist []string `json:"reindex_remote_whitelist"`
	// Script compilation circuit breaker limits the number of inline script compilations within a period of time. Default is use-context
	ScriptMaxCompilationsRate string `json:"script_max_compilations_rate,omitempty" validate:"omitempty,lte=1024"`
	// Search Backpressure Settings
	SearchBackpressure *JSONSchemaOpensearchSearchBackpressure `json:"search_backpressure,omitempty"`
	// Maximum number of aggregation buckets allowed in a single response. OpenSearch default value is used when this is not defined.
	SearchMaxBuckets *int `json:"search_max_buckets,omitempty" validate:"omitempty,gte=1,lte=1e+06"`
	// Shard indexing back pressure settings
	ShardIndexingPressure *JSONSchemaOpensearchShardIndexingPressure `json:"shard_indexing_pressure,omitempty"`
	// Size for the thread pool queue. See documentation for exact details.
	ThreadPoolAnalyzeQueueSize int `json:"thread_pool_analyze_queue_size,omitempty" validate:"omitempty,gte=10,lte=2000"`
	// Size for the thread pool. See documentation for exact details. Do note this may have maximum value depending on CPU count - value is automatically lowered if set to higher than maximum value.
	ThreadPoolAnalyzeSize int `json:"thread_pool_analyze_size,omitempty" validate:"omitempty,gte=1,lte=128"`
	// Size for the thread pool. See documentation for exact details. Do note this may have maximum value depending on CPU count - value is automatically lowered if set to higher than maximum value.
	ThreadPoolForceMergeSize int `json:"thread_pool_force_merge_size,omitempty" validate:"omitempty,gte=1,lte=128"`
	// Size for the thread pool queue. See documentation for exact details.
	ThreadPoolGetQueueSize int `json:"thread_pool_get_queue_size,omitempty" validate:"omitempty,gte=10,lte=2000"`
	// Size for the thread pool. See documentation for exact details. Do note this may have maximum value depending on CPU count - value is automatically lowered if set to higher than maximum value.
	ThreadPoolGetSize int `json:"thread_pool_get_size,omitempty" validate:"omitempty,gte=1,lte=128"`
	// Size for the thread pool queue. See documentation for exact details.
	ThreadPoolSearchQueueSize int `json:"thread_pool_search_queue_size,omitempty" validate:"omitempty,gte=10,lte=2000"`
	// Size for the thread pool. See documentation for exact details. Do note this may have maximum value depending on CPU count - value is automatically lowered if set to higher than maximum value.
	ThreadPoolSearchSize int `json:"thread_pool_search_size,omitempty" validate:"omitempty,gte=1,lte=128"`
	// Size for the thread pool queue. See documentation for exact details.
	ThreadPoolSearchThrottledQueueSize int `json:"thread_pool_search_throttled_queue_size,omitempty" validate:"omitempty,gte=10,lte=2000"`
	// Size for the thread pool. See documentation for exact details. Do note this may have maximum value depending on CPU count - value is automatically lowered if set to higher than maximum value.
	ThreadPoolSearchThrottledSize int `json:"thread_pool_search_throttled_size,omitempty" validate:"omitempty,gte=1,lte=128"`
	// Size for the thread pool queue. See documentation for exact details.
	ThreadPoolWriteQueueSize int `json:"thread_pool_write_queue_size,omitempty" validate:"omitempty,gte=10,lte=2000"`
	// Size for the thread pool. See documentation for exact details. Do note this may have maximum value depending on CPU count - value is automatically lowered if set to higher than maximum value.
	ThreadPoolWriteSize int `json:"thread_pool_write_size,omitempty" validate:"omitempty,gte=1,lte=128"`
}

// Autovacuum settings
type JSONSchemaPGAutovacuum struct {
	// Specifies a fraction of the table size to add to autovacuum_analyze_threshold when deciding whether to trigger an ANALYZE (e.g. `0.2` for 20% of the table size). The default is `0.2`.
	AutovacuumAnalyzeScaleFactor float64 `json:"autovacuum_analyze_scale_factor,omitempty" validate:"omitempty,gte=0,lte=1"`
	// Specifies the minimum number of inserted, updated or deleted tuples needed to trigger an ANALYZE in any one table. The default is `50`.
	AutovacuumAnalyzeThreshold int `json:"autovacuum_analyze_threshold,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is forced to prevent transaction ID wraparound within the table. The system launches autovacuum processes to prevent wraparound even when autovacuum is otherwise disabled. Changing this parameter causes a service restart.
	AutovacuumFreezeMaxAge int `json:"autovacuum_freeze_max_age,omitempty" validate:"omitempty,gte=2e+08,lte=1.5e+09"`
	// Specifies the maximum number of autovacuum processes (other than the autovacuum launcher) that may be running at any one time. The default is `3`. Changing this parameter causes a service restart.
	AutovacuumMaxWorkers int `json:"autovacuum_max_workers,omitempty" validate:"omitempty,gte=1,lte=20"`
	// Specifies the minimum delay between autovacuum runs on any given database. The delay is measured in seconds. The default is `60`.
	AutovacuumNaptime int `json:"autovacuum_naptime,omitempty" validate:"omitempty,gte=1,lte=86400"`
	// Specifies the cost delay value that will be used in automatic VACUUM operations. If `-1` is specified, the regular vacuum_cost_delay value will be used. The default is `2` (upstream default).
	AutovacuumVacuumCostDelay int `json:"autovacuum_vacuum_cost_delay,omitempty" validate:"omitempty,gte=-1,lte=100"`
	// Specifies the cost limit value that will be used in automatic VACUUM operations. If `-1` is specified, the regular vacuum_cost_limit value will be used. The default is `-1` (upstream default).
	AutovacuumVacuumCostLimit int `json:"autovacuum_vacuum_cost_limit,omitempty" validate:"omitempty,gte=-1,lte=10000"`
	// Specifies a fraction of the table size to add to autovacuum_vacuum_threshold when deciding whether to trigger a VACUUM (e.g. `0.2` for 20% of the table size). The default is `0.2`.
	AutovacuumVacuumScaleFactor float64 `json:"autovacuum_vacuum_scale_factor,omitempty" validate:"omitempty,gte=0,lte=1"`
	// Specifies the minimum number of updated or deleted tuples needed to trigger a VACUUM in any one table. The default is `50`.
	AutovacuumVacuumThreshold int `json:"autovacuum_vacuum_threshold,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// Causes each action executed by autovacuum to be logged if it ran for at least the specified number of milliseconds. Setting this to zero logs all autovacuum actions. Minus-one disables logging autovacuum actions. The default is `1000`.
	LogAutovacuumMinDuration int `json:"log_autovacuum_min_duration,omitempty" validate:"omitempty,gte=-1,lte=2.147483647e+09"`
}

// Background (BG) writer settings
type JSONSchemaPGBGWriter struct {
	// Specifies the delay between activity rounds for the background writer in milliseconds. The default is `200`.
	BgwriterDelay int `json:"bgwriter_delay,omitempty" validate:"omitempty,gte=10,lte=10000"`
	// Whenever more than bgwriter_flush_after bytes have been written by the background writer, attempt to force the OS to issue these writes to the underlying storage. Specified in kilobytes. Setting of 0 disables forced writeback. The default is `512`.
	BgwriterFlushAfter int `json:"bgwriter_flush_after,omitempty" validate:"omitempty,gte=0,lte=2048"`
	// In each round, no more than this many buffers will be written by the background writer. Setting this to zero disables background writing. The default is `100`.
	BgwriterLruMaxpages int `json:"bgwriter_lru_maxpages,omitempty" validate:"omitempty,gte=0,lte=1.073741823e+09"`
	// The average recent need for new buffers is multiplied by bgwriter_lru_multiplier to arrive at an estimate of the number that will be needed during the next round, (up to bgwriter_lru_maxpages). 1.0 represents a “just in time” policy of writing exactly the number of buffers predicted to be needed. Larger values provide some cushion against spikes in demand, while smaller values intentionally leave writes to be done by server processes. The default is `2.0`.
	BgwriterLruMultiplier float64 `json:"bgwriter_lru_multiplier,omitempty" validate:"omitempty,gte=0,lte=10"`
}

type JSONSchemaPGDefaultToastCompression string

const (
	JSONSchemaPGDefaultToastCompressionLz4  JSONSchemaPGDefaultToastCompression = "lz4"
	JSONSchemaPGDefaultToastCompressionPglz JSONSchemaPGDefaultToastCompression = "pglz"
)

type JSONSchemaPGIoMethod string

const (
	JSONSchemaPGIoMethodWorker  JSONSchemaPGIoMethod = "worker"
	JSONSchemaPGIoMethodSync    JSONSchemaPGIoMethod = "sync"
	JSONSchemaPGIoMethodIoUring JSONSchemaPGIoMethod = "io_uring"
)

type JSONSchemaPGLogErrorVerbosity string

const (
	JSONSchemaPGLogErrorVerbosityTERSE   JSONSchemaPGLogErrorVerbosity = "TERSE"
	JSONSchemaPGLogErrorVerbosityDEFAULT JSONSchemaPGLogErrorVerbosity = "DEFAULT"
	JSONSchemaPGLogErrorVerbosityVERBOSE JSONSchemaPGLogErrorVerbosity = "VERBOSE"
)

type JSONSchemaPGPasswordEncryption string

const (
	JSONSchemaPGPasswordEncryptionMd5         JSONSchemaPGPasswordEncryption = "md5"
	JSONSchemaPGPasswordEncryptionScramSha256 JSONSchemaPGPasswordEncryption = "scram-sha-256"
)

type JSONSchemaPGPGStatStatementsTrack string

const (
	JSONSchemaPGPGStatStatementsTrackAll  JSONSchemaPGPGStatStatementsTrack = "all"
	JSONSchemaPGPGStatStatementsTrackTop  JSONSchemaPGPGStatStatementsTrack = "top"
	JSONSchemaPGPGStatStatementsTrackNone JSONSchemaPGPGStatStatementsTrack = "none"
)

type JSONSchemaPGTrackCommitTimestamp string

const (
	JSONSchemaPGTrackCommitTimestampOff JSONSchemaPGTrackCommitTimestamp = "off"
	JSONSchemaPGTrackCommitTimestampOn  JSONSchemaPGTrackCommitTimestamp = "on"
)

type JSONSchemaPGTrackFunctions string

const (
	JSONSchemaPGTrackFunctionsAll  JSONSchemaPGTrackFunctions = "all"
	JSONSchemaPGTrackFunctionsPL   JSONSchemaPGTrackFunctions = "pl"
	JSONSchemaPGTrackFunctionsNone JSONSchemaPGTrackFunctions = "none"
)

type JSONSchemaPGTrackIoTiming string

const (
	JSONSchemaPGTrackIoTimingOff JSONSchemaPGTrackIoTiming = "off"
	JSONSchemaPGTrackIoTimingOn  JSONSchemaPGTrackIoTiming = "on"
)

// Write-ahead log (WAL) settings
type JSONSchemaPGWal struct {
	// PostgreSQL maximum WAL size (MB) reserved for replication slots. If `-1` is specified, replication slots may retain an unlimited amount of WAL files. The default is `-1` (upstream default). wal_keep_size minimum WAL size setting takes precedence over this.
	MaxSlotWalKeepSize int `json:"max_slot_wal_keep_size,omitempty" validate:"omitempty,gte=-1,lte=2.147483647e+09"`
	// PostgreSQL maximum WAL senders. The default is `20`. Changing this parameter causes a service restart.
	MaxWalSenders int `json:"max_wal_senders,omitempty" validate:"omitempty,gte=20,lte=256"`
	// Terminate replication connections that are inactive for longer than this amount of time, in milliseconds.
	WalSenderTimeout int `json:"wal_sender_timeout,omitempty" validate:"omitempty,gte=0,lte=1.08e+07"`
	// WAL flush interval in milliseconds. The default is `200`. Setting this parameter to a lower value may negatively impact performance.
	WalWriterDelay int `json:"wal_writer_delay,omitempty" validate:"omitempty,gte=10,lte=200"`
}

// postgresql.conf configuration values
type JSONSchemaPG struct {
	// Autovacuum settings
	Autovacuum *JSONSchemaPGAutovacuum `json:"autovacuum,omitempty"`
	// Background (BG) writer settings
	BGWriter *JSONSchemaPGBGWriter `json:"bg-writer,omitempty"`
	// This is the amount of time, in milliseconds, to wait on a lock before checking to see if there is a deadlock condition. The default is `1000` (upstream default).
	DeadlockTimeout int `json:"deadlock_timeout,omitempty" validate:"omitempty,gte=500,lte=1.8e+06"`
	// Specifies the default TOAST compression method for values of compressible columns. The default is `lz4`. Only available for PostgreSQL 14+.
	DefaultToastCompression JSONSchemaPGDefaultToastCompression `json:"default_toast_compression,omitempty"`
	// Time out sessions with open transactions after this number of milliseconds
	IdleInTransactionSessionTimeout int `json:"idle_in_transaction_session_timeout,omitempty" validate:"omitempty,gte=0,lte=6.048e+08"`
	// EXPERIMENTAL: Controls the largest I/O size in operations that combine I/O in 8kB units. Version 17 and up only.
	IoCombineLimit int `json:"io_combine_limit,omitempty" validate:"omitempty,gte=1,lte=32"`
	// EXPERIMENTAL: Controls the largest I/O size in operations that combine I/O in 8kB units, and silently limits the user-settable parameter io_combine_limit. Version 18 and up only. Changing this parameter causes a service restart.
	IoMaxCombineLimit int `json:"io_max_combine_limit,omitempty" validate:"omitempty,gte=1,lte=128"`
	// EXPERIMENTAL: Controls the maximum number of I/O operations that one process can execute simultaneously. Version 18 and up only. Changing this parameter causes a service restart.
	IoMaxConcurrency int `json:"io_max_concurrency,omitempty" validate:"omitempty,gte=-1,lte=1024"`
	// EXPERIMENTAL: Controls the maximum number of I/O operations that one process can execute simultaneously. Version 18 and up only. Changing this parameter causes a service restart.
	IoMethod JSONSchemaPGIoMethod `json:"io_method,omitempty"`
	// EXPERIMENTAL: Number of IO worker processes, for io_method=worker. Version 18 and up only. Changing this parameter causes a service restart.
	IoWorkers int `json:"io_workers,omitempty" validate:"omitempty,gte=1,lte=32"`
	// Controls system-wide use of Just-in-Time Compilation (JIT).
	Jit *bool `json:"jit,omitempty"`
	// Controls the amount of detail written in the server log for each message that is logged.
	LogErrorVerbosity JSONSchemaPGLogErrorVerbosity `json:"log_error_verbosity,omitempty"`
	// Choose from one of the available log formats.
	LogLinePrefix string `json:"log_line_prefix,omitempty"`
	// Log statements that take more than this number of milliseconds to run, -1 disables
	LogMinDurationStatement int `json:"log_min_duration_statement,omitempty" validate:"omitempty,gte=-1,lte=8.64e+07"`
	// Log statements for each temporary file created larger than this number of kilobytes, -1 disables
	LogTempFiles int `json:"log_temp_files,omitempty" validate:"omitempty,gte=-1,lte=2.147483647e+09"`
	// PostgreSQL maximum number of files that can be open per process. The default is `1000` (upstream default). Changing this parameter causes a service restart.
	MaxFilesPerProcess int `json:"max_files_per_process,omitempty" validate:"omitempty,gte=1000,lte=4096"`
	// PostgreSQL maximum locks per transaction. Changing this parameter causes a service restart.
	MaxLocksPerTransaction int `json:"max_locks_per_transaction,omitempty" validate:"omitempty,gte=64,lte=6400"`
	// PostgreSQL maximum logical replication workers (taken from the pool of max_parallel_workers). The default is `4` (upstream default). Changing this parameter causes a service restart.
	MaxLogicalReplicationWorkers int `json:"max_logical_replication_workers,omitempty" validate:"omitempty,gte=4,lte=256"`
	// Sets the maximum number of workers that the system can support for parallel queries. The default is `8` (upstream default).
	MaxParallelWorkers int `json:"max_parallel_workers,omitempty" validate:"omitempty,gte=0,lte=96"`
	// Sets the maximum number of workers that can be started by a single Gather or Gather Merge node. The default is `2` (upstream default).
	MaxParallelWorkersPerGather int `json:"max_parallel_workers_per_gather,omitempty" validate:"omitempty,gte=0,lte=96"`
	// PostgreSQL maximum predicate locks per transaction. The default is `64` (upstream default). Changing this parameter causes a service restart.
	MaxPredLocksPerTransaction int `json:"max_pred_locks_per_transaction,omitempty" validate:"omitempty,gte=64,lte=5120"`
	// PostgreSQL maximum prepared transactions. The default is `0`. Changing this parameter causes a service restart.
	MaxPreparedTransactions int `json:"max_prepared_transactions,omitempty" validate:"omitempty,gte=0,lte=10000"`
	// PostgreSQL maximum replication slots. The default is `20`. Changing this parameter causes a service restart.
	MaxReplicationSlots int `json:"max_replication_slots,omitempty" validate:"omitempty,gte=8,lte=256"`
	// Maximum depth of the stack in bytes. The default is `2097152` (upstream default).
	MaxStackDepth int `json:"max_stack_depth,omitempty" validate:"omitempty,gte=2.097152e+06,lte=6.291456e+06"`
	// Max standby archive delay in milliseconds. The default is `30000` (upstream default).
	MaxStandbyArchiveDelay int `json:"max_standby_archive_delay,omitempty" validate:"omitempty,gte=1,lte=4.32e+07"`
	// Max standby streaming delay in milliseconds. The default is `30000` (upstream default).
	MaxStandbyStreamingDelay int `json:"max_standby_streaming_delay,omitempty" validate:"omitempty,gte=1,lte=4.32e+07"`
	// Maximum number of synchronization workers per subscription. The default is `2`.
	MaxSyncWorkersPerSubscription int `json:"max_sync_workers_per_subscription,omitempty" validate:"omitempty,gte=2,lte=8"`
	// Sets the maximum number of background processes that the system can support. The default is `8`. Changing this parameter causes a service restart.
	MaxWorkerProcesses int `json:"max_worker_processes,omitempty" validate:"omitempty,gte=8,lte=288"`
	// Chooses the algorithm for encrypting passwords.
	PasswordEncryption JSONSchemaPGPasswordEncryption `json:"password_encryption,omitempty"`
	// Sets the time interval in seconds to run pg_partman's scheduled tasks. The default is `3600`.
	PGPartmanBgwInterval int `json:"pg_partman_bgw.interval,omitempty" validate:"omitempty,gte=3600,lte=604800"`
	// Controls which role to use for pg_partman's scheduled background tasks.
	PGPartmanBgwRole string `json:"pg_partman_bgw.role,omitempty" validate:"omitempty,lte=64"`
	// Enables or disables query plan monitoring. Changing this parameter causes a service restart. Only available for PostgreSQL 13+.
	PGStatMonitorPgsmEnableQueryPlan *bool `json:"pg_stat_monitor.pgsm_enable_query_plan,omitempty"`
	// Sets the maximum number of buckets. Changing this parameter causes a service restart. Only available for PostgreSQL 13+.
	PGStatMonitorPgsmMaxBuckets int `json:"pg_stat_monitor.pgsm_max_buckets,omitempty" validate:"omitempty,gte=1,lte=10"`
	// Controls which statements are counted. Specify top to track top-level statements (those issued directly by clients), all to also track nested statements (such as statements invoked within functions), or none to disable statement statistics collection. The default is `top`.
	PGStatStatementsTrack JSONSchemaPGPGStatStatementsTrack `json:"pg_stat_statements.track,omitempty"`
	// PostgreSQL temporary file limit in KiB, -1 for unlimited
	TempFileLimit int `json:"temp_file_limit,omitempty" validate:"omitempty,gte=-1,lte=2.147483647e+09"`
	// PostgreSQL service timezone
	Timezone string `json:"timezone,omitempty" validate:"omitempty,lte=64"`
	// Specifies the number of bytes reserved to track the currently executing command for each active session. Changing this parameter causes a service restart.
	TrackActivityQuerySize int `json:"track_activity_query_size,omitempty" validate:"omitempty,gte=1024,lte=10240"`
	// Record commit time of transactions. Changing this parameter causes a service restart.
	TrackCommitTimestamp JSONSchemaPGTrackCommitTimestamp `json:"track_commit_timestamp,omitempty"`
	// Enables tracking of function call counts and time used.
	TrackFunctions JSONSchemaPGTrackFunctions `json:"track_functions,omitempty"`
	// Enables timing of database I/O calls. The default is `off`. When on, it will repeatedly query the operating system for the current time, which may cause significant overhead on some platforms.
	TrackIoTiming JSONSchemaPGTrackIoTiming `json:"track_io_timing,omitempty"`
	// Write-ahead log (WAL) settings
	Wal *JSONSchemaPGWal `json:"wal,omitempty"`
}

type JSONSchemaPgbouncerAutodbPoolMode string

const (
	JSONSchemaPgbouncerAutodbPoolModeTransaction JSONSchemaPgbouncerAutodbPoolMode = "transaction"
	JSONSchemaPgbouncerAutodbPoolModeSession     JSONSchemaPgbouncerAutodbPoolMode = "session"
	JSONSchemaPgbouncerAutodbPoolModeStatement   JSONSchemaPgbouncerAutodbPoolMode = "statement"
)

// System-wide settings for pgbouncer.
type JSONSchemaPgbouncer struct {
	// If the automatically created database pools have been unused this many seconds, they are freed. If 0 then timeout is disabled. [seconds]
	AutodbIdleTimeout int `json:"autodb_idle_timeout,omitempty" validate:"omitempty,gte=0,lte=86400"`
	// Do not allow more than this many server connections per database (regardless of user). Setting it to 0 means unlimited.
	AutodbMaxDBConnections int `json:"autodb_max_db_connections,omitempty" validate:"omitempty,gte=0,lte=2.147483647e+09"`
	// PGBouncer pool mode
	AutodbPoolMode JSONSchemaPgbouncerAutodbPoolMode `json:"autodb_pool_mode,omitempty"`
	// If non-zero then create automatically a pool of that size per user when a pool doesn't exist.
	AutodbPoolSize int `json:"autodb_pool_size,omitempty" validate:"omitempty,gte=0,lte=10000"`
	// List of parameters to ignore when given in startup packet
	IgnoreStartupParameters []string `json:"ignore_startup_parameters,omitempty"`
	// PgBouncer tracks protocol-level named prepared statements related commands sent by the client in transaction and statement pooling modes when max_prepared_statements is set to a non-zero value. Setting it to 0 disables prepared statements. max_prepared_statements defaults to 100, and its maximum is 3000.
	MaxPreparedStatements int `json:"max_prepared_statements,omitempty" validate:"omitempty,gte=0,lte=3000"`
	// Add more server connections to pool if below this number. Improves behavior when usual load comes suddenly back after period of total inactivity. The value is effectively capped at the pool size.
	MinPoolSize int `json:"min_pool_size,omitempty" validate:"omitempty,gte=0,lte=10000"`
	// If a server connection has been idle more than this many seconds it will be dropped. If 0 then timeout is disabled. [seconds]
	ServerIdleTimeout int `json:"server_idle_timeout,omitempty" validate:"omitempty,gte=0,lte=86400"`
	// The pooler will close an unused server connection that has been connected longer than this. [seconds]
	ServerLifetime int `json:"server_lifetime,omitempty" validate:"omitempty,gte=60,lte=86400"`
	// Run server_reset_query (DISCARD ALL) in all pooling modes
	ServerResetQueryAlways *bool `json:"server_reset_query_always,omitempty"`
}

// System-wide settings for pglookout.
type JSONSchemaPglookout struct {
	// Number of seconds of master unavailability before triggering database failover to standby
	MaxFailoverReplicationTimeLag int `json:"max_failover_replication_time_lag,omitempty" validate:"omitempty,gte=10,lte=9.223372036854776e+18"`
}

// Schema Registry configuration
type JSONSchemaSchemaRegistry struct {
	// If true, Karapace / Schema Registry on the service nodes can participate in leader election. It might be needed to disable this when the schemas topic is replicated to a secondary cluster and Karapace / Schema Registry there must not participate in leader election. Defaults to `true`.
	LeaderEligibility *bool `json:"leader_eligibility,omitempty"`
	// The durable single partition topic that acts as the durable log for the data. This topic must be compacted to avoid losing data due to retention policy. Please note that changing this configuration in an existing Schema Registry / Karapace setup leads to previous schemas being inaccessible, data encoded with them potentially unreadable and schema ID sequence put out of order. It's only possible to do the switch while Schema Registry / Karapace is disabled. Defaults to `_schemas`.
	TopicName string `json:"topic_name,omitempty" validate:"omitempty,gte=1,lte=249"`
}

// Configuration options for Thanos Compactor.
type JSONSchemaThanosCompactor struct {
	// Retention time for data in days for each resolution (5m, 1h, raw)
	RetentionDays int `json:"retention.days,omitempty" validate:"omitempty,gte=0"`
}

// Configuration options for Thanos Query.
type JSONSchemaThanosQuery struct {
	// Set the default evaluation interval for subqueries.
	QueryDefaultEvaluationInterval string `json:"query.default-evaluation-interval,omitempty" validate:"omitempty,lte=20"`
	// The maximum lookback duration for retrieving metrics during expression evaluations in PromQL. PromQL always evaluates the query for a certain timestamp, and it looks back for the given amount of time to get the latest sample. If it exceeds the maximum lookback delta, it assumes the series is stale and returns none (a gap). The lookback delta should be set to at least 2 times the slowest scrape interval. If unset, it will use the promql default of 5m.
	QueryLookbackDelta string `json:"query.lookback-delta,omitempty" validate:"omitempty,lte=20"`
	// The default metadata time range duration for retrieving labels through Labels and Series API when the range parameters are not specified. The zero value means the range covers the time since the beginning.
	QueryMetadataDefaultTimeRange string `json:"query.metadata.default-time-range,omitempty" validate:"omitempty,lte=20"`
	// Maximum time to process a query by the query node.
	QueryTimeout string `json:"query.timeout,omitempty" validate:"omitempty,lte=20"`
	// The maximum samples allowed for a single Series request. The Series call fails if this limit is exceeded. Set to 0 for no limit. NOTE: For efficiency, the limit is internally implemented as 'chunks limit' considering each chunk contains a maximum of 120 samples. The default value is 100 * store.limits.request-series.
	StoreLimitsRequestSamples int `json:"store.limits.request-samples,omitempty" validate:"omitempty,gte=0,lte=1e+08"`
	// The maximum series allowed for a single Series request. The Series call fails if this limit is exceeded. Set to 0 for no limit. The default value is 1000 * cpu_count.
	StoreLimitsRequestSeries int `json:"store.limits.request-series,omitempty" validate:"omitempty,gte=0,lte=1e+08"`
}

// Configuration options for Thanos Query Frontend.
type JSONSchemaThanosQueryFrontend struct {
	// Whether to align the query range boundaries with the step. If enabled, the query range boundaries will be aligned to the step, providing more accurate results for queries with high-resolution data.
	QueryRangeAlignRangeWithStep *bool `json:"query-range.align-range-with-step,omitempty"`
}

// Thanos settings
type JSONSchemaThanos struct {
	// Configuration options for Thanos Compactor.
	Compactor *JSONSchemaThanosCompactor `json:"compactor,omitempty"`
	// Configuration options for Thanos Query.
	Query *JSONSchemaThanosQuery `json:"query,omitempty"`
	// Configuration options for Thanos Query Frontend.
	QueryFrontend *JSONSchemaThanosQueryFrontend `json:"query-frontend,omitempty"`
}

// System-wide settings for the timescaledb extension
type JSONSchemaTimescaledb struct {
	// The number of background workers for timescaledb operations. You should configure this setting to the sum of your number of databases and the total number of concurrent background workers you want running at any given point in time. Changing this parameter causes a service restart.
	MaxBackgroundWorkers int `json:"max_background_workers,omitempty" validate:"omitempty,gte=1,lte=4096"`
}

type JSONSchemaValkeyAclChannelsDefault string

const (
	JSONSchemaValkeyAclChannelsDefaultAllchannels   JSONSchemaValkeyAclChannelsDefault = "allchannels"
	JSONSchemaValkeyAclChannelsDefaultResetchannels JSONSchemaValkeyAclChannelsDefault = "resetchannels"
)

type JSONSchemaValkeyMaxmemoryPolicy string

const (
	JSONSchemaValkeyMaxmemoryPolicyNoeviction     JSONSchemaValkeyMaxmemoryPolicy = "noeviction"
	JSONSchemaValkeyMaxmemoryPolicyAllkeysLru     JSONSchemaValkeyMaxmemoryPolicy = "allkeys-lru"
	JSONSchemaValkeyMaxmemoryPolicyVolatileLru    JSONSchemaValkeyMaxmemoryPolicy = "volatile-lru"
	JSONSchemaValkeyMaxmemoryPolicyAllkeysRandom  JSONSchemaValkeyMaxmemoryPolicy = "allkeys-random"
	JSONSchemaValkeyMaxmemoryPolicyVolatileRandom JSONSchemaValkeyMaxmemoryPolicy = "volatile-random"
	JSONSchemaValkeyMaxmemoryPolicyVolatileTtl    JSONSchemaValkeyMaxmemoryPolicy = "volatile-ttl"
	JSONSchemaValkeyMaxmemoryPolicyVolatileLfu    JSONSchemaValkeyMaxmemoryPolicy = "volatile-lfu"
	JSONSchemaValkeyMaxmemoryPolicyAllkeysLfu     JSONSchemaValkeyMaxmemoryPolicy = "allkeys-lfu"
)

type JSONSchemaValkeyPersistence string

const (
	JSONSchemaValkeyPersistenceOff JSONSchemaValkeyPersistence = "off"
	JSONSchemaValkeyPersistenceRdb JSONSchemaValkeyPersistence = "rdb"
)

// Valkey settings
type JSONSchemaValkey struct {
	// Determines default pub/sub channels' ACL for new users if ACL is not supplied. When this option is not defined, all_channels is assumed to keep backward compatibility. This option doesn't affect Valkey configuration acl-pubsub-default.
	AclChannelsDefault JSONSchemaValkeyAclChannelsDefault `json:"acl_channels_default,omitempty"`
	// Set Valkey IO thread count. Changing this will cause a restart of the Valkey service.
	IoThreads int `json:"io_threads,omitempty" validate:"omitempty,gte=1,lte=32"`
	// LFU maxmemory-policy counter decay time in minutes
	LfuDecayTime int `json:"lfu_decay_time,omitempty" validate:"omitempty,gte=1,lte=120"`
	// Counter logarithm factor for volatile-lfu and allkeys-lfu maxmemory-policies
	LfuLogFactor int `json:"lfu_log_factor,omitempty" validate:"omitempty,gte=0,lte=100"`
	// Valkey maxmemory-policy
	MaxmemoryPolicy JSONSchemaValkeyMaxmemoryPolicy `json:"maxmemory_policy,omitempty"`
	// Set notify-keyspace-events option
	NotifyKeyspaceEvents string `json:"notify_keyspace_events,omitempty" validate:"omitempty,lte=32"`
	// Set number of Valkey databases. Changing this will cause a restart of the Valkey service.
	NumberOfDatabases int `json:"number_of_databases,omitempty" validate:"omitempty,gte=1,lte=128"`
	// When persistence is 'rdb', Valkey does RDB dumps each 10 minutes if any key is changed. Also RDB dumps are done according to backup schedule for backup purposes. When persistence is 'off', no RDB dumps and backups are done, so data can be lost at any moment if service is restarted for any reason, or if service is powered off. Also service can't be forked.
	Persistence JSONSchemaValkeyPersistence `json:"persistence,omitempty"`
	// Set output buffer limit for pub / sub clients in MB. The value is the hard limit, the soft limit is 1/4 of the hard limit. When setting the limit, be mindful of the available memory in the selected service plan.
	PubsubClientOutputBufferLimit int `json:"pubsub_client_output_buffer_limit,omitempty" validate:"omitempty,gte=32,lte=512"`
	// Require SSL to access Valkey
	SSL *bool `json:"ssl,omitempty"`
	// Valkey idle connection timeout in seconds
	Timeout int `json:"timeout,omitempty" validate:"omitempty,gte=0,lte=3.1536e+07"`
}

// Kubelet image GC options
type KubeletImageGC struct {
	HighThreshold int64  `json:"high-threshold,omitempty" validate:"omitempty,gte=0"`
	LowThreshold  int64  `json:"low-threshold,omitempty" validate:"omitempty,gte=0"`
	MinAge        string `json:"min-age,omitempty"`
}

type Labels map[string]string

// List of available instance types with authorization status
type ListAIInstanceTypesResponse struct {
	InstanceTypes []InstanceTypeEntry `json:"instance-types,omitempty"`
}

// AI model list
type ListDeploymentsResponse struct {
	Deployments []ListDeploymentsResponseEntry `json:"deployments,omitempty"`
}

type ListDeploymentsResponseEntryState string

const (
	ListDeploymentsResponseEntryStateReady     ListDeploymentsResponseEntryState = "ready"
	ListDeploymentsResponseEntryStateCreating  ListDeploymentsResponseEntryState = "creating"
	ListDeploymentsResponseEntryStateError     ListDeploymentsResponseEntryState = "error"
	ListDeploymentsResponseEntryStateDeploying ListDeploymentsResponseEntryState = "deploying"
)

// AI deployment
type ListDeploymentsResponseEntry struct {
	// Creation time
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Deployment URL (nullable)
	DeploymentURL string `json:"deployment-url,omitempty"`
	// Number of GPUs
	GpuCount int64 `json:"gpu-count,omitempty" validate:"omitempty,gte=1"`
	// GPU type family
	GpuType string `json:"gpu-type,omitempty" validate:"omitempty,gte=1"`
	// Deployment ID
	ID    UUID      `json:"id,omitempty"`
	Model *ModelRef `json:"model,omitempty"`
	// Deployment name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1"`
	// Number of replicas (>=0)
	Replicas int64 `json:"replicas,omitempty" validate:"omitempty,gte=0"`
	// Service level
	ServiceLevel string `json:"service-level,omitempty" validate:"omitempty,gte=1"`
	// Deployment state
	State ListDeploymentsResponseEntryState `json:"state,omitempty"`
	// Update time
	UpdatedAT time.Time `json:"updated-at,omitempty"`
}

// AI model list
type ListModelsResponse struct {
	Models []ListModelsResponseEntry `json:"models,omitempty"`
}

type ListModelsResponseEntryState string

const (
	ListModelsResponseEntryStateReady       ListModelsResponseEntryState = "ready"
	ListModelsResponseEntryStateCreating    ListModelsResponseEntryState = "creating"
	ListModelsResponseEntryStateDownloading ListModelsResponseEntryState = "downloading"
	ListModelsResponseEntryStateError       ListModelsResponseEntryState = "error"
	ListModelsResponseEntryStateCreated     ListModelsResponseEntryState = "created"
)

// AI model
type ListModelsResponseEntry struct {
	// Creation time
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Model ID
	ID UUID `json:"id,omitempty"`
	// Model size (nullable)
	ModelSize int64 `json:"model-size,omitempty" validate:"omitempty,gte=0"`
	// Model name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1"`
	// Model state
	State ListModelsResponseEntryState `json:"state,omitempty"`
	// Update time
	UpdatedAT time.Time `json:"updated-at,omitempty"`
}

type LoadBalancerState string

const (
	LoadBalancerStateCreating  LoadBalancerState = "creating"
	LoadBalancerStateMigrated  LoadBalancerState = "migrated"
	LoadBalancerStateDeleting  LoadBalancerState = "deleting"
	LoadBalancerStateRunning   LoadBalancerState = "running"
	LoadBalancerStateMigrating LoadBalancerState = "migrating"
	LoadBalancerStateError     LoadBalancerState = "error"
)

// Load Balancer
type LoadBalancer struct {
	// Load Balancer creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Load Balancer description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Load Balancer ID
	ID UUID `json:"id,omitempty"`
	// Load Balancer public IP
	IP     net.IP `json:"ip,omitempty"`
	Labels Labels `json:"labels,omitempty"`
	// Load Balancer name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Load Balancer Services
	Services []LoadBalancerService `json:"services,omitempty"`
	// Load Balancer state
	State LoadBalancerState `json:"state,omitempty"`
}

type LoadBalancerServerStatusStatus string

const (
	LoadBalancerServerStatusStatusFailure LoadBalancerServerStatusStatus = "failure"
	LoadBalancerServerStatusStatusSuccess LoadBalancerServerStatusStatus = "success"
)

// Load Balancer Service status
type LoadBalancerServerStatus struct {
	// Backend server public IP
	PublicIP net.IP `json:"public-ip,omitempty"`
	// Status of the instance's healthcheck
	Status LoadBalancerServerStatusStatus `json:"status,omitempty"`
}

type LoadBalancerServiceProtocol string

const (
	LoadBalancerServiceProtocolTCP LoadBalancerServiceProtocol = "tcp"
	LoadBalancerServiceProtocolUDP LoadBalancerServiceProtocol = "udp"
)

type LoadBalancerServiceState string

const (
	LoadBalancerServiceStateCreating LoadBalancerServiceState = "creating"
	LoadBalancerServiceStateDeleting LoadBalancerServiceState = "deleting"
	LoadBalancerServiceStateRunning  LoadBalancerServiceState = "running"
	LoadBalancerServiceStateUpdating LoadBalancerServiceState = "updating"
	LoadBalancerServiceStateError    LoadBalancerServiceState = "error"
)

type LoadBalancerServiceStrategy string

const (
	LoadBalancerServiceStrategyRoundRobin LoadBalancerServiceStrategy = "round-robin"
	LoadBalancerServiceStrategyMaglevHash LoadBalancerServiceStrategy = "maglev-hash"
	LoadBalancerServiceStrategySourceHash LoadBalancerServiceStrategy = "source-hash"
)

// Load Balancer Service
type LoadBalancerService struct {
	// Load Balancer Service description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Load Balancer Service healthcheck
	Healthcheck *LoadBalancerServiceHealthcheck `json:"healthcheck,omitempty"`
	// Healthcheck status per backend server
	HealthcheckStatus []LoadBalancerServerStatus `json:"healthcheck-status,omitempty"`
	// Load Balancer Service ID
	ID UUID `json:"id,omitempty"`
	// Instance Pool
	InstancePool *InstancePool `json:"instance-pool,omitempty"`
	// Load Balancer Service name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Port exposed on the Load Balancer's public IP
	Port int64 `json:"port,omitempty" validate:"omitempty,gt=0"`
	// Network traffic protocol
	Protocol LoadBalancerServiceProtocol `json:"protocol,omitempty"`
	// Load Balancer Service state
	State LoadBalancerServiceState `json:"state,omitempty"`
	// Load balancing strategy
	Strategy LoadBalancerServiceStrategy `json:"strategy,omitempty"`
	// Port on which the network traffic will be forwarded to on the receiving instance
	TargetPort int64 `json:"target-port,omitempty" validate:"omitempty,gt=0"`
}

type LoadBalancerServiceHealthcheckMode string

const (
	LoadBalancerServiceHealthcheckModeTCP   LoadBalancerServiceHealthcheckMode = "tcp"
	LoadBalancerServiceHealthcheckModeHTTP  LoadBalancerServiceHealthcheckMode = "http"
	LoadBalancerServiceHealthcheckModeHttps LoadBalancerServiceHealthcheckMode = "https"
)

// Load Balancer Service healthcheck
type LoadBalancerServiceHealthcheck struct {
	// Healthcheck interval (default: 10). Must be greater than or equal to Timeout
	Interval int64 `json:"interval,omitempty" validate:"omitempty,gte=5,lte=300"`
	// Healthcheck mode
	Mode LoadBalancerServiceHealthcheckMode `json:"mode,omitempty"`
	// Healthcheck port
	Port int64 `json:"port,omitempty" validate:"omitempty,gte=1,lte=65535"`
	// Number of retries before considering a Service failed
	Retries int64 `json:"retries,omitempty" validate:"omitempty,gte=1,lte=20"`
	// Healthcheck timeout value (default: 2). Must be lower than or equal to Interval
	Timeout int64 `json:"timeout,omitempty" validate:"omitempty,gte=2,lte=60"`
	// SNI domain for HTTPS healthchecks
	TlsSNI string `json:"tls-sni,omitempty" validate:"omitempty,gte=1,lte=255"`
	// An endpoint to use for the HTTP healthcheck, e.g. '/status'
	URI string `json:"uri,omitempty" validate:"omitempty,gte=1,lte=255"`
}

type ManagerType string

const (
	ManagerTypeSKSNodepool  ManagerType = "sks-nodepool"
	ManagerTypeInstancePool ManagerType = "instance-pool"
)

// Resource manager
type Manager struct {
	// Manager ID
	ID UUID `json:"id,omitempty"`
	// Manager type
	Type ManagerType `json:"type,omitempty"`
}

type ModelRef struct {
	// Associated model ID
	ID UUID `json:"id,omitempty"`
	// Associated model name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1"`
}

// Cluster networking configuration.
type Networking struct {
	// CIDR Range for Pods in cluster. This must not overlap with any IP ranges assigned to pods. Max of two, comma-separated, dual-stack CIDRs is allowed.
	// If not specified, defaults to 192.168.0.0/16.
	ClusterCidr string `json:"cluster-cidr,omitempty"`
	// Mask size for node cidr in cluster. It must be larger than the Pod CIDR subnet mask. Defaults to 24
	NodeCidrMaskSizeIpv4 int64 `json:"node-cidr-mask-size-ipv4,omitempty" validate:"omitempty,gt=0"`
	// Mask size for node cidr in cluster. It must be larger than the Pod CIDR subnet mask. Defaults to 64
	NodeCidrMaskSizeIpv6 int64 `json:"node-cidr-mask-size-ipv6,omitempty" validate:"omitempty,gt=0"`
	// CIDR range for service cluster IPs. This must not overlap with any IP ranges assigned to nodes or pods. Max of two, comma-separated, dual-stack CIDRs is allowed.
	// If not specified, defaults to 10.96.0.0/12.
	ServiceClusterIPRange string `json:"service-cluster-ip-range,omitempty"`
}

type OperationReason string

const (
	OperationReasonIncorrect   OperationReason = "incorrect"
	OperationReasonUnknown     OperationReason = "unknown"
	OperationReasonUnavailable OperationReason = "unavailable"
	OperationReasonForbidden   OperationReason = "forbidden"
	OperationReasonBusy        OperationReason = "busy"
	OperationReasonFault       OperationReason = "fault"
	OperationReasonPartial     OperationReason = "partial"
	OperationReasonNotFound    OperationReason = "not-found"
	OperationReasonInterrupted OperationReason = "interrupted"
	OperationReasonUnsupported OperationReason = "unsupported"
	OperationReasonConflict    OperationReason = "conflict"
)

// Related resource reference
type OperationReference struct {
	// Command name
	Command string `json:"command,omitempty"`
	// Reference ID
	ID UUID `json:"id,omitempty"`
	// Link to the referenced resource
	Link string `json:"link,omitempty"`
}

type OperationState string

const (
	OperationStateFailure OperationState = "failure"
	OperationStatePending OperationState = "pending"
	OperationStateSuccess OperationState = "success"
	OperationStateTimeout OperationState = "timeout"
)

// Operation
type Operation struct {
	// Operation ID
	ID UUID `json:"id,omitempty"`
	// Operation message
	Message string `json:"message,omitempty"`
	// Operation failure reason
	Reason OperationReason `json:"reason,omitempty"`
	// Related resource reference
	Reference *OperationReference `json:"reference,omitempty"`
	// Operation status
	State OperationState `json:"state,omitempty"`
}

// Organization
type Organization struct {
	// Organization address
	Address string `json:"address,omitempty"`
	// Organization balance
	Balance float64 `json:"balance,omitempty"`
	// Organization city
	City string `json:"city,omitempty"`
	// Organization country
	Country string `json:"country,omitempty"`
	// Organization currency
	Currency string `json:"currency,omitempty"`
	// Organization ID
	ID UUID `json:"id,omitempty"`
	// Organization name
	Name string `json:"name,omitempty"`
	// Organization postcode
	Postcode string `json:"postcode,omitempty"`
}

// Organization GPU usage
type OrganizationUsage struct {
	// Total GPU count
	Gpu int64 `json:"gpu" validate:"required,gte=0"`
}

// Private Network
type PrivateNetwork struct {
	// Private Network description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Private Network end IP address
	EndIP net.IP `json:"end-ip,omitempty"`
	// Private Network ID
	ID     UUID   `json:"id,omitempty"`
	Labels Labels `json:"labels,omitempty"`
	// Private Network leased IP addresses
	Leases []PrivateNetworkLease `json:"leases,omitempty"`
	// Private Network name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Private Network netmask
	Netmask net.IP `json:"netmask,omitempty"`
	// Private Network DHCP Options
	Options *PrivateNetworkOptions `json:"options,omitempty"`
	// Private Network start IP address
	StartIP net.IP `json:"start-ip,omitempty"`
	// Private Network VXLAN ID
	Vni int64 `json:"vni,omitempty" validate:"omitempty,gt=0"`
}

// Private Network leased IP address
type PrivateNetworkLease struct {
	// Attached instance ID
	InstanceID UUID `json:"instance-id,omitempty"`
	// Private Network IP address
	IP net.IP `json:"ip,omitempty"`
}

// Private Network DHCP Options
type PrivateNetworkOptions struct {
	// DNS Servers
	DNSServers []net.IP `json:"dns-servers,omitempty"`
	// Domain search list, limited to 255 octets
	DomainSearch []string `json:"domain-search,omitempty"`
	// NTP Servers
	NtpServers []net.IP `json:"ntp-servers,omitempty"`
	// Routers
	Routers []net.IP `json:"routers,omitempty"`
}

// Private network reference
type PrivateNetworkRef struct {
	// Private network ID
	ID UUID `json:"id,omitempty"`
}

type PublicIPAssignment string

const (
	PublicIPAssignmentInet4 PublicIPAssignment = "inet4"
	PublicIPAssignmentDual  PublicIPAssignment = "dual"
	PublicIPAssignmentNone  PublicIPAssignment = "none"
)

// Organization Quota
type Quota struct {
	// Resource Limit. -1 for Unlimited
	Limit int64 `json:"limit,omitempty"`
	// Resource Name
	Resource string `json:"resource,omitempty"`
	// Resource Usage
	Usage int64 `json:"usage,omitempty"`
}

// Resource
type Resource struct {
	// Resource ID
	ID UUID `json:"id,omitempty"`
	// Resource name
	Name string `json:"name,omitempty"`
}

// AI deployment inference endpoint authentication key
type RevealDeploymentAPIKeyResponse struct {
	APIKey string `json:"api-key,omitempty"`
}

type ReverseDNSRecord struct {
	DomainName DomainName `json:"domain-name,omitempty" validate:"omitempty,gte=1,lte=253"`
}

// Scale AI deployment
type ScaleDeploymentRequest struct {
	// Number of replicas (>=0)
	Replicas int64 `json:"replicas" validate:"required,gte=0"`
}

// Security Group
type SecurityGroup struct {
	// Security Group description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Security Group external sources
	ExternalSources []string `json:"external-sources,omitempty"`
	// Security Group ID
	ID UUID `json:"id,omitempty"`
	// Security Group name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Security Group rules
	Rules []SecurityGroupRule `json:"rules,omitempty"`
}

// Security group reference
type SecurityGroupRef struct {
	// Security group ID
	ID UUID `json:"id,omitempty"`
}

type SecurityGroupResourceVisibility string

const (
	SecurityGroupResourceVisibilityPrivate SecurityGroupResourceVisibility = "private"
	SecurityGroupResourceVisibilityPublic  SecurityGroupResourceVisibility = "public"
)

// Security Group
type SecurityGroupResource struct {
	// Security Group ID
	ID UUID `json:"id,omitempty"`
	// Security Group name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Whether this points to a public security group. This is only valid when in the context of
	// a rule addition which uses a public security group as a source or destination.
	Visibility SecurityGroupResourceVisibility `json:"visibility,omitempty"`
}

type SecurityGroupRuleFlowDirection string

const (
	SecurityGroupRuleFlowDirectionIngress SecurityGroupRuleFlowDirection = "ingress"
	SecurityGroupRuleFlowDirectionEgress  SecurityGroupRuleFlowDirection = "egress"
)

// ICMP details
type SecurityGroupRuleICMP struct {
	Code int64 `json:"code,omitempty" validate:"omitempty,gte=-1,lte=254"`
	Type int64 `json:"type,omitempty" validate:"omitempty,gte=-1,lte=254"`
}

type SecurityGroupRuleProtocol string

const (
	SecurityGroupRuleProtocolTCP    SecurityGroupRuleProtocol = "tcp"
	SecurityGroupRuleProtocolEsp    SecurityGroupRuleProtocol = "esp"
	SecurityGroupRuleProtocolICMP   SecurityGroupRuleProtocol = "icmp"
	SecurityGroupRuleProtocolUDP    SecurityGroupRuleProtocol = "udp"
	SecurityGroupRuleProtocolGre    SecurityGroupRuleProtocol = "gre"
	SecurityGroupRuleProtocolAh     SecurityGroupRuleProtocol = "ah"
	SecurityGroupRuleProtocolIpip   SecurityGroupRuleProtocol = "ipip"
	SecurityGroupRuleProtocolIcmpv6 SecurityGroupRuleProtocol = "icmpv6"
)

// Security Group rule
type SecurityGroupRule struct {
	// Security Group rule description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// End port of the range
	EndPort int64 `json:"end-port,omitempty" validate:"omitempty,gte=1,lte=65535"`
	// Network flow direction to match
	FlowDirection SecurityGroupRuleFlowDirection `json:"flow-direction,omitempty"`
	// ICMP details
	ICMP *SecurityGroupRuleICMP `json:"icmp,omitempty"`
	// Security Group rule ID
	ID UUID `json:"id,omitempty"`
	// CIDR-formatted network allowed
	Network string `json:"network,omitempty"`
	// Network protocol
	Protocol SecurityGroupRuleProtocol `json:"protocol,omitempty"`
	// Security Group
	SecurityGroup *SecurityGroupResource `json:"security-group,omitempty"`
	// Start port of the range
	StartPort int64 `json:"start-port,omitempty" validate:"omitempty,gte=1,lte=65535"`
}

// Kubernetes Audit parameters
type SKSAudit struct {
	// Enabled
	Enabled        *bool                  `json:"enabled,omitempty"`
	Endpoint       SKSAuditEndpoint       `json:"endpoint,omitempty" validate:"omitempty,gte=1,lte=2000"`
	InitialBackoff SKSAuditInitialBackoff `json:"initial-backoff,omitempty" validate:"omitempty,gte=1,lte=10"`
}

type SKSAuditBearerToken string

// Kubernetes Audit parameters
type SKSAuditCreate struct {
	BearerToken    SKSAuditBearerToken    `json:"bearer-token" validate:"required,gte=1,lte=2000"`
	Endpoint       SKSAuditEndpoint       `json:"endpoint" validate:"required,gte=1,lte=2000"`
	InitialBackoff SKSAuditInitialBackoff `json:"initial-backoff,omitempty" validate:"omitempty,gte=1,lte=10"`
}

type SKSAuditEndpoint string

type SKSAuditInitialBackoff string

// Kubernetes Audit parameters
type SKSAuditUpdate struct {
	BearerToken SKSAuditBearerToken `json:"bearer-token,omitempty" validate:"omitempty,gte=1,lte=2000"`
	// Enable or Disable Kubernetes Audit
	Enabled        *bool                  `json:"enabled,omitempty"`
	Endpoint       SKSAuditEndpoint       `json:"endpoint,omitempty" validate:"omitempty,gte=1,lte=2000"`
	InitialBackoff SKSAuditInitialBackoff `json:"initial-backoff,omitempty" validate:"omitempty,gte=1,lte=10"`
}

type SKSClusterCni string

const (
	SKSClusterCniCalico SKSClusterCni = "calico"
	SKSClusterCniCilium SKSClusterCni = "cilium"
)

type SKSClusterLevel string

const (
	SKSClusterLevelStarter SKSClusterLevel = "starter"
	SKSClusterLevelPro     SKSClusterLevel = "pro"
)

type SKSClusterState string

const (
	SKSClusterStateRotatingCsiCredentials       SKSClusterState = "rotating-csi-credentials"
	SKSClusterStateRotatingCcmCredentials       SKSClusterState = "rotating-ccm-credentials"
	SKSClusterStateCreating                     SKSClusterState = "creating"
	SKSClusterStateUpgrading                    SKSClusterState = "upgrading"
	SKSClusterStateDeleting                     SKSClusterState = "deleting"
	SKSClusterStateRunning                      SKSClusterState = "running"
	SKSClusterStateSuspending                   SKSClusterState = "suspending"
	SKSClusterStateUpdating                     SKSClusterState = "updating"
	SKSClusterStateError                        SKSClusterState = "error"
	SKSClusterStateRotatingKarpenterCredentials SKSClusterState = "rotating-karpenter-credentials"
	SKSClusterStateResuming                     SKSClusterState = "resuming"
)

// SKS Cluster
type SKSCluster struct {
	// Cluster addons
	Addons []string `json:"addons,omitempty"`
	// Kubernetes Audit parameters
	Audit *SKSAudit `json:"audit,omitempty"`
	// Enable auto upgrade of the control plane to the latest patch version available
	AutoUpgrade *bool `json:"auto-upgrade,omitempty"`
	// Cluster CNI
	Cni SKSClusterCni `json:"cni,omitempty"`
	// Cluster creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Cluster description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Indicates whether to deploy the Kubernetes network proxy.
	EnableKubeProxy *bool `json:"enable-kube-proxy,omitempty"`
	// Indicates whether to add operators certificate authority (CA) as part of trusted CAs for the API server.
	EnableOperatorsCA *bool `json:"enable-operators-ca,omitempty"`
	// Cluster endpoint
	Endpoint string `json:"endpoint,omitempty"`
	// A list of Kubernetes-only Alpha features to enable for API server component
	FeatureGates []string `json:"feature-gates,omitempty"`
	// Cluster ID
	ID     UUID             `json:"id,omitempty"`
	Labels SKSClusterLabels `json:"labels,omitempty"`
	// Cluster level
	Level SKSClusterLevel `json:"level,omitempty"`
	// Cluster name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Cluster Nodepools
	Nodepools []SKSNodepool `json:"nodepools,omitempty"`
	// Cluster state
	State SKSClusterState `json:"state,omitempty"`
	// Control plane Kubernetes version
	Version string `json:"version,omitempty"`
}

type SKSClusterDeprecatedResource struct {
	Group          string `json:"group,omitempty"`
	RemovedRelease string `json:"removed-release,omitempty"`
	Resource       string `json:"resource,omitempty"`
	Subresource    string `json:"subresource,omitempty"`
	Version        string `json:"version,omitempty"`
}

type SKSClusterLabels map[string]string

// SKS cluster reference
type SKSClusterRef struct {
	// SKS cluster ID
	ID UUID `json:"id,omitempty"`
}

// Kubeconfig request for a SKS cluster
type SKSKubeconfigRequest struct {
	// List of roles. The certificate present in the Kubeconfig will have these roles set in the Org field.
	Groups []string `json:"groups" validate:"required"`
	// Validity in seconds of the Kubeconfig user certificate (default: 30 days)
	Ttl int64 `json:"ttl,omitempty" validate:"omitempty,gt=0"`
	// User name in the generated Kubeconfig. The certificate present in the Kubeconfig will also have this name set for the CN field.
	User string `json:"user" validate:"required"`
}

type SKSNodepoolPublicIPAssignment string

const (
	SKSNodepoolPublicIPAssignmentInet4 SKSNodepoolPublicIPAssignment = "inet4"
	SKSNodepoolPublicIPAssignmentDual  SKSNodepoolPublicIPAssignment = "dual"
)

type SKSNodepoolState string

const (
	SKSNodepoolStateRenewingToken SKSNodepoolState = "renewing-token"
	SKSNodepoolStateCreating      SKSNodepoolState = "creating"
	SKSNodepoolStateDeleting      SKSNodepoolState = "deleting"
	SKSNodepoolStateRunning       SKSNodepoolState = "running"
	SKSNodepoolStateScaling       SKSNodepoolState = "scaling"
	SKSNodepoolStateUpdating      SKSNodepoolState = "updating"
	SKSNodepoolStateError         SKSNodepoolState = "error"
)

// SKS Nodepool
type SKSNodepool struct {
	// Nodepool addons
	Addons []string `json:"addons,omitempty"`
	// Nodepool Anti-affinity Groups
	AntiAffinityGroups []AntiAffinityGroup `json:"anti-affinity-groups,omitempty"`
	// Nodepool creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Deploy target reference
	DeployTarget *DeployTarget `json:"deploy-target,omitempty"`
	// Nodepool description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Nodepool instances disk size in GiB
	DiskSize int64 `json:"disk-size,omitempty" validate:"omitempty,gte=20,lte=51200"`
	// Nodepool ID
	ID UUID `json:"id,omitempty"`
	// Target Instance Pool
	InstancePool *InstancePool `json:"instance-pool,omitempty"`
	// The instances created by the Nodepool will be prefixed with this value (default: pool)
	InstancePrefix string `json:"instance-prefix,omitempty" validate:"omitempty,gte=1,lte=30"`
	// Instance type reference
	InstanceType *InstanceType `json:"instance-type,omitempty"`
	// Kubelet image GC options
	KubeletImageGC *KubeletImageGC   `json:"kubelet-image-gc,omitempty"`
	Labels         SKSNodepoolLabels `json:"labels,omitempty"`
	// Nodepool name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Nodepool Private Networks
	PrivateNetworks []PrivateNetwork `json:"private-networks,omitempty"`
	// Nodepool public IP assignment of the Instances:
	// * IPv4 and IPv6 (`dual`) addressing.
	// * IPv4 and IPv6 (`dual`) addressing.
	PublicIPAssignment SKSNodepoolPublicIPAssignment `json:"public-ip-assignment,omitempty"`
	// Nodepool Security Groups
	SecurityGroups []SecurityGroup `json:"security-groups,omitempty"`
	// Number of instances
	Size int64 `json:"size,omitempty" validate:"omitempty,gte=0"`
	// Nodepool state
	State  SKSNodepoolState  `json:"state,omitempty"`
	Taints SKSNodepoolTaints `json:"taints,omitempty"`
	// Template reference
	Template *Template `json:"template,omitempty"`
	// Nodepool version
	Version string `json:"version,omitempty"`
}

type SKSNodepoolLabels map[string]string

type SKSNodepoolTaintEffect string

const (
	SKSNodepoolTaintEffectNoExecute        SKSNodepoolTaintEffect = "NoExecute"
	SKSNodepoolTaintEffectNoSchedule       SKSNodepoolTaintEffect = "NoSchedule"
	SKSNodepoolTaintEffectPreferNoSchedule SKSNodepoolTaintEffect = "PreferNoSchedule"
)

// Nodepool taint
type SKSNodepoolTaint struct {
	// Nodepool taint effect
	Effect SKSNodepoolTaintEffect `json:"effect" validate:"required"`
	// Nodepool taint value
	Value string `json:"value" validate:"required,gte=1,lte=255"`
}

type SKSNodepoolTaints map[string]SKSNodepoolTaint

// SKS Cluster OpenID config map
type SKSOidc struct {
	// OpenID client ID
	ClientID string `json:"client-id" validate:"required,gte=1,lte=255"`
	// JWT claim to use as the user's group
	GroupsClaim string `json:"groups-claim,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Prefix prepended to group claims
	GroupsPrefix string `json:"groups-prefix,omitempty" validate:"omitempty,gte=1,lte=255"`
	// OpenID provider URL
	IssuerURL string `json:"issuer-url" validate:"required,gte=1,lte=255"`
	// A key value map that describes a required claim in the ID Token
	RequiredClaim map[string]string `json:"required-claim,omitempty"`
	// JWT claim to use as the user name
	UsernameClaim string `json:"username-claim,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Prefix prepended to username claims
	UsernamePrefix string `json:"username-prefix,omitempty" validate:"omitempty,gte=1,lte=255"`
}

// Exported snapshot information
type SnapshotExport struct {
	// Exported snapshot disk file MD5 checksum
	Md5sum string `json:"md5sum,omitempty"`
	// Exported snapshot disk file pre-signed URL
	PresignedURL string `json:"presigned-url,omitempty"`
}

type SnapshotState string

const (
	SnapshotStateSnapshotting SnapshotState = "snapshotting"
	SnapshotStateDeleted      SnapshotState = "deleted"
	SnapshotStateExporting    SnapshotState = "exporting"
	SnapshotStateReady        SnapshotState = "ready"
	SnapshotStateDeleting     SnapshotState = "deleting"
	SnapshotStateError        SnapshotState = "error"
	SnapshotStateExported     SnapshotState = "exported"
)

// Snapshot
type Snapshot struct {
	// Indicates whether the snapshot was taken using an application-consistent method
	ApplicationConsistent *bool `json:"application-consistent,omitempty"`
	// Snapshot creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Exported snapshot information
	Export *SnapshotExport `json:"export,omitempty"`
	// Snapshot ID
	ID UUID `json:"id,omitempty"`
	// Instance
	Instance *Instance `json:"instance,omitempty"`
	// Snapshot name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Snapshot size in GiB
	Size int64 `json:"size,omitempty" validate:"omitempty,gte=10,lte=51200"`
	// Snapshot state
	State SnapshotState `json:"state,omitempty"`
}

// Snapshot reference
type SnapshotRef struct {
	// Snapshot ID
	ID UUID `json:"id,omitempty"`
}

// SOS Bucket usage
type SOSBucketUsage struct {
	// SOS Bucket creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// SOS Bucket name
	Name string `json:"name,omitempty"`
	// SOS Bucket size in B
	Size     int64    `json:"size,omitempty" validate:"omitempty,gte=0"`
	ZoneName ZoneName `json:"zone-name,omitempty"`
}

// SSH key
type SSHKey struct {
	// SSH key fingerprint
	Fingerprint string `json:"fingerprint,omitempty"`
	// SSH key name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
}

// SSH key reference
type SSHKeyRef struct {
	// SSH key name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
}

type TemplateBootMode string

const (
	TemplateBootModeLegacy TemplateBootMode = "legacy"
	TemplateBootModeUefi   TemplateBootMode = "uefi"
)

type TemplateVisibility string

const (
	TemplateVisibilityPrivate TemplateVisibility = "private"
	TemplateVisibilityPublic  TemplateVisibility = "public"
)

// Instance template
type Template struct {
	// Template with Qemu Guest Agent installed for application consistent snapshot
	ApplicationConsistentSnapshotEnabled *bool `json:"application-consistent-snapshot-enabled,omitempty"`
	// Boot mode (default: legacy)
	BootMode TemplateBootMode `json:"boot-mode,omitempty"`
	// Template build
	Build string `json:"build,omitempty"`
	// Template MD5 checksum
	Checksum string `json:"checksum,omitempty"`
	// Template creation date
	CreatedAT time.Time `json:"created-at,omitempty"`
	// Template default user
	DefaultUser string `json:"default-user,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Template description
	Description string `json:"description,omitempty" validate:"omitempty,lte=255"`
	// Template family
	Family string `json:"family,omitempty"`
	// Template ID
	ID UUID `json:"id,omitempty"`
	// Template maintainer
	Maintainer string `json:"maintainer,omitempty"`
	// Template name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"`
	// Enable password-based login
	PasswordEnabled *bool `json:"password-enabled,omitempty"`
	// Template size
	Size int64 `json:"size,omitempty" validate:"omitempty,gt=0"`
	// Enable SSH key-based login
	SSHKeyEnabled *bool `json:"ssh-key-enabled,omitempty"`
	// Template source URL
	URL string `json:"url,omitempty"`
	// Template version
	Version string `json:"version,omitempty"`
	// Template visibility
	Visibility TemplateVisibility `json:"visibility,omitempty"`
	// Zones availability
	Zones []ZoneName `json:"zones,omitempty"`
}

// Template reference
type TemplateRef struct {
	// Template ID
	ID UUID `json:"id,omitempty"`
}

// Update AI deployment
type UpdateDeploymentRequest struct {
	// Optional extra inference engine server CLI args
	InferenceEngineParameters []string `json:"inference-engine-parameters,omitempty"`
	// Inference engine version
	InferenceEngineVersion InferenceEngineVersion `json:"inference-engine-version,omitempty"`
	// Deployment name
	Name string `json:"name,omitempty" validate:"omitempty,gte=1"`
}

// User
type User struct {
	// User Email
	Email string `json:"email" validate:"required"`
	// User ID
	ID UUID `json:"id,omitempty"`
	// True if the user has not yet created an Exoscale account
	Pending *bool `json:"pending,omitempty"`
	// IAM Role
	Role *IAMRole `json:"role" validate:"required"`
	// SSO enabled
	Sso *bool `json:"sso,omitempty"`
	// Two Factor Authentication enabled
	TwoFactorAuthentication *bool `json:"two-factor-authentication,omitempty"`
}

// Zone
type Zone struct {
	// Zone API endpoint
	APIEndpoint Endpoint `json:"api-endpoint,omitempty"`
	Name        ZoneName `json:"name,omitempty"`
	// Zone SOS endpoint
	SOSEndpoint Endpoint `json:"sos-endpoint,omitempty"`
}

type ZoneName string

const (
	ZoneNameCHDk2  ZoneName = "ch-dk-2"
	ZoneNameDEMuc1 ZoneName = "de-muc-1"
	ZoneNameCHGva2 ZoneName = "ch-gva-2"
	ZoneNameATVie1 ZoneName = "at-vie-1"
	ZoneNameDEFra1 ZoneName = "de-fra-1"
	ZoneNameBGSof1 ZoneName = "bg-sof-1"
	ZoneNameATVie2 ZoneName = "at-vie-2"
	ZoneNameHrZag1 ZoneName = "hr-zag-1"
)

type InstanceTarget = InstanceRef
type BlockStorageSnapshotTarget = BlockStorageSnapshotRef
type BlockStorageVolumeTarget = BlockStorageVolumeRef
