This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/master by this push:
     new 0ec3883ed14 [cleanup] PIP-462: Remove Etcd metadata store backend 
(#25380)
0ec3883ed14 is described below

commit 0ec3883ed1425527ce28ac63e6969c99b6a97f17
Author: Matteo Merli <[email protected]>
AuthorDate: Tue Mar 24 13:57:38 2026 -0700

    [cleanup] PIP-462: Remove Etcd metadata store backend (#25380)
---
 conf/bookkeeper.conf                               |   1 -
 distribution/server/pom.xml                        |   6 -
 distribution/server/src/assemble/LICENSE.bin.txt   |   2 -
 jetcd-core-shaded/pom.xml                          | 181 --------
 pom.xml                                            |  55 +--
 pulsar-broker/pom.xml                              |  17 -
 pulsar-metadata/pom.xml                            |  16 -
 .../pulsar/metadata/impl/EtcdMetadataStore.java    | 512 ---------------------
 .../pulsar/metadata/impl/EtcdSessionWatcher.java   | 161 -------
 .../metadata/impl/MetadataStoreFactoryImpl.java    |   8 +-
 .../pulsar/metadata/BaseMetadataStoreTest.java     |  27 +-
 .../metadata/impl/EtcdMetadataStoreTest.java       | 130 ------
 .../impl/MetadataStoreFactoryImplTest.java         |   1 -
 pulsar-metadata/src/test/resources/ssl/.gitignore  |   1 -
 pulsar-metadata/src/test/resources/ssl/README.md   |  28 --
 .../src/test/resources/ssl/cert/ca-config.json     |   1 -
 .../src/test/resources/ssl/cert/ca-key.pem         |  27 --
 pulsar-metadata/src/test/resources/ssl/cert/ca.csr |  15 -
 pulsar-metadata/src/test/resources/ssl/cert/ca.pem |  18 -
 .../src/test/resources/ssl/cert/client-key-pk8.pem |  28 --
 .../src/test/resources/ssl/cert/client-key.pem     |  27 --
 .../src/test/resources/ssl/cert/client.csr         |  16 -
 .../src/test/resources/ssl/cert/client.pem         |  20 -
 .../src/test/resources/ssl/cert/etcd0-key.pem      |  27 --
 .../src/test/resources/ssl/cert/etcd0.csr          |  16 -
 .../src/test/resources/ssl/cert/etcd0.pem          |  20 -
 .../src/test/resources/ssl/cert/etcd1-key.pem      |  27 --
 .../src/test/resources/ssl/cert/etcd1.csr          |  16 -
 .../src/test/resources/ssl/cert/etcd1.pem          |  20 -
 .../src/test/resources/ssl/cert/etcd2-key.pem      |  27 --
 .../src/test/resources/ssl/cert/etcd2.csr          |  16 -
 .../src/test/resources/ssl/cert/etcd2.pem          |  20 -
 .../src/test/resources/ssl/cert/server-key.pem     |  27 --
 .../src/test/resources/ssl/cert/server.csr         |  16 -
 .../src/test/resources/ssl/cert/server.pem         |  20 -
 .../ssl/generate-self-signed-certificates.sh       |  70 ---
 src/owasp-dependency-check-suppressions.xml        |  16 -
 37 files changed, 9 insertions(+), 1627 deletions(-)

diff --git a/conf/bookkeeper.conf b/conf/bookkeeper.conf
index a482a28cc75..fa63fd389c1 100644
--- a/conf/bookkeeper.conf
+++ b/conf/bookkeeper.conf
@@ -663,7 +663,6 @@ diskCheckInterval=10000
 # Metadata service uri that bookkeeper uses for loading the corresponding 
metadata driver and resolving its metadata service location
 # Examples:
 #  - metadataServiceUri=zk+hierarchical://my-zk-1:2181/ledgers
-#  - metadataServiceUri=etcd+hierarchical:http://my-etcd:2379
 #  - metadataServiceUri=metadata-store:zk:my-zk-1:2281/ledgers
 #  - metadataServiceUri=metadata-store:oxia://oxia-server:6648/bookkeeper
 # If you use metadata-store configuration, you need to configure following 
items in JVM option:
diff --git a/distribution/server/pom.xml b/distribution/server/pom.xml
index db5c11c6c47..1f3be39ff6d 100644
--- a/distribution/server/pom.xml
+++ b/distribution/server/pom.xml
@@ -45,12 +45,6 @@
       <version>${project.version}</version>
     </dependency>
 
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>jetcd-core-shaded</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>pulsar-docs-tools</artifactId>
diff --git a/distribution/server/src/assemble/LICENSE.bin.txt 
b/distribution/server/src/assemble/LICENSE.bin.txt
index 34852aeaaaf..2b25d693275 100644
--- a/distribution/server/src/assemble/LICENSE.bin.txt
+++ b/distribution/server/src/assemble/LICENSE.bin.txt
@@ -473,7 +473,6 @@ The Apache Software License, Version 2.0
     - io.opencensus-opencensus-contrib-http-util-0.28.0.jar
   * Jodah
     - net.jodah-typetools-0.5.0.jar
-    - dev.failsafe-failsafe-3.3.2.jar
   * Byte Buddy
     - net.bytebuddy-byte-buddy-1.17.7.jar
   * zt-zip
@@ -523,7 +522,6 @@ The Apache Software License, Version 2.0
     - com.google.http-client-google-http-client-1.41.0.jar
     - com.google.auto.value-auto-value-annotations-1.11.0.jar
     - com.google.re2j-re2j-1.8.jar
-  * Jetcd - shaded
   * IPAddress
     - com.github.seancfoley-ipaddress-5.5.0.jar
   * RxJava
diff --git a/jetcd-core-shaded/pom.xml b/jetcd-core-shaded/pom.xml
deleted file mode 100644
index 358a6940c34..00000000000
--- a/jetcd-core-shaded/pom.xml
+++ /dev/null
@@ -1,181 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-
--->
-<project
-        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";
-        xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.pulsar</groupId>
-    <artifactId>pulsar</artifactId>
-    <version>4.3.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>jetcd-core-shaded</artifactId>
-  <name>Apache Pulsar :: jetcd-core shaded</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>io.etcd</groupId>
-      <artifactId>jetcd-core</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>io.grpc</groupId>
-          <artifactId>grpc-netty</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>io.netty</groupId>
-          <artifactId>*</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.annotation</groupId>
-          <artifactId>javax.annotation-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-netty-shaded</artifactId>
-    </dependency>
-    <!-- add transient dependencies for jetcd libraries, this is necessary for 
IntelliJ support -->
-    <dependency>
-      <groupId>dev.failsafe</groupId>
-      <artifactId>failsafe</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-protobuf</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-stub</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-grpclb</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-util</artifactId>
-    </dependency>
-  </dependencies>
-  <build>
-    <finalName>${project.artifactId}-${project.version}</finalName>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-shade-jar</id>
-            <phase>package</phase>
-            <goals>
-              <goal>attach-artifact</goal>
-            </goals>
-            <configuration>
-              <artifacts>
-                <artifact>
-                  
<file>${project.build.directory}/${project.build.finalName}.jar</file>
-                  <type>jar</type>
-                  <classifier>shaded</classifier>
-                </artifact>
-              </artifacts>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <createDependencyReducedPom>true</createDependencyReducedPom>
-              
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-              <minimizeJar>false</minimizeJar>
-              <artifactSet>
-                <includes>
-                  <include>io.etcd:*</include>
-                  <include>io.vertx:*</include>
-                </includes>
-                <excludes>
-                  <!-- This is required for execute shade multiple times 
without clean -->
-                  <exclude>org.apache.pulsar:jetcd-core-shaded</exclude>
-                </excludes>
-              </artifactSet>
-              <relocations>
-                <!-- relocate vertx packages since they will be transformed to 
use grpc-netty-shaded packages -->
-                <relocation>
-                  <pattern>io.vertx</pattern>
-                  
<shadedPattern>org.apache.pulsar.jetcd.shaded.io.vertx</shadedPattern>
-                </relocation>
-                <!-- relocate multi-release packages -->
-                <relocation>
-                  <pattern>META-INF/versions/(\d+)/io/vertx/</pattern>
-                  
<shadedPattern>META-INF/versions/$1/org/apache/pulsar/jetcd/shaded/io/vertx/</shadedPattern>
-                  <rawString>true</rawString>
-                </relocation>
-                <!-- relocate to use grpc-netty-shaded packages -->
-                <relocation>
-                  <pattern>io.grpc.netty</pattern>
-                  
<shadedPattern>io.grpc.netty.shaded.io.grpc.netty</shadedPattern>
-                </relocation>
-                <!-- relocate to use grpc-netty-shaded packages -->
-                <relocation>
-                  <pattern>io.netty</pattern>
-                  <shadedPattern>io.grpc.netty.shaded.io.netty</shadedPattern>
-                </relocation>
-              </relocations>
-              <filters>
-                <filter>
-                  <artifact>*:*</artifact>
-                  <excludes>
-                    <exclude>META-INF/*.SF</exclude>
-                    <exclude>META-INF/*.DSA</exclude>
-                    <exclude>META-INF/*.RSA</exclude>
-                    
<exclude>META-INF/maven/${project.groupId}/${project.artifactId}/pom.xml</exclude>
-                  </excludes>
-                </filter>
-              </filters>
-              <transformers>
-                <transformer 
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                  <manifestEntries>
-                    <Multi-Release>true</Multi-Release>
-                  </manifestEntries>
-                </transformer>
-                <transformer 
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
-                <transformer 
implementation="org.apache.maven.plugins.shade.resource.PluginXmlResourceTransformer"/>
-                <transformer 
implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
-                  
<resource>META-INF/maven/${project.groupId}/${project.artifactId}/pom.xml</resource>
-                  <file>${project.basedir}/dependency-reduced-pom.xml</file>
-                </transformer>
-              </transformers>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/pom.xml b/pom.xml
index 96d66700598..47af5b627b2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -297,7 +297,6 @@ flexible messaging model and an intuitive client 
API.</description>
     <spring.version>6.2.12</spring.version>
     <apache-http-client.version>4.5.13</apache-http-client.version>
     <apache-httpcomponents.version>4.4.15</apache-httpcomponents.version>
-    <jetcd.version>0.7.7</jetcd.version>
     <oxia.version>0.7.4</oxia.version>
     <snakeyaml.version>2.0</snakeyaml.version>
     <ant.version>1.10.12</ant.version>
@@ -1083,56 +1082,6 @@ flexible messaging model and an intuitive client 
API.</description>
         <version>${hppc.version}</version>
       </dependency>
 
-      <dependency>
-        <groupId>io.etcd</groupId>
-        <artifactId>jetcd-core</artifactId>
-        <version>${jetcd.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>io.grpc</groupId>
-            <artifactId>grpc-netty</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>io.etcd</groupId>
-        <artifactId>jetcd-test</artifactId>
-        <version>${jetcd.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>io.grpc</groupId>
-            <artifactId>grpc-netty</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>io.etcd</groupId>
-            <artifactId>jetcd-core</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>io.etcd</groupId>
-            <artifactId>jetcd-api</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>io.vertx</groupId>
-            <artifactId>*</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>${project.groupId}</groupId>
-        <artifactId>jetcd-core-shaded</artifactId>
-        <version>${project.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>io.etcd</groupId>
-            <artifactId>*</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>io.vertx</groupId>
-            <artifactId>*</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-
       <dependency>
         <groupId>org.apache.spark</groupId>
         <artifactId>spark-streaming_2.10</artifactId>
@@ -2645,7 +2594,7 @@ flexible messaging model and an intuitive client 
API.</description>
         <module>pulsar-client-messagecrypto-bc</module>
 
         <module>pulsar-metadata</module>
-        <module>jetcd-core-shaded</module>
+
         <module>jclouds-shaded</module>
         <module>pulsar-client-dependencies-minimized</module>
 
@@ -2713,7 +2662,7 @@ flexible messaging model and an intuitive client 
API.</description>
         <!-- all these modules should be put at the end in this exact sequence 
-->
         <module>distribution</module>
         <module>pulsar-metadata</module>
-        <module>jetcd-core-shaded</module>
+
         <module>pulsar-client-dependencies-minimized</module>
         <!-- package management releated modules (begin) -->
         <module>pulsar-package-management</module>
diff --git a/pulsar-broker/pom.xml b/pulsar-broker/pom.xml
index 0b74d3078c7..f954bbcddfa 100644
--- a/pulsar-broker/pom.xml
+++ b/pulsar-broker/pom.xml
@@ -487,23 +487,6 @@
       <version>${project.version}</version>
     </dependency>
 
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>jetcd-core-shaded</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-netty-shaded</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>io.etcd</groupId>
-      <artifactId>jetcd-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>pulsar-package-filesystem-storage</artifactId>
diff --git a/pulsar-metadata/pom.xml b/pulsar-metadata/pom.xml
index 18a705dd9e5..8c2ea805965 100644
--- a/pulsar-metadata/pom.xml
+++ b/pulsar-metadata/pom.xml
@@ -122,22 +122,6 @@
       <artifactId>bookkeeper-server</artifactId>
     </dependency>
 
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>jetcd-core-shaded</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>io.grpc</groupId>
-      <artifactId>grpc-netty-shaded</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>io.etcd</groupId>
-      <artifactId>jetcd-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
     <dependency>
       <groupId>com.github.ben-manes.caffeine</groupId>
       <artifactId>caffeine</artifactId>
diff --git 
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
 
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
deleted file mode 100644
index e1311fccfe0..00000000000
--- 
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.pulsar.metadata.impl;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import io.etcd.jetcd.ByteSequence;
-import io.etcd.jetcd.Client;
-import io.etcd.jetcd.ClientBuilder;
-import io.etcd.jetcd.KV;
-import io.etcd.jetcd.KeyValue;
-import io.etcd.jetcd.Txn;
-import io.etcd.jetcd.kv.DeleteResponse;
-import io.etcd.jetcd.kv.GetResponse;
-import io.etcd.jetcd.kv.PutResponse;
-import io.etcd.jetcd.kv.TxnResponse;
-import io.etcd.jetcd.lease.LeaseKeepAliveResponse;
-import io.etcd.jetcd.op.Cmp;
-import io.etcd.jetcd.op.CmpTarget;
-import io.etcd.jetcd.op.Op;
-import io.etcd.jetcd.options.DeleteOption;
-import io.etcd.jetcd.options.GetOption;
-import io.etcd.jetcd.options.PutOption;
-import io.etcd.jetcd.options.WatchOption;
-import io.etcd.jetcd.support.CloseableClient;
-import io.etcd.jetcd.watch.WatchEvent;
-import io.etcd.jetcd.watch.WatchResponse;
-import io.grpc.Status;
-import io.grpc.StatusRuntimeException;
-import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
-import io.grpc.netty.shaded.io.netty.handler.ssl.SslProvider;
-import io.grpc.stub.StreamObserver;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.pulsar.metadata.api.GetResult;
-import org.apache.pulsar.metadata.api.MetadataStore;
-import org.apache.pulsar.metadata.api.MetadataStoreConfig;
-import org.apache.pulsar.metadata.api.MetadataStoreException;
-import org.apache.pulsar.metadata.api.MetadataStoreProvider;
-import org.apache.pulsar.metadata.api.Notification;
-import org.apache.pulsar.metadata.api.NotificationType;
-import org.apache.pulsar.metadata.api.Stat;
-import org.apache.pulsar.metadata.api.extended.CreateOption;
-import org.apache.pulsar.metadata.api.extended.SessionEvent;
-import org.apache.pulsar.metadata.impl.batching.AbstractBatchedMetadataStore;
-import org.apache.pulsar.metadata.impl.batching.MetadataOp;
-import org.apache.pulsar.metadata.impl.batching.OpDelete;
-import org.apache.pulsar.metadata.impl.batching.OpGet;
-import org.apache.pulsar.metadata.impl.batching.OpGetChildren;
-import org.apache.pulsar.metadata.impl.batching.OpPut;
-
-@Slf4j
-public class EtcdMetadataStore extends AbstractBatchedMetadataStore {
-
-    static final String ETCD_SCHEME = "etcd";
-    static final String ETCD_SCHEME_IDENTIFIER = "etcd:";
-
-    private final int leaseTTLSeconds;
-    private final Client client;
-    private final KV kv;
-    private volatile long leaseId;
-    private volatile CloseableClient leaseClient;
-    private final EtcdSessionWatcher sessionWatcher;
-
-    public EtcdMetadataStore(String metadataURL, MetadataStoreConfig conf, 
boolean enableSessionWatcher)
-            throws MetadataStoreException {
-        super(conf);
-
-        this.leaseTTLSeconds = conf.getSessionTimeoutMillis() / 1000;
-        try {
-            this.client = newEtcdClient(metadataURL, conf);
-            this.kv = client.getKVClient();
-            this.client.getWatchClient().watch(ByteSequence.from("/", 
StandardCharsets.UTF_8),
-                    WatchOption.newBuilder()
-                            .isPrefix(true)
-                            .build(), this::handleWatchResponse);
-            if (enableSessionWatcher) {
-                this.sessionWatcher =
-                        new EtcdSessionWatcher(client, 
conf.getSessionTimeoutMillis(), this::receivedSessionEvent);
-
-                // Ensure the lease is created when we start
-                this.createLease(false).join();
-            } else {
-                sessionWatcher = null;
-            }
-        } catch (Exception e) {
-            throw new MetadataStoreException(e);
-        }
-    }
-
-    private Client newEtcdClient(String metadataURL, MetadataStoreConfig conf) 
throws IOException {
-        String etcdUrl = metadataURL.replaceFirst(ETCD_SCHEME_IDENTIFIER, "");
-        ClientBuilder clientBuilder = Client.builder()
-                .endpoints(etcdUrl.split(","));
-
-        if (StringUtils.isNotEmpty(conf.getConfigFilePath())) {
-            try (InputStream inputStream = 
Files.newInputStream(Paths.get(conf.getConfigFilePath()))) {
-                EtcdConfig etcdConfig = new ObjectMapper(new 
YAMLFactory()).readValue(inputStream, EtcdConfig.class);
-                if (etcdConfig.isUseTls()) {
-                    File trustCertsFile = 
readFile(etcdConfig.getTlsTrustCertsFilePath());
-                    File keyFile = readFile(etcdConfig.getTlsKeyFilePath());
-                    File certFile = 
readFile(etcdConfig.getTlsCertificateFilePath());
-                    SslContext context = GrpcSslContexts.forClient()
-                            .trustManager(trustCertsFile)
-                            .sslProvider(etcdConfig.getTlsProvider())
-                            .keyManager(certFile, keyFile)
-                            .build();
-                    clientBuilder.sslContext(context);
-                }
-
-                if (StringUtils.isNotEmpty(etcdConfig.getAuthority())) {
-                    clientBuilder.authority(etcdConfig.getAuthority());
-                }
-            }
-        }
-
-        return clientBuilder.build();
-    }
-
-    private File readFile(String path) {
-        return StringUtils.isEmpty(path) ? null : new File(path);
-    }
-
-    @Override
-    public void close() throws Exception {
-        if (isClosed.compareAndSet(false, true)) {
-            super.close();
-
-            if (sessionWatcher != null) {
-                sessionWatcher.close();
-            }
-
-            if (leaseClient != null) {
-                leaseClient.close();
-            }
-
-            if (leaseId != 0) {
-                client.getLeaseClient().revoke(leaseId);
-            }
-
-            kv.close();
-            client.close();
-        }
-    }
-
-    private static final GetOption EXISTS_GET_OPTION = 
GetOption.newBuilder().withCountOnly(true).build();
-    private static final GetOption SINGLE_GET_OPTION = 
GetOption.newBuilder().withLimit(1).build();
-
-    @Override
-    protected CompletableFuture<Boolean> existsFromStore(String path) {
-        return kv.get(ByteSequence.from(path, StandardCharsets.UTF_8), 
EXISTS_GET_OPTION)
-                .thenApply(gr -> gr.getCount() == 1);
-    }
-
-    @Override
-    protected CompletableFuture<Stat> storePut(String path, byte[] data, 
Optional<Long> optExpectedVersion,
-                                               EnumSet<CreateOption> options) {
-        if (!options.contains(CreateOption.Sequential)) {
-            return super.storePut(path, data, optExpectedVersion, options);
-        } else {
-            // First get the version from parent
-            String parent = parent(path);
-            if (parent == null) {
-                parent = "/";
-            }
-            return super.storePut(parent, new byte[0], Optional.empty(), 
EnumSet.noneOf(CreateOption.class))
-                    // Then create the unique key with the version added in 
the path
-                    .thenCompose(
-                            stat -> super.storePut(path + stat.getVersion(), 
data, optExpectedVersion, options));
-        }
-    }
-
-    @Override
-    protected void batchOperation(List<MetadataOp> ops) {
-        try {
-            Txn txn = kv.txn();
-
-            // First, set all the conditions
-            ops.forEach(op -> {
-                switch (op.getType()) {
-                    case PUT: {
-                        OpPut put = op.asPut();
-                        ByteSequence key = ByteSequence.from(put.getPath(), 
StandardCharsets.UTF_8);
-                        if (put.getOptExpectedVersion().isPresent()) {
-                            long expectedVersion = 
put.getOptExpectedVersion().get();
-                            if (expectedVersion == -1L) {
-                                // Check that key does not exist
-                                txn.If(new Cmp(key, Cmp.Op.EQUAL, 
CmpTarget.createRevision(0)));
-                            } else {
-                                txn.If(new Cmp(key, Cmp.Op.EQUAL, 
CmpTarget.version(expectedVersion + 1)));
-                            }
-                        }
-                        break;
-                    }
-                    case DELETE: {
-                        OpDelete del = op.asDelete();
-                        ByteSequence key = ByteSequence.from(del.getPath(), 
StandardCharsets.UTF_8);
-                        if (del.getOptExpectedVersion().isPresent()) {
-                            txn.If(new Cmp(key, Cmp.Op.EQUAL,
-                                    
CmpTarget.version(del.getOptExpectedVersion().get() + 1)));
-                        }
-                        break;
-                    }
-                }
-            });
-
-            // Then the requests
-            ops.forEach(op -> {
-                switch (op.getType()) {
-                    case GET: {
-                        txn.Then(
-                                Op.get(ByteSequence.from(op.asGet().getPath(), 
StandardCharsets.UTF_8),
-                                        SINGLE_GET_OPTION));
-                        break;
-                    }
-                    case PUT: {
-                        OpPut put = op.asPut();
-                        ByteSequence key = ByteSequence.from(put.getPath(), 
StandardCharsets.UTF_8);
-                        if (!put.getFuture().isDone()) {
-                            PutOption.Builder b = PutOption.newBuilder()
-                                    .withPrevKV();
-
-                            if (put.isEphemeral()) {
-                                b.withLeaseId(leaseId);
-                            }
-
-                            txn.Then(Op.put(key, 
ByteSequence.from(put.getData()), b.build()));
-                        }
-                        break;
-                    }
-                    case DELETE: {
-                        OpDelete del = op.asDelete();
-                        ByteSequence key = ByteSequence.from(del.getPath(), 
StandardCharsets.UTF_8);
-                        txn.Then(Op.delete(key, DeleteOption.DEFAULT));
-                        break;
-                    }
-                    case GET_CHILDREN: {
-                        OpGetChildren opGetChildren = op.asGetChildren();
-                        String path = opGetChildren.getPath();
-
-                        ByteSequence prefix =
-                                ByteSequence.from(path.equals("/") ? path : 
path + "/", StandardCharsets.UTF_8);
-
-                        txn.Then(Op.get(prefix, GetOption.newBuilder()
-                                .withKeysOnly(true)
-                                .withSortField(GetOption.SortTarget.KEY)
-                                .withSortOrder(GetOption.SortOrder.ASCEND)
-                                .isPrefix(true)
-                                .build()));
-                        break;
-                    }
-                }
-            });
-
-            txn.commit().thenAccept(txnResponse -> {
-                handleBatchOperationResult(txnResponse, ops);
-            }).exceptionally(ex -> {
-                Throwable cause = ex.getCause();
-                if (cause instanceof ExecutionException || cause instanceof 
CompletionException) {
-                    cause = cause.getCause();
-                }
-                if (ops.size() > 1 && cause instanceof StatusRuntimeException) 
{
-                    Status.Code code = ((StatusRuntimeException) 
cause).getStatus().getCode();
-                    if (
-                            code == Status.Code.INVALID_ARGUMENT /* This could 
be caused by having repeated keys
-                                    in the batch, retry individually */
-                                    ||
-                                    code
-                                            == Status.Code.RESOURCE_EXHAUSTED 
/* We might have exceeded the max-frame
-                                             size for the response */
-                    ) {
-                        ops.forEach(o -> 
batchOperation(Collections.singletonList(o)));
-                    }
-                } else {
-                    log.warn("Failed to commit: {}", cause.getMessage());
-                    ops.forEach(o -> o.getFuture().completeExceptionally(ex));
-                }
-                return null;
-            });
-        } catch (Throwable t) {
-            log.warn("Error in committing batch: {}", t.getMessage());
-        }
-    }
-
-    private void handleBatchOperationResult(TxnResponse txnResponse,
-                                            List<MetadataOp> ops) {
-        safeExecuteCallbacks(() -> {
-            if (!txnResponse.isSucceeded()) {
-                if (ops.size() > 1) {
-                    // Retry individually
-                    ops.forEach(o -> 
batchOperation(Collections.singletonList(o)));
-                } else {
-                    ops.get(0).getFuture()
-                            .completeExceptionally(new 
MetadataStoreException.BadVersionException("Bad version"));
-                }
-                return;
-            }
-
-            int getIdx = 0;
-            int deletedIdx = 0;
-            int putIdx = 0;
-            for (MetadataOp op : ops) {
-                switch (op.getType()) {
-                    case GET: {
-                        OpGet get = op.asGet();
-                        GetResponse gr = 
txnResponse.getGetResponses().get(getIdx++);
-                        if (gr.getCount() == 0) {
-                            get.getFuture().complete(Optional.empty());
-                        } else {
-                            KeyValue kv = gr.getKvs().get(0);
-                            boolean isEphemeral = kv.getLease() != 0;
-                            boolean createdBySelf = kv.getLease() == leaseId;
-                            get.getFuture().complete(Optional.of(
-                                            new GetResult(
-                                                    kv.getValue().getBytes(),
-                                                    new Stat(get.getPath(), 
kv.getVersion() - 1, 0, 0, isEphemeral,
-                                                            createdBySelf)
-                                            )
-                                    )
-                            );
-                        }
-                        break;
-                    }
-                    case PUT: {
-                        OpPut put = op.asPut();
-                        PutResponse pr = 
txnResponse.getPutResponses().get(putIdx++);
-                        KeyValue prevKv = pr.getPrevKv();
-                        if (prevKv == null) {
-                            put.getFuture().complete(new Stat(put.getPath(),
-                                    0, 0, 0, put.isEphemeral(), true));
-                        } else {
-                            put.getFuture().complete(new Stat(put.getPath(),
-                                    prevKv.getVersion(), 0, 0, 
put.isEphemeral(), true));
-                        }
-
-                        break;
-                    }
-                    case DELETE: {
-                        OpDelete del = op.asDelete();
-                        DeleteResponse dr = 
txnResponse.getDeleteResponses().get(deletedIdx++);
-                        if (dr.getDeleted() == 0) {
-                            del.getFuture().completeExceptionally(new 
MetadataStoreException.NotFoundException());
-                        } else {
-                            del.getFuture().complete(null);
-                        }
-                        break;
-                    }
-                    case GET_CHILDREN: {
-                        OpGetChildren getChildren = op.asGetChildren();
-                        GetResponse gr = 
txnResponse.getGetResponses().get(getIdx++);
-                        String basePath =
-                                getChildren.getPath().equals("/") ? "/" : 
getChildren.getPath() + "/";
-
-                        Set<String> children = gr.getKvs().stream()
-                                .map(kv -> 
kv.getKey().toString(StandardCharsets.UTF_8))
-                                .map(p -> p.replaceFirst(basePath, ""))
-                                // Only return first-level children
-                                .map(k -> k.split("/", 2)[0])
-                                
.collect(Collectors.toCollection(TreeSet::new));
-
-                        getChildren.getFuture().complete(new 
ArrayList<>(children));
-                    }
-                }
-            }
-        }, ops);
-    }
-
-    private synchronized CompletableFuture<Void> createLease(boolean 
retryOnFailure) {
-        CompletableFuture<Void> future = 
client.getLeaseClient().grant(leaseTTLSeconds)
-                .thenAccept(lease -> {
-                    synchronized (this) {
-                        this.leaseId = lease.getID();
-
-                        if (leaseClient != null) {
-                            leaseClient.close();
-                        }
-                        this.leaseClient =
-                                this.client.getLeaseClient()
-                                        .keepAlive(leaseId, new 
StreamObserver<LeaseKeepAliveResponse>() {
-                                            @Override
-                                            public void 
onNext(LeaseKeepAliveResponse leaseKeepAliveResponse) {
-                                                if (log.isDebugEnabled()) {
-                                                    log.debug("On next: {}", 
leaseKeepAliveResponse);
-                                                }
-                                            }
-
-                                            @Override
-                                            public void onError(Throwable 
throwable) {
-                                                log.warn("Lease client error 
:", throwable);
-                                                
receivedSessionEvent(SessionEvent.SessionLost);
-                                            }
-
-                                            @Override
-                                            public void onCompleted() {
-                                                log.info("Etcd lease has 
expired");
-                                                
receivedSessionEvent(SessionEvent.SessionLost);
-                                            }
-                                        });
-                    }
-                });
-
-        if (retryOnFailure) {
-            future.exceptionally(ex -> {
-                log.warn("Failed to create Etcd lease. Retrying later", ex);
-                scheduleDelayedTask(1, TimeUnit.SECONDS, () -> 
createLease(true));
-                return null;
-            });
-        }
-
-        return future;
-    }
-
-    private void handleWatchResponse(WatchResponse watchResponse) {
-        watchResponse.getEvents().forEach(we -> {
-            String path = 
we.getKeyValue().getKey().toString(StandardCharsets.UTF_8);
-            if (we.getEventType() == WatchEvent.EventType.PUT) {
-                if (we.getKeyValue().getVersion() == 1) {
-                    receivedNotification(new 
Notification(NotificationType.Created, path));
-
-                    notifyParentChildrenChanged(path);
-                } else {
-                    receivedNotification(new 
Notification(NotificationType.Modified, path));
-                }
-            } else if (we.getEventType() == WatchEvent.EventType.DELETE) {
-                receivedNotification(new 
Notification(NotificationType.Deleted, path));
-                notifyParentChildrenChanged(path);
-            }
-        });
-    }
-
-    @Override
-    protected void receivedSessionEvent(SessionEvent event) {
-        if (event == SessionEvent.SessionReestablished) {
-            // Re-create the lease before notifying that we are reconnected
-            createLease(true)
-                    .thenRun(() -> {
-                        super.receivedSessionEvent(event);
-                    });
-
-        } else {
-            super.receivedSessionEvent(event);
-        }
-    }
-}
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-@Builder
-class EtcdConfig {
-    private boolean useTls;
-
-    private SslProvider tlsProvider;
-    private String tlsTrustCertsFilePath;
-    private String tlsKeyFilePath;
-    private String tlsCertificateFilePath;
-
-    private String authority;
-}
-
-class EtcdMetadataStoreProvider implements MetadataStoreProvider {
-
-    @Override
-    public String urlScheme() {
-        return EtcdMetadataStore.ETCD_SCHEME;
-    }
-
-    @Override
-    public MetadataStore create(String metadataURL, MetadataStoreConfig 
metadataStoreConfig,
-                                boolean enableSessionWatcher) throws 
MetadataStoreException {
-        return new EtcdMetadataStore(metadataURL, metadataStoreConfig, 
enableSessionWatcher);
-    }
-}
diff --git 
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdSessionWatcher.java
 
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdSessionWatcher.java
deleted file mode 100644
index 26ece398b98..00000000000
--- 
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdSessionWatcher.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.pulsar.metadata.impl;
-
-import static 
org.apache.pulsar.common.util.Runnables.catchingAndLoggingThrowables;
-import io.etcd.jetcd.ByteSequence;
-import io.etcd.jetcd.Client;
-import io.netty.util.concurrent.DefaultThreadFactory;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executors;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Consumer;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.metadata.api.extended.SessionEvent;
-
-/**
- * Monitor the ETCd session state every few seconds and send notifications.
- */
-@Slf4j
-public class EtcdSessionWatcher implements AutoCloseable {
-    private final Client client;
-
-    private SessionEvent currentStatus;
-    private final Consumer<SessionEvent> sessionListener;
-
-    // Maximum time to wait for Etcd lease to be re-connected to quorum (set 
to 5/6 of SessionTimeout)
-    private final long monitorTimeoutMillis;
-
-    // Interval at which we check the state of the Etcd connection (set to 
1/15 of SessionTimeout)
-    private final long tickTimeMillis;
-
-    private final ScheduledExecutorService scheduler;
-    private final ScheduledFuture<?> task;
-
-    private long disconnectedAt = 0;
-
-    public EtcdSessionWatcher(Client client, long sessionTimeoutMillis,
-                              Consumer<SessionEvent> sessionListener) {
-        this.client = client;
-        this.monitorTimeoutMillis = sessionTimeoutMillis * 5 / 6;
-        this.tickTimeMillis = sessionTimeoutMillis / 15;
-        this.sessionListener = sessionListener;
-
-        this.scheduler = Executors
-                .newSingleThreadScheduledExecutor(new 
DefaultThreadFactory("metadata-store-etcd-session-watcher"));
-        this.task =
-                
scheduler.scheduleAtFixedRate(catchingAndLoggingThrowables(this::checkConnectionStatus),
 tickTimeMillis,
-                        tickTimeMillis,
-                        TimeUnit.MILLISECONDS);
-        this.currentStatus = SessionEvent.SessionReestablished;
-    }
-
-    @Override
-    public void close() throws Exception {
-        task.cancel(true);
-        scheduler.shutdownNow();
-        scheduler.awaitTermination(10, TimeUnit.SECONDS);
-    }
-
-    // task that runs every TICK_TIME to check Etcd connection
-    private synchronized void checkConnectionStatus() {
-        try {
-            CompletableFuture<SessionEvent> future = new CompletableFuture<>();
-            
client.getKVClient().get(ByteSequence.from("/".getBytes(StandardCharsets.UTF_8)))
-                    .thenRun(() -> {
-                        future.complete(SessionEvent.Reconnected);
-                    }).exceptionally(ex -> {
-                        future.complete(SessionEvent.ConnectionLost);
-                        return null;
-                    });
-
-            SessionEvent ectdClientState;
-            try {
-                ectdClientState = future.get(tickTimeMillis, 
TimeUnit.MILLISECONDS);
-            } catch (TimeoutException e) {
-                // Consider etcd disconnection if etcd operation takes more 
than TICK_TIME
-                ectdClientState = SessionEvent.ConnectionLost;
-            }
-
-            checkState(ectdClientState);
-        } catch (RejectedExecutionException | InterruptedException e) {
-            task.cancel(true);
-        } catch (Throwable t) {
-            log.warn("Error while checking Etcd connection status", t);
-        }
-    }
-
-    synchronized void setSessionInvalid() {
-        currentStatus = SessionEvent.SessionLost;
-    }
-
-    private void checkState(SessionEvent etcdlientState) {
-        switch (etcdlientState) {
-            case SessionLost:
-                if (currentStatus != SessionEvent.SessionLost) {
-                    log.error("Etcd lease has expired");
-                    currentStatus = SessionEvent.SessionLost;
-                    sessionListener.accept(currentStatus);
-                }
-                break;
-
-            case ConnectionLost:
-                if (disconnectedAt == 0) {
-                    // this is the first disconnect event, we should monitor 
the time out from now, so we record the
-                    // time of disconnect
-                    disconnectedAt = System.nanoTime();
-                }
-
-                long timeRemainingMillis = monitorTimeoutMillis
-                        - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - 
disconnectedAt);
-                if (timeRemainingMillis <= 0 && currentStatus != 
SessionEvent.SessionLost) {
-                    log.error("Etcd lease keep-alive timeout. Notifying 
session is lost.");
-                    currentStatus = SessionEvent.SessionLost;
-                    sessionListener.accept(currentStatus);
-                } else if (currentStatus != SessionEvent.SessionLost) {
-                    log.warn("Etcd client is disconnected. Waiting to 
reconnect, time remaining = {} seconds",
-                            timeRemainingMillis / 1000.0);
-                    if (currentStatus == SessionEvent.SessionReestablished) {
-                        currentStatus = SessionEvent.ConnectionLost;
-                        sessionListener.accept(currentStatus);
-                    }
-                }
-                break;
-
-            default:
-                if (currentStatus != SessionEvent.SessionReestablished) {
-                    // since it reconnected to Etcd, we reset the disconnected 
time
-                    log.info("Etcd client reconnection with server quorum. 
Current status: {}", currentStatus);
-                    disconnectedAt = 0;
-
-                    sessionListener.accept(SessionEvent.Reconnected);
-                    if (currentStatus == SessionEvent.SessionLost) {
-                        
sessionListener.accept(SessionEvent.SessionReestablished);
-                    }
-                    currentStatus = SessionEvent.SessionReestablished;
-                }
-                break;
-        }
-    }
-}
diff --git 
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImpl.java
 
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImpl.java
index cb7bea718e4..33e6d861d3d 100644
--- 
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImpl.java
+++ 
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImpl.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pulsar.metadata.impl;
 
