Search in sources :

Example 1 with ValidationResult

use of org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult in project kafka by apache.

the class InternalTopicManagerTest method shouldReportMisconfigurationsOfCleanupPolicyForRepartitionTopics.

@Test
public void shouldReportMisconfigurationsOfCleanupPolicyForRepartitionTopics() {
    final long retentionMs = 1000;
    setupTopicInMockAdminClient(topic1, repartitionTopicConfig());
    final Map<String, String> repartitionTopicConfigCleanupPolicyCompact = repartitionTopicConfig();
    repartitionTopicConfigCleanupPolicyCompact.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_COMPACT);
    setupTopicInMockAdminClient(topic2, repartitionTopicConfigCleanupPolicyCompact);
    final Map<String, String> repartitionTopicConfigCleanupPolicyCompactAndDelete = repartitionTopicConfig();
    repartitionTopicConfigCleanupPolicyCompactAndDelete.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_COMPACT + "," + TopicConfig.CLEANUP_POLICY_DELETE);
    setupTopicInMockAdminClient(topic3, repartitionTopicConfigCleanupPolicyCompactAndDelete);
    final Map<String, String> repartitionTopicConfigWithFiniteRetentionMs = repartitionTopicConfig();
    repartitionTopicConfigWithFiniteRetentionMs.put(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(retentionMs));
    setupTopicInMockAdminClient(topic4, repartitionTopicConfigWithFiniteRetentionMs);
    final Map<String, String> repartitionTopicConfigWithRetentionBytesSet = repartitionTopicConfig();
    repartitionTopicConfigWithRetentionBytesSet.put(TopicConfig.RETENTION_BYTES_CONFIG, "1024");
    setupTopicInMockAdminClient(topic5, repartitionTopicConfigWithRetentionBytesSet);
    final InternalTopicConfig internalTopicConfig1 = setupRepartitionTopicConfig(topic1, 1);
    final InternalTopicConfig internalTopicConfig2 = setupRepartitionTopicConfig(topic2, 1);
    final InternalTopicConfig internalTopicConfig3 = setupRepartitionTopicConfig(topic3, 1);
    final InternalTopicConfig internalTopicConfig4 = setupRepartitionTopicConfig(topic4, 1);
    final InternalTopicConfig internalTopicConfig5 = setupRepartitionTopicConfig(topic5, 1);
    final ValidationResult validationResult = internalTopicManager.validate(mkMap(mkEntry(topic1, internalTopicConfig1), mkEntry(topic2, internalTopicConfig2), mkEntry(topic3, internalTopicConfig3), mkEntry(topic4, internalTopicConfig4), mkEntry(topic5, internalTopicConfig5)));
    final Map<String, List<String>> misconfigurationsForTopics = validationResult.misconfigurationsForTopics();
    assertThat(validationResult.missingTopics(), empty());
    assertThat(misconfigurationsForTopics.size(), is(4));
    assertThat(misconfigurationsForTopics, hasKey(topic2));
    assertThat(misconfigurationsForTopics.get(topic2).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic2).get(0), is("Cleanup policy (" + TopicConfig.CLEANUP_POLICY_CONFIG + ") of existing internal topic " + topic2 + " should not contain \"" + TopicConfig.CLEANUP_POLICY_COMPACT + "\"."));
    assertThat(misconfigurationsForTopics, hasKey(topic3));
    assertThat(misconfigurationsForTopics.get(topic3).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic3).get(0), is("Cleanup policy (" + TopicConfig.CLEANUP_POLICY_CONFIG + ") of existing internal topic " + topic3 + " should not contain \"" + TopicConfig.CLEANUP_POLICY_COMPACT + "\"."));
    assertThat(misconfigurationsForTopics, hasKey(topic4));
    assertThat(misconfigurationsForTopics.get(topic4).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic4).get(0), is("Retention time (" + TopicConfig.RETENTION_MS_CONFIG + ") of existing internal topic " + topic4 + " is " + retentionMs + " but should be -1."));
    assertThat(misconfigurationsForTopics, hasKey(topic5));
    assertThat(misconfigurationsForTopics.get(topic5).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic5).get(0), is("Retention byte (" + TopicConfig.RETENTION_BYTES_CONFIG + ") of existing internal topic " + topic5 + " is set but it should be unset."));
}
Also used : List(java.util.List) ArrayList(java.util.ArrayList) ValidationResult(org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult) Test(org.junit.Test)

