pulsar-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From si...@apache.org
Subject [incubator-pulsar] branch master updated: [website] Render Pulsar REST API in ReDoc and Fix endpoint template (#2274)
Date Wed, 01 Aug 2018 08:19:39 GMT
This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b77a23   [website] Render Pulsar REST API in ReDoc and Fix endpoint template (#2274)
6b77a23 is described below

commit 6b77a23564a805096b0f9b6a2f7153ac8b0c3ec3
Author: Sijie Guo <guosijie@gmail.com>
AuthorDate: Wed Aug 1 01:19:37 2018 -0700

     [website] Render Pulsar REST API in ReDoc and Fix endpoint template (#2274)
    
    * Update swagger version
    
    * [website] Render Pulsar REST API in ReDoc and Fix endpoint template
    
     ### Motivation
    
    [ReDoc](https://github.com/Rebilly/ReDoc) provides a good mechanism to load OpenAPI/Swagger-generated API reference documentation.
    
     ### Changes
    
    - Use ReDoc to load the pulsar swagger definition
    - Fix the rest admin api references and `endpoint` macros
    
    * Address comments
---
 pom.xml                                            |    6 +-
 pulsar-broker-shaded/pom.xml                       |    1 -
 pulsar-broker/pom.xml                              |    9 +-
 .../apache/pulsar/broker/admin/v1/BrokerStats.java |    3 +-
 .../org/apache/pulsar/broker/admin/v1/Brokers.java |    2 +-
 .../apache/pulsar/broker/admin/v1/Clusters.java    |    2 +-
 .../apache/pulsar/broker/admin/v1/Functions.java   |    2 +-
 .../apache/pulsar/broker/admin/v1/Namespaces.java  |    8 +-
 .../broker/admin/v1/NonPersistentTopics.java       |    3 +-
 .../pulsar/broker/admin/v1/PersistentTopics.java   |    2 +-
 .../apache/pulsar/broker/admin/v1/Properties.java  |    2 +-
 .../pulsar/broker/admin/v1/ResourceQuotas.java     |    2 +-
 .../apache/pulsar/broker/admin/v2/Functions.java   |    5 +-
 pulsar-discovery-service/pom.xml                   |    2 +-
 site2/docs/admin-api-brokers.md                    |   24 +-
 site2/docs/admin-api-clusters.md                   |   26 +-
 site2/docs/admin-api-namespaces.md                 |   20 +-
 site2/docs/admin-api-non-persistent-topics.md      |   25 +-
 site2/docs/admin-api-overview.md                   |    6 +-
 site2/docs/admin-api-partitioned-topics.md         |   42 +-
 site2/docs/admin-api-persistent-topics.md          |  120 +-
 site2/docs/administration-geo.md                   |    2 +-
 site2/docs/administration-zk-bk.md                 |   12 +-
 site2/docs/cookbooks-compaction.md                 |    2 +-
 site2/docs/cookbooks-retention-expiry.md           |   49 +-
 .../getting-started-concepts-and-architecture.md   |    4 +-
 site2/docs/reference-rest-api.md                   |    8 -
 site2/website/package.json                         |    5 +-
 site2/website/pages/en/admin-rest-api.js           |   26 +-
 site2/website/sidebars.json                        |    2 +-
 site2/website/siteConfig.js                        |   19 +
 site2/website/static/swagger/swagger.json          | 9038 +++++---------------
 src/gen-swagger.sh                                 |   31 +
 33 files changed, 2461 insertions(+), 7049 deletions(-)

diff --git a/pom.xml b/pom.xml
index c0e23b4..30aedf6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -612,13 +612,13 @@ flexible messaging model and an intuitive client API.</description>
       <dependency>
         <groupId>io.swagger</groupId>
         <artifactId>swagger-core</artifactId>
-        <version>1.5.3</version>
+        <version>1.5.20</version>
       </dependency>
 
       <dependency>
-        <groupId>com.wordnik</groupId>
+        <groupId>io.swagger</groupId>
         <artifactId>swagger-annotations</artifactId>
-        <version>1.5.3-M1</version>
+        <version>1.5.20</version>
       </dependency>
 
       <dependency>
diff --git a/pulsar-broker-shaded/pom.xml b/pulsar-broker-shaded/pom.xml
index 1adc84f..08ce298 100644
--- a/pulsar-broker-shaded/pom.xml
+++ b/pulsar-broker-shaded/pom.xml
@@ -103,7 +103,6 @@
                   <include>com.github.zafarkhaja:java-semver</include>
                   <include>org.aspectj:*</include>
                   <include>com.ea.agentloader:*</include>
-                  <include>com.wordnik:swagger-annotations</include>
                   <include>org.apache.httpcomponents:httpclient</include>
                   <include>commons-logging:commons-logging</include>
                   <include>org.apache.httpcomponents:httpcore</include>
diff --git a/pulsar-broker/pom.xml b/pulsar-broker/pom.xml
index ac264bd..296799c 100644
--- a/pulsar-broker/pom.xml
+++ b/pulsar-broker/pom.xml
@@ -206,7 +206,7 @@
     </dependency>
 
     <dependency>
-      <groupId>com.wordnik</groupId>
+      <groupId>io.swagger</groupId>
       <artifactId>swagger-annotations</artifactId>
     </dependency>
 
@@ -361,12 +361,11 @@
                   <springmvc>false</springmvc>
                   <locations>org.apache.pulsar.broker.admin</locations>
                   <schemes>http,https</schemes>
-                  <basePath>/admin</basePath>
+                  <basePath>/admin/v2</basePath>
                   <info>
                     <title>Pulsar Admin REST API</title>
-                    <version>v1</version>
-                    <description>This provides the REST API for admin
-                      operations</description>
+                    <version>v2</version>
+                    <description>This provides the REST API for admin operations</description>
                     <license>
                       <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
                       <name>Apache 2.0</name>
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/BrokerStats.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/BrokerStats.java
index 76aea67..1b3e028 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/BrokerStats.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/BrokerStats.java
@@ -24,7 +24,6 @@ import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.apache.pulsar.broker.admin.impl.BrokerStatsBase;
 import org.apache.pulsar.broker.loadbalance.ResourceUnit;
-import org.apache.pulsar.common.naming.NamespaceName;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -35,7 +34,7 @@ import java.util.Collection;
 import java.util.Map;
 
 @Path("/broker-stats")
-@Api(value = "/broker-stats", description = "Stats for broker", tags = "broker-stats")
+@Api(value = "/broker-stats", description = "Stats for broker", tags = "broker-stats", hidden = true)
 @Produces(MediaType.APPLICATION_JSON)
 public class BrokerStats extends BrokerStatsBase {
 
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Brokers.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Brokers.java
index 3b7af34..79f31dd 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Brokers.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Brokers.java
@@ -26,7 +26,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 @Path("/brokers")
-@Api(value = "/brokers", description = "BrokersBase admin apis", tags = "brokers")
+@Api(value = "/brokers", description = "BrokersBase admin apis", tags = "brokers", hidden = true)
 @Produces(MediaType.APPLICATION_JSON)
 public class Brokers extends BrokersBase {
 }
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Clusters.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Clusters.java
index 7cd5ccd..6aaee8f 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Clusters.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Clusters.java
@@ -26,7 +26,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 @Path("/clusters")
-@Api(value = "/clusters", description = "Cluster admin apis", tags = "clusters")
+@Api(value = "/clusters", description = "Cluster admin apis", tags = "clusters", hidden = true)
 @Produces(MediaType.APPLICATION_JSON)
 public class Clusters extends ClustersBase {
 }
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Functions.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Functions.java
index 1740732..7eca553 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Functions.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Functions.java
@@ -23,6 +23,6 @@ import javax.ws.rs.Path;
 import org.apache.pulsar.broker.admin.impl.FunctionsBase;
 
 @Path("/functions")
-@Api(value = "/functions", description = "Functions admin apis", tags = "functions")
+@Api(value = "/functions", description = "Functions admin apis", tags = "functions", hidden = true)
 public class Functions extends FunctionsBase {
 }
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java
index bbc4438..6b607ab 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Namespaces.java
@@ -18,13 +18,10 @@
  */
 package org.apache.pulsar.broker.admin.v1;
 
-import static org.apache.commons.lang3.StringUtils.isBlank;
 import static org.apache.pulsar.broker.cache.ConfigurationCacheService.POLICIES;
-import static org.apache.pulsar.broker.cache.ConfigurationCacheService.POLICIES_ROOT;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 
 import javax.ws.rs.Consumes;
@@ -40,10 +37,8 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response.Status;
 
-import org.apache.pulsar.broker.admin.AdminResource;
 import org.apache.pulsar.broker.admin.impl.NamespacesBase;
 import org.apache.pulsar.broker.web.RestException;
-import org.apache.pulsar.common.naming.NamespaceName;
 import org.apache.pulsar.common.policies.data.AuthAction;
 import org.apache.pulsar.common.policies.data.BacklogQuota;
 import org.apache.pulsar.common.policies.data.BacklogQuota.BacklogQuotaType;
@@ -54,7 +49,6 @@ import org.apache.pulsar.common.policies.data.Policies;
 import org.apache.pulsar.common.policies.data.RetentionPolicies;
 import org.apache.pulsar.common.policies.data.SubscriptionAuthMode;
 import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,7 +62,7 @@ import io.swagger.annotations.ApiResponses;
 @Path("/namespaces")
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
-@Api(value = "/namespaces", description = "Namespaces admin apis", tags = "namespaces")
+@Api(value = "/namespaces", description = "Namespaces admin apis", tags = "namespaces", hidden = true)
 @SuppressWarnings("deprecation")
 public class Namespaces extends NamespacesBase {
 
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/NonPersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/NonPersistentTopics.java
index f73a829..f6d8640 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/NonPersistentTopics.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/NonPersistentTopics.java
@@ -41,7 +41,6 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.pulsar.broker.PulsarServerException;
-import org.apache.pulsar.broker.service.BrokerService;
 import org.apache.pulsar.broker.service.Topic;
 import org.apache.pulsar.broker.service.nonpersistent.NonPersistentTopic;
 import org.apache.pulsar.broker.web.RestException;
@@ -62,7 +61,7 @@ import org.slf4j.LoggerFactory;
  */
 @Path("/non-persistent")
 @Produces(MediaType.APPLICATION_JSON)
-@Api(value = "/non-persistent", description = "Non-Persistent topic admin apis", tags = "non-persistent topic")
+@Api(value = "/non-persistent", description = "Non-Persistent topic admin apis", tags = "non-persistent topic", hidden = true)
 @SuppressWarnings("deprecation")
 public class NonPersistentTopics extends PersistentTopics {
     private static final Logger log = LoggerFactory.getLogger(NonPersistentTopics.class);
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/PersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/PersistentTopics.java
index 1ebb79a..b5fd76c 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/PersistentTopics.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/PersistentTopics.java
@@ -58,7 +58,7 @@ import io.swagger.annotations.ApiResponses;
  */
 @Path("/persistent")
 @Produces(MediaType.APPLICATION_JSON)
-@Api(value = "/persistent", description = "Persistent topic admin apis", tags = "persistent topic")
+@Api(value = "/persistent", description = "Persistent topic admin apis", tags = "persistent topic", hidden = true)
 @SuppressWarnings("deprecation")
 public class PersistentTopics extends PersistentTopicsBase {
 
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Properties.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Properties.java
index 20a20b0..b8a6b64 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Properties.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/Properties.java
@@ -29,6 +29,6 @@ import javax.ws.rs.core.MediaType;
 @Path("/properties")
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
-@Api(value = "/properties", description = "TenantsBase admin apis", tags = "properties")
+@Api(value = "/properties", description = "TenantsBase admin apis", tags = "properties", hidden = true)
 public class Properties extends TenantsBase {
 }
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/ResourceQuotas.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/ResourceQuotas.java
index fb77ee0..6fcf14e 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/ResourceQuotas.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v1/ResourceQuotas.java
@@ -38,7 +38,7 @@ import io.swagger.annotations.ApiResponses;
 @Path("/resource-quotas")
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
-@Api(value = "/resource-quotas", description = "Quota admin APIs", tags = "resource-quotas")
+@Api(value = "/resource-quotas", description = "Quota admin APIs", tags = "resource-quotas", hidden = true)
 public class ResourceQuotas extends ResourceQuotasBase {
 
     @GET
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java
index b91e533..854a365 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Functions.java
@@ -18,8 +18,7 @@
  */
 package org.apache.pulsar.broker.admin.v2;
 
-import com.wordnik.swagger.annotations.Api;
-
+import io.swagger.annotations.Api;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
@@ -28,7 +27,7 @@ import javax.ws.rs.core.MediaType;
 import org.apache.pulsar.broker.admin.impl.FunctionsBase;
 
 @Path("/functions")
-@Api(value = "/functions", description = "Functions admin apis", tags = "functions")
+@Api(value = "/functions", description = "Functions admin apis", tags = "functions", hidden = true)
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
 public class Functions extends FunctionsBase {
diff --git a/pulsar-discovery-service/pom.xml b/pulsar-discovery-service/pom.xml
index 259f0a9..d838740 100644
--- a/pulsar-discovery-service/pom.xml
+++ b/pulsar-discovery-service/pom.xml
@@ -123,7 +123,7 @@
     </dependency>
 
     <dependency>
-      <groupId>com.wordnik</groupId>
+      <groupId>io.swagger</groupId>
       <artifactId>swagger-annotations</artifactId>
     </dependency>
 
diff --git a/site2/docs/admin-api-brokers.md b/site2/docs/admin-api-brokers.md
index 3d7ea5c..99daad1 100644
--- a/site2/docs/admin-api-brokers.md
+++ b/site2/docs/admin-api-brokers.md
@@ -6,13 +6,13 @@ sidebar_label: Brokers
 
 Pulsar brokers consist of two components:
 
-1. An HTTP server exposing a [REST interface](reference-rest-api.md) administration and [topic](reference-terminology.md#topic) lookup.
+1. An HTTP server exposing a {@inject: rest:REST:/} interface administration and [topic](reference-terminology.md#topic) lookup.
 2. A dispatcher that handles all Pulsar [message](reference-terminology.md#message) transfers.
 
 [Brokers](reference-terminology.md#broker) can be managed via:
 
 * The [`brokers`](reference-pulsar-admin.md#brokers) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
-* The `/admin/v2/brokers` endpoint of the admin [REST API](reference-rest-api.md)
+* The `/admin/v2/brokers` endpoint of the admin {@inject: rest:REST:/} API
 * The `brokers` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin.html} object in the [Java API](client-libraries-java.md)
 
 In addition to being configurable when you start them up, brokers can also be [dynamically configured](#dynamic-broker-configuration).
@@ -38,9 +38,7 @@ broker1.use.org.com:8080
 
 ###### REST
 
-{% endpoint GET /admin/v2/brokers/:cluster %}
-
-[More info](reference-rest-api.md#/admin/brokers/:cluster)
+{@inject: endpoint|GET|/admin/v2/brokers/:cluster|operation/getActiveBrokers}
 
 ###### Java
 
@@ -70,7 +68,7 @@ $ pulsar-admin brokers namespaces use \
 ```
 ###### REST
 
-{% endpoint GET /admin/v2/brokers/:cluster/:broker:/ownedNamespaces %}
+{@inject: endpoint|GET|/admin/v2/brokers/:cluster/:broker/ownedNamespaces|operation/getOwnedNamespaes}
 
 ###### Java
 
@@ -85,7 +83,7 @@ One way to configure a Pulsar [broker](reference-terminology.md#broker) is to su
 But since all broker configuration in Pulsar is stored in ZooKeeper, configuration values can also be dynamically updated *while the broker is running*. When you update broker configuration dynamically, ZooKeeper will notify the broker of the change and the broker will then override any existing configuration values.
 
 * The [`brokers`](reference-pulsar-admin.md#brokers) command for the [`pulsar-admin`](reference-pulsar-admin.md) tool has a variety of subcommands that enable you to manipulate a broker's configuration dynamically, enabling you to [update config values](#update-dynamic-configuration) and more.
-* In the Pulsar admin [REST API](reference-rest-api.md), dynamic configuration is managed through the `/admin/v2/brokers/configuration` endpoint.
+* In the Pulsar admin {@inject: rest:REST:/} API, dynamic configuration is managed through the `/admin/v2/brokers/configuration` endpoint.
 
 ### Update dynamic configuration
 
@@ -99,9 +97,7 @@ $ pulsar-admin brokers update-dynamic-config brokerShutdownTimeoutMs 100
 
 #### REST API
 
-{% endpoint POST /admin/v2/brokers/configuration/:configName/:configValue %}
-
-[More info](reference-rest-api.md#/admin/brokers/configuration/:configName/:configValue)
+{@inject: endpoint|POST|/admin/v2/brokers/configuration/:configName/:configValue|operation/updateDynamicConfiguration}
 
 #### Java
 
@@ -122,9 +118,7 @@ brokerShutdownTimeoutMs
 
 #### REST API
 
-{% endpoint GET /admin/v2/brokers/configuration %}
-
-[More info](reference-rest-api.md#/admin/brokers/configuration)
+{@inject: endpoint|GET|/admin/v2/brokers/configuration|operation/getDynamicConfigurationName}
 
 #### Java
 
@@ -145,9 +139,7 @@ brokerShutdownTimeoutMs:100
 
 #### REST API
 
-{% endpoint GET /admin/v2/brokers/configuration/values %}
-
-[More info](reference-rest-api.md#/admin/brokers/configuration/values)
+{@inject: endpoint|GET|/admin/v2/brokers/configuration/values|operation/getAllDynamicConfigurations}
 
 #### Java
 
diff --git a/site2/docs/admin-api-clusters.md b/site2/docs/admin-api-clusters.md
index eb873ef..d593a93 100644
--- a/site2/docs/admin-api-clusters.md
+++ b/site2/docs/admin-api-clusters.md
@@ -10,7 +10,7 @@ servers (aka [bookies](reference-terminology.md#bookie)), and a [ZooKeeper](http
 Clusters can be managed via:
 
 * The [`clusters`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
-* The `/admin/v2/clusters` endpoint of the admin [REST API](reference-rest-api.md)
+* The `/admin/v2/clusters` endpoint of the admin {@inject: rest:REST:/} API
 * The `clusters` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin} object in the [Java API](client-libraries-java.md)
 
 ## Clusters resources
@@ -33,9 +33,7 @@ $ pulsar-admin clusters create cluster-1 \
 
 #### REST API
 
-{% endpoint PUT /admin/v2/clusters/:cluster %}
-
-[More info](reference-rest-api.md#/admin/clusters/:cluster)
+{@inject: endpoint|PUT|/admin/v2/clusters/:cluster|operation/createCluster}
 
 #### Java
 
@@ -104,9 +102,7 @@ $ pulsar-admin clusters get cluster-1
 
 #### REST API
 
-{% endpoint GET /admin/v2/clusters/:cluster %}
-
-[More info](reference-rest-api.md#/admin/clusters/:cluster)
+{@inject: endpoint|GET|/admin/v2/clusters/:cluster|operation/getCluster}
 
 #### Java
 
@@ -130,9 +126,7 @@ $ pulsar-admin clusters update cluster-1 \
 
 #### REST
 
-{% endpoint POST /admin/v2/clusters/:cluster %}
-
-[More info](reference-rest-api.md#/admin/clusters/:cluster)
+{@inject: endpoint|POST|/admin/v2/clusters/:cluster|operation/updateCluster}
 
 #### Java
 
@@ -160,9 +154,7 @@ $ pulsar-admin clusters delete cluster-1
 
 #### REST API
 
-{% endpoint DELETE /admin/v2/clusters/:cluster %}
-
-[More info](reference-rest-api.md#/admin/clusters/:cluster)
+{@inject: endpoint|DELETE|/admin/v2/clusters/:cluster|operation/deleteCluster}
 
 #### Java
 
@@ -186,9 +178,7 @@ cluster-2
 
 #### REST API
 
-{% endpoint GET /admin/v2/clusters %}
-
-[More info](reference-rest-api.md#/admin/clusters)
+{@inject: endpoint|GET|/admin/v2/clusters|operation/getClusters}
 
 ###### Java
 
@@ -210,9 +200,7 @@ $ pulsar-admin update-peer-clusters cluster-1 --peer-clusters cluster-2
 
 #### REST API
 
-{% endpoint POST /admin/v2/clusters/:cluster/peers %}
-
-[More info](reference-rest-api.md#/admin/clusters/:cluster/peers)
+{@inject: endpoint|POST|/admin/v2/clusters/:cluster/peers|operation/setPeerClusterNames}
 
 #### Java
 
diff --git a/site2/docs/admin-api-namespaces.md b/site2/docs/admin-api-namespaces.md
index a203c83..52ba7ab 100644
--- a/site2/docs/admin-api-namespaces.md
+++ b/site2/docs/admin-api-namespaces.md
@@ -9,7 +9,7 @@ Pulsar [namespaces](reference-terminology.md#namespace) are logical groupings of
 Namespaces can be managed via:
 
 * The [`namespaces`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
-* The `/admin/v2/namespaces` endpoint of the admin [REST API](reference-rest-api.md)
+* The `/admin/v2/namespaces` endpoint of the admin {@inject: rest:REST:/} API
 * The `namespaces` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin} object in the [Java API](client-libraries-java.md)
 
 ## Namespaces resources
@@ -28,9 +28,7 @@ $ pulsar-admin namespaces create test-tenant/test-namespace
 
 #### REST API
 
-{% endpoint PUT /admin/v2/namespaces/:tenant/:namespace %}
-
-[More info](reference-rest-api.md#/admin/namespaces/:tenant/:namespace)
+{@inject: endpoint|PUT|/admin/v2/namespaces/:tenant/:namespace|operation/createNamespace}
 
 #### Java
 
@@ -73,9 +71,7 @@ $ pulsar-admin namespaces policies test-tenant/test-namespace
 
 #### REST API
 
-{% endpoint GET /admin/v2/namespaces/:tenant/:namespace %}
-
-[More info](reference-rest-api.md#/admin/namespaces/:tenant/:namespace)
+{@inject: endpoint|GET|/admin/v2/namespaces/:tenant/:namespace|operation/getPolicies}
 
 #### Java
 
@@ -99,9 +95,7 @@ test-tenant/ns2
 
 #### REST API
 
-{% endpoint GET /admin/v2/namespaces/:tenant %}
-
-[More info](reference-rest-api.md#/admin/namespaces/:tenant)
+{@inject: endpoint|GET|/admin/v2/namespaces/:tenant|operation/getTenantNamespaces}
 
 #### Java
 
@@ -130,9 +124,7 @@ $ pulsar-admin namespaces delete test-tenant/ns1
 
 #### REST
 
-{% endpoint DELETE /admin/v2/namespaces/:tenant/:namespace %}
-
-[More info](reference-rest-api.md#/admin/namespaces/:tenant/:namespace)
+{@inject: endpoint|DELETE|/admin/v2/namespaces/:tenant/:namespace|operation/deleteNamespace}
 
 #### Java
 
@@ -155,7 +147,7 @@ $ pulsar-admin namespaces set-clusters test-tenant/ns1 \
 ###### REST
 
 ```
-{% endpoint POST /admin/v2/namespaces/:tenant/:namespace/replication %}
+{@inject: endpoint POST|/admin/v2/namespaces/:tenant/:namespace/replication|operation/setNamespaceReplicationClusters}
 ```
 
 ###### Java
diff --git a/site2/docs/admin-api-non-persistent-topics.md b/site2/docs/admin-api-non-persistent-topics.md
index 4a4d7ef..bf3fdd1 100644
--- a/site2/docs/admin-api-non-persistent-topics.md
+++ b/site2/docs/admin-api-non-persistent-topics.md
@@ -124,14 +124,14 @@ $ pulsar-admin non-persistent stats \
 
 #### REST API
 
-{% endpoint GET /admin/v2/non-persistent/:tenant/:namespace/:destination/stats %}
+{@inject: endpoint|GET|/admin/v2/non-persistent/:tenant/:namespace/:topic/stats|operation/getStats}
 
 
 #### Java
 
 ```java
-String destination = "non-persistent://my-tenant/my-namespace/my-topic";
-admin.nonPersistentTopics().getStats(destination);
+String topic = "non-persistent://my-tenant/my-namespace/my-topic";
+admin.nonPersistentTopics().getStats(topic);
 ```
 
 ### Get internal stats
@@ -165,14 +165,13 @@ $ pulsar-admin non-persistent stats-internal \
 
 #### REST API
 
-{% endpoint GET /admin/v2/non-persistent/:tenant/:namespace/:destination/internalStats %}
-
+{@inject: endpoint|GET|/admin/v2/non-persistent/:tenant/:namespace/:topic/internalStats|operation/getInternalStats}
 
 #### Java
 
 ```java
-String destination = "non-persistent://my-tenant/my-namespace/my-topic";
-admin.nonPersistentTopics().getInternalStats(destination);
+String topic = "non-persistent://my-tenant/my-namespace/my-topic";
+admin.nonPersistentTopics().getInternalStats(topic);
 ```
 
 ### Create partitioned topic
@@ -189,7 +188,7 @@ $ bin/pulsar-admin non-persistent create-partitioned-topic \
 
 #### REST API
 
-{% endpoint PUT /admin/v2/non-persistent/:tenant/:namespace/:destination/partitions %}
+{@inject: endpoint|PUT|/admin/v2/non-persistent/:tenant/:namespace/:topic/partitions|operation/createPartitionedTopic}
 
 #### Java
 
@@ -219,7 +218,7 @@ $ pulsar-admin non-persistent get-partitioned-topic-metadata \
 
 #### REST API
 
-{% endpoint GET /admin/v2/non-persistent/:tenant/:namespace/:destination/partitions %}
+{@inject: endpoint|GET|/admin/v2/non-persistent/:tenant/:namespace/:topic/partitions|operation/getPartitionedMetadata}
 
 
 #### Java
@@ -244,13 +243,11 @@ $ pulsar-admin non-persistent unload \
 
 #### REST API
 
-{% endpoint PUT /admin/v2/non-persistent/:tenant/:namespace/:destination/unload %}
-
-[More info](reference-rest-api.md#/admin/non-persistent/:tenant/:namespace/:destination/unload)
+{@inject: endpoint|PUT|/admin/v2/non-persistent/:tenant/:namespace/:topic/unload|operation/unloadTopic}
 
 #### Java
 
 ```java
-String destination = "non-persistent://my-tenantmy-namespace/my-topic";
-admin.nonPersistentTopics().unload(destination);
+String topic = "non-persistent://my-tenantmy-namespace/my-topic";
+admin.nonPersistentTopics().unload(topic);
 ```
diff --git a/site2/docs/admin-api-overview.md b/site2/docs/admin-api-overview.md
index db77a8d..7b48c86 100644
--- a/site2/docs/admin-api-overview.md
+++ b/site2/docs/admin-api-overview.md
@@ -8,7 +8,7 @@ The Pulsar admin interface enables you to manage all of the important entities i
 
 You can currently interact with the admin interface via:
 
-- Making HTTP calls against the admin [REST API](reference-rest-api.md) provided by Pulsar [brokers](reference-terminology.md#broker). For some restful apis, they might be redirected to topic owner brokers for serving
+- Making HTTP calls against the admin {@inject: rest:REST:/} API provided by Pulsar [brokers](reference-terminology.md#broker). For some restful apis, they might be redirected to topic owner brokers for serving
    with [`307 Temporary Redirect`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307), hence the HTTP callers should handle `307 Temporary Redirect`. If you are using `curl`, you should specify `-L`
    to handle redirections.
 - The `pulsar-admin` CLI tool, which is available in the `bin` folder of your [Pulsar installation](getting-started-standalone.md):
@@ -28,7 +28,7 @@ In this document, examples from each of the three available interfaces will be s
 
 ## Admin setup
 
-Each of Pulsar's three admin interfaces---the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, the [Java admin API](/api/admin), and the [REST API](reference-rest-api.md)---requires some special setup if you have [authentication](security-overview.md#authentication-providers) enabled in your Pulsar [instance](reference-terminology.md#instance).
+Each of Pulsar's three admin interfaces---the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, the [Java admin API](/api/admin), and the {@inject: rest:REST:/} API ---requires some special setup if you have [authentication](security-overview.md#authentication-providers) enabled in your Pulsar [instance](reference-terminology.md#instance).
 
 ### pulsar-admin
 
@@ -46,7 +46,7 @@ If you have [authentication](security-overview.md#authentication-providers) enab
 
 ### REST API
 
-You can find documentation for the REST API exposed by Pulsar [brokers](reference-terminology.md#broker) in [this reference document](reference-rest-api.md).
+You can find documentation for the REST API exposed by Pulsar [brokers](reference-terminology.md#broker) in this reference {@inject: rest:document:/}.
 
 ### Java admin client
 
diff --git a/site2/docs/admin-api-partitioned-topics.md b/site2/docs/admin-api-partitioned-topics.md
index 85f2d78..575b1ca 100644
--- a/site2/docs/admin-api-partitioned-topics.md
+++ b/site2/docs/admin-api-partitioned-topics.md
@@ -34,11 +34,7 @@ $ bin/pulsar-admin topics create-partitioned-topic \
 
 #### REST API
 
-```http
-PUT /admin/v2/persistent/:tenant/:namespace/:topic/partitions
-```
-
-[More info](reference-admin-rest-api.md#/admin/v2/persistent/:tenant/:namespace/:topic/partitions)
+{@inject: endpoint|PUT|/admin/v2/persistent/:tenant/:namespace/:topic/partitions|operation/createPartitionedTopic}
 
 #### Java
 
@@ -73,11 +69,7 @@ $ pulsar-admin topics get-partitioned-topic-metadata \
 
 #### REST API
 
-```http
-GET /admin/v2/persistent/:tenant/:namespace/:topic/partitions %}
-```
-
-[More info](reference-admin-rest-api.md#/admin/v2/persistent/:tenant/:namespace/:topic/partitions)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/partitions|operation/getPartitionedMetadata}
 
 #### Java
 
@@ -112,11 +104,7 @@ $ pulsar-admin topics update-partitioned-topic \
 
 #### REST API
 
-```http
-POST /admin/v2/persistent/:tenant/:cluster/:namespace/:destination/partitions
-```
-
-[More info](reference-rest-api.md#/admin/v2/persistent/:tenant/:namespace/:topic/partitions)
+{@inject: endpoint|POST|/admin/v2/persistent/:tenant/:cluster/:namespace/:destination/partitions|operation/updatePartitionedTopic}
 
 #### Java
 
@@ -138,11 +126,7 @@ $ bin/pulsar-admin topics delete-partitioned-topic \
 
 #### REST API
 
-```http
-DELETE /admin/v2/persistent/:topic/:namespace/:destination/partitions
-```
-
-[More info](reference-rest-api.md#/admin/v2/persistent/:tenant/:namespace/:topic/partitions)
+{@inject: endpoint|DELETE|/admin/v2/persistent/:topic/:namespace/:destination/partitions|operation/deletePartitionedTopic}
 
 #### Java
 
@@ -164,11 +148,7 @@ persistent://tenant/namespace/topic2
 
 #### REST API
 
-```http
-GET /admin/v2/persistent/:tenant/:namespace
-```
-
-[More info](reference-rest-api.md#/admin/v2/persistent/:tenant/:namespace)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace|operation/getPartitionedTopicList}
 
 #### Java
 
@@ -256,11 +236,7 @@ $ pulsar-admin topics partitioned-stats \
 
 #### REST API
 
-```http
-GET /admin/v2/persistent/:tenant/:namespace/:topic/partitioned-stats
-```
-
-[More info](reference-rest-api.md#/admin/v2/persistent/:tenant/:namespace/:topic/partitioned-stats)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/partitioned-stats|operation/getPartitionedStats}
 
 #### Java
 
@@ -347,11 +323,7 @@ $ pulsar-admin topics stats-internal \
 
 #### REST API
 
-```http
-GET /admin/v2/persistent/:tenant/:namespace/:topic/internalStats
-```
-
-[More info](reference-rest-api.md#/admin/v2/persistent/:tenant/:namespace/:topic/internalStats)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/internalStats|operation/getInternalStats}
 
 #### Java
 
diff --git a/site2/docs/admin-api-persistent-topics.md b/site2/docs/admin-api-persistent-topics.md
index b77db1e..ef9d18f 100644
--- a/site2/docs/admin-api-persistent-topics.md
+++ b/site2/docs/admin-api-persistent-topics.md
@@ -30,9 +30,7 @@ $ pulsar-admin persistent list \
 
 #### REST API
 
-{% endpoint GET /admin/v2/persistent/:tenant/:namespace %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace|operation/getList}
 
 #### Java
 
@@ -58,17 +56,15 @@ $ pulsar-admin persistent grant-permission \
 
 #### REST API
 
-{% endpoint POST /admin/v2/namespaces/:tenant/:namespace/permissions/:role %}
-
-[More info](../../reference/RestApi#/admin/namespaces/:tenant/:namespace/permissions/:role)
+{@inject: endpoint|POST|/admin/v2/persistent/:tenant/:namespace/:topic/permissions/:role|operation/grantPermissionsOnTopic}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String role = "test-role";
 Set<AuthAction> actions  = Sets.newHashSet(AuthAction.produce, AuthAction.consume);
-admin.persistentTopics().grantPermission(destination, role, actions);
+admin.persistentTopics().grantPermission(topic, role, actions);
 ```
 
 ### Get permission
@@ -91,15 +87,13 @@ $ pulsar-admin persistent permissions \
 
 #### REST API
 
-{% endpoint GET /admin/v2/namespaces/:tenant/:namespace/permissions %}
-
-[More info](../../reference/RestApi#/admin/namespaces/:tenant:namespace/permissions)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/permissions|operation/getPermissionsOnTopic}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.persistentTopics().getPermissions(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.persistentTopics().getPermissions(topic);
 ```
 
 ### Revoke permission
@@ -125,16 +119,14 @@ $ pulsar-admin persistent revoke-permission \
 
 #### REST API
 
-{% endpoint DELETE /admin/v2/namespaces/:tenant:namespace/permissions/:role %}
-
-[More info](../../reference/RestApi#/admin/namespaces/:tenant/:namespace/permissions/:role)
+{@inject: endpoint|DELETE|/admin/v2/persistent/:tenant/:namespace/:topic/permissions/:role|operation/revokePermissionsOnTopic}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String role = "test-role";
-admin.persistentTopics().revokePermissions(destination, role);
+admin.persistentTopics().revokePermissions(topic, role);
 ```
 
 ### Delete topic
@@ -152,15 +144,13 @@ $ pulsar-admin persistent delete \
 
 #### REST API
 
-{% endpoint DELETE /admin/v2/persistent/:tenant/:namespace/:destination %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination)
+{@inject: endpoint|DELETE|/admin/v2/persistent/:tenant/:namespace/:topic|operation/deleteTopic}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.persistentTopics().delete(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.persistentTopics().delete(topic);
 ```
 
 ### Unload topic
@@ -178,15 +168,13 @@ $ pulsar-admin persistent unload \
 
 #### REST API
 
-{% endpoint PUT /admin/v2/persistent/:tenant/:namespace/:destination/unload %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/unload)
+{@inject: endpoint|PUT|/admin/v2/persistent/:tenant/:namespace/:topic/unload|operation/unloadTopic}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.persistentTopics().unload(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.persistentTopics().unload(topic);
 ```
 
 ### Get stats
@@ -289,15 +277,13 @@ $ pulsar-admin persistent stats \
 
 #### REST API
 
-{% endpoint GET /admin/v2/persistent/:tenant/:namespace/:destination/stats %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant:namespace/:destination/stats)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/stats|operation/getStats}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.persistentTopics().getStats(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.persistentTopics().getStats(topic);
 ```
 
 ### Get internal stats
@@ -399,15 +385,13 @@ $ pulsar-admin persistent stats-internal \
 
 #### REST API
 
-{% endpoint GET /admin/v2/persistent/:tenant/:namespace/:destination/internalStats %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/internalStats)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/internalStats|operation/getInternalStats}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.persistentTopics().getInternalStats(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.persistentTopics().getInternalStats(topic);
 ```
 
 ### Peek messages
@@ -429,17 +413,15 @@ msg-payload
 
 #### REST API
 
-{% endpoint GET /admin/v2/persistent/:tenant/:namespace/:destination/subscription/:subName/position/:messagePosition %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/subscription/:subName/position/:messagePosition)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/subscription/:subName/position/:messagePosition|operation/peekNthMessage}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String subName = "my-subscription";
 int numMessages = 1;
-admin.persistentTopics().peekMessages(destination, subName, numMessages);
+admin.persistentTopics().peekMessages(topic, subName, numMessages);
 ```
 
 ### Skip messages
@@ -457,17 +439,15 @@ $ pulsar-admin persistent skip \
 
 #### REST API
 
-{% endpoint POST /admin/v2/persistent/:tenant/:namespace/:destination/subscription/:subName/skip/:numMessages %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/subscription/:subName/skip/:numMessages)
+{@inject: endpoint|POST|/admin/v2/persistent/:tenant/:namespace/:topic/subscription/:subName/skip/:numMessages|operation/skipMessages}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String subName = "my-subscription";
 int numMessages = 1;
-admin.persistentTopics().skipMessages(destination, subName, numMessages);
+admin.persistentTopics().skipMessages(topic, subName, numMessages);
 ```
 
 ### Skip all messages
@@ -485,16 +465,16 @@ $ pulsar-admin persistent skip-all \
 
 #### REST API
 
-{% endpoint POST /admin/v2/persistent/:tenant/:namespace/:destination/subscription/:subName/skip_all %}
+{@inject: endpoint|POST|/admin/v2/persistent/:tenant/:namespace/:topic/subscription/:subName/skip_all|operation/skipAllMessages}
 
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/subscription/:subName/skip_all)
+[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:topic/subscription/:subName/skip_all)
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String subName = "my-subscription";
-admin.persistentTopics().skipAllMessages(destination, subName);
+admin.persistentTopics().skipAllMessages(topic, subName);
 ```
 
 ### Reset cursor
@@ -512,17 +492,15 @@ $ pulsar-admin persistent reset-cursor \
 
 #### REST API
 
-{% endpoint POST /admin/v2/persistent/:tenant/:namespace/:destination/subscription/:subName/resetcursor/:timestamp %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/subscription/:subName/resetcursor/:timestamp)
+{@inject: endpoint|POST|/admin/v2/persistent/:tenant/:namespace/:topic/subscription/:subName/resetcursor/:timestamp|operation/resetCursor}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String subName = "my-subscription";
 long timestamp = 2342343L;
-admin.persistentTopics().skipAllMessages(destination, subName, timestamp);
+admin.persistentTopics().skipAllMessages(topic, subName, timestamp);
 ```
 
 ### Lookup of topic
@@ -541,13 +519,13 @@ $ pulsar-admin persistent lookup \
 
 #### REST API
 
-{% endpoint GET /lookup/v2/destination/persistent/:tenant:namespace/:destination %}
+{@inject: endpoint|GET|/lookup/v2/topic/persistent/:tenant:namespace/:topic|/}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.lookup().lookupDestination(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.lookup().lookupDestination(topic);
 ```
 
 ### Get bundle
@@ -566,13 +544,13 @@ $ pulsar-admin persistent bundle-range \
 
 #### REST API
 
-{% endpoint GET /lookup/v2/destination/:destination_domain/:tenant/:namespace/:destination/bundle %}
+{@inject: endpoint|GET|/lookup/v2/topic/:topic_domain/:tenant/:namespace/:topic/bundle|/}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.lookup().getBundleRange(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.lookup().getBundleRange(topic);
 ```
 
 
@@ -591,15 +569,13 @@ $ pulsar-admin persistent subscriptions \
 
 #### REST API
 
-{% endpoint GET /admin/v2/persistent/:tenant/:namespace/:destination/subscriptions %}
-
-[More info](../../reference/RestApi#/admin/persistent/:tenant/:namespace/:destination/subscriptions)
+{@inject: endpoint|GET|/admin/v2/persistent/:tenant/:namespace/:topic/subscriptions|operation/getSubscriptions}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
-admin.persistentTopics().getSubscriptions(destination);
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.persistentTopics().getSubscriptions(topic);
 ```
 
 ### Unsubscribe
@@ -617,14 +593,12 @@ $ pulsar-admin persistent unsubscribe \
 
 #### REST API
 
-{% endpoint POST /admin/v2/namespaces/:tenant/:namespace/unsubscribe/:subscription %}
-
-[More info](../../reference/RestApi#/admin/namespaces/:tenant/:namespace/unsubscribe/:subscription)
+{@inject: endpoint|DELETE|/admin/v2/namespaces/:tenant/:namespace/:topic/subscription/:subscription|operation/deleteSubscription}
 
 #### Java
 
 ```java
-String destination = "persistent://my-tenant/my-namespace/my-topic";
+String topic = "persistent://my-tenant/my-namespace/my-topic";
 String subscriptionName = "my-subscription";
-admin.persistentTopics().deleteSubscription(destination, subscriptionName);
+admin.persistentTopics().deleteSubscription(topic, subscriptionName);
 ```
diff --git a/site2/docs/administration-geo.md b/site2/docs/administration-geo.md
index 4f65127..ef727c6 100644
--- a/site2/docs/administration-geo.md
+++ b/site2/docs/administration-geo.md
@@ -107,7 +107,7 @@ producer.newMessage()
 
 #### Topic stats
 
-Topic-specific statistics for global topics are available via the [`pulsar-admin`](reference-pulsar-admin.md) tool and [REST API](reference-rest-api.md):
+Topic-specific statistics for global topics are available via the [`pulsar-admin`](reference-pulsar-admin.md) tool and {@inject: rest:REST:/} API:
 
 ```shell
 $ bin/pulsar-admin persistent stats persistent://my-tenant/my-namespace/my-topic
diff --git a/site2/docs/administration-zk-bk.md b/site2/docs/administration-zk-bk.md
index 7f8c69c..8c8f29a 100644
--- a/site2/docs/administration-zk-bk.md
+++ b/site2/docs/administration-zk-bk.md
@@ -268,11 +268,7 @@ $ pulsar-admin namespaces set-persistence my-tenant/my-ns \
 
 #### REST API
 
-```http
-POST /admin/v2/namespaces/:tenant/:namespace/persistence
-```
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/persistence)
+{@inject: endpoint|POST|/admin/v2/namespaces/:tenant/:namespace/persistence|operation/setPersistence}
 
 #### Java
 
@@ -308,11 +304,7 @@ $ pulsar-admin namespaces get-persistence my-tenant/my-ns
 
 #### REST API
 
-```http
-GET /admin/v2/namespaces/:tenant/:namespace/persistence
-```
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/persistence)
+{@inject: endpoint|GET|/admin/v2/namespaces/:tenant/:namespace/persistence|operation/getPersistence}
 
 #### Java
 
diff --git a/site2/docs/cookbooks-compaction.md b/site2/docs/cookbooks-compaction.md
index bf8fce8..6b50dca 100644
--- a/site2/docs/cookbooks-compaction.md
+++ b/site2/docs/cookbooks-compaction.md
@@ -49,7 +49,7 @@ $ bin/pulsar-admin topics compact \
   persistent://my-tenant/my-namespace/my-topic
 ```
 
-The `pulsar-admin` tool runs compaction via the Pulsar [REST API](reference-rest-api.md). To run compaction in its own dedicated process, i.e. *not* through the REST API, you can use the [`pulsar compact-topic`](reference-cli-tools.md#pulsar-compact-topic) command. Here's an example:
+The `pulsar-admin` tool runs compaction via the Pulsar {@inject: rest:REST:/} API. To run compaction in its own dedicated process, i.e. *not* through the REST API, you can use the [`pulsar compact-topic`](reference-cli-tools.md#pulsar-compact-topic) command. Here's an example:
 
 ```bash
 $ bin/pulsar compact-topic \
diff --git a/site2/docs/cookbooks-retention-expiry.md b/site2/docs/cookbooks-retention-expiry.md
index d961b25..cd1a96a 100644
--- a/site2/docs/cookbooks-retention-expiry.md
+++ b/site2/docs/cookbooks-retention-expiry.md
@@ -77,10 +77,7 @@ $ pulsar-admin namespaces set-retention my-tenant/my-ns \
 
 #### REST API
 
-```http
-POST /admin/v2/namespaces/:tenant/:namespace/retention
-```
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/retention)
+{@inject: endpoint|POST|/admin/v2/namespaces/:tenant/:namespace/retention|operation/setRetention}
 
 #### Java
 
@@ -111,11 +108,7 @@ $ pulsar-admin namespaces get-retention my-tenant/my-ns
 
 #### REST API
 
-```http
-GET /admin/v2/namespaces/:tenant/:namespace/retention
-```
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/retention)
+{@inject: endpoint|GET|/admin/v2/namespaces/:tenant/:namespace/retention|operation/getRetention}
 
 #### Java
 
@@ -165,11 +158,7 @@ $ pulsar-admin namespaces set-backlog-quota my-tenant/my-ns \
 
 #### REST API
 
-```http
-POST /admin/v2/namespaces/:tenant/:namespace/backlogQuota
-```
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/backlogQuota)
+{@inject: endpoint|POST|/admin/v2/namespaces/:tenant/:namespace/backlogQuota|operation/getBacklogQuotaMap}
 
 #### Java
 
@@ -200,13 +189,7 @@ $ pulsar-admin namespaces get-backlog-quotas my-tenant/my-ns
 
 #### REST API
 
-{% endpoint GET /admin/namespaces/:property/:cluster/:namespace/backlogQuotaMap %}
-
-```http
-GET /admin/v2/namespaces/:tenant/:namespace/backlogQuotaMap
-```
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/backlogQuota)
+{@inject: endpoint|GET|/admin/v2/namespaces/:tenant/:namespace/backlogQuotaMap|operation/getBacklogQuotaMap}
 
 #### Java
 
@@ -227,12 +210,7 @@ $ pulsar-admin namespaces remove-backlog-quotas my-tenant/my-ns
 
 #### REST API
 
-```http
-DELETE /admin/v2/namespaces/:tenant/:namespace/backlogQuota
-```
-
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/backlogQuota)
+{@inject: endpoint|DELETE|/admin/v2/namespaces/:tenant/:namespace/backlogQuota|operation/removeBacklogQuota}
 
 #### Java
 
@@ -273,13 +251,7 @@ $ pulsar-admin namespaces set-message-ttl my-tenant/my-ns \
 
 #### REST API
 
-{% endpoint POST /admin/namespaces/:property/:cluster/:namespace/messageTTL %}
-
-```http
-POST /admin/v2/namespaces/:tenant/:namespace/messageTTL
-```
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/messageTTL)
+{@inject: endpoint|POST|/admin/v2/namespaces/:tenant/:namespace/messageTTL|operation/setNamespaceMessageTTL}
 
 #### Java
 
@@ -302,14 +274,7 @@ $ pulsar-admin namespaces get-message-ttl my-tenant/my-ns
 
 #### REST API
 
-{% endpoint GET /admin/namespaces/:property/:cluster/:namespace/messageTTL %}
-
-```http
-GET /admin/v2/namespaces/:tenant/:namespace/messageTTL
-```
-
-
-[More info](reference-rest-api.md#/admin/namespaces/:property/:cluster/:namespace/messageTTL)
+{@inject: endpoint|GET|/admin/v2/namespaces/:tenant/:namespace/messageTTL|operation/getNamespaceMessageTTL}
 
 #### Java
 
diff --git a/site2/docs/getting-started-concepts-and-architecture.md b/site2/docs/getting-started-concepts-and-architecture.md
index af62864..cf6b81c 100644
--- a/site2/docs/getting-started-concepts-and-architecture.md
+++ b/site2/docs/getting-started-concepts-and-architecture.md
@@ -289,7 +289,7 @@ At the broader instance level, an instance-wide ZooKeeper cluster called the con
 
 The Pulsar message broker is a stateless component that's primarily responsible for running two other components:
 
-* An HTTP server that exposes a REST API for both [administrative tasks](reference-rest-api.md) and [topic lookup](#client-setup-phase) for producers and consumers
+* An HTTP server that exposes a {@inject: rest:REST:/} API for both administrative tasks and [topic lookup](#client-setup-phase) for producers and consumers
 * A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol.md) used for all data transfers
 
 Messages are typically dispatched out of a [managed ledger](#managed-ledgers) cache for the sake of performance, *unless* the backlog exceeds the cache size. If the backlog grows too large for the cache, the broker will start reading entries from BookKeeper.
@@ -649,7 +649,7 @@ Both approaches are available in Pulsar, and you're free to adopt one or the oth
 
 ### Basic architecture
 
-In Pulsar, schemas are uploaded to, fetched from, and update via Pulsar's [REST API](reference-rest-api.md).
+In Pulsar, schemas are uploaded to, fetched from, and update via Pulsar's {@inject: rest:REST:/} API.
 
 > #### Other schema registry backends
 > Out of the box, Pulsar uses the [Apache BookKeeper](#persistent-storage) log storage system for schema storage. You can, however, use different backends if you wish. Documentation for custom schema storage logic is coming soon.
diff --git a/site2/docs/reference-rest-api.md b/site2/docs/reference-rest-api.md
deleted file mode 100644
index 0c89ec4..0000000
--- a/site2/docs/reference-rest-api.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-id: reference-rest-api
-title: Pulsar Admin Rest API
-sidebar_label: REST API
----
-
-# [Pulsar Admin REST API](/staging/admin-rest-api)
-
diff --git a/site2/website/package.json b/site2/website/package.json
index ae5f6e0..41acd55 100644
--- a/site2/website/package.json
+++ b/site2/website/package.json
@@ -18,9 +18,12 @@
     "jest-puppeteer": "^3.2.1",
     "puppeteer": "^1.5.0",
     "remarkable-embed": "^0.4.1",
-    "replace-in-file": "^3.4.0"
+    "replace-in-file": "^3.4.0",
+    "redoc": "^2.0.0-alpha.30"
   },
   "jest": {
     "preset": "jest-puppeteer"
+  },
+  "dependencies": {
   }
 }
diff --git a/site2/website/pages/en/admin-rest-api.js b/site2/website/pages/en/admin-rest-api.js
index cce71d4..dd32e73 100644
--- a/site2/website/pages/en/admin-rest-api.js
+++ b/site2/website/pages/en/admin-rest-api.js
@@ -1,4 +1,3 @@
-
 const React = require('react');
 const CompLibrary = require('../../core/CompLibrary.js');
 
@@ -9,32 +8,11 @@ class AdminRestApi extends React.Component {
   render() {
     const swaggerUrl = `${siteConfig.baseUrl}swagger/swagger.json`
 
-    const swagger = `
-      const ui = SwaggerUIBundle({
-        url: "${swaggerUrl}",
-        dom_id: '#swagger-ui',
-        presets: [
-          SwaggerUIBundle.presets.apis
-        ],
-        filter: true,
-        //deepLinking: true,
-        //displayOperationId: true,
-        showCommonExtensions: true,
-        showExtensions: true,
-        //defaultModelRendering: "model",
-        defaultModelsExpandDepth: 0,
-        docExpansion: "list",
-        layout: "BaseLayout"
-      })
-    `
-
     return (
       <div className="pageContainer">
         <Container className="mainContainer documentContainer postContainer" >
-          <div id="swagger-ui" />
-          <link rel={'stylesheet'} href={'//cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.17.4/swagger-ui.css'} />
-          <script src={'//unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js'} />
-          <script dangerouslySetInnerHTML={{__html: swagger }}></script>
+          <redoc spec-url="//localhost:3000/staging/swagger/swagger.json" lazy-rendering="true"></redoc>
+          <script src="//cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"/>
         </Container>
       </div>
     );
diff --git a/site2/website/sidebars.json b/site2/website/sidebars.json
index f37eb96..6f0acf4 100644
--- a/site2/website/sidebars.json
+++ b/site2/website/sidebars.json
@@ -57,6 +57,7 @@
       "admin-api-brokers",
       "admin-api-namespaces",
       "admin-api-permissions",
+      "admin-api-persistent-topics",
       "admin-api-non-persistent-topics",
       "admin-api-partitioned-topics"
     ],
@@ -84,7 +85,6 @@
     ],
     "Reference": [
       "reference-terminology",
-      "reference-rest-api",
       "reference-cli-tools",
       "pulsar-admin",
       "reference-configuration"
diff --git a/site2/website/siteConfig.js b/site2/website/siteConfig.js
index 4336341..831ff6d 100644
--- a/site2/website/siteConfig.js
+++ b/site2/website/siteConfig.js
@@ -20,6 +20,15 @@ const createVariableInjectionPlugin = variables => {
       // githubUrl:<name>:<path>
       } else if (keyparts[0] == 'github') {
           return renderUrl(initializedPlugin, githubUrl + "/tree/master/", keyparts);
+      // rest api: rest:<name>:<path>
+      } else if (keyparts[0] == 'rest') {
+          return renderUrl(initializedPlugin, restApiUrl + "#", keyparts);
+      } else {
+        keyparts = key.split("|");
+        // endpoint api: endpoint|<op>
+        if (keyparts[0] == 'endpoint') {
+            return renderEndpoint(initializedPlugin, restApiUrl + "#", keyparts);
+        }
       }
       return initializedPlugin.render(variables[key])
     }
@@ -45,8 +54,17 @@ const renderUrl = (initializedPlugin, baseUrl, keyparts) => {
     return rendered_content;
 };
 
+const renderEndpoint = (initializedPlugin, baseUrl, keyparts) => {
+    content = '[<b>' + keyparts[1] + '</b> <i>' + keyparts[2] + '</i>](' + baseUrl + keyparts[3] + ')';
+    rendered_content = initializedPlugin.render(content);
+    rendered_content = rendered_content.replace('<p>', '');
+    rendered_content = rendered_content.replace('</p>', '');
+    return rendered_content;
+};
+
 const url = 'https://pulsar.incubator.apache.org';
 const javadocUrl = url + '/api';
+const restApiUrl = 'http://localhost:3000/staging/en' + "/admin-rest-api";
 const githubUrl = 'https://github.com/apache/incubator-pulsar';
 const baseUrl = '/staging/';
 
@@ -76,6 +94,7 @@ const siteConfig = {
     {doc: 'standalone', label: 'Documentation'},
     {page: 'download', label: 'Download'},
     {doc: 'client-libraries', label: 'Client libraries'},
+    {page: 'admin-rest-api', label: 'REST API'},
     {href: '#community', label: 'Community'},
     {href: '#apache', label: 'Apache'},
     // Determines search bar position among links
diff --git a/site2/website/static/swagger/swagger.json b/site2/website/static/swagger/swagger.json
index 9d8133b..b57004d 100644
--- a/site2/website/static/swagger/swagger.json
+++ b/site2/website/static/swagger/swagger.json
@@ -1,15 +1,15 @@
 {
   "swagger" : "2.0",
   "info" : {
-    "description" : "This provides the REST API for admin\n                      operations",
-    "version" : "v1",
+    "description" : "This provides the REST API for admin operations",
+    "version" : "v2",
     "title" : "Pulsar Admin REST API",
     "license" : {
       "name" : "Apache 2.0",
       "url" : "http://www.apache.org/licenses/LICENSE-2.0.html"
     }
   },
-  "basePath" : "/admin",
+  "basePath" : "/admin/v2",
   "tags" : [ {
     "name" : "bookies"
   }, {
@@ -19,16 +19,12 @@
   }, {
     "name" : "clusters"
   }, {
-    "name" : "functions"
-  }, {
     "name" : "namespaces"
   }, {
     "name" : "non-persistent topic"
   }, {
     "name" : "persistent topic"
   }, {
-    "name" : "properties"
-  }, {
     "name" : "resource-quotas"
   }, {
     "name" : "tenants"
@@ -177,48 +173,6 @@
         }
       }
     },
-    "/broker-stats/broker-resource-availability/{property}/{cluster}/{namespace}" : {
-      "get" : {
-        "tags" : [ "broker-stats" ],
-        "summary" : "Broker availability report",
-        "description" : "This API gives the current broker availability in percent, each resource percentage usage is calculated and thensum of all of the resource usage percent is called broker-resource-availability<br/><br/>THIS API IS ONLY FOR USE BY TESTING FOR CONFIRMING NAMESPACE ALLOCATION ALGORITHM",
-        "operationId" : "getBrokerResourceAvailability",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "object",
-              "additionalProperties" : {
-                "$ref" : "#/definitions/ResourceUnit"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "409" : {
-            "description" : "Load-manager doesn't support operation"
-          }
-        }
-      }
-    },
     "/broker-stats/broker-resource-availability/{tenant}/{namespace}" : {
       "get" : {
         "tags" : [ "broker-stats" ],
@@ -256,26 +210,6 @@
         }
       }
     },
-    "/broker-stats/destinations" : {
-      "get" : {
-        "tags" : [ "broker-stats" ],
-        "summary" : "Get all the topic stats by namesapce",
-        "description" : "",
-        "operationId" : "getTopics2",
-        "produces" : [ "application/json" ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/OutputStream"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          }
-        }
-      }
-    },
     "/broker-stats/load-report" : {
       "get" : {
         "tags" : [ "broker-stats" ],
@@ -1028,107 +962,93 @@
         }
       }
     },
-    "/functions/assignments" : {
-      "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Fetches information about which Pulsar Functions are assigned to which Pulsar clusters",
-        "description" : "",
-        "operationId" : "getAssignments",
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "object",
-              "additionalProperties" : {
-                "$ref" : "#/definitions/Assignment"
-              }
-            }
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          }
-        }
-      }
-    },
-    "/functions/cluster" : {
+    "/namespaces/{cluster}/antiAffinity/{group}" : {
       "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Fetches information about the Pulsar cluster running Pulsar Functions",
+        "tags" : [ "namespaces" ],
+        "summary" : "Get all namespaces that are grouped by given anti-affinity group in a given cluster. api can be only accessed by admin of any of the existing tenant",
         "description" : "",
-        "operationId" : "getCluster",
+        "operationId" : "getAntiAffinityNamespaces",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "parameters" : [ {
+          "name" : "cluster",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "group",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "tenant",
+          "in" : "query",
+          "required" : false,
+          "type" : "string"
+        } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
               "type" : "array",
               "items" : {
-                "$ref" : "#/definitions/WorkerInfo"
+                "type" : "object"
               }
             }
           },
           "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "Don't have admin permission"
+          },
+          "412" : {
+            "description" : "Cluster not exist/Anti-affinity group can't be empty."
           }
         }
       }
     },
-    "/functions/connectors" : {
+    "/namespaces/{property}/{namespace}/compactionThreshold" : {
       "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Fetches a list of supported Pulsar IO connectors currently running in cluster mode",
-        "description" : "",
-        "operationId" : "getConnectorsList",
+        "tags" : [ "namespaces" ],
+        "summary" : "Maximum number of uncompacted bytes in topics before compaction is triggered.",
+        "description" : "The backlog size is compared to the threshold periodically. A threshold of 0 disabled automatic compaction",
+        "operationId" : "getCompactionThreshold",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "parameters" : [ {
+          "name" : "property",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "namespace",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "object"
-              }
+              "type" : "integer",
+              "format" : "int64"
             }
           },
-          "400" : {
-            "description" : "Invalid request"
-          },
           "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "Don't have admin permission"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "404" : {
+            "description" : "Namespace doesn't exist"
           }
         }
-      }
-    },
-    "/functions/workers" : {
-      "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Get all current member workers.",
-        "description" : "",
-        "operationId" : "getWorkers",
+      },
+      "put" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Set maximum number of uncompacted bytes in a topic before compaction is triggered.",
+        "description" : "The backlog size is compared to the threshold periodically. A threshold of 0 disabled automatic compaction",
+        "operationId" : "setCompactionThreshold",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "object"
-              }
-            }
-          }
-        }
-      }
-    },
-    "/functions/{tenant}/{namespace}" : {
-      "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Lists all Pulsar Functions currently deployed in a given namespace",
-        "description" : "",
-        "operationId" : "listFunctions",
         "parameters" : [ {
-          "name" : "tenant",
+          "name" : "property",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1139,29 +1059,31 @@
           "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "string"
-            }
+          "403" : {
+            "description" : "Don't have admin permission"
           },
-          "400" : {
-            "description" : "Invalid request"
+          "404" : {
+            "description" : "Namespace doesn't exist"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "409" : {
+            "description" : "Concurrent modification"
+          },
+          "412" : {
+            "description" : "compactionThreshold value is not valid"
           }
         }
       }
     },
-    "/functions/{tenant}/{namespace}/{functionName}" : {
+    "/namespaces/{property}/{namespace}/offloadThreshold" : {
       "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Fetches information about a Pulsar Function currently running in cluster mode",
-        "description" : "",
-        "operationId" : "getFunctionInfo",
+        "tags" : [ "namespaces" ],
+        "summary" : "Maximum number of bytes stored on the pulsar cluster for a topic, before the broker will start offloading to longterm storage",
+        "description" : "A negative value disables automatic offloading",
+        "operationId" : "getOffloadThreshold",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "tenant",
+          "name" : "property",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1170,41 +1092,32 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/FunctionMetaData"
+              "type" : "integer",
+              "format" : "int64"
             }
           },
-          "400" : {
-            "description" : "Invalid request"
-          },
           "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "The function doesn't exist"
-          },
-          "408" : {
-            "description" : "Request timeout"
+            "description" : "Namespace doesn't exist"
           }
         }
       },
