use of org.zalando.nakadi.domain.Subscription in project nakadi by zalando.
the class SubscriptionControllerTest method whenGetSubscriptionStatThenOk.
@Test
public void whenGetSubscriptionStatThenOk() throws Exception {
final Subscription subscription = builder().withEventType(TIMELINE.getEventType()).build();
final Collection<Partition> partitions = Collections.singleton(new Partition(TIMELINE.getEventType(), "0", "xz", null, Partition.State.ASSIGNED));
final ZkSubscriptionNode zkSubscriptionNode = new ZkSubscriptionNode(partitions, Arrays.asList(new Session("xz", 0)));
when(subscriptionRepository.getSubscription(subscription.getId())).thenReturn(subscription);
when(zkSubscriptionClient.getZkSubscriptionNodeLocked()).thenReturn(Optional.of(zkSubscriptionNode));
final SubscriptionCursorWithoutToken currentOffset = new SubscriptionCursorWithoutToken(TIMELINE.getEventType(), "0", "3");
final EventTypePartition etp = new EventTypePartition(TIMELINE.getEventType(), "0");
final Map<EventTypePartition, SubscriptionCursorWithoutToken> offsets = new HashMap<>();
offsets.put(etp, currentOffset);
when(zkSubscriptionClient.getOffsets(Collections.singleton(etp))).thenReturn(offsets);
when(eventTypeRepository.findByName(TIMELINE.getEventType())).thenReturn(EventTypeTestBuilder.builder().name(TIMELINE.getEventType()).build());
final List<PartitionEndStatistics> statistics = Collections.singletonList(new KafkaPartitionEndStatistics(TIMELINE, 0, 13));
when(topicRepository.loadTopicEndStatistics(eq(Collections.singletonList(TIMELINE)))).thenReturn(statistics);
final NakadiCursor currentCursor = mock(NakadiCursor.class);
when(currentCursor.getEventTypePartition()).thenReturn(new EventTypePartition(TIMELINE.getEventType(), "0"));
when(cursorConverter.convert((List<SubscriptionCursorWithoutToken>) any())).thenReturn(Collections.singletonList(currentCursor));
when(cursorOperationsService.calculateDistance(eq(currentCursor), eq(statistics.get(0).getLast()))).thenReturn(10L);
final List<SubscriptionEventTypeStats> expectedStats = Collections.singletonList(new SubscriptionEventTypeStats(TIMELINE.getEventType(), Collections.singletonList(new SubscriptionEventTypeStats.Partition("0", "assigned", 10L, "xz", AUTO))));
getSubscriptionStats(subscription.getId()).andExpect(status().isOk()).andExpect(content().string(TestUtils.JSON_TEST_HELPER.matchesObject(new ItemsWrapper<>(expectedStats))));
}
use of org.zalando.nakadi.domain.Subscription in project nakadi by zalando.
the class RandomSubscriptionBuilder method build.
public Subscription build() {
final Subscription subscription = new Subscription();
subscription.setId(id);
subscription.setCreatedAt(createdAt);
subscription.setOwningApplication(owningApplication);
subscription.setEventTypes(eventTypes);
subscription.setConsumerGroup(consumerGroup);
subscription.setReadFrom(startFrom);
subscription.setInitialCursors(initialCursors);
return subscription;
}
use of org.zalando.nakadi.domain.Subscription in project nakadi by zalando.
the class SubscriptionServiceTest method whenSubscriptionCreatedThenKPIEventSubmitted.
@Test
public void whenSubscriptionCreatedThenKPIEventSubmitted() throws Exception {
final SubscriptionBase subscriptionBase = RandomSubscriptionBuilder.builder().buildSubscriptionBase();
final Subscription subscription = RandomSubscriptionBuilder.builder().withId("my_subscription_id1").build();
when(subscriptionRepository.createSubscription(subscriptionBase)).thenReturn(subscription);
subscriptionService.createSubscription(subscriptionBase);
checkKPIEventSubmitted(nakadiKpiPublisher, SUBSCRIPTION_LOG_ET, new JSONObject().put("subscription_id", "my_subscription_id1").put("status", "created"));
}
use of org.zalando.nakadi.domain.Subscription in project nakadi by zalando.
the class HilaRebalanceAT method whenRebalanceThenPartitionsAreEquallyDistributedAndCommittedOffsetsAreConsidered.
@Test(timeout = 30000)
public void whenRebalanceThenPartitionsAreEquallyDistributedAndCommittedOffsetsAreConsidered() throws Exception {
// write 5 events to each partition
publishBusinessEventWithUserDefinedPartition(eventType.getName(), 40, x -> "blah" + x, x -> String.valueOf(x % 8));
// create a session
final TestStreamingClient clientA = TestStreamingClient.create(URL, subscription.getId(), "max_uncommitted_events=100").start();
waitFor(() -> assertThat(clientA.getBatches(), hasSize(40)));
// check that we received 5 events for each partitions
range(0, 8).forEach(partition -> assertThat(clientA.getBatches().stream().filter(batch -> batch.getCursor().getPartition().equals(String.valueOf(partition))).count(), equalTo(5L)));
// commit what we consumed
final List<SubscriptionCursor> cursors = range(0, 8).boxed().map(partition -> new SubscriptionCursor(String.valueOf(partition), "4", eventType.getName(), "token")).collect(toList());
commitCursors(subscription.getId(), cursors, clientA.getSessionId());
// create second session for the same subscription
final TestStreamingClient clientB = TestStreamingClient.create(URL, subscription.getId(), "stream_limit=20&max_uncommitted_events=100").start();
// wait for rebalance process to finish
waitFor(() -> assertThat(getNumberOfAssignedStreams(subscription.getId()), is(2)));
// write 5 more events to each partition
publishBusinessEventWithUserDefinedPartition(eventType.getName(), 40, x -> "blah_" + x, x -> String.valueOf(x % 8));
// wait till all events arrive
waitFor(() -> assertThat(clientB.getBatches(), hasSize(20)));
waitFor(() -> assertThat(clientA.getBatches(), hasSize(60)));
// check that only half of partitions were streamed to client A after rebalance
final Set<String> clientAPartitionsAfterRebalance = getUniquePartitionsStreamedToClient(clientA, 40, 60);
assertThat(clientAPartitionsAfterRebalance, hasSize(4));
// check that only half of partitions were streamed to client B
final Set<String> clientBPartitions = getUniquePartitionsStreamedToClient(clientB);
assertThat(clientBPartitions, hasSize(4));
// check that different partitions were streamed to different clients
assertThat(intersection(clientAPartitionsAfterRebalance, clientBPartitions), hasSize(0));
// commit what we consumed, as clientB has already consumed what was required by stream_limit - it should
// be closed right after everything is committed
final List<SubscriptionCursor> lastCursorsA = getLastCursorsForPartitions(clientA, clientAPartitionsAfterRebalance);
final List<SubscriptionCursor> lastCursorsB = getLastCursorsForPartitions(clientB, clientBPartitions);
commitCursors(subscription.getId(), lastCursorsA, clientA.getSessionId());
commitCursors(subscription.getId(), lastCursorsB, clientB.getSessionId());
waitFor(() -> assertThat(clientB.isRunning(), is(false)));
// wait for rebalance process to finish
waitFor(() -> assertThat(getNumberOfAssignedStreams(subscription.getId()), is(1)));
// write 5 more events to each partition
publishBusinessEventWithUserDefinedPartition(eventType.getName(), 40, x -> "blah__" + x, x -> String.valueOf(x % 8));
// check that after second rebalance all events were consumed by first client
waitFor(() -> assertThat(clientA.getBatches(), hasSize(100)));
}
use of org.zalando.nakadi.domain.Subscription in project nakadi by zalando.
the class SubscriptionAT method testListSubscriptions.
@Test
public void testListSubscriptions() throws IOException {
final String etName = createEventType().getName();
final String filterApp = randomUUID();
final Subscription sub1 = createSubscription(RandomSubscriptionBuilder.builder().withEventType(etName).withOwningApplication(filterApp).buildSubscriptionBase());
final Subscription sub2 = createSubscription(RandomSubscriptionBuilder.builder().withEventType(etName).withOwningApplication(filterApp).buildSubscriptionBase());
createSubscription(RandomSubscriptionBuilder.builder().withEventType(etName).buildSubscriptionBase());
final PaginationWrapper expectedList = new PaginationWrapper(ImmutableList.of(sub2, sub1), new PaginationLinks());
given().param("owning_application", filterApp).get("/subscriptions").then().statusCode(HttpStatus.SC_OK).body(JSON_HELPER.matchesObject(expectedList));
}
Aggregations