Example 2 with ValidationResult

use of org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult in project kafka by apache.

the class InternalTopicManagerTest method shouldReportMisconfigurationsOfCleanupPolicyForUnwindowedChangelogTopics.

@Test
public void shouldReportMisconfigurationsOfCleanupPolicyForUnwindowedChangelogTopics() {
    final Map<String, String> unwindowedChangelogConfigWithDeleteCleanupPolicy = unwindowedChangelogConfig();
    unwindowedChangelogConfigWithDeleteCleanupPolicy.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_DELETE);
    setupTopicInMockAdminClient(topic1, unwindowedChangelogConfigWithDeleteCleanupPolicy);
    final Map<String, String> unwindowedChangelogConfigWithDeleteCompactCleanupPolicy = unwindowedChangelogConfig();
    unwindowedChangelogConfigWithDeleteCompactCleanupPolicy.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_COMPACT + "," + TopicConfig.CLEANUP_POLICY_DELETE);
    setupTopicInMockAdminClient(topic2, unwindowedChangelogConfigWithDeleteCompactCleanupPolicy);
    setupTopicInMockAdminClient(topic3, unwindowedChangelogConfig());
    final InternalTopicConfig internalTopicConfig1 = setupUnwindowedChangelogTopicConfig(topic1, 1);
    final InternalTopicConfig internalTopicConfig2 = setupUnwindowedChangelogTopicConfig(topic2, 1);
    final InternalTopicConfig internalTopicConfig3 = setupUnwindowedChangelogTopicConfig(topic3, 1);
    final ValidationResult validationResult = internalTopicManager.validate(mkMap(mkEntry(topic1, internalTopicConfig1), mkEntry(topic2, internalTopicConfig2), mkEntry(topic3, internalTopicConfig3)));
    final Map<String, List<String>> misconfigurationsForTopics = validationResult.misconfigurationsForTopics();
    assertThat(validationResult.missingTopics(), empty());
    assertThat(misconfigurationsForTopics.size(), is(2));
    assertThat(misconfigurationsForTopics, hasKey(topic1));
    assertThat(misconfigurationsForTopics.get(topic1).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic1).get(0), is("Cleanup policy (" + TopicConfig.CLEANUP_POLICY_CONFIG + ") of existing internal topic " + topic1 + " should not contain \"" + TopicConfig.CLEANUP_POLICY_DELETE + "\"."));
    assertThat(misconfigurationsForTopics, hasKey(topic2));
    assertThat(misconfigurationsForTopics.get(topic2).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic2).get(0), is("Cleanup policy (" + TopicConfig.CLEANUP_POLICY_CONFIG + ") of existing internal topic " + topic2 + " should not contain \"" + TopicConfig.CLEANUP_POLICY_DELETE + "\"."));
    assertThat(misconfigurationsForTopics, not(hasKey(topic3)));
}
Also used : List(java.util.List) ArrayList(java.util.ArrayList) ValidationResult(org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult) Test(org.junit.Test)

Example 3 with ValidationResult

use of org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult in project kafka by apache.

the class InternalTopicManagerTest method shouldRetryWhenCallsThrowTimeoutExceptionDuringValidation.

