|
36 | 36 | import java.time.Duration;
|
37 | 37 | import java.util.Arrays;
|
38 | 38 | import java.util.Collections;
|
| 39 | +import java.util.HashSet; |
39 | 40 | import java.util.Optional;
|
| 41 | +import java.util.Set; |
40 | 42 | import java.util.UUID;
|
41 | 43 | import java.util.concurrent.CompletableFuture;
|
42 | 44 | import java.util.concurrent.CountDownLatch;
|
|
55 | 57 | import org.apache.bookkeeper.mledger.impl.ManagedCursorImpl;
|
56 | 58 | import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl;
|
57 | 59 | import org.apache.pulsar.broker.BrokerTestUtil;
|
| 60 | +import org.apache.pulsar.broker.resources.ClusterResources; |
58 | 61 | import org.apache.pulsar.broker.service.persistent.GeoPersistentReplicator;
|
59 | 62 | import org.apache.pulsar.broker.service.persistent.PersistentReplicator;
|
60 | 63 | import org.apache.pulsar.broker.service.persistent.PersistentTopic;
|
|
70 | 73 | import org.apache.pulsar.client.impl.ProducerImpl;
|
71 | 74 | import org.apache.pulsar.client.impl.PulsarClientImpl;
|
72 | 75 | import org.apache.pulsar.client.impl.conf.ProducerConfigurationData;
|
| 76 | +import org.apache.pulsar.common.naming.TopicName; |
| 77 | +import org.apache.pulsar.common.partition.PartitionedTopicMetadata; |
| 78 | +import org.apache.pulsar.common.policies.data.ClusterData; |
73 | 79 | import org.apache.pulsar.common.policies.data.RetentionPolicies;
|
| 80 | +import org.apache.pulsar.common.policies.data.TenantInfo; |
74 | 81 | import org.apache.pulsar.common.policies.data.TopicStats;
|
75 | 82 | import org.apache.pulsar.common.util.collections.ConcurrentOpenHashMap;
|
76 |
| -import org.apache.pulsar.common.naming.TopicName; |
77 |
| -import org.apache.pulsar.common.partition.PartitionedTopicMetadata; |
78 | 83 | import org.apache.pulsar.common.util.FutureUtil;
|
79 | 84 | import org.awaitility.Awaitility;
|
80 | 85 | import org.awaitility.reflect.WhiteboxImpl;
|
@@ -915,6 +920,36 @@ protected void disableReplication(String topic) throws Exception {
|
915 | 920 | admin1.topics().setReplicationClusters(topic, Arrays.asList(cluster1, cluster2));
|
916 | 921 | }
|
917 | 922 |
|
| 923 | + @Test(timeOut = 30 * 1000) |
| 924 | + public void testCreateRemoteAdminFailed() throws Exception { |
| 925 | + final TenantInfo tenantInfo = admin1.tenants().getTenantInfo(defaultTenant); |
| 926 | + final String ns1 = defaultTenant + "/ns_" + UUID.randomUUID().toString().replace("-", ""); |
| 927 | + final String randomClusterName = "c_" + UUID.randomUUID().toString().replace("-", ""); |
| 928 | + final String topic = BrokerTestUtil.newUniqueName(ns1 + "/tp"); |
| 929 | + admin1.namespaces().createNamespace(ns1); |
| 930 | + admin1.topics().createPartitionedTopic(topic, 2); |
| 931 | + |
| 932 | + // Inject a wrong cluster data which with empty fields. |
| 933 | + ClusterResources clusterResources = broker1.getPulsar().getPulsarResources().getClusterResources(); |
| 934 | + clusterResources.createCluster(randomClusterName, ClusterData.builder().build()); |
| 935 | + Set<String> allowedClusters = new HashSet<>(tenantInfo.getAllowedClusters()); |
| 936 | + allowedClusters.add(randomClusterName); |
| 937 | + admin1.tenants().updateTenant(defaultTenant, TenantInfo.builder().adminRoles(tenantInfo.getAdminRoles()) |
| 938 | + .allowedClusters(allowedClusters).build()); |
| 939 | + |
| 940 | + // Verify. |
| 941 | + try { |
| 942 | + admin1.topics().setReplicationClusters(topic, Arrays.asList(cluster1, randomClusterName)); |
| 943 | + fail("Expected a error due to empty fields"); |
| 944 | + } catch (Exception ex) { |
| 945 | + // Expected an error. |
| 946 | + } |
| 947 | + |
| 948 | + // cleanup. |
| 949 | + admin1.topics().deletePartitionedTopic(topic); |
| 950 | + admin1.tenants().updateTenant(defaultTenant, tenantInfo); |
| 951 | + } |
| 952 | + |
918 | 953 | @Test
|
919 | 954 | public void testConfigReplicationStartAt() throws Exception {
|
920 | 955 | // Initialize.
|
|
0 commit comments