Package org.apache.pulsar.broker.web
Class PulsarWebResource
java.lang.Object
org.apache.pulsar.broker.web.PulsarWebResource
- Direct Known Subclasses:
AdminResource,TenantsBase,TopicLookupBase
Base class for Web resources in Pulsar. It provides basic authorization functions.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected javax.servlet.http.HttpServletRequestprotected javax.servlet.ServletContextprotected javax.ws.rs.core.UriInfo -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected org.apache.pulsar.broker.resources.BookieResourcesprotected CompletableFuture<Void>protected static CompletableFuture<Void>checkAuthorizationAsync(PulsarService pulsarService, org.apache.pulsar.common.naming.TopicName topicName, String role, org.apache.pulsar.broker.authentication.AuthenticationDataSource authenticationData) static CompletableFuture<org.apache.pulsar.common.policies.data.ClusterDataImpl>checkLocalOrGetPeerReplicationCluster(PulsarService pulsarService, org.apache.pulsar.common.naming.NamespaceName namespace) static CompletableFuture<org.apache.pulsar.common.policies.data.ClusterDataImpl>checkLocalOrGetPeerReplicationCluster(PulsarService pulsarService, org.apache.pulsar.common.naming.NamespaceName namespace, boolean allowDeletedNamespace) Gets a caller id (IP + role).org.apache.pulsar.broker.authentication.AuthenticationDataSourceprotected org.apache.pulsar.broker.resources.ClusterResourcesprotected org.apache.pulsar.broker.ServiceConfigurationconfig()protected org.apache.pulsar.broker.resources.DynamicConfigurationResourcesprotected static CompletableFuture<org.apache.pulsar.common.policies.data.ClusterData>getClusterDataIfDifferentCluster(PulsarService pulsar, String cluster, String clientAppId) protected org.apache.pulsar.broker.resources.LocalPoliciesResourcesprotected org.apache.pulsar.broker.resources.PulsarResourcesprotected CompletableFuture<Void>hasActiveNamespace(String tenant) protected booleanprotected CompletableFuture<Boolean>isBundleOwnedByAnyBroker(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange) Checks whether a given bundle is currently loaded by any broker.static booleanisClientAuthenticated(String appId) protected booleanprotected static booleanisLeaderBroker(PulsarService pulsar) booleanstatic com.fasterxml.jackson.databind.ObjectMapperprotected org.apache.pulsar.broker.resources.NamespaceResources.IsolationPolicyResourcesprotected org.apache.pulsar.broker.resources.NamespaceResourcesprotected PulsarServicepulsar()protected org.apache.pulsar.broker.resources.ResourceGroupResourcesprotected static voidresumeAsyncResponseExceptionally(javax.ws.rs.container.AsyncResponse asyncResponse, Throwable exception) voidsetPulsar(PulsarService pulsar) static String<T> Tsync(Supplier<CompletableFuture<T>> supplier) protected org.apache.pulsar.broker.resources.TenantResourcesprotected org.apache.pulsar.broker.resources.TopicResourcesprotected voidvalidateAdminAccessForTenant(String tenant) Checks that the http client role has admin access to the specified tenant.protected voidvalidateAdminAccessForTenant(PulsarService pulsar, String clientAppId, String originalPrincipal, String tenant, org.apache.pulsar.broker.authentication.AuthenticationDataSource authenticationData, long timeout, TimeUnit unit) protected CompletableFuture<Void>Checks that the http client role has admin access to the specified tenant async.protected CompletableFuture<Void>validateAdminAccessForTenantAsync(PulsarService pulsar, String clientAppId, String originalPrincipal, String tenant, org.apache.pulsar.broker.authentication.AuthenticationDataSource authenticationData) protected voidvalidateBrokerName(String broker) Redirect the call to the specified broker.protected voidvalidateBundleOwnership(String tenant, String cluster, String namespace, boolean authoritative, boolean readOnly, NamespaceBundle bundle) voidvalidateBundleOwnership(NamespaceBundle bundle, boolean authoritative, boolean readOnly) validateBundleOwnershipAsync(NamespaceBundle bundle, boolean authoritative, boolean readOnly) protected voidvalidateClusterExists(String cluster) protected voidvalidateClusterForTenant(String tenant, String cluster) protected CompletableFuture<Void>validateClusterForTenantAsync(String tenant, String cluster) protected voidvalidateClusterOwnership(String cluster) Check if the cluster exists and redirect the call to the owning cluster.protected CompletableFuture<Void>validateClusterOwnershipAsync(String cluster) protected voidvalidateGlobalNamespaceOwnership(org.apache.pulsar.common.naming.NamespaceName namespace) If the namespace is global, validate the following - 1.protected CompletableFuture<Void>validateGlobalNamespaceOwnershipAsync(org.apache.pulsar.common.naming.NamespaceName namespace) protected NamespaceBundlevalidateNamespaceBundleOwnership(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange, boolean authoritative, boolean readOnly) protected CompletableFuture<NamespaceBundle>validateNamespaceBundleOwnershipAsync(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange, boolean authoritative, boolean readOnly) protected NamespaceBundlevalidateNamespaceBundleRange(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange) voidvalidateNamespaceOperation(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.NamespaceOperation operation) validateNamespaceOperationAsync(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.NamespaceOperation operation) voidvalidateNamespacePolicyOperation(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) validateNamespacePolicyOperationAsync(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) protected voidvalidatePeerClusterConflict(String clusterName, Set<String> replicationClusters) It validates that peer-clusters can't coexist in replication-clusters.protected CompletableFuture<Void>validatePeerClusterConflictAsync(String clusterName, Set<String> replicationClusters) voidvoidChecks whether the user has Pulsar Super-User access to the system.voidvalidateTenantOperation(String tenant, org.apache.pulsar.common.policies.data.TenantOperation operation) validateTenantOperationAsync(String tenant, org.apache.pulsar.common.policies.data.TenantOperation operation) voidvalidateTopicOperation(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation) voidvalidateTopicOperation(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation, String subscription) validateTopicOperationAsync(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation) validateTopicOperationAsync(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation, String subscription) protected voidvalidateTopicOwnership(org.apache.pulsar.common.naming.TopicName topicName, boolean authoritative) Checks whether the broker is the owner of the namespace.protected CompletableFuture<Void>validateTopicOwnershipAsync(org.apache.pulsar.common.naming.TopicName topicName, boolean authoritative) voidvalidateTopicPolicyOperation(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) validateTopicPolicyOperationAsync(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation)
-
Field Details
-
servletContext
@Context protected javax.servlet.ServletContext servletContext -
httpRequest
@Context protected javax.servlet.http.HttpServletRequest httpRequest -
uri
@Context protected javax.ws.rs.core.UriInfo uri
-
-
Constructor Details
-
PulsarWebResource
public PulsarWebResource()
-
-
Method Details
-
pulsar
-
config
protected org.apache.pulsar.broker.ServiceConfiguration config() -
splitPath
-
clientAppId
Gets a caller id (IP + role).- Returns:
- the web service caller identification
-
originalPrincipal
-
clientAuthData
public org.apache.pulsar.broker.authentication.AuthenticationDataSource clientAuthData() -
isRequestHttps
public boolean isRequestHttps() -
isClientAuthenticated
-
hasSuperUserAccess
protected boolean hasSuperUserAccess() -
validateSuperUserAccessAsync
-
validateSuperUserAccess
public void validateSuperUserAccess()Checks whether the user has Pulsar Super-User access to the system.- Throws:
javax.ws.rs.WebApplicationException- if not authorized
-
validateAdminAccessForTenant
Checks that the http client role has admin access to the specified tenant.- Parameters:
tenant- the tenant id- Throws:
javax.ws.rs.WebApplicationException- if not authorized
-
validateAdminAccessForTenant
protected void validateAdminAccessForTenant(PulsarService pulsar, String clientAppId, String originalPrincipal, String tenant, org.apache.pulsar.broker.authentication.AuthenticationDataSource authenticationData, long timeout, TimeUnit unit) -
validateAdminAccessForTenantAsync
Checks that the http client role has admin access to the specified tenant async.- Parameters:
tenant- the tenant id
-
validateAdminAccessForTenantAsync
protected CompletableFuture<Void> validateAdminAccessForTenantAsync(PulsarService pulsar, String clientAppId, String originalPrincipal, String tenant, org.apache.pulsar.broker.authentication.AuthenticationDataSource authenticationData) -
validatePeerClusterConflict
It validates that peer-clusters can't coexist in replication-clusters. -
validatePeerClusterConflictAsync
protected CompletableFuture<Void> validatePeerClusterConflictAsync(String clusterName, Set<String> replicationClusters) -
validateClusterForTenant
-
validateClusterForTenantAsync
-
validateClusterOwnershipAsync
-
validateClusterOwnership
Check if the cluster exists and redirect the call to the owning cluster.- Parameters:
cluster- Cluster name- Throws:
Exception- In case the redirect happensjavax.ws.rs.WebApplicationException
-
getClusterDataIfDifferentCluster
protected static CompletableFuture<org.apache.pulsar.common.policies.data.ClusterData> getClusterDataIfDifferentCluster(PulsarService pulsar, String cluster, String clientAppId) -
validateBundleOwnership
protected void validateBundleOwnership(String tenant, String cluster, String namespace, boolean authoritative, boolean readOnly, NamespaceBundle bundle) -
validateNamespaceBundleRange
protected NamespaceBundle validateNamespaceBundleRange(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange) -
isBundleOwnedByAnyBroker
protected CompletableFuture<Boolean> isBundleOwnedByAnyBroker(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange) Checks whether a given bundle is currently loaded by any broker. -
validateNamespaceBundleOwnership
protected NamespaceBundle validateNamespaceBundleOwnership(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange, boolean authoritative, boolean readOnly) -
validateNamespaceBundleOwnershipAsync
protected CompletableFuture<NamespaceBundle> validateNamespaceBundleOwnershipAsync(org.apache.pulsar.common.naming.NamespaceName fqnn, org.apache.pulsar.common.policies.data.BundlesData bundles, String bundleRange, boolean authoritative, boolean readOnly) -
validateBundleOwnership
public void validateBundleOwnership(NamespaceBundle bundle, boolean authoritative, boolean readOnly) throws Exception - Throws:
Exception
-
validateBundleOwnershipAsync
public CompletableFuture<Void> validateBundleOwnershipAsync(NamespaceBundle bundle, boolean authoritative, boolean readOnly) -
validateTopicOwnership
protected void validateTopicOwnership(org.apache.pulsar.common.naming.TopicName topicName, boolean authoritative) Checks whether the broker is the owner of the namespace. Otherwise it will raise an exception to redirect the client to the appropriate broker. If no broker owns the namespace yet, this function will try to acquire the ownership by default.- Parameters:
topicName- topic nameauthoritative-
-
validateTopicOwnershipAsync
protected CompletableFuture<Void> validateTopicOwnershipAsync(org.apache.pulsar.common.naming.TopicName topicName, boolean authoritative) -
validateGlobalNamespaceOwnership
protected void validateGlobalNamespaceOwnership(org.apache.pulsar.common.naming.NamespaceName namespace) If the namespace is global, validate the following - 1. If replicated clusters are configured for this global namespace 2. If local cluster belonging to this namespace is replicated 3. If replication is enabled for this namespace
It validates if local cluster is part of replication-cluster. If local cluster is not part of the replication cluster then it redirects request to peer-cluster if any of the peer-cluster is part of replication-cluster of this namespace. If none of the cluster is part of the replication cluster then it fails the validation.- Parameters:
namespace-- Throws:
Exception
-
validateGlobalNamespaceOwnershipAsync
protected CompletableFuture<Void> validateGlobalNamespaceOwnershipAsync(org.apache.pulsar.common.naming.NamespaceName namespace) -
checkLocalOrGetPeerReplicationCluster
public static CompletableFuture<org.apache.pulsar.common.policies.data.ClusterDataImpl> checkLocalOrGetPeerReplicationCluster(PulsarService pulsarService, org.apache.pulsar.common.naming.NamespaceName namespace) -
checkLocalOrGetPeerReplicationCluster
public static CompletableFuture<org.apache.pulsar.common.policies.data.ClusterDataImpl> checkLocalOrGetPeerReplicationCluster(PulsarService pulsarService, org.apache.pulsar.common.naming.NamespaceName namespace, boolean allowDeletedNamespace) -
checkAuthorizationAsync
protected static CompletableFuture<Void> checkAuthorizationAsync(PulsarService pulsarService, org.apache.pulsar.common.naming.TopicName topicName, String role, org.apache.pulsar.broker.authentication.AuthenticationDataSource authenticationData) -
setPulsar
-
isLeaderBroker
protected boolean isLeaderBroker() -
isLeaderBroker
-
validateTenantOperation
public void validateTenantOperation(String tenant, org.apache.pulsar.common.policies.data.TenantOperation operation) -
validateTenantOperationAsync
public CompletableFuture<Void> validateTenantOperationAsync(String tenant, org.apache.pulsar.common.policies.data.TenantOperation operation) -
validateNamespaceOperation
public void validateNamespaceOperation(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.NamespaceOperation operation) -
validateNamespaceOperationAsync
public CompletableFuture<Void> validateNamespaceOperationAsync(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.NamespaceOperation operation) -
validateNamespacePolicyOperation
public void validateNamespacePolicyOperation(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) -
validateNamespacePolicyOperationAsync
public CompletableFuture<Void> validateNamespacePolicyOperationAsync(org.apache.pulsar.common.naming.NamespaceName namespaceName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) -
getPulsarResources
protected org.apache.pulsar.broker.resources.PulsarResources getPulsarResources() -
tenantResources
protected org.apache.pulsar.broker.resources.TenantResources tenantResources() -
clusterResources
protected org.apache.pulsar.broker.resources.ClusterResources clusterResources() -
bookieResources
protected org.apache.pulsar.broker.resources.BookieResources bookieResources() -
topicResources
protected org.apache.pulsar.broker.resources.TopicResources topicResources() -
namespaceResources
protected org.apache.pulsar.broker.resources.NamespaceResources namespaceResources() -
resourceGroupResources
protected org.apache.pulsar.broker.resources.ResourceGroupResources resourceGroupResources() -
getLocalPolicies
protected org.apache.pulsar.broker.resources.LocalPoliciesResources getLocalPolicies() -
namespaceIsolationPolicies
protected org.apache.pulsar.broker.resources.NamespaceResources.IsolationPolicyResources namespaceIsolationPolicies() -
dynamicConfigurationResources
protected org.apache.pulsar.broker.resources.DynamicConfigurationResources dynamicConfigurationResources() -
jsonMapper
public static com.fasterxml.jackson.databind.ObjectMapper jsonMapper() -
validatePoliciesReadOnlyAccess
public void validatePoliciesReadOnlyAccess() -
validatePoliciesReadOnlyAccessAsync
-
hasActiveNamespace
-
validateClusterExists
-
canUpdateCluster
-
validateBrokerName
Redirect the call to the specified broker.- Parameters:
broker- Broker name
-
validateTopicPolicyOperation
public void validateTopicPolicyOperation(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) -
validateTopicPolicyOperationAsync
public CompletableFuture<Void> validateTopicPolicyOperationAsync(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.PolicyName policy, org.apache.pulsar.common.policies.data.PolicyOperation operation) -
validateTopicOperation
public void validateTopicOperation(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation) -
validateTopicOperation
public void validateTopicOperation(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation, String subscription) -
validateTopicOperationAsync
public CompletableFuture<Void> validateTopicOperationAsync(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation) -
validateTopicOperationAsync
public CompletableFuture<Void> validateTopicOperationAsync(org.apache.pulsar.common.naming.TopicName topicName, org.apache.pulsar.common.policies.data.TopicOperation operation, String subscription) -
sync
-
resumeAsyncResponseExceptionally
protected static void resumeAsyncResponseExceptionally(javax.ws.rs.container.AsyncResponse asyncResponse, Throwable exception)
-