diff --git a/apis/kubedb/constants.go b/apis/kubedb/constants.go index 0d2aa845b..905940319 100644 --- a/apis/kubedb/constants.go +++ b/apis/kubedb/constants.go @@ -998,15 +998,16 @@ const ( DruidConfigDirRouters = "/opt/druid/conf/druid/cluster/query/router" DruidCConfigDirMySQLMetadata = "/opt/druid/extensions/mysql-metadata-storage" - DruidVolumeOperatorConfig = "operator-config-volume" - DruidVolumeMainConfig = "main-config-volume" - DruidVolumeCustomConfig = "custom-config" - DruidMetadataTLSVolume = "metadata-tls-volume" + DruidVolumeOperatorConfig = "operator-config-volume" + DruidVolumeMainConfig = "main-config-volume" + DruidVolumeCustomConfig = "custom-config" + DruidMetadataTLSVolume = "metadata-tls-volume" + DruidMetadataTLSTempVolume = "metadata-tls-volume-temp" - DruidOperatorConfigDir = "/tmp/config/operator-config" - DruidMainConfigDir = "/opt/druid/conf" - DruidCustomConfigDir = "/tmp/config/custom-config" - DruidMetadataTLSConfigDir = "/tmp/metadata-tls" + DruidOperatorConfigDir = "/tmp/config/operator-config" + DruidMainConfigDir = "/opt/druid/conf" + DruidCustomConfigDir = "/tmp/config/custom-config" + DruidMetadataTLSTempConfigDir = "/tmp/metadata-tls" DruidVolumeCommonConfig = "common-config-volume" DruidCommonConfigFile = "common.runtime.properties" @@ -1032,14 +1033,23 @@ const ( EnvDruidCoordinatorAsOverlord = "DRUID_COORDINATOR_AS_OVERLORD" EnvDruidMetadataTLSEnable = "DRUID_METADATA_TLS_ENABLE" EnvDruidMetadataStorageType = "DRUID_METADATA_STORAGE_TYPE" + EnvDruidKeyStorePassword = "DRUID_KEY_STORE_PASSWORD" - DruidPortCoordinators = 8081 - DruidPortOverlords = 8090 - DruidPortHistoricals = 8083 - DruidPortMiddleManagers = 8091 - DruidPortBrokers = 8082 - DruidPortRouters = 8888 - DruidExporterPort = 9104 + DruidPlainTextPortCoordinators = 8081 + DruidPlainTextPortOverlords = 8090 + DruidPlainTextPortHistoricals = 8083 + DruidPlainTextPortMiddleManagers = 8091 + DruidPlainTextPortBrokers = 8082 + DruidPlainTextPortRouters = 8888 + + DruidTLSPortCoordinators = 8281 + DruidTLSPortOverlords = 8290 + DruidTLSPortHistoricals = 8283 + DruidTLSPortMiddleManagers = 8291 + DruidTLSPortBrokers = 8282 + DruidTLSPortRouters = 9088 + + DruidExporterPort = 9104 DruidMetadataStorageTypePostgres = "Postgres" @@ -1062,24 +1072,49 @@ const ( DruidMetadataStorageConnectorPasswordEnvConfig = "{\"type\": \"environment\", \"variable\": \"DRUID_METADATA_STORAGE_PASSWORD\"}" DruidMetadataStorageCreateTables = "druid.metadata.storage.connector.createTables" + // Druid TLS + DruidKeystorePasswordKey = "keystore_password" + DruidTrustStorePasswordKey = "truststore_password" + DruidKeystoreSecretKey = "keystore-cred" + + DruidEnablePlaintextPort = "druid.enablePlaintextPort" + DruidEnableTLSPort = "druid.enableTlsPort" + DruidKeyStorePath = "druid.server.https.keyStorePath" + DruidKeyStoreType = "druid.server.https.keyStoreType" + DruidCertAlias = "druid.server.https.certAlias" + DruidKeyStorePassword = "druid.server.https.keyStorePassword" + DruidRequireClientCertificate = "druid.server.https.requireClientCertificate" + DruidTrustStoreType = "druid.server.https.trustStoreType" + + DruidTrustStorePassword = "druid.client.https.trustStorePassword" + DruidTrustStorePath = "druid.client.https.trustStorePath" + DruidClientTrustStoreType = "druid.client.https.trustStoreType" + DruidClientValidateHostNames = "druid.client.https.validateHostnames" + + DruidKeyStoreTypeJKS = "jks" + DruidKeyStorePasswordEnvConfig = "{\"type\": \"environment\", \"variable\": \"DRUID_KEY_STORE_PASSWORD\"}" + + DruidValueTrue = "true" + DruidValueFalse = "false" + + DruidCertDir = "/opt/druid/ssl" + DruidCertMetadataSubDir = "metadata" + // MySQL TLS DruidMetadataMySQLUseSSL = "druid.metadata.mysql.ssl.useSSL" DruidMetadataMySQLClientCertKeyStoreURL = "druid.metadata.mysql.ssl.clientCertificateKeyStoreUrl" - DruidMetadataMySQLClientCertKeyStorePath = "/opt/druid/conf/tls/metadatakeystore.jks" DruidMetadataMySQLClientCertKeyStoreType = "druid.metadata.mysql.ssl.clientCertificateKeyStoreType" DruidMetadataMySQLClientCertKeyStoreTypeJKS = "JKS" DruidMetadataMySQLClientCertKeyStorePassword = "druid.metadata.mysql.ssl.clientCertificateKeyStorePassword" DruidMetadataMySQLClientCertKeyStorePasswordValue = "password" // Postgres TLS - DruidMetadataPostgresUseSSL = "druid.metadata.postgres.ssl.useSSL" - DruidMetadataPGUseSSLMode = "druid.metadata.postgres.ssl.sslMode" - DruidMetadataPGSSLCert = "druid.metadata.postgres.ssl.sslCert" - DruidMetadataPGSSLCertPath = "/opt/druid/conf/tls/tls.crt" - DruidMetadataPGSSLKey = "druid.metadata.postgres.ssl.sslKey" - DruidMetadataPGSSLKeyPath = "/opt/druid/conf/tls/tls.key" - DruidMetadataPGSSLRootCert = "druid.metadata.postgres.ssl.sslRootCert" - DruidMetadataPGSSLRootCertPath = "/opt/druid/conf/tls/ca.cert" + DruidMetadataPostgresUseSSL = "druid.metadata.postgres.ssl.useSSL" + DruidMetadataPGUseSSLMode = "druid.metadata.postgres.ssl.sslMode" + DruidMetadataPGUseSSLModeVerifyFull = "verify-full" + DruidMetadataPGSSLCert = "druid.metadata.postgres.ssl.sslCert" + DruidMetadataPGSSLKey = "druid.metadata.postgres.ssl.sslKey" + DruidMetadataPGSSLRootCert = "druid.metadata.postgres.ssl.sslRootCert" // Deep Storage DruidDeepStorageTypeKey = "druid.storage.type" @@ -1134,6 +1169,7 @@ const ( DruidExtensionBasicSecurity = "druid-basic-security" DruidExtensionMultiStageQuery = "druid-multi-stage-query" DruidExtensionPrometheusEmitter = "prometheus-emitter" + DruidExtensionSSLContext = "simple-client-sslcontext" DruidService = "druid.service" // Monitoring Configurations @@ -1154,6 +1190,9 @@ const ( DruidMonitoringTaskCountStatsMonitor = "org.apache.druid.server.metrics.TaskCountStatsMonitor" DruidMonitoringSysMonitor = "org.apache.druid.java.util.metrics.SysMonitor" + DruidDimensionMapDir = "/opt/druid/conf/metrics.json" + DruidEmitterPrometheusStrategyValue = "exporter" + /// Coordinators Configurations DruidCoordinatorStartDelay = "druid.coordinator.startDelay" DruidCoordinatorPeriod = "druid.coordinator.period" diff --git a/apis/kubedb/v1alpha2/druid_helpers.go b/apis/kubedb/v1alpha2/druid_helpers.go index 45fd8c665..79875da3b 100644 --- a/apis/kubedb/v1alpha2/druid_helpers.go +++ b/apis/kubedb/v1alpha2/druid_helpers.go @@ -19,6 +19,7 @@ package v1alpha2 import ( "context" "fmt" + "path/filepath" "strconv" "strings" @@ -125,14 +126,18 @@ func (d *Druid) ServiceLabels(alias ServiceAlias, extraLabels ...map[string]stri return d.offShootLabels(meta_util.OverwriteKeys(d.OffShootSelectors(), extraLabels...), svcTemplate.Labels) } -func (r *Druid) Finalizer() string { - return fmt.Sprintf("%s/%s", apis.Finalizer, r.ResourceSingular()) +func (d *Druid) Finalizer() string { + return fmt.Sprintf("%s/%s", apis.Finalizer, d.ResourceSingular()) } func (d *Druid) DefaultUserCredSecretName(username string) string { return meta_util.NameWithSuffix(d.Name, strings.ReplaceAll(fmt.Sprintf("%s-cred", username), "_", "-")) } +func (d *Druid) DruidSecretName(suffix string) string { + return strings.Join([]string{d.Name, suffix}, "-") +} + type DruidStatsService struct { *Druid } @@ -204,21 +209,23 @@ func (d *Druid) PodControllerLabels(nodeType DruidNodeRoleType, extraLabels ...m } func (d *Druid) GetNodeSpec(nodeType DruidNodeRoleType) (*DruidNode, *DruidDataNode) { - if nodeType == DruidNodeRoleCoordinators { + switch nodeType { + case DruidNodeRoleCoordinators: return d.Spec.Topology.Coordinators, nil - } else if nodeType == DruidNodeRoleOverlords { + case DruidNodeRoleOverlords: return d.Spec.Topology.Overlords, nil - } else if nodeType == DruidNodeRoleMiddleManagers { + case DruidNodeRoleMiddleManagers: return nil, d.Spec.Topology.MiddleManagers - } else if nodeType == DruidNodeRoleHistoricals { + case DruidNodeRoleHistoricals: return nil, d.Spec.Topology.Historicals - } else if nodeType == DruidNodeRoleBrokers { + case DruidNodeRoleBrokers: return d.Spec.Topology.Brokers, nil - } else if nodeType == DruidNodeRoleRouters { + case DruidNodeRoleRouters: return d.Spec.Topology.Routers, nil + default: + klog.Errorf("unknown druid node role %s\n", nodeType) + return nil, nil } - - panic("Node role name does not match any known types") } func (d *Druid) ServiceAccountName() string { @@ -235,19 +242,42 @@ func (d *Druid) DruidNodeRoleStringSingular(nodeRole DruidNodeRoleType) string { } func (d *Druid) DruidNodeContainerPort(nodeRole DruidNodeRoleType) int32 { - if nodeRole == DruidNodeRoleCoordinators { - return kubedb.DruidPortCoordinators - } else if nodeRole == DruidNodeRoleOverlords { - return kubedb.DruidPortOverlords - } else if nodeRole == DruidNodeRoleMiddleManagers { - return kubedb.DruidPortMiddleManagers - } else if nodeRole == DruidNodeRoleHistoricals { - return kubedb.DruidPortHistoricals - } else if nodeRole == DruidNodeRoleBrokers { - return kubedb.DruidPortBrokers + if !d.Spec.EnableSSL { + switch nodeRole { + case DruidNodeRoleCoordinators: + return kubedb.DruidPlainTextPortCoordinators + case DruidNodeRoleOverlords: + return kubedb.DruidPlainTextPortOverlords + case DruidNodeRoleMiddleManagers: + return kubedb.DruidPlainTextPortMiddleManagers + case DruidNodeRoleHistoricals: + return kubedb.DruidPlainTextPortHistoricals + case DruidNodeRoleBrokers: + return kubedb.DruidPlainTextPortBrokers + case DruidNodeRoleRouters: + return kubedb.DruidPlainTextPortRouters + default: + klog.Errorf("unknown druid node role %s\n", nodeRole) + } + } else { + switch nodeRole { + case DruidNodeRoleCoordinators: + return kubedb.DruidTLSPortCoordinators + case DruidNodeRoleOverlords: + return kubedb.DruidTLSPortOverlords + case DruidNodeRoleMiddleManagers: + return kubedb.DruidTLSPortMiddleManagers + case DruidNodeRoleHistoricals: + return kubedb.DruidTLSPortHistoricals + case DruidNodeRoleBrokers: + return kubedb.DruidTLSPortBrokers + case DruidNodeRoleRouters: + return kubedb.DruidTLSPortRouters + default: + klog.Errorf("unknown node role %s\n", nodeRole) + } } - // Routers - return kubedb.DruidPortRouters + return -1 } func (d *Druid) SetHealthCheckerDefaults() { @@ -320,7 +350,8 @@ func (d *Druid) GetMetadataStorageType(metadataStorage string) DruidMetadataStor metadataStorage == kubedb.DruidMetadataStorageTypePostgres || metadataStorage == strings.ToLower(string(kubedb.DruidMetadataStorageTypePostgres)) { return DruidMetadataStoragePostgreSQL } else { - panic(fmt.Sprintf("Unknown metadata storage type: %s", metadataStorage)) + klog.Errorf("Unknown metadata storage type: %s", metadataStorage) + return "" } } @@ -365,13 +396,30 @@ func (d *Druid) OffshootSelectors(extraSelectors ...map[string]string) map[strin return meta_util.OverwriteKeys(selector, extraSelectors...) } -func (d Druid) OffshootLabels() map[string]string { +func (d *Druid) OffshootLabels() map[string]string { return d.offshootLabels(d.OffshootSelectors(), nil) } -func (e Druid) offshootLabels(selector, override map[string]string) map[string]string { +func (d *Druid) offshootLabels(selector, override map[string]string) map[string]string { selector[meta_util.ComponentLabelKey] = kubedb.ComponentDatabase - return meta_util.FilterKeys(kubedb.GroupName, selector, meta_util.OverwriteKeys(nil, e.Labels, override)) + return meta_util.FilterKeys(kubedb.GroupName, selector, meta_util.OverwriteKeys(nil, d.Labels, override)) +} + +// CertificateName returns the default certificate name and/or certificate secret name for a certificate alias +func (d *Druid) CertificateName(alias DruidCertificateAlias) string { + return meta_util.NameWithSuffix(d.Name, fmt.Sprintf("%s-cert", string(alias))) +} + +// GetCertSecretName returns the secret name for a certificate alias if any, +// otherwise returns default certificate secret name for the given alias. +func (d *Druid) GetCertSecretName(alias DruidCertificateAlias) string { + if d.Spec.TLS != nil { + name, ok := kmapi.GetCertificateSecretName(d.Spec.TLS.Certificates, string(alias)) + if ok { + return name + } + } + return d.CertificateName(alias) } func (d *Druid) SetDefaults() { @@ -379,11 +427,7 @@ func (d *Druid) SetDefaults() { d.Spec.DeletionPolicy = TerminationPolicyDelete } - if d.Spec.DisableSecurity == nil { - d.Spec.DisableSecurity = pointer.BoolP(false) - } - - if !*d.Spec.DisableSecurity { + if !d.Spec.DisableSecurity { if d.Spec.AuthSecret == nil { d.Spec.AuthSecret = &v1.LocalObjectReference{ Name: d.DefaultUserCredSecretName(kubedb.DruidUserAdmin), @@ -391,6 +435,16 @@ func (d *Druid) SetDefaults() { } } + if d.Spec.EnableSSL { + if d.Spec.KeystoreCredSecret == nil { + d.Spec.KeystoreCredSecret = &SecretReference{ + LocalObjectReference: core.LocalObjectReference{ + Name: d.DruidSecretName(kubedb.DruidKeystoreSecretKey), + }, + } + } + } + var druidVersion catalog.DruidVersion err := DefaultClient.Get(context.TODO(), types.NamespacedName{ Name: d.Spec.Version, @@ -523,6 +577,18 @@ func (d *Druid) SetDefaults() { } d.Spec.Monitor.SetDefaults() } + + if d.Spec.EnableSSL { + d.SetTLSDefaults() + } +} + +func (d *Druid) SetTLSDefaults() { + if d.Spec.TLS == nil || d.Spec.TLS.IssuerRef == nil { + return + } + d.Spec.TLS.Certificates = kmapi.SetMissingSecretNameForCertificate(d.Spec.TLS.Certificates, string(DruidServerCert), d.CertificateName(DruidServerCert)) + d.Spec.TLS.Certificates = kmapi.SetMissingSecretNameForCertificate(d.Spec.TLS.Certificates, string(DruidClientCert), d.CertificateName(DruidClientCert)) } func (d *Druid) SetDefaultsToMetadataStorage() { @@ -725,3 +791,16 @@ func (d *Druid) GetZooKeeperName() string { func (d *Druid) GetInitConfigMapName() string { return d.OffShootName() + "-init-script" } + +// CertSecretVolumeName returns the CertSecretVolumeName +// Values will be like: client-certs, server-certs etc. +func (d *Druid) CertSecretVolumeName(alias DruidCertificateAlias) string { + return string(alias) + "-certs" +} + +// CertSecretVolumeMountPath returns the CertSecretVolumeMountPath +// if configDir is "/var/druid/ssl", +// mountPath will be, "/var/druid/ssl/". +func (d *Druid) CertSecretVolumeMountPath(configDir string, cert string) string { + return filepath.Join(configDir, cert) +} diff --git a/apis/kubedb/v1alpha2/druid_types.go b/apis/kubedb/v1alpha2/druid_types.go index ef34f62ef..524ea9b82 100644 --- a/apis/kubedb/v1alpha2/druid_types.go +++ b/apis/kubedb/v1alpha2/druid_types.go @@ -64,7 +64,7 @@ type DruidSpec struct { // disable security. It disables authentication security of user. // If unset, default is false // +optional - DisableSecurity *bool `json:"disableSecurity,omitempty"` + DisableSecurity bool `json:"disableSecurity,omitempty"` // Database authentication secret // +optional @@ -79,9 +79,16 @@ type DruidSpec struct { // +optional ConfigSecret *core.LocalObjectReference `json:"configSecret,omitempty"` - //// TLS contains tls configurations - //// +optional - //TLS *kmapi.TLSConfig `json:"tls,omitempty"` + // To enable ssl for http layer + EnableSSL bool `json:"enableSSL,omitempty"` + + // Keystore encryption secret + // +optional + KeystoreCredSecret *SecretReference `json:"keystoreCredSecret,omitempty"` + + // TLS contains tls configurations + // +optional + TLS *kmapi.TLSConfig `json:"tls,omitempty"` // MetadataStorage contains information for Druid to connect to external dependency metadata storage // +optional @@ -274,3 +281,11 @@ const ( DruidDeepStorageAzure DruidDeepStorageType = "azure" DruidDeepStorageHDFS DruidDeepStorageType = "hdfs" ) + +// +kubebuilder:validation:Enum=server;client +type DruidCertificateAlias string + +const ( + DruidServerCert DruidCertificateAlias = "server" + DruidClientCert DruidCertificateAlias = "client" +) diff --git a/apis/kubedb/v1alpha2/openapi_generated.go b/apis/kubedb/v1alpha2/openapi_generated.go index 9df83d306..a19ba2620 100644 --- a/apis/kubedb/v1alpha2/openapi_generated.go +++ b/apis/kubedb/v1alpha2/openapi_generated.go @@ -26943,6 +26943,25 @@ func schema_apimachinery_apis_kubedb_v1alpha2_DruidSpec(ref common.ReferenceCall Ref: ref("k8s.io/api/core/v1.LocalObjectReference"), }, }, + "enableSSL": { + SchemaProps: spec.SchemaProps{ + Description: "To enable ssl for http layer", + Type: []string{"boolean"}, + Format: "", + }, + }, + "keystoreCredSecret": { + SchemaProps: spec.SchemaProps{ + Description: "Keystore encryption secret", + Ref: ref("kubedb.dev/apimachinery/apis/kubedb/v1alpha2.SecretReference"), + }, + }, + "tls": { + SchemaProps: spec.SchemaProps{ + Description: "TLS contains tls configurations", + Ref: ref("kmodules.xyz/client-go/api/v1.TLSConfig"), + }, + }, "metadataStorage": { SchemaProps: spec.SchemaProps{ Description: "MetadataStorage contains information for Druid to connect to external dependency metadata storage", @@ -27007,7 +27026,7 @@ func schema_apimachinery_apis_kubedb_v1alpha2_DruidSpec(ref common.ReferenceCall }, }, Dependencies: []string{ - "k8s.io/api/core/v1.LocalObjectReference", "kmodules.xyz/client-go/api/v1.HealthCheckSpec", "kmodules.xyz/monitoring-agent-api/api/v1.AgentSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DeepStorageSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidClusterTopology", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.InitSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.MetadataStorage", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.NamedServiceTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ZookeeperRef"}, + "k8s.io/api/core/v1.LocalObjectReference", "kmodules.xyz/client-go/api/v1.HealthCheckSpec", "kmodules.xyz/client-go/api/v1.TLSConfig", "kmodules.xyz/monitoring-agent-api/api/v1.AgentSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DeepStorageSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidClusterTopology", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.InitSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.MetadataStorage", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.NamedServiceTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.SecretReference", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ZookeeperRef"}, } } diff --git a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go index d45c76b78..c7ebf79b4 100644 --- a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go +++ b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go @@ -989,11 +989,6 @@ func (in *DruidSpec) DeepCopyInto(out *DruidSpec) { *out = new(DruidClusterTopology) (*in).DeepCopyInto(*out) } - if in.DisableSecurity != nil { - in, out := &in.DisableSecurity, &out.DisableSecurity - *out = new(bool) - **out = **in - } if in.AuthSecret != nil { in, out := &in.AuthSecret, &out.AuthSecret *out = new(corev1.LocalObjectReference) @@ -1009,6 +1004,16 @@ func (in *DruidSpec) DeepCopyInto(out *DruidSpec) { *out = new(corev1.LocalObjectReference) **out = **in } + if in.KeystoreCredSecret != nil { + in, out := &in.KeystoreCredSecret, &out.KeystoreCredSecret + *out = new(SecretReference) + **out = **in + } + if in.TLS != nil { + in, out := &in.TLS, &out.TLS + *out = new(apiv1.TLSConfig) + (*in).DeepCopyInto(*out) + } if in.MetadataStorage != nil { in, out := &in.MetadataStorage, &out.MetadataStorage *out = new(MetadataStorage) diff --git a/apis/ops/v1alpha1/constant.go b/apis/ops/v1alpha1/constant.go index da9b164d2..071b961f4 100644 --- a/apis/ops/v1alpha1/constant.go +++ b/apis/ops/v1alpha1/constant.go @@ -309,6 +309,20 @@ const ( // Druid Constants const ( + ScaleUpCoordinators = "ScaleUpCoordinators" + ScaleUpOverlords = "ScaleUpOverlords" + ScaleUpBrokers = "ScaleUpBrokers" + ScaleUpHistoricals = "ScaleUpHistoricals" + ScaleUpMiddleManagers = "ScaleUpMiddleManagers" + ScaleUpRouters = "ScaleUpRouters" + + ScaleDownCoordinators = "ScaleDownCoordinators" + ScaleDownOverlords = "ScaleDownOverlords" + ScaleDownBrokers = "ScaleDownBrokers" + ScaleDownHistoricals = "ScaleDownHistoricals" + ScaleDownMiddleManagers = "ScaleDownMiddleManagers" + ScaleDownRouters = "ScaleDownRouters" + UpdateMiddleManagersNodePVCs = "UpdateMiddleManagersNodePVCs" UpdateHistoricalsNodePVCs = "UpdateHistoricalsNodePVCs" ) diff --git a/apis/ops/v1alpha1/druid_ops_types.go b/apis/ops/v1alpha1/druid_ops_types.go index 0c32106c8..790a078d7 100644 --- a/apis/ops/v1alpha1/druid_ops_types.go +++ b/apis/ops/v1alpha1/druid_ops_types.go @@ -55,12 +55,20 @@ type DruidOpsRequestSpec struct { DatabaseRef core.LocalObjectReference `json:"databaseRef"` // Specifies the ops request type: UpdateVersion, HorizontalScaling, VerticalScaling etc. Type DruidOpsRequestType `json:"type"` + // Specifies information necessary for restarting database + Restart *RestartSpec `json:"restart,omitempty"` + // Specifies information necessary for horizontal scaling + HorizontalScaling *DruidHorizontalScalingSpec `json:"horizontalScaling,omitempty"` // Specifies information necessary for vertical scaling VerticalScaling *DruidVerticalScalingSpec `json:"verticalScaling,omitempty"` // Specifies information necessary for volume expansion VolumeExpansion *DruidVolumeExpansionSpec `json:"volumeExpansion,omitempty"` - // Specifies information necessary for restarting database - Restart *RestartSpec `json:"restart,omitempty"` + // Specifies information necessary for upgrading Druid + UpdateVersion *DruidUpdateVersionSpec `json:"updateVersion,omitempty"` + // Specifies information necessary for custom configuration of Druid + Configuration *DruidCustomConfigurationSpec `json:"configuration,omitempty"` + // Specifies information necessary for configuring TLS + TLS *TLSSpec `json:"tls,omitempty"` // Timeout for each step of the ops request in second. If a step doesn't finish within the specified timeout, the ops request will result in failure. Timeout *metav1.Duration `json:"timeout,omitempty"` // ApplyOption is to control the execution of OpsRequest depending on the database state. @@ -68,8 +76,8 @@ type DruidOpsRequestSpec struct { Apply ApplyOption `json:"apply,omitempty"` } -// +kubebuilder:validation:Enum=VerticalScaling;VolumeExpansion;Restart -// ENUM(VerticalScaling, VolumeExpansion, Restart) +// +kubebuilder:validation:Enum=UpdateVersion;HorizontalScaling;VerticalScaling;VolumeExpansion;Restart;Reconfigure;ReconfigureTLS +// ENUM(UpdateVersion, HorizontalScaling, VerticalScaling, VolumeExpansion, Restart, Reconfigure, ReconfigureTLS) type DruidOpsRequestType string // DruidVerticalScalingSpec contains the vertical scaling information of a Druid cluster @@ -82,6 +90,28 @@ type DruidVerticalScalingSpec struct { Routers *PodResources `json:"routers,omitempty"` } +// DruidHorizontalScalingSpec contains the horizontal scaling information of a Druid cluster +type DruidHorizontalScalingSpec struct { + // Node topology specification + Topology *DruidHorizontalScalingTopologySpec `json:"topology,omitempty"` +} + +// DruidHorizontalScalingTopologySpec contains the horizontal scaling information in cluster topology mode +type DruidHorizontalScalingTopologySpec struct { + // Number of coordinator nodes + Coordinators *int32 `json:"coordinators,omitempty"` + // Number of overlords nodes + Overlords *int32 `json:"overlords,omitempty"` + // Number of middleManagers nodes + MiddleManagers *int32 `json:"middleManagers,omitempty"` + // Number of historicals nodes + Historicals *int32 `json:"historicals,omitempty"` + // Number of brokers nodes + Brokers *int32 `json:"brokers,omitempty"` + // Number of routers nodes + Routers *int32 `json:"routers,omitempty"` +} + // DruidVolumeExpansionSpec is the spec for Druid volume expansion type DruidVolumeExpansionSpec struct { Mode VolumeExpansionMode `json:"mode"` @@ -91,6 +121,35 @@ type DruidVolumeExpansionSpec struct { Historicals *resource.Quantity `json:"historicals,omitempty"` } +// DruidUpdateVersionSpec contains the update version information of a druid cluster +type DruidUpdateVersionSpec struct { + // Specifies the target version name from catalog + TargetVersion string `json:"targetVersion,omitempty"` +} + +// DruidCustomConfigurationSpec is the spec for Reconfiguring the Druid Settings +type DruidCustomConfigurationSpec struct { + // ConfigSecret is an optional field to provide custom configuration file for database. + // +optional + ConfigSecret *core.LocalObjectReference `json:"configSecret,omitempty"` + // ApplyConfig is an optional field to provide Druid configuration. + // Provided configuration will be applied to config files stored in ConfigSecret. + // If the ConfigSecret is missing, the operator will create a new k8s secret by the + // following naming convention: {db-name}-user-config . + // Expected input format: + // applyConfig: + // file-name.properties: | + // key=value + // server.properties: | + // log.retention.ms=10000 + // +optional + ApplyConfig map[string]string `json:"applyConfig,omitempty"` + // If set to "true", the user provided configuration will be removed. + // The Druid cluster will start will default configuration that is generated by the operator. + // +optional + RemoveCustomConfig bool `json:"removeCustomConfig,omitempty"` +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // DruidOpsRequestList is a list of DruidOpsRequests diff --git a/apis/ops/v1alpha1/druid_ops_types_enum.go b/apis/ops/v1alpha1/druid_ops_types_enum.go index 6db24eb7a..5ba65b4b4 100644 --- a/apis/ops/v1alpha1/druid_ops_types_enum.go +++ b/apis/ops/v1alpha1/druid_ops_types_enum.go @@ -12,20 +12,32 @@ import ( ) const ( + // DruidOpsRequestTypeUpdateVersion is a DruidOpsRequestType of type UpdateVersion. + DruidOpsRequestTypeUpdateVersion DruidOpsRequestType = "UpdateVersion" + // DruidOpsRequestTypeHorizontalScaling is a DruidOpsRequestType of type HorizontalScaling. + DruidOpsRequestTypeHorizontalScaling DruidOpsRequestType = "HorizontalScaling" // DruidOpsRequestTypeVerticalScaling is a DruidOpsRequestType of type VerticalScaling. DruidOpsRequestTypeVerticalScaling DruidOpsRequestType = "VerticalScaling" // DruidOpsRequestTypeVolumeExpansion is a DruidOpsRequestType of type VolumeExpansion. DruidOpsRequestTypeVolumeExpansion DruidOpsRequestType = "VolumeExpansion" // DruidOpsRequestTypeRestart is a DruidOpsRequestType of type Restart. DruidOpsRequestTypeRestart DruidOpsRequestType = "Restart" + // DruidOpsRequestTypeReconfigure is a DruidOpsRequestType of type Reconfigure. + DruidOpsRequestTypeReconfigure DruidOpsRequestType = "Reconfigure" + // DruidOpsRequestTypeReconfigureTLS is a DruidOpsRequestType of type ReconfigureTLS. + DruidOpsRequestTypeReconfigureTLS DruidOpsRequestType = "ReconfigureTLS" ) var ErrInvalidDruidOpsRequestType = fmt.Errorf("not a valid DruidOpsRequestType, try [%s]", strings.Join(_DruidOpsRequestTypeNames, ", ")) var _DruidOpsRequestTypeNames = []string{ + string(DruidOpsRequestTypeUpdateVersion), + string(DruidOpsRequestTypeHorizontalScaling), string(DruidOpsRequestTypeVerticalScaling), string(DruidOpsRequestTypeVolumeExpansion), string(DruidOpsRequestTypeRestart), + string(DruidOpsRequestTypeReconfigure), + string(DruidOpsRequestTypeReconfigureTLS), } // DruidOpsRequestTypeNames returns a list of possible string values of DruidOpsRequestType. @@ -38,9 +50,13 @@ func DruidOpsRequestTypeNames() []string { // DruidOpsRequestTypeValues returns a list of the values for DruidOpsRequestType func DruidOpsRequestTypeValues() []DruidOpsRequestType { return []DruidOpsRequestType{ + DruidOpsRequestTypeUpdateVersion, + DruidOpsRequestTypeHorizontalScaling, DruidOpsRequestTypeVerticalScaling, DruidOpsRequestTypeVolumeExpansion, DruidOpsRequestTypeRestart, + DruidOpsRequestTypeReconfigure, + DruidOpsRequestTypeReconfigureTLS, } } @@ -57,9 +73,13 @@ func (x DruidOpsRequestType) IsValid() bool { } var _DruidOpsRequestTypeValue = map[string]DruidOpsRequestType{ - "VerticalScaling": DruidOpsRequestTypeVerticalScaling, - "VolumeExpansion": DruidOpsRequestTypeVolumeExpansion, - "Restart": DruidOpsRequestTypeRestart, + "UpdateVersion": DruidOpsRequestTypeUpdateVersion, + "HorizontalScaling": DruidOpsRequestTypeHorizontalScaling, + "VerticalScaling": DruidOpsRequestTypeVerticalScaling, + "VolumeExpansion": DruidOpsRequestTypeVolumeExpansion, + "Restart": DruidOpsRequestTypeRestart, + "Reconfigure": DruidOpsRequestTypeReconfigure, + "ReconfigureTLS": DruidOpsRequestTypeReconfigureTLS, } // ParseDruidOpsRequestType attempts to convert a string to a DruidOpsRequestType. diff --git a/apis/ops/v1alpha1/openapi_generated.go b/apis/ops/v1alpha1/openapi_generated.go index 883636bd6..75b67ff7d 100644 --- a/apis/ops/v1alpha1/openapi_generated.go +++ b/apis/ops/v1alpha1/openapi_generated.go @@ -497,9 +497,13 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "kubedb.dev/apimachinery/apis/ops/v1alpha1.ClickHouseOpsRequestSpec": schema_apimachinery_apis_ops_v1alpha1_ClickHouseOpsRequestSpec(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.ConfigNode": schema_apimachinery_apis_ops_v1alpha1_ConfigNode(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.ContainerResources": schema_apimachinery_apis_ops_v1alpha1_ContainerResources(ref), + "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidCustomConfigurationSpec": schema_apimachinery_apis_ops_v1alpha1_DruidCustomConfigurationSpec(ref), + "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidHorizontalScalingSpec": schema_apimachinery_apis_ops_v1alpha1_DruidHorizontalScalingSpec(ref), + "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidHorizontalScalingTopologySpec": schema_apimachinery_apis_ops_v1alpha1_DruidHorizontalScalingTopologySpec(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidOpsRequest": schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequest(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidOpsRequestList": schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequestList(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidOpsRequestSpec": schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequestSpec(ref), + "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidUpdateVersionSpec": schema_apimachinery_apis_ops_v1alpha1_DruidUpdateVersionSpec(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVerticalScalingSpec": schema_apimachinery_apis_ops_v1alpha1_DruidVerticalScalingSpec(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVolumeExpansionSpec": schema_apimachinery_apis_ops_v1alpha1_DruidVolumeExpansionSpec(ref), "kubedb.dev/apimachinery/apis/ops/v1alpha1.ElasticsearchCustomConfiguration": schema_apimachinery_apis_ops_v1alpha1_ElasticsearchCustomConfiguration(ref), @@ -25721,6 +25725,126 @@ func schema_apimachinery_apis_ops_v1alpha1_ContainerResources(ref common.Referen } } +func schema_apimachinery_apis_ops_v1alpha1_DruidCustomConfigurationSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DruidCustomConfigurationSpec is the spec for Reconfiguring the Druid Settings", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "configSecret": { + SchemaProps: spec.SchemaProps{ + Description: "ConfigSecret is an optional field to provide custom configuration file for database.", + Ref: ref("k8s.io/api/core/v1.LocalObjectReference"), + }, + }, + "applyConfig": { + SchemaProps: spec.SchemaProps{ + Description: "ApplyConfig is an optional field to provide Druid configuration. Provided configuration will be applied to config files stored in ConfigSecret. If the ConfigSecret is missing, the operator will create a new k8s secret by the following naming convention: {db-name}-user-config . Expected input format:\n\tapplyConfig:\n\t\tfile-name.properties: |\n\t\t\tkey=value\n\t\tserver.properties: |\n\t\t\tlog.retention.ms=10000", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "removeCustomConfig": { + SchemaProps: spec.SchemaProps{ + Description: "If set to \"true\", the user provided configuration will be removed. The Druid cluster will start will default configuration that is generated by the operator.", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.LocalObjectReference"}, + } +} + +func schema_apimachinery_apis_ops_v1alpha1_DruidHorizontalScalingSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DruidHorizontalScalingSpec contains the horizontal scaling information of a Druid cluster", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "topology": { + SchemaProps: spec.SchemaProps{ + Description: "Node topology specification", + Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidHorizontalScalingTopologySpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidHorizontalScalingTopologySpec"}, + } +} + +func schema_apimachinery_apis_ops_v1alpha1_DruidHorizontalScalingTopologySpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DruidHorizontalScalingTopologySpec contains the horizontal scaling information in cluster topology mode", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "coordinators": { + SchemaProps: spec.SchemaProps{ + Description: "Number of coordinator nodes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "overlords": { + SchemaProps: spec.SchemaProps{ + Description: "Number of overlords nodes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "middleManagers": { + SchemaProps: spec.SchemaProps{ + Description: "Number of middleManagers nodes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "historicals": { + SchemaProps: spec.SchemaProps{ + Description: "Number of historicals nodes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "brokers": { + SchemaProps: spec.SchemaProps{ + Description: "Number of brokers nodes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "routers": { + SchemaProps: spec.SchemaProps{ + Description: "Number of routers nodes", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + func schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequest(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -25838,6 +25962,18 @@ func schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequestSpec(ref common.Refere Format: "", }, }, + "restart": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies information necessary for restarting database", + Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.RestartSpec"), + }, + }, + "horizontalScaling": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies information necessary for horizontal scaling", + Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidHorizontalScalingSpec"), + }, + }, "verticalScaling": { SchemaProps: spec.SchemaProps{ Description: "Specifies information necessary for vertical scaling", @@ -25850,10 +25986,22 @@ func schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequestSpec(ref common.Refere Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVolumeExpansionSpec"), }, }, - "restart": { + "updateVersion": { SchemaProps: spec.SchemaProps{ - Description: "Specifies information necessary for restarting database", - Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.RestartSpec"), + Description: "Specifies information necessary for upgrading Druid", + Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidUpdateVersionSpec"), + }, + }, + "configuration": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies information necessary for custom configuration of Druid", + Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidCustomConfigurationSpec"), + }, + }, + "tls": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies information necessary for configuring TLS", + Ref: ref("kubedb.dev/apimachinery/apis/ops/v1alpha1.TLSSpec"), }, }, "timeout": { @@ -25874,7 +26022,27 @@ func schema_apimachinery_apis_ops_v1alpha1_DruidOpsRequestSpec(ref common.Refere }, }, Dependencies: []string{ - "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVerticalScalingSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVolumeExpansionSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.RestartSpec"}, + "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidCustomConfigurationSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidHorizontalScalingSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidUpdateVersionSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVerticalScalingSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.DruidVolumeExpansionSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.RestartSpec", "kubedb.dev/apimachinery/apis/ops/v1alpha1.TLSSpec"}, + } +} + +func schema_apimachinery_apis_ops_v1alpha1_DruidUpdateVersionSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DruidUpdateVersionSpec contains the update version information of a druid cluster", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "targetVersion": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies the target version name from catalog", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, } } diff --git a/apis/ops/v1alpha1/zz_generated.deepcopy.go b/apis/ops/v1alpha1/zz_generated.deepcopy.go index 5dda4fc0c..5cc8750d7 100644 --- a/apis/ops/v1alpha1/zz_generated.deepcopy.go +++ b/apis/ops/v1alpha1/zz_generated.deepcopy.go @@ -168,6 +168,101 @@ func (in *ContainerResources) DeepCopy() *ContainerResources { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DruidCustomConfigurationSpec) DeepCopyInto(out *DruidCustomConfigurationSpec) { + *out = *in + if in.ConfigSecret != nil { + in, out := &in.ConfigSecret, &out.ConfigSecret + *out = new(corev1.LocalObjectReference) + **out = **in + } + if in.ApplyConfig != nil { + in, out := &in.ApplyConfig, &out.ApplyConfig + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DruidCustomConfigurationSpec. +func (in *DruidCustomConfigurationSpec) DeepCopy() *DruidCustomConfigurationSpec { + if in == nil { + return nil + } + out := new(DruidCustomConfigurationSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DruidHorizontalScalingSpec) DeepCopyInto(out *DruidHorizontalScalingSpec) { + *out = *in + if in.Topology != nil { + in, out := &in.Topology, &out.Topology + *out = new(DruidHorizontalScalingTopologySpec) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DruidHorizontalScalingSpec. +func (in *DruidHorizontalScalingSpec) DeepCopy() *DruidHorizontalScalingSpec { + if in == nil { + return nil + } + out := new(DruidHorizontalScalingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DruidHorizontalScalingTopologySpec) DeepCopyInto(out *DruidHorizontalScalingTopologySpec) { + *out = *in + if in.Coordinators != nil { + in, out := &in.Coordinators, &out.Coordinators + *out = new(int32) + **out = **in + } + if in.Overlords != nil { + in, out := &in.Overlords, &out.Overlords + *out = new(int32) + **out = **in + } + if in.MiddleManagers != nil { + in, out := &in.MiddleManagers, &out.MiddleManagers + *out = new(int32) + **out = **in + } + if in.Historicals != nil { + in, out := &in.Historicals, &out.Historicals + *out = new(int32) + **out = **in + } + if in.Brokers != nil { + in, out := &in.Brokers, &out.Brokers + *out = new(int32) + **out = **in + } + if in.Routers != nil { + in, out := &in.Routers, &out.Routers + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DruidHorizontalScalingTopologySpec. +func (in *DruidHorizontalScalingTopologySpec) DeepCopy() *DruidHorizontalScalingTopologySpec { + if in == nil { + return nil + } + out := new(DruidHorizontalScalingTopologySpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DruidOpsRequest) DeepCopyInto(out *DruidOpsRequest) { *out = *in @@ -233,6 +328,16 @@ func (in *DruidOpsRequestList) DeepCopyObject() runtime.Object { func (in *DruidOpsRequestSpec) DeepCopyInto(out *DruidOpsRequestSpec) { *out = *in out.DatabaseRef = in.DatabaseRef + if in.Restart != nil { + in, out := &in.Restart, &out.Restart + *out = new(RestartSpec) + **out = **in + } + if in.HorizontalScaling != nil { + in, out := &in.HorizontalScaling, &out.HorizontalScaling + *out = new(DruidHorizontalScalingSpec) + (*in).DeepCopyInto(*out) + } if in.VerticalScaling != nil { in, out := &in.VerticalScaling, &out.VerticalScaling *out = new(DruidVerticalScalingSpec) @@ -243,11 +348,21 @@ func (in *DruidOpsRequestSpec) DeepCopyInto(out *DruidOpsRequestSpec) { *out = new(DruidVolumeExpansionSpec) (*in).DeepCopyInto(*out) } - if in.Restart != nil { - in, out := &in.Restart, &out.Restart - *out = new(RestartSpec) + if in.UpdateVersion != nil { + in, out := &in.UpdateVersion, &out.UpdateVersion + *out = new(DruidUpdateVersionSpec) **out = **in } + if in.Configuration != nil { + in, out := &in.Configuration, &out.Configuration + *out = new(DruidCustomConfigurationSpec) + (*in).DeepCopyInto(*out) + } + if in.TLS != nil { + in, out := &in.TLS, &out.TLS + *out = new(TLSSpec) + (*in).DeepCopyInto(*out) + } if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout *out = new(v1.Duration) @@ -266,6 +381,22 @@ func (in *DruidOpsRequestSpec) DeepCopy() *DruidOpsRequestSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DruidUpdateVersionSpec) DeepCopyInto(out *DruidUpdateVersionSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DruidUpdateVersionSpec. +func (in *DruidUpdateVersionSpec) DeepCopy() *DruidUpdateVersionSpec { + if in == nil { + return nil + } + out := new(DruidUpdateVersionSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DruidVerticalScalingSpec) DeepCopyInto(out *DruidVerticalScalingSpec) { *out = *in diff --git a/crds/kubedb.com_druids.yaml b/crds/kubedb.com_druids.yaml index aa763ade6..545ef9d7e 100644 --- a/crds/kubedb.com_druids.yaml +++ b/crds/kubedb.com_druids.yaml @@ -88,6 +88,8 @@ spec: type: string disableSecurity: type: boolean + enableSSL: + type: boolean halted: type: boolean healthChecker: @@ -1117,6 +1119,15 @@ spec: waitForInitialRestore: type: boolean type: object + keystoreCredSecret: + properties: + externallyManaged: + type: boolean + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic metadataStorage: properties: createTables: @@ -1412,6 +1423,107 @@ spec: - alias type: object type: array + tls: + properties: + certificates: + items: + properties: + alias: + type: string + dnsNames: + items: + type: string + type: array + duration: + type: string + emailAddresses: + items: + type: string + type: array + ipAddresses: + items: + type: string + type: array + issuerRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + privateKey: + properties: + encoding: + enum: + - PKCS1 + - PKCS8 + type: string + type: object + renewBefore: + type: string + secretName: + type: string + subject: + properties: + countries: + items: + type: string + type: array + localities: + items: + type: string + type: array + organizationalUnits: + items: + type: string + type: array + organizations: + items: + type: string + type: array + postalCodes: + items: + type: string + type: array + provinces: + items: + type: string + type: array + serialNumber: + type: string + streetAddresses: + items: + type: string + type: array + type: object + uris: + items: + type: string + type: array + required: + - alias + type: object + type: array + issuerRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + type: object topology: properties: brokers: diff --git a/crds/ops.kubedb.com_druidopsrequests.yaml b/crds/ops.kubedb.com_druidopsrequests.yaml index e76cea9f6..2ab0c3258 100644 --- a/crds/ops.kubedb.com_druidopsrequests.yaml +++ b/crds/ops.kubedb.com_druidopsrequests.yaml @@ -48,6 +48,22 @@ spec: - IfReady - Always type: string + configuration: + properties: + applyConfig: + additionalProperties: + type: string + type: object + configSecret: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + removeCustomConfig: + type: boolean + type: object databaseRef: properties: name: @@ -55,16 +71,154 @@ spec: type: string type: object x-kubernetes-map-type: atomic + horizontalScaling: + properties: + topology: + properties: + brokers: + format: int32 + type: integer + coordinators: + format: int32 + type: integer + historicals: + format: int32 + type: integer + middleManagers: + format: int32 + type: integer + overlords: + format: int32 + type: integer + routers: + format: int32 + type: integer + type: object + type: object restart: type: object timeout: type: string + tls: + properties: + certificates: + items: + properties: + alias: + type: string + dnsNames: + items: + type: string + type: array + duration: + type: string + emailAddresses: + items: + type: string + type: array + ipAddresses: + items: + type: string + type: array + issuerRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + privateKey: + properties: + encoding: + enum: + - PKCS1 + - PKCS8 + type: string + type: object + renewBefore: + type: string + secretName: + type: string + subject: + properties: + countries: + items: + type: string + type: array + localities: + items: + type: string + type: array + organizationalUnits: + items: + type: string + type: array + organizations: + items: + type: string + type: array + postalCodes: + items: + type: string + type: array + provinces: + items: + type: string + type: array + serialNumber: + type: string + streetAddresses: + items: + type: string + type: array + type: object + uris: + items: + type: string + type: array + required: + - alias + type: object + type: array + issuerRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + remove: + type: boolean + rotateCertificates: + type: boolean + type: object type: enum: + - UpdateVersion + - HorizontalScaling - VerticalScaling - VolumeExpansion - Restart + - Reconfigure + - ReconfigureTLS type: string + updateVersion: + properties: + targetVersion: + type: string + type: object verticalScaling: properties: brokers: