diff --git a/Makefile b/Makefile index af8825ec1e..39c7e1c917 100644 --- a/Makefile +++ b/Makefile @@ -439,4 +439,4 @@ ci: verify check-license lint build unit-tests #cover .PHONY: clean clean: - rm -rf .go bin + rm -rf .go bin \ No newline at end of file diff --git a/apis/catalog/v1alpha1/hanadb_version_helpers.go b/apis/catalog/v1alpha1/hanadb_version_helpers.go index a72024fbb0..b0866f1d23 100644 --- a/apis/catalog/v1alpha1/hanadb_version_helpers.go +++ b/apis/catalog/v1alpha1/hanadb_version_helpers.go @@ -18,7 +18,6 @@ package v1alpha1 import ( "fmt" - "strings" "kubedb.dev/apimachinery/apis" "kubedb.dev/apimachinery/apis/catalog" @@ -56,11 +55,9 @@ func (h HanaDBVersion) ResourcePlural() string { func (h HanaDBVersion) ValidateSpecs() error { if h.Spec.Version == "" || h.Spec.DB.Image == "" { - fields := []string{ - "spec.version", - "spec.db.image", - } - return fmt.Errorf("atleast one of the following specs is not set for HanaDBVersion %q: %s", h.Name, strings.Join(fields, ", ")) + return fmt.Errorf(`atleast one of the following specs is not set for HanaDBVersion "%v": +spec.version, +spec.db.image,`, h.Name) } return nil } diff --git a/apis/catalog/v1alpha1/hanadb_version_types.go b/apis/catalog/v1alpha1/hanadb_version_types.go index 2397a55f8d..194c782881 100644 --- a/apis/catalog/v1alpha1/hanadb_version_types.go +++ b/apis/catalog/v1alpha1/hanadb_version_types.go @@ -49,13 +49,13 @@ type HanaDBVersion struct { type HanaDBVersionSpec struct { // Version Version string `json:"version"` - - // EndOfLife refers if this version reached into its end of the life or not, based on https://endoflife.date/ - // +optional - EndOfLife bool `json:"endOfLife"` - // Database Image DB HanaDatabase `json:"db"` + // Coordinator Image + // +optional + Coordinator HanaDBCoordinator `json:"coordinator,omitempty"` + // Exporter Image + Exporter HanaDBVersionExporter `json:"exporter"` // Deprecated versions usable but considered as obsolete and best avoided typically superseded Deprecated bool `json:"deprecated,omitempty"` // SecurityContext is for the additional config for the DB container @@ -78,6 +78,16 @@ type HanaDatabase struct { Image string `json:"image"` } +// HanaDBCoordinator is the HanaDB coordinator Container image +type HanaDBCoordinator struct { + Image string `json:"image"` +} + +// HanaDBVersionExporter is the image for the HanaDB exporter +type HanaDBVersionExporter struct { + Image string `json:"image"` +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // HanaDBVersionList is a list of HanaDBVersions diff --git a/apis/catalog/v1alpha1/openapi_generated.go b/apis/catalog/v1alpha1/openapi_generated.go index a5579218da..717e65c29e 100644 --- a/apis/catalog/v1alpha1/openapi_generated.go +++ b/apis/catalog/v1alpha1/openapi_generated.go @@ -568,8 +568,10 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "kubedb.dev/apimachinery/apis/catalog/v1alpha1.FullBackup": schema_apimachinery_apis_catalog_v1alpha1_FullBackup(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.FullBackupRestore": schema_apimachinery_apis_catalog_v1alpha1_FullBackupRestore(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.GitSyncer": schema_apimachinery_apis_catalog_v1alpha1_GitSyncer(ref), + "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBCoordinator": schema_apimachinery_apis_catalog_v1alpha1_HanaDBCoordinator(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBSecurityContext": schema_apimachinery_apis_catalog_v1alpha1_HanaDBSecurityContext(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBVersion": schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersion(ref), + "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBVersionExporter": schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionExporter(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBVersionList": schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionList(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBVersionSpec": schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionSpec(ref), "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDatabase": schema_apimachinery_apis_catalog_v1alpha1_HanaDatabase(ref), @@ -28721,6 +28723,27 @@ func schema_apimachinery_apis_catalog_v1alpha1_GitSyncer(ref common.ReferenceCal } } +func schema_apimachinery_apis_catalog_v1alpha1_HanaDBCoordinator(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "HanaDBCoordinator is the HanaDB coordinator Container image", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "image": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"image"}, + }, + }, + } +} + func schema_apimachinery_apis_catalog_v1alpha1_HanaDBSecurityContext(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -28787,6 +28810,27 @@ func schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersion(ref common.Referenc } } +func schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionExporter(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "HanaDBVersionExporter is the image for the HanaDB exporter", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "image": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"image"}, + }, + }, + } +} + func schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -28850,14 +28894,6 @@ func schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionSpec(ref common.Refe Format: "", }, }, - "endOfLife": { - SchemaProps: spec.SchemaProps{ - Description: "EndOfLife refers if this version reached into its end of the life or not, based on https://endoflife.date/", - Default: false, - Type: []string{"boolean"}, - Format: "", - }, - }, "db": { SchemaProps: spec.SchemaProps{ Description: "Database Image", @@ -28865,6 +28901,20 @@ func schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionSpec(ref common.Refe Ref: ref("kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDatabase"), }, }, + "coordinator": { + SchemaProps: spec.SchemaProps{ + Description: "Coordinator Image", + Default: map[string]interface{}{}, + Ref: ref("kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBCoordinator"), + }, + }, + "exporter": { + SchemaProps: spec.SchemaProps{ + Description: "Exporter Image", + Default: map[string]interface{}{}, + Ref: ref("kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBVersionExporter"), + }, + }, "deprecated": { SchemaProps: spec.SchemaProps{ Description: "Deprecated versions usable but considered as obsolete and best avoided typically superseded", @@ -28900,11 +28950,11 @@ func schema_apimachinery_apis_catalog_v1alpha1_HanaDBVersionSpec(ref common.Refe }, }, }, - Required: []string{"version", "db"}, + Required: []string{"version", "db", "exporter"}, }, }, Dependencies: []string{ - "kubedb.dev/apimachinery/apis/catalog/v1alpha1.ChartInfo", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBSecurityContext", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDatabase", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.UpdateConstraints"}, + "kubedb.dev/apimachinery/apis/catalog/v1alpha1.ChartInfo", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBCoordinator", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBSecurityContext", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDBVersionExporter", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.HanaDatabase", "kubedb.dev/apimachinery/apis/catalog/v1alpha1.UpdateConstraints"}, } } diff --git a/apis/catalog/v1alpha1/zz_generated.deepcopy.go b/apis/catalog/v1alpha1/zz_generated.deepcopy.go index 1663416105..ae7197745c 100644 --- a/apis/catalog/v1alpha1/zz_generated.deepcopy.go +++ b/apis/catalog/v1alpha1/zz_generated.deepcopy.go @@ -1218,6 +1218,22 @@ func (in *GitSyncer) DeepCopy() *GitSyncer { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HanaDBCoordinator) DeepCopyInto(out *HanaDBCoordinator) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HanaDBCoordinator. +func (in *HanaDBCoordinator) DeepCopy() *HanaDBCoordinator { + if in == nil { + return nil + } + out := new(HanaDBCoordinator) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HanaDBSecurityContext) DeepCopyInto(out *HanaDBSecurityContext) { *out = *in @@ -1271,6 +1287,22 @@ func (in *HanaDBVersion) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HanaDBVersionExporter) DeepCopyInto(out *HanaDBVersionExporter) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HanaDBVersionExporter. +func (in *HanaDBVersionExporter) DeepCopy() *HanaDBVersionExporter { + if in == nil { + return nil + } + out := new(HanaDBVersionExporter) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HanaDBVersionList) DeepCopyInto(out *HanaDBVersionList) { *out = *in @@ -1308,6 +1340,8 @@ func (in *HanaDBVersionList) DeepCopyObject() runtime.Object { func (in *HanaDBVersionSpec) DeepCopyInto(out *HanaDBVersionSpec) { *out = *in out.DB = in.DB + out.Coordinator = in.Coordinator + out.Exporter = in.Exporter in.SecurityContext.DeepCopyInto(&out.SecurityContext) if in.UI != nil { in, out := &in.UI, &out.UI diff --git a/apis/kubedb/constants.go b/apis/kubedb/constants.go index 8d21616122..d609079000 100644 --- a/apis/kubedb/constants.go +++ b/apis/kubedb/constants.go @@ -2277,6 +2277,9 @@ const ( HanaDBSystemDBSQLPortName = "systemdb-sql" HanaDBSystemDBSQLPort = 39017 + // Metrics exporter port + HanaDBExporterPort = 9668 + // Nameserver port for internal communication and system replication HanaDBNameServerPortName = "nameserver" HanaDBNameServerPort = 39001 diff --git a/apis/kubedb/v1alpha2/hanadb_helpers.go b/apis/kubedb/v1alpha2/hanadb_helpers.go index 53a1494c97..3afc00f94c 100644 --- a/apis/kubedb/v1alpha2/hanadb_helpers.go +++ b/apis/kubedb/v1alpha2/hanadb_helpers.go @@ -274,12 +274,38 @@ func (h *HanaDB) SetDefaults(kc client.Client) { h.Spec.Replicas = pointer.Int32P(1) } } + if h.Spec.Topology != nil && h.Spec.Topology.Mode != nil && + *h.Spec.Topology.Mode == HanaDBModeSystemReplication && + h.Spec.Topology.SystemReplication != nil { + if h.Spec.Topology.SystemReplication.ReplicationMode == "" { + h.Spec.Topology.SystemReplication.ReplicationMode = ReplicationModeSync + } + if h.Spec.Topology.SystemReplication.OperationMode == "" { + h.Spec.Topology.SystemReplication.OperationMode = OperationModeLogReplay + } + } h.setDefaultContainerSecurityContext(&hanadbVersion, h.Spec.PodTemplate) h.SetHealthCheckerDefaults() h.setDefaultContainerResourceLimits(h.Spec.PodTemplate) + + if h.Spec.Monitor != nil { + if h.Spec.Monitor.Prometheus == nil { + h.Spec.Monitor.Prometheus = &mona.PrometheusSpec{} + } + if h.Spec.Monitor.Prometheus.Exporter.Port == 0 { + h.Spec.Monitor.Prometheus.Exporter.Port = kubedb.HanaDBExporterPort + } + h.Spec.Monitor.SetDefaults() + if h.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsUser == nil { + h.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsUser = hanadbVersion.Spec.SecurityContext.RunAsUser + } + if h.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsGroup == nil { + h.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsGroup = hanadbVersion.Spec.SecurityContext.RunAsGroup + } + } } func (h *HanaDB) setDefaultContainerSecurityContext(hanadbVersion *catalog.HanaDBVersion, podTemplate *ofst.PodTemplateSpec) { diff --git a/apis/kubedb/v1alpha2/hanadb_types.go b/apis/kubedb/v1alpha2/hanadb_types.go index 773082117e..13582e2b3e 100644 --- a/apis/kubedb/v1alpha2/hanadb_types.go +++ b/apis/kubedb/v1alpha2/hanadb_types.go @@ -20,6 +20,7 @@ import ( core "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kmapi "kmodules.xyz/client-go/api/v1" + mona "kmodules.xyz/monitoring-agent-api/api/v1" ofst "kmodules.xyz/offshoot-api/api/v2" ) @@ -30,6 +31,24 @@ const ( ResourcePluralHanaDB = "hanadbs" ) +// +kubebuilder:validation:Enum=sync;syncmem;async +type ReplicationMode string + +const ( + ReplicationModeSync ReplicationMode = "sync" + ReplicationModeSyncMem ReplicationMode = "syncmem" + ReplicationModeAsync ReplicationMode = "async" +) + +// +kubebuilder:validation:Enum=logreplay;delta_datashipping;logreplay_readaccess +type OperationMode string + +const ( + OperationModeLogReplay OperationMode = "logreplay" + OperationModeDeltaDataShipping OperationMode = "delta_datashipping" + OperationModeLogReplayReadAccess OperationMode = "logreplay_readaccess" +) + // +kubebuilder:validation:Enum=Standalone;SystemReplication type HanaDBMode string @@ -92,6 +111,10 @@ type HanaDBSpec struct { // +optional Configuration *ConfigurationSpec `json:"configuration,omitempty"` + // Monitor is used monitor database instance + // +optional + Monitor *mona.AgentSpec `json:"monitor,omitempty"` + // PodTemplate is an optional configuration for pods used to expose database // +optional PodTemplate *ofst.PodTemplateSpec `json:"podTemplate,omitempty"` @@ -115,6 +138,23 @@ type HanaDBTopology struct { // Mode specifies the deployment mode. // +optional Mode *HanaDBMode `json:"mode,omitempty"` + + // SystemReplication defines configuration for SAP HANA system replication. + // +optional + SystemReplication *HanaDBSystemReplicationSpec `json:"systemReplication,omitempty"` +} + +// HanaDBSystemReplicationSpec defines system replication configuration. +type HanaDBSystemReplicationSpec struct { + // ReplicationMode controls when transactions are committed relative to log shipping. + // +optional + // +kubebuilder:default=sync + ReplicationMode ReplicationMode `json:"replicationMode,omitempty"` + + // OperationMode controls the log shipping/replay strategy on the secondary. + // +optional + // +kubebuilder:default=logreplay + OperationMode OperationMode `json:"operationMode,omitempty"` } // HanaDBStatus defines the observed state of HanaDB. diff --git a/apis/kubedb/v1alpha2/openapi_generated.go b/apis/kubedb/v1alpha2/openapi_generated.go index 32e396959e..b35aa1925f 100644 --- a/apis/kubedb/v1alpha2/openapi_generated.go +++ b/apis/kubedb/v1alpha2/openapi_generated.go @@ -586,6 +586,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBList": schema_apimachinery_apis_kubedb_v1alpha2_HanaDBList(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBSpec": schema_apimachinery_apis_kubedb_v1alpha2_HanaDBSpec(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBStatus": schema_apimachinery_apis_kubedb_v1alpha2_HanaDBStatus(ref), + "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBSystemReplicationSpec": schema_apimachinery_apis_kubedb_v1alpha2_HanaDBSystemReplicationSpec(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBTopology": schema_apimachinery_apis_kubedb_v1alpha2_HanaDBTopology(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.Hazelcast": schema_apimachinery_apis_kubedb_v1alpha2_Hazelcast(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HazelcastApp": schema_apimachinery_apis_kubedb_v1alpha2_HazelcastApp(ref), @@ -30401,6 +30402,12 @@ func schema_apimachinery_apis_kubedb_v1alpha2_HanaDBSpec(ref common.ReferenceCal Ref: ref("kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ConfigurationSpec"), }, }, + "monitor": { + SchemaProps: spec.SchemaProps{ + Description: "Monitor is used monitor database instance", + Ref: ref("kmodules.xyz/monitoring-agent-api/api/v1.AgentSpec"), + }, + }, "podTemplate": { SchemaProps: spec.SchemaProps{ Description: "PodTemplate is an optional configuration for pods used to expose database", @@ -30440,7 +30447,7 @@ func schema_apimachinery_apis_kubedb_v1alpha2_HanaDBSpec(ref common.ReferenceCal }, }, Dependencies: []string{ - "k8s.io/api/core/v1.PersistentVolumeClaimSpec", "kmodules.xyz/client-go/api/v1.HealthCheckSpec", "kmodules.xyz/offshoot-api/api/v2.PodTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ConfigurationSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBTopology", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.NamedServiceTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.SecretReference"}, + "k8s.io/api/core/v1.PersistentVolumeClaimSpec", "kmodules.xyz/client-go/api/v1.HealthCheckSpec", "kmodules.xyz/monitoring-agent-api/api/v1.AgentSpec", "kmodules.xyz/offshoot-api/api/v2.PodTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ConfigurationSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBTopology", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.NamedServiceTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.SecretReference"}, } } @@ -30487,6 +30494,33 @@ func schema_apimachinery_apis_kubedb_v1alpha2_HanaDBStatus(ref common.ReferenceC } } +func schema_apimachinery_apis_kubedb_v1alpha2_HanaDBSystemReplicationSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "HanaDBSystemReplicationSpec defines system replication configuration.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "replicationMode": { + SchemaProps: spec.SchemaProps{ + Description: "ReplicationMode controls when transactions are committed relative to log shipping.", + Type: []string{"string"}, + Format: "", + }, + }, + "operationMode": { + SchemaProps: spec.SchemaProps{ + Description: "OperationMode controls the log shipping/replay strategy on the secondary.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_apimachinery_apis_kubedb_v1alpha2_HanaDBTopology(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -30501,9 +30535,17 @@ func schema_apimachinery_apis_kubedb_v1alpha2_HanaDBTopology(ref common.Referenc Format: "", }, }, + "systemReplication": { + SchemaProps: spec.SchemaProps{ + Description: "SystemReplication defines configuration for SAP HANA system replication.", + Ref: ref("kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBSystemReplicationSpec"), + }, + }, }, }, }, + Dependencies: []string{ + "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.HanaDBSystemReplicationSpec"}, } } diff --git a/apis/kubedb/v1alpha2/register.go b/apis/kubedb/v1alpha2/register.go index 2a6eaac22d..c4289f00c3 100644 --- a/apis/kubedb/v1alpha2/register.go +++ b/apis/kubedb/v1alpha2/register.go @@ -70,8 +70,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { &FerretDBList{}, &HanaDB{}, &HanaDBList{}, - &Hazelcast{}, - &HazelcastList{}, &Ignite{}, &IgniteList{}, &Kafka{}, diff --git a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go index 5894b7b844..3425c3fb30 100644 --- a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go +++ b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go @@ -2363,6 +2363,11 @@ func (in *HanaDBSpec) DeepCopyInto(out *HanaDBSpec) { *out = new(ConfigurationSpec) (*in).DeepCopyInto(*out) } + if in.Monitor != nil { + in, out := &in.Monitor, &out.Monitor + *out = new(monitoringagentapiapiv1.AgentSpec) + (*in).DeepCopyInto(*out) + } if in.PodTemplate != nil { in, out := &in.PodTemplate, &out.PodTemplate *out = new(v2.PodTemplateSpec) @@ -2412,6 +2417,22 @@ func (in *HanaDBStatus) DeepCopy() *HanaDBStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HanaDBSystemReplicationSpec) DeepCopyInto(out *HanaDBSystemReplicationSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HanaDBSystemReplicationSpec. +func (in *HanaDBSystemReplicationSpec) DeepCopy() *HanaDBSystemReplicationSpec { + if in == nil { + return nil + } + out := new(HanaDBSystemReplicationSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HanaDBTopology) DeepCopyInto(out *HanaDBTopology) { *out = *in @@ -2420,6 +2441,11 @@ func (in *HanaDBTopology) DeepCopyInto(out *HanaDBTopology) { *out = new(HanaDBMode) **out = **in } + if in.SystemReplication != nil { + in, out := &in.SystemReplication, &out.SystemReplication + *out = new(HanaDBSystemReplicationSpec) + **out = **in + } return } diff --git a/crds/catalog.kubedb.com_hanadbversions.yaml b/crds/catalog.kubedb.com_hanadbversions.yaml index a07d871c42..369d1906da 100644 --- a/crds/catalog.kubedb.com_hanadbversions.yaml +++ b/crds/catalog.kubedb.com_hanadbversions.yaml @@ -45,6 +45,13 @@ spec: type: object spec: properties: + coordinator: + properties: + image: + type: string + required: + - image + type: object db: properties: image: @@ -54,8 +61,13 @@ spec: type: object deprecated: type: boolean - endOfLife: - type: boolean + exporter: + properties: + image: + type: string + required: + - image + type: object securityContext: properties: runAsGroup: @@ -95,6 +107,7 @@ spec: type: string required: - db + - exporter - version type: object type: object diff --git a/crds/kubedb.com_hanadbs.yaml b/crds/kubedb.com_hanadbs.yaml index f5d6ad3541..6fb4e2471b 100644 --- a/crds/kubedb.com_hanadbs.yaml +++ b/crds/kubedb.com_hanadbs.yaml @@ -109,6 +109,226 @@ spec: format: int32 type: integer type: object + monitor: + properties: + agent: + enum: + - prometheus.io/operator + - prometheus.io + - prometheus.io/builtin + type: string + prometheus: + properties: + exporter: + properties: + args: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + port: + default: 56790 + format: int32 + type: integer + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + type: object + serviceMonitor: + properties: + interval: + type: string + labels: + additionalProperties: + type: string + type: object + type: object + type: object + type: object podTemplate: properties: controller: @@ -3520,6 +3740,23 @@ spec: - Standalone - SystemReplication type: string + systemReplication: + properties: + operationMode: + default: logreplay + enum: + - logreplay + - delta_datashipping + - logreplay_readaccess + type: string + replicationMode: + default: sync + enum: + - sync + - syncmem + - async + type: string + type: object type: object version: type: string diff --git a/pkg/webhooks/kubedb/v1alpha2/hanadb.go b/pkg/webhooks/kubedb/v1alpha2/hanadb.go index 6f15446caa..d0a7308514 100644 --- a/pkg/webhooks/kubedb/v1alpha2/hanadb.go +++ b/pkg/webhooks/kubedb/v1alpha2/hanadb.go @@ -154,6 +154,26 @@ func (w *HanaDBCustomWebhook) ValidateCreateOrUpdate(db *api.HanaDB) field.Error "number of replicas for standalone must be one ")) } } + if db.Spec.Topology != nil && db.Spec.Topology.Mode != nil && + *db.Spec.Topology.Mode == api.HanaDBModeSystemReplication { + if db.Spec.Topology.SystemReplication == nil { + allErr = append(allErr, field.Invalid(field.NewPath("spec").Child("topology").Child("systemReplication"), + db.Name, + "systemReplication must be specified when topology.mode is SystemReplication")) + } else { + sr := db.Spec.Topology.SystemReplication + if sr.ReplicationMode == "" { + allErr = append(allErr, field.Invalid(field.NewPath("spec").Child("topology").Child("systemReplication").Child("replicationMode"), + db.Name, + "replicationMode can't be empty for SystemReplication")) + } + if sr.OperationMode == "" { + allErr = append(allErr, field.Invalid(field.NewPath("spec").Child("topology").Child("systemReplication").Child("operationMode"), + db.Name, + "operationMode can't be empty for SystemReplication")) + } + } + } if db.Spec.PodTemplate != nil { if err = w.validateEnvsForAllContainers(db); err != nil {