{
  "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": {
              "isSubPathExpr": {
                "type": "boolean"
              },
              "name": {
                "type": "string"
              },
              "mountPath": {
                "type": "string"
              },
              "subPath": {
                "type": "string"
              },
              "targetContainers": {
                "type": "array",
                "nullable": true,
                "items": {
                  "type": "string"
                }
              },
              "volumeSource": {
                "type": "object",
                "x-kubernetes-preserve-unknown-fields": true
              }
            },
            "additionalProperties": false
          }
        },
        "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]))$"
            },
            "uid": {
              "format": "uuid",
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "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?)$"
                    }
                  },
                  "additionalProperties": false
                },
                "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?)$"
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            },
            "schema": {
              "type": "string"
            },
            "user": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "databases": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "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
          }
        },
        "logicalBackupRetention": {
          "type": "string"
        },
        "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))-((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"
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "matchFields": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "key",
                            "operator"
                          ],
                          "properties": {
                            "key": {
                              "type": "string"
                            },
                            "operator": {
                              "type": "string"
                            },
                            "values": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "weight": {
                    "format": "int32",
                    "type": "integer"
                  }
                },
                "additionalProperties": false
              }
            },
            "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"
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "matchFields": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "key",
                            "operator"
                          ],
                          "properties": {
                            "key": {
                              "type": "string"
                            },
                            "operator": {
                              "type": "string"
                            },
                            "values": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false
        },
        "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"
            }
          },
          "additionalProperties": false
        },
        "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": [
                "13",
                "14",
                "15",
                "16",
                "17"
              ]
            },
            "parameters": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        },
        "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"
                    }
                  },
                  "additionalProperties": false
                }
              },
              "secretNamespace": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "replicaLoadBalancer": {
          "type": "boolean",
          "description": "deprecated"
        },
        "replicaServiceAnnotations": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "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?)$"
                },
                "hugepages-2Mi": {
                  "type": "string",
                  "pattern": "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$"
                },
                "hugepages-1Gi": {
                  "type": "string",
                  "pattern": "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$"
                }
              },
              "additionalProperties": false
            },
            "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?)$"
                },
                "hugepages-2Mi": {
                  "type": "string",
                  "pattern": "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$"
                },
                "hugepages-1Gi": {
                  "type": "string",
                  "pattern": "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$"
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false
        },
        "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"
              ]
            }
          ],
          "additionalProperties": false
        },
        "streams": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "applicationId",
              "database",
              "tables"
            ],
            "properties": {
              "applicationId": {
                "type": "string"
              },
              "batchSize": {
                "type": "integer"
              },
              "cpu": {
                "type": "string",
                "pattern": "^(\\d+m|\\d+(\\.\\d{1,3})?)$"
              },
              "database": {
                "type": "string"
              },
              "enableRecovery": {
                "type": "boolean"
              },
              "filter": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              "memory": {
                "type": "string",
                "pattern": "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$"
              },
              "tables": {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "required": [
                    "eventType"
                  ],
                  "properties": {
                    "eventType": {
                      "type": "string"
                    },
                    "idColumn": {
                      "type": "string"
                    },
                    "ignoreRecovery": {
                      "type": "boolean"
                    },
                    "payloadColumn": {
                      "type": "string"
                    },
                    "recoveryEventType": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          }
        },
        "teamId": {
          "type": "string"
        },
        "tls": {
          "type": "object",
          "required": [
            "secretName"
          ],
          "properties": {
            "secretName": {
              "type": "string"
            },
            "certificateFile": {
              "type": "string"
            },
            "privateKeyFile": {
              "type": "string"
            },
            "caFile": {
              "type": "string"
            },
            "caSecretName": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "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"
              }
            },
            "additionalProperties": false
          }
        },
        "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"
              ]
            }
          }
        },
        "usersIgnoringSecretRotation": {
          "type": "array",
          "nullable": true,
          "items": {
            "type": "string"
          }
        },
        "usersWithInPlaceSecretRotation": {
          "type": "array",
          "nullable": true,
          "items": {
            "type": "string"
          }
        },
        "usersWithSecretRotation": {
          "type": "array",
          "nullable": true,
          "items": {
            "type": "string"
          }
        },
        "volume": {
          "type": "object",
          "required": [
            "size"
          ],
          "properties": {
            "isSubPathExpr": {
              "type": "boolean"
            },
            "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"
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "matchLabels": {
                  "type": "object",
                  "x-kubernetes-preserve-unknown-fields": true
                }
              },
              "additionalProperties": false
            },
            "size": {
              "type": "string",
              "pattern": "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$"
            },
            "storageClass": {
              "type": "string"
            },
            "subPath": {
              "type": "string"
            },
            "throughput": {
              "type": "integer"
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "status": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}
