use of org.apache.kafka.common.config.ConfigResource in project kafka by apache.
the class MirrorConnectorsIntegrationBaseTest method getTopicConfig.
/*
* retrieve the config value based on the input cluster, topic and config name
*/
protected static String getTopicConfig(EmbeddedKafkaCluster cluster, String topic, String configName) throws Exception {
try (Admin client = cluster.createAdminClient()) {
Collection<ConfigResource> cr = Collections.singleton(new ConfigResource(ConfigResource.Type.TOPIC, topic));
DescribeConfigsResult configsResult = client.describeConfigs(cr);
Config allConfigs = (Config) configsResult.all().get().values().toArray()[0];
return allConfigs.get(configName).value();
}
}
use of org.apache.kafka.common.config.ConfigResource in project kafka by apache.
the class TopicAdmin method describeTopicConfigs.
/**
* Attempt to fetch the topic configurations for the given topics.
* Apache Kafka added support for describing topic configurations in 0.11.0.0, so this method
* works as expected with that and later versions. With brokers older than 0.11.0.0, this method
* is unable get the topic configurations and always returns an empty set.
*
* <p>An entry with a null Config is placed into the resulting map for any topic that does
* not exist on the brokers.
*
* @param topicNames the topics to obtain configurations
* @return the map of topic configurations for each existing topic, or an empty map if none
* of the topics exist
* @throws RetriableException if a retriable error occurs, the operation takes too long, or the
* thread is interrupted while attempting to perform this operation
* @throws ConnectException if a non retriable error occurs
*/
public Map<String, Config> describeTopicConfigs(String... topicNames) {
if (topicNames == null) {
return Collections.emptyMap();
}
Collection<String> topics = Arrays.stream(topicNames).filter(Objects::nonNull).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList());
if (topics.isEmpty()) {
return Collections.emptyMap();
}
String bootstrapServers = bootstrapServers();
String topicNameList = String.join(", ", topics);
Collection<ConfigResource> resources = topics.stream().map(t -> new ConfigResource(ConfigResource.Type.TOPIC, t)).collect(Collectors.toList());
Map<ConfigResource, KafkaFuture<Config>> newResults = admin.describeConfigs(resources, new DescribeConfigsOptions()).values();
// Iterate over each future so that we can handle individual failures like when some topics don't exist
Map<String, Config> result = new HashMap<>();
newResults.forEach((resource, configs) -> {
String topic = resource.name();
try {
result.put(topic, configs.get());
} catch (ExecutionException e) {
Throwable cause = e.getCause();
if (cause instanceof UnknownTopicOrPartitionException) {
log.debug("Topic '{}' does not exist on the brokers at {}", topic, bootstrapServers);
result.put(topic, null);
} else if (cause instanceof ClusterAuthorizationException || cause instanceof TopicAuthorizationException) {
log.debug("Not authorized to describe topic config for topic '{}' on brokers at {}", topic, bootstrapServers);
} else if (cause instanceof UnsupportedVersionException) {
log.debug("API to describe topic config for topic '{}' is unsupported on brokers at {}", topic, bootstrapServers);
} else if (cause instanceof TimeoutException) {
String msg = String.format("Timed out while waiting to describe topic config for topic '%s' on brokers at %s", topic, bootstrapServers);
throw new RetriableException(msg, e);
} else {
String msg = String.format("Error while attempting to describe topic config for topic '%s' on brokers at %s", topic, bootstrapServers);
throw new ConnectException(msg, e);
}
} catch (InterruptedException e) {
Thread.interrupted();
String msg = String.format("Interrupted while attempting to describe topic configs '%s'", topicNameList);
throw new RetriableException(msg, e);
}
});
return result;
}
use of org.apache.kafka.common.config.ConfigResource in project kafka by apache.
the class KafkaAdminClient method alterConfigs.
@Override
@Deprecated
public AlterConfigsResult alterConfigs(Map<ConfigResource, Config> configs, final AlterConfigsOptions options) {
final Map<ConfigResource, KafkaFutureImpl<Void>> allFutures = new HashMap<>();
// We must make a separate AlterConfigs request for every BROKER resource we want to alter
// and send the request to that specific broker. Other resources are grouped together into
// a single request that may be sent to any broker.
final Collection<ConfigResource> unifiedRequestResources = new ArrayList<>();
for (ConfigResource resource : configs.keySet()) {
Integer node = nodeFor(resource);
if (node != null) {
NodeProvider nodeProvider = new ConstantNodeIdProvider(node);
allFutures.putAll(alterConfigs(configs, options, Collections.singleton(resource), nodeProvider));
} else
unifiedRequestResources.add(resource);
}
if (!unifiedRequestResources.isEmpty())
allFutures.putAll(alterConfigs(configs, options, unifiedRequestResources, new LeastLoadedNodeProvider()));
return new AlterConfigsResult(new HashMap<>(allFutures));
}
use of org.apache.kafka.common.config.ConfigResource in project kafka by apache.
the class KafkaAdminClient method incrementalAlterConfigs.
private Map<ConfigResource, KafkaFutureImpl<Void>> incrementalAlterConfigs(Map<ConfigResource, Collection<AlterConfigOp>> configs, final AlterConfigsOptions options, Collection<ConfigResource> resources, NodeProvider nodeProvider) {
final Map<ConfigResource, KafkaFutureImpl<Void>> futures = new HashMap<>();
for (ConfigResource resource : resources) futures.put(resource, new KafkaFutureImpl<>());
final long now = time.milliseconds();
runnable.call(new Call("incrementalAlterConfigs", calcDeadlineMs(now, options.timeoutMs()), nodeProvider) {
@Override
public IncrementalAlterConfigsRequest.Builder createRequest(int timeoutMs) {
return new IncrementalAlterConfigsRequest.Builder(resources, configs, options.shouldValidateOnly());
}
@Override
public void handleResponse(AbstractResponse abstractResponse) {
IncrementalAlterConfigsResponse response = (IncrementalAlterConfigsResponse) abstractResponse;
Map<ConfigResource, ApiError> errors = IncrementalAlterConfigsResponse.fromResponseData(response.data());
for (Map.Entry<ConfigResource, KafkaFutureImpl<Void>> entry : futures.entrySet()) {
KafkaFutureImpl<Void> future = entry.getValue();
ApiException exception = errors.get(entry.getKey()).exception();
if (exception != null) {
future.completeExceptionally(exception);
} else {
future.complete(null);
}
}
}
@Override
void handleFailure(Throwable throwable) {
completeAllExceptionally(futures.values(), throwable);
}
}, now);
return futures;
}
use of org.apache.kafka.common.config.ConfigResource in project kafka by apache.
the class KafkaAdminClientTest method callAdminClientApisAndExpectAnAuthenticationError.
private void callAdminClientApisAndExpectAnAuthenticationError(AdminClientUnitTestEnv env) throws InterruptedException {
ExecutionException e = assertThrows(ExecutionException.class, () -> env.adminClient().createTopics(singleton(new NewTopic("myTopic", Collections.singletonMap(0, asList(0, 1, 2)))), new CreateTopicsOptions().timeoutMs(10000)).all().get());
assertTrue(e.getCause() instanceof AuthenticationException, "Expected an authentication error, but got " + Utils.stackTrace(e));
Map<String, NewPartitions> counts = new HashMap<>();
counts.put("my_topic", NewPartitions.increaseTo(3));
counts.put("other_topic", NewPartitions.increaseTo(3, asList(asList(2), asList(3))));
e = assertThrows(ExecutionException.class, () -> env.adminClient().createPartitions(counts).all().get());
assertTrue(e.getCause() instanceof AuthenticationException, "Expected an authentication error, but got " + Utils.stackTrace(e));
e = assertThrows(ExecutionException.class, () -> env.adminClient().createAcls(asList(ACL1, ACL2)).all().get());
assertTrue(e.getCause() instanceof AuthenticationException, "Expected an authentication error, but got " + Utils.stackTrace(e));
e = assertThrows(ExecutionException.class, () -> env.adminClient().describeAcls(FILTER1).values().get());
assertTrue(e.getCause() instanceof AuthenticationException, "Expected an authentication error, but got " + Utils.stackTrace(e));
e = assertThrows(ExecutionException.class, () -> env.adminClient().deleteAcls(asList(FILTER1, FILTER2)).all().get());
assertTrue(e.getCause() instanceof AuthenticationException, "Expected an authentication error, but got " + Utils.stackTrace(e));
e = assertThrows(ExecutionException.class, () -> env.adminClient().describeConfigs(singleton(new ConfigResource(ConfigResource.Type.BROKER, "0"))).all().get());
assertTrue(e.getCause() instanceof AuthenticationException, "Expected an authentication error, but got " + Utils.stackTrace(e));
}
Aggregations