From 16088fa6c9eb8f73b4946bcab78f2b5865be8ceb Mon Sep 17 00:00:00 2001 From: Addison Higham Date: Thu, 10 Oct 2019 23:18:39 -0600 Subject: [PATCH 1/5] [proxy] Fix proxy to be able to re-send request body Fixes #5360 This adds a small cache of the request body to ensure that it can be re-sent. TODO: still needs tested --- .../proxy/server/AdminProxyHandler.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java index fdf687dfc9ea0..6a767d42a76df 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java @@ -20,9 +20,14 @@ import static org.apache.commons.lang3.StringUtils.isBlank; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URI; +import java.nio.ByteBuffer; import java.security.cert.X509Certificate; +import java.util.Collections; +import java.util.Iterator; import java.util.Objects; import java.util.concurrent.Executor; @@ -30,6 +35,7 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.pulsar.broker.web.AuthenticationFilter; import org.apache.pulsar.client.api.Authentication; @@ -42,6 +48,7 @@ import org.eclipse.jetty.client.HttpRequest; import org.eclipse.jetty.client.ProtocolHandlers; import org.eclipse.jetty.client.RedirectProtocolHandler; +import org.eclipse.jetty.client.api.ContentProvider; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.proxy.ProxyServlet; @@ -133,6 +140,33 @@ protected HttpClient createHttpClient() throws ServletException { } + // This class allows the request body to be replayed, the default implementation + // does not + protected class ReplayableProxyContentProvider extends ProxyInputStreamContentProvider { + private Boolean firstIteratorCalled = false; + private final ByteArrayOutputStream bodyBuffer; + protected ReplayableProxyContentProvider(HttpServletRequest request, HttpServletResponse response, Request proxyRequest, InputStream input) { + super(request, response, proxyRequest, input); + bodyBuffer = new ByteArrayOutputStream(request.getContentLength()); + } + + @Override + public Iterator iterator() { + if (firstIteratorCalled) { + return Collections.singleton(ByteBuffer.wrap(bodyBuffer.toByteArray())).iterator(); + } else { + firstIteratorCalled = true; + return super.iterator(); + } + } + + @Override + protected ByteBuffer onRead(byte[] buffer, int offset, int length) { + bodyBuffer.write(buffer, offset, length); + return super.onRead(buffer, offset, length); + } + } + private static class JettyHttpClient extends HttpClient { public JettyHttpClient() { super(); @@ -159,6 +193,12 @@ protected Request copyRequest(HttpRequest oldRequest, URI newURI) { } + @Override + protected ContentProvider proxyRequestContent(HttpServletRequest request, + HttpServletResponse response, Request proxyRequest) throws IOException { + return new ReplayableProxyContentProvider(request, response, proxyRequest, request.getInputStream()); + } + @Override protected HttpClient newHttpClient() { try { From 2d4bbf008fa3716dfe19dadaf7befada3477019a Mon Sep 17 00:00:00 2001 From: Addison Higham Date: Fri, 11 Oct 2019 11:36:23 -0600 Subject: [PATCH 2/5] create release 2.4.1-inst2 --- buildtools/pom.xml | 2 +- dashboard/pom.xml | 2 +- distribution/io/pom.xml | 2 +- distribution/offloaders/pom.xml | 2 +- distribution/pom.xml | 2 +- distribution/server/pom.xml | 2 +- docker/grafana/pom.xml | 2 +- docker/pom.xml | 2 +- docker/pulsar-all/pom.xml | 2 +- docker/pulsar-standalone/pom.xml | 2 +- docker/pulsar/pom.xml | 2 +- examples/flink/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spark/pom.xml | 2 +- jclouds-shaded/pom.xml | 2 +- managed-ledger-shaded/pom.xml | 2 +- managed-ledger/pom.xml | 2 +- pom.xml | 2 +- protobuf-shaded/pom.xml | 2 +- pulsar-broker-auth-athenz/pom.xml | 2 +- pulsar-broker-auth-sasl/pom.xml | 2 +- pulsar-broker-common/pom.xml | 2 +- pulsar-broker-shaded/pom.xml | 2 +- pulsar-broker/pom.xml | 2 +- pulsar-client-1x-base/pom.xml | 2 +- pulsar-client-1x-base/pulsar-client-1x/pom.xml | 2 +- pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml | 2 +- pulsar-client-admin-shaded/pom.xml | 2 +- pulsar-client-admin/pom.xml | 2 +- pulsar-client-all/pom.xml | 2 +- pulsar-client-api/pom.xml | 2 +- pulsar-client-auth-athenz/pom.xml | 2 +- pulsar-client-auth-sasl/pom.xml | 2 +- pulsar-client-kafka-compat/pom.xml | 2 +- pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml | 2 +- pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml | 2 +- pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml | 2 +- pulsar-client-shaded/pom.xml | 2 +- pulsar-client-tools-test/pom.xml | 2 +- pulsar-client-tools/pom.xml | 2 +- pulsar-client/pom.xml | 2 +- pulsar-common/pom.xml | 2 +- pulsar-discovery-service/pom.xml | 2 +- pulsar-flink/pom.xml | 2 +- pulsar-functions/api-java/pom.xml | 2 +- pulsar-functions/instance/pom.xml | 2 +- pulsar-functions/java-examples/pom.xml | 2 +- pulsar-functions/localrun-shaded/pom.xml | 2 +- pulsar-functions/localrun/pom.xml | 2 +- pulsar-functions/pom.xml | 2 +- pulsar-functions/proto/pom.xml | 2 +- pulsar-functions/runtime-all/pom.xml | 2 +- pulsar-functions/runtime/pom.xml | 2 +- pulsar-functions/secrets/pom.xml | 2 +- pulsar-functions/utils/pom.xml | 2 +- pulsar-functions/worker/pom.xml | 2 +- pulsar-io/aerospike/pom.xml | 2 +- pulsar-io/canal/pom.xml | 2 +- pulsar-io/cassandra/pom.xml | 2 +- pulsar-io/common/pom.xml | 2 +- pulsar-io/core/pom.xml | 2 +- pulsar-io/data-generator/pom.xml | 2 +- pulsar-io/debezium/core/pom.xml | 2 +- pulsar-io/debezium/mysql/pom.xml | 2 +- pulsar-io/debezium/pom.xml | 2 +- pulsar-io/debezium/postgres/pom.xml | 2 +- pulsar-io/docs/pom.xml | 2 +- pulsar-io/elastic-search/pom.xml | 2 +- pulsar-io/file/pom.xml | 2 +- pulsar-io/flume/pom.xml | 2 +- pulsar-io/hbase/pom.xml | 2 +- pulsar-io/hdfs2/pom.xml | 2 +- pulsar-io/hdfs3/pom.xml | 2 +- pulsar-io/influxdb/pom.xml | 2 +- pulsar-io/jdbc/pom.xml | 2 +- pulsar-io/kafka-connect-adaptor/pom.xml | 2 +- pulsar-io/kafka/pom.xml | 2 +- pulsar-io/kinesis/pom.xml | 2 +- pulsar-io/mongo/pom.xml | 2 +- pulsar-io/netty/pom.xml | 2 +- pulsar-io/pom.xml | 2 +- pulsar-io/rabbitmq/pom.xml | 2 +- pulsar-io/redis/pom.xml | 2 +- pulsar-io/solr/pom.xml | 2 +- pulsar-io/twitter/pom.xml | 2 +- pulsar-log4j2-appender/pom.xml | 2 +- pulsar-proxy/pom.xml | 2 +- pulsar-spark/pom.xml | 2 +- pulsar-sql/pom.xml | 2 +- pulsar-sql/presto-distribution/pom.xml | 2 +- pulsar-sql/presto-pulsar-plugin/pom.xml | 2 +- pulsar-sql/presto-pulsar/pom.xml | 2 +- pulsar-storm/pom.xml | 2 +- pulsar-testclient/pom.xml | 2 +- pulsar-transaction/buffer/pom.xml | 2 +- pulsar-transaction/common/pom.xml | 2 +- pulsar-transaction/coordinator/pom.xml | 2 +- pulsar-transaction/pom.xml | 2 +- pulsar-websocket/pom.xml | 2 +- pulsar-zookeeper-utils/pom.xml | 2 +- pulsar-zookeeper/pom.xml | 2 +- tests/bc_2_0_0/pom.xml | 2 +- tests/bc_2_0_1/pom.xml | 2 +- tests/docker-images/java-test-functions/pom.xml | 2 +- tests/docker-images/latest-version-image/pom.xml | 2 +- tests/docker-images/pom.xml | 2 +- tests/integration/pom.xml | 2 +- tests/pom.xml | 2 +- tests/pulsar-kafka-compat-client-test/pom.xml | 2 +- tests/pulsar-spark-test/pom.xml | 2 +- tests/pulsar-storm-test/pom.xml | 2 +- tiered-storage/jcloud/pom.xml | 2 +- tiered-storage/pom.xml | 2 +- 113 files changed, 113 insertions(+), 113 deletions(-) diff --git a/buildtools/pom.xml b/buildtools/pom.xml index 83ec2260c3cc9..f7e4ea32f5d58 100644 --- a/buildtools/pom.xml +++ b/buildtools/pom.xml @@ -30,7 +30,7 @@ org.apache.pulsar buildtools - 2.4.1-inst1 + 2.4.1-inst2 jar Pulsar Build Tools diff --git a/dashboard/pom.xml b/dashboard/pom.xml index cfc9c439fc84e..482208149ea36 100644 --- a/dashboard/pom.xml +++ b/dashboard/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst1 + 2.4.1-inst2 ../docker 4.0.0 diff --git a/distribution/io/pom.xml b/distribution/io/pom.xml index e418810285c57..018905ff4c401 100644 --- a/distribution/io/pom.xml +++ b/distribution/io/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar distribution - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/distribution/offloaders/pom.xml b/distribution/offloaders/pom.xml index 8fad847330de0..2293760450215 100644 --- a/distribution/offloaders/pom.xml +++ b/distribution/offloaders/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar distribution - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/distribution/pom.xml b/distribution/pom.xml index 3b7af69cd17f2..2d874b870dd33 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/distribution/server/pom.xml b/distribution/server/pom.xml index f062df5335f42..4067711ccbe62 100644 --- a/distribution/server/pom.xml +++ b/distribution/server/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar distribution - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/docker/grafana/pom.xml b/docker/grafana/pom.xml index 16c1010a9ff5f..bc0e6a2cd30d8 100644 --- a/docker/grafana/pom.xml +++ b/docker/grafana/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 org.apache.pulsar diff --git a/docker/pom.xml b/docker/pom.xml index 53dff43e180c7..9588be2a984ef 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 org.apache.pulsar docker-images diff --git a/docker/pulsar-all/pom.xml b/docker/pulsar-all/pom.xml index 86fef066064aa..4e2d5c561d760 100644 --- a/docker/pulsar-all/pom.xml +++ b/docker/pulsar-all/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 pulsar-all-docker-image diff --git a/docker/pulsar-standalone/pom.xml b/docker/pulsar-standalone/pom.xml index 51c5a565e6661..24666e4fab0d6 100644 --- a/docker/pulsar-standalone/pom.xml +++ b/docker/pulsar-standalone/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 org.apache.pulsar diff --git a/docker/pulsar/pom.xml b/docker/pulsar/pom.xml index a7a66f2c3fd3d..3b08f46ff6010 100644 --- a/docker/pulsar/pom.xml +++ b/docker/pulsar/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 org.apache.pulsar diff --git a/examples/flink/pom.xml b/examples/flink/pom.xml index 07b74ece5710a..4e94994cbd28f 100644 --- a/examples/flink/pom.xml +++ b/examples/flink/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar.examples pulsar-examples - 2.4.1-inst1 + 2.4.1-inst2 org.apache.pulsar.examples diff --git a/examples/pom.xml b/examples/pom.xml index f112d8fe50dc9..a92748f836e4b 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 org.apache.pulsar.examples diff --git a/examples/spark/pom.xml b/examples/spark/pom.xml index 9dbc219719262..3686db7ecac29 100644 --- a/examples/spark/pom.xml +++ b/examples/spark/pom.xml @@ -25,7 +25,7 @@ pulsar-examples org.apache.pulsar.examples - 2.4.1-inst1 + 2.4.1-inst2 org.apache.pulsar.examples diff --git a/jclouds-shaded/pom.xml b/jclouds-shaded/pom.xml index a1e27da665054..73c4db05e6960 100644 --- a/jclouds-shaded/pom.xml +++ b/jclouds-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/managed-ledger-shaded/pom.xml b/managed-ledger-shaded/pom.xml index 1ca8e55c3b108..aa52c02518952 100644 --- a/managed-ledger-shaded/pom.xml +++ b/managed-ledger-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/managed-ledger/pom.xml b/managed-ledger/pom.xml index 2d664f3e8d443..fc1239cca22e4 100644 --- a/managed-ledger/pom.xml +++ b/managed-ledger/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pom.xml b/pom.xml index ebec16b8a9f95..51d35128ac0db 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 Pulsar Pulsar is a distributed pub-sub messaging platform with a very diff --git a/protobuf-shaded/pom.xml b/protobuf-shaded/pom.xml index d5dfbc7fc9857..308c6470303c9 100644 --- a/protobuf-shaded/pom.xml +++ b/protobuf-shaded/pom.xml @@ -32,7 +32,7 @@ protobuf-shaded Apache Pulsar :: Protobuf shaded - 2.4.1-inst1 + 2.4.1-inst2 diff --git a/pulsar-broker-auth-athenz/pom.xml b/pulsar-broker-auth-athenz/pom.xml index 2efed5c550eb9..6b94b1be01ca9 100644 --- a/pulsar-broker-auth-athenz/pom.xml +++ b/pulsar-broker-auth-athenz/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-broker-auth-athenz diff --git a/pulsar-broker-auth-sasl/pom.xml b/pulsar-broker-auth-sasl/pom.xml index c680c974948ef..d71557c0a99ad 100644 --- a/pulsar-broker-auth-sasl/pom.xml +++ b/pulsar-broker-auth-sasl/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-broker-auth-sasl diff --git a/pulsar-broker-common/pom.xml b/pulsar-broker-common/pom.xml index 20465eec5c595..54a4f1140b025 100644 --- a/pulsar-broker-common/pom.xml +++ b/pulsar-broker-common/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-broker-common diff --git a/pulsar-broker-shaded/pom.xml b/pulsar-broker-shaded/pom.xml index 025c05b212ee5..c3d30f224fbb9 100644 --- a/pulsar-broker-shaded/pom.xml +++ b/pulsar-broker-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-broker/pom.xml b/pulsar-broker/pom.xml index 7058012a47094..51a6f4ce4f99f 100644 --- a/pulsar-broker/pom.xml +++ b/pulsar-broker/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-1x-base/pom.xml b/pulsar-client-1x-base/pom.xml index 1a658a9227ee2..317eed8e53420 100644 --- a/pulsar-client-1x-base/pom.xml +++ b/pulsar-client-1x-base/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-1x-base/pulsar-client-1x/pom.xml b/pulsar-client-1x-base/pulsar-client-1x/pom.xml index 6fe4280c03662..20e0d7a0b7b46 100644 --- a/pulsar-client-1x-base/pulsar-client-1x/pom.xml +++ b/pulsar-client-1x-base/pulsar-client-1x/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-client-1x-base - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml b/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml index 64f09a9ef88ee..f7a66346ce92c 100644 --- a/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml +++ b/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-client-1x-base - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-admin-shaded/pom.xml b/pulsar-client-admin-shaded/pom.xml index db03af937ddbd..7eff052b86e10 100644 --- a/pulsar-client-admin-shaded/pom.xml +++ b/pulsar-client-admin-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-admin/pom.xml b/pulsar-client-admin/pom.xml index fbd5ce5dc7143..727ee0d8ca371 100644 --- a/pulsar-client-admin/pom.xml +++ b/pulsar-client-admin/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-all/pom.xml b/pulsar-client-all/pom.xml index 0b52afec6f5df..e88cb89f1ac07 100644 --- a/pulsar-client-all/pom.xml +++ b/pulsar-client-all/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-api/pom.xml b/pulsar-client-api/pom.xml index 530be027d1bbc..231aada643773 100644 --- a/pulsar-client-api/pom.xml +++ b/pulsar-client-api/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-auth-athenz/pom.xml b/pulsar-client-auth-athenz/pom.xml index b0f17656a7b9e..0f0693d147f9f 100644 --- a/pulsar-client-auth-athenz/pom.xml +++ b/pulsar-client-auth-athenz/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-auth-sasl/pom.xml b/pulsar-client-auth-sasl/pom.xml index a763f44ec0866..1b0b865e3c884 100644 --- a/pulsar-client-auth-sasl/pom.xml +++ b/pulsar-client-auth-sasl/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-kafka-compat/pom.xml b/pulsar-client-kafka-compat/pom.xml index 38c936fdd765c..bd2e8accfa4de 100644 --- a/pulsar-client-kafka-compat/pom.xml +++ b/pulsar-client-kafka-compat/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml b/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml index 675efd2cd85ab..b9fbfc63b8f82 100644 --- a/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml +++ b/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-client-kafka-compat - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml b/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml index d796b41dcfff3..c2aee31716cd1 100644 --- a/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml +++ b/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-client-kafka-compat - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml b/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml index 1533b102f23d7..ea5f33e70019b 100644 --- a/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml +++ b/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-client-kafka-compat - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-shaded/pom.xml b/pulsar-client-shaded/pom.xml index c0da44d15b565..29b8a314e3959 100644 --- a/pulsar-client-shaded/pom.xml +++ b/pulsar-client-shaded/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-tools-test/pom.xml b/pulsar-client-tools-test/pom.xml index 1d28c1c314b0e..de1a7b5066c10 100644 --- a/pulsar-client-tools-test/pom.xml +++ b/pulsar-client-tools-test/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client-tools/pom.xml b/pulsar-client-tools/pom.xml index f242b81a47b91..72c66b2b5e888 100644 --- a/pulsar-client-tools/pom.xml +++ b/pulsar-client-tools/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-client/pom.xml b/pulsar-client/pom.xml index a5d71ff8ee4ca..5ddbf71a71f11 100644 --- a/pulsar-client/pom.xml +++ b/pulsar-client/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-common/pom.xml b/pulsar-common/pom.xml index ad0036298c0a6..bfb68c1d76caa 100644 --- a/pulsar-common/pom.xml +++ b/pulsar-common/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-discovery-service/pom.xml b/pulsar-discovery-service/pom.xml index f8b3d67e5d3e5..3362678f6e721 100644 --- a/pulsar-discovery-service/pom.xml +++ b/pulsar-discovery-service/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-flink/pom.xml b/pulsar-flink/pom.xml index 7ba7c614c1c5a..774fcc276e14b 100644 --- a/pulsar-flink/pom.xml +++ b/pulsar-flink/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-functions/api-java/pom.xml b/pulsar-functions/api-java/pom.xml index 627a527511c91..21b547c1a2cc2 100644 --- a/pulsar-functions/api-java/pom.xml +++ b/pulsar-functions/api-java/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-api diff --git a/pulsar-functions/instance/pom.xml b/pulsar-functions/instance/pom.xml index dd54455464bd0..0b02c88170500 100644 --- a/pulsar-functions/instance/pom.xml +++ b/pulsar-functions/instance/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-instance diff --git a/pulsar-functions/java-examples/pom.xml b/pulsar-functions/java-examples/pom.xml index 964301e3ac916..53a6b672698a2 100644 --- a/pulsar-functions/java-examples/pom.xml +++ b/pulsar-functions/java-examples/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-api-examples diff --git a/pulsar-functions/localrun-shaded/pom.xml b/pulsar-functions/localrun-shaded/pom.xml index 392b0f290cfec..e0eb38edac3cf 100644 --- a/pulsar-functions/localrun-shaded/pom.xml +++ b/pulsar-functions/localrun-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-functions/localrun/pom.xml b/pulsar-functions/localrun/pom.xml index 489ac2dddaf74..dce92de7ab74a 100644 --- a/pulsar-functions/localrun/pom.xml +++ b/pulsar-functions/localrun/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-functions/pom.xml b/pulsar-functions/pom.xml index 07214e63d879f..5bc48ecbfb3b2 100644 --- a/pulsar-functions/pom.xml +++ b/pulsar-functions/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions diff --git a/pulsar-functions/proto/pom.xml b/pulsar-functions/proto/pom.xml index c3ba44b5b2d8a..9ce70b6f20a47 100644 --- a/pulsar-functions/proto/pom.xml +++ b/pulsar-functions/proto/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-proto diff --git a/pulsar-functions/runtime-all/pom.xml b/pulsar-functions/runtime-all/pom.xml index b1e2b0726c361..f6b8a14fd1c4f 100644 --- a/pulsar-functions/runtime-all/pom.xml +++ b/pulsar-functions/runtime-all/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-functions/runtime/pom.xml b/pulsar-functions/runtime/pom.xml index 4a0a552e25e9e..1ce0f623aac6f 100644 --- a/pulsar-functions/runtime/pom.xml +++ b/pulsar-functions/runtime/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-runtime diff --git a/pulsar-functions/secrets/pom.xml b/pulsar-functions/secrets/pom.xml index 7dd8cbd4b71b2..c4ffeb40b2a84 100644 --- a/pulsar-functions/secrets/pom.xml +++ b/pulsar-functions/secrets/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-secrets diff --git a/pulsar-functions/utils/pom.xml b/pulsar-functions/utils/pom.xml index 2ec03f88a937b..d0f579d271488 100644 --- a/pulsar-functions/utils/pom.xml +++ b/pulsar-functions/utils/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 pulsar-functions-utils diff --git a/pulsar-functions/worker/pom.xml b/pulsar-functions/worker/pom.xml index 53a1a787c78ab..70275044af496 100644 --- a/pulsar-functions/worker/pom.xml +++ b/pulsar-functions/worker/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-io/aerospike/pom.xml b/pulsar-io/aerospike/pom.xml index c89ee0adc854d..68a980fdc5804 100644 --- a/pulsar-io/aerospike/pom.xml +++ b/pulsar-io/aerospike/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-aerospike diff --git a/pulsar-io/canal/pom.xml b/pulsar-io/canal/pom.xml index 84acbb9f86ae8..f55e24359f5dc 100644 --- a/pulsar-io/canal/pom.xml +++ b/pulsar-io/canal/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 diff --git a/pulsar-io/cassandra/pom.xml b/pulsar-io/cassandra/pom.xml index 62eba7b75f689..d698a299d125e 100644 --- a/pulsar-io/cassandra/pom.xml +++ b/pulsar-io/cassandra/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-cassandra diff --git a/pulsar-io/common/pom.xml b/pulsar-io/common/pom.xml index 0a90edcf39911..64fe9a8a13877 100644 --- a/pulsar-io/common/pom.xml +++ b/pulsar-io/common/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-common diff --git a/pulsar-io/core/pom.xml b/pulsar-io/core/pom.xml index e79e763167464..ac4d4a0d89695 100644 --- a/pulsar-io/core/pom.xml +++ b/pulsar-io/core/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-core diff --git a/pulsar-io/data-generator/pom.xml b/pulsar-io/data-generator/pom.xml index d7e3d618e3f09..532a94ad556d3 100644 --- a/pulsar-io/data-generator/pom.xml +++ b/pulsar-io/data-generator/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-data-generator diff --git a/pulsar-io/debezium/core/pom.xml b/pulsar-io/debezium/core/pom.xml index 78993117a88dd..ee6f0b6380b59 100644 --- a/pulsar-io/debezium/core/pom.xml +++ b/pulsar-io/debezium/core/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io-debezium - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-debezium-core diff --git a/pulsar-io/debezium/mysql/pom.xml b/pulsar-io/debezium/mysql/pom.xml index b774e8766ec1b..7af0ceedec885 100644 --- a/pulsar-io/debezium/mysql/pom.xml +++ b/pulsar-io/debezium/mysql/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io-debezium - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-debezium-mysql diff --git a/pulsar-io/debezium/pom.xml b/pulsar-io/debezium/pom.xml index 913e4ac854496..478288a2c5651 100644 --- a/pulsar-io/debezium/pom.xml +++ b/pulsar-io/debezium/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-debezium diff --git a/pulsar-io/debezium/postgres/pom.xml b/pulsar-io/debezium/postgres/pom.xml index 6244e2176e6ef..ea22317afda7f 100644 --- a/pulsar-io/debezium/postgres/pom.xml +++ b/pulsar-io/debezium/postgres/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io-debezium - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-debezium-postgres diff --git a/pulsar-io/docs/pom.xml b/pulsar-io/docs/pom.xml index 26ee800b033c3..7d7be584d88c4 100644 --- a/pulsar-io/docs/pom.xml +++ b/pulsar-io/docs/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-docs diff --git a/pulsar-io/elastic-search/pom.xml b/pulsar-io/elastic-search/pom.xml index 3988408b38f33..3d4ae15342835 100644 --- a/pulsar-io/elastic-search/pom.xml +++ b/pulsar-io/elastic-search/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-elastic-search Pulsar IO :: ElasticSearch diff --git a/pulsar-io/file/pom.xml b/pulsar-io/file/pom.xml index 1eae7842b7b3c..0fd402a9596be 100644 --- a/pulsar-io/file/pom.xml +++ b/pulsar-io/file/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-file diff --git a/pulsar-io/flume/pom.xml b/pulsar-io/flume/pom.xml index 2f689a5a7d346..26209a1e1e4c2 100644 --- a/pulsar-io/flume/pom.xml +++ b/pulsar-io/flume/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-flume diff --git a/pulsar-io/hbase/pom.xml b/pulsar-io/hbase/pom.xml index ad2d5bae6d03e..84a9bdcf0d091 100644 --- a/pulsar-io/hbase/pom.xml +++ b/pulsar-io/hbase/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-hbase Pulsar IO :: Hbase diff --git a/pulsar-io/hdfs2/pom.xml b/pulsar-io/hdfs2/pom.xml index 42c6cb1692e14..d01b466037073 100644 --- a/pulsar-io/hdfs2/pom.xml +++ b/pulsar-io/hdfs2/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-hdfs2 Pulsar IO :: Hdfs2 diff --git a/pulsar-io/hdfs3/pom.xml b/pulsar-io/hdfs3/pom.xml index 6657c5a8db378..fbf95f38150ca 100644 --- a/pulsar-io/hdfs3/pom.xml +++ b/pulsar-io/hdfs3/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-hdfs3 Pulsar IO :: Hdfs3 diff --git a/pulsar-io/influxdb/pom.xml b/pulsar-io/influxdb/pom.xml index d8ed24d96f9da..74a9a78d28263 100644 --- a/pulsar-io/influxdb/pom.xml +++ b/pulsar-io/influxdb/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-influxdb diff --git a/pulsar-io/jdbc/pom.xml b/pulsar-io/jdbc/pom.xml index 806a18c3e53b7..de6c10b0f97a4 100644 --- a/pulsar-io/jdbc/pom.xml +++ b/pulsar-io/jdbc/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-jdbc diff --git a/pulsar-io/kafka-connect-adaptor/pom.xml b/pulsar-io/kafka-connect-adaptor/pom.xml index 744329aa89b33..1e8cb8e53e918 100644 --- a/pulsar-io/kafka-connect-adaptor/pom.xml +++ b/pulsar-io/kafka-connect-adaptor/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-kafka-connect-adaptor diff --git a/pulsar-io/kafka/pom.xml b/pulsar-io/kafka/pom.xml index ded9f7253f048..0e529ef37f90e 100644 --- a/pulsar-io/kafka/pom.xml +++ b/pulsar-io/kafka/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-kafka diff --git a/pulsar-io/kinesis/pom.xml b/pulsar-io/kinesis/pom.xml index de0b04aaf668e..8ba1a6c522a8f 100644 --- a/pulsar-io/kinesis/pom.xml +++ b/pulsar-io/kinesis/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-kinesis diff --git a/pulsar-io/mongo/pom.xml b/pulsar-io/mongo/pom.xml index b1d53363b1169..eb8676649c63a 100644 --- a/pulsar-io/mongo/pom.xml +++ b/pulsar-io/mongo/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-mongo diff --git a/pulsar-io/netty/pom.xml b/pulsar-io/netty/pom.xml index 635531be18851..10b6c9028612a 100644 --- a/pulsar-io/netty/pom.xml +++ b/pulsar-io/netty/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-netty diff --git a/pulsar-io/pom.xml b/pulsar-io/pom.xml index f884fa6c17557..b7d666695a5ad 100644 --- a/pulsar-io/pom.xml +++ b/pulsar-io/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io diff --git a/pulsar-io/rabbitmq/pom.xml b/pulsar-io/rabbitmq/pom.xml index fb9d44d0f71ce..9b22b2466f5e0 100644 --- a/pulsar-io/rabbitmq/pom.xml +++ b/pulsar-io/rabbitmq/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-rabbitmq diff --git a/pulsar-io/redis/pom.xml b/pulsar-io/redis/pom.xml index 18f43d8050882..1864c6b9355da 100644 --- a/pulsar-io/redis/pom.xml +++ b/pulsar-io/redis/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-redis diff --git a/pulsar-io/solr/pom.xml b/pulsar-io/solr/pom.xml index 4f2b6598fa324..a76c818d0f221 100644 --- a/pulsar-io/solr/pom.xml +++ b/pulsar-io/solr/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst1 + 2.4.1-inst2 diff --git a/pulsar-io/twitter/pom.xml b/pulsar-io/twitter/pom.xml index f99e1ebd53be1..980156ceafe9b 100644 --- a/pulsar-io/twitter/pom.xml +++ b/pulsar-io/twitter/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst1 + 2.4.1-inst2 pulsar-io-twitter diff --git a/pulsar-log4j2-appender/pom.xml b/pulsar-log4j2-appender/pom.xml index 99f74ff877758..d4dbab28b7519 100644 --- a/pulsar-log4j2-appender/pom.xml +++ b/pulsar-log4j2-appender/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-proxy/pom.xml b/pulsar-proxy/pom.xml index 51fd555c532b3..373eded2b7018 100644 --- a/pulsar-proxy/pom.xml +++ b/pulsar-proxy/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-proxy diff --git a/pulsar-spark/pom.xml b/pulsar-spark/pom.xml index 193a50c9c1da4..ac25b29a57e52 100644 --- a/pulsar-spark/pom.xml +++ b/pulsar-spark/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-sql/pom.xml b/pulsar-sql/pom.xml index 4f13d2fc26bb7..334cad90664e2 100644 --- a/pulsar-sql/pom.xml +++ b/pulsar-sql/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-sql diff --git a/pulsar-sql/presto-distribution/pom.xml b/pulsar-sql/presto-distribution/pom.xml index 9a4753fed8945..ac3496ce78f20 100644 --- a/pulsar-sql/presto-distribution/pom.xml +++ b/pulsar-sql/presto-distribution/pom.xml @@ -31,7 +31,7 @@ org.apache.pulsar pulsar-presto-distribution Pulsar SQL :: Pulsar Presto Distribution - 2.4.1-inst1 + 2.4.1-inst2 0.206 diff --git a/pulsar-sql/presto-pulsar-plugin/pom.xml b/pulsar-sql/presto-pulsar-plugin/pom.xml index 7b9656f720b2d..f3e0d39cbffae 100644 --- a/pulsar-sql/presto-pulsar-plugin/pom.xml +++ b/pulsar-sql/presto-pulsar-plugin/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-sql - 2.4.1-inst1 + 2.4.1-inst2 pulsar-presto-connector diff --git a/pulsar-sql/presto-pulsar/pom.xml b/pulsar-sql/presto-pulsar/pom.xml index 10c0d0c2dca5a..b4c7c2d29f19b 100644 --- a/pulsar-sql/presto-pulsar/pom.xml +++ b/pulsar-sql/presto-pulsar/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-sql - 2.4.1-inst1 + 2.4.1-inst2 pulsar-presto-connector-original diff --git a/pulsar-storm/pom.xml b/pulsar-storm/pom.xml index 6ff400061d92c..933b4ea00aa27 100644 --- a/pulsar-storm/pom.xml +++ b/pulsar-storm/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-testclient/pom.xml b/pulsar-testclient/pom.xml index b5084a3211ce9..24de4f6d8d9be 100644 --- a/pulsar-testclient/pom.xml +++ b/pulsar-testclient/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-transaction/buffer/pom.xml b/pulsar-transaction/buffer/pom.xml index 867bc3f425f3c..7bfdc17a1a796 100644 --- a/pulsar-transaction/buffer/pom.xml +++ b/pulsar-transaction/buffer/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-transaction-parent - 2.4.1-inst1 + 2.4.1-inst2 pulsar-transaction-buffer diff --git a/pulsar-transaction/common/pom.xml b/pulsar-transaction/common/pom.xml index c352b7df37d51..cc3f82eae7a52 100644 --- a/pulsar-transaction/common/pom.xml +++ b/pulsar-transaction/common/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-transaction-parent - 2.4.1-inst1 + 2.4.1-inst2 pulsar-transaction-common diff --git a/pulsar-transaction/coordinator/pom.xml b/pulsar-transaction/coordinator/pom.xml index e5dbc43c6a36a..116a77ecf9aa0 100644 --- a/pulsar-transaction/coordinator/pom.xml +++ b/pulsar-transaction/coordinator/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-transaction-parent - 2.4.1-inst1 + 2.4.1-inst2 pulsar-transaction-coordinator diff --git a/pulsar-transaction/pom.xml b/pulsar-transaction/pom.xml index 9c1f29b72c1a3..a0cd78dad26ef 100644 --- a/pulsar-transaction/pom.xml +++ b/pulsar-transaction/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 pulsar-transaction-parent diff --git a/pulsar-websocket/pom.xml b/pulsar-websocket/pom.xml index 32961884642f8..daca9f4689399 100644 --- a/pulsar-websocket/pom.xml +++ b/pulsar-websocket/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-zookeeper-utils/pom.xml b/pulsar-zookeeper-utils/pom.xml index e0ebf189b818e..238e64ef1646a 100644 --- a/pulsar-zookeeper-utils/pom.xml +++ b/pulsar-zookeeper-utils/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/pulsar-zookeeper/pom.xml b/pulsar-zookeeper/pom.xml index 69fce2ac7e63c..d6bb7e39bc34e 100644 --- a/pulsar-zookeeper/pom.xml +++ b/pulsar-zookeeper/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/tests/bc_2_0_0/pom.xml b/tests/bc_2_0_0/pom.xml index 6af3fc0b6c595..ed1510f5ee5f2 100644 --- a/tests/bc_2_0_0/pom.xml +++ b/tests/bc_2_0_0/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 bc_2_0_0 diff --git a/tests/bc_2_0_1/pom.xml b/tests/bc_2_0_1/pom.xml index 774d0a60c03ae..bcf58ee92640e 100644 --- a/tests/bc_2_0_1/pom.xml +++ b/tests/bc_2_0_1/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 bc_2_0_1 diff --git a/tests/docker-images/java-test-functions/pom.xml b/tests/docker-images/java-test-functions/pom.xml index 227ec58e81cca..7ac54eb378148 100644 --- a/tests/docker-images/java-test-functions/pom.xml +++ b/tests/docker-images/java-test-functions/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar.tests docker-images - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 org.apache.pulsar.tests diff --git a/tests/docker-images/latest-version-image/pom.xml b/tests/docker-images/latest-version-image/pom.xml index 148bedc668d90..e155460cec5da 100644 --- a/tests/docker-images/latest-version-image/pom.xml +++ b/tests/docker-images/latest-version-image/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar.tests docker-images - 2.4.1-inst1 + 2.4.1-inst2 4.0.0 org.apache.pulsar.tests diff --git a/tests/docker-images/pom.xml b/tests/docker-images/pom.xml index 066f0157b13dc..c3c6241c569fc 100644 --- a/tests/docker-images/pom.xml +++ b/tests/docker-images/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 org.apache.pulsar.tests docker-images diff --git a/tests/integration/pom.xml b/tests/integration/pom.xml index 8f4c6b34d5e8a..3b7e195b51cd5 100644 --- a/tests/integration/pom.xml +++ b/tests/integration/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 integration diff --git a/tests/pom.xml b/tests/pom.xml index ecd17265bc4f5..b508d968a25fb 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 org.apache.pulsar.tests tests-parent diff --git a/tests/pulsar-kafka-compat-client-test/pom.xml b/tests/pulsar-kafka-compat-client-test/pom.xml index 34575a6caa044..ad9cd49c4b07f 100644 --- a/tests/pulsar-kafka-compat-client-test/pom.xml +++ b/tests/pulsar-kafka-compat-client-test/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 pulsar-kafka-compat-client-test diff --git a/tests/pulsar-spark-test/pom.xml b/tests/pulsar-spark-test/pom.xml index 274978dcc18fd..542561b687e5d 100644 --- a/tests/pulsar-spark-test/pom.xml +++ b/tests/pulsar-spark-test/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 pulsar-spark-test diff --git a/tests/pulsar-storm-test/pom.xml b/tests/pulsar-storm-test/pom.xml index 077c86b4fc851..83172542ccd92 100644 --- a/tests/pulsar-storm-test/pom.xml +++ b/tests/pulsar-storm-test/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst1 + 2.4.1-inst2 pulsar-storm-test diff --git a/tiered-storage/jcloud/pom.xml b/tiered-storage/jcloud/pom.xml index 3f4bf2e561fd8..f0ee869aa08fc 100644 --- a/tiered-storage/jcloud/pom.xml +++ b/tiered-storage/jcloud/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar tiered-storage-parent - 2.4.1-inst1 + 2.4.1-inst2 .. diff --git a/tiered-storage/pom.xml b/tiered-storage/pom.xml index d4a7c2b10af7a..7108b24e81e11 100644 --- a/tiered-storage/pom.xml +++ b/tiered-storage/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst1 + 2.4.1-inst2 .. From 51a4484332554f55c40421136719ed5ae0937c58 Mon Sep 17 00:00:00 2001 From: Addison Higham Date: Sat, 5 Oct 2019 17:03:33 -0600 Subject: [PATCH 3/5] [functions] BACKPORT Allow functions to pass runtime specific options This commit adds a new argument for functions, customRuntimeOptions, which is passed to funcions (as well as sources/sinks) that enables the ability to customize the runtime. This is added primarily to support the `KubernetesManifestCustomizer` interface. This interface has a default implementation, which allows for changing the namespace, labels, and annotations per function. This interface is also pluggable, allowing for more customizable implementations. For example, the functions for a given tenant could be mapped to different pools of compute for isolation. --- .../apache/pulsar/admin/cli/CmdFunctions.java | 8 +- .../org/apache/pulsar/admin/cli/CmdSinks.java | 6 + .../apache/pulsar/admin/cli/CmdSources.java | 5 + .../common/functions/FunctionConfig.java | 4 + .../apache/pulsar/common/io/SinkConfig.java | 4 + .../apache/pulsar/common/io/SourceConfig.java | 4 + .../proto/src/main/proto/Function.proto | 1 + .../KubernetesSecretsTokenAuthProvider.java | 2 - .../DefaultKubernetesManifestCustomizer.java | 80 +++++++ .../runtime/KubernetesManifestCustomizer.java | 41 ++++ .../functions/runtime/KubernetesRuntime.java | 24 ++- .../runtime/KubernetesRuntimeFactory.java | 42 +++- .../runtime/ProcessRuntimeFactory.java | 2 +- .../functions/runtime/RuntimeFactory.java | 2 +- .../runtime/KubernetesRuntimeFactoryTest.java | 52 +++-- .../runtime/KubernetesRuntimeTest.java | 146 ++++++++++--- ...estKubernetesCustomManifestCustomizer.java | 19 ++ .../functions/utils/FunctionConfigUtils.java | 11 + .../functions/utils/SinkConfigUtils.java | 11 + .../functions/utils/SourceConfigUtils.java | 16 +- .../functions/worker/FunctionActioner.java | 3 +- .../worker/FunctionRuntimeManager.java | 10 +- .../pulsar/functions/worker/WorkerConfig.java | 18 +- .../worker/rest/api/FunctionsImpl.java | 4 +- .../functions/worker/rest/api/SinksImpl.java | 4 +- .../worker/rest/api/SourcesImpl.java | 4 +- .../worker/FunctionActionerTest.java | 2 +- site2/docs/functions-cli.md | 197 ++++++++++++++++++ site2/docs/functions-runtime.md | 50 ++++- 29 files changed, 678 insertions(+), 94 deletions(-) create mode 100644 pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/DefaultKubernetesManifestCustomizer.java create mode 100644 pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesManifestCustomizer.java create mode 100644 pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/TestKubernetesCustomManifestCustomizer.java create mode 100644 site2/docs/functions-cli.md diff --git a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java index 93471b2235db8..2500b9ab2c01a 100644 --- a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java +++ b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdFunctions.java @@ -299,7 +299,9 @@ abstract class FunctionDetailsCommand extends BaseCommand { protected Long timeoutMs; @Parameter(names = "--max-message-retries", description = "How many times should we try to process a message before giving up") protected Integer maxMessageRetries; - @Parameter(names = "--dead-letter-topic", description = "The topic where all messages which could not be processed successfully are sent") + @Parameter(names = "--custom-runtime-options", description = "A string that encodes options to customize the runtime, see docs for configured runtime for details") + protected String customRuntimeOptions; + @Parameter(names = "--dead-letter-topic", description = "The topic where messages that are not processed successfully are sent to") protected String deadLetterTopic; protected FunctionConfig functionConfig; protected String userCodeFile; @@ -437,6 +439,10 @@ void processArguments() throws Exception { functionConfig.setTimeoutMs(timeoutMs); } + if (customRuntimeOptions != null) { + functionConfig.setCustomRuntimeOptions(customRuntimeOptions); + } + // window configs WindowConfig windowConfig = functionConfig.getWindowConfig(); if (null != windowLengthCount) { diff --git a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSinks.java b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSinks.java index b6029a998b397..dc984225132b1 100644 --- a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSinks.java +++ b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSinks.java @@ -309,6 +309,8 @@ abstract class SinkDetailsCommand extends BaseCommand { protected Boolean autoAck; @Parameter(names = "--timeout-ms", description = "The message timeout in milliseconds") protected Long timeoutMs; + @Parameter(names = "--custom-runtime-options", description = "A string that encodes options to customize the runtime, see docs for configured runtime for details") + protected String customRuntimeOptions; protected SinkConfig sinkConfig; @@ -437,6 +439,10 @@ void processArguments() throws Exception { sinkConfig.setConfigs(parseConfigs(sinkConfigString)); } + if (customRuntimeOptions != null) { + sinkConfig.setCustomRuntimeOptions(customRuntimeOptions); + } + // check if configs are valid validateSinkConfigs(sinkConfig); } diff --git a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSources.java b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSources.java index 535bb332f39d3..97b2133743f8b 100644 --- a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSources.java +++ b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSources.java @@ -298,6 +298,8 @@ abstract class SourceDetailsCommand extends BaseCommand { protected String DEPRECATED_sourceConfigString; @Parameter(names = "--source-config", description = "Source config key/values") protected String sourceConfigString; + @Parameter(names = "--custom-runtime-options", description = "A string that encodes options to customize the runtime, see docs for configured runtime for details") + protected String customRuntimeOptions; protected SourceConfig sourceConfig; @@ -391,6 +393,9 @@ void processArguments() throws Exception { sourceConfig.setConfigs(parseConfigs(sourceConfigString)); } + if (customRuntimeOptions != null) { + sourceConfig.setCustomRuntimeOptions(customRuntimeOptions); + } // check if source configs are valid validateSourceConfigs(sourceConfig); } diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java b/pulsar-common/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java index 168643435cd0d..ed5f3c1dd5008 100644 --- a/pulsar-common/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/common/functions/FunctionConfig.java @@ -101,4 +101,8 @@ public enum Runtime { private String go; // Whether the subscriptions the functions created/used should be deleted when the functions is deleted private Boolean cleanupSubscription; + // This is an arbitrary string that can be interpreted by the function runtime + // to change behavior at runtime. Currently, this primarily used by the KubernetesManifestCustomizer + // interface + private String customRuntimeOptions; } diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/io/SinkConfig.java b/pulsar-common/src/main/java/org/apache/pulsar/common/io/SinkConfig.java index 6e51cbb39c86b..a14067c30ea10 100644 --- a/pulsar-common/src/main/java/org/apache/pulsar/common/io/SinkConfig.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/common/io/SinkConfig.java @@ -72,4 +72,8 @@ public class SinkConfig { // Any flags that you want to pass to the runtime. private String runtimeFlags; + // This is an arbitrary string that can be interpreted by the function runtime + // to change behavior at runtime. Currently, this primarily used by the KubernetesManifestCustomizer + // interface + private String customRuntimeOptions; } diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/io/SourceConfig.java b/pulsar-common/src/main/java/org/apache/pulsar/common/io/SourceConfig.java index 7d557c91182c6..bd5045100db9a 100644 --- a/pulsar-common/src/main/java/org/apache/pulsar/common/io/SourceConfig.java +++ b/pulsar-common/src/main/java/org/apache/pulsar/common/io/SourceConfig.java @@ -58,4 +58,8 @@ public class SourceConfig { private String archive; // Any flags that you want to pass to the runtime. private String runtimeFlags; + // This is an arbitrary string that can be interpreted by the function runtime + // to change behavior at runtime. Currently, this primarily used by the KubernetesManifestCustomizer + // interface + private String customRuntimeOptions; } diff --git a/pulsar-functions/proto/src/main/proto/Function.proto b/pulsar-functions/proto/src/main/proto/Function.proto index 34b6c90b7c144..3c41a77efe73d 100644 --- a/pulsar-functions/proto/src/main/proto/Function.proto +++ b/pulsar-functions/proto/src/main/proto/Function.proto @@ -75,6 +75,7 @@ message FunctionDetails { RetryDetails retryDetails = 15; string runtimeFlags = 17; ComponentType componentType = 18; + string customRuntimeOptions = 19; } message ConsumerSpec { diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java index 82e226ce22aa2..f228378417962 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java @@ -31,7 +31,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.apache.pulsar.broker.authentication.AuthenticationDataSource; -import org.apache.pulsar.client.api.PulsarClientException; import org.apache.pulsar.client.impl.auth.AuthenticationToken; import org.apache.pulsar.functions.instance.AuthenticationConfig; import org.apache.pulsar.functions.utils.Actions; @@ -56,7 +55,6 @@ public class KubernetesSecretsTokenAuthProvider implements KubernetesFunctionAut private static final String DEFAULT_SECRET_MOUNT_DIR = "/etc/auth"; private static final String FUNCTION_AUTH_TOKEN = "token"; - private final CoreV1Api coreClient; private final String kubeNamespace; diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/DefaultKubernetesManifestCustomizer.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/DefaultKubernetesManifestCustomizer.java new file mode 100644 index 0000000000000..d94784fba30ab --- /dev/null +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/DefaultKubernetesManifestCustomizer.java @@ -0,0 +1,80 @@ +package org.apache.pulsar.functions.runtime; + +import io.kubernetes.client.models.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import com.google.gson.Gson; +import org.apache.commons.lang3.StringUtils; +import org.apache.pulsar.functions.proto.Function; + +import java.util.List; +import java.util.Map; + +public class DefaultKubernetesManifestCustomizer implements KubernetesManifestCustomizer { + + @Getter + @Setter + @NoArgsConstructor + static private class RuntimeOpts { + private String jobNamespace; + private Map extraLabels; + private Map extraAnnotations; + private Map nodeSelectorLabels; + private List tolerations; + } + + private RuntimeOpts opts; + + @Override + public void init(Function.FunctionDetails funcDetails, String staticConfig) { + String customRuntimeOptions = funcDetails.getCustomRuntimeOptions(); + this.opts = new Gson().fromJson(customRuntimeOptions, RuntimeOpts.class); + // ensure that we always have at least the default + if (this.opts == null) { + this.opts = new RuntimeOpts(); + } + } + + @Override + public String customizeNamespace(String currentNamespace) { + if (!StringUtils.isEmpty(this.opts.getJobNamespace())) { + return this.opts.getJobNamespace(); + } else { + return currentNamespace; + } + } + + @Override + public V1Service customizeService(V1Service service) { + service.setMetadata(updateMeta(service.getMetadata())); + return service; + } + + @Override + public V1StatefulSet customizeStatefulSet(V1StatefulSet statefulSet) { + statefulSet.setMetadata(updateMeta(statefulSet.getMetadata())); + V1PodTemplateSpec pt = statefulSet.getSpec().getTemplate(); + pt.setMetadata(updateMeta(pt.getMetadata())); + V1PodSpec ps = pt.getSpec(); + if (this.opts.getNodeSelectorLabels() != null && this.opts.getNodeSelectorLabels().size() > 0) { + this.opts.getNodeSelectorLabels().forEach(ps::putNodeSelectorItem); + } + if (this.opts.getTolerations() != null && this.opts.getTolerations().size() > 0) { + this.opts.getTolerations().forEach(ps::addTolerationsItem); + } + return statefulSet; + } + + private V1ObjectMeta updateMeta(V1ObjectMeta meta) { + if (this.opts.getExtraAnnotations() != null && this.opts.getExtraAnnotations().size() > 0) { + this.opts.getExtraAnnotations().forEach(meta::putAnnotationsItem); + } + if (this.opts.getExtraLabels() != null && this.opts.getExtraLabels().size() > 0) { + this.opts.getExtraLabels().forEach(meta::putLabelsItem); + } + return meta; + } + +} diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesManifestCustomizer.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesManifestCustomizer.java new file mode 100644 index 0000000000000..bda0c25192dce --- /dev/null +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesManifestCustomizer.java @@ -0,0 +1,41 @@ +/** + * 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.functions.runtime; + +import io.kubernetes.client.models.V1Service; +import io.kubernetes.client.models.V1StatefulSet; +import org.apache.pulsar.functions.proto.Function; + +public interface KubernetesManifestCustomizer { + + default void init(Function.FunctionDetails funcDetails, String staticConfig) { + } + + default V1StatefulSet customizeStatefulSet(V1StatefulSet statefulSet) { + return statefulSet; + } + + default V1Service customizeService(V1Service service) { + return service; + } + + default String customizeNamespace(String currentNamespace) { + return currentNamespace; + } +} diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntime.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntime.java index 2b2c84eaea4c6..ca223e4527f76 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntime.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntime.java @@ -137,6 +137,7 @@ public class KubernetesRuntime implements Runtime { private int percentMemoryPadding; private final KubernetesFunctionAuthProvider functionAuthDataCacheProvider; private final AuthenticationConfig authConfig; + private final KubernetesManifestCustomizer manifestCustomizer; KubernetesRuntime(AppsV1Api appsClient, CoreV1Api coreClient, @@ -162,7 +163,8 @@ public class KubernetesRuntime implements Runtime { Integer expectedMetricsCollectionInterval, int percentMemoryPadding, KubernetesFunctionAuthProvider functionAuthDataCacheProvider, - boolean authenticationEnabled) throws Exception { + boolean authenticationEnabled, + KubernetesManifestCustomizer manifestCustomizer) throws Exception { this.appsClient = appsClient; this.coreClient = coreClient; this.instanceConfig = instanceConfig; @@ -177,6 +179,7 @@ public class KubernetesRuntime implements Runtime { this.secretsProviderConfigurator = secretsProviderConfigurator; this.percentMemoryPadding = percentMemoryPadding; this.authenticationEnabled = authenticationEnabled; + this.manifestCustomizer = manifestCustomizer; String logConfigFile = null; String secretsProviderClassName = secretsProviderConfigurator.getSecretsProviderClassName(instanceConfig.getFunctionDetails()); String secretsProviderConfig = null; @@ -424,7 +427,8 @@ private void submitService() throws Exception { } } - private V1Service createService() { + @VisibleForTesting + V1Service createService() { final String jobName = createJobName(instanceConfig.getFunctionDetails()); final V1Service service = new V1Service(); @@ -433,6 +437,8 @@ private V1Service createService() { final V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.name(jobName); objectMeta.setLabels(getLabels(instanceConfig.getFunctionDetails())); + // we don't technically need to set this, but it is useful for testing + objectMeta.setNamespace(jobNamespace); service.metadata(objectMeta); // create the stateful set spec @@ -448,7 +454,11 @@ private V1Service createService() { service.spec(serviceSpec); - return service; + // let the customizer run but ensure it doesn't change the name so we can find it again + final V1Service overridden = manifestCustomizer.customizeService(service); + overridden.getMetadata().name(jobName); + + return overridden; } private void submitStatefulSet() throws Exception { @@ -818,7 +828,8 @@ private static String setShardIdEnvironmentVariableCommand() { return String.format("%s=${POD_NAME##*-} && echo shardId=${%s}", ENV_SHARD_ID, ENV_SHARD_ID); } - private V1StatefulSet createStatefulSet() { + @VisibleForTesting + V1StatefulSet createStatefulSet() { final String jobName = createJobName(instanceConfig.getFunctionDetails()); final V1StatefulSet statefulSet = new V1StatefulSet(); @@ -827,6 +838,8 @@ private V1StatefulSet createStatefulSet() { final V1ObjectMeta objectMeta = new V1ObjectMeta(); objectMeta.name(jobName); objectMeta.setLabels(getLabels(instanceConfig.getFunctionDetails())); + // we don't technically need to set this, but it is useful for testing + objectMeta.setNamespace(jobNamespace); statefulSet.metadata(objectMeta); // create the stateful set spec @@ -860,6 +873,9 @@ private V1StatefulSet createStatefulSet() { statefulSet.spec(statefulSetSpec); + // let the customizer run but ensure it doesn't change the name so we can find it again + final V1StatefulSet overridden = manifestCustomizer.customizeStatefulSet(statefulSet); + overridden.getMetadata().name(jobName); return statefulSet; } diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java index fe00d18645101..6802ecebad987 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java @@ -40,6 +40,7 @@ import org.apache.pulsar.functions.instance.InstanceConfig; import org.apache.pulsar.functions.proto.Function; import org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator; +import org.apache.pulsar.functions.utils.Reflections; import java.lang.reflect.Field; import java.util.Map; @@ -89,6 +90,8 @@ class KubernetesInfo { private final String extraDependenciesDir; private final SecretsProviderConfigurator secretsProviderConfigurator; private final String logDirectory = "logs/functions"; + private final String manifestCustomizerClassName; + private final String manifestCustomizerStaticConfig; private Timer changeConfigMapTimer; private AppsV1Api appsClient; private CoreV1Api coreClient; @@ -117,7 +120,9 @@ public KubernetesRuntimeFactory(String k8Uri, String changeConfigMapNamespace, Resources functionInstanceMinResources, SecretsProviderConfigurator secretsProviderConfigurator, - boolean authenticationEnabled) { + boolean authenticationEnabled, + String manifestCustomizerClassName, + String manifestCustomizerStaticConfig) { this.kubernetesInfo = new KubernetesInfo(); this.kubernetesInfo.setK8Uri(k8Uri); if (!isEmpty(jobNamespace)) { @@ -169,6 +174,8 @@ public KubernetesRuntimeFactory(String k8Uri, this.secretsProviderConfigurator = secretsProviderConfigurator; this.functionInstanceMinResources = functionInstanceMinResources; this.authenticationEnabled = authenticationEnabled; + this.manifestCustomizerClassName = manifestCustomizerClassName; + this.manifestCustomizerStaticConfig = manifestCustomizerStaticConfig; try { setupClient(); } catch (Exception e) { @@ -200,16 +207,20 @@ public KubernetesRuntime createContainer(InstanceConfig instanceConfig, String c throw new RuntimeException("Unsupported Runtime " + instanceConfig.getFunctionDetails().getRuntime()); } + KubernetesFunctionAuthProvider authProvider = getAuthProvider(instanceConfig.getFunctionDetails()); // adjust the auth config to support auth if (authenticationEnabled) { - getAuthProvider().configureAuthenticationConfig(authConfig, + authProvider.configureAuthenticationConfig(authConfig, Optional.ofNullable(getFunctionAuthData(Optional.ofNullable(instanceConfig.getFunctionAuthenticationSpec())))); } + KubernetesManifestCustomizer manifestCustomizer = buildManifestCustomizer(instanceConfig.getFunctionDetails()); + return new KubernetesRuntime( appsClient, coreClient, - this.kubernetesInfo.getJobNamespace(), + // get the namespace for this function + manifestCustomizer.customizeNamespace(this.kubernetesInfo.getJobNamespace()), customLabels, installUserCodeDependencies, this.kubernetesInfo.getPythonDependencyRepository(), @@ -230,8 +241,9 @@ public KubernetesRuntime createContainer(InstanceConfig instanceConfig, String c secretsProviderConfigurator, expectedMetricsCollectionInterval, this.kubernetesInfo.getPercentMemoryPadding(), - getAuthProvider(), - authenticationEnabled); + authProvider, + authenticationEnabled, + manifestCustomizer); } @Override @@ -242,7 +254,8 @@ public void close() { public void doAdmissionChecks(Function.FunctionDetails functionDetails) { KubernetesRuntime.doChecks(functionDetails); validateMinResourcesRequired(functionDetails); - secretsProviderConfigurator.doAdmissionChecks(appsClient, coreClient, kubernetesInfo.getJobNamespace(), functionDetails); + KubernetesManifestCustomizer manifestCustomizer = buildManifestCustomizer(functionDetails); + secretsProviderConfigurator.doAdmissionChecks(appsClient, coreClient, manifestCustomizer.customizeNamespace(kubernetesInfo.getJobNamespace()), functionDetails); } @VisibleForTesting @@ -332,8 +345,21 @@ void validateMinResourcesRequired(Function.FunctionDetails functionDetails) { } } + KubernetesManifestCustomizer buildManifestCustomizer(Function.FunctionDetails funcDetails) { + + KubernetesManifestCustomizer manifestCustomizer; + if (!isEmpty(manifestCustomizerClassName)) { + manifestCustomizer = (KubernetesManifestCustomizer) Reflections.createInstance(manifestCustomizerClassName, ClassLoader.getSystemClassLoader()); + } else { + manifestCustomizer = new DefaultKubernetesManifestCustomizer(); + } + manifestCustomizer.init(funcDetails, manifestCustomizerStaticConfig); + return manifestCustomizer; + } + @Override - public KubernetesFunctionAuthProvider getAuthProvider() { - return new KubernetesSecretsTokenAuthProvider(coreClient, kubernetesInfo.jobNamespace); + public KubernetesFunctionAuthProvider getAuthProvider(Function.FunctionDetails funcDetails) { + KubernetesManifestCustomizer manifestCustomizer = buildManifestCustomizer(funcDetails); + return new KubernetesSecretsTokenAuthProvider(coreClient, manifestCustomizer.customizeNamespace(kubernetesInfo.jobNamespace)); } } diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/ProcessRuntimeFactory.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/ProcessRuntimeFactory.java index b3e4311e310dd..d93cbde2f3c78 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/ProcessRuntimeFactory.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/ProcessRuntimeFactory.java @@ -136,7 +136,7 @@ public ProcessRuntime createContainer(InstanceConfig instanceConfig, String code // configure auth if necessary if (authenticationEnabled) { - getAuthProvider().configureAuthenticationConfig(authConfig, + getAuthProvider(instanceConfig.getFunctionDetails()).configureAuthenticationConfig(authConfig, Optional.ofNullable(getFunctionAuthData(Optional.ofNullable(instanceConfig.getFunctionAuthenticationSpec())))); } diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/RuntimeFactory.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/RuntimeFactory.java index 4384f00856062..c86c663b4fa98 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/RuntimeFactory.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/RuntimeFactory.java @@ -45,7 +45,7 @@ Runtime createContainer( default void doAdmissionChecks(Function.FunctionDetails functionDetails) { } - default FunctionAuthProvider getAuthProvider() throws IllegalAccessException, InstantiationException { + default FunctionAuthProvider getAuthProvider(Function.FunctionDetails funcDetails) throws IllegalAccessException, InstantiationException { return NoOpFunctionAuthProvider.class.newInstance(); } diff --git a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java index 5ea75fa296fe1..a2173fbd47c45 100644 --- a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java +++ b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java @@ -59,10 +59,12 @@ public String getSecretsProviderClassName(FunctionDetails functionDetails) { if (!StringUtils.isEmpty(functionDetails.getSecretsMap())) { if (functionDetails.getRuntime() == FunctionDetails.Runtime.JAVA) { return ClearTextSecretsProvider.class.getName(); - } else { + } + else { return "secretsprovider.ClearTextSecretsProvider"; } - } else { + } + else { return null; } } @@ -125,27 +127,30 @@ public void tearDown() { KubernetesRuntimeFactory createKubernetesRuntimeFactory(String extraDepsDir, Resources minResources) throws Exception { KubernetesRuntimeFactory factory = spy(new KubernetesRuntimeFactory( - null, - null, - null, - null, - pulsarRootDir, - false, - true, - "myrepo", - "anotherrepo", - extraDepsDir, - null, + null, + null, + null, + null, + pulsarRootDir, + false, + true, + "myrepo", + "anotherrepo", + extraDepsDir, + null, 0, pulsarServiceUrl, - pulsarAdminUrl, - stateStorageServiceUrl, - null, - null, - null, - null, + pulsarAdminUrl, + stateStorageServiceUrl, + null, + null, + null, + null, minResources, - new TestSecretProviderConfigurator(), false)); + new TestSecretProviderConfigurator(), + false, + "", + "")); doNothing().when(factory).setupClient(); return factory; } @@ -182,8 +187,8 @@ public void testValidateMinResourcesRequired() throws Exception { testMinResource(0.2, 2048L, false, null); testMinResource(0.05, 2048L, true, "Per instance CPU requested, 0.05, for function is less than the minimum required, 0.1"); - testMinResource(0.2,512L, true, "Per instance RAM requested, 512, for function is less than the minimum required, 1024"); - testMinResource(0.05,512L, true, "Per instance CPU requested, 0.05, for function is less than the minimum required, 0.1"); + testMinResource(0.2, 512L, true, "Per instance RAM requested, 512, for function is less than the minimum required, 1024"); + testMinResource(0.05, 512L, true, "Per instance CPU requested, 0.05, for function is less than the minimum required, 0.1"); testMinResource(null, null, true, "Per instance CPU requested, 0.0, for function is less than the minimum required, 0.1"); testMinResource(0.2, null, true, "Per instance RAM requested, 0, for function is less than the minimum required, 1024"); @@ -207,7 +212,8 @@ private void testMinResource(Double cpu, Long ram, boolean fail, String failErro FunctionDetails functionDetails; if (ram != null || cpu != null) { functionDetails = FunctionDetails.newBuilder(functionDetailsBase).setResources(resources).build(); - } else { + } + else { functionDetails = FunctionDetails.newBuilder(functionDetailsBase).build(); } diff --git a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java index 12390dcaf1481..63dd4dd60fc2e 100644 --- a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java +++ b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java @@ -6,9 +6,9 @@ * 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 - * + *