-      "post" : {
-        "tags" : [ "functions" ],
-        "summary" : "Creates a new Pulsar Function in cluster mode",
-        "description" : "",
-        "operationId" : "registerFunction",
-        "consumes" : [ "multipart/form-data" ],
+      "put" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Set maximum number of bytes stored on the pulsar cluster for a topic, before the broker will start offloading to longterm storage",
+        "description" : "A negative value disables automatic offloading",
+        "operationId" : "setOffloadThreshold",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "tenant",
+          "name" : "property",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1213,107 +1126,65 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "Pulsar Function successfully created"
+          "403" : {
+            "description" : "Don't have admin permission"
           },
-          "400" : {
-            "description" : "Invalid request (function already exists, etc.)"
+          "404" : {
+            "description" : "Namespace doesn't exist"
           },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
+          "409" : {
+            "description" : "Concurrent modification"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "412" : {
+            "description" : "offloadThreshold value is not valid"
           }
         }
-      },
-      "put" : {
-        "tags" : [ "functions" ],
-        "summary" : "Updates a Pulsar Function currently running in cluster mode",
+      }
+    },
+    "/namespaces/{tenant}" : {
+      "get" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Get the list of all the namespaces for a certain tenant.",
         "description" : "",
-        "operationId" : "updateFunction",
-        "consumes" : [ "multipart/form-data" ],
+        "operationId" : "getTenantNamespaces",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
           "200" : {
-            "description" : "Pulsar Function successfully updated"
-          },
-          "400" : {
-            "description" : "Invalid request (function doesn't exist, etc.)"
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          }
-        }
-      },
-      "delete" : {
-        "tags" : [ "functions" ],
-        "summary" : "Deletes a Pulsar Function currently running in cluster mode",
-        "description" : "",
-        "operationId" : "deregisterFunction",
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "The function was successfully deleted"
-          },
-          "400" : {
-            "description" : "Invalid request"
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "array",
+              "uniqueItems" : true,
+              "items" : {
+                "type" : "string"
+              }
+            }
           },
           "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "The function doesn't exist"