@Test
public void shouldRetryWhenCallsThrowTimeoutExceptionDuringValidation() {
    setupTopicInMockAdminClient(topic1, repartitionTopicConfig());
    mockAdminClient.timeoutNextRequest(2);
    final InternalTopicConfig internalTopicConfig = setupRepartitionTopicConfig(topic1, 1);
    final ValidationResult validationResult = internalTopicManager.validate(Collections.singletonMap(topic1, internalTopicConfig));
    assertThat(validationResult.missingTopics(), empty());
    assertThat(validationResult.misconfigurationsForTopics(), anEmptyMap());
}
Also used : ValidationResult(org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult) Test(org.junit.Test)

Example 4 with ValidationResult

use of org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult in project kafka by apache.

the class InternalTopicManagerTest method shouldReportMisconfigurationsOfPartitionCount.

@Test
public void shouldReportMisconfigurationsOfPartitionCount() {
    setupTopicInMockAdminClient(topic1, repartitionTopicConfig());
    setupTopicInMockAdminClient(topic2, repartitionTopicConfig());
    setupTopicInMockAdminClient(topic3, repartitionTopicConfig());
    final InternalTopicConfig internalTopicConfig1 = setupRepartitionTopicConfig(topic1, 2);
    final InternalTopicConfig internalTopicConfig2 = setupRepartitionTopicConfig(topic2, 3);
    final InternalTopicConfig internalTopicConfig3 = setupRepartitionTopicConfig(topic3, 1);
    final ValidationResult validationResult = internalTopicManager.validate(mkMap(mkEntry(topic1, internalTopicConfig1), mkEntry(topic2, internalTopicConfig2), mkEntry(topic3, internalTopicConfig3)));
    final Map<String, List<String>> misconfigurationsForTopics = validationResult.misconfigurationsForTopics();
    assertThat(validationResult.missingTopics(), empty());
    assertThat(misconfigurationsForTopics.size(), is(2));
    assertThat(misconfigurationsForTopics, hasKey(topic1));
    assertThat(misconfigurationsForTopics.get(topic1).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic1).get(0), is("Internal topic " + topic1 + " requires 2 partitions, but the existing topic on the broker has 1 partitions."));
    assertThat(misconfigurationsForTopics, hasKey(topic2));
    assertThat(misconfigurationsForTopics.get(topic2).size(), is(1));
    assertThat(misconfigurationsForTopics.get(topic2).get(0), is("Internal topic " + topic2 + " requires 3 partitions, but the existing topic on the broker has 1 partitions."));
    assertThat(misconfigurationsForTopics, not(hasKey(topic3)));
}
Also used : List(java.util.List) ArrayList(java.util.ArrayList) ValidationResult(org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult) Test(org.junit.Test)

Example 5 with ValidationResult

use of org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult in project kafka by apache.

the class InternalTopicManagerTest method shouldOnlyRetryDescribeTopicsWhenDescribeTopicsThrowsLeaderNotAvailableExceptionDuringValidation.