+ * 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 @@ -19,11 +19,12 @@ package org.apache.pulsar.functions.runtime; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import com.google.protobuf.util.JsonFormat; import io.kubernetes.client.apis.AppsV1Api; import io.kubernetes.client.apis.CoreV1Api; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1PodSpec; +import io.kubernetes.client.models.*; import org.apache.commons.lang.StringUtils; import org.apache.pulsar.functions.instance.InstanceConfig; import org.apache.pulsar.functions.proto.Function; @@ -80,10 +81,12 @@ public String getSecretsProviderClassName(FunctionDetails functionDetails) { if (!StringUtils.isEmpty(functionDetails.getSecretsMap())) { if (functionDetails.getRuntime() == FunctionDetails.Runtime.JAVA) { return ClearTextSecretsProvider.class.getName(); - } else { + } + else { return "secretsprovider.ClearTextSecretsProvider"; } - } else { + } + else { return null; } } @@ -149,33 +152,45 @@ public void tearDown() { } } - KubernetesRuntimeFactory createKubernetesRuntimeFactory(String extraDepsDir, int percentMemoryPadding) throws Exception { + KubernetesRuntimeFactory createKubernetesRuntimeFactory(String extraDepsDir, int percentMemoryPadding, String manifestCustomizerClassName) throws Exception { KubernetesRuntimeFactory factory = spy(new KubernetesRuntimeFactory( - null, - null, - null, - null, - pulsarRootDir, - false, - true, - "myrepo", - "anotherrepo", - extraDepsDir, - null, + null, + null, + null, + null, + pulsarRootDir, + false, + true, + "myrepo", + "anotherrepo", + extraDepsDir, + null, percentMemoryPadding, pulsarServiceUrl, - pulsarAdminUrl, - stateStorageServiceUrl, - null, - null, - null, - null, - null, new TestSecretProviderConfigurator(), false)); + pulsarAdminUrl, + stateStorageServiceUrl, + null, + null, + null, + null, + null, + new TestSecretProviderConfigurator(), + false, + manifestCustomizerClassName, + "")); doNothing().when(factory).setupClient(); return factory; + + } + KubernetesRuntimeFactory createKubernetesRuntimeFactory(String extraDepsDir, int percentMemoryPadding) throws Exception { + return createKubernetesRuntimeFactory(extraDepsDir, percentMemoryPadding, null); } FunctionDetails createFunctionDetails(FunctionDetails.Runtime runtime, boolean addSecrets) { + return createFunctionDetails(runtime, addSecrets, (fb) -> fb); + } + + FunctionDetails createFunctionDetails(FunctionDetails.Runtime runtime, boolean addSecrets, java.util.function.Function customize) { FunctionDetails.Builder functionDetailsBuilder = FunctionDetails.newBuilder(); functionDetailsBuilder.setRuntime(runtime); functionDetailsBuilder.setTenant(TEST_TENANT); @@ -198,7 +213,7 @@ FunctionDetails createFunctionDetails(FunctionDetails.Runtime runtime, boolean a functionDetailsBuilder.setSecretsMap("SomeMap"); } functionDetailsBuilder.setResources(RESOURCES); - return functionDetailsBuilder.build(); + return customize.apply(functionDetailsBuilder).build(); } InstanceConfig createJavaInstanceConfig(FunctionDetails.Runtime runtime, boolean addSecrets) { @@ -235,7 +250,6 @@ private void verifyRamPadding(int percentMemoryPadding, long ram, long expectedR } - @Test public void testJavaConstructor() throws Exception { InstanceConfig config = createJavaInstanceConfig(FunctionDetails.Runtime.JAVA, false); @@ -281,7 +295,8 @@ private void verifyJavaInstance(InstanceConfig config, String depsDir, boolean s totalArgs = 35; portArg = 26; metricsPortArg = 28; - } else { + } + else { extraDepsEnv = ""; portArg = 25; metricsPortArg = 27; @@ -292,7 +307,7 @@ private void verifyJavaInstance(InstanceConfig config, String depsDir, boolean s } assertEquals(args.size(), totalArgs, - "Actual args : " + StringUtils.join(args, " ")); + "Actual args : " + StringUtils.join(args, " ")); String expectedArgs = "exec java -cp " + classpath + extraDepsEnv @@ -364,7 +379,8 @@ private void verifyPythonInstance(InstanceConfig config, String extraDepsDir, bo configArg = 10; pythonPath = ""; metricsPortArg = 32; - } else { + } + else { totalArgs = 40; portArg = 31; configArg = 11; @@ -376,7 +392,7 @@ private void verifyPythonInstance(InstanceConfig config, String extraDepsDir, bo } assertEquals(args.size(), totalArgs, - "Actual args : " + StringUtils.join(args, " ")); + "Actual args : " + StringUtils.join(args, " ")); String expectedArgs = pythonPath + "exec python " + pythonInstanceFile + " --py " + pulsarRootDir + "/" + userJarFile + " --logging_directory " + logDirectory @@ -410,4 +426,70 @@ private void verifyPythonInstance(InstanceConfig config, String extraDepsDir, bo assertEquals(containerSpec.getResources().getLimits().get("cpu").getNumber().doubleValue(), RESOURCES.getCpu()); } + @Test + public void testDefaultKubernetesManifestCustomizer() throws Exception { + InstanceConfig config = createJavaInstanceConfig(FunctionDetails.Runtime.JAVA, false); + config.setFunctionDetails(createFunctionDetails(FunctionDetails.Runtime.JAVA, false, (fb) -> { + JsonObject configObj = new JsonObject(); + configObj.addProperty("jobNamespace", "custom-ns"); + + JsonObject extraAnn = new JsonObject(); + extraAnn.addProperty("annotation", "test"); + configObj.add("extraAnnotations", extraAnn); + + JsonObject extraLabel = new JsonObject(); + extraLabel.addProperty("label", "test"); + configObj.add("extraLabels", extraLabel); + + JsonObject nodeLabels = new JsonObject(); + nodeLabels.addProperty("selector", "test"); + configObj.add("nodeSelectorLabels", nodeLabels); + + JsonArray tolerations = new JsonArray(); + JsonObject toleration = new JsonObject(); + toleration.addProperty("key", "test"); + toleration.addProperty("value", "test"); + toleration.addProperty("effect", "test"); + tolerations.add(toleration); + configObj.add("tolerations", tolerations); + + return fb.setCustomRuntimeOptions(configObj.toString()); + })); + + factory = createKubernetesRuntimeFactory(null, 10); + + verifyJavaInstance(config, pulsarRootDir + "/instances/deps", false); + KubernetesRuntime container = factory.createContainer(config, userJarFile, userJarFile, 30l); + V1StatefulSet spec = container.createStatefulSet(); + assertEquals(spec.getMetadata().getAnnotations().get("annotation"), "test"); + assertEquals(spec.getMetadata().getLabels().get("label"), "test"); + assertEquals(spec.getSpec().getTemplate().getSpec().getNodeSelector().get("selector"), "test"); + List tols = spec.getSpec().getTemplate().getSpec().getTolerations(); + // we add three by default, plus our custom + assertEquals(tols.size(), 4); + assertEquals(tols.get(3).getKey(), "test"); + assertEquals(tols.get(3).getValue(), "test"); + assertEquals(tols.get(3).getEffect(), "test"); + + V1Service serviceSpec = container.createService(); + assertEquals(serviceSpec.getMetadata().getNamespace(), "custom-ns"); + assertEquals(serviceSpec.getMetadata().getAnnotations().get("annotation"), "test"); + assertEquals(serviceSpec.getMetadata().getLabels().get("label"), "test"); + + } + + @Test + public void testCustomKubernetesManifestCustomizer() throws Exception { + InstanceConfig config = createJavaInstanceConfig(FunctionDetails.Runtime.JAVA, false); + config.setFunctionDetails(createFunctionDetails(FunctionDetails.Runtime.JAVA, false, (fb) -> { + return fb.setCustomRuntimeOptions("custom-service-account"); + })); + + factory = createKubernetesRuntimeFactory(null, 10, TestKubernetesCustomManifestCustomizer.class.getCanonicalName()); + + verifyJavaInstance(config, pulsarRootDir + "/instances/deps", false); + KubernetesRuntime container = factory.createContainer(config, userJarFile, userJarFile, 30l); + V1StatefulSet spec = container.createStatefulSet(); + assertEquals(spec.getSpec().getTemplate().getSpec().getServiceAccountName(), "my-service-account"); + } } diff --git a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/TestKubernetesCustomManifestCustomizer.java b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/TestKubernetesCustomManifestCustomizer.java new file mode 100644 index 0000000000000..904ae9e63e83b --- /dev/null +++ b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/TestKubernetesCustomManifestCustomizer.java @@ -0,0 +1,19 @@ +package org.apache.pulsar.functions.runtime; + +import io.kubernetes.client.models.V1StatefulSet; +import org.apache.pulsar.functions.proto.Function; + +import static org.testng.Assert.assertEquals; + +class TestKubernetesCustomManifestCustomizer implements KubernetesManifestCustomizer { + @Override + public void init(Function.FunctionDetails funcDetails, String staticConfig) { + assertEquals(funcDetails.getCustomRuntimeOptions(), "custom-service-account"); + } + + @Override + public V1StatefulSet customizeStatefulSet(V1StatefulSet statefulSet) { + statefulSet.getSpec().getTemplate().getSpec().serviceAccountName("my-service-account"); + return statefulSet; + } +} diff --git a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java index 43e034682a57f..43ea0daa3f15a 100644 --- a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java +++ b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionConfigUtils.java @@ -234,6 +234,10 @@ public static FunctionDetails convert(FunctionConfig functionConfig, ClassLoader functionDetailsBuilder.setComponentType(FunctionDetails.ComponentType.FUNCTION); + if (!StringUtils.isEmpty(functionConfig.getCustomRuntimeOptions())) { + functionDetailsBuilder.setCustomRuntimeOptions(functionConfig.getCustomRuntimeOptions()); + } + return functionDetailsBuilder.build(); } @@ -334,6 +338,10 @@ public static FunctionConfig convertFromDetails(FunctionDetails functionDetails) functionConfig.setRuntimeFlags(functionDetails.getRuntimeFlags()); } + if (!isEmpty(functionDetails.getCustomRuntimeOptions())) { + functionConfig.setCustomRuntimeOptions(functionDetails.getCustomRuntimeOptions()); + } + return functionConfig; } @@ -775,6 +783,9 @@ public static FunctionConfig validateUpdate(FunctionConfig existingConfig, Funct if (!StringUtils.isEmpty(newConfig.getRuntimeFlags())) { mergedConfig.setRuntimeFlags(newConfig.getRuntimeFlags()); } + if (!StringUtils.isEmpty(newConfig.getCustomRuntimeOptions())) { + mergedConfig.setCustomRuntimeOptions(newConfig.getCustomRuntimeOptions()); + } return mergedConfig; } } diff --git a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SinkConfigUtils.java b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SinkConfigUtils.java index f0a39b93ca864..800a55f560348 100644 --- a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SinkConfigUtils.java +++ b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SinkConfigUtils.java @@ -209,6 +209,10 @@ public static FunctionDetails convert(SinkConfig sinkConfig, ExtractedSinkDetail functionDetailsBuilder.setComponentType(FunctionDetails.ComponentType.SINK); + if (!StringUtils.isEmpty(sinkConfig.getCustomRuntimeOptions())) { + functionDetailsBuilder.setCustomRuntimeOptions(sinkConfig.getCustomRuntimeOptions()); + } + return functionDetailsBuilder.build(); } @@ -283,6 +287,10 @@ public static SinkConfig convertFromDetails(FunctionDetails functionDetails) { sinkConfig.setRuntimeFlags(functionDetails.getRuntimeFlags()); } + if (!isEmpty(functionDetails.getCustomRuntimeOptions())) { + sinkConfig.setCustomRuntimeOptions(functionDetails.getCustomRuntimeOptions()); + } + return sinkConfig; } @@ -560,6 +568,9 @@ public static SinkConfig validateUpdate(SinkConfig existingConfig, SinkConfig ne if (!StringUtils.isEmpty(newConfig.getRuntimeFlags())) { mergedConfig.setRuntimeFlags(newConfig.getRuntimeFlags()); } + if (!StringUtils.isEmpty(newConfig.getCustomRuntimeOptions())) { + mergedConfig.setCustomRuntimeOptions(newConfig.getCustomRuntimeOptions()); + } return mergedConfig; } } \ No newline at end of file diff --git a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SourceConfigUtils.java b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SourceConfigUtils.java index 149204cf5dc67..0c51b60cbfb34 100644 --- a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SourceConfigUtils.java +++ b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SourceConfigUtils.java @@ -144,6 +144,10 @@ public static FunctionDetails convert(SourceConfig sourceConfig, ExtractedSource functionDetailsBuilder.setComponentType(FunctionDetails.ComponentType.SOURCE); + if (!StringUtils.isEmpty(sourceConfig.getCustomRuntimeOptions())) { + functionDetailsBuilder.setCustomRuntimeOptions(sourceConfig.getCustomRuntimeOptions()); + } + return functionDetailsBuilder.build(); } @@ -194,9 +198,14 @@ public static SourceConfig convertFromDetails(FunctionDetails functionDetails) { sourceConfig.setResources(resources); } - if (!org.apache.commons.lang3.StringUtils.isEmpty(functionDetails.getRuntimeFlags())) { - sourceConfig .setRuntimeFlags(functionDetails.getRuntimeFlags()); + if (!isEmpty(functionDetails.getRuntimeFlags())) { + sourceConfig.setRuntimeFlags(functionDetails.getRuntimeFlags()); + } + + if (!isEmpty(functionDetails.getCustomRuntimeOptions())) { + sourceConfig.setCustomRuntimeOptions(functionDetails.getCustomRuntimeOptions()); } + return sourceConfig; } @@ -371,6 +380,9 @@ public static SourceConfig validateUpdate(SourceConfig existingConfig, SourceCon if (!StringUtils.isEmpty(newConfig.getRuntimeFlags())) { mergedConfig.setRuntimeFlags(newConfig.getRuntimeFlags()); } + if (!StringUtils.isEmpty(newConfig.getCustomRuntimeOptions())) { + mergedConfig.setCustomRuntimeOptions(newConfig.getCustomRuntimeOptions()); + } return mergedConfig; } diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionActioner.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionActioner.java index 7262007697f06..8557a7dc669f9 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionActioner.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionActioner.java @@ -290,6 +290,7 @@ public void terminateFunction(FunctionRuntimeInfo functionRuntimeInfo) { FunctionDetails details = functionRuntimeInfo.getFunctionInstance().getFunctionMetaData().getFunctionDetails(); String fqfn = FunctionCommon.getFullyQualifiedName(details); log.info("{}-{} Terminating function...", fqfn,functionRuntimeInfo.getFunctionInstance().getInstanceId()); + FunctionDetails funcDetails = functionRuntimeInfo.getFunctionInstance().getFunctionMetaData().getFunctionDetails(); if (functionRuntimeInfo.getRuntimeSpawner() != null) { functionRuntimeInfo.getRuntimeSpawner().close(); @@ -299,7 +300,7 @@ public void terminateFunction(FunctionRuntimeInfo functionRuntimeInfo) { try { log.info("{}-{} Cleaning up authentication data for function...", fqfn,functionRuntimeInfo.getFunctionInstance().getInstanceId()); functionRuntimeInfo.getRuntimeSpawner() - .getRuntimeFactory().getAuthProvider() + .getRuntimeFactory().getAuthProvider(funcDetails) .cleanUpAuthData( details.getTenant(), details.getNamespace(), details.getName(), Optional.ofNullable(getFunctionAuthData( diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java index 706c5a9ad1ae2..b3757799dd393 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java @@ -34,11 +34,7 @@ import org.apache.pulsar.functions.instance.AuthenticationConfig; import org.apache.pulsar.functions.proto.Function; import org.apache.pulsar.functions.proto.Function.Assignment; -import org.apache.pulsar.functions.runtime.KubernetesRuntimeFactory; -import org.apache.pulsar.functions.runtime.ProcessRuntimeFactory; -import org.apache.pulsar.functions.runtime.RuntimeFactory; -import org.apache.pulsar.functions.runtime.RuntimeSpawner; -import org.apache.pulsar.functions.runtime.ThreadRuntimeFactory; +import org.apache.pulsar.functions.runtime.*; import org.apache.pulsar.functions.secretsprovider.ClearTextSecretsProvider; import org.apache.pulsar.functions.secretsproviderconfigurator.DefaultSecretsProviderConfigurator; import org.apache.pulsar.functions.secretsproviderconfigurator.SecretsProviderConfigurator; @@ -175,7 +171,9 @@ public FunctionRuntimeManager(WorkerConfig workerConfig, WorkerService workerSer workerConfig.getKubernetesContainerFactory().getChangeConfigMapNamespace(), workerConfig.getFunctionInstanceMinResources(), secretsProviderConfigurator, - workerConfig.isAuthenticationEnabled()); + workerConfig.isAuthenticationEnabled(), + workerConfig.getKubernetesContainerFactory().getKubernetesManifestCustomizerClassName(), + workerConfig.getKubernetesContainerFactory().getKubernetesManifestCustomizerConfig()); } else { throw new RuntimeException("Either Thread, Process or Kubernetes Container Factory need to be set"); } diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java index 79a944898bd78..d952b317d48d8 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java @@ -386,8 +386,8 @@ public static class KubernetesContainerFactory { ) private String k8Uri; @FieldContext( - doc = "The Kubernetes namespace to run the function instances. It is `default`," - + " if this setting is left to be empty" + doc = "The default Kubernetes namespace to run the function instances. It is `default`," + + " if this setting is left to be empty. May be overridden by a KubernetesManifestCustomizer." ) private String jobNamespace; @FieldContext( @@ -464,6 +464,20 @@ public static class KubernetesContainerFactory { doc = "Additional memory padding added on top of the memory requested by the function per on a per instance basis" ) private int percentMemoryPadding; + + @FieldContext( + doc = "The full class-name of an instance of KubernetesManifestCustomizer." + + " This class receives the 'customRuntimeOptions string and can customize" + + " the generation of kubernetes manifest files" + ) + private String kubernetesManifestCustomizerClassName; + + @FieldContext( + doc = "Config that can be passed to the KubernetesManifestCustomizer." + + " This config is distinct from the `customRuntimeOptions` provided by functions" + + " as this config is the the same across all functions and is static " + ) + private String kubernetesManifestCustomizerConfig = ""; } @FieldContext( category = CATEGORY_FUNC_RUNTIME_MNG, diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java index d96ed30136741..527352b1e0ead 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/FunctionsImpl.java @@ -191,7 +191,7 @@ public void registerFunction(final String tenant, try { Optional functionAuthData = worker().getFunctionRuntimeManager() .getRuntimeFactory() - .getAuthProvider() + .getAuthProvider(functionDetails) .cacheAuthData(tenant, namespace, functionName, clientAuthenticationDataHttps); if (functionAuthData.isPresent()) { @@ -373,7 +373,7 @@ public void updateFunction(final String tenant, try { Optional newFunctionAuthData = worker().getFunctionRuntimeManager() .getRuntimeFactory() - .getAuthProvider() + .getAuthProvider(functionDetails) .updateAuthData( tenant, namespace, functionName, existingFunctionAuthData, diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java index 659cb660e9ba4..b87f1291811ba 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SinksImpl.java @@ -193,7 +193,7 @@ public void registerSink(final String tenant, try { Optional functionAuthData = worker().getFunctionRuntimeManager() .getRuntimeFactory() - .getAuthProvider() + .getAuthProvider(functionDetails) .cacheAuthData(tenant, namespace, sinkName, clientAuthenticationDataHttps); if (functionAuthData.isPresent()) { @@ -378,7 +378,7 @@ public void updateSink(final String tenant, try { Optional newFunctionAuthData = worker().getFunctionRuntimeManager() .getRuntimeFactory() - .getAuthProvider() + .getAuthProvider(functionDetails) .updateAuthData( tenant, namespace, sinkName, existingFunctionAuthData, diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java index e9cfeb0dc8d39..e6eaffe0070f2 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/rest/api/SourcesImpl.java @@ -193,7 +193,7 @@ public void registerSource(final String tenant, try { Optional functionAuthData = worker().getFunctionRuntimeManager() .getRuntimeFactory() - .getAuthProvider() + .getAuthProvider(functionDetails) .cacheAuthData(tenant, namespace, sourceName, clientAuthenticationDataHttps); if (functionAuthData.isPresent()) { @@ -375,7 +375,7 @@ public void updateSource(final String tenant, try { Optional newFunctionAuthData = worker().getFunctionRuntimeManager() .getRuntimeFactory() - .getAuthProvider() + .getAuthProvider(functionDetails) .updateAuthData( tenant, namespace, sourceName, existingFunctionAuthData, diff --git a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/FunctionActionerTest.java b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/FunctionActionerTest.java index ca21c8b623f89..6cb5d99ef6ffe 100644 --- a/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/FunctionActionerTest.java +++ b/pulsar-functions/worker/src/test/java/org/apache/pulsar/functions/worker/FunctionActionerTest.java @@ -193,7 +193,7 @@ public void testFunctionAuthDisabled() throws Exception { RuntimeFactory runtimeFactory = mock(RuntimeFactory.class); FunctionAuthProvider functionAuthProvider = mock(FunctionAuthProvider.class); - doReturn(functionAuthProvider).when(runtimeFactory).getAuthProvider(); + doReturn(functionAuthProvider).when(runtimeFactory).getAuthProvider(functionMeta.getFunctionDetails()); doReturn(runtimeFactory).when(runtimeSpawner).getRuntimeFactory(); doReturn(instance).when(functionRuntimeInfo).getFunctionInstance(); diff --git a/site2/docs/functions-cli.md b/site2/docs/functions-cli.md new file mode 100644 index 0000000000000..4963890719338 --- /dev/null +++ b/site2/docs/functions-cli.md @@ -0,0 +1,197 @@ +--- +id: functions-cli +title: Pulsar Functions command line tool +sidebar_label: Reference: CLI +--- + +The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, commands, and parameters. + +## localrun + +Run Pulsar Functions locally, rather than deploying it to the Pulsar cluster. + +Name | Description | Default +---|---|--- +auto-ack | Whether or not the framework acknowledges messages automatically. | false | +broker-service-url | The URL for the Pulsar broker. | | +classname | The class name of a Pulsar Function.| | +client-auth-params | Client authentication parameter. | | +client-auth-plugin | Client authentication plugin using which function-process can connect to broker. | | +CPU | The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).| | +custom-schema-inputs | The map of input topics to Schema class names (as a JSON string). | | +custom-serde-inputs | The map of input topics to SerDe class names (as a JSON string). | | +dead-letter-topic | The topic where all messages that were not processed successfully are sent. | | +disk | The disk in bytes that need to be allocated per function instance (applicable only to docker runtime). | | +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +function-config-file | The path to a YAML config file specifying the configuration of a Pulsar Function. | | +go | Path to the main Go executable binary for the function (if the function is written in Go). | | +hostname-verification-enabled | Enable hostname verification. | false +inputs | The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list). | | +jar | Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package. | | +instance-id-offset | Start the instanceIds from this offset. | 0 +log-topic | The topic to which the logs a Pulsar Function are produced. | | +max-message-retries | How many times should we try to process a message before giving up. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +output | The output topic of a Pulsar Function (If none is specified, no output is written). | | +output-serde-classname | The SerDe class to be used for messages output by the function. | | +parallelism | The parallelism factor of a Pulsar Function (i.e. the number of function instances to run). | | +processing-guarantees | The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE]. | ATLEAST_ONCE +py | Path to the main Python file/Python Wheel file for the function (if the function is written in Python). | | +ram | The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime). | | +retain-ordering | Function consumes and processes messages in order. | | +schema-type | The builtin schema type or custom schema class name to be used for messages output by the function. | +sliding-interval-count | The number of messages after which the window slides. | | +sliding-interval-duration-ms | The time duration after which the window slides. | | +subs-name | Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer. | | +tenant | The tenant of a Pulsar Function. | | +timeout-ms | The message timeout in milliseconds. | | +tls-allow-insecure | Allow insecure tls connection. | false +tls-trust-cert-path | tls trust cert file path. | | +topics-pattern | The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function). | | +use-tls | Use tls connection. | false +user-config | User-defined config key/values. | | +window-length-count | The number of messages per window. | | +window-length-duration-ms | The time duration of the window in milliseconds. | | + + +## create + +Create and deploy a Pulsar Function in cluster mode. + +Name | Description | Default +---|---|--- +auto-ack | Whether or not the framework acknowledges messages automatically. | false | +classname | The class name of a Pulsar Function. | | +CPU | The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).| | +custom-runtime-options | A string that encodes options to customize the runtime, see docs for configured runtime for details | | +custom-schema-inputs | The map of input topics to Schema class names (as a JSON string). | | +custom-serde-inputs | The map of input topics to SerDe class names (as a JSON string). | | +dead-letter-topic | The topic where all messages that were not processed successfully are sent. | | +disk | The disk in bytes that need to be allocated per function instance (applicable only to docker runtime). | | +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +function-config-file | The path to a YAML config file specifying the configuration of a Pulsar Function. | | +go | Path to the main Go executable binary for the function (if the function is written in Go). | | +inputs | The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list). | | +jar | Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package. | | +log-topic | The topic to which the logs of a Pulsar Function are produced. | | +max-message-retries | How many times should we try to process a message before giving up. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +output | The output topic of a Pulsar Function (If none is specified, no output is written). | | +output-serde-classname | The SerDe class to be used for messages output by the function. | | +parallelism | The parallelism factor of a Pulsar Function (i.e. the number of function instances to run). | | +processing-guarantees | The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE]. | ATLEAST_ONCE +py | Path to the main Python file/Python Wheel file for the function (if the function is written in Python). | | +ram | The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime). | | +retain-ordering | Function consumes and processes messages in order. | | +schema-type | The builtin schema type or custom schema class name to be used for messages output by the function. | +sliding-interval-count | The number of messages after which the window slides. | | +sliding-interval-duration-ms | The time duration after which the window slides. | | +subs-name | Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer. | | +tenant | The tenant of a Pulsar Function. | | +timeout-ms | The message timeout in milliseconds. | | +topics-pattern | The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function). | | +user-config | User-defined config key/values. | | +window-length-count | The number of messages per window. | | +window-length-duration-ms | The time duration of the window in milliseconds. | | + +## delete + +Delete a Pulsar Function that is running on a Pulsar cluster. + +Name | Description | Default +---|---|--- +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +tenant | The tenant of a Pulsar Function. | | + +## update + +Update a Pulsar Function that has been deployed to a Pulsar cluster. + +Name | Description | Default +---|---|--- +auto-ack | Whether or not the framework acknowledges messages automatically. | false +classname | The class name of a Pulsar Function. | | +CPU | The CPU in cores that need to be allocated per function instance (applicable only to docker runtime). | | +custom-runtime-options | A string that encodes options to customize the runtime, see docs for configured runtime for details | | +custom-schema-inputs | The map of input topics to Schema class names (as a JSON string). | | +custom-serde-inputs | The map of input topics to SerDe class names (as a JSON string). | | +dead-letter-topic | The topic where all messages that were not processed successfully are sent. | | +disk | The disk in bytes that need to be allocated per function instance (applicable only to docker runtime). | | +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +function-config-file | The path to a YAML config file specifying the configuration of a Pulsar Function. | | +go | Path to the main Go executable binary for the function (if the function is written in Go). | | +inputs | The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list). | | +jar | Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package. | | +log-topic | The topic to which the logs of a Pulsar Function are produced. | | +max-message-retries | How many times should we try to process a message before giving up. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +output | The output topic of a Pulsar Function (If none is specified, no output is written). | | +output-serde-classname | The SerDe class to be used for messages output by the function. | | +parallelism | The parallelism factor of a Pulsar Function (i.e. the number of function instances to run). | | +processing-guarantees | The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE]. | ATLEAST_ONCE +py | Path to the main Python file/Python Wheel file for the function (if the function is written in Python). | | +ram | The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime). | | +retain-ordering | Function consumes and processes messages in order. | | +schema-type | The builtin schema type or custom schema class name to be used for messages output by the function. | +sliding-interval-count | The number of messages after which the window slides. | | +sliding-interval-duration-ms | The time duration after which the window slides. | | +subs-name | Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer. | | +tenant | The tenant of a Pulsar Function. | | +timeout-ms | The message timeout in milliseconds. | | +topics-pattern | The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function). | | +update-auth-data | Whether or not to update the auth data. | false +user-config | User-defined config key/values. | | +window-length-count | The number of messages per window. | | +window-length-duration-ms | The time duration of the window in milliseconds. | | + +## get + +Fetch information about a Pulsar Function. + +Name | Description | Default +---|---|--- +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +tenant | The tenant of a Pulsar Function. | | + +## restart + +Restart function instance. + +Name | Description | Default +---|---|--- +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +instance-id | The function instanceId (restart all instances if instance-id is not provided. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +tenant | The tenant of a Pulsar Function. | | + +## stop + +Stops function instance. + +Name | Description | Default +---|---|--- +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +instance-id | The function instanceId (restart all instances if instance-id is not provided. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +tenant | The tenant of a Pulsar Function. | | + +## start + +Starts a stopped function instance. + +Name | Description | Default +---|---|--- +fqfn | The Fully Qualified Function Name (FQFN) for the function. | | +instance-id | The function instanceId (restart all instances if instance-id is not provided. | | +name | The name of a Pulsar Function. | | +namespace | The namespace of a Pulsar Function. | | +tenant | The tenant of a Pulsar Function. | | diff --git a/site2/docs/functions-runtime.md b/site2/docs/functions-runtime.md index 5a570264acfce..75d3aef2c9a7b 100644 --- a/site2/docs/functions-runtime.md +++ b/site2/docs/functions-runtime.md @@ -10,6 +10,10 @@ Currently, Pulsar Functions support the following three methods to run functions - *Process*: Invoke functions in processes forked by Functions Worker. - *Kubernetes*: Submit functions as Kubernetes StatefulSets by Functions Worker. +The differences of the thread and process modes are: +- Thread mode: when a function runs in thread mode, it runs on the same Java virtual machine (JVM) with Functions worker. +- Process mode: when a function runs in process mode, it runs on the same machine that Functions worker runs. + ## Configure thread runtime *Thread* runtime is easy to configure. In most cases, you don't need to configure anything. You can customize the thread group name with the following settings: @@ -58,7 +62,7 @@ kubernetesContainerFactory: # setting this to true is let function worker to submit functions to the same k8s cluster as function worker # is running. setting this to false if your function worker is not running as a k8 pod. submittingInsidePod: false - # setting the pulsar service url that pulsar function should use to connect to pulsar + # setting the pulsar service url that pulsar function should use to connect to pulsar # if it is not set, it will use the pulsar service url configured in worker service pulsarServiceUrl: # setting the pulsar admin url that pulsar function should use to connect to pulsar @@ -71,6 +75,13 @@ kubernetesContainerFactory: extraFunctionDependenciesDir: # Additional memory padding added on top of the memory requested by the function per on a per instance basis percentMemoryPadding: 10 + # an instance of `org.apache.pulsar.functions.runtime.KubernetesManifestCustomizer` which can be implemented + # to inject customization of the generated k8s manifest, leave blank to use the default customization plugin. + # This class is passed the `customRuntimeOptions` flag passed to functions + kubernetesManifestCustomizerClassName: + # a string that is passed to the manifest customizer class, this config is used for all functions and is static + # (as opposed to the `customRuntimeOptions` which can be provided per function) + kubernetesManifestCustomizerConfig: ``` If you have already run a Pulsar cluster on Kubernetes, you can keep the settings unchanged at most of time. @@ -79,7 +90,7 @@ However, if you enable RBAC on deploying your Pulsar cluster, make sure the serv running Functions Workers (or brokers, if Functions Workers run along with brokers) have permissions on the following kubernetes APIs. -- services +- services - configmaps - pods - apps.statefulsets @@ -104,7 +115,7 @@ If this happens, you need to grant the required permissions to the service accou apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: - name: functions-worker + name: functions-worker rules: - apiGroups: [""] resources: @@ -136,4 +147,35 @@ roleRef: subjects: - kind: ServiceAccount name: functions-worker -``` \ No newline at end of file +``` + +### Kubernetes CustomRuntimeOptions + +The functions (and sinks/sources) API provides a flag, `customRuntimeOptions` which can be used to pass options to the runtime to customize how the runtime operates. + +In the case of case of kubernetes, this is passed to an instance of the `org.apache.pulsar.functions.runtime.KubernetesManifestCustomizer`. This interface can be overridden +and allows for a high degree of customization over how the K8S manifests are generated. + +Pulsar provides a default implementation of this interface which takes the following options as a json string: + +```Json +{ + "jobNamespace": "namespace", // the k8s namespace to run this function in + "extractLabels": { // extra labels to attach to the statefulSet, service, and pods + "extraLabel": "value" + }, + "extraAnnotations": { // extra annotations to attach to the statefulSet, service, and pods + "extraAnnotation": "value" + }, + "nodeSelectorLabels": { // node selector labels to add on to the pod spec + "customLabel": "value" + }, + "tolerations": [ // tolerations to add to the pod spec + { + "key": "custom-key", + "value": "value", + "effect": "NoSchedule" + } + ] +} +``` From 9a1e3590b9786ca93dc812692f15ba57d6480d85 Mon Sep 17 00:00:00 2001 From: Addison Higham Date: Wed, 16 Oct 2019 12:28:30 -0600 Subject: [PATCH 4/5] [functions] Distributed the CA for KubernetesSecretsTokenAuthProvider Currently, if a user has TLS enabled and is using a custom CA that isn't baked into the image, when the functions worker starts, it won't have the CA in order to validate the cert presented by the broker. This adds support to have the `KubernetesSecretsTokenAuthProvider` also distribute the CA via the same kubernetes secret used for the token. a thing --- .../KubernetesSecretsTokenAuthProvider.java | 29 +++++++++-- .../runtime/KubernetesRuntimeFactory.java | 5 +- ...ubernetesSecretsTokenAuthProviderTest.java | 50 +++++++++++++++++-- .../runtime/KubernetesRuntimeFactoryTest.java | 1 + .../runtime/KubernetesRuntimeTest.java | 1 + .../worker/FunctionRuntimeManager.java | 1 + .../pulsar/functions/worker/WorkerConfig.java | 14 ++++++ 7 files changed, 93 insertions(+), 8 deletions(-) diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java index f228378417962..587479996760c 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProvider.java @@ -18,6 +18,7 @@ */ package org.apache.pulsar.functions.auth; +import com.google.common.annotations.VisibleForTesting; import io.kubernetes.client.ApiException; import io.kubernetes.client.apis.CoreV1Api; import io.kubernetes.client.models.V1DeleteOptions; @@ -38,6 +39,8 @@ import javax.naming.AuthenticationException; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; @@ -54,13 +57,19 @@ public class KubernetesSecretsTokenAuthProvider implements KubernetesFunctionAut private static final String SECRET_NAME = "function-auth"; private static final String DEFAULT_SECRET_MOUNT_DIR = "/etc/auth"; private static final String FUNCTION_AUTH_TOKEN = "token"; + private static final String FUNCTION_CA_CERT = "ca.pem"; + private final CoreV1Api coreClient; private final String kubeNamespace; + private final byte[] caBytes; - public KubernetesSecretsTokenAuthProvider(CoreV1Api coreClient, String kubeNamespace) { + // if TLS is enabled, get the CA bytes into the secret for the function worker + // this allows user to not need to specialize the image just to get the CA into the container + public KubernetesSecretsTokenAuthProvider(CoreV1Api coreClient, String kubeNamespace, byte[] caBytes) { this.coreClient = coreClient; this.kubeNamespace = kubeNamespace; + this.caBytes = caBytes; } @Override @@ -97,6 +106,10 @@ public void configureAuthenticationConfig(AuthenticationConfig authConfig, Optio } else { authConfig.setClientAuthenticationPlugin(AuthenticationToken.class.getName()); authConfig.setClientAuthenticationParameters(String.format("file://%s/%s", DEFAULT_SECRET_MOUNT_DIR, FUNCTION_AUTH_TOKEN)); + // if we have ca bytes, update the new path for the CA + if (this.caBytes != null) { + authConfig.setTlsTrustCertsFilePath(String.format("%s/%s", DEFAULT_SECRET_MOUNT_DIR, FUNCTION_CA_CERT)); + } } } @@ -250,6 +263,16 @@ public Optional updateAuthData(String tenant, String namespace return existingFunctionAuthData; } + @VisibleForTesting + Map buildSecretMap(String token) { + Map valueMap = new HashMap<>(); + valueMap.put(FUNCTION_AUTH_TOKEN, token.getBytes()); + if (caBytes != null) { + valueMap.put(FUNCTION_CA_CERT, caBytes); + } + return valueMap; + } + private void upsertSecret(String token, String tenant, String namespace, String name, String secretName) throws InterruptedException { Actions.Action createAuthSecret = Actions.Action.builder() @@ -260,7 +283,7 @@ private void upsertSecret(String token, String tenant, String namespace, String String id = RandomStringUtils.random(5, true, true).toLowerCase(); V1Secret v1Secret = new V1Secret() .metadata(new V1ObjectMeta().name(secretName)) - .data(Collections.singletonMap(FUNCTION_AUTH_TOKEN, token.getBytes())); + .data(buildSecretMap(token)); try { coreClient.createNamespacedSecret(kubeNamespace, v1Secret, null); @@ -313,7 +336,7 @@ private String createSecret(String token, String tenant, String namespace, Strin String id = RandomStringUtils.random(5, true, true).toLowerCase(); V1Secret v1Secret = new V1Secret() .metadata(new V1ObjectMeta().name(getSecretName(id))) - .data(Collections.singletonMap(FUNCTION_AUTH_TOKEN, token.getBytes())); + .data(buildSecretMap(token)); try { coreClient.createNamespacedSecret(kubeNamespace, v1Secret, "true"); } catch (ApiException e) { diff --git a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java index 6802ecebad987..771b65c7fafd6 100644 --- a/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java +++ b/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactory.java @@ -97,6 +97,7 @@ class KubernetesInfo { private CoreV1Api coreClient; private Resources functionInstanceMinResources; private final boolean authenticationEnabled; + private final byte[] serverCaBytes; @VisibleForTesting public KubernetesRuntimeFactory(String k8Uri, @@ -115,6 +116,7 @@ public KubernetesRuntimeFactory(String k8Uri, String pulsarAdminUri, String stateStorageServiceUri, AuthenticationConfig authConfig, + byte[] serverCaBytes, Integer expectedMetricsCollectionInterval, String changeConfigMap, String changeConfigMapNamespace, @@ -168,6 +170,7 @@ public KubernetesRuntimeFactory(String k8Uri, this.customLabels = customLabels; this.stateStorageServiceUri = stateStorageServiceUri; this.authConfig = authConfig; + this.serverCaBytes = serverCaBytes; this.javaInstanceJarFile = this.kubernetesInfo.getPulsarRootDir() + "/instances/java-instance.jar"; this.pythonInstanceFile = this.kubernetesInfo.getPulsarRootDir() + "/instances/python-instance/python_instance_main.py"; this.expectedMetricsCollectionInterval = expectedMetricsCollectionInterval == null ? -1 : expectedMetricsCollectionInterval; @@ -360,6 +363,6 @@ KubernetesManifestCustomizer buildManifestCustomizer(Function.FunctionDetails fu @Override public KubernetesFunctionAuthProvider getAuthProvider(Function.FunctionDetails funcDetails) { KubernetesManifestCustomizer manifestCustomizer = buildManifestCustomizer(funcDetails); - return new KubernetesSecretsTokenAuthProvider(coreClient, manifestCustomizer.customizeNamespace(kubernetesInfo.jobNamespace)); + return new KubernetesSecretsTokenAuthProvider(coreClient, manifestCustomizer.customizeNamespace(kubernetesInfo.jobNamespace), serverCaBytes); } } diff --git a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProviderTest.java b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProviderTest.java index 4c63a4fd6bc0d..31ef0ede04314 100644 --- a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProviderTest.java +++ b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/auth/KubernetesSecretsTokenAuthProviderTest.java @@ -47,9 +47,35 @@ public class KubernetesSecretsTokenAuthProviderTest { @Test public void testConfigureAuthDataStatefulSet() { + byte[] testBytes = new byte[]{0, 1, 2, 3, 4}; CoreV1Api coreV1Api = mock(CoreV1Api.class); - KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default"); + KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default", testBytes); + + + V1StatefulSet statefulSet = new V1StatefulSet(); + statefulSet.setSpec( + new V1StatefulSetSpec().template( + new V1PodTemplateSpec().spec( + new V1PodSpec().containers( + Collections.singletonList(new V1Container()))))); + FunctionAuthData functionAuthData = FunctionAuthData.builder().data("foo".getBytes()).build(); + kubernetesSecretsTokenAuthProvider.configureAuthDataStatefulSet(statefulSet, Optional.of(functionAuthData)); + + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getVolumes().size(), 1); + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getVolumes().get(0).getName(), "function-auth"); + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getVolumes().get(0).getSecret().getSecretName(), "pf-secret-foo"); + + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getContainers().size(), 1); + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts().size(), 1); + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts().get(0).getName(), "function-auth"); + Assert.assertEquals(statefulSet.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts().get(0).getMountPath(), "/etc/auth"); + } + + @Test + public void testConfigureAuthDataStatefulSetNoCa() { + CoreV1Api coreV1Api = mock(CoreV1Api.class); + KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default", null); V1StatefulSet statefulSet = new V1StatefulSet(); @@ -75,7 +101,7 @@ public void testConfigureAuthDataStatefulSet() { public void testCacheAuthData() throws ApiException { CoreV1Api coreV1Api = mock(CoreV1Api.class); doReturn(new V1Secret()).when(coreV1Api).createNamespacedSecret(anyString(), any(), anyString()); - KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default"); + KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default", null); Optional functionAuthData = kubernetesSecretsTokenAuthProvider.cacheAuthData("test-tenant", "test-ns", "test-func", new AuthenticationDataSource() { @Override @@ -95,20 +121,36 @@ public String getCommandData() { @Test public void configureAuthenticationConfig() { + byte[] testBytes = new byte[]{0, 1, 2, 3, 4}; CoreV1Api coreV1Api = mock(CoreV1Api.class); - KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default"); + KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default", testBytes); AuthenticationConfig authenticationConfig = AuthenticationConfig.builder().build(); FunctionAuthData functionAuthData = FunctionAuthData.builder().data("foo".getBytes()).build(); kubernetesSecretsTokenAuthProvider.configureAuthenticationConfig(authenticationConfig, Optional.of(functionAuthData)); Assert.assertEquals(authenticationConfig.getClientAuthenticationPlugin(), AuthenticationToken.class.getName()); Assert.assertEquals(authenticationConfig.getClientAuthenticationParameters(), "file:///etc/auth/token"); + Assert.assertEquals(authenticationConfig.getTlsTrustCertsFilePath(), "/etc/auth/ca.pem"); } + @Test + public void configureAuthenticationConfigNoCa() { + CoreV1Api coreV1Api = mock(CoreV1Api.class); + KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default", null); + AuthenticationConfig authenticationConfig = AuthenticationConfig.builder().build(); + FunctionAuthData functionAuthData = FunctionAuthData.builder().data("foo".getBytes()).build(); + kubernetesSecretsTokenAuthProvider.configureAuthenticationConfig(authenticationConfig, Optional.of(functionAuthData)); + + Assert.assertEquals(authenticationConfig.getClientAuthenticationPlugin(), AuthenticationToken.class.getName()); + Assert.assertEquals(authenticationConfig.getClientAuthenticationParameters(), "file:///etc/auth/token"); + Assert.assertEquals(authenticationConfig.getTlsTrustCertsFilePath(), null); + } + + @Test public void testUpdateAuthData() throws Exception { CoreV1Api coreV1Api = mock(CoreV1Api.class); - KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default"); + KubernetesSecretsTokenAuthProvider kubernetesSecretsTokenAuthProvider = new KubernetesSecretsTokenAuthProvider(coreV1Api, "default", null); // test when existingFunctionAuthData is empty Optional existingFunctionAuthData = Optional.empty(); diff --git a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java index a2173fbd47c45..37d6c1323ef10 100644 --- a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java +++ b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeFactoryTest.java @@ -146,6 +146,7 @@ KubernetesRuntimeFactory createKubernetesRuntimeFactory(String extraDepsDir, Res null, null, null, + null, minResources, new TestSecretProviderConfigurator(), false, diff --git a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java index 63dd4dd60fc2e..42d44cb1fbd8c 100644 --- a/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java +++ b/pulsar-functions/runtime/src/test/java/org/apache/pulsar/functions/runtime/KubernetesRuntimeTest.java @@ -174,6 +174,7 @@ KubernetesRuntimeFactory createKubernetesRuntimeFactory(String extraDepsDir, int null, null, null, + null, new TestSecretProviderConfigurator(), false, manifestCustomizerClassName, diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java index b3757799dd393..19aa3737bd18e 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/FunctionRuntimeManager.java @@ -166,6 +166,7 @@ public FunctionRuntimeManager(WorkerConfig workerConfig, WorkerService workerSer StringUtils.isEmpty(workerConfig.getKubernetesContainerFactory().getPulsarAdminUrl()) ? workerConfig.getPulsarWebServiceUrl() : workerConfig.getKubernetesContainerFactory().getPulsarAdminUrl(), workerConfig.getStateStorageServiceUrl(), authConfig, + workerConfig.getTlsTrustChainBytes(), workerConfig.getKubernetesContainerFactory().getExpectedMetricsCollectionInterval() == null ? -1 : workerConfig.getKubernetesContainerFactory().getExpectedMetricsCollectionInterval(), workerConfig.getKubernetesContainerFactory().getChangeConfigMap(), workerConfig.getKubernetesContainerFactory().getChangeConfigMapNamespace(), diff --git a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java index d952b317d48d8..1e957bb01139c 100644 --- a/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java +++ b/pulsar-functions/worker/src/main/java/org/apache/pulsar/functions/worker/WorkerConfig.java @@ -28,6 +28,8 @@ import java.io.Serializable; import java.net.InetAddress; import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -533,6 +535,18 @@ public String getWorkerHostname() { return this.workerHostname; } + public byte[] getTlsTrustChainBytes() { + if (StringUtils.isNotEmpty(getTlsTrustCertsFilePath()) && Files.exists(Paths.get(getTlsTrustCertsFilePath()))) { + try { + return Files.readAllBytes(Paths.get(getTlsTrustCertsFilePath())); + } catch (IOException e) { + throw new IllegalStateException("Failed to read CA bytes", e); + } + } else { + return null; + } + } + public String getWorkerWebAddress() { return String.format("http://%s:%d", this.getWorkerHostname(), this.getWorkerPort()); } From 64c6d2263e224dde1a6f4c4c6b523bc008564968 Mon Sep 17 00:00:00 2001 From: Addison Higham Date: Tue, 15 Oct 2019 16:47:52 -0600 Subject: [PATCH 5/5] create release 2.4.1-inst3 --- buildtools/pom.xml | 2 +- dashboard/pom.xml | 2 +- distribution/io/pom.xml | 2 +- distribution/offloaders/pom.xml | 2 +- distribution/pom.xml | 2 +- distribution/server/pom.xml | 2 +- docker/grafana/pom.xml | 2 +- docker/pom.xml | 2 +- docker/pulsar-all/pom.xml | 2 +- docker/pulsar-standalone/pom.xml | 2 +- docker/pulsar/pom.xml | 2 +- examples/flink/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spark/pom.xml | 2 +- jclouds-shaded/pom.xml | 2 +- managed-ledger-shaded/pom.xml | 2 +- managed-ledger/pom.xml | 2 +- pom.xml | 2 +- protobuf-shaded/pom.xml | 2 +- pulsar-broker-auth-athenz/pom.xml | 2 +- pulsar-broker-auth-sasl/pom.xml | 2 +- pulsar-broker-common/pom.xml | 2 +- pulsar-broker-shaded/pom.xml | 2 +- pulsar-broker/pom.xml | 2 +- pulsar-client-1x-base/pom.xml | 2 +- pulsar-client-1x-base/pulsar-client-1x/pom.xml | 2 +- pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml | 2 +- pulsar-client-admin-shaded/pom.xml | 2 +- pulsar-client-admin/pom.xml | 2 +- pulsar-client-all/pom.xml | 2 +- pulsar-client-api/pom.xml | 2 +- pulsar-client-auth-athenz/pom.xml | 2 +- pulsar-client-auth-sasl/pom.xml | 2 +- pulsar-client-kafka-compat/pom.xml | 2 +- pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml | 2 +- pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml | 2 +- pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml | 2 +- pulsar-client-shaded/pom.xml | 2 +- pulsar-client-tools-test/pom.xml | 2 +- pulsar-client-tools/pom.xml | 2 +- pulsar-client/pom.xml | 2 +- pulsar-common/pom.xml | 2 +- pulsar-discovery-service/pom.xml | 2 +- pulsar-flink/pom.xml | 2 +- pulsar-functions/api-java/pom.xml | 2 +- pulsar-functions/instance/pom.xml | 2 +- pulsar-functions/java-examples/pom.xml | 2 +- pulsar-functions/localrun-shaded/pom.xml | 2 +- pulsar-functions/localrun/pom.xml | 2 +- pulsar-functions/pom.xml | 2 +- pulsar-functions/proto/pom.xml | 2 +- pulsar-functions/runtime-all/pom.xml | 2 +- pulsar-functions/runtime/pom.xml | 2 +- pulsar-functions/secrets/pom.xml | 2 +- pulsar-functions/utils/pom.xml | 2 +- pulsar-functions/worker/pom.xml | 2 +- pulsar-io/aerospike/pom.xml | 2 +- pulsar-io/canal/pom.xml | 2 +- pulsar-io/cassandra/pom.xml | 2 +- pulsar-io/common/pom.xml | 2 +- pulsar-io/core/pom.xml | 2 +- pulsar-io/data-generator/pom.xml | 2 +- pulsar-io/debezium/core/pom.xml | 2 +- pulsar-io/debezium/mysql/pom.xml | 2 +- pulsar-io/debezium/pom.xml | 2 +- pulsar-io/debezium/postgres/pom.xml | 2 +- pulsar-io/docs/pom.xml | 2 +- pulsar-io/elastic-search/pom.xml | 2 +- pulsar-io/file/pom.xml | 2 +- pulsar-io/flume/pom.xml | 2 +- pulsar-io/hbase/pom.xml | 2 +- pulsar-io/hdfs2/pom.xml | 2 +- pulsar-io/hdfs3/pom.xml | 2 +- pulsar-io/influxdb/pom.xml | 2 +- pulsar-io/jdbc/pom.xml | 2 +- pulsar-io/kafka-connect-adaptor/pom.xml | 2 +- pulsar-io/kafka/pom.xml | 2 +- pulsar-io/kinesis/pom.xml | 2 +- pulsar-io/mongo/pom.xml | 2 +- pulsar-io/netty/pom.xml | 2 +- pulsar-io/pom.xml | 2 +- pulsar-io/rabbitmq/pom.xml | 2 +- pulsar-io/redis/pom.xml | 2 +- pulsar-io/solr/pom.xml | 2 +- pulsar-io/twitter/pom.xml | 2 +- pulsar-log4j2-appender/pom.xml | 2 +- pulsar-proxy/pom.xml | 2 +- pulsar-spark/pom.xml | 2 +- pulsar-sql/pom.xml | 2 +- pulsar-sql/presto-distribution/pom.xml | 2 +- pulsar-sql/presto-pulsar-plugin/pom.xml | 2 +- pulsar-sql/presto-pulsar/pom.xml | 2 +- pulsar-storm/pom.xml | 2 +- pulsar-testclient/pom.xml | 2 +- pulsar-transaction/buffer/pom.xml | 2 +- pulsar-transaction/common/pom.xml | 2 +- pulsar-transaction/coordinator/pom.xml | 2 +- pulsar-transaction/pom.xml | 2 +- pulsar-websocket/pom.xml | 2 +- pulsar-zookeeper-utils/pom.xml | 2 +- pulsar-zookeeper/pom.xml | 2 +- tests/bc_2_0_0/pom.xml | 2 +- tests/bc_2_0_1/pom.xml | 2 +- tests/docker-images/java-test-functions/pom.xml | 2 +- tests/docker-images/latest-version-image/pom.xml | 2 +- tests/docker-images/pom.xml | 2 +- tests/integration/pom.xml | 2 +- tests/pom.xml | 2 +- tests/pulsar-kafka-compat-client-test/pom.xml | 2 +- tests/pulsar-spark-test/pom.xml | 2 +- tests/pulsar-storm-test/pom.xml | 2 +- tiered-storage/jcloud/pom.xml | 2 +- tiered-storage/pom.xml | 2 +- 113 files changed, 113 insertions(+), 113 deletions(-) diff --git a/buildtools/pom.xml b/buildtools/pom.xml index f7e4ea32f5d58..f010194aa3cfc 100644 --- a/buildtools/pom.xml +++ b/buildtools/pom.xml @@ -30,7 +30,7 @@ org.apache.pulsar buildtools - 2.4.1-inst2 + 2.4.1-inst3 jar Pulsar Build Tools diff --git a/dashboard/pom.xml b/dashboard/pom.xml index 482208149ea36..aeba7781d6705 100644 --- a/dashboard/pom.xml +++ b/dashboard/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst2 + 2.4.1-inst3 ../docker 4.0.0 diff --git a/distribution/io/pom.xml b/distribution/io/pom.xml index 018905ff4c401..2ad5a1d3eeadb 100644 --- a/distribution/io/pom.xml +++ b/distribution/io/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar distribution - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/distribution/offloaders/pom.xml b/distribution/offloaders/pom.xml index 2293760450215..8ebdfea845bfc 100644 --- a/distribution/offloaders/pom.xml +++ b/distribution/offloaders/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar distribution - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/distribution/pom.xml b/distribution/pom.xml index 2d874b870dd33..c9faddefe0e9b 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/distribution/server/pom.xml b/distribution/server/pom.xml index 4067711ccbe62..223485d86fa24 100644 --- a/distribution/server/pom.xml +++ b/distribution/server/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar distribution - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/docker/grafana/pom.xml b/docker/grafana/pom.xml index bc0e6a2cd30d8..8de838fa5835a 100644 --- a/docker/grafana/pom.xml +++ b/docker/grafana/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 org.apache.pulsar diff --git a/docker/pom.xml b/docker/pom.xml index 9588be2a984ef..ddba1268996dc 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 org.apache.pulsar docker-images diff --git a/docker/pulsar-all/pom.xml b/docker/pulsar-all/pom.xml index 4e2d5c561d760..8d2ba3a09dd1d 100644 --- a/docker/pulsar-all/pom.xml +++ b/docker/pulsar-all/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 pulsar-all-docker-image diff --git a/docker/pulsar-standalone/pom.xml b/docker/pulsar-standalone/pom.xml index 24666e4fab0d6..3edad32da14dc 100644 --- a/docker/pulsar-standalone/pom.xml +++ b/docker/pulsar-standalone/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 org.apache.pulsar diff --git a/docker/pulsar/pom.xml b/docker/pulsar/pom.xml index 3b08f46ff6010..8e1fc9386139d 100644 --- a/docker/pulsar/pom.xml +++ b/docker/pulsar/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar docker-images - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 org.apache.pulsar diff --git a/examples/flink/pom.xml b/examples/flink/pom.xml index 4e94994cbd28f..203e4764d4071 100644 --- a/examples/flink/pom.xml +++ b/examples/flink/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar.examples pulsar-examples - 2.4.1-inst2 + 2.4.1-inst3 org.apache.pulsar.examples diff --git a/examples/pom.xml b/examples/pom.xml index a92748f836e4b..6df025ce5730c 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 org.apache.pulsar.examples diff --git a/examples/spark/pom.xml b/examples/spark/pom.xml index 3686db7ecac29..1f1ad91474557 100644 --- a/examples/spark/pom.xml +++ b/examples/spark/pom.xml @@ -25,7 +25,7 @@ pulsar-examples org.apache.pulsar.examples - 2.4.1-inst2 + 2.4.1-inst3 org.apache.pulsar.examples diff --git a/jclouds-shaded/pom.xml b/jclouds-shaded/pom.xml index 73c4db05e6960..84a3772c5e920 100644 --- a/jclouds-shaded/pom.xml +++ b/jclouds-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/managed-ledger-shaded/pom.xml b/managed-ledger-shaded/pom.xml index aa52c02518952..3ad2215953d71 100644 --- a/managed-ledger-shaded/pom.xml +++ b/managed-ledger-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/managed-ledger/pom.xml b/managed-ledger/pom.xml index fc1239cca22e4..0383242069c5d 100644 --- a/managed-ledger/pom.xml +++ b/managed-ledger/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pom.xml b/pom.xml index 51d35128ac0db..242e68dd33be8 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 Pulsar Pulsar is a distributed pub-sub messaging platform with a very diff --git a/protobuf-shaded/pom.xml b/protobuf-shaded/pom.xml index 308c6470303c9..a3e6b85f857d7 100644 --- a/protobuf-shaded/pom.xml +++ b/protobuf-shaded/pom.xml @@ -32,7 +32,7 @@ protobuf-shaded Apache Pulsar :: Protobuf shaded - 2.4.1-inst2 + 2.4.1-inst3 diff --git a/pulsar-broker-auth-athenz/pom.xml b/pulsar-broker-auth-athenz/pom.xml index 6b94b1be01ca9..4b23acbd38136 100644 --- a/pulsar-broker-auth-athenz/pom.xml +++ b/pulsar-broker-auth-athenz/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-broker-auth-athenz diff --git a/pulsar-broker-auth-sasl/pom.xml b/pulsar-broker-auth-sasl/pom.xml index d71557c0a99ad..be262f718bbb6 100644 --- a/pulsar-broker-auth-sasl/pom.xml +++ b/pulsar-broker-auth-sasl/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-broker-auth-sasl diff --git a/pulsar-broker-common/pom.xml b/pulsar-broker-common/pom.xml index 54a4f1140b025..7f42819fb4039 100644 --- a/pulsar-broker-common/pom.xml +++ b/pulsar-broker-common/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-broker-common diff --git a/pulsar-broker-shaded/pom.xml b/pulsar-broker-shaded/pom.xml index c3d30f224fbb9..5a0cd6c21bbc1 100644 --- a/pulsar-broker-shaded/pom.xml +++ b/pulsar-broker-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-broker/pom.xml b/pulsar-broker/pom.xml index 51a6f4ce4f99f..7651213116ad5 100644 --- a/pulsar-broker/pom.xml +++ b/pulsar-broker/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-1x-base/pom.xml b/pulsar-client-1x-base/pom.xml index 317eed8e53420..1555f983ee70b 100644 --- a/pulsar-client-1x-base/pom.xml +++ b/pulsar-client-1x-base/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-1x-base/pulsar-client-1x/pom.xml b/pulsar-client-1x-base/pulsar-client-1x/pom.xml index 20e0d7a0b7b46..5b78f509b7d25 100644 --- a/pulsar-client-1x-base/pulsar-client-1x/pom.xml +++ b/pulsar-client-1x-base/pulsar-client-1x/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-client-1x-base - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml b/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml index f7a66346ce92c..a57b67e8ee9f7 100644 --- a/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml +++ b/pulsar-client-1x-base/pulsar-client-2x-shaded/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-client-1x-base - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-admin-shaded/pom.xml b/pulsar-client-admin-shaded/pom.xml index 7eff052b86e10..21e7cfc773953 100644 --- a/pulsar-client-admin-shaded/pom.xml +++ b/pulsar-client-admin-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-admin/pom.xml b/pulsar-client-admin/pom.xml index 727ee0d8ca371..795f780f6c2a0 100644 --- a/pulsar-client-admin/pom.xml +++ b/pulsar-client-admin/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-all/pom.xml b/pulsar-client-all/pom.xml index e88cb89f1ac07..3a6e7fb010df3 100644 --- a/pulsar-client-all/pom.xml +++ b/pulsar-client-all/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-api/pom.xml b/pulsar-client-api/pom.xml index 231aada643773..ba959b74dc89e 100644 --- a/pulsar-client-api/pom.xml +++ b/pulsar-client-api/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-auth-athenz/pom.xml b/pulsar-client-auth-athenz/pom.xml index 0f0693d147f9f..d7af7f837b47e 100644 --- a/pulsar-client-auth-athenz/pom.xml +++ b/pulsar-client-auth-athenz/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-auth-sasl/pom.xml b/pulsar-client-auth-sasl/pom.xml index 1b0b865e3c884..433d764f68df4 100644 --- a/pulsar-client-auth-sasl/pom.xml +++ b/pulsar-client-auth-sasl/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-kafka-compat/pom.xml b/pulsar-client-kafka-compat/pom.xml index bd2e8accfa4de..ac91e7c53f6f8 100644 --- a/pulsar-client-kafka-compat/pom.xml +++ b/pulsar-client-kafka-compat/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml b/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml index b9fbfc63b8f82..28dc90f5b73c3 100644 --- a/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml +++ b/pulsar-client-kafka-compat/pulsar-client-kafka-shaded/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-client-kafka-compat - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml b/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml index c2aee31716cd1..2ef1ee0fa91ae 100644 --- a/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml +++ b/pulsar-client-kafka-compat/pulsar-client-kafka-tests/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-client-kafka-compat - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml b/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml index ea5f33e70019b..cce6463b9de61 100644 --- a/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml +++ b/pulsar-client-kafka-compat/pulsar-client-kafka/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-client-kafka-compat - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-shaded/pom.xml b/pulsar-client-shaded/pom.xml index 29b8a314e3959..863476cd906e9 100644 --- a/pulsar-client-shaded/pom.xml +++ b/pulsar-client-shaded/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-tools-test/pom.xml b/pulsar-client-tools-test/pom.xml index de1a7b5066c10..1ffdcd407869c 100644 --- a/pulsar-client-tools-test/pom.xml +++ b/pulsar-client-tools-test/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client-tools/pom.xml b/pulsar-client-tools/pom.xml index 72c66b2b5e888..370a7b9271b19 100644 --- a/pulsar-client-tools/pom.xml +++ b/pulsar-client-tools/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-client/pom.xml b/pulsar-client/pom.xml index 5ddbf71a71f11..db72b6e958e3b 100644 --- a/pulsar-client/pom.xml +++ b/pulsar-client/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-common/pom.xml b/pulsar-common/pom.xml index bfb68c1d76caa..15d35098fa5d7 100644 --- a/pulsar-common/pom.xml +++ b/pulsar-common/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-discovery-service/pom.xml b/pulsar-discovery-service/pom.xml index 3362678f6e721..f5da3ec0697b1 100644 --- a/pulsar-discovery-service/pom.xml +++ b/pulsar-discovery-service/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-flink/pom.xml b/pulsar-flink/pom.xml index 774fcc276e14b..ff0886c3b0974 100644 --- a/pulsar-flink/pom.xml +++ b/pulsar-flink/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-functions/api-java/pom.xml b/pulsar-functions/api-java/pom.xml index 21b547c1a2cc2..9ad777a30dadd 100644 --- a/pulsar-functions/api-java/pom.xml +++ b/pulsar-functions/api-java/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-api diff --git a/pulsar-functions/instance/pom.xml b/pulsar-functions/instance/pom.xml index 0b02c88170500..51146642d690d 100644 --- a/pulsar-functions/instance/pom.xml +++ b/pulsar-functions/instance/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-instance diff --git a/pulsar-functions/java-examples/pom.xml b/pulsar-functions/java-examples/pom.xml index 53a6b672698a2..ce8f4d73b7439 100644 --- a/pulsar-functions/java-examples/pom.xml +++ b/pulsar-functions/java-examples/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-api-examples diff --git a/pulsar-functions/localrun-shaded/pom.xml b/pulsar-functions/localrun-shaded/pom.xml index e0eb38edac3cf..422615bfecd89 100644 --- a/pulsar-functions/localrun-shaded/pom.xml +++ b/pulsar-functions/localrun-shaded/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-functions/localrun/pom.xml b/pulsar-functions/localrun/pom.xml index dce92de7ab74a..5aa1aac95754c 100644 --- a/pulsar-functions/localrun/pom.xml +++ b/pulsar-functions/localrun/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-functions/pom.xml b/pulsar-functions/pom.xml index 5bc48ecbfb3b2..e1842bc36615b 100644 --- a/pulsar-functions/pom.xml +++ b/pulsar-functions/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions diff --git a/pulsar-functions/proto/pom.xml b/pulsar-functions/proto/pom.xml index 9ce70b6f20a47..8acc7e265a1c9 100644 --- a/pulsar-functions/proto/pom.xml +++ b/pulsar-functions/proto/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-proto diff --git a/pulsar-functions/runtime-all/pom.xml b/pulsar-functions/runtime-all/pom.xml index f6b8a14fd1c4f..037616589ce42 100644 --- a/pulsar-functions/runtime-all/pom.xml +++ b/pulsar-functions/runtime-all/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-functions/runtime/pom.xml b/pulsar-functions/runtime/pom.xml index 1ce0f623aac6f..6b18998886a86 100644 --- a/pulsar-functions/runtime/pom.xml +++ b/pulsar-functions/runtime/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-runtime diff --git a/pulsar-functions/secrets/pom.xml b/pulsar-functions/secrets/pom.xml index c4ffeb40b2a84..164fd923c9fef 100644 --- a/pulsar-functions/secrets/pom.xml +++ b/pulsar-functions/secrets/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-secrets diff --git a/pulsar-functions/utils/pom.xml b/pulsar-functions/utils/pom.xml index d0f579d271488..9b5fa7bacc0df 100644 --- a/pulsar-functions/utils/pom.xml +++ b/pulsar-functions/utils/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 pulsar-functions-utils diff --git a/pulsar-functions/worker/pom.xml b/pulsar-functions/worker/pom.xml index 70275044af496..bbc2960972747 100644 --- a/pulsar-functions/worker/pom.xml +++ b/pulsar-functions/worker/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-functions - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-io/aerospike/pom.xml b/pulsar-io/aerospike/pom.xml index 68a980fdc5804..81e77e1539339 100644 --- a/pulsar-io/aerospike/pom.xml +++ b/pulsar-io/aerospike/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-aerospike diff --git a/pulsar-io/canal/pom.xml b/pulsar-io/canal/pom.xml index f55e24359f5dc..6325430778768 100644 --- a/pulsar-io/canal/pom.xml +++ b/pulsar-io/canal/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 diff --git a/pulsar-io/cassandra/pom.xml b/pulsar-io/cassandra/pom.xml index d698a299d125e..aae7a83a082c7 100644 --- a/pulsar-io/cassandra/pom.xml +++ b/pulsar-io/cassandra/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-cassandra diff --git a/pulsar-io/common/pom.xml b/pulsar-io/common/pom.xml index 64fe9a8a13877..0f845e2f44dad 100644 --- a/pulsar-io/common/pom.xml +++ b/pulsar-io/common/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-common diff --git a/pulsar-io/core/pom.xml b/pulsar-io/core/pom.xml index ac4d4a0d89695..b5296579b9c7e 100644 --- a/pulsar-io/core/pom.xml +++ b/pulsar-io/core/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-core diff --git a/pulsar-io/data-generator/pom.xml b/pulsar-io/data-generator/pom.xml index 532a94ad556d3..2a2ee0351e341 100644 --- a/pulsar-io/data-generator/pom.xml +++ b/pulsar-io/data-generator/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-data-generator diff --git a/pulsar-io/debezium/core/pom.xml b/pulsar-io/debezium/core/pom.xml index ee6f0b6380b59..8ec2669d31c62 100644 --- a/pulsar-io/debezium/core/pom.xml +++ b/pulsar-io/debezium/core/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io-debezium - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-debezium-core diff --git a/pulsar-io/debezium/mysql/pom.xml b/pulsar-io/debezium/mysql/pom.xml index 7af0ceedec885..dffa71bd7c06b 100644 --- a/pulsar-io/debezium/mysql/pom.xml +++ b/pulsar-io/debezium/mysql/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io-debezium - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-debezium-mysql diff --git a/pulsar-io/debezium/pom.xml b/pulsar-io/debezium/pom.xml index 478288a2c5651..a0af452b13004 100644 --- a/pulsar-io/debezium/pom.xml +++ b/pulsar-io/debezium/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-debezium diff --git a/pulsar-io/debezium/postgres/pom.xml b/pulsar-io/debezium/postgres/pom.xml index ea22317afda7f..556c4e0de97c0 100644 --- a/pulsar-io/debezium/postgres/pom.xml +++ b/pulsar-io/debezium/postgres/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io-debezium - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-debezium-postgres diff --git a/pulsar-io/docs/pom.xml b/pulsar-io/docs/pom.xml index 7d7be584d88c4..9c1da04120d4b 100644 --- a/pulsar-io/docs/pom.xml +++ b/pulsar-io/docs/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-docs diff --git a/pulsar-io/elastic-search/pom.xml b/pulsar-io/elastic-search/pom.xml index 3d4ae15342835..5459813921625 100644 --- a/pulsar-io/elastic-search/pom.xml +++ b/pulsar-io/elastic-search/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-elastic-search Pulsar IO :: ElasticSearch diff --git a/pulsar-io/file/pom.xml b/pulsar-io/file/pom.xml index 0fd402a9596be..28f0a3e175030 100644 --- a/pulsar-io/file/pom.xml +++ b/pulsar-io/file/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-file diff --git a/pulsar-io/flume/pom.xml b/pulsar-io/flume/pom.xml index 26209a1e1e4c2..38614a19037c6 100644 --- a/pulsar-io/flume/pom.xml +++ b/pulsar-io/flume/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-flume diff --git a/pulsar-io/hbase/pom.xml b/pulsar-io/hbase/pom.xml index 84a9bdcf0d091..a43e36548f052 100644 --- a/pulsar-io/hbase/pom.xml +++ b/pulsar-io/hbase/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-hbase Pulsar IO :: Hbase diff --git a/pulsar-io/hdfs2/pom.xml b/pulsar-io/hdfs2/pom.xml index d01b466037073..e4f876fea65cc 100644 --- a/pulsar-io/hdfs2/pom.xml +++ b/pulsar-io/hdfs2/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-hdfs2 Pulsar IO :: Hdfs2 diff --git a/pulsar-io/hdfs3/pom.xml b/pulsar-io/hdfs3/pom.xml index fbf95f38150ca..e47331e426d12 100644 --- a/pulsar-io/hdfs3/pom.xml +++ b/pulsar-io/hdfs3/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-hdfs3 Pulsar IO :: Hdfs3 diff --git a/pulsar-io/influxdb/pom.xml b/pulsar-io/influxdb/pom.xml index 74a9a78d28263..acba54412c46c 100644 --- a/pulsar-io/influxdb/pom.xml +++ b/pulsar-io/influxdb/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-influxdb diff --git a/pulsar-io/jdbc/pom.xml b/pulsar-io/jdbc/pom.xml index de6c10b0f97a4..51427cb575622 100644 --- a/pulsar-io/jdbc/pom.xml +++ b/pulsar-io/jdbc/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-jdbc diff --git a/pulsar-io/kafka-connect-adaptor/pom.xml b/pulsar-io/kafka-connect-adaptor/pom.xml index 1e8cb8e53e918..a4eedaa4f69c4 100644 --- a/pulsar-io/kafka-connect-adaptor/pom.xml +++ b/pulsar-io/kafka-connect-adaptor/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-kafka-connect-adaptor diff --git a/pulsar-io/kafka/pom.xml b/pulsar-io/kafka/pom.xml index 0e529ef37f90e..35e4688d8570c 100644 --- a/pulsar-io/kafka/pom.xml +++ b/pulsar-io/kafka/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-kafka diff --git a/pulsar-io/kinesis/pom.xml b/pulsar-io/kinesis/pom.xml index 8ba1a6c522a8f..be902f79ae903 100644 --- a/pulsar-io/kinesis/pom.xml +++ b/pulsar-io/kinesis/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-kinesis diff --git a/pulsar-io/mongo/pom.xml b/pulsar-io/mongo/pom.xml index eb8676649c63a..70da0248c5bfd 100644 --- a/pulsar-io/mongo/pom.xml +++ b/pulsar-io/mongo/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-mongo diff --git a/pulsar-io/netty/pom.xml b/pulsar-io/netty/pom.xml index 10b6c9028612a..923812ae1151f 100644 --- a/pulsar-io/netty/pom.xml +++ b/pulsar-io/netty/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-netty diff --git a/pulsar-io/pom.xml b/pulsar-io/pom.xml index b7d666695a5ad..4938770c5ecc4 100644 --- a/pulsar-io/pom.xml +++ b/pulsar-io/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io diff --git a/pulsar-io/rabbitmq/pom.xml b/pulsar-io/rabbitmq/pom.xml index 9b22b2466f5e0..087c4a9336531 100644 --- a/pulsar-io/rabbitmq/pom.xml +++ b/pulsar-io/rabbitmq/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-rabbitmq diff --git a/pulsar-io/redis/pom.xml b/pulsar-io/redis/pom.xml index 1864c6b9355da..15c7f3a906007 100644 --- a/pulsar-io/redis/pom.xml +++ b/pulsar-io/redis/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-redis diff --git a/pulsar-io/solr/pom.xml b/pulsar-io/solr/pom.xml index a76c818d0f221..2455d0d52f7d4 100644 --- a/pulsar-io/solr/pom.xml +++ b/pulsar-io/solr/pom.xml @@ -25,7 +25,7 @@ pulsar-io org.apache.pulsar - 2.4.1-inst2 + 2.4.1-inst3 diff --git a/pulsar-io/twitter/pom.xml b/pulsar-io/twitter/pom.xml index 980156ceafe9b..7f4767cdf3078 100644 --- a/pulsar-io/twitter/pom.xml +++ b/pulsar-io/twitter/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar-io - 2.4.1-inst2 + 2.4.1-inst3 pulsar-io-twitter diff --git a/pulsar-log4j2-appender/pom.xml b/pulsar-log4j2-appender/pom.xml index d4dbab28b7519..9c5989b667a30 100644 --- a/pulsar-log4j2-appender/pom.xml +++ b/pulsar-log4j2-appender/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-proxy/pom.xml b/pulsar-proxy/pom.xml index 373eded2b7018..5dbd7e2231ce8 100644 --- a/pulsar-proxy/pom.xml +++ b/pulsar-proxy/pom.xml @@ -24,7 +24,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-proxy diff --git a/pulsar-spark/pom.xml b/pulsar-spark/pom.xml index ac25b29a57e52..e6d7441305d9f 100644 --- a/pulsar-spark/pom.xml +++ b/pulsar-spark/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-sql/pom.xml b/pulsar-sql/pom.xml index 334cad90664e2..9ccec4b3dc8c0 100644 --- a/pulsar-sql/pom.xml +++ b/pulsar-sql/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-sql diff --git a/pulsar-sql/presto-distribution/pom.xml b/pulsar-sql/presto-distribution/pom.xml index ac3496ce78f20..8367dd8971b5b 100644 --- a/pulsar-sql/presto-distribution/pom.xml +++ b/pulsar-sql/presto-distribution/pom.xml @@ -31,7 +31,7 @@ org.apache.pulsar pulsar-presto-distribution Pulsar SQL :: Pulsar Presto Distribution - 2.4.1-inst2 + 2.4.1-inst3 0.206 diff --git a/pulsar-sql/presto-pulsar-plugin/pom.xml b/pulsar-sql/presto-pulsar-plugin/pom.xml index f3e0d39cbffae..6872e387776fd 100644 --- a/pulsar-sql/presto-pulsar-plugin/pom.xml +++ b/pulsar-sql/presto-pulsar-plugin/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-sql - 2.4.1-inst2 + 2.4.1-inst3 pulsar-presto-connector diff --git a/pulsar-sql/presto-pulsar/pom.xml b/pulsar-sql/presto-pulsar/pom.xml index b4c7c2d29f19b..4dc3dfc9f7589 100644 --- a/pulsar-sql/presto-pulsar/pom.xml +++ b/pulsar-sql/presto-pulsar/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar-sql - 2.4.1-inst2 + 2.4.1-inst3 pulsar-presto-connector-original diff --git a/pulsar-storm/pom.xml b/pulsar-storm/pom.xml index 933b4ea00aa27..be88b3dae25db 100644 --- a/pulsar-storm/pom.xml +++ b/pulsar-storm/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-testclient/pom.xml b/pulsar-testclient/pom.xml index 24de4f6d8d9be..d8f01a5ff508a 100644 --- a/pulsar-testclient/pom.xml +++ b/pulsar-testclient/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-transaction/buffer/pom.xml b/pulsar-transaction/buffer/pom.xml index 7bfdc17a1a796..dbdfa9e2d9450 100644 --- a/pulsar-transaction/buffer/pom.xml +++ b/pulsar-transaction/buffer/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-transaction-parent - 2.4.1-inst2 + 2.4.1-inst3 pulsar-transaction-buffer diff --git a/pulsar-transaction/common/pom.xml b/pulsar-transaction/common/pom.xml index cc3f82eae7a52..1fb12eba66969 100644 --- a/pulsar-transaction/common/pom.xml +++ b/pulsar-transaction/common/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-transaction-parent - 2.4.1-inst2 + 2.4.1-inst3 pulsar-transaction-common diff --git a/pulsar-transaction/coordinator/pom.xml b/pulsar-transaction/coordinator/pom.xml index 116a77ecf9aa0..542b29e2b1160 100644 --- a/pulsar-transaction/coordinator/pom.xml +++ b/pulsar-transaction/coordinator/pom.xml @@ -27,7 +27,7 @@ org.apache.pulsar pulsar-transaction-parent - 2.4.1-inst2 + 2.4.1-inst3 pulsar-transaction-coordinator diff --git a/pulsar-transaction/pom.xml b/pulsar-transaction/pom.xml index a0cd78dad26ef..6893ac5c80dac 100644 --- a/pulsar-transaction/pom.xml +++ b/pulsar-transaction/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 pulsar-transaction-parent diff --git a/pulsar-websocket/pom.xml b/pulsar-websocket/pom.xml index daca9f4689399..a3d209345cb56 100644 --- a/pulsar-websocket/pom.xml +++ b/pulsar-websocket/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-zookeeper-utils/pom.xml b/pulsar-zookeeper-utils/pom.xml index 238e64ef1646a..c3d978600bc82 100644 --- a/pulsar-zookeeper-utils/pom.xml +++ b/pulsar-zookeeper-utils/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/pulsar-zookeeper/pom.xml b/pulsar-zookeeper/pom.xml index d6bb7e39bc34e..7a05de6455025 100644 --- a/pulsar-zookeeper/pom.xml +++ b/pulsar-zookeeper/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/tests/bc_2_0_0/pom.xml b/tests/bc_2_0_0/pom.xml index ed1510f5ee5f2..04431c5992365 100644 --- a/tests/bc_2_0_0/pom.xml +++ b/tests/bc_2_0_0/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 bc_2_0_0 diff --git a/tests/bc_2_0_1/pom.xml b/tests/bc_2_0_1/pom.xml index bcf58ee92640e..22351b46a8dcb 100644 --- a/tests/bc_2_0_1/pom.xml +++ b/tests/bc_2_0_1/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 bc_2_0_1 diff --git a/tests/docker-images/java-test-functions/pom.xml b/tests/docker-images/java-test-functions/pom.xml index 7ac54eb378148..0f753822b5fa3 100644 --- a/tests/docker-images/java-test-functions/pom.xml +++ b/tests/docker-images/java-test-functions/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar.tests docker-images - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 org.apache.pulsar.tests diff --git a/tests/docker-images/latest-version-image/pom.xml b/tests/docker-images/latest-version-image/pom.xml index e155460cec5da..e0d28b3658296 100644 --- a/tests/docker-images/latest-version-image/pom.xml +++ b/tests/docker-images/latest-version-image/pom.xml @@ -23,7 +23,7 @@ org.apache.pulsar.tests docker-images - 2.4.1-inst2 + 2.4.1-inst3 4.0.0 org.apache.pulsar.tests diff --git a/tests/docker-images/pom.xml b/tests/docker-images/pom.xml index c3c6241c569fc..9badd11fcdc7e 100644 --- a/tests/docker-images/pom.xml +++ b/tests/docker-images/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 org.apache.pulsar.tests docker-images diff --git a/tests/integration/pom.xml b/tests/integration/pom.xml index 3b7e195b51cd5..f45d97aa5c2b7 100644 --- a/tests/integration/pom.xml +++ b/tests/integration/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 integration diff --git a/tests/pom.xml b/tests/pom.xml index b508d968a25fb..9e0057cf015fa 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 org.apache.pulsar.tests tests-parent diff --git a/tests/pulsar-kafka-compat-client-test/pom.xml b/tests/pulsar-kafka-compat-client-test/pom.xml index ad9cd49c4b07f..d0e5bf0efb2bb 100644 --- a/tests/pulsar-kafka-compat-client-test/pom.xml +++ b/tests/pulsar-kafka-compat-client-test/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 pulsar-kafka-compat-client-test diff --git a/tests/pulsar-spark-test/pom.xml b/tests/pulsar-spark-test/pom.xml index 542561b687e5d..4db5ea640f359 100644 --- a/tests/pulsar-spark-test/pom.xml +++ b/tests/pulsar-spark-test/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 pulsar-spark-test diff --git a/tests/pulsar-storm-test/pom.xml b/tests/pulsar-storm-test/pom.xml index 83172542ccd92..ae0bdde75cfeb 100644 --- a/tests/pulsar-storm-test/pom.xml +++ b/tests/pulsar-storm-test/pom.xml @@ -26,7 +26,7 @@ org.apache.pulsar.tests tests-parent - 2.4.1-inst2 + 2.4.1-inst3 pulsar-storm-test diff --git a/tiered-storage/jcloud/pom.xml b/tiered-storage/jcloud/pom.xml index f0ee869aa08fc..181198ccbb172 100644 --- a/tiered-storage/jcloud/pom.xml +++ b/tiered-storage/jcloud/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar tiered-storage-parent - 2.4.1-inst2 + 2.4.1-inst3 .. diff --git a/tiered-storage/pom.xml b/tiered-storage/pom.xml index 7108b24e81e11..1e154304ec796 100644 --- a/tiered-storage/pom.xml +++ b/tiered-storage/pom.xml @@ -25,7 +25,7 @@ org.apache.pulsar pulsar - 2.4.1-inst2 + 2.4.1-inst3 ..