-          },
-          "408" : {
-            "description" : "Request timeout"
+            "description" : "Tenant doesn't exist"
           }
         }
       }
     },
-    "/functions/{tenant}/{namespace}/{functionName}/status" : {
+    "/namespaces/{tenant}/{namespace}" : {
       "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Displays the status of a Pulsar Function running in cluster mode",
+        "tags" : [ "namespaces" ],
+        "summary" : "Get the dump all the policies specified for a namespace.",
         "description" : "",
-        "operationId" : "getFunctionStatus",
+        "operationId" : "getPolicies",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
@@ -1324,35 +1195,29 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/FunctionStatus"
+              "$ref" : "#/definitions/Policies"
             }
           },
-          "400" : {
-            "description" : "Invalid request"
-          },
           "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Tenant or cluster or namespace doesn't exist"
           }
         }
-      }
-    },
-    "/functions/{tenant}/{namespace}/{functionName}/trigger" : {
-      "post" : {
-        "tags" : [ "functions" ],
-        "summary" : "Triggers a Pulsar Function with a user-specified value or file data",
+      },
+      "put" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Creates a new namespace with the specified policies",
         "description" : "",
-        "operationId" : "triggerFunction",
-        "consumes" : [ "multipart/form-data" ],
+        "operationId" : "createNamespace",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
@@ -1363,40 +1228,29 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/Message"
-            }
-          },
-          "400" : {
-            "description" : "Invalid request"
+          "403" : {
+            "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "The function does not exist"
+            "description" : "Tenant or cluster doesn't exist"
           },
-          "408" : {
-            "description" : "Request timeout"
+          "409" : {
+            "description" : "Namespace already exists"
           },
-          "500" : {
-            "description" : "Internal server error"
+          "412" : {
+            "description" : "Namespace name is not valid"
           }
         }
-      }
-    },
-    "/functions/{tenant}/{namespace}/{functionName}/{instanceId}/status" : {
-      "get" : {
-        "tags" : [ "functions" ],
-        "summary" : "Displays the status of a Pulsar Function instance",
+      },
+      "delete" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Delete a namespace and all the topics under it.",
         "description" : "",
-        "operationId" : "getFunctionInstanceStatus",
+        "operationId" : "deleteNamespace",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
@@ -1408,127 +1262,98 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "functionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "instanceId",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/FunctionStatus"
-            }
-          },
-          "400" : {
-            "description" : "Invalid request"
-          },
           "403" : {
-            "description" : "The requester doesn't have admin permissions"
+            "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "The function doesn't exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
+          },
+          "409" : {
+            "description" : "Namespace is not empty"
           }
         }
       }
     },
-    "/namespaces/{cluster}/antiAffinity/{group}" : {
+    "/namespaces/{tenant}/{namespace}/antiAffinity" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get all namespaces that are grouped by given anti-affinity group in a given cluster. api can be only accessed by admin of any of the existing tenant",
+        "summary" : "Get anti-affinity group of a namespace.",
         "description" : "",
-        "operationId" : "getAntiAffinityNamespaces",
+        "operationId" : "getNamespaceAntiAffinityGroup",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "group",
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "tenant",
-          "in" : "query",
-          "required" : false,
-          "type" : "string"
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "object"
-              }
+              "type" : "string"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
-          "412" : {
-            "description" : "Cluster not exist/Anti-affinity group can't be empty."
+          "404" : {
+            "description" : "Tenant or cluster or namespace doesn't exist"
           }
         }
-      }
-    },
-    "/namespaces/{property}" : {
-      "get" : {
+      },
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get the list of all the namespaces for a certain property.",
+        "summary" : "Set anti-affinity group for a namespace",
         "description" : "",
-        "operationId" : "getTenantNamespaces",
+        "operationId" : "setNamespaceAntiAffinityGroup",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "uniqueItems" : true,
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Property doesn't exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
+          },
+          "412" : {
+            "description" : "Invalid antiAffinityGroup"
           }
         }
-      }
-    },
-    "/namespaces/{property}/{cluster}/{namespace}/antiAffinity" : {
-      "get" : {
+      },
+      "delete" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get anti-affinity group of a namespace.",
+        "summary" : "Remove anti-affinity group of a namespace.",
         "description" : "",
-        "operationId" : "getNamespaceAntiAffinityGroup",
+        "operationId" : "removeNamespaceAntiAffinityGroup",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1539,34 +1364,28 @@
           "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "string"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Property or cluster or namespace doesn't exist"
+            "description" : "Namespace does not exist"
+          },
+          "409" : {
+            "description" : "Concurrent modification"
           }
         }
-      },
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/backlogQuota" : {
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set anti-affinity group for a namespace",
+        "summary" : " Set a backlog quota for all the topics on a namespace.",
         "description" : "",
-        "operationId" : "setNamespaceAntiAffinityGroup",
+        "operationId" : "setBacklogQuota",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1575,33 +1394,37 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "backlogQuotaType",
+          "in" : "query",
+          "required" : false,
+          "type" : "string",
+          "enum" : [ "destination_storage" ]
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Property or cluster or namespace doesn't exist"
+            "description" : "Namespace does not exist"
+          },
+          "409" : {
+            "description" : "Concurrent modification"
           },
           "412" : {
-            "description" : "Invalid antiAffinityGroup"
+            "description" : "Specified backlog quota exceeds retention quota. Increase retention quota and retry request"
           }
         }
       },
       "delete" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Remove anti-affinity group of a namespace.",
+        "summary" : "Remove a backlog quota policy from a namespace.",
         "description" : "",
-        "operationId" : "removeNamespaceAntiAffinityGroup",
+        "operationId" : "removeBacklogQuota",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1610,6 +1433,12 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "backlogQuotaType",
+          "in" : "query",
+          "required" : false,
+          "type" : "string",
+          "enum" : [ "destination_storage" ]
         } ],
         "responses" : {
           "403" : {
@@ -1624,21 +1453,16 @@
         }
       }
     },
-    "/namespaces/{property}/{cluster}/{namespace}/compactionThreshold" : {
+    "/namespaces/{tenant}/{namespace}/backlogQuotaMap" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Maximum number of uncompacted bytes in topics before compaction is triggered.",
-        "description" : "The backlog size is compared to the threshold periodically. A threshold of 0 disabled automatic compaction",
-        "operationId" : "getCompactionThreshold",
+        "summary" : "Get backlog quota map on a namespace.",
+        "description" : "",
+        "operationId" : "getBacklogQuotaMap",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1652,32 +1476,31 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "integer",
-              "format" : "int64"
+              "type" : "object",
+              "additionalProperties" : {
+                "type" : "object"
+              }
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Namespace does not exist"
           }
         }
-      },
-      "put" : {
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/bundles" : {
+      "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set maximum number of uncompacted bytes in a topic before compaction is triggered.",
-        "description" : "The backlog size is compared to the threshold periodically. A threshold of 0 disabled automatic compaction",
-        "operationId" : "setCompactionThreshold",
+        "summary" : "Get the bundles split data.",
+        "description" : "",
+        "operationId" : "getBundlesData",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1688,36 +1511,34 @@
           "type" : "string"
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/BundlesData"
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
+            "description" : "Tenant or cluster or namespace doesn't exist"
           },
           "412" : {
-            "description" : "compactionThreshold value is not valid"
+            "description" : "Namespace is not setup to split in bundles"
           }
         }
       }
     },
-    "/namespaces/{property}/{cluster}/{namespace}/maxConsumersPerSubscription" : {
-      "get" : {
+    "/namespaces/{tenant}/{namespace}/clearBacklog" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get maxConsumersPerSubscription config on a namespace.",
+        "summary" : "Clear backlog for all topics on a namespace.",
         "description" : "",
-        "operationId" : "getMaxConsumersPerSubscription",
+        "operationId" : "clearNamespaceBacklog",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1726,15 +1547,14 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "integer",
-              "format" : "int32"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
@@ -1742,29 +1562,37 @@
             "description" : "Namespace does not exist"
           }
         }
-      },
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/clearBacklog/{subscription}" : {
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : " Set maxConsumersPerSubscription configuration on a namespace.",
+        "summary" : "Clear backlog for a given subscription on all topics on a namespace.",
         "description" : "",
-        "operationId" : "setMaxConsumersPerSubscription",
+        "operationId" : "clearNamespaceBacklogForSubscription",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "subscription",
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
@@ -1772,31 +1600,49 @@
           },
           "404" : {
             "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "maxConsumersPerSubscription value is not valid"
           }
         }
       }
     },
-    "/namespaces/{property}/{cluster}/{namespace}/maxConsumersPerTopic" : {
-      "get" : {
+    "/namespaces/{tenant}/{namespace}/deduplication" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get maxConsumersPerTopic config on a namespace.",
+        "summary" : "Enable or disable broker side deduplication for all topics in a namespace",
         "description" : "",
-        "operationId" : "getMaxConsumersPerTopic",
+        "operationId" : "modifyDeduplication",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        } ],
+        "responses" : {
+          "403" : {
+            "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Tenant or cluster or namespace doesn't exist"
+          }
+        }
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/dispatchRate" : {
+      "get" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Get dispatch-rate configured for the namespace, -1 represents not configured yet",
+        "description" : "",
+        "operationId" : "getDispatchRate",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "parameters" : [ {
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1810,8 +1656,7 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "integer",
-              "format" : "int32"
+              "$ref" : "#/definitions/DispatchRate"
             }
           },
           "403" : {
@@ -1824,18 +1669,39 @@
       },
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : " Set maxConsumersPerTopic configuration on a namespace.",
+        "summary" : "Set dispatch-rate throttling for all topics of the namespace",
         "description" : "",
-        "operationId" : "setMaxConsumersPerTopic",
+        "operationId" : "setDispatchRate",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        } ],
+        "responses" : {
+          "403" : {
+            "description" : "Don't have admin permission"
+          }
+        }
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/encryptionRequired" : {
+      "post" : {
+        "tags" : [ "namespaces" ],
+        "summary" : "Message encryption is required or not for all topics in a namespace",
+        "description" : "",
+        "operationId" : "modifyEncryptionRequired",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "parameters" : [ {
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1850,32 +1716,24 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
           },
           "409" : {
             "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "maxConsumersPerTopic value is not valid"
           }
         }
       }
     },
-    "/namespaces/{property}/{cluster}/{namespace}/maxProducersPerTopic" : {
+    "/namespaces/{tenant}/{namespace}/maxConsumersPerSubscription" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get maxProducersPerTopic config on a namespace.",
+        "summary" : "Get maxConsumersPerSubscription config on a namespace.",
         "description" : "",
-        "operationId" : "getMaxProducersPerTopic",
+        "operationId" : "getMaxConsumersPerSubscription",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1903,18 +1761,13 @@
       },
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : " Set maxProducersPerTopic configuration on a namespace.",
+        "summary" : " Set maxConsumersPerSubscription configuration on a namespace.",
         "description" : "",
-        "operationId" : "setMaxProducersPerTopic",
+        "operationId" : "setMaxConsumersPerSubscription",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1935,26 +1788,21 @@
             "description" : "Concurrent modification"
           },
           "412" : {
-            "description" : "maxProducersPerTopic value is not valid"
+            "description" : "maxConsumersPerSubscription value is not valid"
           }
         }
       }
     },
-    "/namespaces/{property}/{cluster}/{namespace}/offloadThreshold" : {
+    "/namespaces/{tenant}/{namespace}/maxConsumersPerTopic" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Maximum number of bytes stored on the pulsar cluster for a topic, before the broker will start offloading to longterm storage",
-        "description" : "A negative value disables automatic offloading",
-        "operationId" : "getOffloadThreshold",
+        "summary" : "Get maxConsumersPerTopic config on a namespace.",
+        "description" : "",
+        "operationId" : "getMaxConsumersPerTopic",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -1969,31 +1817,26 @@
             "description" : "successful operation",
             "schema" : {
               "type" : "integer",
-              "format" : "int64"
+              "format" : "int32"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Namespace does not exist"
           }
         }
       },
-      "put" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set maximum number of bytes stored on the pulsar cluster for a topic, before the broker will start offloading to longterm storage",
-        "description" : "A negative value disables automatic offloading",
-        "operationId" : "setOffloadThreshold",
+        "summary" : " Set maxConsumersPerTopic configuration on a namespace.",
+        "description" : "",
+        "operationId" : "setMaxConsumersPerTopic",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2008,32 +1851,27 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Namespace does not exist"
           },
           "409" : {
             "description" : "Concurrent modification"
           },
           "412" : {
-            "description" : "offloadThreshold value is not valid"
+            "description" : "maxConsumersPerTopic value is not valid"
           }
         }
       }
     },
-    "/namespaces/{property}/{cluster}/{namespace}/subscriptionAuthMode" : {
-      "post" : {
+    "/namespaces/{tenant}/{namespace}/maxProducersPerTopic" : {
+      "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : " Set a subscription auth mode for all the topics on a namespace.",
+        "summary" : "Get maxProducersPerTopic config on a namespace.",
         "description" : "",
-        "operationId" : "setSubscriptionAuthMode",
+        "operationId" : "getMaxProducersPerTopic",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2044,33 +1882,30 @@
           "type" : "string"
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "integer",
+              "format" : "int32"
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
             "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
           }
         }
-      }
-    },
-    "/namespaces/{property}/{cluster}/{namespace}/subscriptionDispatchRate" : {
-      "get" : {
+      },
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get Subscription dispatch-rate configured for the namespace, -1 represents not configured yet",
+        "summary" : " Set maxProducersPerTopic configuration on a namespace.",
         "description" : "",
-        "operationId" : "getSubscriptionDispatchRate",
+        "operationId" : "setMaxProducersPerTopic",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2081,60 +1916,31 @@
           "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/DispatchRate"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
             "description" : "Namespace does not exist"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Set Subscription dispatch-rate throttling for all topics of the namespace",
-        "description" : "",
-        "operationId" : "setSubscriptionDispatchRate",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
+          },
+          "409" : {
+            "description" : "Concurrent modification"
+          },
+          "412" : {
+            "description" : "maxProducersPerTopic value is not valid"
           }
         }
       }
     },
-    "/namespaces/{property}/{namespace}/compactionThreshold" : {
+    "/namespaces/{tenant}/{namespace}/messageTTL" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Maximum number of uncompacted bytes in topics before compaction is triggered.",
-        "description" : "The backlog size is compared to the threshold periodically. A threshold of 0 disabled automatic compaction",
-        "operationId" : "getCompactionThreshold",
+        "summary" : "Get the message TTL for the namespace",
+        "description" : "",
+        "operationId" : "getNamespaceMessageTTL",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2149,26 +1955,26 @@
             "description" : "successful operation",
             "schema" : {
               "type" : "integer",
-              "format" : "int64"
+              "format" : "int32"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
           }
         }
       },
-      "put" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set maximum number of uncompacted bytes in a topic before compaction is triggered.",
-        "description" : "The backlog size is compared to the threshold periodically. A threshold of 0 disabled automatic compaction",
-        "operationId" : "setCompactionThreshold",
+        "summary" : "Set message TTL in seconds for namespace",
+        "description" : "",
+        "operationId" : "setNamespaceMessageTTL",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2183,27 +1989,29 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
+            "description" : "Tenant or cluster or namespace doesn't exist"
           },
           "412" : {
-            "description" : "compactionThreshold value is not valid"
+            "description" : "Invalid TTL"
           }
         }
       }
     },
-    "/namespaces/{property}/{namespace}/offloadThreshold" : {
+    "/namespaces/{tenant}/{namespace}/permissions" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Maximum number of bytes stored on the pulsar cluster for a topic, before the broker will start offloading to longterm storage",
-        "description" : "A negative value disables automatic offloading",
-        "operationId" : "getOffloadThreshold",
+        "summary" : "Retrieve the permissions for a namespace.",
+        "description" : "",
+        "operationId" : "getPermissions",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "cluster",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2217,27 +2025,34 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "integer",
-              "format" : "int64"
+              "type" : "object",
+              "additionalProperties" : {
+                "type" : "object"
+              }
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
+          },
+          "409" : {
+            "description" : "Namespace is not empty"
           }
         }
-      },
-      "put" : {
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/permissions/{role}" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set maximum number of bytes stored on the pulsar cluster for a topic, before the broker will start offloading to longterm storage",
-        "description" : "A negative value disables automatic offloading",
-        "operationId" : "setOffloadThreshold",
+        "summary" : "Grant a new permission to a role on a namespace.",
+        "description" : "",
+        "operationId" : "grantPermissionOnNamespace",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -2246,29 +2061,29 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "role",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
           },
           "409" : {
             "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "offloadThreshold value is not valid"
           }
         }
-      }
-    },
-    "/namespaces/{tenant}" : {
-      "get" : {
+      },
+      "delete" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get the list of all the namespaces for a certain tenant.",
+        "summary" : "Revoke all permissions to a role on a namespace.",
         "description" : "",
-        "operationId" : "getTenantNamespaces",
+        "operationId" : "revokePermissionsOnNamespace",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2276,33 +2091,33 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "namespace",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "role",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "uniqueItems" : true,
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant doesn't exist"
+            "description" : "Tenant or cluster or namespace doesn't exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}" : {
+    "/namespaces/{tenant}/{namespace}/persistence" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get the dump all the policies specified for a namespace.",
+        "summary" : "Get the persistence configuration for a namespace.",
         "description" : "",
-        "operationId" : "getPolicies",
+        "operationId" : "getPersistence",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2320,22 +2135,25 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/Policies"
+              "$ref" : "#/definitions/PersistencePolicies"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+            "description" : "Namespace does not exist"
+          },
+          "409" : {
+            "description" : "Concurrent modification"
           }
         }
       },
-      "put" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Creates a new namespace with the specified policies",
+        "summary" : "Set the persistence configuration for all the topics on a namespace.",
         "description" : "",
-        "operationId" : "createNamespace",
+        "operationId" : "setPersistence",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2350,25 +2168,27 @@
           "type" : "string"
         } ],
         "responses" : {
+          "400" : {
+            "description" : "Invalid persistence policies"
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster doesn't exist"
+            "description" : "Namespace does not exist"
           },
           "409" : {
-            "description" : "Namespace already exists"
-          },
-          "412" : {
-            "description" : "Namespace name is not valid"
+            "description" : "Concurrent modification"
           }
         }
-      },
-      "delete" : {
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/replication" : {
+      "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Delete a namespace and all the topics under it.",
+        "summary" : "Get the replication clusters for a namespace.",
         "description" : "",
-        "operationId" : "deleteNamespace",
+        "operationId" : "getNamespaceReplicationClusters",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2381,32 +2201,33 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "array",
+              "items" : {
+                "type" : "string"
+              }
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
             "description" : "Tenant or cluster or namespace doesn't exist"
           },
-          "409" : {
-            "description" : "Namespace is not empty"
+          "412" : {
+            "description" : "Namespace is not global"
           }
         }
-      }
-    },
-    "/namespaces/{tenant}/{namespace}/antiAffinity" : {
-      "get" : {
+      },
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get anti-affinity group of a namespace.",
+        "summary" : "Set the replication clusters for a namespace.",
         "description" : "",
-        "operationId" : "getNamespaceAntiAffinityGroup",
+        "operationId" : "setNamespaceReplicationClusters",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2421,25 +2242,27 @@
           "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "string"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
             "description" : "Tenant or cluster or namespace doesn't exist"
+          },
+          "409" : {
+            "description" : "Peer-cluster can't be part of replication-cluster"
+          },
+          "412" : {
+            "description" : "Namespace is not global or invalid cluster ids"
           }
         }
-      },
-      "post" : {
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/retention" : {
+      "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set anti-affinity group for a namespace",
+        "summary" : "Get retention config on a namespace.",
         "description" : "",
-        "operationId" : "setNamespaceAntiAffinityGroup",
+        "operationId" : "getRetention",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2454,22 +2277,25 @@
           "type" : "string"
         } ],
         "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/RetentionPolicies"
+            }
           },
-          "412" : {
-            "description" : "Invalid antiAffinityGroup"
+          "403" : {
+            "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Namespace does not exist"
           }
         }
       },
-      "delete" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Remove anti-affinity group of a namespace.",
+        "summary" : " Set retention configuration on a namespace.",
         "description" : "",
