add crd validation also in code + minor fixes
This commit is contained in:
parent
f29ea87c13
commit
9b7f673540
|
|
@ -307,17 +307,37 @@ spec:
|
|||
additionalProperties:
|
||||
type: array
|
||||
nullable: true
|
||||
description: "Role flags specified here must not contradict each other"
|
||||
items:
|
||||
enum: [
|
||||
bypassrls, nobypassrls,
|
||||
createdb, nocreatedb,
|
||||
createrole, nocreaterole,
|
||||
inherit, noinherit,
|
||||
login, nologin,
|
||||
replication, noreplication,
|
||||
superuser, nosuperuser,
|
||||
]
|
||||
# Note: role flags specified here must not contradict each other.
|
||||
enum:
|
||||
- bypassrls
|
||||
- BYPASSRLS
|
||||
- nobypassrls
|
||||
- NOBYPASSRLS
|
||||
- createdb
|
||||
- CREATEDB
|
||||
- nocreatedb
|
||||
- NOCREATEDB
|
||||
- createrole
|
||||
- CREATEROLE
|
||||
- nocreaterole
|
||||
- NOCREATEROLE
|
||||
- inherit
|
||||
- INHERIT
|
||||
- noinherit
|
||||
- NOINHERIT
|
||||
- login
|
||||
- LOGIN
|
||||
- nologin
|
||||
- NOLOGIN
|
||||
- replication
|
||||
- REPLICATION
|
||||
- noreplication
|
||||
- NOREPLICATION
|
||||
- superuser
|
||||
- SUPERUSER
|
||||
- nosuperuser
|
||||
- NOSUPERUSER
|
||||
volume:
|
||||
type: object
|
||||
required:
|
||||
|
|
@ -405,7 +425,6 @@ spec:
|
|||
type: string
|
||||
name:
|
||||
type: string
|
||||
# Note: the cluster name specified here must begin with the team name.
|
||||
namespace:
|
||||
type: string
|
||||
configuration:
|
||||
|
|
@ -458,10 +477,6 @@ spec:
|
|||
enable_pod_disruption_budget:
|
||||
type: boolean
|
||||
infrastructure_roles_secret_name:
|
||||
type: object
|
||||
additionalProperties:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
inherited_labels:
|
||||
type: array
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@ spec:
|
|||
type: string
|
||||
name:
|
||||
type: string
|
||||
# Note: the cluster name specified here must begin with the team name.
|
||||
namespace:
|
||||
type: string
|
||||
configuration:
|
||||
|
|
@ -96,10 +95,6 @@ spec:
|
|||
enable_pod_disruption_budget:
|
||||
type: boolean
|
||||
infrastructure_roles_secret_name:
|
||||
type: object
|
||||
additionalProperties:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
inherited_labels:
|
||||
type: array
|
||||
|
|
|
|||
|
|
@ -27,11 +27,12 @@ configuration:
|
|||
# keyb: valueb
|
||||
enable_pod_antiaffinity: false
|
||||
enable_pod_disruption_budget: true
|
||||
# infrastructure_roles_secret_name: ""
|
||||
# infrastructure_roles_secret_name: postgresql-operator
|
||||
# inherited_labels:
|
||||
# - application
|
||||
# - environment
|
||||
# node_readiness_label: ""
|
||||
# node_readiness_label:
|
||||
# - status:ready
|
||||
oauth_token_secret_name: postgresql-operator
|
||||
pdb_name_format: "postgres-{cluster}-pdb"
|
||||
pod_antiaffinity_topology_key: "kubernetes.io/hostname"
|
||||
|
|
@ -44,7 +45,7 @@ configuration:
|
|||
# spilo_fsgroup: 103
|
||||
spilo_privileged: false
|
||||
# toleration: {}
|
||||
# watched_namespace:""
|
||||
# watched_namespace: ""
|
||||
postgres_pod_resources:
|
||||
default_cpu_limit: "3"
|
||||
default_cpu_request: 100m
|
||||
|
|
@ -91,7 +92,8 @@ configuration:
|
|||
enable_teams_api: false
|
||||
# pam_configuration: ""
|
||||
pam_role_name: zalandos
|
||||
# postgres_superuser_teams: "postgres_superusers"
|
||||
# postgres_superuser_teams:
|
||||
# - postgres_superusers
|
||||
protected_role_names:
|
||||
- admin
|
||||
team_admin_role: admin
|
||||
|
|
|
|||
|
|
@ -267,17 +267,37 @@ spec:
|
|||
additionalProperties:
|
||||
type: array
|
||||
nullable: true
|
||||
description: "Role flags specified here must not contradict each other"
|
||||
items:
|
||||
enum: [
|
||||
bypassrls, nobypassrls,
|
||||
createdb, nocreatedb,
|
||||
createrole, nocreaterole,
|
||||
inherit, noinherit,
|
||||
login, nologin,
|
||||
replication, noreplication,
|
||||
superuser, nosuperuser,
|
||||
]
|
||||
# Note: role flags specified here must not contradict each other.
|
||||
enum:
|
||||
- bypassrls
|
||||
- BYPASSRLS
|
||||
- nobypassrls
|
||||
- NOBYPASSRLS
|
||||
- createdb
|
||||
- CREATEDB
|
||||
- nocreatedb
|
||||
- NOCREATEDB
|
||||
- createrole
|
||||
- CREATEROLE
|
||||
- nocreaterole
|
||||
- NOCREATEROLE
|
||||
- inherit
|
||||
- INHERIT
|
||||
- noinherit
|
||||
- NOINHERIT
|
||||
- login
|
||||
- LOGIN
|
||||
- nologin
|
||||
- NOLOGIN
|
||||
- replication
|
||||
- REPLICATION
|
||||
- noreplication
|
||||
- NOREPLICATION
|
||||
- superuser
|
||||
- SUPERUSER
|
||||
- nosuperuser
|
||||
- NOSUPERUSER
|
||||
volume:
|
||||
type: object
|
||||
required:
|
||||
|
|
|
|||
|
|
@ -103,7 +103,881 @@ var OperatorConfigCRDResourceColumns = []apiextv1beta1.CustomResourceColumnDefin
|
|||
},
|
||||
}
|
||||
|
||||
func buildCRD(name, kind, plural, short string, columns []apiextv1beta1.CustomResourceColumnDefinition) *apiextv1beta1.CustomResourceDefinition {
|
||||
var min0 = 0.0
|
||||
var min1 = 1.0
|
||||
var minDisable = -1.0
|
||||
|
||||
var postgresCRDResourceValidation = apiextv1beta1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
Required: []string{"kind", "apiVersion", "metadata", "spec"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"kind": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"postgresql"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"apiVersion": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"acid.zalan.do/v1"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"metadata": {
|
||||
Type: "object",
|
||||
Required: []string{"name"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"annotations": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"labels": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"name": {
|
||||
Type: "string",
|
||||
Description: "The cluster name specified here must begin with the team name",
|
||||
},
|
||||
"namespace": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"spec": {
|
||||
Type: "object",
|
||||
Required: []string{"numberOfInstances", "teamId", "postgresql"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"allowedSourceRanges": {
|
||||
Type: "array",
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
Pattern: "^(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\/(\\d|[1-2]\\d|3[0-2])$",
|
||||
},
|
||||
},
|
||||
},
|
||||
"clone": {
|
||||
Type: "object",
|
||||
Required: []string{"cluster"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"cluster": {
|
||||
Type: "string",
|
||||
},
|
||||
"s3_endpoint": {
|
||||
Type: "string",
|
||||
},
|
||||
"s3_access_key_id": {
|
||||
Type: "string",
|
||||
},
|
||||
"s3_secret_access_key": {
|
||||
Type: "string",
|
||||
},
|
||||
"s3_force_path_style": {
|
||||
Type: "string",
|
||||
},
|
||||
"s3_wal_path": {
|
||||
Type: "string",
|
||||
},
|
||||
"timestamp": {
|
||||
Type: "string",
|
||||
Description: "Date-time format that specifies a timezone as an offset relative to UTC e.g. 1996-12-19T16:39:57-08:00",
|
||||
Pattern: "^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\\.[0-9]+)?(([Zz])|([+-]([01][0-9]|2[0-3]):[0-5][0-9]))$",
|
||||
},
|
||||
"uid": {
|
||||
Type: "string",
|
||||
Format: "uuid",
|
||||
},
|
||||
},
|
||||
},
|
||||
"databases": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
Description: "User names specified here as database owners must be declared in the users key of the spec key",
|
||||
},
|
||||
},
|
||||
},
|
||||
"dockerImage": {
|
||||
Type: "string",
|
||||
},
|
||||
"enableLogicalBackup": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enableMasterLoadBalancer": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enableReplicaLoadBalancer": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enableShmVolume": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"logicalBackupSchedule": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+|\\*)(/\\d+)?(\\s+(\\d+|\\*)(/\\d+)?){4}$",
|
||||
},
|
||||
"maintenanceWindows": {
|
||||
Type: "array",
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
Pattern: "^\\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\\d):([0-5]?\\d)|(2[0-3]|[01]?\\d):([0-5]?\\d))-((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\\d):([0-5]?\\d)|(2[0-3]|[01]?\\d):([0-5]?\\d))\\ *$",
|
||||
},
|
||||
},
|
||||
},
|
||||
"numberOfInstances": {
|
||||
Type: "integer",
|
||||
Minimum: &min0,
|
||||
},
|
||||
"patroni": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"initdb": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"pg_hba": {
|
||||
Type: "array",
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"slots": {
|
||||
Type: "array",
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"ttl": {
|
||||
Type: "integer",
|
||||
},
|
||||
"loop_wait": {
|
||||
Type: "integer",
|
||||
},
|
||||
"retry_timeout": {
|
||||
Type: "integer",
|
||||
},
|
||||
"maximum_lag_on_failover": {
|
||||
Type: "integer",
|
||||
},
|
||||
},
|
||||
},
|
||||
"pod_priority_class_name": {
|
||||
Type: "string",
|
||||
Description: "Deprecated",
|
||||
},
|
||||
"podPriorityClassName": {
|
||||
Type: "string",
|
||||
},
|
||||
"postgresql": {
|
||||
Type: "object",
|
||||
Required: []string{"version"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"version": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"9.3"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"9.4"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"9.5"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"9.6"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"10"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"11"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"12"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"parameters": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"replicaLoadBalancer": {
|
||||
Type: "boolean",
|
||||
Description: "Deprecated",
|
||||
},
|
||||
"resources": {
|
||||
Type: "object",
|
||||
Required: []string{"requests", "limits"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"limits": {
|
||||
Type: "object",
|
||||
Required: []string{"cpu", "memory"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"cpu": {
|
||||
Type: "string",
|
||||
Description: "Decimal natural followed by m, or decimal natural followed by dot followed by up to three decimal digits (precision used by Kubernetes). Must be greater than 0",
|
||||
Pattern: "^(\\d+m|\\d+\\.\\d{1,3})$",
|
||||
},
|
||||
"memory": {
|
||||
Type: "string",
|
||||
Description: "Plain integer or fixed-point integer using one of these suffixes: E, P, T, G, M, k (with or without a tailing i). Must be greater than 0",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
},
|
||||
},
|
||||
"requests": {
|
||||
Type: "object",
|
||||
Required: []string{"cpu", "memory"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"cpu": {
|
||||
Type: "string",
|
||||
Description: "Decimal natural followed by m, or decimal natural followed by dot followed by up to three decimal digits (precision used by Kubernetes). Must be greater than 0",
|
||||
Pattern: "^(\\d+m|\\d+\\.\\d{1,3})$",
|
||||
},
|
||||
"memory": {
|
||||
Type: "string",
|
||||
Description: "Plain integer or fixed-point integer using one of these suffixes: E, P, T, G, M, k (with or without a tailing i). Must be greater than 0",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"spiloFSGroup": {
|
||||
Type: "integer",
|
||||
},
|
||||
"standby": {
|
||||
Type: "object",
|
||||
Required: []string{"s3_wal_path"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"s3_wal_path": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"teamId": {
|
||||
Type: "string",
|
||||
},
|
||||
"tolerations": {
|
||||
Type: "array",
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
Required: []string{"key", "operator", "effect"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"key": {
|
||||
Type: "string",
|
||||
},
|
||||
"operator": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"Equal"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"Exists"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"value": {
|
||||
Type: "string",
|
||||
},
|
||||
"effect": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"NoExecute"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NoSchedule"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"PreferNoSchedule"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"tolerationSeconds": {
|
||||
Type: "integer",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"useLoadBalancer": {
|
||||
Type: "boolean",
|
||||
Description: "Deprecated",
|
||||
},
|
||||
"users": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "array",
|
||||
Description: "Role flags specified here must not contradict each other",
|
||||
Nullable: true,
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"bypassrls"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"BYPASSRLS"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"nobypassrls"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOBYPASSRLS"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"createdb"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"CREATEDB"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"nocreatedb"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOCREATEDB"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"createrole"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"CREATEROLE"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"nocreaterole"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOCREATEROLE"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"inherit"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"INHERIT"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"noinherit"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOINHERIT"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"login"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"LOGIN"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"nologin"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOLOGIN"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"replication"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"REPLICATION"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"noreplication"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOREPLICATION"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"superuser"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"SUPERUSER"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"nosuperuser"`),
|
||||
},
|
||||
{
|
||||
Raw: []byte(`"NOSUPERUSER"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"volume": {
|
||||
Type: "object",
|
||||
Required: []string{"size"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"size": {
|
||||
Type: "string",
|
||||
Description: "Value must not be zero",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
"storageClass": {
|
||||
Type: "string",
|
||||
},
|
||||
"subPath": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var operatorConfigCRDResourceValidation = apiextv1beta1.JSONSchemaProps{
|
||||
Type: "object",
|
||||
Required: []string{"kind", "apiVersion", "metadata", "configuration"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"kind": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"OperatorConfiguration"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"apiVersion": {
|
||||
Type: "string",
|
||||
Enum: []apiextv1beta1.JSON{
|
||||
{
|
||||
Raw: []byte(`"acid.zalan.do/v1"`),
|
||||
},
|
||||
},
|
||||
},
|
||||
"metadata": {
|
||||
Type: "object",
|
||||
Required: []string{"name"},
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"annotations": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"labels": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"name": {
|
||||
Type: "string",
|
||||
},
|
||||
"namespace": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"configuration": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"etcd_host": {
|
||||
Type: "string",
|
||||
Nullable: true,
|
||||
},
|
||||
"docker_image": {
|
||||
Type: "string",
|
||||
},
|
||||
"max_instances": {
|
||||
Type: "integer",
|
||||
Description: "-1 = disabled",
|
||||
Minimum: &minDisable,
|
||||
},
|
||||
"min_instances": {
|
||||
Type: "integer",
|
||||
Description: "-1 = disabled",
|
||||
Minimum: &minDisable,
|
||||
},
|
||||
"resync_period": {
|
||||
Type: "string",
|
||||
},
|
||||
"repair_period": {
|
||||
Type: "string",
|
||||
},
|
||||
"set_memory_request_to_limit": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"sidecar_docker_images": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"workers": {
|
||||
Type: "integer",
|
||||
Minimum: &min1,
|
||||
},
|
||||
"users": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"replication_username": {
|
||||
Type: "string",
|
||||
},
|
||||
"super_username": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"kubernetes": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"cluster_domain": {
|
||||
Type: "string",
|
||||
},
|
||||
"cluster_labels": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"cluster_name_label": {
|
||||
Type: "string",
|
||||
},
|
||||
"enable_pod_antiaffinity": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enable_pod_disruption_budget": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"infrastructure_roles_secret_name": {
|
||||
Type: "string",
|
||||
},
|
||||
"inherited_labels": {
|
||||
Type: "array",
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"node_readiness_label": {
|
||||
Type: "array",
|
||||
Nullable: true,
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"oauth_token_secret_name": {
|
||||
Type: "string",
|
||||
},
|
||||
"pdb_name_format": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_antiaffinity_topology_key": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_environment_configmap": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_management_policy": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_role_label": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_service_account_name": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_terminate_grace_period": {
|
||||
Type: "string",
|
||||
},
|
||||
"secret_name_template": {
|
||||
Type: "string",
|
||||
},
|
||||
"spilo_fsgroup": {
|
||||
Type: "integer",
|
||||
},
|
||||
"spilo_privileged": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"toleration": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"watched_namespace": {
|
||||
Type: "string",
|
||||
Nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
"postgres_pod_resources": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"default_cpu_limit": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$",
|
||||
},
|
||||
"default_cpu_request": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$",
|
||||
},
|
||||
"default_memory_limit": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
"default_memory_request": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
},
|
||||
},
|
||||
"timeouts": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"pod_label_wait_timeout": {
|
||||
Type: "string",
|
||||
},
|
||||
"pod_deletion_wait_timeout": {
|
||||
Type: "string",
|
||||
},
|
||||
"ready_wait_interval": {
|
||||
Type: "string",
|
||||
},
|
||||
"ready_wait_timeout": {
|
||||
Type: "string",
|
||||
},
|
||||
"resource_check_interval": {
|
||||
Type: "string",
|
||||
},
|
||||
"resource_check_timeout": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"load_balancer": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"db_hosted_zone": {
|
||||
Type: "string",
|
||||
},
|
||||
"enable_master_load_balancer": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enable_replica_load_balancer": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"custom_service_annotations": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"master_dns_name_format": {
|
||||
Type: "string",
|
||||
},
|
||||
"replica_dns_name_format": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"aws_or_gcp": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"additional_secret_mount": {
|
||||
Type: "string",
|
||||
},
|
||||
"additional_secret_mount_path": {
|
||||
Type: "string",
|
||||
},
|
||||
"aws_region": {
|
||||
Type: "string",
|
||||
},
|
||||
"kube_iam_role": {
|
||||
Type: "string",
|
||||
},
|
||||
"log_s3_bucket": {
|
||||
Type: "string",
|
||||
},
|
||||
"wal_s3_bucket": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"logical_backup": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"logical_backup_schedule": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+|\\*)(/\\d+)?(\\s+(\\d+|\\*)(/\\d+)?){4}$",
|
||||
},
|
||||
"logical_backup_docker_image": {
|
||||
Type: "string",
|
||||
},
|
||||
"logical_backup_s3_bucket": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"debug": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"debug_logging": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enable_database_access": {
|
||||
Type: "boolean",
|
||||
},
|
||||
},
|
||||
},
|
||||
"teams_api": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"enable_admin_role_for_users": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enable_team_superuser": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"enable_teams_api": {
|
||||
Type: "boolean",
|
||||
},
|
||||
"pam_configuration": {
|
||||
Type: "string",
|
||||
},
|
||||
"pam_role_name": {
|
||||
Type: "string",
|
||||
},
|
||||
"postgres_superuser_teams": {
|
||||
Type: "array",
|
||||
Nullable: true,
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"protected_role_names": {
|
||||
Type: "array",
|
||||
Nullable: true,
|
||||
Items: &apiextv1beta1.JSONSchemaPropsOrArray{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"team_admin_role": {
|
||||
Type: "string",
|
||||
},
|
||||
"team_api_role_configuration": {
|
||||
Type: "object",
|
||||
AdditionalProperties: &apiextv1beta1.JSONSchemaPropsOrBool{
|
||||
Schema: &apiextv1beta1.JSONSchemaProps{
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"teams_api_url": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
"logging_rest_api": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"api_port": {
|
||||
Type: "integer",
|
||||
},
|
||||
"cluster_history_entries": {
|
||||
Type: "integer",
|
||||
},
|
||||
"ring_log_lines": {
|
||||
Type: "integer",
|
||||
},
|
||||
},
|
||||
},
|
||||
"scalyr": {
|
||||
Type: "object",
|
||||
Properties: map[string]apiextv1beta1.JSONSchemaProps{
|
||||
"scalyr_api_key": {
|
||||
Type: "string",
|
||||
},
|
||||
"scalyr_cpu_limit": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$",
|
||||
},
|
||||
"scalyr_cpu_request": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$",
|
||||
},
|
||||
"scalyr_image": {
|
||||
Type: "string",
|
||||
},
|
||||
"scalyr_memory_limit": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
"scalyr_memory_request": {
|
||||
Type: "string",
|
||||
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
|
||||
},
|
||||
"scalyr_server_url": {
|
||||
Type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func buildCRD(name, kind, plural, short string, columns []apiextv1beta1.CustomResourceColumnDefinition, validationSchema apiextv1beta1.JSONSchemaProps) *apiextv1beta1.CustomResourceDefinition {
|
||||
return &apiextv1beta1.CustomResourceDefinition{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: name,
|
||||
|
|
@ -121,6 +995,9 @@ func buildCRD(name, kind, plural, short string, columns []apiextv1beta1.CustomRe
|
|||
Status: &apiextv1beta1.CustomResourceSubresourceStatus{},
|
||||
},
|
||||
AdditionalPrinterColumns: columns,
|
||||
Validation: &apiextv1beta1.CustomResourceValidation{
|
||||
OpenAPIV3Schema: &validationSchema,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
@ -131,7 +1008,8 @@ func PostgresCRD() *apiextv1beta1.CustomResourceDefinition {
|
|||
PostgresCRDResourceKind,
|
||||
PostgresCRDResourcePlural,
|
||||
PostgresCRDResourceShort,
|
||||
PostgresCRDResourceColumns)
|
||||
PostgresCRDResourceColumns,
|
||||
postgresCRDResourceValidation)
|
||||
}
|
||||
|
||||
// ConfigurationCRD returns CustomResourceDefinition built from OperatorConfigCRDResource
|
||||
|
|
@ -140,5 +1018,6 @@ func ConfigurationCRD() *apiextv1beta1.CustomResourceDefinition {
|
|||
OperatorConfigCRDResouceKind,
|
||||
OperatorConfigCRDResourcePlural,
|
||||
OperatorConfigCRDResourceShort,
|
||||
OperatorConfigCRDResourceColumns)
|
||||
OperatorConfigCRDResourceColumns,
|
||||
operatorConfigCRDResourceValidation)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue