openapi: 3.0.0
info:
  description: Api Documentation
  version: 0.1.0
  title: Api Documentation
  termsOfService: urn:tos
  contact: { }
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0
tags:
  - name: /api/clusters
  - name: /api/clusters/connects
servers:
  - url: /localhost

paths:
  /api/clusters:
    get:
      tags:
        - Clusters
      summary: getClusters
      operationId: getClusters
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Cluster'


  /api/clusters/{clusterName}/cache:
    post:
      tags:
        - Clusters
      summary: updateClusterInfo
      operationId: updateClusterInfo
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Cluster'
        404:
          description: Not found


  /api/clusters/{clusterName}/brokers:
    get:
      tags:
        - Brokers
      summary: getBrokers
      operationId: getBrokers
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Broker'

  /api/clusters/{clusterName}/brokers/{id}/configs:
    get:
      tags:
        - Brokers
      summary: getBrokerConfig
      operationId: getBrokerConfig
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: integer
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BrokerConfig'
        404:
          description: Not found

  /api/clusters/{clusterName}/brokers/{id}/configs/{name}:
    put:
      tags:
        - Brokers
      summary: updateBrokerConfigByName
      operationId: updateBrokerConfigByName
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: integer
        - name: name
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrokerConfigItem'
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/metrics:
    get:
      tags:
        - Clusters
      summary: getClusterMetrics
      operationId: getClusterMetrics
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClusterMetrics'

  /api/clusters/{clusterName}/stats:
    get:
      tags:
        - Clusters
      summary: getClusterStats
      operationId: getClusterStats
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClusterStats'

  /api/clusters/{clusterName}/brokers/{id}/metrics:
    get:
      tags:
        - Brokers
      summary: getBrokersMetrics
      operationId: getBrokersMetrics
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: integer
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrokerMetrics'

  /api/clusters/{clusterName}/brokers/logdirs:
    get:
      tags:
        - Brokers
      summary: getAllBrokersLogdirs
      operationId: getAllBrokersLogdirs
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: broker
          in: query
          description: array of broker ids
          required: false
          schema:
            type: array
            items:
              type: integer
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BrokersLogdirs'

  /api/clusters/{clusterName}/brokers/{id}/logdirs:
    patch:
      tags:
        - Brokers
      summary: updateBrokerTopicPartitionLogDir
      operationId: updateBrokerTopicPartitionLogDir
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrokerLogdirUpdate'
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/topics:
    get:
      tags:
        - Topics
      summary: getTopics
      operationId: getTopics
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
        - name: perPage
          in: query
          required: false
          schema:
            type: integer
        - name: showInternal
          in: query
          required: false
          schema:
            type: boolean
        - name: search
          in: query
          required: false
          schema:
            type: string
        - name: orderBy
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/TopicColumnsToSort'
        - name: sortOrder
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/SortOrder'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicsResponse'
    post:
      tags:
        - Topics
      summary: createTopic
      operationId: createTopic
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TopicCreation'
      responses:
        201:
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Topic'

  /api/clusters/{clusterName}/topics/{topicName}/clone:
    post:
      tags:
        - Topics
      summary: cloneTopic
      operationId: cloneTopic
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
        - name: newTopicName
          in: query
          required: true
          schema:
            type: string
      responses:
        201:
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Topic'
        404:
          description: Not found

  /api/clusters/{clusterName}/topics/{topicName}/analysis:
    get:
      tags:
        - Topics
      summary: getTopicAnalysis
      operationId: getTopicAnalysis
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicAnalysis'
        404:
          description: Not found
    post:
      tags:
        - Topics
      summary: analyzeTopic
      operationId: analyzeTopic
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: Analysis started
        404:
          description: Not found
    delete:
      tags:
        - Topics
      summary: cancelTopicAnalysis
      operationId: cancelTopicAnalysis
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: Analysis cancelled
        404:
          description: Not found


  /api/clusters/{clusterName}/topics/{topicName}:
    get:
      tags:
        - Topics
      summary: getTopicDetails
      operationId: getTopicDetails
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicDetails'
    post:
      tags:
        - Topics
      summary: recreateTopic
      operationId: recreateTopic
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        201:
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Topic'
        404:
          description: Not found
        408:
          description: Topic recreation timeout
    patch:
      tags:
        - Topics
      summary: updateTopic
      operationId: updateTopic
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TopicUpdate'
      responses:
        200:
          description: Updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Topic'
    delete:
      tags:
        - Topics
      summary: deleteTopic
      operationId: deleteTopic
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
        404:
          description: Not found

  /api/clusters/{clusterName}/topics/{topicName}/config:
    get:
      tags:
        - Topics
      summary: getTopicConfigs
      operationId: getTopicConfigs
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TopicConfig'

  /api/clusters/{clusterName}/topics/{topicName}/replications:
    patch:
      tags:
        - Topics
      summary: changeReplicationFactor
      operationId: changeReplicationFactor
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReplicationFactorChange'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReplicationFactorChangeResponse'
        404:
          description: Not found
        400:
          description: Bad Request

  /api/clusters/{clusterName}/topic/{topicName}/serdes:
    get:
      tags:
        - Messages
      summary: getSerdes
      operationId: getSerdes
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
        - name: use
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/SerdeUsage'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicSerdeSuggestion'

  /api/smartfilters/testexecutions:
    put:
      tags:
        - Messages
      summary: executeSmartFilterTest
      operationId: executeSmartFilterTest
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SmartFilterTestExecution'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SmartFilterTestExecutionResult'


  /api/clusters/{clusterName}/topics/{topicName}/messages:
    get:
      tags:
        - Messages
      summary: getTopicMessages
      operationId: getTopicMessages
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
        - name: seekType
          in: query
          schema:
            $ref: "#/components/schemas/SeekType"
        - name: seekTo
          in: query
          schema:
            type: array
            items:
              type: string
          description: The format is [partition]::[offset] for specifying offsets or [partition]::[timestamp in millis] for specifying timestamps
        - name: limit
          in: query
          schema:
            type: integer
        - name: q
          in: query
          schema:
            type: string
        - name: filterQueryType
          in: query
          schema:
            $ref:  "#/components/schemas/MessageFilterType"
        - name: seekDirection
          in: query
          schema:
            $ref: "#/components/schemas/SeekDirection"
        - name: keySerde
          in: query
          description: "Serde that should be used for deserialization. Will be chosen automatically if not set."
          schema:
            type: string
        - name: valueSerde
          in: query
          description: "Serde that should be used for deserialization. Will be chosen automatically if not set."
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            text/event-stream:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TopicMessageEvent'
    delete:
      tags:
        - Messages
      summary: deleteTopicMessages
      operationId: deleteTopicMessages
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
        - name: partitions
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
      responses:
        200:
          description: OK
        404:
          description: Not found
    post:
      tags:
        - Messages
      summary: sendTopicMessages
      operationId: sendTopicMessages
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTopicMessage'
      responses:
        200:
          description: OK
        404:
          description: Not found

  /api/clusters/{clusterName}/topics/{topicName}/consumer-groups:
    get:
      tags:
        - Consumer Groups
      summary: get Consumer Groups By Topics
      operationId: getTopicConsumerGroups
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ConsumerGroup'

  /api/clusters/{clusterName}/consumer-groups/paged:
    get:
      tags:
        - Consumer Groups
      summary: Get consumer groups with paging support
      operationId: getConsumerGroupsPage
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
        - name: perPage
          in: query
          required: false
          schema:
            type: integer
        - name: search
          in: query
          required: false
          schema:
            type: string
        - name: orderBy
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/ConsumerGroupOrdering'
        - name: sortOrder
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/SortOrder'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumerGroupsPageResponse'


  /api/clusters/{clusterName}/consumer-groups/{id}:
    get:
      tags:
        - Consumer Groups
      summary: get Consumer Group By Id
      operationId: getConsumerGroup
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumerGroupDetails'

    delete:
      tags:
        - Consumer Groups
      summary: Delete Consumer Group by ID
      operationId: deleteConsumerGroup
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/consumer-groups/{id}/offsets:
    post:
      tags:
        - Consumer Groups
      summary: resets consumer group offsets
      operationId: resetConsumerGroupOffsets
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerGroupOffsetsReset'
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/schemas:
    post:
      tags:
        - Schemas
      summary: create a new subject schema or update existing subject schema
      operationId: createNewSchema
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewSchemaSubject'
      responses:
        200:
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaSubject'
        400:
          description: Bad request
        409:
          description: Duplicate schema
        422:
          description: Invalid parameters
    get:
      tags:
        - Schemas
      summary: get all schemas of latest version from Schema Registry service
      operationId: getSchemas
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
        - name: perPage
          in: query
          required: false
          schema:
            type: integer
        - name: search
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaSubjectsResponse'

  /api/clusters/{clusterName}/schemas/{subject}:
    delete:
      tags:
        - Schemas
      summary: delete schema from Schema Registry service
      operationId: deleteSchema
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
        404:
          description: Not found

  /api/clusters/{clusterName}/schemas/{subject}/versions:
    get:
      tags:
        - Schemas
      summary: get all version of subject from Schema Registry service
      operationId: getAllVersionsBySubject
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SchemaSubject'

  /api/clusters/{clusterName}/schemas/{subject}/latest:
    get:
      tags:
        - Schemas
      summary: get the latest schema from Schema Registry service
      operationId: getLatestSchema
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaSubject'
    delete:
      tags:
        - Schemas
      summary: delete the latest schema from schema registry
      operationId: deleteLatestSchema
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
        404:
          description: Not found


  /api/clusters/{clusterName}/schemas/{subject}/versions/{version}:
    get:
      tags:
        - Schemas
      summary: get schema by version from Schema Registry service
      operationId: getSchemaByVersion
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
        - name: version
          in: path
          required: true
          schema:
            type: integer
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaSubject'
    delete:
      tags:
        - Schemas
      summary: delete schema by version from schema registry
      operationId: deleteSchemaByVersion
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
        - name: version
          in: path
          required: true
          schema:
            type: integer
      responses:
        200:
          description: OK
        404:
          description: Not found

  /api/clusters/{clusterName}/schemas/compatibility:
    get:
      tags:
        - Schemas
      summary: Get global schema compatibility level
      operationId: getGlobalSchemaCompatibilityLevel
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompatibilityLevel'
    put:
      tags:
        - Schemas
      summary: Update compatibility level globally
      operationId: updateGlobalSchemaCompatibilityLevel
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompatibilityLevel'
      responses:
        200:
          description: OK
        404:
          description: Not Found

  /api/clusters/{clusterName}/schemas/{subject}/compatibility:
    put:
      tags:
        - Schemas
      summary: Update compatibility level for specific schema.
      operationId: updateSchemaCompatibilityLevel
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompatibilityLevel'
      responses:
        200:
          description: OK
        404:
          description: Not Found

  /api/clusters/{clusterName}/schemas/{subject}/check:
    post:
      tags:
        - Schemas
      summary: Check compatibility of the schema.
      operationId: checkSchemaCompatibility
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: subject
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewSchemaSubject'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompatibilityCheckResponse'
        404:
          description: Not Found

  /api/clusters/{clusterName}/connects:
    get:
      tags:
        - Kafka Connect
      summary: get all kafka connect instances
      operationId: getConnects
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Connect'

  /api/clusters/{clusterName}/connectors:
    get:
      tags:
        - Kafka Connect
      summary: get filtered kafka connectors
      operationId: getAllConnectors
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: search
          in: query
          required: false
          schema:
            type: string
        - name: orderBy
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/ConnectorColumnsToSort'
        - name: sortOrder
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/SortOrder'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FullConnectorInfo'

  /api/clusters/{clusterName}/connects/{connectName}/connectors:
    get:
      tags:
        - Kafka Connect
      summary: get connectors for provided kafka connect instance
      operationId: getConnectors
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
    post:
      tags:
        - Kafka Connect
      summary: create new connector
      operationId: createConnector
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewConnector'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Connector'
        409:
          description: rebalance is in progress

  /api/clusters/{clusterName}/connects/{connectName}/connectors/{connectorName}:
    get:
      tags:
        - Kafka Connect
      summary: get information about the connector
      operationId: getConnector
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Connector'
    delete:
      tags:
        - Kafka Connect
      summary: delete connector
      operationId: deleteConnector
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
        409:
          description: rebalance is in progress

  /api/clusters/{clusterName}/connects/{connectName}/connectors/{connectorName}/action/{action}:
    post:
      tags:
        - Kafka Connect
      summary: update connector state (restart, pause or resume)
      operationId: updateConnectorState
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
        - name: action
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/ConnectorAction'
      responses:
        200:
          description: OK
        409:
          description: rebalance is in progress

  /api/clusters/{clusterName}/connects/{connectName}/connectors/{connectorName}/config:
    get:
      tags:
        - Kafka Connect
      summary: get connector configuration
      operationId: getConnectorConfig
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConnectorConfig'
    put:
      tags:
        - Kafka Connect
      summary: update or create connector with provided config
      operationId: setConnectorConfig
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConnectorConfig'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Connector'
        409:
          description: rebalance is in progress

  /api/clusters/{clusterName}/connects/{connectName}/connectors/{connectorName}/tasks:
    get:
      tags:
        - Kafka Connect
      summary: get connector tasks
      operationId: getConnectorTasks
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Task'

  /api/clusters/{clusterName}/connects/{connectName}/connectors/{connectorName}/tasks/{taskId}/action/restart:
    post:
      tags:
        - Kafka Connect
      summary: restart connector task
      operationId: restartConnectorTask
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: connectorName
          in: path
          required: true
          schema:
            type: string
        - name: taskId
          in: path
          required: true
          schema:
            type: integer
      responses:
        200:
          description: OK


  /api/clusters/{clusterName}/ksql/v2:
    post:
      tags:
        - Ksql
      summary: executeKsql
      operationId: executeKsql
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KsqlCommandV2'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KsqlCommandV2Response'

  /api/clusters/{clusterName}/ksql/tables:
    get:
      tags:
        - Ksql
      summary: listTables
      operationId: listTables
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/KsqlTableDescription'

  /api/clusters/{clusterName}/ksql/streams:
    get:
      tags:
        - Ksql
      summary: listStreams
      operationId: listStreams
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/KsqlStreamDescription'

  /api/clusters/{clusterName}/ksql/response:
    get:
      tags:
        - Ksql
      summary: Open SSE pipe
      operationId: openKsqlResponsePipe
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: pipeId
          in: query
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            text/event-stream:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/KsqlResponse'

  /api/clusters/{clusterName}/connects/{connectName}/plugins:
    get:
      tags:
        - Kafka Connect
      summary: get connector plugins
      operationId: getConnectorPlugins
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ConnectorPlugin'

  /api/clusters/{clusterName}/connects/{connectName}/plugins/{pluginName}/config/validate:
    put:
      tags:
        - Kafka Connect
      summary: validate connector plugin configuration
      operationId: validateConnectorPluginConfig
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: connectName
          in: path
          required: true
          schema:
            type: string
        - name: pluginName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConnectorConfig'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConnectorPluginConfigValidationResponse'

  /api/clusters/{clusterName}/topics/{topicName}/partitions:
    patch:
      tags:
        - Topics
      summary: increaseTopicPartitions
      operationId: increaseTopicPartitions
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: topicName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartitionsIncrease'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartitionsIncreaseResponse'
        404:
          description: Not found

  /api/clusters/{clusterName}/acls:
    get:
      tags:
        - Acls
      summary: listKafkaAcls
      operationId: listAcls
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
        - name: resourceType
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/KafkaAclResourceType'
        - name: resourceName
          in: query
          required: false
          schema:
            type: string
        - name: namePatternType
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/KafkaAclNamePatternType'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/KafkaAcl'

  /api/clusters/{clusterName}/acl/csv:
    get:
      tags:
        - Acls
      summary: getAclAsCsv
      operationId: getAclAsCsv
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            text/plain:
              schema:
                type: string
    post:
      tags:
        - Acls
      summary: syncAclsCsv
      operationId: syncAclsCsv
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          text/plain:
            schema:
              type: string
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/acl:
    post:
      tags:
        - Acls
      summary: createAcl
      operationId: createAcl
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KafkaAcl'
      responses:
        200:
          description: OK

    delete:
      tags:
        - Acls
      summary: deleteAcl
      operationId: deleteAcl
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KafkaAcl'
      responses:
        200:
          description: OK
        404:
          description: Acl not found

  /api/clusters/{clusterName}/acl/consumer:
    post:
      tags:
        - Acls
      summary: createConsumerAcl
      operationId: createConsumerAcl
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateConsumerAcl'
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/acl/producer:
    post:
      tags:
        - Acls
      summary: createProducerAcl
      operationId: createProducerAcl
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProducerAcl'
      responses:
        200:
          description: OK

  /api/clusters/{clusterName}/clientquotas:
    get:
      tags:
        - ClientQuotas
      summary: listQuotas
      operationId: listQuotas
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ClientQuotas'
    post:
      tags:
        - ClientQuotas
      summary: upsertClientQuotas
      operationId: upsertClientQuotas
      description: |
        - updates/creates client quota record if `quotas` field is non-empty
        - deletes client quota record if `quotas` field is null or empty
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientQuotas'
      responses:
        200:
          description: Existing quota updated
        201:
          description: New quota created
        204:
          description: Existing quota deleted


  /api/clusters/{clusterName}/acl/streamApp:
    post:
      tags:
        - Acls
      summary: createStreamAppAcl
      operationId: createStreamAppAcl
      parameters:
        - name: clusterName
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateStreamAppAcl'
      responses:
        200:
          description: OK

  /api/authorization:
    get:
      tags:
        - Authorization
      summary: Get user authentication related info
      operationId: getUserAuthInfo
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthenticationInfo'

  /api/info:
    get:
      tags:
        - ApplicationConfig
      summary: Gets application info
      operationId: getApplicationInfo
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApplicationInfo'

  /api/config:
    get:
      tags:
        - ApplicationConfig
      summary: Gets current application configuration
      operationId: getCurrentConfig
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApplicationConfig'
    put:
      tags:
        - ApplicationConfig
      summary: Restarts application with specified configuration
      operationId: restartWithConfig
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RestartRequest'
      responses:
        200:
          description: OK

  /api/config/validated:
    put:
      tags:
        - ApplicationConfig
      summary: Restarts application with specified configuration
      operationId: validateConfig
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationConfig'
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApplicationConfigValidation'


  /api/config/relatedfiles:
    post:
      tags:
        - ApplicationConfig
      summary: Restarts application with specified configuration
      operationId: uploadConfigRelatedFile
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadedFileInfo'

components:
  schemas:
    TopicSerdeSuggestion:
      type: object
      properties:
        key:
          type: array
          items:
            $ref: '#/components/schemas/SerdeDescription'
        value:
          type: array
          items:
            $ref: '#/components/schemas/SerdeDescription'

    SerdeDescription:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        preferred:
          description: "This serde was automatically chosen by cluster config. This should be enabled in UI by default. Also it will be used for deserialization if no serdes passed."
          type: boolean
        schema:
          type: string
        additionalProperties:
          type: object
          additionalProperties:
            type: object

    SerdeUsage:
      type: string
      enum:
        - SERIALIZE
        - DESERIALIZE

    ErrorResponse:
      description: Error object that will be returned with 4XX and 5XX HTTP statuses
      type: object
      properties:
        code:
          type: integer
          description: Internal error code (can be used for message formatting & localization on UI)
        message:
          type: string
          description: Error message
        timestamp:
          type: number
          description: Response unix timestamp in ms
        requestId:
          type: string
          description: Unique server-defined request id for convenient debugging
        fieldsErrors:
          type: array
          items:
            $ref: '#/components/schemas/FieldError'
        stackTrace:
          type: string

    FieldError:
      type: object
      properties:
        fieldName:
          type: string
          description: Name of field that violated format
        restrictions:
          description: Field format violations description (ex. ["size must be between 0 and 20", "must be a well-formed email address"])
          type: array
          items:
            type: string

    MetricsCollectionError:
      type: object
      properties:
        message:
          type: string
        stackTrace:
          type: string

    ApplicationInfo:
      type: object
      properties:
        enabledFeatures:
          type: array
          items:
            type: string
            enum:
              - DYNAMIC_CONFIG
        build:
          type: object
          properties:
            commitId:
              type: string
            version:
              type: string
            buildTime:
              type: string
            isLatestRelease:
              type: boolean
        latestRelease:
          type: object
          properties:
            versionTag:
              type: string
            publishedAt:
              type: string
            htmlUrl:
              type: string

    Cluster:
      type: object
      properties:
        name:
          type: string
        defaultCluster:
          type: boolean
        status:
          $ref: '#/components/schemas/ServerStatus'
        lastError:
          $ref: '#/components/schemas/MetricsCollectionError'
        brokerCount:
          type: integer
        onlinePartitionCount:
          type: integer
        topicCount:
          type: integer
        bytesInPerSec:
          type: number
        bytesOutPerSec:
          type: number
        readOnly:
          type: boolean
        version:
          type: string
        features:
          type: array
          items:
            type: string
            enum:
              - SCHEMA_REGISTRY
              - KAFKA_CONNECT
              - KSQL_DB
              - TOPIC_DELETION
              - KAFKA_ACL_VIEW # get ACLs listing
              - KAFKA_ACL_EDIT # create & delete ACLs
              - CLIENT_QUOTA_MANAGEMENT
      required:
        - id
        - name
        - status

    ServerStatus:
      type: string
      enum:
        - online
        - offline
        - initializing

    ClusterMetrics:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Metric'

    ClusterStats:
      type: object
      properties:
        brokerCount:
          type: integer
        zooKeeperStatus:
          type: integer
          deprecated: true
        activeControllers:
          type: integer
          description: Id of broker which is cluster's controller. null, if controller not known yet.
        onlinePartitionCount:
          type: integer
        offlinePartitionCount:
          type: integer
        inSyncReplicasCount:
          type: integer
        outOfSyncReplicasCount:
          type: integer
        underReplicatedPartitionCount:
          type: integer
        diskUsage:
          type: array
          items:
            $ref: '#/components/schemas/BrokerDiskUsage'
        version:
          type: string

    BrokerDiskUsage:
      type: object
      properties:
        brokerId:
          type: integer
        segmentSize:
          type: integer
          format: int64
        segmentCount:
          type: integer
      required:
        - brokerId

    BrokerMetrics:
      type: object
      properties:
        segmentSize:
          type: integer
          format: int64
        segmentCount:
          type: integer
        metrics:
          type: array
          items:
            $ref: '#/components/schemas/Metric'

    BrokerLogdirs:
      type: object
      properties:
        name:
          type: string
        error:
          type: string
        topics:
          type: array
          items:
            $ref: '#/components/schemas/TopicLogdirs'

    BrokersLogdirs:
      type: object
      properties:
        name:
          type: string
        error:
          type: string
        topics:
          type: array
          items:
            $ref: '#/components/schemas/BrokerTopicLogdirs'

    TopicsResponse:
      type: object
      properties:
        pageCount:
          type: integer
        topics:
          type: array
          items:
            $ref: '#/components/schemas/Topic'

    TopicColumnsToSort:
      type: string
      enum:
        - NAME
        - OUT_OF_SYNC_REPLICAS
        - TOTAL_PARTITIONS
        - REPLICATION_FACTOR
        - SIZE

    ConnectorColumnsToSort:
      type: string
      enum:
        - NAME
        - CONNECT
        - TYPE
        - STATUS

    SortOrder:
      type: string
      enum:
        - ASC
        - DESC

    Topic:
      type: object
      properties:
        name:
          type: string
        internal:
          type: boolean
        partitionCount:
          type: integer
        replicationFactor:
          type: integer
        replicas:
          type: integer
        inSyncReplicas:
          type: integer
        segmentSize:
          type: integer
          format: int64
        segmentCount:
          type: integer
        bytesInPerSec:
          type: number
        bytesOutPerSec:
          type: number
        underReplicatedPartitions:
          type: integer
        cleanUpPolicy:
          $ref: '#/components/schemas/CleanUpPolicy'
        partitions:
          type: array
          items:
            $ref: "#/components/schemas/Partition"
      required:
        - name

    TopicAnalysis:
      type: object
      description: "Represents analysis state. Note: 'progress' and 'result' fields are set exclusively depending on analysis state."
      properties:
        progress:
          $ref: '#/components/schemas/TopicAnalysisProgress'
        result:
          $ref: '#/components/schemas/TopicAnalysisResult'

    TopicAnalysisProgress:
      type: object
      properties:
        startedAt:
          type: integer
          format: int64
        completenessPercent:
          type: number
        msgsScanned:
          type: integer
          format: int64
        bytesScanned:
          type: integer
          format: int64

    TopicAnalysisResult:
      type: object
      properties:
        startedAt:
          type: integer
          format: int64
        finishedAt:
          type: integer
          format: int64
        error:
          type: string
        totalStats:
          $ref: '#/components/schemas/TopicAnalysisStats'
        partitionStats:
          type: array
          items:
            $ref: "#/components/schemas/TopicAnalysisStats"

    TopicAnalysisStats:
      type: object
      properties:
        partition:
          type: integer
          format: int32
          description: "null if this is total stats"
        totalMsgs:
          type: integer
          format: int64
        minOffset:
          type: integer
          format: int64
        maxOffset:
          type: integer
          format: int64
        minTimestamp:
          type: integer
          format: int64
        maxTimestamp:
          type: integer
          format: int64
        nullKeys:
          type: integer
          format: int64
        nullValues:
          type: integer
          format: int64
        approxUniqKeys:
          type: integer
          format: int64
        approxUniqValues:
          type: integer
          format: int64
        keySize:
          $ref: "#/components/schemas/TopicAnalysisSizeStats"
        valueSize:
          $ref: "#/components/schemas/TopicAnalysisSizeStats"
        hourlyMsgCounts:
          type: array
          items:
            type: object
            properties:
              hourStart:
                type: integer
                format: int64
              count:
                type: integer
                format: int64

    TopicAnalysisSizeStats:
      type: object
      description: "All sizes in bytes"
      properties:
        sum:
          type: integer
          format: int64
        min:
          type: integer
          format: int64
        max:
          type: integer
          format: int64
        avg:
          type: integer
          format: int64
        prctl50:
          type: integer
          format: int64
        prctl75:
          type: integer
          format: int64
        prctl95:
          type: integer
          format: int64
        prctl99:
          type: integer
          format: int64
        prctl999:
          type: integer
          format: int64

    Replica:
      type: object
      properties:
        broker:
          type: integer
        leader:
          type: boolean
        inSync:
          type: boolean

    TopicDetails:
      type: object
      properties:
        name:
          type: string
        internal:
          type: boolean
        partitions:
          type: array
          items:
            $ref: "#/components/schemas/Partition"
        partitionCount:
          type: integer
        replicationFactor:
          type: integer
        replicas:
          type: integer
        inSyncReplicas:
          type: integer
        bytesInPerSec:
          type: number
        bytesOutPerSec:
          type: number
        segmentSize:
          type: integer
          format: int64
        segmentCount:
          type: integer
        underReplicatedPartitions:
          type: integer
        cleanUpPolicy:
          $ref: '#/components/schemas/CleanUpPolicy'
        keySerde:
          type: string
        valueSerde:
          type: string
      required:
        - name

    TopicConfig:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        defaultValue:
          type: string
        source:
          $ref: "#/components/schemas/ConfigSource"
        isSensitive:
          type: boolean
        isReadOnly:
          type: boolean
        synonyms:
          type: array
          items:
            $ref: "#/components/schemas/ConfigSynonym"
        doc:
          type: string
      required:
        - name

    TopicCreation:
      type: object
      properties:
        name:
          type: string
        partitions:
          type: integer
        replicationFactor:
          type: integer
        configs:
          type: object
          additionalProperties:
            type: string
      required:
        - name
        - partitions

    TopicUpdate:
      type: object
      properties:
        configs:
          type: object
          additionalProperties:
            type: string
      required:
        - configs

    Broker:
      type: object
      properties:
        id:
          type: integer
        host:
          type: string
        port:
          type: integer
        bytesInPerSec:
          type: number
        bytesOutPerSec:
          type: number
        partitionsLeader:
          type: integer
        partitions:
          type: integer
        inSyncPartitions:
          type: integer
        partitionsSkew:
          type: number
        leadersSkew:
          type: number
      required:
        - id

    BrokerLogdirUpdate:
      type: object
      properties:
        topic:
          type: string
        partition:
          type: integer
        logDir:
          type: string

    ConsumerGroupState:
      type: string
      enum:
        - UNKNOWN
        - PREPARING_REBALANCE
        - COMPLETING_REBALANCE
        - STABLE
        - DEAD
        - EMPTY

    MessageFormat:
      type: string
      enum:
        - AVRO
        - JSON
        - PROTOBUF
        - UNKNOWN

    ConsumerGroup:
      discriminator:
        propertyName: inherit
        mapping:
          details: "#/components/schemas/ConsumerGroupDetails"
      type: object
      properties:
        groupId:
          type: string
        members:
          type: integer
        topics:
          type: integer
        simple:
          type: boolean
        partitionAssignor:
          type: string
        state:
          $ref: "#/components/schemas/ConsumerGroupState"
        coordinator:
          $ref: "#/components/schemas/Broker"
        consumerLag:
          type: integer
          format: int64
          description: null if consumer group has no offsets committed
      required:
        - groupId

    ConsumerGroupOrdering:
      type: string
      enum:
        - NAME
        - MEMBERS
        - STATE
        - MESSAGES_BEHIND
        - TOPIC_NUM

    ConsumerGroupsPageResponse:
      type: object
      properties:
        pageCount:
          type: integer
        consumerGroups:
          type: array
          items:
            $ref: '#/components/schemas/ConsumerGroup'

    SmartFilterTestExecution:
      type: object
      required: [filterCode]
      properties:
        filterCode:
          type: string
        key:
          type: string
        value:
          type: string
        headers:
          type: object
          additionalProperties:
            type: string
        partition:
          type: integer
        offset:
          type: integer
          format: int64
        timestampMs:
          type: integer
          format: int64

    SmartFilterTestExecutionResult:
      type: object
      properties:
        result:
          type: boolean
        error:
          type: string

    CreateTopicMessage:
      type: object
      properties:
        partition:
          type: integer
        key:
          type: string
          nullable: true
        headers:
          type: object
          additionalProperties:
            type: string
        content:
          type: string
          nullable: true
        keySerde:
          type: string
          nullable: true
        valueSerde:
          type: string
          nullable: true
      required:
        - partition

    TopicMessageEvent:
      type: object
      properties:
        type:
          type: string
          enum:
            - PHASE
            - MESSAGE
            - CONSUMING
            - DONE
            - EMIT_THROTTLING
        message:
          $ref: "#/components/schemas/TopicMessage"
        phase:
          $ref: "#/components/schemas/TopicMessagePhase"
        consuming:
          $ref: "#/components/schemas/TopicMessageConsuming"

    TopicMessagePhase:
      type: object
      properties:
        name:
          type: string

    TimeStampFormat:
      type: object
      properties:
        timeStampFormat:
          type: string

    TopicMessageConsuming:
      type: object
      properties:
        bytesConsumed:
          type: integer
          format: int64
        elapsedMs:
          type: integer
          format: int64
        isCancelled:
          type: boolean
        messagesConsumed:
          type: integer
        filterApplyErrors:
          type: integer


    TopicMessage:
      type: object
      properties:
        partition:
          type: integer
        offset:
          type: integer
          format: int64
        timestamp:
          type: string
          format: date-time
        timestampType:
          type: string
          enum:
            - NO_TIMESTAMP_TYPE
            - CREATE_TIME
            - LOG_APPEND_TIME
        key:
          type: string
        headers:
          type: object
          additionalProperties:
            type: string
        content:
          type: string
        keyFormat:
          #deprecated - wont be filled - use 'keySerde' field instead
          $ref: "#/components/schemas/MessageFormat"
        valueFormat:
          #deprecated - wont be filled - use 'valueSerde' field instead
          $ref: "#/components/schemas/MessageFormat"
        keySize:
          type: integer
          format: int64
        valueSize:
          type: integer
          format: int64
        keySchemaId:
          deprecated: true
          description: deprecated - wont be filled - use 'keyDeserializeProperties' field instead
          type: string
        valueSchemaId:
          deprecated: true
          description: deprecated - wont be filled - use 'valueDeserializeProperties' field instead
          type: string
        headersSize:
          type: integer
          format: int64
        keySerde:
          type: string
        valueSerde:
          type: string
        keyDeserializeProperties:
          additionalProperties:
            type: object
        valueDeserializeProperties:
          additionalProperties:
            type: object
      required:
        - partition
        - offset
        - timestamp

    SeekType:
      type: string
      enum:
        - BEGINNING
        - OFFSET
        - TIMESTAMP
        - LATEST

    MessageFilterType:
      type: string
      enum:
        - STRING_CONTAINS
        - GROOVY_SCRIPT

    SeekDirection:
      type: string
      enum:
        - FORWARD
        - BACKWARD
        - TAILING
      default: FORWARD

    Partition:
      type: object
      properties:
        partition:
          type: integer
        leader:
          type: integer
        replicas:
          type: array
          items:
            $ref: '#/components/schemas/Replica'
        offsetMax:
          type: integer
          format: int64
        offsetMin:
          type: integer
          format: int64
      required:
        - topic
        - partition
        - offsetMax
        - offsetMin

    ConsumerGroupTopicPartition:
      type: object
      properties:
        topic:
          type: string
        partition:
          type: integer
        currentOffset:
          type: integer
          format: int64
        endOffset:
          type: integer
          format: int64
        consumerLag:
          type: integer
          format: int64
          description: null if consumer group has no offsets committed
        consumerId:
          type: string
        host:
          type: string
      required:
        - topic
        - partition


    ConsumerGroupDetails:
      allOf:
        - $ref: '#/components/schemas/ConsumerGroup'
        - type: object
          properties:
            partitions:
              type: array
              items:
                $ref: '#/components/schemas/ConsumerGroupTopicPartition'

    Metric:
      type: object
      properties:
        name:
          type: string
        labels:
          type: string
          additionalProperties:
            type: string
        value:
          type: number

    TopicLogdirs:
      type: object
      properties:
        name:
          type: string
        partitions:
          type: array
          items:
            $ref: '#/components/schemas/TopicPartitionLogdir'

    BrokerTopicLogdirs:
      type: object
      properties:
        name:
          type: string
        partitions:
          type: array
          items:
            $ref: '#/components/schemas/BrokerTopicPartitionLogdir'

    TopicPartitionLogdir:
      type: object
      properties:
        partition:
          type: integer
        size:
          type: integer
          format: int64
        offsetLag:
          type: integer
          format: int64

    BrokerTopicPartitionLogdir:
      allOf:
        - $ref: '#/components/schemas/TopicPartitionLogdir'
        - type: object
          properties:
            broker:
              type: integer

    SchemaSubject:
      type: object
      properties:
        subject:
          type: string
        version:
          type: string
        id:
          type: integer
        schema:
          type: string
        compatibilityLevel:
          type: string
        schemaType:
          $ref: '#/components/schemas/SchemaType'
        references:
          type: array
          items:
            $ref: '#/components/schemas/SchemaReference'
      required:
        - id
        - subject
        - version
        - schema
        - compatibilityLevel
        - schemaType

    NewSchemaSubject:
      type: object
      description: should be set for creating/updating schema subject
      properties:
        subject:
          type: string
        schema:
          type: string
        schemaType:
          $ref: '#/components/schemas/SchemaType' # upon updating a schema, the type of existing schema can't be changed
        references:
          type: array
          items:
            $ref: '#/components/schemas/SchemaReference'
      required:
        - subject
        - schema
        - schemaType

    SchemaReference:
      type: object
      properties:
        name:
          type: string
        subject:
          type: string
        version:
          type: integer
      required:
        - name
        - subject
        - version

    CompatibilityLevel:
      type: object
      properties:
        compatibility:
          type: string
          enum:
            - BACKWARD
            - BACKWARD_TRANSITIVE
            - FORWARD
            - FORWARD_TRANSITIVE
            - FULL
            - FULL_TRANSITIVE
            - NONE
      required:
        - compatibility

    SchemaType:
      type: string
      description: upon updating a schema, the type of an existing schema can't be changed
      enum:
        - AVRO
        - JSON
        - PROTOBUF

    CompatibilityCheckResponse:
      type: object
      properties:
        isCompatible:
          type: boolean
      required:
        - isCompatible

    SchemaSubjectsResponse:
      type: object
      properties:
        pageCount:
          type: integer
        schemas:
          type: array
          items:
            $ref: '#/components/schemas/SchemaSubject'

    Connect:
      type: object
      properties:
        name:
          type: string
        address:
          type: string
      required:
        - name

    ConnectorConfig:
      type: object
      additionalProperties:
        type: object

    TaskId:
      type: object
      properties:
        connector:
          type: string
        task:
          type: integer

    Task:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/TaskId'
        status:
          $ref: '#/components/schemas/TaskStatus'
        config:
          $ref: '#/components/schemas/ConnectorConfig'
      required:
        - status

    NewConnector:
      type: object
      properties:
        name:
          type: string
        config:
          $ref: '#/components/schemas/ConnectorConfig'
      required:
        - name
        - config

    Connector:
      allOf:
        - $ref: '#/components/schemas/NewConnector'
        - type: object
          properties:
            tasks:
              type: array
              items:
                $ref: '#/components/schemas/TaskId'
            type:
              $ref: '#/components/schemas/ConnectorType'
            status:
              $ref: '#/components/schemas/ConnectorStatus'
            connect:
              type: string
          required:
            - type
            - status
            - connect

    ConnectorType:
      type: string
      enum:
        - SOURCE
        - SINK

    ConsumerGroupOffsetsReset:
      type: object
      properties:
        topic:
          type: string
        resetType:
          $ref: '#/components/schemas/ConsumerGroupOffsetsResetType'
        partitions:
          type: array
          items:
            type: integer
          description: list of target partitions, all partitions will be used if it is not set or empty
        resetToTimestamp:
          type: integer
          format: int64
          description: should be set if resetType is TIMESTAMP
        partitionsOffsets:
          type: array
          items:
            $ref: '#/components/schemas/PartitionOffset'
          description: List of partition offsets to reset to, should be set when resetType is OFFSET
      required:
        - topic
        - resetType

    PartitionOffset:
      type: object
      properties:
        partition:
          type: integer
        offset:
          type: integer
          format: int64
      required:
        - partition

    ConsumerGroupOffsetsResetType:
      type: string
      enum:
        - EARLIEST
        - LATEST
        - TIMESTAMP
        - OFFSET

    TaskStatus:
      type: object
      properties:
        id:
          type: integer
        state:
          $ref: '#/components/schemas/ConnectorTaskStatus'
        worker_id:
          type: string
        trace:
          type: string
      required:
        - id
        - state
        - worker_id

    ConnectorStatus:
      type: object
      properties:
        state:
          $ref: '#/components/schemas/ConnectorState'
        worker_id:
          type: string
      required:
        - state

    ConnectorTaskStatus:
      type: string
      enum:
        - RUNNING
        - FAILED
        - PAUSED
        - RESTARTING
        - UNASSIGNED

    ConnectorState:
      type: string
      enum:
        - RUNNING
        - FAILED
        - PAUSED
        - UNASSIGNED
        - TASK_FAILED

    ConnectorAction:
      type: string
      enum:
        - RESTART
        - RESTART_ALL_TASKS
        - RESTART_FAILED_TASKS
        - PAUSE
        - RESUME

    TaskAction:
      type: string
      enum:
        - restart

    ConnectorPlugin:
      type: object
      properties:
        class:
          type: string

    ConnectorPluginConfigDefinition:
      type: object
      properties:
        name:
          type: string
        type:
          type: string
          enum:
            - BOOLEAN
            - CLASS
            - DOUBLE
            - INT
            - LIST
            - LONG
            - PASSWORD
            - SHORT
            - STRING
        required:
          type: boolean
        default_value:
          type: string
        importance:
          type: string
          enum:
            - LOW
            - MEDIUM
            - HIGH
        documentation:
          type: string
        group:
          type: string
        width:
          type: string
          enum:
            - SHORT
            - MEDIUM
            - LONG
            - NONE
        display_name:
          type: string
        dependents:
          type: array
          items:
            type: string
        order:
          type: integer

    ConnectorPluginConfigValue:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        recommended_values:
          type: array
          items:
            type: string
        errors:
          type: array
          items:
            type: string
        visible:
          type: boolean

    ConnectorPluginConfig:
      type: object
      properties:
        definition:
          $ref: '#/components/schemas/ConnectorPluginConfigDefinition'
        value:
          $ref: '#/components/schemas/ConnectorPluginConfigValue'

    ConnectorPluginConfigValidationResponse:
      type: object
      properties:
        name:
          type: string
        error_count:
          type: integer
        groups:
          type: array
          items:
            type: string
        configs:
          type: array
          items:
            $ref: '#/components/schemas/ConnectorPluginConfig'

    KsqlCommandV2:
      type: object
      properties:
        ksql:
          type: string
        streamsProperties:
          type: object
          additionalProperties:
            type: string
      required:
        - ksql

    KsqlCommandV2Response:
      type: object
      properties:
        pipeId:
          type: string
      required:
        - pipeId

    KsqlTableDescription:
      type: object
      properties:
        name:
          type: string
        topic:
          type: string
        keyFormat:
          type: string
        valueFormat:
          type: string
        isWindowed:
          type: boolean

    KsqlStreamDescription:
      type: object
      properties:
        name:
          type: string
        topic:
          type: string
        keyFormat:
          type: string
        valueFormat:
          type: string

    KsqlResponse:
      type: object
      properties:
        table:
          $ref: '#/components/schemas/KsqlTableResponse'

    KsqlTableResponse:
      type: object
      properties:
        header:
          type: string
        columnNames:
          type: array
          items:
            type: string
        values:
          type: array
          items:
            type: array
            items:
              type: object

    FullConnectorInfo:
      type: object
      properties:
        connect:
          type: string
        name:
          type: string
        connector_class:
          type: string
        type:
          $ref: '#/components/schemas/ConnectorType'
        topics:
          type: array
          items:
            type: string
        status:
          $ref: '#/components/schemas/ConnectorStatus'
        tasks_count:
          type: integer
        failed_tasks_count:
          type: integer
      required:
        - name
        - connect
        - status

    PartitionsIncrease:
      type: object
      properties:
        totalPartitionsCount:
          type: integer
          minimum: 1
      required:
        - totalPartitionsCount

    PartitionsIncreaseResponse:
      type: object
      properties:
        totalPartitionsCount:
          type: integer
        topicName:
          type: string
      required:
        - totalPartitionsCount
        - topicName

    ReplicationFactorChange:
      type: object
      properties:
        totalReplicationFactor:
          type: integer
      required:
        - totalReplicationFactor

    ReplicationFactorChangeResponse:
      type: object
      properties:
        totalReplicationFactor:
          type: integer
        topicName:
          type: string
      required:
        - totalReplicationFactor
        - topicName

    BrokerConfigItem:
      type: object
      properties:
        value:
          type: string

    BrokerConfig:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        source:
          $ref: '#/components/schemas/ConfigSource'
        isSensitive:
          type: boolean
        isReadOnly:
          type: boolean
        synonyms:
          type: array
          items:
            $ref: '#/components/schemas/ConfigSynonym'
      required:
        - name
        - value
        - source
        - isSensitive
        - isReadOnly

    ConfigSource:
      type: string
      enum:
        - DYNAMIC_TOPIC_CONFIG
        - DYNAMIC_BROKER_LOGGER_CONFIG
        - DYNAMIC_BROKER_CONFIG
        - DYNAMIC_DEFAULT_BROKER_CONFIG
        - STATIC_BROKER_CONFIG
        - DEFAULT_CONFIG
        - UNKNOWN

    ConfigSynonym:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        source:
          $ref: '#/components/schemas/ConfigSource'

    CleanUpPolicy:
      type: string
      enum:
        - DELETE
        - COMPACT
        - COMPACT_DELETE
        - UNKNOWN

    AuthenticationInfo:
      type: object
      properties:
        rbacEnabled:
          type: boolean
          description: true if role based access control is enabled and granular permission access is required
        userInfo:
          $ref: '#/components/schemas/UserInfo'
      required:
        - rbacEnabled

    UserInfo:
      type: object
      properties:
        username:
          type: string
        permissions:
          type: array
          items:
            $ref: '#/components/schemas/UserPermission'
      required:
        - username
        - permissions

    UserPermission:
      type: object
      properties:
        clusters:
          type: array
          items:
            type: string
        resource:
          $ref: '#/components/schemas/ResourceType'
        value:
          type: string
        actions:
          type: array
          items:
            $ref: '#/components/schemas/Action'
      required:
        - clusters
        - resource
        - actions

    Action:
      type: string
      enum:
        - VIEW
        - EDIT
        - CREATE
        - DELETE
        - RESET_OFFSETS
        - EXECUTE
        - MODIFY_GLOBAL_COMPATIBILITY
        - ANALYSIS_VIEW
        - ANALYSIS_RUN
        - MESSAGES_READ
        - MESSAGES_PRODUCE
        - MESSAGES_DELETE
        - RESTART

    ResourceType:
      type: string
      enum:
        - APPLICATIONCONFIG
        - CLUSTERCONFIG
        - TOPIC
        - CONSUMER
        - SCHEMA
        - CONNECT
        - KSQL
        - ACL
        - AUDIT
        - CLIENT_QUOTAS

    KafkaAcl:
      type: object
      required: [resourceType, resourceName, namePatternType, principal, host, operation, permission]
      properties:
        resourceType:
          $ref: '#/components/schemas/KafkaAclResourceType'
        resourceName:
          type: string # "*" if acl can be applied to any resource of given type
        namePatternType:
          $ref: '#/components/schemas/KafkaAclNamePatternType'
        principal:
          type: string
        host:
          type: string
        operation:
          type: string
          enum:
            - UNKNOWN # Unknown operation, need to update mapping code on BE
            - ALL # Cluster, Topic, Group
            - READ  # Topic, Group
            - WRITE # Topic, TransactionalId
            - CREATE # Cluster, Topic
            - DELETE  # Topic, Group
            - ALTER  # Cluster, Topic,
            - DESCRIBE # Cluster, Topic, Group, TransactionalId, DelegationToken
            - CLUSTER_ACTION # Cluster
            - DESCRIBE_CONFIGS # Cluster, Topic
            - ALTER_CONFIGS   # Cluster, Topic
            - IDEMPOTENT_WRITE # Cluster
            - CREATE_TOKENS
            - DESCRIBE_TOKENS
        permission:
          type: string
          enum:
            - ALLOW
            - DENY

    CreateConsumerAcl:
      type: object
      required: [principal, host]
      properties:
        principal:
          type: string
        host:
          type: string
        topics:
          type: array
          items:
            type: string
        topicsPrefix:
          type: string
        consumerGroups:
          type: array
          items:
            type: string
        consumerGroupsPrefix:
          type: string

    CreateProducerAcl:
      type: object
      required: [principal, host]
      properties:
        principal:
          type: string
        host:
          type: string
        topics:
          type: array
          items:
            type: string
        topicsPrefix:
          type: string
        transactionalId:
          type: string
        transactionsIdPrefix:
          type: string
        idempotent:
          type: boolean
          default: false

    CreateStreamAppAcl:
      type: object
      required: [principal, host, applicationId, inputTopics, outputTopics]
      properties:
        principal:
          type: string
        host:
          type: string
        inputTopics:
          type: array
          items:
            type: string
        outputTopics:
          type: array
          items:
            type: string
        applicationId:
          nullable: false
          type: string

    ClientQuotas:
      type: object
      properties:
        user:
          type: string
        clientId:
          type: string
        ip:
          type: string
        quotas:
          type: object
          additionalProperties:
            type: number

    KafkaAclResourceType:
      type: string
      enum:
        - UNKNOWN # Unknown operation, need to update mapping code on BE
        - TOPIC
        - GROUP
        - CLUSTER
        - TRANSACTIONAL_ID
        - DELEGATION_TOKEN
        - USER

    KafkaAclNamePatternType:
      type: string
      enum:
        - MATCH
        - LITERAL
        - PREFIXED

    RestartRequest:
      type: object
      properties:
        config:
          $ref: '#/components/schemas/ApplicationConfig'

    UploadedFileInfo:
      type: object
      required: [location]
      properties:
        location:
          type: string

    ApplicationConfigValidation:
      type: object
      properties:
        clusters:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/ClusterConfigValidation'

    ApplicationPropertyValidation:
      type: object
      required: [error]
      properties:
        error:
          type: boolean
        errorMessage:
          type: string
          description: Contains error message if error = true

    ClusterConfigValidation:
      type: object
      required: [kafka]
      properties:
        kafka:
          $ref: '#/components/schemas/ApplicationPropertyValidation'
        schemaRegistry:
          $ref: '#/components/schemas/ApplicationPropertyValidation'
        kafkaConnects:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/ApplicationPropertyValidation'
        ksqldb:
          $ref: '#/components/schemas/ApplicationPropertyValidation'

    ApplicationConfig:
      type: object
      properties:
        properties:
          type: object
          properties:
            auth:
              type: object
              properties:
                type:
                  type: string
                oauth2:
                  type: object
                  properties:
                    client:
                      type: object
                      additionalProperties:
                        type: object
                        properties:
                          provider:
                            type: string
                          clientId:
                            type: string
                          clientSecret:
                            type: string
                          clientName:
                            type: string
                          redirectUri:
                            type: string
                          authorizationGrantType:
                            type: string
                          issuerUri:
                            type: string
                          authorizationUri:
                            type: string
                          tokenUri:
                            type: string
                          userInfoUri:
                            type: string
                          jwkSetUri:
                            type: string
                          userNameAttribute:
                            type: string
                          scope:
                            type: array
                            items:
                              type: string
                          customParams:
                            type: object
                            additionalProperties:
                              type: string
            rbac:
              type: object
              properties:
                roles:
                  type: array
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                      clusters:
                        type: array
                        items:
                          type: string
                      subjects:
                        type: array
                        items:
                          type: object
                          properties:
                            provider:
                              type: string
                            type:
                              type: string
                            value:
                              type: string
                      permissions:
                        type: array
                        items:
                          type: object
                          properties:
                            resource:
                              $ref: '#/components/schemas/ResourceType'
                            value:
                              type: string
                            actions:
                              type: array
                              items:
                                $ref: '#/components/schemas/Action'
            webclient:
              type: object
              properties:
                maxInMemoryBufferSize:
                  type: string
                  description: "examples: 20, 12KB, 5MB"
            kafka:
              type: object
              properties:
                polling:
                  type: object
                  properties:
                    pollTimeoutMs:
                      type: integer
                    maxPageSize:
                      type: integer
                    defaultPageSize:
                      type: integer
                adminClientTimeout:
                  type: integer
                internalTopicPrefix:
                  type: string
                clusters:
                  type: array
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                      bootstrapServers:
                        type: string
                      ssl:
                        type: object
                        properties:
                          truststoreLocation:
                            type: string
                          truststorePassword:
                            type: string
                      schemaRegistry:
                        type: string
                      schemaRegistryAuth:
                        type: object
                        properties:
                          username:
                            type: string
                          password:
                            type: string
                      schemaRegistrySsl:
                        type: object
                        properties:
                          keystoreLocation:
                            type: string
                          keystorePassword:
                            type: string
                      ksqldbServer:
                        type: string
                      ksqldbServerSsl:
                        type: object
                        properties:
                          keystoreLocation:
                            type: string
                          keystorePassword:
                              type: string
                      ksqldbServerAuth:
                        type: object
                        properties:
                          username:
                            type: string
                          password:
                            type: string
                      kafkaConnect:
                        type: array
                        items:
                          type: object
                          properties:
                            name:
                              type: string
                            address:
                              type: string
                            username:
                              type: string
                            password:
                              type: string
                            keystoreLocation:
                              type: string
                            keystorePassword:
                              type: string

                      metrics:
                        type: object
                        properties:
                          type:
                            type: string
                          port:
                            type: integer
                            format: int32
                          ssl:
                            type: boolean
                          username:
                            type: string
                          password:
                            type: string
                          keystoreLocation:
                            type: string
                          keystorePassword:
                            type: string
                      properties:
                        type: object
                        additionalProperties: true
                      readOnly:
                        type: boolean
                      disableLogDirsCollection:
                        type: boolean
                      serde:
                        type: array
                        items:
                          type: object
                          properties:
                            name:
                              type: string
                            className:
                              type: string
                            filePath:
                              type: string
                            properties:
                              type: object
                              additionalProperties: true
                            topicKeysPattern:
                              type: string
                            topicValuesPattern:
                              type: string
                      defaultKeySerde:
                        type: string
                      defaultValueSerde:
                        type: string
                      masking:
                        type: array
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              enum:
                                - REMOVE
                                - MASK
                                - REPLACE
                            fields:
                              type: array
                              items:
                                type: string
                            fieldsNamePattern:
                              type: string
                            maskingCharsReplacement:
                              type: array
                              items:
                                type: string
                            replacement:
                              type: string
                            topicKeysPattern:
                              type: string
                            topicValuesPattern:
                              type: string
                      pollingThrottleRate:
                        type: integer
                        format: int64
                      audit:
                        type: object
                        properties:
                          level:
                            type: string
                            enum: [ "ALL", "ALTER_ONLY" ]
                          topic:
                            type: string
                          auditTopicsPartitions:
                            type: integer
                          topicAuditEnabled:
                            type: boolean
                          consoleAuditEnabled:
                            type: boolean
                          auditTopicProperties:
                            type: object
                            additionalProperties:
                              type: string
