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

penghui 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 8ded6de  Add integration tests for package management service (#8876)
8ded6de is described below

commit 8ded6deca4580a23c5674e5529525f3a1a8f1c39
Author: Yong Zhang <[email protected]>
AuthorDate: Thu Dec 10 21:16:57 2020 +0800

    Add integration tests for package management service (#8876)
    
    ---
    
    Master Issue: #8676
    
    *Motivation*
    
    Add integration tests for testing the whole package management service.
    
    *Modifications*
    
    - Add integration tests
    - Fix some issue when startup the package management service
---
 .../org/apache/pulsar/broker/PulsarService.java    |   2 +-
 .../org/apache/pulsar/admin/cli/CmdPackages.java   |   4 +-
 .../apache/pulsar/admin/cli/PulsarAdminTool.java   |   2 +
 .../bookkeeper/BookKeeperPackagesStorage.java      |  12 +-
 .../BookKeeperPackagesStorageConfiguration.java    |  12 +-
 .../bookkeeper/BookKeeperPackagesStorageTest.java  |  12 +-
 .../tests/integration/cli/PackagesCliTest.java     | 132 +++++++++++++++++++++
 .../integration/topologies/PulsarCluster.java      |   3 +
 .../integration/topologies/PulsarClusterSpec.java  |   5 +
 .../integration/src/test/resources/pulsar-cli.xml  |   1 +
 10 files changed, 165 insertions(+), 20 deletions(-)

diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
index 8b28810..8d9c564 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
@@ -1350,7 +1350,7 @@ public class PulsarService implements AutoCloseable {
             .newProvider(config.getPackagesManagementStorageProvider());
         DefaultPackagesStorageConfiguration storageConfiguration = new 
DefaultPackagesStorageConfiguration();
         storageConfiguration.setProperty(config.getProperties());
-        PackagesStorage storage = storageProvider.getStorage(new 
DefaultPackagesStorageConfiguration());
+        PackagesStorage storage = 
storageProvider.getStorage(storageConfiguration);
         storage.initialize();
         packagesManagement.initialize(storage);
     }
diff --git 
a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdPackages.java
 
b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdPackages.java
index bb9e666..4c863e9 100644
--- 
a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdPackages.java
+++ 
b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdPackages.java
@@ -36,7 +36,7 @@ class CmdPackages extends CmdBase {
 
     private final Packages packages;
 
-    CmdPackages(PulsarAdmin admin) {
+    public CmdPackages(PulsarAdmin admin) {
         super("packages", admin);
         this.packages = admin.packages();
 
@@ -133,7 +133,7 @@ class CmdPackages extends CmdBase {
 
         @Override
         void run() throws Exception {
-            print(packages.listPackageVersions(packageName).toString());
+            print(packages.listPackageVersions(packageName));
         }
     }
 
diff --git 
a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/PulsarAdminTool.java
 
b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/PulsarAdminTool.java
index 65281cc..514b1b8 100644
--- 
a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/PulsarAdminTool.java
+++ 
b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/PulsarAdminTool.java
@@ -142,6 +142,8 @@ public class PulsarAdminTool {
         // TODO eventually remove this
         commandMap.put("source", CmdSources.class);
         commandMap.put("sink", CmdSinks.class);
+
+        commandMap.put("packages", CmdPackages.class);
     }
 
     private void setupCommands(Function<PulsarAdminBuilder, ? extends 
PulsarAdmin> adminFactory) {
diff --git 
a/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorage.java
 
b/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorage.java
index f0409b4..0f8a2ee 100644
--- 
a/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorage.java
+++ 
b/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorage.java
@@ -60,9 +60,9 @@ public class BookKeeperPackagesStorage implements 
PackagesStorage {
         DistributedLogConfiguration conf = new DistributedLogConfiguration()
             .setImmediateFlushEnabled(true)
             .setOutputBufferSize(0)
-            .setWriteQuorumSize(configuration.getNumReplicas())
-            .setEnsembleSize(configuration.getNumReplicas())
-            .setAckQuorumSize(configuration.getNumReplicas())
+            .setWriteQuorumSize(configuration.getPackagesReplicas())
+            .setEnsembleSize(configuration.getPackagesReplicas())
+            .setAckQuorumSize(configuration.getPackagesReplicas())
             .setLockTimeout(DistributedLogConstants.LOCK_IMMEDIATE);
         if 
(!Strings.isNullOrEmpty(configuration.getBookkeeperClientAuthenticationPlugin()))
 {
             conf.setProperty("bkc.clientAuthProviderFactoryClass",
@@ -82,9 +82,11 @@ public class BookKeeperPackagesStorage implements 
PackagesStorage {
     }
 
     private URI initializeDlogNamespace() throws IOException {
-        BKDLConfig bkdlConfig = new BKDLConfig(configuration.getZkServers(), 
configuration.getLedgersRootPath());
+        BKDLConfig bkdlConfig = new 
BKDLConfig(configuration.getZookeeperServers(),
+            configuration.getPackagesManagementLedgerRootPath());
         DLMetadata dlMetadata = DLMetadata.create(bkdlConfig);
-        URI dlogURI = 
URI.create(String.format("distributedlog://%s/pulsar/packages", 
configuration.getZkServers()));
+        URI dlogURI = 
URI.create(String.format("distributedlog://%s/pulsar/packages",
+            configuration.getZookeeperServers()));
         try {
             dlMetadata.create(dlogURI);
         } catch (ZKException e) {
diff --git 
a/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageConfiguration.java
 
b/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageConfiguration.java
index 10b3721..226b80a 100644
--- 
a/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageConfiguration.java
+++ 
b/pulsar-package-management/bookkeeper-storage/src/main/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageConfiguration.java
@@ -34,16 +34,16 @@ public class BookKeeperPackagesStorageConfiguration 
implements PackagesStorageCo
         this.configuration = configuration;
     }
 
-    int getNumReplicas() {
-        return Integer.parseInt(getProperty("numReplicas"));
+    int getPackagesReplicas() {
+        return Integer.parseInt(getProperty("packagesReplicas"));
     }
 
-    String getZkServers() {
-        return getProperty("zkServers");
+    String getZookeeperServers() {
+        return getProperty("zookeeperServers");
     }
 
-    String getLedgersRootPath() {
-        return getProperty("ledgerRootPath");
+    String getPackagesManagementLedgerRootPath() {
+        return getProperty("packagesManagementLedgerRootPath");
     }
 
     String getBookkeeperClientAuthenticationPlugin() {
diff --git 
a/pulsar-package-management/bookkeeper-storage/src/test/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageTest.java
 
b/pulsar-package-management/bookkeeper-storage/src/test/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageTest.java
index 5e0954a..859c485 100644
--- 
a/pulsar-package-management/bookkeeper-storage/src/test/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageTest.java
+++ 
b/pulsar-package-management/bookkeeper-storage/src/test/java/org/apache/pulsar/packages/management/storage/bookkeeper/BookKeeperPackagesStorageTest.java
@@ -53,9 +53,9 @@ public class BookKeeperPackagesStorageTest extends 
BookKeeperClusterTestCase {
         PackagesStorageProvider provider = PackagesStorageProvider
             .newProvider(BookKeeperPackagesStorageProvider.class.getName());
         DefaultPackagesStorageConfiguration configuration = new 
DefaultPackagesStorageConfiguration();
-        configuration.setProperty("zkServers", 
zkUtil.getZooKeeperConnectString());
-        configuration.setProperty("numReplicas", "1");
-        configuration.setProperty("ledgerRootPath", "/ledgers");
+        configuration.setProperty("zookeeperServers", 
zkUtil.getZooKeeperConnectString());
+        configuration.setProperty("packagesReplicas", "1");
+        configuration.setProperty("packagesManagementLedgerRootPath", 
"/ledgers");
         storage = provider.getStorage(configuration);
         storage.initialize();
     }
@@ -71,9 +71,9 @@ public class BookKeeperPackagesStorageTest extends 
BookKeeperClusterTestCase {
     public void testConfiguration() {
         assertTrue(storage instanceof BookKeeperPackagesStorage);
         BookKeeperPackagesStorage bkStorage = (BookKeeperPackagesStorage) 
storage;
-        assertEquals(bkStorage.configuration.getZkServers(), 
zkUtil.getZooKeeperConnectString());
-        assertEquals(bkStorage.configuration.getNumReplicas(), 1);
-        assertEquals(bkStorage.configuration.getLedgersRootPath(), "/ledgers");
+        assertEquals(bkStorage.configuration.getZookeeperServers(), 
zkUtil.getZooKeeperConnectString());
+        assertEquals(bkStorage.configuration.getPackagesReplicas(), 1);
+        
assertEquals(bkStorage.configuration.getPackagesManagementLedgerRootPath(), 
"/ledgers");
     }
 
     @Test(timeOut = 60000)
diff --git 
a/tests/integration/src/test/java/org/apache/pulsar/tests/integration/cli/PackagesCliTest.java
 
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/cli/PackagesCliTest.java
new file mode 100644
index 0000000..3792a12
--- /dev/null
+++ 
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/cli/PackagesCliTest.java
@@ -0,0 +1,132 @@
+/**
+ * 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.tests.integration.cli;
+
+import org.apache.pulsar.tests.integration.docker.ContainerExecResult;
+import org.apache.pulsar.tests.integration.topologies.PulsarCluster;
+import org.apache.pulsar.tests.integration.topologies.PulsarClusterSpec;
+import org.testcontainers.shaded.org.apache.commons.lang.RandomStringUtils;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PackagesCliTest {
+
+    private final static String clusterNamePrefix = "packages-service";
+    private PulsarCluster pulsarCluster;
+
+    @BeforeClass
+    public void setup() throws Exception {
+        PulsarClusterSpec spec = PulsarClusterSpec.builder()
+            .clusterName(String.format("%s-%s", clusterNamePrefix, 
RandomStringUtils.randomAlphabetic(6)))
+            .brokerEnvs(getPackagesManagementServiceEnvs())
+            .build();
+        pulsarCluster = PulsarCluster.forSpec(spec);
+        pulsarCluster.start();
+    }
+
+    @AfterClass
+    public void teardown() {
+        if (pulsarCluster != null) {
+            pulsarCluster.stop();
+            pulsarCluster = null;
+        }
+    }
+
+    private Map<String, String> getPackagesManagementServiceEnvs() {
+        Map<String, String> envs = new HashMap<>();
+        envs.put("enablePackagesManagement", "true");
+        return envs;
+    }
+
+    @Test(timeOut = 60000 * 10)
+    public void testPackagesOperationsWithoutUploadingPackages() throws 
Exception {
+        ContainerExecResult result = runPackagesCommand("list", "--type", 
"function", "public/default");
+        assertEquals(result.getExitCode(), 0);
+        assertTrue(result.getStdout().isEmpty());
+
+        result = runPackagesCommand("list-versions", 
"function://public/default/test");
+        assertEquals(result.getExitCode(), 0);
+        assertTrue(result.getStdout().isEmpty());
+
+        try {
+            result = runPackagesCommand("download", 
"function://public/default/test@v1", "--path", "test-admin");
+            fail("this command should be failed");
+        } catch (Exception e) {
+            // expected exception
+        }
+    }
+
+    // TODO: the upload command has some problem when uploading packages, 
enable this tests when issue
+    // https://github.com/apache/pulsar/issues/8874 is fixed.
+    public void testPackagesOperationsWithUploadingPackages() throws Exception 
{
+        String testPackageName = "function://public/default/test@v1";
+        ContainerExecResult result = runPackagesCommand("upload", 
"--description", "a test package",
+            "--path", PulsarCluster.ADMIN_SCRIPT, testPackageName);
+        assertEquals(result.getExitCode(), 0);
+
+        result = runPackagesCommand("get-metadata", testPackageName);
+        assertEquals(result.getExitCode(), 0);
+        assertFalse(result.getStdout().isEmpty());
+        assertTrue(result.getStdout().contains("a test package"));
+
+        result = runPackagesCommand("list", "--type", "function", 
"public/default");
+        assertEquals(result.getExitCode(), 0);
+        assertFalse(result.getStdout().isEmpty());
+        assertTrue(result.getStdout().contains(testPackageName));
+
+        result = runPackagesCommand("list-versions", "--type", 
"function://public/default/test");
+        assertEquals(result.getExitCode(), 0);
+        assertFalse(result.getStdout().isEmpty());
+        assertTrue(result.getStdout().contains("v1"));
+
+        String contact = "[email protected]";
+        result = runPackagesCommand("update-metadata", "--contact", contact, 
"-PpropertyA=A", testPackageName);
+        assertEquals(result.getExitCode(), 0);
+
+        result = runPackagesCommand("get-metadata", testPackageName);
+        assertEquals(result.getExitCode(), 0);
+        assertFalse(result.getStdout().isEmpty());
+        assertTrue(result.getStdout().contains("a test package"));
+        assertTrue(result.getStdout().contains(contact));
+        assertTrue(result.getStdout().contains("propertyA"));
+
+        result = runPackagesCommand("delete", testPackageName);
+        assertEquals(result.getExitCode(), 0);
+
+        result = runPackagesCommand("list", "--type", "functions", 
"public/default");
+        assertEquals(result.getExitCode(), 0);
+        assertTrue(result.getStdout().isEmpty());
+    }
+
+    private ContainerExecResult runPackagesCommand(String... commands) throws 
Exception {
+        String[] cmds = new String[commands.length + 1];
+        cmds[0] = "packages";
+        System.arraycopy(commands, 0, cmds, 1, commands.length);
+        return pulsarCluster.runAdminCommandOnAnyBroker(cmds);
+    }
+}
diff --git 
a/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarCluster.java
 
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarCluster.java
index c75bd59e..8d835dd 100644
--- 
a/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarCluster.java
+++ 
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarCluster.java
@@ -171,6 +171,9 @@ public class PulsarCluster {
                         
brokerContainer.withEnv("bookkeeperExplicitLacIntervalInMills", "10");
                         brokerContainer.withEnv("bookkeeperUseV2WireProtocol", 
"false");
                     }
+                    if (spec.brokerEnvs != null) {
+                        brokerContainer.withEnv(spec.brokerEnvs);
+                    }
                     return brokerContainer;
                 }
             ));
diff --git 
a/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarClusterSpec.java
 
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarClusterSpec.java
index 8d48fb2..b0c49bd 100644
--- 
a/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarClusterSpec.java
+++ 
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/topologies/PulsarClusterSpec.java
@@ -137,4 +137,9 @@ public class PulsarClusterSpec {
      * Specify envs for proxy.
      */
     Map<String, String> proxyEnvs;
+
+    /**
+     * Specify envs for broker.
+     */
+    Map<String, String> brokerEnvs;
 }
diff --git a/tests/integration/src/test/resources/pulsar-cli.xml 
b/tests/integration/src/test/resources/pulsar-cli.xml
index 1be3a1d..d6a9a15 100644
--- a/tests/integration/src/test/resources/pulsar-cli.xml
+++ b/tests/integration/src/test/resources/pulsar-cli.xml
@@ -28,6 +28,7 @@
             <class 
name="org.apache.pulsar.tests.integration.compaction.TestCompaction" />
             <class 
name="org.apache.pulsar.tests.integration.cli.AdminMultiHostTest"/>
             <class 
name="org.apache.pulsar.tests.integration.cli.FunctionsCLITest"/>
+            <class 
name="org.apache.pulsar.tests.integration.cli.PackagesCliTest"/>
         </classes>
     </test>
 </suite>

Reply via email to