-import static 
org.apache.pulsar.metadata.impl.EtcdMetadataStore.ETCD_SCHEME_IDENTIFIER;
 import static 
org.apache.pulsar.metadata.impl.LocalMemoryMetadataStore.MEMORY_SCHEME_IDENTIFIER;
 import static 
org.apache.pulsar.metadata.impl.RocksdbMetadataStore.ROCKSDB_SCHEME_IDENTIFIER;
 import static 
org.apache.pulsar.metadata.impl.ZKMetadataStore.ZK_SCHEME_IDENTIFIER;
@@ -67,7 +66,6 @@ public class MetadataStoreFactoryImpl {
         Map<String, MetadataStoreProvider> providers = new HashMap<>();
         providers.put(MEMORY_SCHEME_IDENTIFIER, new 
MemoryMetadataStoreProvider());
         providers.put(ROCKSDB_SCHEME_IDENTIFIER, new 
RocksdbMetadataStoreProvider());
-        providers.put(ETCD_SCHEME_IDENTIFIER, new EtcdMetadataStoreProvider());
         providers.put(OXIA_SCHEME_IDENTIFIER, new OxiaMetadataStoreProvider());
         providers.put(ZK_SCHEME_IDENTIFIER, new ZkMetadataStoreProvider());
 
@@ -88,6 +86,11 @@ public class MetadataStoreFactoryImpl {
     }
 
     private static MetadataStoreProvider findProvider(String metadataURL) {
+        if (metadataURL.startsWith("etcd:")) {
+            throw new IllegalArgumentException(
+                    "Etcd metadata store backend has been removed in Pulsar 
5.0 (PIP-462). "
+                            + "Please use ZooKeeper (zk:) or Oxia (oxia:) as 
your metadata store.");
+        }
         Map<String, MetadataStoreProvider> providers = loadProviders();
         for (Map.Entry<String, MetadataStoreProvider> entry : 
providers.entrySet()) {
             if (metadataURL.startsWith(entry.getKey())) {
@@ -101,7 +104,6 @@ public class MetadataStoreFactoryImpl {
      * Removes the identifier from the full metadata url.
      *
      * zk:my-zk:3000 -> my-zk:3000
-     * etcd:my-etcd:3000 -> my-etcd:3000
      * my-default-zk:3000 -> my-default-zk:3000
      * @param metadataURL
      * @return
diff --git 
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/BaseMetadataStoreTest.java
 
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/BaseMetadataStoreTest.java
index 84248814b1a..75efe5455c6 100644
--- 
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/BaseMetadataStoreTest.java
+++ 
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/BaseMetadataStoreTest.java
@@ -20,11 +20,8 @@ package org.apache.pulsar.metadata;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
-import io.etcd.jetcd.launcher.EtcdCluster;
-import io.etcd.jetcd.test.EtcdClusterExtension;
 import io.oxia.testcontainers.OxiaContainer;
 import java.io.File;
-import java.net.URI;
 import java.util.Arrays;
 import java.util.Optional;
 import java.util.Set;
@@ -32,7 +29,6 @@ import java.util.UUID;
 import java.util.concurrent.CompletionException;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.pulsar.metadata.api.MetadataStore;
 import org.apache.pulsar.metadata.api.MetadataStoreConfig;
@@ -47,11 +43,10 @@ import org.testng.annotations.DataProvider;
 public abstract class BaseMetadataStoreTest extends TestRetrySupport {
     // to debug specific implementations, set the TEST_METADATA_PROVIDERS 
environment variable
     // or temporarily hard code this value in the test class before running 
tests in the IDE
-    // supported values are ZooKeeper,Memory,RocksDB,Etcd,Oxia,MockZooKeeper
+    // supported values are ZooKeeper,Memory,RocksDB,Oxia,MockZooKeeper
     private static final String TEST_METADATA_PROVIDERS = 
System.getenv("TEST_METADATA_PROVIDERS");
     private static String originalMetadatastoreProvidersPropertyValue;
     protected TestZKServer zks;
-    protected EtcdCluster etcdCluster;
     protected OxiaContainer oxiaServer;
     private String mockZkUrl;
     // reference to keep the MockZooKeeper instance alive in 
MockZookeeperMetadataStoreProvider
@@ -92,11 +87,6 @@ public abstract class BaseMetadataStoreTest extends 
TestRetrySupport {
             zks = null;
         }
 
-        if (etcdCluster != null) {
-            etcdCluster.close();
-            etcdCluster = null;
-        }
-
         if (oxiaServer != null) {
             oxiaServer.close();
             oxiaServer = null;
@@ -140,7 +130,6 @@ public abstract class BaseMetadataStoreTest extends 
TestRetrySupport {
                 {"ZooKeeper", providerUrlSupplier(() -> zksConnectionString)},
                 {"Memory", providerUrlSupplier(() -> memoryConnectionString)},
                 {"RocksDB", providerUrlSupplier(() -> 
rocksdbConnectionString)},
-                {"Etcd", providerUrlSupplier(() -> "etcd:" + 
getEtcdClusterConnectString(), "etcd:...")},
                 {"Oxia", providerUrlSupplier(() -> "oxia://" + 
getOxiaServerConnectString(), "oxia://...")},
                 {"MockZooKeeper", providerUrlSupplier(() -> mockZkUrl)},
         };
@@ -148,7 +137,7 @@ public abstract class BaseMetadataStoreTest extends 
TestRetrySupport {
 
     @DataProvider(name = "distributedImpl")
     public Object[][] distributedImplementations() {
-        return filterImplementations("ZooKeeper", "Etcd", "Oxia");
+        return filterImplementations("ZooKeeper", "Oxia");
     }
 
     @DataProvider(name = "zkImpls")
@@ -174,18 +163,6 @@ public abstract class BaseMetadataStoreTest extends 
TestRetrySupport {
         return oxiaServer.getServiceAddress();
     }
 
-    private synchronized String getEtcdClusterConnectString() {
-        if (!running) {
-            return null;
-        }
-        if (etcdCluster == null) {
-            etcdCluster = 
EtcdClusterExtension.builder().withClusterName("test").withNodes(1).withSsl(false).build()
-                    .cluster();
-            etcdCluster.start();
-        }
-        return 
etcdCluster.clientEndpoints().stream().map(URI::toString).collect(Collectors.joining(","));
-    }
-
     private static Supplier<String> providerUrlSupplier(Supplier<String> 
supplier) {
         return new ProviderUrlSupplier(supplier);
     }
diff --git 
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/EtcdMetadataStoreTest.java
 
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/EtcdMetadataStoreTest.java
deleted file mode 100644
index 5a6d3dd5e8c..00000000000
--- 
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/EtcdMetadataStoreTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.pulsar.metadata.impl;
-
-import static org.testng.Assert.assertTrue;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.google.common.io.Resources;
-import io.etcd.jetcd.launcher.EtcdCluster;
-import io.etcd.jetcd.test.EtcdClusterExtension;
-import java.net.URI;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Optional;
-import java.util.stream.Collectors;
-import lombok.Cleanup;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.metadata.api.MetadataStore;
-import org.apache.pulsar.metadata.api.MetadataStoreConfig;
-import org.apache.pulsar.metadata.api.MetadataStoreFactory;
-import org.testng.annotations.Test;
-
-@Slf4j
-public class EtcdMetadataStoreTest {
-
-    @Test
-    public void testCluster() throws Exception {
-        @Cleanup
-        EtcdCluster etcdCluster = 
EtcdClusterExtension.builder().withClusterName("test-cluster").withNodes(3)
-                .withSsl(false).build().cluster();
-        etcdCluster.start();
-
-        EtcdConfig etcdConfig = EtcdConfig.builder().useTls(false)
-                .tlsProvider(null)
-                .authority("etcd0")
-                .build();
-
-        Path etcdConfigPath = Files.createTempFile("etcd_config_cluster", 
".yml");
-        new ObjectMapper(new 
YAMLFactory()).writeValue(etcdConfigPath.toFile(), etcdConfig);
-
-        String metadataURL =
-                "etcd:" + 
etcdCluster.clientEndpoints().stream().map(URI::toString).collect(Collectors.joining(","));
-
-        @Cleanup
-        MetadataStore store = MetadataStoreFactory.create(metadataURL,
-                
MetadataStoreConfig.builder().configFilePath(etcdConfigPath.toString()).build());
-
-        store.put("/test", "value".getBytes(StandardCharsets.UTF_8), 
Optional.empty()).join();
-
-        assertTrue(store.exists("/test").join());
-
-    }
-
-    @Test
-    public void testClusterWithTls() throws Exception {
-        @Cleanup
-        EtcdCluster etcdCluster = 
EtcdClusterExtension.builder().withClusterName("test-cluster").withNodes(3)
-                .withSsl(true).build().cluster();
-        etcdCluster.start();
-
-        EtcdConfig etcdConfig = EtcdConfig.builder().useTls(true)
-                .tlsProvider(null)
-                .authority("etcd0")
-                
.tlsTrustCertsFilePath(Resources.getResource("ssl/cert/ca.pem").getPath())
-                
.tlsKeyFilePath(Resources.getResource("ssl/cert/client-key-pk8.pem").getPath())
-                
.tlsCertificateFilePath(Resources.getResource("ssl/cert/client.pem").getPath())
-                .build();
-
-        Path etcdConfigPath = Files.createTempFile("etcd_config_cluster_ssl", 
".yml");
-        new ObjectMapper(new 
YAMLFactory()).writeValue(etcdConfigPath.toFile(), etcdConfig);
-
-        String metadataURL =
-                "etcd:" + 
etcdCluster.clientEndpoints().stream().map(URI::toString).collect(Collectors.joining(","));
-
-        @Cleanup
-        MetadataStore store = MetadataStoreFactory.create(metadataURL,
-                
MetadataStoreConfig.builder().configFilePath(etcdConfigPath.toString()).build());
-
-        store.put("/test", "value".getBytes(StandardCharsets.UTF_8), 
Optional.empty()).join();
-
-        assertTrue(store.exists("/test").join());
-
-    }
-
-    @Test
-    public void testTlsInstance() throws Exception {
-        @Cleanup
-        EtcdCluster etcdCluster = 
EtcdClusterExtension.builder().withClusterName("test-tls").withNodes(1)
-                .withSsl(true).build().cluster();
-        etcdCluster.start();
-
-        EtcdConfig etcdConfig = EtcdConfig.builder().useTls(true)
-                .tlsProvider(null)
-                .authority("etcd0")
-                
.tlsTrustCertsFilePath(Resources.getResource("ssl/cert/ca.pem").getPath())
-                
.tlsKeyFilePath(Resources.getResource("ssl/cert/client-key-pk8.pem").getPath())
-                
.tlsCertificateFilePath(Resources.getResource("ssl/cert/client.pem").getPath())
-                .build();
-        Path etcdConfigPath = Files.createTempFile("etcd_config", ".yml");
-        new ObjectMapper(new 
YAMLFactory()).writeValue(etcdConfigPath.toFile(), etcdConfig);
-
-        String metadataURL =
-                "etcd:" + 
etcdCluster.clientEndpoints().stream().map(URI::toString).collect(Collectors.joining(","));
-
-        @Cleanup
-        MetadataStore store = MetadataStoreFactory.create(metadataURL,
-                
MetadataStoreConfig.builder().configFilePath(etcdConfigPath.toString()).build());
-
-        store.put("/test", "value".getBytes(StandardCharsets.UTF_8), 
Optional.empty()).join();
-
-        assertTrue(store.exists("/test").join());
-    }
-}
\ No newline at end of file
diff --git 
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImplTest.java
 
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImplTest.java
index 0ae0b022a35..2828b0de892 100644
--- 
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImplTest.java
+++ 
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImplTest.java
@@ -73,7 +73,6 @@ public class MetadataStoreFactoryImplTest {
     public void testRemoveIdentifierFromMetadataURL() {
         
assertEquals(MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL("zk:host:port"),
 "host:port");
         
assertEquals(MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL("rocksdb:/data/dir"),
 "/data/dir");
-        
assertEquals(MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL("etcd:host:port"),
 "host:port");
         
assertEquals(MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL("memory:name"),
 "name");
         
assertEquals(MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL("http://unknown/url/scheme";),
                 "http://unknown/url/scheme";);
diff --git a/pulsar-metadata/src/test/resources/ssl/.gitignore 
b/pulsar-metadata/src/test/resources/ssl/.gitignore
deleted file mode 100644
index 0139cd0a6fa..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-cfssl
diff --git a/pulsar-metadata/src/test/resources/ssl/README.md 
b/pulsar-metadata/src/test/resources/ssl/README.md
deleted file mode 100644
index af9ad88dbae..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-
--->
-
-This directory is used for Etcd metadata testing.
-
-**Note: DO NOT EDIT THIS DIRECTORY STRUCTURE**
-
-The `cert` directory holds the Etcd TLS certificate.
-
-The `generate-self-signed-certificates.sh` is used to generate self-signed 
certificates based on [cfssl](https://github.com/cloudflare/cfssl).
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/ca-config.json 
b/pulsar-metadata/src/test/resources/ssl/cert/ca-config.json
deleted file mode 100644
index dafdebe741d..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/ca-config.json
+++ /dev/null
@@ -1 +0,0 @@
-{"signing":{"default":{"expiry":"876000h","usages":["signing","key 
encipherment","server auth","client auth"]}}}
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/ca-key.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/ca-key.pem
deleted file mode 100644
index 9a3ceba7351..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/ca-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAyUXfR1a3FAsYajnkYYASVgvOBY9jiFrWeNfi9HZsDF6xs5+3
-vempZ5FYw9smzJBxRwV7r6g8TJbXW4V03Drjuk3Y9VSZfk5uyaWT3tzr0uYV7hYR
-9kM3RybimN1cbtUELK7LKvdg3Y+gHrvFPTQ3I0grXI4geCGfDh07mPYFmH8SqtAY
-22qJb8sFBaIq76dstuKmX55abEJWXQG5B2CXxuYYaseydzAJNk8y+zEfJVZs4pWg
-NcC4CozjQcl2NsokX8PIE/OaCxIwabBw1ONFHHcClFwW7inXnip1fYE+Se6348U6
-sOVwCt2wTGYnBJOqLZw1vuZZYXUUwdgp0Y+6pQIDAQABAoIBAQDIQBBptcjo1DEy
-Xu7uYrHbklskBQmOPHJuQLy5ZKkTlZNPl3UEKlo1hNK/6mar2Hobo0Tv+34i5WDW
-2ezuwFian6FgVQ9yLy7iyS5Z6YtnhSwEeUjdrvpsfC+uz26LhrxkiHPzB7UEO0Wf
-zknrHuxM2hzqNS3w1+Kb9FG7WesvUFpxFzl2bdktdxI2THGr5mK2S4mSGFRkNazz
-tAwUpe+9WGra5OmlukYGHtm9g1WNcutyYAWOdfSlFOva9D9wRWiE2t1NpWjWwQv0
-P11RZQbPbAqmAhHwciSAWu+m8M/8EUDmlebF5pbPTDyGm5d35+byPWNiKxMn4/Rj
-zEebwR3xAoGBAO0WMeqLFLfGShCxu9Ke4Qb2c8MBfGa6LQJmDZ8BsUAPCvyG3NAt
-308KvNudj/+rrr9xCkmNSKD31DOUu6y05/Sa7Opq2qj/L7Hxk8GxT3/3Q/3jTmDn
-8KOQ94oUQylUSLz7gQnGiwORfBRDa1yYAljtuvXGkzuv9sJSjYp++4TXAoGBANlU
-SRVmXxYS6WgcsBX6ZlKK1yKyoaLMobDWBGNcGWTdn+7yUcs0viBLnwf2Sgd1uhx0
-N1XI2pOxTMbLKLoNUiw19jAfh9Jb7GieeyANQHjp4z8q1u8JpY+hd8SxJt/wAWyH
-yELVymT5xREyE/kBexGLHn3E6fwG3e4lejmmsJDjAoGANDHas2QDH6JL0/kM/IV1
-zO6c9aVyGbuLBSgqf4MD3rJxHL8kBcDTlLcsdLzvYr4NLqBYP3EXODjXQrPPzWnW
-Vwd0ePclRGdJvMcOXGoIsodhNJfCPZtSYvAbTw6+6m5fxRspgVlwaUyyIFPnYu8k
-NSfBLTKWX2GR1Z4PAxqJjOkCgYBrO9Rn08BdMu2qKmWUIp50Yf9vJnbszk2F5MP7
-hskc5OHyU+yZ+KdLZiTNF/BFKAix24ImONnpABXjDQFGdCY0nFeiPRyWZjcLFA+q
-q/9A6h7v3yJ4hekEKubezY5h9pmtRH5CxBx+oGNlbbE/L0TbTiq4Yf4WFglRZXqe
-kaoTgwKBgE6LoQYR7I2TFs2mVMJn4FG9Mlk66xBWxkA/+JsQP78QoQbfhrFBFbx8
-bPZPxjtJ47fYUga25fpxRzm1sVKm69G7tnI73xCJKenRCiZE6DktnKLyOJIzfuIX
-+iXKugrQaf0XQPjKXYPnczBBd572MoXoKVbWQbT+/vicv4AahGeh
------END RSA PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/ca.csr 
b/pulsar-metadata/src/test/resources/ssl/cert/ca.csr
deleted file mode 100644
index a64072407a0..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/ca.csr
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICUjCCAToCAQAwDTELMAkGA1UEAxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDJRd9HVrcUCxhqOeRhgBJWC84Fj2OIWtZ41+L0dmwMXrGzn7e9
-6alnkVjD2ybMkHFHBXuvqDxMltdbhXTcOuO6Tdj1VJl+Tm7JpZPe3OvS5hXuFhH2
-QzdHJuKY3Vxu1QQsrssq92Ddj6Aeu8U9NDcjSCtcjiB4IZ8OHTuY9gWYfxKq0Bjb
-aolvywUFoirvp2y24qZfnlpsQlZdAbkHYJfG5hhqx7J3MAk2TzL7MR8lVmzilaA1
-wLgKjONByXY2yiRfw8gT85oLEjBpsHDU40UcdwKUXBbuKdeeKnV9gT5J7rfjxTqw
-5XAK3bBMZicEk6otnDW+5llhdRTB2CnRj7qlAgMBAAGgADANBgkqhkiG9w0BAQsF
-AAOCAQEALczD308ElfQ2ovsec/FuqPr3zvtOKyJn6F6H2tYl4890astfZzHGBglu
-xICEWn8yAfwPW3jg6QsTjYupJpjVJMgAxsQhKOneUmTaIuDdRzIHX4ss5m7ndXpD
-B/hk1HXtu/+gAeKcSTNjEpKJh91ErsAp9y3tPjk/9BvOqI/OTRj1jeZV0e5yHaNk
-6nM0o7x9LVgREX6PDXXaFmTGYWmsiANU8l6/XLV0vvyreAKcONvruXrRQ+Cg2z4W
-yPbbFsfocwwwrIiC2zQ6+f+d5HQt5IINIKqAYibG0vNul8G0NMYC6JRFYIqEKOU5
-jQWZx7dY8ofkEpXmSx/IaMh1pQ3g4A==
------END CERTIFICATE REQUEST-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/ca.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/ca.pem
deleted file mode 100644
index 34a8593879e..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/ca.pem
+++ /dev/null
@@ -1,18 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIC6jCCAdKgAwIBAgIUXHRN1WrCXk813Zz/mWdg3YAu9OIwDQYJKoZIhvcNAQEL
-BQAwDTELMAkGA1UEAxMCQ0EwHhcNMjIwNDI5MDQyMjAwWhcNMjcwNDI4MDQyMjAw
-WjANMQswCQYDVQQDEwJDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AMlF30dWtxQLGGo55GGAElYLzgWPY4ha1njX4vR2bAxesbOft73pqWeRWMPbJsyQ
-cUcFe6+oPEyW11uFdNw647pN2PVUmX5Obsmlk97c69LmFe4WEfZDN0cm4pjdXG7V
-BCyuyyr3YN2PoB67xT00NyNIK1yOIHghnw4dO5j2BZh/EqrQGNtqiW/LBQWiKu+n
-bLbipl+eWmxCVl0BuQdgl8bmGGrHsncwCTZPMvsxHyVWbOKVoDXAuAqM40HJdjbK
-JF/DyBPzmgsSMGmwcNTjRRx3ApRcFu4p154qdX2BPknut+PFOrDlcArdsExmJwST
-qi2cNb7mWWF1FMHYKdGPuqUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFB0oynraPRsiMaCbp4VFErPtqn79MA0GCSqG
-SIb3DQEBCwUAA4IBAQAsOdb6+QjABRa7LMIERRy45V1l3lVy04WzLUWEGOeakakE
-I58NDopYY2NDfGPi/gPkErAo8Jo8ruRKPccguHlTYGTwjUBjKGBSySMpalw5DhN0
-iygHdKh9qzqL1ChqcQsQPlmhKgsAYkZyQzD2Gh6c/GpNMe6/NUmjlg0KcnKY3+Vx
-kzy3qWXxiNfSywJlbk6UVWOy0cCxHV+fE0gzy+DgNrcWm6euSPAD4Qz8kXvQKevB
-syTpCxqsKNKG+aVZDoW2BTyrROnnk/lqZQ7k4sKZTcYgTrpNSgylbg7rxVqOIyBk
-G+jAW18vmOlsZpXE306Pqsng6csUJ3IXoHqaBbrm
------END CERTIFICATE-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/client-key-pk8.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/client-key-pk8.pem
deleted file mode 100644
index a7fec9bc004..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/client-key-pk8.pem
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/RbW6dJqk2+BN
-SZKAs1M0RQt6PrhIHHhxBBPXFM3XOqKwacrQihuZQSGLgaxfzXbRejwQ9VBg5Ia/
-tOokwDY3tK9Kp4J0bsqgNXZKTRYtnJ4JYh9566jsD47Qpj6xuQZmo3b1QKLEh+Fh
-9buWTEvvdUY8AQTASwvOGAWyzrZgaKuagQQNkZ49TM8gtsy9uJPWS2PZQpW/qk56
-5jRck8Xb8COQ0QV2wPiqwmEtA7/jEeQViQ49HLdfBTi90Hh4Q8XBv8TPW+sQpN5R
-5fvZEz+iwrGm20kIrtVQ+hMCkbywTlA5rSGW7onnakDyqybt10dBzn609/wg5Dee
-LjMZ3dEvAgMBAAECggEAR1r5NcsEWhZQ8mRNDEhZ9PkBFCTL2NMON5M+15FCTVXp
-lYiSCgRL0XuTyRiiNsdO2U0RlX3+83atsl0KsJUoZNW6Q06Eg21FmEj5jTR+3ps7
-9eIuPeylgxM2wy4R23lcIvQ+j7YCQvEyKrpitepWtcl5Xy8+F4Knr8YUciVdsk8T
-a2DxkjXRXG6RW71Hqdd4bpXszM2E22trjKgouy/PV4LOhSCzyDdwAq4fKLBmS7l5
-2j57Ag0/hDZ7L4nW6jtRG1NBonBk7FhPrd4UCGqxaYwfTYvDWDKpQkJgbkWSYCwc
-pUVAqreYi5+udKhL0dXsKrZGE9I20tQlZkaoBBgreQKBgQDAmu73weinuMp9nC6M
-gSXQxuWL02ybEQFsZioP8oGSP+wZDCrSn1HD52iSSZqEoNLoYm0u8u3D9FbWoiw/
-n8BPqTLjLXUozhDdVuvg6YkKxHG2So7ve04UOXBQqCd/pOuNXRUUYUQ+FMq8vmjD
-dRqVo1gH/qUExa4SeTzoOWUXawKBgQD+Onb9+ExPweZjy+T0eAO1FMFP//KsNwSI
-vlf22jUbCqiu6Pem1m/31Rju04AGydWhdHgd+7PG8/arVyLcgNQtTotXtD7zTCVe
-jkr42R/zbG46c0/z8brUXpYOHOjdgFbY62vwWjykulFsruf36hit9/D+tKVNOgep
-tduFS8DSTQKBgC+oJmj3efHGL5RVCM+LRSgbjsDCV6Um2AtSXCYGAzmEx46LDC2B
-bmHi6GUKAUm/4W/OquVrBpnt427IQdqcVKFhZE4B+XNXSaT61PKZ1mbrpJdOa3+m
-KvOmIrxSXzOeQwp/da/NQW17B48cLh/u4d0Uxbt0rrA3mZLInOF5EiJxAoGBAPGS
-GHOntsuq0gNOQZbTW6J7wF0GNk/ST6qoQ+m62u+BJ1xc3sZXyTlT8kcuDd9ldmve
-wiyred64/1E8kVG50OPkWJ/UFGUXnALHbxIbLzMde3hrDjQdJIyb/DYY3mVriBrD
-SWOwOyPEL474fE+k0CKvEP7WJKTHWXS364ozu1uZAoGBAMBXRwDQZgs+Xn3lTohu
-1NLlHhNIuUzcb+4ROn2StoxZS3mEv2W0KWRTzNJGRr4+kbLMcY7K1jOk0qm6fwcG
-HAJnKkxu9E3hFQVUT14CIKPwi3TQCNjmZqj+LaEwe+75w4rXTajwl3WY58KngA5/
-XVn2W3KsXAKOAteL/07xtDEi
------END PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/client-key.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/client-key.pem
deleted file mode 100644
index 95b52fde4a1..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/client-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAv0W1unSapNvgTUmSgLNTNEULej64SBx4cQQT1xTN1zqisGnK
-0IobmUEhi4GsX8120Xo8EPVQYOSGv7TqJMA2N7SvSqeCdG7KoDV2Sk0WLZyeCWIf
-eeuo7A+O0KY+sbkGZqN29UCixIfhYfW7lkxL73VGPAEEwEsLzhgFss62YGirmoEE
-DZGePUzPILbMvbiT1ktj2UKVv6pOeuY0XJPF2/AjkNEFdsD4qsJhLQO/4xHkFYkO
-PRy3XwU4vdB4eEPFwb/Ez1vrEKTeUeX72RM/osKxpttJCK7VUPoTApG8sE5QOa0h
-lu6J52pA8qsm7ddHQc5+tPf8IOQ3ni4zGd3RLwIDAQABAoIBAEda+TXLBFoWUPJk
-TQxIWfT5ARQky9jTDjeTPteRQk1V6ZWIkgoES9F7k8kYojbHTtlNEZV9/vN2rbJd
-CrCVKGTVukNOhINtRZhI+Y00ft6bO/XiLj3spYMTNsMuEdt5XCL0Po+2AkLxMiq6
-YrXqVrXJeV8vPheCp6/GFHIlXbJPE2tg8ZI10VxukVu9R6nXeG6V7MzNhNtra4yo
-KLsvz1eCzoUgs8g3cAKuHyiwZku5edo+ewINP4Q2ey+J1uo7URtTQaJwZOxYT63e
-FAhqsWmMH02Lw1gyqUJCYG5FkmAsHKVFQKq3mIufrnSoS9HV7Cq2RhPSNtLUJWZG
-qAQYK3kCgYEAwJru98Hop7jKfZwujIEl0Mbli9NsmxEBbGYqD/KBkj/sGQwq0p9R
-w+dokkmahKDS6GJtLvLtw/RW1qIsP5/AT6ky4y11KM4Q3Vbr4OmJCsRxtkqO73tO
-FDlwUKgnf6TrjV0VFGFEPhTKvL5ow3UalaNYB/6lBMWuEnk86DllF2sCgYEA/jp2
-/fhMT8HmY8vk9HgDtRTBT//yrDcEiL5X9to1Gwqoruj3ptZv99UY7tOABsnVoXR4
-HfuzxvP2q1ci3IDULU6LV7Q+80wlXo5K+Nkf82xuOnNP8/G61F6WDhzo3YBW2Otr
-8Fo8pLpRbK7n9+oYrffw/rSlTToHqbXbhUvA0k0CgYAvqCZo93nxxi+UVQjPi0Uo
-G47AwlelJtgLUlwmBgM5hMeOiwwtgW5h4uhlCgFJv+FvzqrlawaZ7eNuyEHanFSh
-YWROAflzV0mk+tTymdZm66SXTmt/pirzpiK8Ul8znkMKf3WvzUFtewePHC4f7uHd
-FMW7dK6wN5mSyJzheRIicQKBgQDxkhhzp7bLqtIDTkGW01uie8BdBjZP0k+qqEPp
-utrvgSdcXN7GV8k5U/JHLg3fZXZr3sIsq3neuP9RPJFRudDj5Fif1BRlF5wCx28S
-Gy8zHXt4aw40HSSMm/w2GN5la4gaw0ljsDsjxC+O+HxPpNAirxD+1iSkx1l0t+uK
-M7tbmQKBgQDAV0cA0GYLPl595U6IbtTS5R4TSLlM3G/uETp9kraMWUt5hL9ltClk
-U8zSRka+PpGyzHGOytYzpNKpun8HBhwCZypMbvRN4RUFVE9eAiCj8It00AjY5mao
-/i2hMHvu+cOK102o8Jd1mOfCp4AOf11Z9ltyrFwCjgLXi/9O8bQxIg==
------END RSA PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/client.csr 
b/pulsar-metadata/src/test/resources/ssl/cert/client.csr
deleted file mode 100644
index 4e9d091a710..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/client.csr
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICdDCCAVwCAQAwETEPMA0GA1UEAxMGY2xpZW50MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv0W1unSapNvgTUmSgLNTNEULej64SBx4cQQT1xTN1zqi
-sGnK0IobmUEhi4GsX8120Xo8EPVQYOSGv7TqJMA2N7SvSqeCdG7KoDV2Sk0WLZye
-CWIfeeuo7A+O0KY+sbkGZqN29UCixIfhYfW7lkxL73VGPAEEwEsLzhgFss62YGir
-moEEDZGePUzPILbMvbiT1ktj2UKVv6pOeuY0XJPF2/AjkNEFdsD4qsJhLQO/4xHk
-FYkOPRy3XwU4vdB4eEPFwb/Ez1vrEKTeUeX72RM/osKxpttJCK7VUPoTApG8sE5Q
-Oa0hlu6J52pA8qsm7ddHQc5+tPf8IOQ3ni4zGd3RLwIDAQABoB4wHAYJKoZIhvcN
-AQkOMQ8wDTALBgNVHREEBDACggAwDQYJKoZIhvcNAQELBQADggEBABDSTkd0lwd1
-iU8ClUOlWFcJtkw3OXM4aRTXtbX5EGlwDr1HrQApBKqEn+Mp5rP74Du+cChTsS1S
-7flI9EO4OijwwsuMOe65fqtboUWhjy3pHrY7BEz8JzJBNH6TVPdyEyYCANyTg3z/
-0X+mGvQ7yz25BlaaqNiKI8BVs6ATPYi17fKsxdbV3ZAnhi0jv1ruR1dSBNI4/Y3F
-rdnSsJlJabHjqKbF5t1AxaZ3poR5pSY7i2gM464h8WzC9YUaRyNsDjFoUpV0CpuW
-x9kOyIBfkO1rQozSkDxCXjxDp6KyG5CTyxUsh7pITVbHd6KxaftCkCg95W8B2BzT
-GtfST4d92xU=
------END CERTIFICATE REQUEST-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/client.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/client.pem
deleted file mode 100644
index 6e3d1492726..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/client.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDPDCCAiSgAwIBAgIUdYkf8VBmJYG6HvKxh84BHYaTIH8wDQYJKoZIhvcNAQEL
-BQAwDTELMAkGA1UEAxMCQ0EwIBcNMjIwNDI5MDQyMjAwWhgPMjEyMjA0MDUwNDIy
-MDBaMBExDzANBgNVBAMTBmNsaWVudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAL9Ftbp0mqTb4E1JkoCzUzRFC3o+uEgceHEEE9cUzdc6orBpytCKG5lB
-IYuBrF/NdtF6PBD1UGDkhr+06iTANje0r0qngnRuyqA1dkpNFi2cngliH3nrqOwP
-jtCmPrG5BmajdvVAosSH4WH1u5ZMS+91RjwBBMBLC84YBbLOtmBoq5qBBA2Rnj1M
-zyC2zL24k9ZLY9lClb+qTnrmNFyTxdvwI5DRBXbA+KrCYS0Dv+MR5BWJDj0ct18F
-OL3QeHhDxcG/xM9b6xCk3lHl+9kTP6LCsabbSQiu1VD6EwKRvLBOUDmtIZbuiedq
-QPKrJu3XR0HOfrT3/CDkN54uMxnd0S8CAwEAAaOBjTCBijAOBgNVHQ8BAf8EBAMC
-BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAw
-HQYDVR0OBBYEFB/UlCHqPmkA3xcYzddO9kD1w8o1MB8GA1UdIwQYMBaAFB0oynra
-PRsiMaCbp4VFErPtqn79MAsGA1UdEQQEMAKCADANBgkqhkiG9w0BAQsFAAOCAQEA
-AneFIIHBZ21J24+lln995ofX+92Yeu528IVy1WJtTGIpHVN6Fc+jZbsAZqzdhDDd
-q9pKawKlDR2bW6mg7ItF2coYprMoLtHeFAwSUIg5WcMFUgGHxITFDQlscD2mR54Y
-I1otVWegrL2PDyKs2uk5B4Jwm+O/0fbyG+D3FIje9y++gh6Oqi/uwn8YUgnLl/4e
-Yf8POmMrUcOmJn4tXX4y6HtacNR3n0leby8T1dBShNAESuBdmEo8bmgAADh/brfP
-kzGHBdO+AyHEs87TRMZ4ofhspM6m1ZNyazy861xhoYjUcjIoD4vaVsEGIRT9/2HM
-4l8oq0OyarhZRLIpJ11SJQ==
------END CERTIFICATE-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd0-key.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd0-key.pem
deleted file mode 100644
index 1082f8f95ca..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd0-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAwM7rFfUDX0Kwoidp7h9haJdC3rYpti9OJTtRZznEWUjIW4eN
-lhYUZlfFDX9kbRZTIPlZSHbY1KtaWTvPn6DRLiflr9t8ArUScDt8a6imShekeYwz
-Q/OPnkH7sCccPw3C5iX3VbOxDYxFoQx52hwhPPg84f6ItXX5pPZvYpT8B6tQ3DF4
-TsfZzZ0DTqI98yWWc6mZPMrBXXh+FjawzlobvAJY0MSLeokwOnZ55iInRMAVYkYB
-X0hs37ylcf4wFN2aqBshue2XfB58/tXzSwZwIu+C6aZd6T2o9hT/G3ly9m2FoXJx
-lvFOoRjxtSGGdo3MyiUbZAoVviAdM17kEyx9wQIDAQABAoIBAHYTggadWOZSyidT
-6dyJXTcXQz1u45aN29aTQCPuTZ+8Ie9j0UKz3ORcJfJBLPhdbqVH7vSgy+NZ2OfC
-6EDC1LfmeRQ8XvKtf1A6LdUkoEnJttE1GgQoObDaic9z9CltPQmDALh8ZhZ86/tX
-z5vSFEzpXSetoH04dZ0fylDeGoZ6w3WsxWzNFM4uFHn5ZeyS6WfQMlJaY1hrEMQn
-JaJmw9PXs4kqYS6VTT+40g8EJcGG5yy9WP7xN/BSYebeiFZbfNA+HEweFVfFHtaC
-qqfqpyuQAyA2PHarXm14Fh0gESrbhVbQy1cd91CT8LaiszTurYj+eIVDuhxmO/xE
-doOHJM0CgYEAyNOrzTrKI6BN16CCmDR+q3UluL+LXQ1no9yuVMp3Xd5xzPze8vgF
-8TL6DUMck57Rj2+vMjX5K+GEw5D2f4qZnipRsRDcz4qrbIrxeX/PXQgZ/BBA3gts
-JcfkdCmEnEFGl7cPplgJ+erMeIwjTkMODHjApRAeSir83D1t6Xg0MgsCgYEA9cdL
-Xk88ynV4OyXKe5OrJaIc3RyNRL82571EjsCfRmy54FSgsxu4czsCyc1D3S5oX4Ni
-K1w/J8aGmqE/uSHyX2XN5s0QL1UvywM7kP0UfxJk6rPoa3F2RIt7+Ino26oHrhJA
-Id9QWyhC4nPIzQNmUtvriS2KTEDVhfJzDnfNGuMCgYBgPpEnWfVl/X1QyWvM5duO
-8CWT1LhFcBcrQKeLmzx5kBGZ29Y9OwAeCAAuOuuHE6X6x9t+hL9VeE7YKrD3jsTw
-N/fOk/Y+wIZHDo+LWuVWAHvzgRaVU4QQ1yt1QDB9cgsSyniFj8u4Kf60BvUknJ4u
-++/XK1JY2SE1q3rxWNoq4QKBgQDIANTZOxvaGTuszjT22RUV+9UHLdvbzMrOTBvF
-GwTB12pvHg7jkbRIuQWs2IfYLpKq3wx9AoU2Rfx1SrDDY9eLQBoNLmR0UBsjVk8b
-zobmXT6YK6z/+gXnA6bverJuRvAW/C0KI2KNu7ap9tS52IFk/ieuqst2/++CH+j3
-JhBXRwKBgFZ2E0nbgrk8CgEyI1dPGLIaN2E9QZxZNUfg01C0SgjBT/PKQS+Hx4Fk
-j0ABMqcfSwMFomezfxUfTzqaawlCMcpuQtE/1KtEfRMCwuvKdYcARDClH2p78e1P
-tZ9xiswa6PMXjLXc+jFy/kzgDS2JBaaZMP3C1NGbcDNpTxMQGKSe
------END RSA PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd0.csr 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd0.csr
deleted file mode 100644
index 75c12943408..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd0.csr
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICeDCCAWACAQAwEDEOMAwGA1UEAxMFZXRjZDAwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQDAzusV9QNfQrCiJ2nuH2Fol0Letim2L04lO1FnOcRZSMhb
-h42WFhRmV8UNf2RtFlMg+VlIdtjUq1pZO8+foNEuJ+Wv23wCtRJwO3xrqKZKF6R5
-jDND84+eQfuwJxw/DcLmJfdVs7ENjEWhDHnaHCE8+Dzh/oi1dfmk9m9ilPwHq1Dc
-MXhOx9nNnQNOoj3zJZZzqZk8ysFdeH4WNrDOWhu8AljQxIt6iTA6dnnmIidEwBVi
-RgFfSGzfvKVx/jAU3ZqoGyG57Zd8Hnz+1fNLBnAi74Lppl3pPaj2FP8beXL2bYWh
-cnGW8U6hGPG1IYZ2jczKJRtkChW+IB0zXuQTLH3BAgMBAAGgIzAhBgkqhkiG9w0B
-CQ4xFDASMBAGA1UdEQQJMAeCBWV0Y2QwMA0GCSqGSIb3DQEBCwUAA4IBAQAbgiK2
-UV27VhX5SxQP49IhEzfyzzOzaYPArkDrTvhiKUeQHDfiVa5C6KrhjqFdSxWim5sg
-345jb1fUjdkXQC2kSVW2MXIPUSqg+0XMorH21qfjr8w0+D3CjCEJaLFFaRX7jNAc
-hZlKaHF2268td6P11bK35z64ZcO6vuYfyXWig29gJNj7zADUX2UJAuIipyXWoWCp
-sEkX5c/ATClLxU2kJiU6QjMkrPivDxG3ihlcwuhxGjF+ABpgGTzcnyRO9KnGPPkD
-EBjfIUYl0J+Fp2dshDqQATJG+Fo11TobQ6swcSnIRwHHoiRxbNRV4SDKUwA4JvOB
-pAKINclelCs62UeW
------END CERTIFICATE REQUEST-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd0.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd0.pem
deleted file mode 100644
index 0438501f59c..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd0.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDQDCCAiigAwIBAgIUOtnvopLqgxSAOKGQHE0KC13nQOYwDQYJKoZIhvcNAQEL
-BQAwDTELMAkGA1UEAxMCQ0EwIBcNMjIwNDI5MDQyMjAwWhgPMjEyMjA0MDUwNDIy
-MDBaMBAxDjAMBgNVBAMTBWV0Y2QwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAwM7rFfUDX0Kwoidp7h9haJdC3rYpti9OJTtRZznEWUjIW4eNlhYUZlfF
-DX9kbRZTIPlZSHbY1KtaWTvPn6DRLiflr9t8ArUScDt8a6imShekeYwzQ/OPnkH7
-sCccPw3C5iX3VbOxDYxFoQx52hwhPPg84f6ItXX5pPZvYpT8B6tQ3DF4TsfZzZ0D
-TqI98yWWc6mZPMrBXXh+FjawzlobvAJY0MSLeokwOnZ55iInRMAVYkYBX0hs37yl
-cf4wFN2aqBshue2XfB58/tXzSwZwIu+C6aZd6T2o9hT/G3ly9m2FoXJxlvFOoRjx
-tSGGdo3MyiUbZAoVviAdM17kEyx9wQIDAQABo4GSMIGPMA4GA1UdDwEB/wQEAwIF
-oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAd
-BgNVHQ4EFgQUOcvtfMhXiC+ykG+GG+o6CqMLSKkwHwYDVR0jBBgwFoAUHSjKeto9
-GyIxoJunhUUSs+2qfv0wEAYDVR0RBAkwB4IFZXRjZDAwDQYJKoZIhvcNAQELBQAD
-ggEBAMHxcaHkHtz/COoNVrvZdNc4BkxV6nNTa+iK0q2lSkpDbyYMUcrIX/2okV53
-7iwhfMW+nt1VI0iTVyyxrZw8LVRwQr1iq2Jc11EVCmuvNCFLdOpXyG8KOiGEchtl
-jgI2iUDKlF/sYgPA/C4Pu9g7+Ulh1/OmFuvdnTeHNlezxv7QNgzR4tALXOkvfc7u
-jOoprMlYe7cFxdh6TZPn1Jsz2Yp3YqO7hUSPYDOgUk+1Zzk9umAa+J5uZ0oluPxV
-A+24DNKeDpQZ03Ca2qXWnilAZEql/j4zlDKKyT0dNxQ5P+LutM5weKvw+n7+hKnB
-KNw/2MngvEbsvqNIxgJV/l8JRv0=
------END CERTIFICATE-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd1-key.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd1-key.pem
deleted file mode 100644
index d1e63e6d5f2..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd1-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEAofyM/cb4lXoWXHCkySXLqYFFt6MfTfHWVGn0gh0Yz7Yck0G8
-KuITwBbNV8dcTGNklU8CGIH9XKiG092ozA0NYLvORlBCmEdFxl6n/pnGArQqhK8a
-SwG3rvqz9/WaHqrRozUuSH01UR2WNZYK5V8+5z6EHIwqgGkh+qunaP9o+45hzD3z
-CNn/7Om9hRDYKXp94Gty5A9yiF+R9VzqpEgEfyLRelbaiWVxg5B/+fGUkGO0pXEk
-blnvFQMEHPkQUamL1Aow6uS7uucxR60ebLQeVthNYDsjRYrD5v9NmHdWTW0gEC7f
-41eMsPjsR9cm9jkgbct560b3+nm/DFeJyoce3wIDAQABAoIBABn0go7jQ8+HqW+U
-aQMF+FUnrokXLRvrJSGPfKsgiGo3zupVfRYN9YYw4SQwgHyI7IP0DezpXzRqmHf4
-K2TOrpcSYKHpmFIYEXkQj7B+6Thjr/BksjzUgJ8b8pxHkTNawY56Jfldfp6JtBjP
-+tz33vdkj/yXBPRgZB5rRL7RNfwgegwy3E+8a1FGPsiva3UJ2aGpYpZBxtmtDLDJ
-+QdNB9BtXxOI81E2pfiZ6VwKo9sjHHthuLKVT32FOrqSTUFO86CBopO1Qu/pdjYN
-nrXEXuzyX7x1oBK4W6xJbrQRRzY6CVzQ+9yi9TkGhHWUJywNTYTm+cIHAIWRneCj
-HLjwOCECgYEAyArbvDcC/T0krAZIGhbWmKFKZ1TFslPoKysNeJaV2YOzwaIiG94l
-AZeGh0lj5SQiEGyZ6CMxj4m9CdiJWPGnzLcRF7uhYZCR70LdQgMutVk+7Cmsl4cN
-CW7qiLQlimyl8iETFHE7gUG/HHGg9oKpQnIMXmvIx610Krapl7KepI8CgYEAz0x9
-h7fC5ZYDIomgr1ZCUN2jdvsOoUgkdNxVl+gmxKEnvfu/2lWu/WKYV/Zl81jgTpFh
-BYgg4x6f54ApzXi4wix4sbBgUpqQAeP0JGSR/zp3HHHvMbSVOEV+LrtQqw1WDFgG
-l9huWbC2keNo858p7RfXz64vEQ7UGrQZITdPKLECgYEAmTQ3tZ4sG+aH/3eQIOr8
-z0g3w4uZHUpFtUnztzcc7MmBEfsqRE2N6foyfconR4a0z/9cn/zUKCpFLRU5m3T4
-HkDWRmbc4evm2GdNLRFi5GDFX/lKxYIY6fCYjrnpRmqPbTEHe9B80jGYPCCKNkE7
-gDf4YRgLXWHqZgwfNp8GAOECgYEAp0XuqVwj/YSOJQlvSuzM+FnQdMrjJEuFd3Lv
-8nMXDWWJHymMx06KtNYhXiFqZPHbliqDYqZU+1AT8gceNDnsxGqEPcW4BA/Kkmvx
-7ofks1HnGWHqhG5WVqDk0CrATjalr7I8J70yVlddCt25K5TMjQ/HSkMgoaAYkS+w
-c3gg/RECgYEAleTU3cMFDdZN/DVLZtU2l052VcNOTWcYbzgVBIMwmcwe0F81LMdL
-TRs0z9x9hh7DxoMs2Iocc6xG/AiBsVFcDZxAdFiAUVbo8d+FLN7ON9YRlmLforwP
-OHucy3ixkvMD0bB8eR8FD+C0ddJrNObNnJEokzVnUirbXpAovKX7CAc=
------END RSA PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd1.csr 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd1.csr
deleted file mode 100644
index 5db2530b897..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd1.csr
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICeDCCAWACAQAwEDEOMAwGA1UEAxMFZXRjZDEwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQCh/Iz9xviVehZccKTJJcupgUW3ox9N8dZUafSCHRjPthyT
-Qbwq4hPAFs1Xx1xMY2SVTwIYgf1cqIbT3ajMDQ1gu85GUEKYR0XGXqf+mcYCtCqE
-rxpLAbeu+rP39ZoeqtGjNS5IfTVRHZY1lgrlXz7nPoQcjCqAaSH6q6do/2j7jmHM
-PfMI2f/s6b2FENgpen3ga3LkD3KIX5H1XOqkSAR/ItF6VtqJZXGDkH/58ZSQY7Sl
-cSRuWe8VAwQc+RBRqYvUCjDq5Lu65zFHrR5stB5W2E1gOyNFisPm/02Yd1ZNbSAQ
-Lt/jV4yw+OxH1yb2OSBty3nrRvf6eb8MV4nKhx7fAgMBAAGgIzAhBgkqhkiG9w0B
-CQ4xFDASMBAGA1UdEQQJMAeCBWV0Y2QxMA0GCSqGSIb3DQEBCwUAA4IBAQAvNlV+
-KH3lD9B8vmfdbIUBcTxBJ7IISp+xK/SAEI9A69zjjvU/Yhcb6FY7tqeZ6QmmwgCl
-HNYFl5dK52nT/q1dXXf10Ea8xYdHIGy7fnye+LJiVUV1oC3sSUVKgX+YXibbqM0I
-DcnjXKJsNh04sbsOpYcIwNUwi1srfar1IXGi9fDjIqTbvJnig8rTEXCZ/JpNy2jO
-hGvKCF7zbBHM68uMSxfa1+Db0x1MB9MdjSN5R9o9IGbdpaich1wr8nA/sxmeI9Po
-isFZbOACgQ1fwLRRS/3s2IP+i/Ihcfj0aQTfKS1U/IY8g3y5HRHDlCTg3QstdNLS
-J9ZCCRYDUvfBFyUX
------END CERTIFICATE REQUEST-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd1.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd1.pem
deleted file mode 100644
index a5628efc640..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd1.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDQDCCAiigAwIBAgIUVC1zhJiWmsQoNAvoIxgtCuOvESAwDQYJKoZIhvcNAQEL
-BQAwDTELMAkGA1UEAxMCQ0EwIBcNMjIwNDI5MDQyMjAwWhgPMjEyMjA0MDUwNDIy
-MDBaMBAxDjAMBgNVBAMTBWV0Y2QxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAofyM/cb4lXoWXHCkySXLqYFFt6MfTfHWVGn0gh0Yz7Yck0G8KuITwBbN
-V8dcTGNklU8CGIH9XKiG092ozA0NYLvORlBCmEdFxl6n/pnGArQqhK8aSwG3rvqz
-9/WaHqrRozUuSH01UR2WNZYK5V8+5z6EHIwqgGkh+qunaP9o+45hzD3zCNn/7Om9
-hRDYKXp94Gty5A9yiF+R9VzqpEgEfyLRelbaiWVxg5B/+fGUkGO0pXEkblnvFQME
-HPkQUamL1Aow6uS7uucxR60ebLQeVthNYDsjRYrD5v9NmHdWTW0gEC7f41eMsPjs
-R9cm9jkgbct560b3+nm/DFeJyoce3wIDAQABo4GSMIGPMA4GA1UdDwEB/wQEAwIF
-oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAd
-BgNVHQ4EFgQU8EEBqp4josNuFliczxhJqNMBFcIwHwYDVR0jBBgwFoAUHSjKeto9
-GyIxoJunhUUSs+2qfv0wEAYDVR0RBAkwB4IFZXRjZDEwDQYJKoZIhvcNAQELBQAD
-ggEBALOI1S/C3hq1wxU1izFkyZ0RmRaKMyk9tVqvtcCUMAMMDN0RrDceGqoigx/D
-AdlaqnnO+2CeMKBqZLcPajUsoVErl0T36MLliu9zQY2IrwzP7gaMi/VAYrNRM8JU
-JckqSa4galNUuOKWUWIaIOUDk3NkzrZ+t8F8l32Nu46IzfmfrQB08upibZtbvnZl
-0TtLtpeoMiPkCCI4iyCTSVynODpJ/XZjNge1Ha/5Z1rFfUA3go9W3TSn4DJZ9+Bt
-AottVPQhcLPoGChsir+kVrtc4lLfK97XUUytHnePF2bqw+MuS+q/WB8V9sjduEV8
-vkDcnwa8idv0FUtCUfjMNHqaAbM=
------END CERTIFICATE-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd2-key.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd2-key.pem
deleted file mode 100644
index df46c27684b..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd2-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAzib8SHTPm4snGgIX5MA6s/w4Cd86GssmFmAv+ur0T8a8ldxI
-aMJTEeeKHdrqsEdU/zBM3WZ7/WqPJ72xEy20rwNQa5OhT075NKrY/J/Lw0SGUAD8
-YH4ukZ6ZFBwCXJ072HpESTU1Mz7hZVOXt2uDul7RqoEyx6miSQ8uZH1XS7/Y+2Mv
-5Ig7D4gpUBJNRhj7INCASIf5T6GsnzLRj+xsw4bL5pYF6GzWLczVDpij24qJyfaq
-6aVeux3et2JHTuDuuVEapSXJ8HFTFmqADcLtpg3T2tn+IZkxqyxqcxFdPDc5C9Sb
-YfYL7RsvcETYZpSLpxDNqJ/X1aAicZ6V9FLfrQIDAQABAoIBAQCgvU0gwdPOmCWY
-5eDzf99Fz3dyWxfXJGdCMyW2I9TzDyakQupCpKJY54yN0tADOttPTr3gM7Sh16Bf
-gEy9g3nKrG7cMnQofo9ZPY2LDJ24V4nSf7JJGpn8+Qiq4VwGEqNDG7J60n30wybD
-9vXpEm/XtW8N30dU3zOme6vUttaGPFxbeS+Zu2J6tbY696iY+NiPMRFsmHXNnqce
-JxZbd7FdOd2gQH3yIzVgXJFaDZL4qCwuN87yLRqIP6DS54bDcp6r/x4bAhy7fGC4
-wJTzcsEJWfSM3djaK/RyQtWF4IyxmXfRIhCYxoewNcS5/qEVNwpAVmPhmW6Yq9wT
-UpjTShkRAoGBANA03zTxDxbqWeTHn6sER38bVrzN44Uf7yDim3By6qpfW57ts0x8
-JPgvkHS2bnjqbBueDEdBTduFO32GGvsPu2Y/d3OSrB9hyw4Y1i7JfPMUGRWPTLAH
-ttIJP/v2Pi7RSpgUWOI3c/3BvbFTYxo0rTk8XlFLCy4wMX6Y6Sk6RXwPAoGBAP15
-Za+MmOwV1G1zE5xDIjbn/Wrq88v8xpTPdQebEBVJ4ZPh80QAH6vMFpLuGloK7v5X
-VyfpNVJ9EpGDozqjLNEVr4UTPFPmZTONA1NkBE7f0CmSDsT0AZn5stcWnWxoct0m
-ueVl8tAx1J7gxIKt8fxFiptYmrvKiElQVDbP4VyDAoGAIyZJ6G4p1fyKYI0y73Qx
-fcvnwMgheQADJtIa28kKxOiEVzhZ5LewphWhlZKW4+LvjVoJSJ5FvqGngXF6bJgj
-Uwez6tcAJ+wik6atwghSB9eExJcEo1MqEhttqePQa6b5qOMGfmpOMrDajW0+ddYe
-yGLgqWi54npQYMb/1e34fRECgYBH60D53VeqbMs4PtWKmdXEZHCX/JAuCcvCf1aC
-UPHwSGUz04F1gt95nE+vYtWhRMbo7ZkyHs5dWFWDailPQus9a/zAMmQEnjOKu/D8
-oT1Dr+ddVC7SnTUzHhErTCRglQY6T3mhaBrMDcd5SOcY+QfW/1hDmZFVxTKEMsGi
-R7t2xwKBgQC9mvqJgJ1p+1HtI9mWMPQTV6l1h9+S7O0wxWHvDUR6MGiKq/BeWvWR
-wH7gMfiR7zQKPLLFpEkO3e347ctVRAEy8vAZsaSoZZplJBTmHQqZAWvZtEOLJ73I
-j1rT7LWXJZXlfNyhVyVy3sOzLuzGK8i6j3uCDG8cTqXLcIrmfKorbQ==
------END RSA PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd2.csr 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd2.csr
deleted file mode 100644
index 05d0caed7c3..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd2.csr
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICeDCCAWACAQAwEDEOMAwGA1UEAxMFZXRjZDIwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQDOJvxIdM+biycaAhfkwDqz/DgJ3zoayyYWYC/66vRPxryV
-3EhowlMR54od2uqwR1T/MEzdZnv9ao8nvbETLbSvA1Brk6FPTvk0qtj8n8vDRIZQ
-APxgfi6RnpkUHAJcnTvYekRJNTUzPuFlU5e3a4O6XtGqgTLHqaJJDy5kfVdLv9j7
-Yy/kiDsPiClQEk1GGPsg0IBIh/lPoayfMtGP7GzDhsvmlgXobNYtzNUOmKPbionJ
-9qrppV67Hd63YkdO4O65URqlJcnwcVMWaoANwu2mDdPa2f4hmTGrLGpzEV08NzkL
-1Jth9gvtGy9wRNhmlIunEM2on9fVoCJxnpX0Ut+tAgMBAAGgIzAhBgkqhkiG9w0B
-CQ4xFDASMBAGA1UdEQQJMAeCBWV0Y2QyMA0GCSqGSIb3DQEBCwUAA4IBAQBhSO0B
-82APD+vZYTSRKVUmMrIDxi0ODS9wWOZ4aAgspOHaPcMiPfzdZ6A2PF3Jr0FHyVRy
-iQjBXTNqrn8LHy5PX2Ulv+SaSxag70hNTF5titIxx8dEYKGQdXRDL1EvIvaD+uQQ
-EsJPwMz32HYOCpqEb6K71L5TTzx1DT0gr4g6UQcYUPJvFQ63+Nq8oe+MxGg3/RBE
-XCUTKYPDb2lh3d6A9EFxqsP3A1RMRwn87jLLELucCAe12EmGaahiR/i1vPdyhcIB
-hg8IAy9o9fJ1yUaYQwhd370DTx2zMkHsHhMO48fNcCnn2LiNwD6equllf0/dAt0z
-Gj6OEmb+imvdHODf
------END CERTIFICATE REQUEST-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/etcd2.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/etcd2.pem
deleted file mode 100644
index ba1178f59fc..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/etcd2.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDQDCCAiigAwIBAgIUPsu/hXrFHnwO+QepFNnnRyqrOhYwDQYJKoZIhvcNAQEL
-BQAwDTELMAkGA1UEAxMCQ0EwIBcNMjIwNDI5MDQyMjAwWhgPMjEyMjA0MDUwNDIy
-MDBaMBAxDjAMBgNVBAMTBWV0Y2QyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAzib8SHTPm4snGgIX5MA6s/w4Cd86GssmFmAv+ur0T8a8ldxIaMJTEeeK
-HdrqsEdU/zBM3WZ7/WqPJ72xEy20rwNQa5OhT075NKrY/J/Lw0SGUAD8YH4ukZ6Z
-FBwCXJ072HpESTU1Mz7hZVOXt2uDul7RqoEyx6miSQ8uZH1XS7/Y+2Mv5Ig7D4gp
-UBJNRhj7INCASIf5T6GsnzLRj+xsw4bL5pYF6GzWLczVDpij24qJyfaq6aVeux3e
-t2JHTuDuuVEapSXJ8HFTFmqADcLtpg3T2tn+IZkxqyxqcxFdPDc5C9SbYfYL7Rsv
-cETYZpSLpxDNqJ/X1aAicZ6V9FLfrQIDAQABo4GSMIGPMA4GA1UdDwEB/wQEAwIF
-oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAd
-BgNVHQ4EFgQUyK4bh1Bldq10Vtc8h9k4WJFl9tEwHwYDVR0jBBgwFoAUHSjKeto9
-GyIxoJunhUUSs+2qfv0wEAYDVR0RBAkwB4IFZXRjZDIwDQYJKoZIhvcNAQELBQAD
-ggEBAJn8bt+9OZE2T87m6/fUcsp49XscYMM3TPn6mCaCHlsn2Ljh8yepMVtmB5PN
-cix7lQjFDld3uMG/YGj8pCJHm7sarI35ydKr/Stx2FaE+MdIL4FAtEgOn2mXbnEl
-7fsGRDnSVg4n83SuyXGpEAitwidHsIG8EGcbTz5gIYUrG/osxnkSQ4uf143+iIex
-TJyi9Eb0iIoXTtVDpXAXPtHZT7AJH2At0UQCrvBLgSsR+dkBHg0YYU+qCl6ylioZ
-i2TJ0VLVrCIYyYz7CqhmM0aIiPEmBr0wJM2SM976O4g6vaI147qMpOXSbxTFsmoF
-vvysiWAcRaAA7NaKl6/fPQOFeNM=
------END CERTIFICATE-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/server-key.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/server-key.pem
deleted file mode 100644
index c10e1944c70..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/server-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEArBH548+4tHYbuMxc09Ws+Ao+SZ/cTJlIBjn0H5q4Y9HoRIIf
-wI9Np2xuQ16R6gklijECdtQ/8HBvkoMSVycaQnu6ZiGN1kWVD+yp+dWP8jm+qdQQ
-AUrlwXL7Sd4t3zsy9wo1eC+0od1hzsqojzE175mVszej9WJQLs/Gn8iv068UKaUZ
-UqH7ZLe2hHuntkFOEFYSv13Ydf9QMbhRt0/FbcrWF5YV8aQQ6pk4F+390PUVoLZY
-592PJQzZy+qqoKtP0xNld4aLrW8uZ2dF82B72NmhnIs3+GmbqihJXpCbus1+F8px
-xUQXkDQnff3Y/e4fkkm27+xU/O38SiNp9zhgDQIDAQABAoIBAD4q6Hv0Sql4mp9z
-xn4Kj0m2ebaj+TX7k1gcjCT3A3OdHSvTT6GEpOu+c0AH5PQHhfadqmRAXzGBje4D
-SRcP2571kOzhZptp3Gc6fFb1X+KGFmrJYVb2NnhkEIIpsa0beFhk6diYc8yfbX0H
-H0tM3k3I0ZtEmQpJEOs4ymxkV5JE8S82kt2EjrdGBO7jAUeo9trus8pXjVwQFaFM
-7dKvCE1X5mZmnkFLgw6ZuZCERBqP2MYcQOELUXylCTrcXOmmDhRt+xhSa99N26We
-TW58oYrnvi5P6sA9seoCSXsoG4miFBAPBQgz91Y9rmbcF5t0+IYwtV0ibIoXQs+c
-COYQ+gkCgYEAxPzM6e3JO2o/8dD64YtoTYVE01CovTkuZVEhsrwe3+ZdtKHWWoC+
-IVYwDskjJV3DjuTC35q5PucocjJOTEKy6GTz22MVAwG2HnxJ0I/A9c1X2t8uYT1M
-Qj6/xqQaCEL8jbWSTGsDdE1F+4rTpa3w939ztymZNb0DLbZJ1k4JhlsCgYEA3549
-jhT/Xer6PfSnt1OVZtLA/s9vrT5FV2l6+V8VA2iWzUbQqAChu1CMRqt46FWR4zfX
-oj37T0TkfhbsUB354JpMm5dxjas09EoQbgzegyyOJ6I+7AzIFhvliv6aZgo7kUhC
-bUfRipvFJSHz4JYFX6eoI/7k2JQkiCP7kDi+D7cCgYEAsHF34jkZPFzpNeJoNco2
-/OjYQydGXWdwhVPsiToztX2UhY1IgPw8UYPvu+6xynB4D/AcFUlzkEJhWhhxRaGg
-usRiISpY0b6gsCHHxEZfIkxx2xx5YKQVQGkQQg8POkM2EICIsGZSS8RDYRJyjT6G
-TkodDfz2vMm2pSVYcdqocW0CgYEA11HmkaY0UrnNJdUrnYIVLQIopfMV5Ko+WLIP
-oIlmkXanJphWmD6rfNNNj0rTTFwA8to1f1rRXv3GSodGGssSbawFshg8Vh6SCdw7
-P8ySgZpoc09t6RtRmsBX4ePQxgp6WyVKGTH7Wc0uItgznYC3QekNJUPuFYFoP9Lu
-C2wnzrcCgYEAmTeYA2+ypIXy77r7KLnh1ikPVrHYACgMSWHe3mj+T5A1201goflv
-GW2C+nFrylQRWqJhm51VGmXvxXQH05AjAFctYcYGmJXWn5d+sAf2rwqSlRDuemOP
-cQKFpOCr8zchby9HNKfaeip0Nrz+WheFG1d/2GgX3CppayTE1vYEkxY=
------END RSA PRIVATE KEY-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/server.csr 
b/pulsar-metadata/src/test/resources/ssl/cert/server.csr
deleted file mode 100644
index da80648b35c..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/server.csr
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICfDCCAWQCAQAwETEPMA0GA1UEAxMGc2VydmVyMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArBH548+4tHYbuMxc09Ws+Ao+SZ/cTJlIBjn0H5q4Y9Ho
-RIIfwI9Np2xuQ16R6gklijECdtQ/8HBvkoMSVycaQnu6ZiGN1kWVD+yp+dWP8jm+
-qdQQAUrlwXL7Sd4t3zsy9wo1eC+0od1hzsqojzE175mVszej9WJQLs/Gn8iv068U
-KaUZUqH7ZLe2hHuntkFOEFYSv13Ydf9QMbhRt0/FbcrWF5YV8aQQ6pk4F+390PUV
-oLZY592PJQzZy+qqoKtP0xNld4aLrW8uZ2dF82B72NmhnIs3+GmbqihJXpCbus1+
-F8pxxUQXkDQnff3Y/e4fkkm27+xU/O38SiNp9zhgDQIDAQABoCYwJAYJKoZIhvcN
-AQkOMRcwFTATBgNVHREEDDAKgghldGNkLXNzbDANBgkqhkiG9w0BAQsFAAOCAQEA
-BdrViUC7OEOnhq7eVICszhRxaF7UGx4fMJqNMZL5z5r2dq3MJsfoOTvqyWFhy5rV
-4aiHShan6Ip+O//yibk/U1jcO8pQt2e+NA/5BYWf4hFC53Z+jF23sxW7zvieMqiC
-19aXn1YHJe6mmosBj0Y8sic+aXOfo0D1JTUk5tCKPCrHsc7RqOgcHWBCBvFL7uWE
-toksP76YyP9hfLIZSWtaeQE/nQxD9XtUcHOE+HrUmy0rsQ/Ojxt0zSKVYYHGVRWi
-hVtevu5uJJv/dSCmd1B3D+xjWkwwrNjl44CPHnv6/0R9ngc2Hl71qQJDWqQdrJXn
-kwTL0NSke2C/57zA9c2P5A==
------END CERTIFICATE REQUEST-----
diff --git a/pulsar-metadata/src/test/resources/ssl/cert/server.pem 
b/pulsar-metadata/src/test/resources/ssl/cert/server.pem
deleted file mode 100644
index a7a088ab53b..00000000000
--- a/pulsar-metadata/src/test/resources/ssl/cert/server.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDRDCCAiygAwIBAgIUKj+0Z9SYp0apXYQMnIaGrABH2CkwDQYJKoZIhvcNAQEL
-BQAwDTELMAkGA1UEAxMCQ0EwIBcNMjIwNDI5MDQyMjAwWhgPMjEyMjA0MDUwNDIy
-MDBaMBExDzANBgNVBAMTBnNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKwR+ePPuLR2G7jMXNPVrPgKPkmf3EyZSAY59B+auGPR6ESCH8CPTads
-bkNekeoJJYoxAnbUP/Bwb5KDElcnGkJ7umYhjdZFlQ/sqfnVj/I5vqnUEAFK5cFy
-+0neLd87MvcKNXgvtKHdYc7KqI8xNe+ZlbM3o/ViUC7Pxp/Ir9OvFCmlGVKh+2S3
-toR7p7ZBThBWEr9d2HX/UDG4UbdPxW3K1heWFfGkEOqZOBft/dD1FaC2WOfdjyUM
-2cvqqqCrT9MTZXeGi61vLmdnRfNge9jZoZyLN/hpm6ooSV6Qm7rNfhfKccVEF5A0
-J3392P3uH5JJtu/sVPzt/Eojafc4YA0CAwEAAaOBlTCBkjAOBgNVHQ8BAf8EBAMC
-BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAw
-HQYDVR0OBBYEFLbqyodNVvHtcBa31enG3uOahaqsMB8GA1UdIwQYMBaAFB0oynra
-PRsiMaCbp4VFErPtqn79MBMGA1UdEQQMMAqCCGV0Y2Qtc3NsMA0GCSqGSIb3DQEB
-CwUAA4IBAQBooiAWyAQrplByLHpZlXkJ1Gz4KFCztXYEpAThuZtT/pXgfRZCIwpz
-2lcygCNWlqKbwqc5eomm0NdfYcDu0eiExWBfiVhzXJDWKbus3pzR6tpinKexmNU9
-3rQ3DNiaIOTUf6494mX2qKTATce0uWBRiVAzSi/Ng7EF/xTif4pRcKdY62bD0/1J
-Jwu0dUE4HctOAiqX8Iq9gO4m5EKtXs0Z6r7gX3+UPIOPMX7hMAm3G6gIrVsyveeR
-8UrDHx+rdtSY8y0I3jKbGDF9hLNflsbtmoGoK6jzbU2edqhHfx13QXsBbqZMEHLX
-qXPO4Sx3hcVQ6neOVzMFDIQJOOonFqBa
------END CERTIFICATE-----
diff --git 
a/pulsar-metadata/src/test/resources/ssl/generate-self-signed-certificates.sh 
b/pulsar-metadata/src/test/resources/ssl/generate-self-signed-certificates.sh
deleted file mode 100755
index ca90ac5ca42..00000000000
--- 
a/pulsar-metadata/src/test/resources/ssl/generate-self-signed-certificates.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Copied from 
https://github.com/etcd-io/jetcd/blob/ff7d698b046367d243a8d9d5cfe528f9bb0e933f/jetcd-core/src/test/resources/ssl/generate-self-signed-certificates.sh
-
-ROOT="$(cd "$(dirname $0)" && pwd)"
-
-CFSSL_HOME=${ROOT}/cfssl
-CERT_HOME=${ROOT}/cert
-
-mkdir -p $CFSSL_HOME
-mkdir -p $CERT_HOME
-
-OS="$(uname -s)"
-case $OS in
-    "Linux")
-      PLATFORM="linux_amd64"
-    ;;
-    "Darwin")
-      PLATFORM="darwin_amd64"
-    ;;
-esac
-
-curl -L 
https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_${PLATFORM}>
 cfssl/cfssl
-curl -L 
https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_${PLATFORM}>
 cfssl/cfssljson
-chmod +x cfssl/{cfssl,cfssljson}
-
-cd $CERT_HOME
-
-echo '{"CN":"CA","key":{"algo":"rsa","size":2048}}' | $CFSSL_HOME/cfssl 
gencert -initca - | $CFSSL_HOME/cfssljson -bare ca -
-echo '{"signing":{"default":{"expiry":"876000h","usages":["signing","key 
encipherment","server auth","client auth"]}}}' > ca-config.json
-
-export ADDRESS=etcd-ssl
-export NAME=server
-echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | 
$CFSSL_HOME/cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem 
-hostname="$ADDRESS" - | $CFSSL_HOME/cfssljson -bare $NAME
-
-export ADDRESS=etcd0
-export NAME=etcd0
-echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | 
$CFSSL_HOME/cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem 
-hostname="$ADDRESS" - | $CFSSL_HOME/cfssljson -bare $NAME
-
-export ADDRESS=etcd1
-export NAME=etcd1
-echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | 
$CFSSL_HOME/cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem 
-hostname="$ADDRESS" - | $CFSSL_HOME/cfssljson -bare $NAME
-
-export ADDRESS=etcd2
-export NAME=etcd2
-echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | 
$CFSSL_HOME/cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem 
-hostname="$ADDRESS" - | $CFSSL_HOME/cfssljson -bare $NAME
-
-export ADDRESS=
-export NAME=client
-echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | 
$CFSSL_HOME/cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem 
-hostname="$ADDRESS" - | $CFSSL_HOME/cfssljson -bare $NAME
-
-openssl pkcs8 -topk8 -inform PEM -outform PEM -in client-key.pem -out 
client-key-pk8.pem -nocrypt
diff --git a/src/owasp-dependency-check-suppressions.xml 
b/src/owasp-dependency-check-suppressions.xml
index f302c251f96..977e6514cfd 100644
--- a/src/owasp-dependency-check-suppressions.xml
+++ b/src/owasp-dependency-check-suppressions.xml
@@ -241,22 +241,6 @@
         <cve>CVE-2021-42550</cve>
     </suppress>
 
-    <suppress>
-        <notes>Ignore etdc CVEs in jetcd</notes>
-        <filePath regex="true">.*jetcd.*</filePath>
-        <cpe>cpe:/a:etcd:etcd</cpe>
-    </suppress>
-    <suppress>
-        <notes>Ignore etdc CVEs in jetcd</notes>
-        <filePath regex="true">.*jetcd.*</filePath>
-        <cpe>cpe:/a:redhat:etcd</cpe>
-    </suppress>
-    <suppress>
-        <notes>Ignore grpc CVEs in jetcd</notes>
-        <filePath regex="true">.*jetcd-grpc.*</filePath>
-        <cpe>cpe:/a:grpc:grpc</cpe>
-    </suppress>
-
     <!-- bouncycastle misdetections -->
     <suppress>
         <notes><![CDATA[


Reply via email to