public Optional<NodeHealth> getNodeHealth(String nodeName) { return nodes.stream() .filter(node -> nodeName.equals(node.getDetails().getName())) .findFirst(); }
@Override public Health check(Set<NodeHealth> nodeHealths) { Set<NodeHealth> appNodes = nodeHealths.stream() .filter(s -> s.getDetails().getType() == NodeDetails.Type.APPLICATION) .collect(toSet()); return Arrays.stream(AppNodeClusterHealthSubChecks.values()) .map(s -> s.check(appNodes)) .reduce(Health.GREEN, HealthReducer.INSTANCE); }
private String printStatusesAndTypes(@Nullable Set<NodeHealth> nodeHealths) { if (nodeHealths == null) { return "<null>"; } return nodeHealths.stream() // sort by type then status for debugging convenience .sorted(Comparator.<NodeHealth>comparingInt(s1 -> s1.getDetails().getType().ordinal()) .thenComparingInt(s -> s.getStatus().ordinal())) .map(s -> ImmutableList.of(s.getDetails().getType().name(), s.getStatus().name())) .map(String::valueOf) .collect(Collectors.joining(",")); }
@Test public void verify_getters() { NodeDetails nodeDetails = testSupport.randomNodeDetails(); NodeHealth.Builder builder = builderUnderTest .setStatus(randomStatus) .setDetails(nodeDetails); String[] causes = IntStream.range(0, random.nextInt(10)).mapToObj(i -> randomAlphanumeric(4)).toArray(String[]::new); Arrays.stream(causes).forEach(builder::addCause); NodeHealth underTest = builder.build(); assertThat(underTest.getStatus()).isEqualTo(randomStatus); assertThat(underTest.getDetails()).isEqualTo(nodeDetails); assertThat(underTest.getCauses()).containsOnly(causes); }
@Test public void clearClauses_clears_clauses_of_builder() { NodeHealth.Builder underTest = testSupport.randomBuilder(); NodeHealth original = underTest .addCause(randomAlphanumeric(3)) .build(); underTest.clearCauses(); NodeHealth second = underTest.build(); assertThat(second.getStatus()).isEqualTo(original.getStatus()); assertThat(second.getDetails()).isEqualTo(original.getDetails()); assertThat(second.getCauses()).isEmpty(); }
@Test public void get_returns_started_from_System2_now_at_constructor_time() { Properties properties = new Properties(); long now = setRequiredPropertiesAndMocks(properties); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getStartedAt()).isEqualTo(now); // change now when(clock.now()).thenReturn(now); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getStartedAt()).isEqualTo(now); }
private void getReturnsHostFromNetworkUtils(@Nullable String hostPropertyValue) { String host = randomAlphanumeric(34); Properties properties = new Properties(); properties.setProperty(CLUSTER_NODE_NAME.getKey(), randomAlphanumeric(3)); properties.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), valueOf(1 + random.nextInt(4))); if (hostPropertyValue != null) { properties.setProperty(CLUSTER_NODE_HOST.getKey(), hostPropertyValue); } when(clock.now()).thenReturn(1L + random.nextInt(87)); when(networkUtils.getHostname()).thenReturn(host); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getHost()).isEqualTo(host); // change now when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(96)); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getHost()).isEqualTo(host); }
@Test public void get_returns_name_and_port_from_properties_at_constructor_time() { String name = randomAlphanumeric(3); int port = 1 + random.nextInt(4); Properties properties = new Properties(); properties.setProperty(CLUSTER_NODE_NAME.getKey(), name); properties.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), valueOf(port)); when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(34)); when(clock.now()).thenReturn(1L + random.nextInt(87)); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getName()).isEqualTo(name); assertThat(nodeHealth.getDetails().getPort()).isEqualTo(port); // change values in properties properties.setProperty(CLUSTER_NODE_NAME.getKey(), randomAlphanumeric(6)); properties.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), valueOf(1 + random.nextInt(99))); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getName()).isEqualTo(name); assertThat(newNodeHealth.getDetails().getPort()).isEqualTo(port); }
@Test public void get_returns_started_from_server_startedAt_at_constructor_time() { setRequiredPropertiesForConstructor(); when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(4)); Date date = new Date(); when(server.getStartedAt()).thenReturn(date); when(healthChecker.checkNode()).thenReturn(Health.newHealthCheckBuilder() .setStatus(Health.Status.values()[random.nextInt(Health.Status.values().length)]) .build()); NodeHealthProviderImpl underTest = new NodeHealthProviderImpl(mapSettings.asConfig(), healthChecker, server, networkUtils); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getStartedAt()).isEqualTo(date.getTime()); // change startedAt value setStartedAt(); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getStartedAt()).isEqualTo(date.getTime()); }
@Test public void builder_can_be_reused() { NodeHealth.Builder builder = testSupport.randomBuilder(1); NodeHealth original = builder.build(); NodeHealth second = builder.build(); NodeHealth.Status newRandomStatus = NodeHealth.Status.values()[random.nextInt(NodeHealth.Status.values().length)]; NodeDetails newNodeDetails = testSupport.randomNodeDetails(); builder .clearCauses() .setStatus(newRandomStatus) .setDetails(newNodeDetails); String[] newCauses = IntStream.range(0, 1 + random.nextInt(2)).mapToObj(i -> randomAlphanumeric(4)).toArray(String[]::new); Arrays.stream(newCauses).forEach(builder::addCause); NodeHealth newNodeHealth = builder.build(); assertThat(second).isEqualTo(original); assertThat(newNodeHealth.getStatus()).isEqualTo(newRandomStatus); assertThat(newNodeHealth.getDetails()).isEqualTo(newNodeDetails); assertThat(newNodeHealth.getCauses()).containsOnly(newCauses); }
@Test public void response_contains_information_of_nodes_when_clustered() { authenticateWithRandomMethod(); NodeHealth nodeHealth = randomNodeHealth(); when(webServer.isStandalone()).thenReturn(false); when(healthChecker.checkCluster()).thenReturn(new ClusterHealth(GREEN, singleton(nodeHealth))); System.HealthResponse response = underTest.newRequest().executeProtobuf(System.HealthResponse.class); assertThat(response.getNodes().getNodesList()) .hasSize(1); System.Node node = response.getNodes().getNodesList().iterator().next(); assertThat(node.getHealth().name()).isEqualTo(nodeHealth.getStatus().name()); assertThat(node.getCausesList()) .extracting(System.Cause::getMessage) .containsOnly(nodeHealth.getCauses().stream().toArray(String[]::new)); assertThat(node.getName()).isEqualTo(nodeHealth.getDetails().getName()); assertThat(node.getHost()).isEqualTo(nodeHealth.getDetails().getHost()); assertThat(node.getPort()).isEqualTo(nodeHealth.getDetails().getPort()); assertThat(node.getStartedAt()).isEqualTo(formatDateTime(nodeHealth.getDetails().getStartedAt())); assertThat(node.getType().name()).isEqualTo(nodeHealth.getDetails().getType().name()); }
@Test public void get_returns_host_from_property_if_set_at_constructor_time() { String host = randomAlphanumeric(55); Properties properties = new Properties(); properties.setProperty(CLUSTER_NODE_NAME.getKey(), randomAlphanumeric(3)); properties.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), valueOf(1 + random.nextInt(4))); properties.setProperty(CLUSTER_NODE_HOST.getKey(), host); when(clock.now()).thenReturn(1L + random.nextInt(87)); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getHost()).isEqualTo(host); // change now properties.setProperty(CLUSTER_NODE_HOST.getKey(), randomAlphanumeric(96)); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getHost()).isEqualTo(host); }
@Test public void get_returns_name_and_port_from_properties_at_constructor_time() { String name = randomAlphanumeric(3); int port = 1 + random.nextInt(4); mapSettings.setProperty(CLUSTER_NODE_NAME.getKey(), name); mapSettings.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), port); setStartedAt(); when(healthChecker.checkNode()).thenReturn(Health.newHealthCheckBuilder() .setStatus(Health.Status.values()[random.nextInt(Health.Status.values().length)]) .build()); when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(3)); NodeHealthProviderImpl underTest = new NodeHealthProviderImpl(mapSettings.asConfig(), healthChecker, server, networkUtils); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getName()).isEqualTo(name); assertThat(nodeHealth.getDetails().getPort()).isEqualTo(port); // change values in properties setRequiredPropertiesForConstructor(); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getName()).isEqualTo(name); assertThat(newNodeHealth.getDetails().getPort()).isEqualTo(port); }
@Test public void get_returns_APPLICATION_type() { setRequiredPropertiesForConstructor(); setStartedAt(); when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(23)); when(healthChecker.checkNode()).thenReturn(Health.newHealthCheckBuilder() .setStatus(Health.Status.values()[random.nextInt(Health.Status.values().length)]) .build()); NodeHealthProviderImpl underTest = new NodeHealthProviderImpl(mapSettings.asConfig(), healthChecker, server, networkUtils); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getType()).isEqualTo(NodeDetails.Type.APPLICATION); }
private void getReturnsHostnameFromNetworkUtils(String hostPropertyValue) { String host = randomAlphanumeric(3); setRequiredPropertiesForConstructor(); if (hostPropertyValue != null) { mapSettings.setProperty(CLUSTER_NODE_HOST.getKey(), hostPropertyValue); } setStartedAt(); when(healthChecker.checkNode()).thenReturn(Health.newHealthCheckBuilder() .setStatus(Health.Status.values()[random.nextInt(Health.Status.values().length)]) .build()); when(networkUtils.getHostname()).thenReturn(host); NodeHealthProviderImpl underTest = new NodeHealthProviderImpl(mapSettings.asConfig(), healthChecker, server, networkUtils); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getHost()).isEqualTo(host); // change hostname when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(4)); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getHost()).isEqualTo(host); }
@Test public void get_returns_host_from_property_if_set_at_constructor_time() { String host = randomAlphanumeric(4); mapSettings.setProperty(CLUSTER_NODE_NAME.getKey(), randomAlphanumeric(3)); mapSettings.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), 1 + random.nextInt(4)); mapSettings.setProperty(CLUSTER_NODE_HOST.getKey(), host); setStartedAt(); when(healthChecker.checkNode()).thenReturn(Health.newHealthCheckBuilder() .setStatus(Health.Status.values()[random.nextInt(Health.Status.values().length)]) .build()); NodeHealthProviderImpl underTest = new NodeHealthProviderImpl(mapSettings.asConfig(), healthChecker, server, networkUtils); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getHost()).isEqualTo(host); // change values in properties mapSettings.setProperty(CLUSTER_NODE_HOST.getKey(), randomAlphanumeric(66)); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getHost()).isEqualTo(host); }
@Test public void response_sort_nodes_by_type_name_host_then_port_when_clustered() { authenticateWithRandomMethod(); // using created field as a unique identifier. pseudo random value to ensure sorting is not based on created field List<NodeHealth> nodeHealths = new ArrayList<>(Arrays.asList( randomNodeHealth(NodeDetails.Type.APPLICATION, "1_name", "1_host", 1, 99), randomNodeHealth(NodeDetails.Type.APPLICATION, "1_name", "2_host", 1, 85), randomNodeHealth(NodeDetails.Type.APPLICATION, "1_name", "2_host", 2, 12), randomNodeHealth(NodeDetails.Type.APPLICATION, "2_name", "1_host", 1, 6), randomNodeHealth(NodeDetails.Type.APPLICATION, "2_name", "1_host", 2, 30), randomNodeHealth(NodeDetails.Type.APPLICATION, "2_name", "2_host", 1, 75), randomNodeHealth(NodeDetails.Type.APPLICATION, "2_name", "2_host", 2, 258), randomNodeHealth(NodeDetails.Type.SEARCH, "1_name", "1_host", 1, 963), randomNodeHealth(NodeDetails.Type.SEARCH, "1_name", "1_host", 2, 1), randomNodeHealth(NodeDetails.Type.SEARCH, "1_name", "2_host", 1, 35), randomNodeHealth(NodeDetails.Type.SEARCH, "1_name", "2_host", 2, 45), randomNodeHealth(NodeDetails.Type.SEARCH, "2_name", "1_host", 1, 39), randomNodeHealth(NodeDetails.Type.SEARCH, "2_name", "1_host", 2, 28), randomNodeHealth(NodeDetails.Type.SEARCH, "2_name", "2_host", 1, 66), randomNodeHealth(NodeDetails.Type.SEARCH, "2_name", "2_host", 2, 77))); String[] expected = nodeHealths.stream().map(s -> formatDateTime(new Date(s.getDetails().getStartedAt()))).toArray(String[]::new); Collections.shuffle(nodeHealths); when(webServer.isStandalone()).thenReturn(false); when(healthChecker.checkCluster()).thenReturn(new ClusterHealth(GREEN, new HashSet<>(nodeHealths))); System.HealthResponse response = underTest.newRequest().executeProtobuf(System.HealthResponse.class); assertThat(response.getNodes().getNodesList()) .extracting(System.Node::getStartedAt) .containsExactly(expected); }
private static System.Node toNode(NodeHealth nodeHealth, System.Node.Builder nodeBuilder, System.Cause.Builder causeBuilder) { nodeBuilder.clear(); nodeBuilder.setHealth(System.Health.valueOf(nodeHealth.getStatus().name())); nodeHealth.getCauses().forEach(str -> nodeBuilder.addCauses(toCause(str, causeBuilder))); NodeDetails details = nodeHealth.getDetails(); nodeBuilder .setType(System.NodeType.valueOf(details.getType().name())) .setName(details.getName()) .setHost(details.getHost()) .setPort(details.getPort()) .setStartedAt(formatDateTime(details.getStartedAt())); return nodeBuilder.build(); }
public Optional<NodeHealth> getNodeHealth(String nodeName) { return nodes.stream() .filter(node -> nodeName.equals(node.getDetails().getName())) .findFirst(); }
@Override public Health check(Set<NodeHealth> nodeHealths) { Set<NodeHealth> appNodes = nodeHealths.stream() .filter(s -> s.getDetails().getType() == NodeDetails.Type.APPLICATION) .collect(toSet()); return Arrays.stream(AppNodeClusterHealthSubChecks.values()) .map(s -> s.check(appNodes)) .reduce(Health.GREEN, HealthReducer.INSTANCE); }