{
  "description": "PulsarNamespace is the Schema for the pulsarnamespaces API\nIt represents a Pulsar namespace in the Kubernetes cluster and includes both\nthe desired state (Spec) and the observed state (Status) of the namespace.",
  "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": "PulsarNamespaceSpec defines the desired state of a Pulsar namespace.\nIt corresponds to the configuration options available in Pulsar's namespace 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"
        },
        "backlogQuotaType": {
          "description": "BacklogQuotaType controls how the backlog quota is enforced.\n\"destination_storage\" limits backlog by size (in bytes), while \"message_age\" limits by time.",
          "enum": [
            "destination_storage",
            "message_age"
          ],
          "type": "string"
        },
        "bookieAffinityGroup": {
          "description": "BookieAffinityGroup is the name of the namespace isolation policy to apply to the namespace.",
          "properties": {
            "bookkeeperAffinityGroupPrimary": {
              "type": "string"
            },
            "bookkeeperAffinityGroupSecondary": {
              "type": "string"
            }
          },
          "required": [
            "bookkeeperAffinityGroupPrimary"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "bundles": {
          "description": "Bundles specifies the number of bundles to split the namespace into.\nThis affects how the namespace is distributed across the cluster.",
          "format": "int32",
          "type": "integer"
        },
        "connectionRef": {
          "description": "ConnectionRef is the reference to the PulsarConnection resource\nused to connect to the Pulsar cluster for this 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
        },
        "deduplication": {
          "description": "Deduplication controls whether to enable message deduplication for the namespace.",
          "type": "boolean"
        },
        "geoReplicationRefs": {
          "description": "GeoReplicationRefs is a list of references to PulsarGeoReplication resources,\nused to configure geo-replication for this namespace.\nThis is **ONLY** used when you are using PulsarGeoReplication for setting up geo-replication\nbetween two Pulsar instances.\nPlease use `ReplicationClusters` instead if you are replicating clusters within the same Pulsar instance.",
          "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 namespace\nwhen the Kubernetes resource is deleted.",
          "enum": [
            "CleanUpAfterDeletion",
            "KeepAfterDeletion"
          ],
          "type": "string"
        },
        "maxConsumersPerSubscription": {
          "description": "MaxConsumersPerSubscription sets the maximum number of consumers allowed on a single subscription in the namespace.",
          "format": "int32",
          "type": "integer"
        },
        "maxConsumersPerTopic": {
          "description": "MaxConsumersPerTopic sets the maximum number of consumers allowed on a single topic in the namespace.",
          "format": "int32",
          "type": "integer"
        },
        "maxProducersPerTopic": {
          "description": "MaxProducersPerTopic sets the maximum number of producers allowed on a single topic in the namespace.",
          "format": "int32",
          "type": "integer"
        },
        "messageTTL": {
          "description": "MessageTTL specifies the Time to Live (TTL) for messages in the namespace.\nMessages older than this TTL will be automatically marked as consumed.",
          "type": "string"
        },
        "name": {
          "description": "Name is the fully qualified namespace name in the format \"tenant/namespace\".",
          "type": "string"
        },
        "offloadThresholdSize": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "string"
            }
          ],
          "description": "OffloadThresholdSize specifies the size limit for message offloading.\nWhen the limit is reached, older messages will be offloaded to the tiered storage.",
          "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
          "x-kubernetes-int-or-string": true
        },
        "offloadThresholdTime": {
          "description": "OffloadThresholdTime specifies the time limit for message offloading.\nMessages older than this limit will be offloaded to the tiered storage.",
          "type": "string"
        },
        "replicationClusters": {
          "description": "ReplicationClusters is the list of clusters to which the namespace 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 in the namespace.\nShould be set in conjunction with RetentionTime for effective 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
        },
        "retentionTime": {
          "description": "RetentionTime specifies the minimum time to retain messages in the namespace.\nShould be set in conjunction with RetentionSize for effective retention policy.\nRetention Quota must exceed configured backlog quota for namespace",
          "type": "string"
        }
      },
      "required": [
        "connectionRef",
        "name"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "PulsarNamespaceStatus defines the observed state of PulsarNamespace",
      "properties": {
        "conditions": {
          "description": "Conditions represent the latest available observations of the namespace's current state.\nIt follows the Kubernetes conventions for condition types and status.\nThe \"Ready\" condition type is typically used to indicate the overall status of the namespace.",
          "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 between two Pulsar instances (via PulsarGeoReplication)\nis enabled for the namespace",
          "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"
}
