blob: d721c08a5a554f66cd92dddc15befd20d831665c [file] [log] [blame]
/**
* 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.client.admin.internal;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.InvocationCallback;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import org.apache.pulsar.client.admin.Clusters;
import org.apache.pulsar.client.admin.PulsarAdminException;
import org.apache.pulsar.client.api.Authentication;
import org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationData;
import org.apache.pulsar.common.policies.data.ClusterData;
import org.apache.pulsar.common.policies.data.FailureDomain;
import org.apache.pulsar.common.policies.data.NamespaceIsolationData;
public class ClustersImpl extends BaseResource implements Clusters {
private final WebTarget adminClusters;
public ClustersImpl(WebTarget web, Authentication auth, long readTimeoutMs) {
super(auth, readTimeoutMs);
adminClusters = web.path("/admin/v2/clusters");
}
@Override
public List<String> getClusters() throws PulsarAdminException {
try {
return getClustersAsync().get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<List<String>> getClustersAsync() {
final CompletableFuture<List<String>> future = new CompletableFuture<>();
asyncGetRequest(adminClusters,
new InvocationCallback<List<String>>() {
@Override
public void completed(List<String> clusters) {
future.complete(clusters);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public ClusterData getCluster(String cluster) throws PulsarAdminException {
try {
return getClusterAsync(cluster).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<ClusterData> getClusterAsync(String cluster) {
WebTarget path = adminClusters.path(cluster);
final CompletableFuture<ClusterData> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<ClusterData>() {
@Override
public void completed(ClusterData clusterData) {
future.complete(clusterData);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public void createCluster(String cluster, ClusterData clusterData) throws PulsarAdminException {
try {
createClusterAsync(cluster, clusterData).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Void> createClusterAsync(String cluster, ClusterData clusterData) {
WebTarget path = adminClusters.path(cluster);
return asyncPutRequest(path, Entity.entity(clusterData, MediaType.APPLICATION_JSON));
}
@Override
public void updateCluster(String cluster, ClusterData clusterData) throws PulsarAdminException {
try {
updateClusterAsync(cluster, clusterData).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Void> updateClusterAsync(String cluster, ClusterData clusterData) {
WebTarget path = adminClusters.path(cluster);
return asyncPostRequest(path, Entity.entity(clusterData, MediaType.APPLICATION_JSON_TYPE));
}
@Override
public void updatePeerClusterNames(
String cluster, LinkedHashSet<String> peerClusterNames) throws PulsarAdminException {
try {
updatePeerClusterNamesAsync(cluster, peerClusterNames).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Void> updatePeerClusterNamesAsync(String cluster, LinkedHashSet<String> peerClusterNames) {
WebTarget path = adminClusters.path(cluster).path("peers");
return asyncPostRequest(path, Entity.entity(peerClusterNames, MediaType.APPLICATION_JSON));
}
@Override
@SuppressWarnings("unchecked")
public Set<String> getPeerClusterNames(String cluster) throws PulsarAdminException {
try {
return getPeerClusterNamesAsync(cluster).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Set<String>> getPeerClusterNamesAsync(String cluster) {
WebTarget path = adminClusters.path(cluster).path("peers");
final CompletableFuture<Set<String>> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<Set<String>>() {
@Override
public void completed(Set<String> clusterNames) {
future.complete(clusterNames);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public void deleteCluster(String cluster) throws PulsarAdminException {
try {
deleteClusterAsync(cluster).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Void> deleteClusterAsync(String cluster) {
WebTarget path = adminClusters.path(cluster);
return asyncDeleteRequest(path);
}
@Override
public Map<String, NamespaceIsolationData> getNamespaceIsolationPolicies(String cluster)
throws PulsarAdminException {
try {
return getNamespaceIsolationPoliciesAsync(cluster).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Map<String, NamespaceIsolationData>> getNamespaceIsolationPoliciesAsync(String cluster) {
WebTarget path = adminClusters.path(cluster).path("namespaceIsolationPolicies");
final CompletableFuture<Map<String, NamespaceIsolationData>> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<Map<String, NamespaceIsolationData>>() {
@Override
public void completed(Map<String, NamespaceIsolationData> stringNamespaceIsolationDataMap) {
future.complete(stringNamespaceIsolationDataMap);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public List<BrokerNamespaceIsolationData> getBrokersWithNamespaceIsolationPolicy(String cluster)
throws PulsarAdminException {
try {
return getBrokersWithNamespaceIsolationPolicyAsync(cluster).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<List<BrokerNamespaceIsolationData>> getBrokersWithNamespaceIsolationPolicyAsync(
String cluster) {
WebTarget path = adminClusters.path(cluster).path("namespaceIsolationPolicies").path("brokers");
final CompletableFuture<List<BrokerNamespaceIsolationData>> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<List<BrokerNamespaceIsolationData>>() {
@Override
public void completed(List<BrokerNamespaceIsolationData> brokerNamespaceIsolationData) {
future.complete(brokerNamespaceIsolationData);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public BrokerNamespaceIsolationData getBrokerWithNamespaceIsolationPolicy(String cluster, String broker)
throws PulsarAdminException {
try {
return getBrokerWithNamespaceIsolationPolicyAsync(cluster, broker)
.get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<BrokerNamespaceIsolationData> getBrokerWithNamespaceIsolationPolicyAsync(
String cluster, String broker) {
WebTarget path = adminClusters.path(cluster).path("namespaceIsolationPolicies").path("brokers").path(broker);
final CompletableFuture<BrokerNamespaceIsolationData> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<BrokerNamespaceIsolationData>() {
@Override
public void completed(BrokerNamespaceIsolationData brokerNamespaceIsolationData) {
future.complete(brokerNamespaceIsolationData);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public void createNamespaceIsolationPolicy(String cluster, String policyName,
NamespaceIsolationData namespaceIsolationData) throws PulsarAdminException {
setNamespaceIsolationPolicy(cluster, policyName, namespaceIsolationData);
}
@Override
public CompletableFuture<Void> createNamespaceIsolationPolicyAsync(
String cluster, String policyName, NamespaceIsolationData namespaceIsolationData) {
return setNamespaceIsolationPolicyAsync(cluster, policyName, namespaceIsolationData);
}
@Override
public void updateNamespaceIsolationPolicy(String cluster, String policyName,
NamespaceIsolationData namespaceIsolationData) throws PulsarAdminException {
setNamespaceIsolationPolicy(cluster, policyName, namespaceIsolationData);
}
@Override
public CompletableFuture<Void> updateNamespaceIsolationPolicyAsync(
String cluster, String policyName, NamespaceIsolationData namespaceIsolationData) {
return setNamespaceIsolationPolicyAsync(cluster, policyName, namespaceIsolationData);
}
@Override
public void deleteNamespaceIsolationPolicy(String cluster, String policyName) throws PulsarAdminException {
try {
deleteNamespaceIsolationPolicyAsync(cluster, policyName).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Void> deleteNamespaceIsolationPolicyAsync(String cluster, String policyName) {
WebTarget path = adminClusters.path(cluster).path("namespaceIsolationPolicies").path(policyName);
return asyncDeleteRequest(path);
}
private void setNamespaceIsolationPolicy(String cluster, String policyName,
NamespaceIsolationData namespaceIsolationData) throws PulsarAdminException {
try {
setNamespaceIsolationPolicyAsync(cluster, policyName, namespaceIsolationData)
.get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
private CompletableFuture<Void> setNamespaceIsolationPolicyAsync(String cluster, String policyName,
NamespaceIsolationData namespaceIsolationData) {
WebTarget path = adminClusters.path(cluster).path("namespaceIsolationPolicies").path(policyName);
return asyncPostRequest(path, Entity.entity(namespaceIsolationData, MediaType.APPLICATION_JSON));
}
@Override
public NamespaceIsolationData getNamespaceIsolationPolicy(String cluster, String policyName)
throws PulsarAdminException {
try {
return getNamespaceIsolationPolicyAsync(cluster, policyName)
.get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<NamespaceIsolationData> getNamespaceIsolationPolicyAsync(
String cluster, String policyName) {
WebTarget path = adminClusters.path(cluster).path("namespaceIsolationPolicies").path(policyName);
final CompletableFuture<NamespaceIsolationData> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<NamespaceIsolationData>() {
@Override
public void completed(NamespaceIsolationData namespaceIsolationData) {
future.complete(namespaceIsolationData);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public void createFailureDomain(String cluster, String domainName, FailureDomain domain)
throws PulsarAdminException {
setDomain(cluster, domainName, domain);
}
@Override
public CompletableFuture<Void> createFailureDomainAsync(String cluster, String domainName, FailureDomain domain) {
return setDomainAsync(cluster, domainName, domain);
}
@Override
public void updateFailureDomain(String cluster, String domainName, FailureDomain domain)
throws PulsarAdminException {
setDomain(cluster, domainName, domain);
}
@Override
public CompletableFuture<Void> updateFailureDomainAsync(String cluster, String domainName, FailureDomain domain) {
return setDomainAsync(cluster, domainName, domain);
}
@Override
public void deleteFailureDomain(String cluster, String domainName) throws PulsarAdminException {
try {
deleteFailureDomainAsync(cluster, domainName).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Void> deleteFailureDomainAsync(String cluster, String domainName) {
WebTarget path = adminClusters.path(cluster).path("failureDomains").path(domainName);
return asyncDeleteRequest(path);
}
@Override
public Map<String, FailureDomain> getFailureDomains(String cluster) throws PulsarAdminException {
try {
return getFailureDomainsAsync(cluster).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<Map<String, FailureDomain>> getFailureDomainsAsync(String cluster) {
WebTarget path = adminClusters.path(cluster).path("failureDomains");
final CompletableFuture<Map<String, FailureDomain>> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<Map<String, FailureDomain>>() {
@Override
public void completed(Map<String, FailureDomain> failureDomains) {
future.complete(failureDomains);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
@Override
public FailureDomain getFailureDomain(String cluster, String domainName) throws PulsarAdminException {
try {
return getFailureDomainAsync(cluster, domainName).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
@Override
public CompletableFuture<FailureDomain> getFailureDomainAsync(String cluster, String domainName) {
WebTarget path = adminClusters.path(cluster).path("failureDomains").path(domainName);
final CompletableFuture<FailureDomain> future = new CompletableFuture<>();
asyncGetRequest(path,
new InvocationCallback<FailureDomain>() {
@Override
public void completed(FailureDomain failureDomain) {
future.complete(failureDomain);
}
@Override
public void failed(Throwable throwable) {
future.completeExceptionally(getApiException(throwable.getCause()));
}
});
return future;
}
private void setDomain(String cluster, String domainName,
FailureDomain domain) throws PulsarAdminException {
try {
setDomainAsync(cluster, domainName, domain).get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
throw (PulsarAdminException) e.getCause();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PulsarAdminException(e);
} catch (TimeoutException e) {
throw new PulsarAdminException.TimeoutException(e);
}
}
private CompletableFuture<Void> setDomainAsync(String cluster, String domainName,
FailureDomain domain) {
WebTarget path = adminClusters.path(cluster).path("failureDomains").path(domainName);
return asyncPostRequest(path, Entity.entity(domain, MediaType.APPLICATION_JSON));
}
}