-        "operationId" : "removeNamespaceAntiAffinityGroup",
+        "operationId" : "setRetention",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2492,16 +2318,19 @@
           },
           "409" : {
             "description" : "Concurrent modification"
+          },
+          "412" : {
+            "description" : "Retention Quota must exceed backlog quota"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/backlogQuota" : {
+    "/namespaces/{tenant}/{namespace}/subscriptionAuthMode" : {
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : " Set a backlog quota for all the topics on a namespace.",
+        "summary" : " Set a subscription auth mode for all the topics on a namespace.",
         "description" : "",
-        "operationId" : "setBacklogQuota",
+        "operationId" : "setSubscriptionAuthMode",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2514,12 +2343,6 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "backlogQuotaType",
-          "in" : "query",
-          "required" : false,
-          "type" : "string",
-          "enum" : [ "destination_storage" ]
         } ],
         "responses" : {
           "403" : {
@@ -2530,17 +2353,16 @@
           },
           "409" : {
             "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "Specified backlog quota exceeds retention quota. Increase retention quota and retry request"
           }
         }
-      },
-      "delete" : {
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/subscriptionDispatchRate" : {
+      "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Remove a backlog quota policy from a namespace.",
+        "summary" : "Get Subscription dispatch-rate configured for the namespace, -1 represents not configured yet",
         "description" : "",
-        "operationId" : "removeBacklogQuota",
+        "operationId" : "getSubscriptionDispatchRate",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2553,32 +2375,27 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "backlogQuotaType",
-          "in" : "query",
-          "required" : false,
-          "type" : "string",
-          "enum" : [ "destination_storage" ]
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/DispatchRate"
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
             "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
           }
         }
-      }
-    },
-    "/namespaces/{tenant}/{namespace}/backlogQuotaMap" : {
-      "get" : {
+      },
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get backlog quota map on a namespace.",
+        "summary" : "Set Subscription dispatch-rate throttling for all topics of the namespace",
         "description" : "",
-        "operationId" : "getBacklogQuotaMap",
+        "operationId" : "setSubscriptionDispatchRate",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2593,30 +2410,18 @@
           "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "object",
-              "additionalProperties" : {
-                "type" : "object"
-              }
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/bundles" : {
+    "/namespaces/{tenant}/{namespace}/topics" : {
       "get" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get the bundles split data.",
+        "summary" : "Get the list of all the topics under a certain namespace.",
         "description" : "",
-        "operationId" : "getBundlesData",
+        "operationId" : "getTopics",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2634,7 +2439,11 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/BundlesData"
+              "type" : "array",
+              "uniqueItems" : true,
+              "items" : {
+                "type" : "string"
+              }
             }
           },
           "403" : {
@@ -2642,19 +2451,16 @@
           },
           "404" : {
             "description" : "Tenant or cluster or namespace doesn't exist"
-          },
-          "412" : {
-            "description" : "Namespace is not setup to split in bundles"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/clearBacklog" : {
-      "post" : {
+    "/namespaces/{tenant}/{namespace}/unload" : {
+      "put" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Clear backlog for all topics on a namespace.",
-        "description" : "",
-        "operationId" : "clearNamespaceBacklog",
+        "summary" : "Unload namespace",
+        "description" : "Unload an active namespace from the current broker serving it. Performing this operation will let the brokerremoves all producers, consumers, and connections using this namespace, and close all topics (includingtheir persistent store). During that operation, the namespace is marked as tentatively unavailable until thebroker completes the unloading action. This operation requires strictly super user privileges, since it wouldresult in non-persistent message loss a [...]
+        "operationId" : "unloadNamespace",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2667,29 +2473,26 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Tenant or namespace doesn't exist"
+          },
+          "412" : {
+            "description" : "Namespace is already unloaded or Namespace has bundles activated"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/clearBacklog/{subscription}" : {
+    "/namespaces/{tenant}/{namespace}/unsubscribe/{subscription}" : {
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Clear backlog for a given subscription on all topics on a namespace.",
+        "summary" : "Unsubscribes the given subscription on all topics on a namespace.",
         "description" : "",
-        "operationId" : "clearNamespaceBacklogForSubscription",
+        "operationId" : "unsubscribeNamespace",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2698,6 +2501,11 @@
           "required" : true,
           "type" : "string"
         }, {
+          "name" : "cluster",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
           "name" : "namespace",
           "in" : "path",
           "required" : true,
@@ -2724,12 +2532,12 @@
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/deduplication" : {
-      "post" : {
+    "/namespaces/{tenant}/{namespace}/{bundle}" : {
+      "delete" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Enable or disable broker side deduplication for all topics in a namespace",
+        "summary" : "Delete a namespace bundle and all the topics under it.",
         "description" : "",
-        "operationId" : "modifyDeduplication",
+        "operationId" : "deleteNamespaceBundle",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2742,6 +2550,17 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
@@ -2749,16 +2568,19 @@
           },
           "404" : {
             "description" : "Tenant or cluster or namespace doesn't exist"
+          },
+          "409" : {
+            "description" : "Namespace bundle is not empty"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/dispatchRate" : {
-      "get" : {
+    "/namespaces/{tenant}/{namespace}/{bundle}/clearBacklog" : {
+      "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get dispatch-rate configured for the namespace, -1 represents not configured yet",
+        "summary" : "Clear backlog for all topics on a namespace bundle.",
         "description" : "",
-        "operationId" : "getDispatchRate",
+        "operationId" : "clearNamespaceBundleBacklog",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2771,14 +2593,19 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/DispatchRate"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
@@ -2786,12 +2613,14 @@
             "description" : "Namespace does not exist"
           }
         }
-      },
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/{bundle}/clearBacklog/{subscription}" : {
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Set dispatch-rate throttling for all topics of the namespace",
+        "summary" : "Clear backlog for a given subscription on all topics on a namespace bundle.",
         "description" : "",
-        "operationId" : "setDispatchRate",
+        "operationId" : "clearNamespaceBundleBacklogForSubscription",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2804,20 +2633,39 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "subscription",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Namespace does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/encryptionRequired" : {
-      "post" : {
+    "/namespaces/{tenant}/{namespace}/{bundle}/split" : {
+      "put" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Message encryption is required or not for all topics in a namespace",
+        "summary" : "Split a namespace bundle",
         "description" : "",
-        "operationId" : "modifyEncryptionRequired",
+        "operationId" : "splitNamespaceBundle",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2830,26 +2678,37 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
+        }, {
+          "name" : "unload",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/maxConsumersPerSubscription" : {
-      "get" : {
+    "/namespaces/{tenant}/{namespace}/{bundle}/unload" : {
+      "put" : {
         "tags" : [ "namespaces" ],
-        "summary" : "Get maxConsumersPerSubscription config on a namespace.",
+        "summary" : "Unload a namespace bundle",
         "description" : "",
-        "operationId" : "getMaxConsumersPerSubscription",
+        "operationId" : "unloadNamespaceBundle",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2862,28 +2721,31 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "integer",
-              "format" : "int32"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace does not exist"
           }
         }
-      },
+      }
+    },
+    "/namespaces/{tenant}/{namespace}/{bundle}/unsubscribe/{subscription}" : {
       "post" : {
         "tags" : [ "namespaces" ],
-        "summary" : " Set maxConsumersPerSubscription configuration on a namespace.",
+        "summary" : "Unsubscribes the given subscription on all topics on a namespace bundle.",
         "description" : "",
-        "operationId" : "setMaxConsumersPerSubscription",
+        "operationId" : "unsubscribeNamespaceBundle",
         "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
@@ -2896,6 +2758,22 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "subscription",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
@@ -2903,23 +2781,16 @@
           },
           "404" : {
             "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "maxConsumersPerSubscription value is not valid"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/maxConsumersPerTopic" : {
+    "/non-persistent/{tenant}/{namespace}" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get maxConsumersPerTopic config on a namespace.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the list of non-persistent topics under a namespace.",
         "description" : "",
-        "operationId" : "getMaxConsumersPerTopic",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getList",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -2936,24 +2807,27 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "integer",
-              "format" : "int32"
+              "type" : "array",
+              "items" : {
+                "type" : "string"
+              }
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Namespace doesn't exist"
           }
         }
-      },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : " Set maxConsumersPerTopic configuration on a namespace.",
+      }
+    },
+    "/non-persistent/{tenant}/{namespace}/partitioned" : {
+      "get" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the list of partitioned topics under a namespace.",
         "description" : "",
-        "operationId" : "setMaxConsumersPerTopic",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getPartitionedTopicList",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -2967,28 +2841,30 @@
           "type" : "string"
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "array",
+              "items" : {
+                "type" : "string"
+              }
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "maxConsumersPerTopic value is not valid"
+            "description" : "Namespace doesn't exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/maxProducersPerTopic" : {
+    "/non-persistent/{tenant}/{namespace}/{bundle}" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get maxProducersPerTopic config on a namespace.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the list of non-persistent topics under a namespace bundle.",
         "description" : "",
-        "operationId" : "getMaxProducersPerTopic",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getListFromBundle",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3000,29 +2876,37 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "bundle",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "integer",
-              "format" : "int32"
+              "type" : "array",
+              "items" : {
+                "type" : "string"
+              }
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Namespace doesn't exist"
           }
         }
-      },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : " Set maxProducersPerTopic configuration on a namespace.",
-        "description" : "",
-        "operationId" : "setMaxProducersPerTopic",
-        "consumes" : [ "application/json" ],
+      }
+    },
+    "/non-persistent/{tenant}/{namespace}/{topic}" : {
+      "delete" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Delete a topic.",
+        "description" : "The topic cannot be deleted if delete is not forcefully and there's any active subscription or producer connected to the it. Force delete ignores connected clients and deletes topic by explicitly closing them.",
+        "operationId" : "deleteTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3034,30 +2918,43 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "force",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
+            "description" : "Topic does not exist"
           },
           "412" : {
-            "description" : "maxProducersPerTopic value is not valid"
+            "description" : "Topic has active producers/subscriptions"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/messageTTL" : {
-      "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get the message TTL for the namespace",
+    "/non-persistent/{tenant}/{namespace}/{topic}/all_subscription/expireMessages/{expireTimeInSeconds}" : {
+      "post" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Expire messages on all subscriptions of topic.",
         "description" : "",
-        "operationId" : "getNamespaceMessageTTL",
-        "consumes" : [ "application/json" ],
+        "operationId" : "expireMessagesForAllSubscriptions",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3069,61 +2966,40 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "integer",
-              "format" : "int32"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Set message TTL in seconds for namespace",
-        "description" : "",
-        "operationId" : "setNamespaceMessageTTL",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
+        }, {
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "expireTimeInSeconds",
           "in" : "path",
           "required" : true,
-          "type" : "string"
+          "type" : "integer",
+          "format" : "int32"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
-          },
-          "412" : {
-            "description" : "Invalid TTL"
+            "description" : "Topic or subscription does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/permissions" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/backlog" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Retrieve the permissions for a namespace.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get estimated backlog for offline topic.",
         "description" : "",
-        "operationId" : "getPermissions",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getBacklog",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3131,45 +3007,44 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "object",
-              "additionalProperties" : {
-                "type" : "object"
-              }
+              "$ref" : "#/definitions/PersistentOfflineTopicStats"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
-          },
-          "409" : {
-            "description" : "Namespace is not empty"
+            "description" : "Namespace does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/permissions/{role}" : {
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Grant a new permission to a role on a namespace.",
+    "/non-persistent/{tenant}/{namespace}/{topic}/compaction" : {
+      "get" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the status of a compaction operation for a topic.",
         "description" : "",
-        "operationId" : "grantPermissionOnNamespace",
-        "consumes" : [ "application/json" ],
+        "operationId" : "compactionStatus",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3182,29 +3057,40 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "role",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/LongRunningProcessStatus"
+            }
           },
-          "409" : {
-            "description" : "Concurrent modification"
+          "403" : {
+            "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Topic does not exist, or compaction hasn't run"
+          },
+          "405" : {
+            "description" : "Operation not allowed on persistent topic"
           }
         }
       },
-      "delete" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Revoke all permissions to a role on a namespace.",
+      "put" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Trigger a compaction operation on a topic.",
         "description" : "",
-        "operationId" : "revokePermissionsOnNamespace",
-        "consumes" : [ "application/json" ],
+        "operationId" : "compact",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3217,28 +3103,39 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "role",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+            "description" : "Topic does not exist"
+          },
+          "405" : {
+            "description" : "Operation not allowed on persistent topic"
+          },
+          "409" : {
+            "description" : "Compaction already running"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/persistence" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/internal-info" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get the persistence configuration for a namespace.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the internal stats for the topic.",
         "description" : "",
-        "operationId" : "getPersistence",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getManagedLedgerInfo",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3250,31 +3147,28 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/PersistencePolicies"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
+            "description" : "Topic does not exist"
           }
         }
-      },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Set the persistence configuration for all the topics on a namespace.",
+      }
+    },
+    "/non-persistent/{tenant}/{namespace}/{topic}/internalStats" : {
+      "get" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the internal stats for the topic.",
         "description" : "",
-        "operationId" : "setPersistence",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getInternalStats",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3286,30 +3180,40 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "400" : {
-            "description" : "Invalid persistence policies"
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/PersistentTopicInternalStats"
+            }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
+            "description" : "Topic does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/replication" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/offload" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get the replication clusters for a namespace.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Offload a prefix of a topic to long term storage",
         "description" : "",
-        "operationId" : "getNamespaceReplicationClusters",
-        "consumes" : [ "application/json" ],
+        "operationId" : "offloadStatus",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3321,34 +3225,41 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
+              "$ref" : "#/definitions/OffloadProcessStatus"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+            "description" : "Topic does not exist"
           },
-          "412" : {
-            "description" : "Namespace is not global"
+          "405" : {
+            "description" : "Operation not allowed on persistent topic"
           }
         }
       },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Set the replication clusters for a namespace.",
+      "put" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Offload a prefix of a topic to long term storage",
         "description" : "",
-        "operationId" : "setNamespaceReplicationClusters",
-        "consumes" : [ "application/json" ],
+        "operationId" : "triggerOffload",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3360,30 +3271,40 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+            "description" : "Topic does not exist"
           },
-          "409" : {
-            "description" : "Peer-cluster can't be part of replication-cluster"
+          "405" : {
+            "description" : "Operation not allowed on persistent topic"
           },
-          "412" : {
-            "description" : "Namespace is not global or invalid cluster ids"
+          "409" : {
+            "description" : "Offload already running"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/retention" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/partitioned-stats" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get retention config on a namespace.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the stats for the partitioned topic.",
         "description" : "",
-        "operationId" : "getRetention",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getPartitionedStats",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3395,28 +3316,40 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/RetentionPolicies"
+              "$ref" : "#/definitions/PartitionedTopicStats"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Topic does not exist"
           }
         }
-      },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : " Set retention configuration on a namespace.",
+      }
+    },
+    "/non-persistent/{tenant}/{namespace}/{topic}/partitions" : {
+      "get" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get partitioned topic metadata.",
         "description" : "",
-        "operationId" : "setRetention",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getPartitionedMetadata",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3428,30 +3361,35 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/PartitionedTopicMetadata"
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace does not exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          },
-          "412" : {
-            "description" : "Retention Quota must exceed backlog quota"
           }
         }
-      }
-    },
-    "/namespaces/{tenant}/{namespace}/subscriptionAuthMode" : {
+      },
       "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : " Set a subscription auth mode for all the topics on a namespace.",
-        "description" : "",
-        "operationId" : "setSubscriptionAuthMode",
-        "consumes" : [ "application/json" ],
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Increment partitons of an existing partitioned topic.",
+        "description" : "It only increments partitions of existing non-global partitioned-topic",
+        "operationId" : "updatePartitionedTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3463,27 +3401,26 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
-          "404" : {
-            "description" : "Namespace does not exist"
-          },
           "409" : {
-            "description" : "Concurrent modification"
+            "description" : "Partitioned topic does not exist"
           }
         }
-      }
-    },
-    "/namespaces/{tenant}/{namespace}/subscriptionDispatchRate" : {
-      "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get Subscription dispatch-rate configured for the namespace, -1 represents not configured yet",
-        "description" : "",
-        "operationId" : "getSubscriptionDispatchRate",
-        "consumes" : [ "application/json" ],
+      },
+      "put" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Create a partitioned topic.",
+        "description" : "It needs to be called before creating a producer on a partitioned topic.",
+        "operationId" : "createPartitionedTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3495,28 +3432,32 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/DispatchRate"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
-          "404" : {
-            "description" : "Namespace does not exist"
+          "409" : {
+            "description" : "Partitioned topic already exists"
           }
         }
       },
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Set Subscription dispatch-rate throttling for all topics of the namespace",
-        "description" : "",
-        "operationId" : "setSubscriptionDispatchRate",
-        "consumes" : [ "application/json" ],
+      "delete" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Delete a partitioned topic.",
+        "description" : "It will also delete all the partitions of the topic if it exists.",
+        "operationId" : "deletePartitionedTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3528,21 +3469,40 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "force",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Partitioned topic does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/topics" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/permissions" : {
       "get" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Get the list of all the topics under a certain namespace.",
-        "description" : "",
-        "operationId" : "getTopics",
-        "consumes" : [ "application/json" ],
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get permissions on a topic.",
+        "description" : "Retrieve the effective permissions for a topic. These permissions are defined by the permissions set at thenamespace level combined (union) with any eventual specific permission set on the topic.",
+        "operationId" : "getPermissionsOnTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3554,15 +3514,19 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "array",
-              "uniqueItems" : true,
-              "items" : {
-                "type" : "string"
+              "type" : "object",
+              "additionalProperties" : {
+                "type" : "object"
               }
             }
           },
@@ -3570,18 +3534,17 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
+            "description" : "Namespace doesn't exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/unload" : {
-      "put" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Unload namespace",
-        "description" : "Unload an active namespace from the current broker serving it. Performing this operation will let the brokerremoves all producers, consumers, and connections using this namespace, and close all topics (includingtheir persistent store). During that operation, the namespace is marked as tentatively unavailable until thebroker completes the unloading action. This operation requires strictly super user privileges, since it wouldresult in non-persistent message loss a [...]
-        "operationId" : "unloadNamespace",
-        "consumes" : [ "application/json" ],
+    "/non-persistent/{tenant}/{namespace}/{topic}/permissions/{role}" : {
+      "post" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Grant a new permission to a role on a single topic.",
+        "description" : "",
+        "operationId" : "grantPermissionsOnTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3593,27 +3556,34 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
+        }, {
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "role",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or namespace doesn't exist"
+            "description" : "Namespace doesn't exist"
           },
-          "412" : {
-            "description" : "Namespace is already unloaded or Namespace has bundles activated"
+          "409" : {
+            "description" : "Concurrent modification"
           }
         }
-      }
-    },
-    "/namespaces/{tenant}/{namespace}/unsubscribe/{subscription}" : {
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Unsubscribes the given subscription on all topics on a namespace.",
-        "description" : "",
-        "operationId" : "unsubscribeNamespace",
-        "consumes" : [ "application/json" ],
+      },
+      "delete" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Revoke permissions on a topic.",
+        "description" : "Revoke permissions to a role on a single topic. If the permission was not set at the topiclevel, but rather at the namespace level, this operation will return an error (HTTP status code 412).",
+        "operationId" : "revokePermissionsOnTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3621,44 +3591,40 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "subscription",
+          "name" : "role",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Namespace doesn't exist"
+          },
+          "412" : {
+            "description" : "Permissions are not set at the topic level"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/{bundle}" : {
-      "delete" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Delete a namespace bundle and all the topics under it.",
+    "/non-persistent/{tenant}/{namespace}/{topic}/stats" : {
+      "get" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Get the stats for the topic.",
         "description" : "",
-        "operationId" : "deleteNamespaceBundle",
-        "consumes" : [ "application/json" ],
+        "operationId" : "getStats",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3671,7 +3637,7 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -3683,25 +3649,27 @@
           "default" : false
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "$ref" : "#/definitions/TopicStats"
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Tenant or cluster or namespace doesn't exist"
-          },
-          "409" : {
-            "description" : "Namespace bundle is not empty"
+            "description" : "Topic does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/{bundle}/clearBacklog" : {
-      "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Clear backlog for all topics on a namespace bundle.",
-        "description" : "",
-        "operationId" : "clearNamespaceBundleBacklog",
-        "consumes" : [ "application/json" ],
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}" : {
+      "delete" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Delete a subscription.",
+        "description" : "There should not be any active consumers on the subscription.",
+        "operationId" : "deleteSubscription",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3714,7 +3682,12 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "subName",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -3730,18 +3703,20 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Topic does not exist"
+          },
+          "412" : {
+            "description" : "Subscription has active consumers"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/{bundle}/clearBacklog/{subscription}" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/expireMessages/{expireTimeInSeconds}" : {
       "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Clear backlog for a given subscription on all topics on a namespace bundle.",
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Expire messages on a topic subscription.",
         "description" : "",
-        "operationId" : "clearNamespaceBundleBacklogForSubscription",
-        "consumes" : [ "application/json" ],
+        "operationId" : "expireTopicMessages",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3754,16 +3729,22 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "subscription",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "subName",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
+          "name" : "expireTimeInSeconds",
+          "in" : "path",
+          "required" : true,
+          "type" : "integer",
+          "format" : "int32"
+        }, {
           "name" : "authoritative",
           "in" : "query",
           "required" : false,
@@ -3775,18 +3756,17 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Topic or subscription does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/{bundle}/split" : {
-      "put" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Split a namespace bundle",
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/position/{messagePosition}" : {
+      "get" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Peek nth message on a topic subscription.",
         "description" : "",
-        "operationId" : "splitNamespaceBundle",
-        "consumes" : [ "application/json" ],
+        "operationId" : "peekNthMessage",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3799,18 +3779,23 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
+          "name" : "subName",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
         }, {
-          "name" : "unload",
+          "name" : "messagePosition",
+          "in" : "path",
+          "required" : true,
+          "type" : "integer",
+          "format" : "int32"
+        }, {
+          "name" : "authoritative",
           "in" : "query",
           "required" : false,
           "type" : "boolean",
@@ -3819,18 +3804,20 @@
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Topic, subscription or the message position does not exist"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/{bundle}/unload" : {
-      "put" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Unload a namespace bundle",
-        "description" : "",
-        "operationId" : "unloadNamespaceBundle",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor" : {
+      "post" : {
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Reset subscription to message position closest to given position.",
+        "description" : "It fence cursor and disconnects all active consumers before reseting cursor.",
+        "operationId" : "resetCursorOnPosition",
+        "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
@@ -3842,7 +3829,12 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "topic",
+          "in" : "path",
+          "required" : true,
+          "type" : "string"
+        }, {
+          "name" : "subName",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -3856,17 +3848,22 @@
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
+          },
+          "404" : {
+            "description" : "Topic/Subscription does not exist"
+          },
+          "405" : {
+            "description" : "Not supported for partitioned topics"
           }
         }
       }
     },
-    "/namespaces/{tenant}/{namespace}/{bundle}/unsubscribe/{subscription}" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor/{timestamp}" : {
       "post" : {
-        "tags" : [ "namespaces" ],
-        "summary" : "Unsubscribes the given subscription on all topics on a namespace bundle.",
-        "description" : "",
-        "operationId" : "unsubscribeNamespaceBundle",
-        "consumes" : [ "application/json" ],
+        "tags" : [ "non-persistent topic" ],
+        "summary" : "Reset subscription to message position closest to absolute timestamp (in ms).",
+        "description" : "It fence cursor and disconnects all active consumers before reseting cursor.",
+        "operationId" : "resetCursor",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -3879,16 +3876,22 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "subscription",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "subName",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
+          "name" : "timestamp",
+          "in" : "path",
+          "required" : true,
+          "type" : "integer",
+          "format" : "int64"
+        }, {
           "name" : "authoritative",
           "in" : "query",
           "required" : false,
@@ -3900,25 +3903,20 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace does not exist"
+            "description" : "Topic/Subscription does not exist"
           }
         }
       }
     },