@Test
public void shouldOnlyRetryDescribeTopicsWhenDescribeTopicsThrowsLeaderNotAvailableExceptionDuringValidation() {
    final AdminClient admin = EasyMock.createNiceMock(AdminClient.class);
    final InternalTopicManager topicManager = new InternalTopicManager(time, admin, new StreamsConfig(config));
    final KafkaFutureImpl<TopicDescription> topicDescriptionFailFuture = new KafkaFutureImpl<>();
    topicDescriptionFailFuture.completeExceptionally(new LeaderNotAvailableException("Leader Not Available!"));
    final KafkaFutureImpl<TopicDescription> topicDescriptionSuccessfulFuture = new KafkaFutureImpl<>();
    topicDescriptionSuccessfulFuture.complete(new TopicDescription(topic1, false, Collections.singletonList(new TopicPartitionInfo(0, broker1, cluster, Collections.emptyList()))));
    EasyMock.expect(admin.describeTopics(Collections.singleton(topic1))).andReturn(new MockDescribeTopicsResult(mkMap(mkEntry(topic1, topicDescriptionFailFuture)))).andReturn(new MockDescribeTopicsResult(mkMap(mkEntry(topic1, topicDescriptionSuccessfulFuture))));
    final KafkaFutureImpl<Config> topicConfigSuccessfulFuture = new KafkaFutureImpl<>();
    topicConfigSuccessfulFuture.complete(new Config(repartitionTopicConfig().entrySet().stream().map(entry -> new ConfigEntry(entry.getKey(), entry.getValue())).collect(Collectors.toSet())));
    final ConfigResource topicResource = new ConfigResource(Type.TOPIC, topic1);
    EasyMock.expect(admin.describeConfigs(Collections.singleton(topicResource))).andReturn(new MockDescribeConfigsResult(mkMap(mkEntry(topicResource, topicConfigSuccessfulFuture))));
    EasyMock.replay(admin);
    final InternalTopicConfig internalTopicConfig = setupRepartitionTopicConfig(topic1, 1);
    final ValidationResult validationResult = topicManager.validate(Collections.singletonMap(topic1, internalTopicConfig));
    assertThat(validationResult.missingTopics(), empty());
    assertThat(validationResult.misconfigurationsForTopics(), anEmptyMap());
    EasyMock.verify(admin);
}
Also used : MockTime(org.apache.kafka.common.utils.MockTime) DescribeConfigsResult(org.apache.kafka.clients.admin.DescribeConfigsResult) Matchers.not(org.hamcrest.Matchers.not) ConfigEntry(org.apache.kafka.clients.admin.ConfigEntry) StreamsException(org.apache.kafka.streams.errors.StreamsException) ValidationResult(org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult) Matchers.hasKey(org.hamcrest.Matchers.hasKey) AdminClient(org.apache.kafka.clients.admin.AdminClient) Utils.mkMap(org.apache.kafka.common.utils.Utils.mkMap) After(org.junit.After) Map(java.util.Map) DeleteTopicsResult(org.apache.kafka.clients.admin.DeleteTopicsResult) Assert.fail(org.junit.Assert.fail) TopicConfig(org.apache.kafka.common.config.TopicConfig) CreatableReplicaAssignmentCollection(org.apache.kafka.common.message.CreateTopicsRequestData.CreatableReplicaAssignmentCollection) Collection(java.util.Collection) Utils.mkSet(org.apache.kafka.common.utils.Utils.mkSet) Set(java.util.Set) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) KafkaFuture(org.apache.kafka.common.KafkaFuture) Collectors(java.util.stream.Collectors) MockAdminClient(org.apache.kafka.clients.admin.MockAdminClient) TopicExistsException(org.apache.kafka.common.errors.TopicExistsException) List(java.util.List) Utils.mkEntry(org.apache.kafka.common.utils.Utils.mkEntry) Matchers.equalTo(org.hamcrest.Matchers.equalTo) Optional(java.util.Optional) Node(org.apache.kafka.common.Node) UnknownTopicOrPartitionException(org.apache.kafka.common.errors.UnknownTopicOrPartitionException) Matchers.is(org.hamcrest.Matchers.is) CreateTopicsOptions(org.apache.kafka.clients.admin.CreateTopicsOptions) Type(org.apache.kafka.common.config.ConfigResource.Type) Config(org.apache.kafka.clients.admin.Config) Uuid(org.apache.kafka.common.Uuid) StreamsConfig(org.apache.kafka.streams.StreamsConfig) CreateTopicsRequest(org.apache.kafka.common.requests.CreateTopicsRequest) Assert.assertThrows(org.junit.Assert.assertThrows) HashMap(java.util.HashMap) LeaderNotAvailableException(org.apache.kafka.common.errors.LeaderNotAvailableException) CreatableTopic(org.apache.kafka.common.message.CreateTopicsRequestData.CreatableTopic) ArrayList(java.util.ArrayList) ConfigResource(org.apache.kafka.common.config.ConfigResource) DescribeTopicsResult(org.apache.kafka.clients.admin.DescribeTopicsResult) CreateTopicsResult(org.apache.kafka.clients.admin.CreateTopicsResult) TopicDescription(org.apache.kafka.clients.admin.TopicDescription) KafkaFutureImpl(org.apache.kafka.common.internals.KafkaFutureImpl) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) ProducerConfig(org.apache.kafka.clients.producer.ProducerConfig) Before(org.junit.Before) TopicPartitionInfo(org.apache.kafka.common.TopicPartitionInfo) TimeoutException(org.apache.kafka.common.errors.TimeoutException) Matchers.empty(org.hamcrest.Matchers.empty) NewTopic(org.apache.kafka.clients.admin.NewTopic) Test(org.junit.Test) EasyMock(org.easymock.EasyMock) TopicMetadataAndConfig(org.apache.kafka.clients.admin.CreateTopicsResult.TopicMetadataAndConfig) CreatableTopicCollection(org.apache.kafka.common.message.CreateTopicsRequestData.CreatableTopicCollection) CreateTopicsRequestData(org.apache.kafka.common.message.CreateTopicsRequestData) Matchers.hasItem(org.hamcrest.Matchers.hasItem) Assert.assertNull(org.junit.Assert.assertNull) LogCaptureAppender(org.apache.kafka.streams.processor.internals.testutil.LogCaptureAppender) UnsupportedVersionException(org.apache.kafka.common.errors.UnsupportedVersionException) Matchers.anEmptyMap(org.hamcrest.Matchers.anEmptyMap) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) TopicConfig(org.apache.kafka.common.config.TopicConfig) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) Config(org.apache.kafka.clients.admin.Config) StreamsConfig(org.apache.kafka.streams.StreamsConfig) ProducerConfig(org.apache.kafka.clients.producer.ProducerConfig) TopicMetadataAndConfig(org.apache.kafka.clients.admin.CreateTopicsResult.TopicMetadataAndConfig) LeaderNotAvailableException(org.apache.kafka.common.errors.LeaderNotAvailableException) KafkaFutureImpl(org.apache.kafka.common.internals.KafkaFutureImpl) ValidationResult(org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult) ConfigResource(org.apache.kafka.common.config.ConfigResource) ConfigEntry(org.apache.kafka.clients.admin.ConfigEntry) TopicPartitionInfo(org.apache.kafka.common.TopicPartitionInfo) TopicDescription(org.apache.kafka.clients.admin.TopicDescription) AdminClient(org.apache.kafka.clients.admin.AdminClient) MockAdminClient(org.apache.kafka.clients.admin.MockAdminClient) StreamsConfig(org.apache.kafka.streams.StreamsConfig) Test(org.junit.Test)

