{
  "description": "PulsarTopic is the Schema for the pulsartopics API\nIt represents a Pulsar topic in the Kubernetes cluster and includes both\nthe desired state (Spec) and the observed state (Status) of the topic.",
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
      "type": "string"
    },
    "kind": {
      "description": "Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "PulsarTopicSpec defines the desired state of PulsarTopic.\nIt corresponds to the configuration options available in Pulsar's topic admin API.",
      "properties": {
        "backlogQuotaLimitSize": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "string"
            }
          ],
          "description": "BacklogQuotaLimitSize specifies the size limit for message backlog.\nWhen the limit is reached, older messages will be removed or handled according to the retention policy.",
          "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
          "x-kubernetes-int-or-string": true
        },
        "backlogQuotaLimitTime": {
          "description": "BacklogQuotaLimitTime specifies the time limit for message backlog.\nMessages older than this limit will be removed or handled according to the retention policy.",
          "type": "string"
        },
        "backlogQuotaRetentionPolicy": {
          "description": "BacklogQuotaRetentionPolicy specifies the retention policy for messages when backlog quota is exceeded.\nValid values are \"producer_request_hold\", \"producer_exception\", or \"consumer_backlog_eviction\".",
          "type": "string"
        },
        "connectionRef": {
          "description": "ConnectionRef is the reference to the PulsarConnection resource\nused to connect to the Pulsar cluster for this topic.",
          "properties": {
            "name": {
              "default": "",
              "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nTODO: Add other useful fields. apiVersion, kind, uid?\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\nTODO: Drop `kubebuilder:default` when controller-gen doesn't need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.",
              "type": "string"
            }
          },
          "type": "object",
          "x-kubernetes-map-type": "atomic",
          "additionalProperties": false
        },
        "deduplication": {
          "description": "Deduplication controls whether to enable message deduplication for the topic.",
          "type": "boolean"
        },
        "geoReplicationRefs": {
          "description": "GeoReplicationRefs is a list of references to PulsarGeoReplication resources,\nused to configure geo-replication for this topic across multiple Pulsar instances.\nThis is **ONLY** used when you are using PulsarGeoReplication for setting up geo-replication\nbetween two Pulsar instances.",
          "items": {
            "description": "LocalObjectReference contains enough information to let you locate the\nreferenced object inside the same namespace.",
            "properties": {
              "name": {
                "default": "",
                "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nTODO: Add other useful fields. apiVersion, kind, uid?\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\nTODO: Drop `kubebuilder:default` when controller-gen doesn't need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.",
                "type": "string"
              }
            },
            "type": "object",
            "x-kubernetes-map-type": "atomic",
            "additionalProperties": false
          },
          "type": "array"
        },
        "lifecyclePolicy": {
          "description": "LifecyclePolicy determines whether to keep or delete the Pulsar topic\nwhen the Kubernetes resource is deleted.",
          "enum": [
            "CleanUpAfterDeletion",
            "KeepAfterDeletion"
          ],
          "type": "string"
        },
        "maxConsumers": {
          "description": "MaxConsumers sets the maximum number of consumers allowed on the topic.",
          "format": "int32",
          "type": "integer"
        },
        "maxProducers": {
          "description": "MaxProducers sets the maximum number of producers allowed on the topic.",
          "format": "int32",
          "type": "integer"
        },
        "maxUnAckedMessagesPerConsumer": {
          "description": "MaxUnAckedMessagesPerConsumer sets the maximum number of unacknowledged\nmessages allowed for a consumer before it's blocked from receiving more messages.",
          "format": "int32",
          "type": "integer"
        },
        "maxUnAckedMessagesPerSubscription": {
          "description": "MaxUnAckedMessagesPerSubscription sets the maximum number of unacknowledged\nmessages allowed for a subscription before it's blocked from receiving more messages.",
          "format": "int32",
          "type": "integer"
        },
        "messageTTL": {
          "description": "MessageTTL specifies the Time to Live (TTL) for messages on the topic.\nMessages older than this TTL will be automatically marked as deleted.",
          "type": "string"
        },
        "name": {
          "description": "Name is the topic name",
          "type": "string"
        },
        "partitions": {
          "default": 0,
          "description": "Partitions specifies the number of partitions for a partitioned topic.\nSet to 0 for a non-partitioned topic.",
          "format": "int32",
          "type": "integer"
        },
        "persistent": {
          "default": true,
          "description": "Persistent determines if the topic is persistent (true) or non-persistent (false).\nDefaults to true if not specified.",
          "type": "boolean"
        },
        "replicationClusters": {
          "description": "ReplicationClusters is the list of clusters to which the topic is replicated\nThis is **ONLY** used if you are replicating clusters within the same Pulsar instance.\nPlease use `GeoReplicationRefs` instead if you are setting up geo-replication\nbetween two Pulsar instances.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "retentionSize": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "string"
            }
          ],
          "description": "RetentionSize specifies the maximum size of backlog retained on the topic.\nShould be set in conjunction with RetentionTime for effective retention policy.\nRetention Quota must exceed configured backlog quota for topic",
          "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
          "x-kubernetes-int-or-string": true
        },
        "retentionTime": {
          "description": "RetentionTime specifies the minimum time to retain messages on the topic.\nShould be set in conjunction with RetentionSize for effective retention policy.\nRetention Quota must exceed configured backlog quota for topic",
          "type": "string"
        },
        "schemaInfo": {
          "description": "SchemaInfo defines the schema for the topic, if any.",
          "properties": {
            "properties": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Properties is a map of user-defined properties associated with the schema.\nThese can be used to store additional metadata about the schema.",
              "type": "object"
            },
            "schema": {
              "description": "Schema contains the actual schema definition.\nFor AVRO and JSON schemas, this should be a JSON string of the schema definition.\nFor PROTOBUF schemas, this should be the protobuf definition string.\nFor BYTES or NONE schemas, this field can be empty.",
              "type": "string"
            },
            "type": {
              "description": "Type determines how to interpret the schema data.\nValid values include: \"AVRO\", \"JSON\", \"PROTOBUF\", \"PROTOBUF_NATIVE\", \"KEY_VALUE\", \"BYTES\", or \"NONE\".\nFor KEY_VALUE schemas, use the format \"KEY_VALUE(KeyType,ValueType)\" where KeyType and ValueType\nare one of the other schema types.",
              "type": "string"
            },
            "additionalProperties": false
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "required": [
        "connectionRef",
        "name"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "PulsarTopicStatus defines the observed state of PulsarTopic",
      "properties": {
        "conditions": {
          "description": "Conditions represent the latest available observations of the PulsarTopic's current state.\nIt follows the Kubernetes conventions for condition types and status.\nThe \"Ready\" condition type indicates the overall status of the topic.\nThe \"PolicyReady\" condition type indicates whether the topic policies have been successfully applied.",
          "items": {
            "description": "Condition contains details for one aspect of the current state of this API Resource.\n---\nThis struct is intended for direct use as an array at the field path .status.conditions.  For example,\n\n\n\ttype FooStatus struct{\n\t    // Represents the observations of a foo's current state.\n\t    // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\"\n\t    // +patchMergeKey=type\n\t    // +patchStrategy=merge\n\t    // +listType=map\n\t    // +listMapKey=type\n\t    Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t    // other fields\n\t}",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
                "format": "int64",
                "minimum": 0,
                "type": "integer"
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
                "maxLength": 1024,
                "minLength": 1,
                "pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "enum": [
                  "True",
                  "False",
                  "Unknown"
                ],
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.\n---\nMany .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\nuseful (see .node.status.conditions), the ability to deconflict is important.\nThe regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array",
          "x-kubernetes-list-map-keys": [
            "type"
          ],
          "x-kubernetes-list-type": "map"
        },
        "geoReplicationEnabled": {
          "description": "GeoReplicationEnabled indicates whether geo-replication is enabled for this topic.\nThis is set to true when GeoReplicationRefs are configured in the spec and successfully applied.",
          "type": "boolean"
        },
        "observedGeneration": {
          "description": "ObservedGeneration is the most recent generation observed for this resource.\nIt corresponds to the metadata generation, which is updated on mutation by the API Server.\nThis field is used to track whether the controller has processed the latest changes.",
          "format": "int64",
          "type": "integer"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