-    "/non-persistent/{property}/{cluster}/{namespace}" : {
-      "get" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip/{numMessages}" : {
+      "post" : {
         "tags" : [ "non-persistent topic" ],
-        "summary" : "Get the list of non-persistent topics under a namespace.",
+        "summary" : "Skip messages on a topic subscription.",
         "description" : "",
-        "operationId" : "getList",
+        "operationId" : "skipMessages",
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -3927,97 +3925,63 @@
           "in" : "path",
           "required" : true,
           "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace doesn't exist"
-          }
-        }
-      }
-    },
-    "/non-persistent/{property}/{cluster}/{namespace}/{bundle}" : {
-      "get" : {
-        "tags" : [ "non-persistent topic" ],
-        "summary" : "Get the list of non-persistent topics under a namespace bundle.",
-        "description" : "",
-        "operationId" : "getListFromBundle",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "subName",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "bundle",
+          "name" : "numMessages",
           "in" : "path",
           "required" : true,
-          "type" : "string"
+          "type" : "integer",
+          "format" : "int32"
+        }, {
+          "name" : "authoritative",
+          "in" : "query",
+          "required" : false,
+          "type" : "boolean",
+          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Topic or subscription does not exist"
           }
         }
       }
     },
-    "/non-persistent/{property}/{cluster}/{namespace}/{topic}/compaction" : {
-      "get" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip_all" : {
+      "post" : {
         "tags" : [ "non-persistent topic" ],
-        "summary" : "Get the status of a compaction operation for a topic.",
-        "description" : "",
-        "operationId" : "compactionStatus",
+        "summary" : "Skip all messages on a topic subscription.",
+        "description" : "Completely clears the backlog on the subscription.",
+        "operationId" : "skipAllMessages",
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "topic",
+          "name" : "subName",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -4029,46 +3993,42 @@
           "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/LongRunningProcessStatus"
-            }
-          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Topic does not exist, or compaction hasn't run"
+            "description" : "Topic or subscription does not exist"
           },
           "405" : {
-            "description" : "Operation not allowed on persistent topic"
+            "description" : "Operation not allowed on non-persistent topic"
           }
         }
-      },
+      }
+    },
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subscriptionName}" : {
       "put" : {
         "tags" : [ "non-persistent topic" ],
-        "summary" : "Trigger a compaction operation on a topic.",
-        "description" : "",
-        "operationId" : "compact",
+        "summary" : "Reset subscription to message position closest to given position.",
+        "description" : "Creates a subscription on the topic at the specified message id",
+        "operationId" : "createSubscription",
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
+          "name" : "namespace",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "namespace",
+          "name" : "topic",
           "in" : "path",
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "topic",
+          "name" : "subscriptionName",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -4084,31 +4044,23 @@
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Topic does not exist"
+            "description" : "Topic/Subscription does not exist"
           },
           "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          },
-          "409" : {
-            "description" : "Compaction already running"
+            "description" : "Not supported for partitioned topics"
           }
         }
       }
     },
-    "/non-persistent/{property}/{cluster}/{namespace}/{topic}/subscription/{subscriptionName}" : {
-      "put" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/subscriptions" : {
+      "get" : {
         "tags" : [ "non-persistent topic" ],
-        "summary" : "Reset subscription to message position closest to given position.",
-        "description" : "Creates a subscription on the topic at the specified message id",
-        "operationId" : "createSubscription",
+        "summary" : "Get the list of persistent subscriptions for a given topic.",
+        "description" : "",
+        "operationId" : "getSubscriptions",
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -4123,11 +4075,6 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "subscriptionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
           "name" : "authoritative",
           "in" : "query",
           "required" : false,
@@ -4135,24 +4082,30 @@
           "default" : false
         } ],
         "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "array",
+              "items" : {
+                "type" : "object"
+              }
+            }
+          },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Topic/Subscription does not exist"
-          },
-          "405" : {
-            "description" : "Not supported for partitioned topics"
+            "description" : "Topic does not exist"
           }
         }
       }
     },
-    "/non-persistent/{tenant}/{cluster}/{namespace}/{topic}/offload" : {
-      "get" : {
+    "/non-persistent/{tenant}/{namespace}/{topic}/terminate" : {
+      "post" : {
         "tags" : [ "non-persistent topic" ],
-        "summary" : "Offload a prefix of a topic to long term storage",
+        "summary" : "Terminate a topic. A topic that is terminated will not accept any more messages to be published and will let consumer to drain existing messages in backlog",
         "description" : "",
-        "operationId" : "offloadStatus",
+        "operationId" : "terminate",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -4160,11 +4113,6 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
           "name" : "namespace",
           "in" : "path",
           "required" : true,
@@ -4185,7 +4133,7 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/OffloadProcessStatus"
+              "$ref" : "#/definitions/MessageId"
             }
           },
           "403" : {
@@ -4195,15 +4143,17 @@
             "description" : "Topic does not exist"
           },
           "405" : {
-            "description" : "Operation not allowed on persistent topic"
+            "description" : "Operation not allowed on non-persistent topic"
           }
         }
-      },
+      }
+    },
+    "/non-persistent/{tenant}/{namespace}/{topic}/unload" : {
       "put" : {
         "tags" : [ "non-persistent topic" ],
-        "summary" : "Offload a prefix of a topic to long term storage",
+        "summary" : "Unload a topic",
         "description" : "",
-        "operationId" : "triggerOffload",
+        "operationId" : "unloadTopic",
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
@@ -4211,11 +4161,6 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "cluster",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
           "name" : "namespace",
           "in" : "path",
           "required" : true,
@@ -4238,20 +4183,14 @@
           },
           "404" : {
             "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          },
-          "409" : {
-            "description" : "Offload already running"
           }
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}" : {
+    "/persistent/{tenant}/{namespace}" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
-        "summary" : "Get the list of non-persistent topics under a namespace.",
+        "tags" : [ "persistent topic" ],
+        "summary" : "Get the list of topics under a namespace.",
         "description" : "",
         "operationId" : "getList",
         "produces" : [ "application/json" ],
@@ -4285,9 +4224,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/partitioned" : {
+    "/persistent/{tenant}/{namespace}/partitioned" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the list of partitioned topics under a namespace.",
         "description" : "",
         "operationId" : "getPartitionedTopicList",
@@ -4322,51 +4261,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{bundle}" : {
-      "get" : {
-        "tags" : [ "non-persistent topic" ],
-        "summary" : "Get the list of non-persistent topics under a namespace bundle.",
-        "description" : "",
-        "operationId" : "getListFromBundle",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "bundle",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace doesn't exist"
-          }
-        }
-      }
-    },
-    "/non-persistent/{tenant}/{namespace}/{topic}" : {
+    "/persistent/{tenant}/{namespace}/{topic}" : {
       "delete" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Delete a topic.",
         "description" : "The topic cannot be deleted if delete is not forcefully and there's any active subscription or producer connected to the it. Force delete ignores connected clients and deletes topic by explicitly closing them.",
         "operationId" : "deleteTopic",
@@ -4412,9 +4309,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/all_subscription/expireMessages/{expireTimeInSeconds}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/all_subscription/expireMessages/{expireTimeInSeconds}" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Expire messages on all subscriptions of topic.",
         "description" : "",
         "operationId" : "expireMessagesForAllSubscriptions",
@@ -4457,9 +4354,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/backlog" : {
+    "/persistent/{tenant}/{namespace}/{topic}/backlog" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get estimated backlog for offline topic.",
         "description" : "",
         "operationId" : "getBacklog",
@@ -4502,9 +4399,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/compaction" : {
+    "/persistent/{tenant}/{namespace}/{topic}/compaction" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the status of a compaction operation for a topic.",
         "description" : "",
         "operationId" : "compactionStatus",
@@ -4550,7 +4447,7 @@
         }
       },
       "put" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Trigger a compaction operation on a topic.",
         "description" : "",
         "operationId" : "compact",
@@ -4593,9 +4490,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/internal-info" : {
+    "/persistent/{tenant}/{namespace}/{topic}/internal-info" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the internal stats for the topic.",
         "description" : "",
         "operationId" : "getManagedLedgerInfo",
@@ -4626,9 +4523,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/internalStats" : {
+    "/persistent/{tenant}/{namespace}/{topic}/internalStats" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the internal stats for the topic.",
         "description" : "",
         "operationId" : "getInternalStats",
@@ -4671,9 +4568,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/offload" : {
+    "/persistent/{tenant}/{namespace}/{topic}/offload" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Offload a prefix of a topic to long term storage",
         "description" : "",
         "operationId" : "offloadStatus",
@@ -4719,7 +4616,7 @@
         }
       },
       "put" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Offload a prefix of a topic to long term storage",
         "description" : "",
         "operationId" : "triggerOffload",
@@ -4762,9 +4659,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/partitioned-stats" : {
+    "/persistent/{tenant}/{namespace}/{topic}/partitioned-stats" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the stats for the partitioned topic.",
         "description" : "",
         "operationId" : "getPartitionedStats",
@@ -4807,9 +4704,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/partitions" : {
+    "/persistent/{tenant}/{namespace}/{topic}/partitions" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get partitioned topic metadata.",
         "description" : "",
         "operationId" : "getPartitionedMetadata",
@@ -4849,7 +4746,7 @@
         }
       },
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Increment partitons of an existing partitioned topic.",
         "description" : "It only increments partitions of existing non-global partitioned-topic",
         "operationId" : "updatePartitionedTopic",
@@ -4880,7 +4777,7 @@
         }
       },
       "put" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Create a partitioned topic.",
         "description" : "It needs to be called before creating a producer on a partitioned topic.",
         "operationId" : "createPartitionedTopic",
@@ -4912,12 +4809,12 @@
             "description" : "Don't have admin permission"
           },
           "409" : {
-            "description" : "Partitioned topic already exists"
+            "description" : "Partitioned topic already exist"
           }
         }
       },
       "delete" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Delete a partitioned topic.",
         "description" : "It will also delete all the partitions of the topic if it exists.",
         "operationId" : "deletePartitionedTopic",
@@ -4960,9 +4857,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/permissions" : {
+    "/persistent/{tenant}/{namespace}/{topic}/permissions" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get permissions on a topic.",
         "description" : "Retrieve the effective permissions for a topic. These permissions are defined by the permissions set at thenamespace level combined (union) with any eventual specific permission set on the topic.",
         "operationId" : "getPermissionsOnTopic",
@@ -5002,9 +4899,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/permissions/{role}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/permissions/{role}" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Grant a new permission to a role on a single topic.",
         "description" : "",
         "operationId" : "grantPermissionsOnTopic",
@@ -5043,7 +4940,7 @@
         }
       },
       "delete" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Revoke permissions on a topic.",
         "description" : "Revoke permissions to a role on a single topic. If the permission was not set at the topiclevel, but rather at the namespace level, this operation will return an error (HTTP status code 412).",
         "operationId" : "revokePermissionsOnTopic",
@@ -5082,9 +4979,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/stats" : {
+    "/persistent/{tenant}/{namespace}/{topic}/stats" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the stats for the topic.",
         "description" : "",
         "operationId" : "getStats",
@@ -5115,7 +5012,7 @@
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/NonPersistentTopicStats"
+              "$ref" : "#/definitions/TopicStats"
             }
           },
           "403" : {
@@ -5127,9 +5024,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}" : {
       "delete" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Delete a subscription.",
         "description" : "There should not be any active consumers on the subscription.",
         "operationId" : "deleteSubscription",
@@ -5174,9 +5071,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/expireMessages/{expireTimeInSeconds}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/expireMessages/{expireTimeInSeconds}" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Expire messages on a topic subscription.",
         "description" : "",
         "operationId" : "expireTopicMessages",
@@ -5224,9 +5121,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/position/{messagePosition}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/position/{messagePosition}" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Peek nth message on a topic subscription.",
         "description" : "",
         "operationId" : "peekNthMessage",
@@ -5274,9 +5171,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Reset subscription to message position closest to given position.",
         "description" : "It fence cursor and disconnects all active consumers before reseting cursor.",
         "operationId" : "resetCursorOnPosition",
@@ -5321,9 +5218,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor/{timestamp}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor/{timestamp}" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Reset subscription to message position closest to absolute timestamp (in ms).",
         "description" : "It fence cursor and disconnects all active consumers before reseting cursor.",
         "operationId" : "resetCursor",
@@ -5371,9 +5268,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip/{numMessages}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip/{numMessages}" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Skip messages on a topic subscription.",
         "description" : "",
         "operationId" : "skipMessages",
@@ -5421,9 +5318,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip_all" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip_all" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Skip all messages on a topic subscription.",
         "description" : "Completely clears the backlog on the subscription.",
         "operationId" : "skipAllMessages",
@@ -5468,9 +5365,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscription/{subscriptionName}" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subscriptionName}" : {
       "put" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Reset subscription to message position closest to given position.",
         "description" : "Creates a subscription on the topic at the specified message id",
         "operationId" : "createSubscription",
@@ -5515,9 +5412,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/subscriptions" : {
+    "/persistent/{tenant}/{namespace}/{topic}/subscriptions" : {
       "get" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Get the list of persistent subscriptions for a given topic.",
         "description" : "",
         "operationId" : "getSubscriptions",
@@ -5563,9 +5460,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/terminate" : {
+    "/persistent/{tenant}/{namespace}/{topic}/terminate" : {
       "post" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Terminate a topic. A topic that is terminated will not accept any more messages to be published and will let consumer to drain existing messages in backlog",
         "description" : "",
         "operationId" : "terminate",
@@ -5611,9 +5508,9 @@
         }
       }
     },
-    "/non-persistent/{tenant}/{namespace}/{topic}/unload" : {
+    "/persistent/{tenant}/{namespace}/{topic}/unload" : {
       "put" : {
-        "tags" : [ "non-persistent topic" ],
+        "tags" : [ "persistent topic" ],
         "summary" : "Unload a topic",
         "description" : "",
         "operationId" : "unloadTopic",
@@ -5650,20 +5547,64 @@
         }
       }
     },
-    "/persistent/{property}/{cluster}/{namespace}/{topic}/compaction" : {
+    "/resource-quotas" : {
       "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the status of a compaction operation for a topic.",
+        "tags" : [ "resource-quotas" ],
+        "summary" : "Get the default quota",
         "description" : "",
-        "operationId" : "compactionStatus",
+        "operationId" : "getDefaultResourceQuota",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "array",
+              "uniqueItems" : true,
+              "items" : {
+                "type" : "string"
+              }
+            }
+          },
+          "403" : {
+            "description" : "Don't have admin permission"
+          }
+        }
+      },
+      "post" : {
+        "tags" : [ "resource-quotas" ],
+        "summary" : "Set the default quota",
+        "description" : "",
+        "operationId" : "setDefaultResourceQuota",
+        "consumes" : [ "application/json" ],
+        "produces" : [ "application/json" ],
+        "responses" : {
+          "200" : {
+            "description" : "successful operation",
+            "schema" : {
+              "type" : "array",
+              "uniqueItems" : true,
+              "items" : {
+                "type" : "string"
+              }
+            }
+          },
+          "403" : {
+            "description" : "Don't have admin permission"
+          }
+        }
+      }
+    },
+    "/resource-quotas/{tenant}/{namespace}/{bundle}" : {
+      "get" : {
+        "tags" : [ "resource-quotas" ],
+        "summary" : "Get resource quota of a namespace bundle.",
+        "description" : "",
+        "operationId" : "getNamespaceBundleResourceQuota",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -5673,48 +5614,35 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "topic",
+          "name" : "bundle",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/LongRunningProcessStatus"
+              "$ref" : "#/definitions/ResourceQuota"
             }
           },
           "403" : {
             "description" : "Don't have admin permission"
           },
           "404" : {
-            "description" : "Topic does not exist, or compaction hasn't run"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
+            "description" : "Namespace does not exist"
           }
         }
       },
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Trigger a compaction operation on a topic.",
+      "post" : {
+        "tags" : [ "resource-quotas" ],
+        "summary" : "Set resource quota on a namespace.",
         "description" : "",
-        "operationId" : "compact",
+        "operationId" : "setNamespaceBundleResourceQuota",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -5724,47 +5652,29 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "topic",
+          "name" : "bundle",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          },
           "409" : {
-            "description" : "Compaction already running"
+            "description" : "Concurrent modification"
           }
         }
-      }
-    },
-    "/persistent/{property}/{cluster}/{namespace}/{topic}/subscription/{subscriptionName}" : {
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Reset subscription to message position closest to given position.",
-        "description" : "Creates a subscription on the topic at the specified message id",
-        "operationId" : "createSubscription",
+      },
+      "delete" : {
+        "tags" : [ "resource-quotas" ],
+        "summary" : "Remove resource quota for a namespace.",
+        "description" : "",
+        "operationId" : "removeNamespaceBundleResourceQuota",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
-          "name" : "property",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
+          "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
@@ -5774,4357 +5684,321 @@
           "required" : true,
           "type" : "string"
         }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subscriptionName",
+          "name" : "bundle",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
           "403" : {
             "description" : "Don't have admin permission"
           },
-          "404" : {
-            "description" : "Topic/Subscription does not exist"
-          },
-          "405" : {
-            "description" : "Not supported for partitioned topics"
+          "409" : {
+            "description" : "Concurrent modification"
           }
         }
       }
     },
-    "/persistent/{tenant}/{cluster}/{namespace}/{topic}/offload" : {
+    "/tenants" : {
       "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Offload a prefix of a topic to long term storage",
+        "tags" : [ "tenants" ],
+        "summary" : "Get the list of tenants.",
         "description" : "",
-        "operationId" : "offloadStatus",
+        "operationId" : "getTenants",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "$ref" : "#/definitions/OffloadProcessStatus"
+              "type" : "array",
+              "items" : {
+                "type" : "string"
+              }
             }
           },
           "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          }
-        }
-      },
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Offload a prefix of a topic to long term storage",
-        "description" : "",
-        "operationId" : "triggerOffload",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "cluster",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
+            "description" : "The requester doesn't have admin permissions"
           },
           "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          },
-          "409" : {
-            "description" : "Offload already running"
+            "description" : "Tenant doesn't exist"
           }
         }
       }
     },
-    "/persistent/{tenant}/{namespace}" : {
+    "/tenants/{tenant}" : {
       "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the list of topics under a namespace.",
+        "tags" : [ "tenants" ],
+        "summary" : "Get the admin configuration for a given tenant.",
         "description" : "",
-        "operationId" : "getList",
+        "operationId" : "getTenantAdmin",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
           "200" : {
             "description" : "successful operation",
             "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
+              "$ref" : "#/definitions/TenantInfo"
             }
           },
           "403" : {
-            "description" : "Don't have admin permission"
+            "description" : "The requester doesn't have admin permissions"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Tenant does not exist"
           }
         }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/partitioned" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the list of partitioned topics under a namespace.",