Aggregations

ValidationResult (org.apache.kafka.streams.processor.internals.InternalTopicManager.ValidationResult)13 Test (org.junit.Test)13 ArrayList (java.util.ArrayList)8 List (java.util.List)8 StreamsConfig (org.apache.kafka.streams.StreamsConfig)4 Collection (java.util.Collection)3 Collections (java.util.Collections)3 HashMap (java.util.HashMap)3 Map (java.util.Map)3 Optional (java.util.Optional)3 Set (java.util.Set)3 Collectors (java.util.stream.Collectors)3 AdminClient (org.apache.kafka.clients.admin.AdminClient)3 Config (org.apache.kafka.clients.admin.Config)3 ConfigEntry (org.apache.kafka.clients.admin.ConfigEntry)3 CreateTopicsOptions (org.apache.kafka.clients.admin.CreateTopicsOptions)3 CreateTopicsResult (org.apache.kafka.clients.admin.CreateTopicsResult)3 TopicMetadataAndConfig (org.apache.kafka.clients.admin.CreateTopicsResult.TopicMetadataAndConfig)3 DeleteTopicsResult (org.apache.kafka.clients.admin.DeleteTopicsResult)3 DescribeConfigsResult (org.apache.kafka.clients.admin.DescribeConfigsResult)3