apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: postgresqls.acid.zalan.do
spec:
  group: acid.zalan.do
  names:
    kind: postgresql
    listKind: postgresqlList
    plural: postgresqls
    singular: postgresql
    shortNames:
    - pg
    categories:
    - all
  scope: Namespaced
  versions:
  - name: v1
    served: true
    storage: true
    subresources:
      status: {}
    additionalPrinterColumns:
    - name: Team
      type: string
      description: Team responsible for Postgres CLuster
      jsonPath: .spec.teamId
    - name: Version
      type: string
      description: PostgreSQL version
      jsonPath: .spec.postgresql.version
    - name: Pods
      type: integer
      description: Number of Pods per Postgres cluster
      jsonPath: .spec.numberOfInstances
    - name: Volume
      type: string
      description: Size of the bound volume
      jsonPath: .spec.volume.size
    - name: CPU-Request
      type: string
      description: Requested CPU for Postgres containers
      jsonPath: .spec.resources.requests.cpu
    - name: Memory-Request
      type: string
      description: Requested memory for Postgres containers
      jsonPath: .spec.resources.requests.memory
    - name: Age
      type: date
      jsonPath: .metadata.creationTimestamp
    - name: Status
      type: string
      description: Current sync status of postgresql resource
      jsonPath: .status.PostgresClusterStatus
    schema:
      openAPIV3Schema:
        type: object
        required:
          - kind
          - apiVersion
          - spec
        properties:
          kind:
            type: string
            enum:
              - postgresql
          apiVersion:
            type: string
            enum:
              - acid.zalan.do/v1
          spec:
            type: object
            required:
              - numberOfInstances
              - teamId
              - postgresql
              - volume
            properties:
              additionalVolumes:
                type: array
                items:
                  type: object
                  required:
                    - name
                    - mountPath
                    - volumeSource
                  properties:
                    name:
                      type: string
                    mountPath:
                      type: string
                    targetContainers:
                      type: array
                      nullable: true
                      items:
                        type: string
                    volumeSource:
                      type: object
                      x-kubernetes-preserve-unknown-fields: true
                    subPath:
                      type: string
              allowedSourceRanges:
                type: array
                nullable: true
                items:
                  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:
                  - cluster
                properties:
                  cluster:
                    type: string
                  s3_endpoint:
                    type: string
                  s3_access_key_id:
                    type: string
                  s3_secret_access_key:
                    type: string
                  s3_force_path_style:
                    type: boolean
                  s3_wal_path:
                    type: string
                  timestamp:
                    type: string
                    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]+)?(([+-]([01][0-9]|2[0-3]):[0-5][0-9]))$'
                    # The regexp matches the date-time format (RFC 3339 Section 5.6) that specifies a timezone as an offset relative to UTC
                    # Example: 1996-12-19T16:39:57-08:00
                    # Note: this field requires a timezone
                  uid:
                    format: uuid
                    type: string
              connectionPooler:
                type: object
                properties:
                  dockerImage:
                    type: string
                  maxDBConnections:
                    type: integer
                  mode:
                    type: string
                    enum:
                      - "session"
                      - "transaction"
                  numberOfInstances:
                    type: integer
                    minimum: 2
                  resources:
                    type: object
                    required:
                      - requests
                      - limits
                    properties:
                      limits:
                        type: object
                        required:
                          - cpu
                          - memory
                        properties:
                          cpu:
                            type: string
                            pattern: '^(\d+m|\d+(\.\d{1,3})?)$'
                          memory:
                            type: string
                            pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$'
                      requests:
                        type: object
                        required:
                          - cpu
                          - memory
                        properties:
                          cpu:
                            type: string
                            pattern: '^(\d+m|\d+(\.\d{1,3})?)$'
                          memory:
                            type: string
                            pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$'
                  schema:
                    type: string
                  user:
                    type: string
              databases:
                type: object
                additionalProperties:
                  type: string
                # Note: usernames specified here as database owners must be declared in the users key of the spec key.
              dockerImage:
                type: string
              enableConnectionPooler:
                type: boolean
              enableReplicaConnectionPooler:
                type: boolean
              enableLogicalBackup:
                type: boolean
              enableMasterLoadBalancer:
                type: boolean
              enableReplicaLoadBalancer:
                type: boolean
              enableShmVolume:
                type: boolean
              init_containers:  # deprecated
                type: array
                nullable: true
                items:
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
              initContainers:
                type: array
                nullable: true
                items:
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
              logicalBackupSchedule:
                type: string
                pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
              maintenanceWindows:
                type: array
                items:
                  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: 0
              patroni:
                type: object
                properties:
                  initdb:
                    type: object
                    additionalProperties:
                      type: string
                  loop_wait:
                    type: integer
                  maximum_lag_on_failover:
                    type: integer
                  pg_hba:
                    type: array
                    items:
                      type: string
                  retry_timeout:
                    type: integer
                  slots:
                    type: object
                    additionalProperties:
                      type: object
                      additionalProperties:
                        type: string
                  synchronous_mode:
                    type: boolean
                  synchronous_mode_strict:
                    type: boolean
                  ttl:
                    type: integer
              podAnnotations:
                type: object
                additionalProperties:
                  type: string
              pod_priority_class_name:  # deprecated
                type: string
              podPriorityClassName:
                type: string
              postgresql:
                type: object
                required:
                  - version
                properties:
                  version:
                    type: string
                    enum:
                      - "9.3"
                      - "9.4"
                      - "9.5"
                      - "9.6"
                      - "10"
                      - "11"
                      - "12"
                      - "13"
                  parameters:
                    type: object
                    additionalProperties:
                      type: string
              preparedDatabases:
                type: object
                additionalProperties:
                  type: object
                  properties:
                    defaultUsers:
                      type: boolean
                    extensions:
                      type: object
                      additionalProperties:
                        type: string
                    schemas:
                      type: object
                      additionalProperties:
                        type: object
                        properties:
                          defaultUsers:
                            type: boolean
                          defaultRoles:
                            type: boolean
              replicaLoadBalancer:  # deprecated
                type: boolean
              resources:
                type: object
                required:
                  - requests
                  - limits
                properties:
                  limits:
                    type: object
                    required:
                      - cpu
                      - memory
                    properties:
                      cpu:
                        type: string
                        # Decimal natural followed by m, or decimal natural followed by
                        # dot followed by up to three decimal digits.
                        #
                        # This is because the Kubernetes CPU resource has millis as the
                        # maximum precision.  The actual values are checked in code
                        # because the regular expression would be huge and horrible and
                        # not very helpful in validation error messages; this one checks
                        # only the format of the given number.
                        #
                        # https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-cpu
                        pattern: '^(\d+m|\d+(\.\d{1,3})?)$'
                        # Note: the value specified here must not be zero or be lower
                        # than the corresponding request.
                      memory:
                        type: string
                        # You can express memory as a plain integer or as a fixed-point
                        # integer using one of these suffixes: E, P, T, G, M, k. You can
                        # also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki
                        #
                        # https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-memory
                        pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$'
                        # Note: the value specified here must not be zero or be higher
                        # than the corresponding limit.
                  requests:
                    type: object
                    required:
                      - cpu
                      - memory
                    properties:
                      cpu:
                        type: string
                        pattern: '^(\d+m|\d+(\.\d{1,3})?)$'
                      memory:
                        type: string
                        pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$'
              schedulerName:
                type: string
              serviceAnnotations:
                type: object
                additionalProperties:
                  type: string
              sidecars:
                type: array
                nullable: true
                items:
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
              spiloRunAsUser:
                type: integer
              spiloRunAsGroup:
                type: integer
              spiloFSGroup:
                type: integer
              standby:
                type: object
                required:
                  - s3_wal_path
                properties:
                  s3_wal_path:
                    type: string
              teamId:
                type: string
              tls:
                type: object
                required:
                  - secretName
                properties:
                  secretName:
                    type: string
                  certificateFile:
                    type: string
                  privateKeyFile:
                    type: string
                  caFile:
                    type: string
                  caSecretName:
                    type: string
              nodeAffinity:
                type: object
                properties:
                  preferredDuringSchedulingIgnoredDuringExecution:
                    type: array
                    items:
                      type: object
                      required:
                      - weight
                      - preference
                      properties:
                        preference:
                          type: object
                          properties:
                            matchExpressions:
                              type: array
                              items:
                                type: object
                                required:
                                - key
                                - operator
                                properties:
                                  key:
                                    type: string
                                  operator:
                                    type: string
                                  values:
                                    type: array
                                    items:
                                      type: string
                            matchFields:
                              type: array
                              items:
                                type: object
                                required:
                                - key
                                - operator
                                properties:
                                  key:
                                    type: string
                                  operator:
                                    type: string
                                  values:
                                    type: array
                                    items:
                                      type: string
                        weight:
                          format: int32
                          type: integer
                  requiredDuringSchedulingIgnoredDuringExecution:
                    type: object
                    required:
                    - nodeSelectorTerms
                    properties:
                      nodeSelectorTerms:
                        type: array
                        items:
                          type: object
                          properties:
                            matchExpressions:
                              type: array
                              items:
                                type: object
                                required:
                                - key
                                - operator
                                properties:
                                  key:
                                    type: string
                                  operator:
                                    type: string
                                  values:
                                    type: array
                                    items:
                                      type: string
                            matchFields:
                              type: array
                              items:
                                type: object
                                required:
                                - key
                                - operator
                                properties:
                                  key:
                                    type: string
                                  operator:
                                    type: string
                                  values:
                                    type: array
                                    items:
                                      type: string
              tolerations:
                type: array
                items:
                  type: object
                  required:
                    - key
                    - operator
                    - effect
                  properties:
                    key:
                      type: string
                    operator:
                      type: string
                      enum:
                        - Equal
                        - Exists
                    value:
                      type: string
                    effect:
                      type: string
                      enum:
                        - NoExecute
                        - NoSchedule
                        - PreferNoSchedule
                    tolerationSeconds:
                      type: integer
              useLoadBalancer:  # deprecated
                type: boolean
              users:
                type: object
                additionalProperties:
                  type: array
                  nullable: true
                  description: "Role flags specified here must not contradict each other"
                  items:
                    type: string
                    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:
                  - size
                properties:
                  size:
                    type: string
                    pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$'
                    # Note: the value specified here must not be zero.
                  storageClass:
                    type: string
                  subPath:
                    type: string
          status:
            type: object
            additionalProperties:
              type: string