-        "description" : "",
-        "operationId" : "getPartitionedTopicList",
+      },
+      "post" : {
+        "tags" : [ "tenants" ],
+        "summary" : "Update the admins for a tenant.",
+        "description" : "This operation requires Pulsar super-user privileges.",
+        "operationId" : "updateTenant",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
           "403" : {
-            "description" : "Don't have admin permission"
+            "description" : "The requester doesn't have admin permissions"
           },
           "404" : {
-            "description" : "Namespace doesn't exist"
+            "description" : "Tenant does not exist"
+          },
+          "409" : {
+            "description" : "Tenant already exists"
           }
         }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}" : {
-      "delete" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Delete a topic.",
-        "description" : "The topic cannot be deleted if delete is not forcefully and there's any active subscription or producer connected to the it. Force delete ignores connected clients and deletes topic by explicitly closing them.",
-        "operationId" : "deleteTopic",
+      },
+      "put" : {
+        "tags" : [ "tenants" ],
+        "summary" : "Create a new tenant.",
+        "description" : "This operation requires Pulsar super-user privileges.",
+        "operationId" : "createTenant",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "force",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
           "403" : {
-            "description" : "Don't have admin permission"
+            "description" : "The requester doesn't have admin permissions"
           },
-          "404" : {
-            "description" : "Topic does not exist"
+          "409" : {
+            "description" : "Tenant already exists"
           },
           "412" : {
-            "description" : "Topic has active producers/subscriptions"
+            "description" : "Tenant name is not valid"
           }
         }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/all_subscription/expireMessages/{expireTimeInSeconds}" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Expire messages on all subscriptions of topic.",
+      },
+      "delete" : {
+        "tags" : [ "tenants" ],
+        "summary" : "Delete a tenant and all namespaces and topics under it.",
         "description" : "",
-        "operationId" : "expireMessagesForAllSubscriptions",
+        "operationId" : "deleteTenant",
+        "consumes" : [ "application/json" ],
         "produces" : [ "application/json" ],
         "parameters" : [ {
           "name" : "tenant",
           "in" : "path",
           "required" : true,
           "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "expireTimeInSeconds",
-          "in" : "path",
-          "required" : true,
-          "type" : "integer",
-          "format" : "int32"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic or subscription does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/backlog" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get estimated backlog for offline topic.",
-        "description" : "",
-        "operationId" : "getBacklog",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/PersistentOfflineTopicStats"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/compaction" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the status of a compaction operation for a topic.",
-        "description" : "",
-        "operationId" : "compactionStatus",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/LongRunningProcessStatus"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist, or compaction hasn't run"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          }
-        }
-      },
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Trigger a compaction operation on a topic.",
-        "description" : "",
-        "operationId" : "compact",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          },
-          "409" : {
-            "description" : "Compaction already running"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/internal-info" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the internal stats for the topic.",
-        "description" : "",
-        "operationId" : "getManagedLedgerInfo",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/internalStats" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the internal stats for the topic.",
-        "description" : "",
-        "operationId" : "getInternalStats",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
         } ],
         "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/PersistentTopicInternalStats"
