apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: postgresqls.acid.zalan.do
  labels:
    app.kubernetes.io/name: postgres-operator
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: 1
                    resources:
                      type: object
                      properties:
                        limits:
                          type: object
                          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
                          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
                enableMasterPoolerLoadBalancer:
                  type: boolean
                enableReplicaLoadBalancer:
                  type: boolean
                enableReplicaPoolerLoadBalancer:
                  type: boolean
                enableShmVolume:
                  type: boolean
                env:
                  type: array
                  nullable: true
                  items:
                    type: object
                    x-kubernetes-preserve-unknown-fields: true
                init_containers:
                  type: array
                  description: deprecated
                  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))\ *$'
                masterServiceAnnotations:
                  type: object
                  additionalProperties:
                    type: string
                nodeAffinity:
                  type: object
                  properties:
                    preferredDuringSchedulingIgnoredDuringExecution:
                      type: array
                      items:
                        type: object
                        required:
                          - preference
                          - weight
                        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
                numberOfInstances:
                  type: integer
                  minimum: 0
                patroni:
                  type: object
                  properties:
                    failsafe_mode:
                      type: boolean
                    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
                    synchronous_node_count:
                      type: integer
                    ttl:
                      type: integer
                podAnnotations:
                  type: object
                  additionalProperties:
                    type: string
                pod_priority_class_name:
                  type: string
                  description: deprecated
                podPriorityClassName:
                  type: string
                postgresql:
                  type: object
                  required:
                    - version
                  properties:
                    version:
                      type: string
                      enum:
                        - "10"
                        - "11"
                        - "12"
                        - "13"
                        - "14"
                        - "15"
                    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
                      secretNamespace:
                        type: string
                replicaLoadBalancer:
                  type: boolean
                  description: deprecated
                replicaServiceAnnotations:
                  type: object
                  additionalProperties:
                    type: string
                resources:
                  type: object
                  properties:
                    limits:
                      type: object
                      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
                      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
                  properties:
                    s3_wal_path:
                      type: string
                    gs_wal_path:
                      type: string
                    standby_host:
                      type: string
                    standby_port:
                      type: string
                  oneOf:
                    - required:
                        - s3_wal_path
                    - required:
                        - gs_wal_path
                    - required:
                        - standby_host
                streams:
                  type: array
                  items:
                    type: object
                    required:
                      - applicationId
                      - database
                      - tables
                    properties:
                      applicationId:
                        type: string
                      batchSize:
                        type: integer
                      database:
                        type: string
                      filter:
                        type: object
                        additionalProperties:
                          type: string
                      tables:
                        type: object
                        additionalProperties:
                          type: object
                          required:
                            - eventType
                          properties:
                            eventType:
                              type: string
                            idColumn:
                              type: string
                            payloadColumn:
                              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
                tolerations:
                  type: array
                  items:
                    type: object
                    properties:
                      key:
                        type: string
                      operator:
                        type: string
                        enum:
                          - Equal
                          - Exists
                      value:
                        type: string
                      effect:
                        type: string
                        enum:
                          - NoExecute
                          - NoSchedule
                          - PreferNoSchedule
                      tolerationSeconds:
                        type: integer
                useLoadBalancer:
                  type: boolean
                  description: deprecated
                users:
                  type: object
                  additionalProperties:
                    type: array
                    nullable: true
                    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
                usersWithInPlaceSecretRotation:
                  type: array
                  nullable: true
                  items:
                    type: string
                usersWithSecretRotation:
                  type: array
                  nullable: true
                  items:
                    type: string
                volume:
                  type: object
                  required:
                    - size
                  properties:
                    iops:
                      type: integer
                    selector:
                      type: object
                      properties:
                        matchExpressions:
                          type: array
                          items:
                            type: object
                            required:
                              - key
                              - operator
                            properties:
                              key:
                                type: string
                              operator:
                                type: string
                                enum:
                                  - DoesNotExist
                                  - Exists
                                  - In
                                  - NotIn
                              values:
                                type: array
                                items:
                                  type: string
                        matchLabels:
                          type: object
                          x-kubernetes-preserve-unknown-fields: true
                    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
                    throughput:
                      type: integer
            status:
              type: object
              additionalProperties:
                type: string