-            }
-          },
           "403" : {
-            "description" : "Don't have admin permission"
+            "description" : "The requester doesn't have admin permissions"
           },
           "404" : {
-            "description" : "Topic does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/offload" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Offload a prefix of a topic to long term storage",
-        "description" : "",
-        "operationId" : "offloadStatus",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/OffloadProcessStatus"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          }
-        }
-      },
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Offload a prefix of a topic to long term storage",
-        "description" : "",
-        "operationId" : "triggerOffload",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on persistent topic"
-          },
-          "409" : {
-            "description" : "Offload already running"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/partitioned-stats" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the stats for the partitioned topic.",
-        "description" : "",
-        "operationId" : "getPartitionedStats",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/PartitionedTopicStats"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/partitions" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get partitioned topic metadata.",
-        "description" : "",
-        "operationId" : "getPartitionedMetadata",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/PartitionedTopicMetadata"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Increment partitons of an existing partitioned topic.",
-        "description" : "It only increments partitions of existing non-global partitioned-topic",
-        "operationId" : "updatePartitionedTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "409" : {
-            "description" : "Partitioned topic does not exist"
-          }
-        }
-      },
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Create a partitioned topic.",
-        "description" : "It needs to be called before creating a producer on a partitioned topic.",
-        "operationId" : "createPartitionedTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "409" : {
-            "description" : "Partitioned topic already exist"
-          }
-        }
-      },
-      "delete" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Delete a partitioned topic.",
-        "description" : "It will also delete all the partitions of the topic if it exists.",
-        "operationId" : "deletePartitionedTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "force",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Partitioned topic does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/permissions" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get permissions on a topic.",
-        "description" : "Retrieve the effective permissions for a topic. These permissions are defined by the permissions set at thenamespace level combined (union) with any eventual specific permission set on the topic.",
-        "operationId" : "getPermissionsOnTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "object",
-              "additionalProperties" : {
-                "type" : "object"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace doesn't exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/permissions/{role}" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Grant a new permission to a role on a single topic.",
-        "description" : "",
-        "operationId" : "grantPermissionsOnTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "role",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace doesn't exist"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          }
-        }
-      },
-      "delete" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Revoke permissions on a topic.",
-        "description" : "Revoke permissions to a role on a single topic. If the permission was not set at the topiclevel, but rather at the namespace level, this operation will return an error (HTTP status code 412).",
-        "operationId" : "revokePermissionsOnTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "role",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace doesn't exist"
-          },
-          "412" : {
-            "description" : "Permissions are not set at the topic level"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/stats" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the stats for the topic.",
-        "description" : "",
-        "operationId" : "getStats",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/TopicStats"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}" : {
-      "delete" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Delete a subscription.",
-        "description" : "There should not be any active consumers on the subscription.",
-        "operationId" : "deleteSubscription",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "412" : {
-            "description" : "Subscription has active consumers"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/expireMessages/{expireTimeInSeconds}" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Expire messages on a topic subscription.",
-        "description" : "",
-        "operationId" : "expireTopicMessages",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "expireTimeInSeconds",
-          "in" : "path",
-          "required" : true,
-          "type" : "integer",
-          "format" : "int32"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic or subscription does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/position/{messagePosition}" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Peek nth message on a topic subscription.",
-        "description" : "",
-        "operationId" : "peekNthMessage",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "messagePosition",
-          "in" : "path",
-          "required" : true,
-          "type" : "integer",
-          "format" : "int32"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic, subscription or the message position does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Reset subscription to message position closest to given position.",
-        "description" : "It fence cursor and disconnects all active consumers before reseting cursor.",
-        "operationId" : "resetCursorOnPosition",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic/Subscription does not exist"
-          },
-          "405" : {
-            "description" : "Not supported for partitioned topics"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/resetcursor/{timestamp}" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Reset subscription to message position closest to absolute timestamp (in ms).",
-        "description" : "It fence cursor and disconnects all active consumers before reseting cursor.",
-        "operationId" : "resetCursor",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "timestamp",
-          "in" : "path",
-          "required" : true,
-          "type" : "integer",
-          "format" : "int64"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic/Subscription does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip/{numMessages}" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Skip messages on a topic subscription.",
-        "description" : "",
-        "operationId" : "skipMessages",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "numMessages",
-          "in" : "path",
-          "required" : true,
-          "type" : "integer",
-          "format" : "int32"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic or subscription does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subName}/skip_all" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Skip all messages on a topic subscription.",
-        "description" : "Completely clears the backlog on the subscription.",
-        "operationId" : "skipAllMessages",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic or subscription does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on non-persistent topic"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscription/{subscriptionName}" : {
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Reset subscription to message position closest to given position.",
-        "description" : "Creates a subscription on the topic at the specified message id",
-        "operationId" : "createSubscription",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "subscriptionName",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic/Subscription does not exist"
-          },
-          "405" : {
-            "description" : "Not supported for partitioned topics"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/subscriptions" : {
-      "get" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Get the list of persistent subscriptions for a given topic.",
-        "description" : "",
-        "operationId" : "getSubscriptions",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "object"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/terminate" : {
-      "post" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Terminate a topic. A topic that is terminated will not accept any more messages to be published and will let consumer to drain existing messages in backlog",
-        "description" : "",
-        "operationId" : "terminate",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/MessageId"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          },
-          "405" : {
-            "description" : "Operation not allowed on non-persistent topic"
-          }
-        }
-      }
-    },
-    "/persistent/{tenant}/{namespace}/{topic}/unload" : {
-      "put" : {
-        "tags" : [ "persistent topic" ],
-        "summary" : "Unload a topic",
-        "description" : "",
-        "operationId" : "unloadTopic",
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "topic",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "authoritative",
-          "in" : "query",
-          "required" : false,
-          "type" : "boolean",
-          "default" : false
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Topic does not exist"
-          }
-        }
-      }
-    },
-    "/properties" : {
-      "get" : {
-        "tags" : [ "properties" ],
-        "summary" : "Get the list of tenants.",
-        "description" : "",
-        "operationId" : "getTenants",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant doesn't exist"
-          }
-        }
-      }
-    },
-    "/properties/{tenant}" : {
-      "get" : {
-        "tags" : [ "properties" ],
-        "summary" : "Get the admin configuration for a given tenant.",
-        "description" : "",
-        "operationId" : "getTenantAdmin",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/TenantInfo"
-            }
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant does not exist"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "properties" ],
-        "summary" : "Update the admins for a tenant.",
-        "description" : "This operation requires Pulsar super-user privileges.",
-        "operationId" : "updateTenant",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant does not exist"
-          },
-          "409" : {
-            "description" : "Tenant already exists"
-          }
-        }
-      },
-      "put" : {
-        "tags" : [ "properties" ],
-        "summary" : "Create a new tenant.",
-        "description" : "This operation requires Pulsar super-user privileges.",
-        "operationId" : "createTenant",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "409" : {
-            "description" : "Tenant already exists"
-          },
-          "412" : {
-            "description" : "Tenant name is not valid"
-          }
-        }
-      },
-      "delete" : {
-        "tags" : [ "properties" ],
-        "summary" : "Delete a tenant and all namespaces and topics under it.",
-        "description" : "",
-        "operationId" : "deleteTenant",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant does not exist"
-          },
-          "409" : {
-            "description" : "The tenant still has active namespaces"
-          }
-        }
-      }
-    },
-    "/resource-quotas" : {
-      "get" : {
-        "tags" : [ "resource-quotas" ],
-        "summary" : "Get the default quota",
-        "description" : "",
-        "operationId" : "getDefaultResourceQuota",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "uniqueItems" : true,
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "resource-quotas" ],
-        "summary" : "Set the default quota",
-        "description" : "",
-        "operationId" : "setDefaultResourceQuota",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "uniqueItems" : true,
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          }
-        }
-      }
-    },
-    "/resource-quotas/{tenant}/{namespace}/{bundle}" : {
-      "get" : {
-        "tags" : [ "resource-quotas" ],
-        "summary" : "Get resource quota of a namespace bundle.",
-        "description" : "",
-        "operationId" : "getNamespaceBundleResourceQuota",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "bundle",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/ResourceQuota"
-            }
-          },
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "404" : {
-            "description" : "Namespace does not exist"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "resource-quotas" ],
-        "summary" : "Set resource quota on a namespace.",
-        "description" : "",
-        "operationId" : "setNamespaceBundleResourceQuota",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "bundle",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          }
-        }
-      },
-      "delete" : {
-        "tags" : [ "resource-quotas" ],
-        "summary" : "Remove resource quota for a namespace.",
-        "description" : "",
-        "operationId" : "removeNamespaceBundleResourceQuota",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "namespace",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        }, {
-          "name" : "bundle",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "Don't have admin permission"
-          },
-          "409" : {
-            "description" : "Concurrent modification"
-          }
-        }
-      }
-    },
-    "/tenants" : {
-      "get" : {
-        "tags" : [ "tenants" ],
-        "summary" : "Get the list of tenants.",
-        "description" : "",
-        "operationId" : "getTenants",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "type" : "array",
-              "items" : {
-                "type" : "string"
-              }
-            }
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant doesn't exist"
-          }
-        }
-      }
-    },
-    "/tenants/{tenant}" : {
-      "get" : {
-        "tags" : [ "tenants" ],
-        "summary" : "Get the admin configuration for a given tenant.",
-        "description" : "",
-        "operationId" : "getTenantAdmin",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "200" : {
-            "description" : "successful operation",
-            "schema" : {
-              "$ref" : "#/definitions/TenantInfo"
-            }
-          },
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant does not exist"
-          }
-        }
-      },
-      "post" : {
-        "tags" : [ "tenants" ],
-        "summary" : "Update the admins for a tenant.",
-        "description" : "This operation requires Pulsar super-user privileges.",
-        "operationId" : "updateTenant",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant does not exist"
-          },
-          "409" : {
-            "description" : "Tenant already exists"
-          }
-        }
-      },
-      "put" : {
-        "tags" : [ "tenants" ],
-        "summary" : "Create a new tenant.",
-        "description" : "This operation requires Pulsar super-user privileges.",
-        "operationId" : "createTenant",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "409" : {
-            "description" : "Tenant already exists"
-          },
-          "412" : {
-            "description" : "Tenant name is not valid"
-          }
-        }
-      },
-      "delete" : {
-        "tags" : [ "tenants" ],
-        "summary" : "Delete a tenant and all namespaces and topics under it.",
-        "description" : "",
-        "operationId" : "deleteTenant",
-        "consumes" : [ "application/json" ],
-        "produces" : [ "application/json" ],
-        "parameters" : [ {
-          "name" : "tenant",
-          "in" : "path",
-          "required" : true,
-          "type" : "string"
-        } ],
-        "responses" : {
-          "403" : {
-            "description" : "The requester doesn't have admin permissions"
-          },
-          "404" : {
-            "description" : "Tenant does not exist"
-          },
-          "409" : {
-            "description" : "The tenant still has active namespaces"
-          }
-        }
-      }
-    }
-  },
-  "definitions" : {
-    "AllocatorStats" : {
-      "type" : "object",
-      "properties" : {
-        "numDirectArenas" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "numHeapArenas" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "numThreadLocalCaches" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "normalCacheSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "smallCacheSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "tinyCacheSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "directArenas" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/PoolArenaStats"
-          }
-        },
-        "heapArenas" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/PoolArenaStats"
-          }
-        }
-      }
-    },
-    "Assignment" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "instance" : {
-          "$ref" : "#/definitions/Instance"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserAssignment"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/Assignment"
-        },
-        "workerId" : {
-          "type" : "string"
-        },
-        "instanceOrBuilder" : {
-          "$ref" : "#/definitions/InstanceOrBuilder"
-        },
-        "workerIdBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "AuthPolicies" : {
-      "type" : "object",
-      "properties" : {
-        "namespace_auth" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "array",
-            "uniqueItems" : true,
-            "items" : {
-              "type" : "string",
-              "enum" : [ "produce", "consume" ]
-            }
-          }
-        },
-        "destination_auth" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object",
-            "additionalProperties" : {
-              "type" : "array",
-              "uniqueItems" : true,
-              "items" : {
-                "type" : "string",
-                "enum" : [ "produce", "consume" ]
-              }
-            }
-          }
-        }
-      }
-    },
-    "AutoFailoverPolicyData" : {
-      "type" : "object",
-      "properties" : {
-        "policy_type" : {
-          "type" : "string",
-          "enum" : [ "min_available" ]
-        },
-        "parameters" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "string"
-          }
-        }
-      }
-    },
-    "BacklogQuota" : {
-      "type" : "object",
-      "properties" : {
-        "limit" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "policy" : {
-          "type" : "string",
-          "enum" : [ "producer_request_hold", "producer_exception", "consumer_backlog_eviction" ]
-        }
-      }
-    },
-    "BookieInfo" : {
-      "type" : "object",
-      "properties" : {
-        "rack" : {
-          "type" : "string"
-        },
-        "hostname" : {
-          "type" : "string"
-        }
-      }
-    },
-    "BrokerNamespaceIsolationData" : {
-      "type" : "object",
-      "properties" : {
-        "brokerName" : {
-          "type" : "string"
-        },
-        "namespaceRegex" : {
-          "type" : "array",
-          "items" : {
-            "type" : "string"
-          }
-        }
-      }
-    },
-    "BundlesData" : {
-      "type" : "object",
-      "properties" : {
-        "boundaries" : {
-          "type" : "array",
-          "items" : {
-            "type" : "string"
-          }
-        },
-        "numBundles" : {
-          "type" : "integer",
-          "format" : "int32"
-        }
-      }
-    },
-    "ByteString" : {
-      "type" : "object",
-      "properties" : {
-        "empty" : {
-          "type" : "boolean"
-        },
-        "validUtf8" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "ClusterData" : {
-      "type" : "object",
-      "properties" : {
-        "serviceUrl" : {
-          "type" : "string"
-        },
-        "serviceUrlTls" : {
-          "type" : "string"
-        },
-        "brokerServiceUrl" : {
-          "type" : "string"
-        },
-        "brokerServiceUrlTls" : {
-          "type" : "string"
-        },
-        "peerClusterNames" : {
-          "type" : "array",
-          "uniqueItems" : true,
-          "items" : {
-            "type" : "string"
-          }
-        }
-      }
-    },
-    "ConsumerStats" : {
-      "type" : "object",
-      "properties" : {
-        "msgRateOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "msgThroughputOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "msgRateRedeliver" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "consumerName" : {
-          "type" : "string"
-        },
-        "availablePermits" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "unackedMessages" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "blockedConsumerOnUnackedMsgs" : {
-          "type" : "boolean"
-        },
-        "metadata" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "string"
-          }
-        },
-        "address" : {
-          "type" : "string"
-        },
-        "connectedSince" : {
-          "type" : "string"
-        },
-        "clientVersion" : {
-          "type" : "string"
-        }
-      }
-    },
-    "CursorDetails" : {
-      "type" : "object",
-      "properties" : {
-        "cursorBacklog" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "cursorLedgerId" : {
-          "type" : "integer",
-          "format" : "int64"
-        }
-      }
-    },
-    "CursorStats" : {
-      "type" : "object",
-      "properties" : {
-        "markDeletePosition" : {
-          "type" : "string"
-        },
-        "readPosition" : {
-          "type" : "string"
-        },
-        "waitingReadOp" : {
-          "type" : "boolean"
-        },
-        "pendingReadOps" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "messagesConsumedCounter" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "cursorLedger" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "cursorLedgerLastEntry" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "individuallyDeletedMessages" : {
-          "type" : "string"
-        },
-        "lastLedgerSwitchTimestamp" : {
-          "type" : "string"
-        },
-        "state" : {
-          "type" : "string"
-        },
-        "numberOfEntriesSinceFirstNotAckedMessage" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "totalNonContiguousDeletedMessagesRange" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "properties" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "integer",
-            "format" : "int64"
-          }
-        }
-      }
-    },
-    "DataDigest" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "max" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "count" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "min" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserDataDigest"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/DataDigest"
-        },
-        "sum" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "Descriptor" : {
-      "type" : "object",
-      "properties" : {
-        "index" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "fullName" : {
-          "type" : "string"
-        },
-        "file" : {
-          "$ref" : "#/definitions/FileDescriptor"
-        },
-        "containingType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "nestedTypes" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/Descriptor"
-          }
-        },
-        "enumTypes" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/EnumDescriptor"
-          }
-        },
-        "fields" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/FieldDescriptor"
-          }
-        },
-        "extensions" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/FieldDescriptor"
-          }
-        },
-        "oneofs" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/OneofDescriptor"
-          }
-        },
-        "name" : {
-          "type" : "string"
-        },
-        "options" : {
-          "$ref" : "#/definitions/MessageOptions"
-        },
-        "extendable" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "DispatchRate" : {
-      "type" : "object",
-      "properties" : {
-        "dispatchThrottlingRateInMsg" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "dispatchThrottlingRateInByte" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "ratePeriodInSecond" : {
-          "type" : "integer",
-          "format" : "int32"
-        }
-      }
-    },
-    "EncryptionContext" : {
-      "type" : "object",
-      "properties" : {
-        "keys" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "$ref" : "#/definitions/EncryptionKey"
-          }
-        },
-        "param" : {
-          "type" : "array",
-          "items" : {
-            "type" : "string",
-            "format" : "byte"
-          }
-        },
-        "algorithm" : {
-          "type" : "string"
-        },
-        "compressionType" : {
-          "type" : "string",
-          "enum" : [ "NONE", "LZ4", "ZLIB" ]
-        },
-        "uncompressedMessageSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "batchSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        }
-      }
-    },
-    "EncryptionKey" : {
-      "type" : "object",
-      "properties" : {
-        "keyValue" : {
-          "type" : "array",
-          "items" : {
-            "type" : "string",
-            "format" : "byte"
-          }
-        },
-        "metadata" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "string"
-          }
-        }
-      }
-    },
-    "EnumDescriptor" : {
-      "type" : "object",
-      "properties" : {
-        "index" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "fullName" : {
-          "type" : "string"
-        },
-        "file" : {
-          "$ref" : "#/definitions/FileDescriptor"
-        },
-        "containingType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "values" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/EnumValueDescriptor"
-          }
-        },
-        "name" : {
-          "type" : "string"
-        },
-        "options" : {
-          "$ref" : "#/definitions/EnumOptions"
-        }
-      }
-    },
-    "EnumOptions" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "deprecated" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserEnumOptions"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/EnumOptions"
-        },
-        "allowAlias" : {
-          "type" : "boolean"
-        },
-        "uninterpretedOptionList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOption"
-          }
-        },
-        "uninterpretedOptionOrBuilderList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOptionOrBuilder"
-          }
-        },
-        "uninterpretedOptionCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "allFieldsRaw" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        }
-      }
-    },
-    "EnumValueDescriptor" : {
-      "type" : "object",
-      "properties" : {
-        "index" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "fullName" : {
-          "type" : "string"
-        },
-        "file" : {
-          "$ref" : "#/definitions/FileDescriptor"
-        },
-        "type" : {
-          "$ref" : "#/definitions/EnumDescriptor"
-        },
-        "number" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "name" : {
-          "type" : "string"
-        },
-        "options" : {
-          "$ref" : "#/definitions/EnumValueOptions"
-        }
-      }
-    },
-    "EnumValueOptions" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "deprecated" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserEnumValueOptions"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/EnumValueOptions"
-        },
-        "uninterpretedOptionList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOption"
-          }
-        },
-        "uninterpretedOptionOrBuilderList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOptionOrBuilder"
-          }
-        },
-        "uninterpretedOptionCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "allFieldsRaw" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        }
-      }
-    },
-    "ExceptionInformation" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserExceptionInformation"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/ExceptionInformation"
-        },
-        "exceptionString" : {
-          "type" : "string"
-        },
-        "exceptionStringBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "msSinceEpoch" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "ExceptionInformationOrBuilder" : {
-      "type" : "object",
-      "properties" : {
-        "exceptionString" : {
-          "type" : "string"
-        },
-        "exceptionStringBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "msSinceEpoch" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/Message"
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "FailureDomain" : {
-      "type" : "object",
-      "properties" : {
-        "brokers" : {
-          "type" : "array",
-          "uniqueItems" : true,
-          "items" : {
-            "type" : "string"
-          }
-        }
-      }
-    },
-    "FieldDescriptor" : {
-      "type" : "object",
-      "properties" : {
-        "index" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "fullName" : {
-          "type" : "string"
-        },
-        "jsonName" : {
-          "type" : "string"
-        },
-        "file" : {
-          "$ref" : "#/definitions/FileDescriptor"
-        },
-        "extensionScope" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "type" : {
-          "type" : "string",
-          "enum" : [ "DOUBLE", "FLOAT", "INT64", "UINT64", "INT32", "FIXED64", "FIXED32", "BOOL", "STRING", "GROUP", "MESSAGE", "BYTES", "UINT32", "ENUM", "SFIXED32", "SFIXED64", "SINT32", "SINT64" ]
-        },
-        "containingType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "messageType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "containingOneof" : {
-          "$ref" : "#/definitions/OneofDescriptor"
-        },
-        "enumType" : {
-          "$ref" : "#/definitions/EnumDescriptor"
-        },
-        "defaultValue" : {
-          "type" : "object"
-        },
-        "name" : {
-          "type" : "string"
-        },
-        "number" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "options" : {
-          "$ref" : "#/definitions/FieldOptions"
-        },
-        "optional" : {
-          "type" : "boolean"
-        },
-        "required" : {
-          "type" : "boolean"
-        },
-        "packed" : {
-          "type" : "boolean"
-        },
-        "liteJavaType" : {
-          "type" : "string",
-          "enum" : [ "INT", "LONG", "FLOAT", "DOUBLE", "BOOLEAN", "STRING", "BYTE_STRING", "ENUM", "MESSAGE" ]
-        },
-        "liteType" : {
-          "type" : "string",
-          "enum" : [ "DOUBLE", "FLOAT", "INT64", "UINT64", "INT32", "FIXED64", "FIXED32", "BOOL", "STRING", "GROUP", "MESSAGE", "BYTES", "UINT32", "ENUM", "SFIXED32", "SFIXED64", "SINT32", "SINT64" ]
-        },
-        "packable" : {
-          "type" : "boolean"
-        },
-        "mapField" : {
-          "type" : "boolean"
-        },
-        "repeated" : {
-          "type" : "boolean"
-        },
-        "javaType" : {
-          "type" : "string",
-          "enum" : [ "INT", "LONG", "FLOAT", "DOUBLE", "BOOLEAN", "STRING", "BYTE_STRING", "ENUM", "MESSAGE" ]
-        },
-        "extension" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "FieldOptions" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "deprecated" : {
-          "type" : "boolean"
-        },
-        "weak" : {
-          "type" : "boolean"
-        },
-        "lazy" : {
-          "type" : "boolean"
-        },
-        "ctype" : {
-          "type" : "string",
-          "enum" : [ "STRING", "CORD", "STRING_PIECE" ]
-        },
-        "jstype" : {
-          "type" : "string",
-          "enum" : [ "JS_NORMAL", "JS_STRING", "JS_NUMBER" ]
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserFieldOptions"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/FieldOptions"
-        },
-        "packed" : {
-          "type" : "boolean"
-        },
-        "uninterpretedOptionList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOption"
-          }
-        },
-        "uninterpretedOptionOrBuilderList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOptionOrBuilder"
-          }
-        },
-        "uninterpretedOptionCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "allFieldsRaw" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        }
-      }
-    },
-    "FileDescriptor" : {
-      "type" : "object",
-      "properties" : {
-        "messageTypes" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/Descriptor"
-          }
-        },
-        "enumTypes" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/EnumDescriptor"
-          }
-        },
-        "services" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/ServiceDescriptor"
-          }
-        },
-        "extensions" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/FieldDescriptor"
-          }
-        },
-        "dependencies" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/FileDescriptor"
-          }
-        },
-        "publicDependencies" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/FileDescriptor"
-          }
-        },
-        "name" : {
-          "type" : "string"
-        },
-        "package" : {
-          "type" : "string"
-        },
-        "file" : {
-          "$ref" : "#/definitions/FileDescriptor"
-        },
-        "options" : {
-          "$ref" : "#/definitions/FileOptions"
-        },
-        "fullName" : {
-          "type" : "string"
-        },
-        "syntax" : {
-          "type" : "string",
-          "enum" : [ "UNKNOWN", "PROTO2", "PROTO3" ]
-        }
-      }
-    },
-    "FileOptions" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "deprecated" : {
-          "type" : "boolean"
-        },
-        "javaPackage" : {
-          "type" : "string"
-        },
-        "javaPackageBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "javaOuterClassname" : {
-          "type" : "string"
-        },
-        "javaOuterClassnameBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "javaMultipleFiles" : {
-          "type" : "boolean"
-        },
-        "javaGenerateEqualsAndHash" : {
-          "type" : "boolean"
-        },
-        "optimizeFor" : {
-          "type" : "string",
-          "enum" : [ "SPEED", "CODE_SIZE", "LITE_RUNTIME" ]
-        },
-        "goPackage" : {
-          "type" : "string"
-        },
-        "goPackageBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "ccGenericServices" : {
-          "type" : "boolean"
-        },
-        "javaGenericServices" : {
-          "type" : "boolean"
-        },
-        "pyGenericServices" : {
-          "type" : "boolean"
-        },
-        "phpGenericServices" : {
-          "type" : "boolean"
-        },
-        "ccEnableArenas" : {
-          "type" : "boolean"
-        },
-        "objcClassPrefix" : {
-          "type" : "string"
-        },
-        "objcClassPrefixBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "csharpNamespace" : {
-          "type" : "string"
-        },
-        "csharpNamespaceBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "swiftPrefix" : {
-          "type" : "string"
-        },
-        "swiftPrefixBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "phpClassPrefix" : {
-          "type" : "string"
-        },
-        "phpClassPrefixBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "phpNamespace" : {
-          "type" : "string"
-        },
-        "phpNamespaceBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserFileOptions"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/FileOptions"
-        },
-        "javaStringCheckUtf8" : {
-          "type" : "boolean"
-        },
-        "uninterpretedOptionList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOption"
-          }
-        },
-        "uninterpretedOptionOrBuilderList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/UninterpretedOptionOrBuilder"
-          }
-        },
-        "uninterpretedOptionCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "allFieldsRaw" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        }
-      }
-    },
-    "FunctionDetails" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "name" : {
-          "type" : "string"
-        },
-        "resources" : {
-          "$ref" : "#/definitions/Resources"
-        },
-        "runtime" : {
-          "type" : "string",
-          "enum" : [ "JAVA", "PYTHON", "UNRECOGNIZED" ]
-        },
-        "className" : {
-          "type" : "string"
-        },
-        "source" : {
-          "$ref" : "#/definitions/SourceSpec"
-        },
-        "namespace" : {
-          "type" : "string"
-        },
-        "sink" : {
-          "$ref" : "#/definitions/SinkSpec"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "nameBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "tenant" : {
-          "type" : "string"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserFunctionDetails"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/FunctionDetails"
-        },
-        "tenantBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "namespaceBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "classNameBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "logTopic" : {
-          "type" : "string"
-        },
-        "logTopicBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "processingGuaranteesValue" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "processingGuarantees" : {
-          "type" : "string",
-          "enum" : [ "ATLEAST_ONCE", "ATMOST_ONCE", "EFFECTIVELY_ONCE", "UNRECOGNIZED" ]
-        },
-        "userConfig" : {
-          "type" : "string"
-        },
-        "userConfigBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "runtimeValue" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "autoAck" : {
-          "type" : "boolean"
-        },
-        "parallelism" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "sourceOrBuilder" : {
-          "$ref" : "#/definitions/SourceSpecOrBuilder"
-        },
-        "sinkOrBuilder" : {
-          "$ref" : "#/definitions/SinkSpecOrBuilder"
-        },
-        "resourcesOrBuilder" : {
-          "$ref" : "#/definitions/ResourcesOrBuilder"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "FunctionDetailsOrBuilder" : {
-      "type" : "object",
-      "properties" : {
-        "name" : {
-          "type" : "string"
-        },
-        "resources" : {
-          "$ref" : "#/definitions/Resources"
-        },
-        "runtime" : {
-          "type" : "string",
-          "enum" : [ "JAVA", "PYTHON", "UNRECOGNIZED" ]
-        },
-        "className" : {
-          "type" : "string"
-        },
-        "source" : {
-          "$ref" : "#/definitions/SourceSpec"
-        },
-        "namespace" : {
-          "type" : "string"
-        },
-        "sink" : {
-          "$ref" : "#/definitions/SinkSpec"
-        },
-        "nameBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "tenant" : {
-          "type" : "string"
-        },
-        "tenantBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "namespaceBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "classNameBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "logTopic" : {
-          "type" : "string"
-        },
-        "logTopicBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "processingGuaranteesValue" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "processingGuarantees" : {
-          "type" : "string",
-          "enum" : [ "ATLEAST_ONCE", "ATMOST_ONCE", "EFFECTIVELY_ONCE", "UNRECOGNIZED" ]
-        },
-        "userConfig" : {
-          "type" : "string"
-        },
-        "userConfigBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "runtimeValue" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "autoAck" : {
-          "type" : "boolean"
-        },
-        "parallelism" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "sourceOrBuilder" : {
-          "$ref" : "#/definitions/SourceSpecOrBuilder"
-        },
-        "sinkOrBuilder" : {
-          "$ref" : "#/definitions/SinkSpecOrBuilder"
-        },
-        "resourcesOrBuilder" : {
-          "$ref" : "#/definitions/ResourcesOrBuilder"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/Message"
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "FunctionMetaData" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "createTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "version" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "functionDetails" : {
-          "$ref" : "#/definitions/FunctionDetails"
-        },
-        "functionDetailsOrBuilder" : {
-          "$ref" : "#/definitions/FunctionDetailsOrBuilder"
-        },
-        "packageLocation" : {
-          "$ref" : "#/definitions/PackageLocationMetaData"
-        },
-        "packageLocationOrBuilder" : {
-          "$ref" : "#/definitions/PackageLocationMetaDataOrBuilder"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserFunctionMetaData"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/FunctionMetaData"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "FunctionMetaDataOrBuilder" : {
-      "type" : "object",
-      "properties" : {
-        "createTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "version" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "functionDetails" : {
-          "$ref" : "#/definitions/FunctionDetails"
-        },
-        "functionDetailsOrBuilder" : {
-          "$ref" : "#/definitions/FunctionDetailsOrBuilder"
-        },
-        "packageLocation" : {
-          "$ref" : "#/definitions/PackageLocationMetaData"
-        },
-        "packageLocationOrBuilder" : {
-          "$ref" : "#/definitions/PackageLocationMetaDataOrBuilder"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/Message"
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "FunctionStatus" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "metrics" : {
-          "$ref" : "#/definitions/MetricsData"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserFunctionStatus"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/FunctionStatus"
-        },
-        "instanceId" : {
-          "type" : "string"
-        },
-        "running" : {
-          "type" : "boolean"
-        },
-        "failureException" : {
-          "type" : "string"
-        },
-        "failureExceptionBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "numRestarts" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "numProcessed" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "numSuccessfullyProcessed" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "numUserExceptions" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "latestUserExceptionsList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/ExceptionInformation"
-          }
-        },
-        "latestUserExceptionsOrBuilderList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/ExceptionInformationOrBuilder"
-          }
-        },
-        "latestUserExceptionsCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "numSystemExceptions" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "latestSystemExceptionsList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/ExceptionInformation"
-          }
-        },
-        "latestSystemExceptionsOrBuilderList" : {
-          "type" : "array",
-          "items" : {
-            "$ref" : "#/definitions/ExceptionInformationOrBuilder"
-          }
-        },
-        "latestSystemExceptionsCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "deserializationExceptionsCount" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "deserializationExceptions" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "integer",
-            "format" : "int64"
-          }
-        },
-        "deserializationExceptionsMap" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "integer",
-            "format" : "int64"
-          }
-        },
-        "serializationExceptions" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "averageLatency" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "lastInvocationTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "instanceIdBytes" : {
-          "$ref" : "#/definitions/ByteString"
-        },
-        "metricsOrBuilder" : {
-          "$ref" : "#/definitions/MetricsDataOrBuilder"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "Instance" : {
-      "type" : "object",
-      "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserInstance"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/Instance"
-        },
-        "functionMetaData" : {
-          "$ref" : "#/definitions/FunctionMetaData"
-        },
-        "functionMetaDataOrBuilder" : {
-          "$ref" : "#/definitions/FunctionMetaDataOrBuilder"
-        },
-        "instanceId" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        }
-      }
-    },
-    "InstanceOrBuilder" : {
-      "type" : "object",
-      "properties" : {
-        "functionMetaData" : {
-          "$ref" : "#/definitions/FunctionMetaData"
-        },
-        "functionMetaDataOrBuilder" : {
-          "$ref" : "#/definitions/FunctionMetaDataOrBuilder"
-        },
-        "instanceId" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "allFields" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "object"
-          }
-        },
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/Message"
-        },
-        "initializationErrorString" : {
-          "type" : "string"
-        },
-        "descriptorForType" : {
-          "$ref" : "#/definitions/Descriptor"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "InternalConfigurationData" : {
-      "type" : "object",
-      "properties" : {
-        "zookeeperServers" : {
-          "type" : "string"
-        },
-        "configurationStoreServers" : {
-          "type" : "string"
-        },
-        "ledgersRootPath" : {
-          "type" : "string"
-        }
-      }
-    },
-    "LedgerDetails" : {
-      "type" : "object",
-      "properties" : {
-        "entries" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "timestamp" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "size" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "ledgerId" : {
-          "type" : "integer",
-          "format" : "int64"
-        }
-      }
-    },
-    "LedgerInfo" : {
-      "type" : "object",
-      "properties" : {
-        "ledgerId" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "entries" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "size" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "offloaded" : {
-          "type" : "boolean"
-        }
-      }
-    },
-    "LoadReport" : {
-      "type" : "object",
-      "properties" : {
-        "name" : {
-          "type" : "string"
-        },
-        "brokerVersionString" : {
-          "type" : "string"
-        },
-        "webServiceUrl" : {
-          "type" : "string"
-        },
-        "webServiceUrlTls" : {
-          "type" : "string"
-        },
-        "pulsarServiceUrl" : {
-          "type" : "string"
-        },
-        "pulsarServiceUrlTls" : {
-          "type" : "string"
-        },
-        "persistentTopicsEnabled" : {
-          "type" : "boolean"
-        },
-        "nonPersistentTopicsEnabled" : {
-          "type" : "boolean"
-        },
-        "timestamp" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "msgRateIn" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "msgRateOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "numTopics" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "numConsumers" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "numProducers" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "numBundles" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "systemResourceUsage" : {
-          "$ref" : "#/definitions/SystemResourceUsage"
-        },
-        "bundleStats" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "$ref" : "#/definitions/NamespaceBundleStats"
-          }
-        },
-        "bundleGains" : {
-          "type" : "array",
-          "uniqueItems" : true,
-          "items" : {
-            "type" : "string"
-          }
-        },
-        "bundleLosses" : {
-          "type" : "array",
-          "uniqueItems" : true,
-          "items" : {
-            "type" : "string"
-          }
-        },
-        "allocatedCPU" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "allocatedMemory" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "allocatedBandwidthIn" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "allocatedBandwidthOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "allocatedMsgRateIn" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "allocatedMsgRateOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "preAllocatedCPU" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "preAllocatedMemory" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "preAllocatedBandwidthIn" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "preAllocatedBandwidthOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "preAllocatedMsgRateIn" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "preAllocatedMsgRateOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "msgThroughputOut" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "msgThroughputIn" : {
-          "type" : "number",
-          "format" : "double"
-        },
-        "memory" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "directMemory" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "bandwidthIn" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "bandwidthOut" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "lastUpdate" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "cpu" : {
-          "$ref" : "#/definitions/ResourceUsage"
-        },
-        "underLoaded" : {
-          "type" : "boolean"
-        },
-        "overLoaded" : {
-          "type" : "boolean"
-        },
-        "loadReportType" : {
-          "type" : "string"
-        }
-      }
-    },
-    "LongRunningProcessStatus" : {
-      "type" : "object",
-      "properties" : {
-        "status" : {
-          "type" : "string",
-          "enum" : [ "NOT_RUN", "RUNNING", "SUCCESS", "ERROR" ]
-        },
-        "lastError" : {
-          "type" : "string"
-        }
-      }
-    },
-    "Message" : {
-      "type" : "object",
-      "properties" : {
-        "value" : {
-          "type" : "object"
-        },
-        "key" : {
-          "type" : "string"
-        },
-        "properties" : {
-          "type" : "object",
-          "additionalProperties" : {
-            "type" : "string"
-          }
-        },
-        "data" : {
-          "type" : "array",
-          "items" : {
-            "type" : "string",
-            "format" : "byte"
-          }
-        },
-        "publishTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "eventTime" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "sequenceId" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "producerName" : {
-          "type" : "string"
-        },
-        "encryptionCtx" : {
-          "$ref" : "#/definitions/EncryptionContext"
-        },
-        "messageId" : {
-          "$ref" : "#/definitions/MessageId"
-        }
-      }
-    },
-    "MessageId" : {
-      "type" : "object"
-    },
-    "MessageIdImpl" : {
-      "type" : "object",
-      "properties" : {
-        "ledgerId" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "entryId" : {
-          "type" : "integer",
-          "format" : "int64"
-        },
-        "partitionIndex" : {
-          "type" : "integer",
-          "format" : "int32"
-        }
-      }
-    },
-    "MessageLite" : {
-      "type" : "object",
-      "properties" : {
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserMessageLite"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/MessageLite"
+            "description" : "Tenant does not exist"
+          },
+          "409" : {
+            "description" : "The tenant still has active namespaces"
+          }
         }
       }
-    },
-    "MessageOptions" : {
+    }
+  },
+  "definitions" : {
+    "AllocatorStats" : {
       "type" : "object",
       "properties" : {
-        "unknownFields" : {
-          "$ref" : "#/definitions/UnknownFieldSet"
-        },
-        "initialized" : {
-          "type" : "boolean"
-        },
-        "deprecated" : {
-          "type" : "boolean"
-        },
-        "serializedSize" : {
-          "type" : "integer",
-          "format" : "int32"
-        },
-        "parserForType" : {
-          "$ref" : "#/definitions/ParserMessageOptions"
-        },
-        "defaultInstanceForType" : {
-          "$ref" : "#/definitions/MessageOptions"
-        },
-        "mapEntry" : {
-          "type" : "boolean"
-        },
-        "messageSetWireFormat" : {
-          "type" : "boolean"
... 3089 lines suppressed ...


Mime
View raw message