From fcd0ce35385e23454c5de97ff6066845b9bb389f Mon Sep 17 00:00:00 2001 From: Andrei Dan Date: Thu, 6 Oct 2022 11:17:31 +0100 Subject: [PATCH] Fix testRedNoBlockedIndicesAndRedAllRoleNodes (#90671) This makes sure the affected roles also hosts indices. --- .../node/DiskHealthIndicatorServiceTests.java | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/health/node/DiskHealthIndicatorServiceTests.java b/server/src/test/java/org/elasticsearch/health/node/DiskHealthIndicatorServiceTests.java index c9d16f06e9f51..0bbf2d5ad1047 100644 --- a/server/src/test/java/org/elasticsearch/health/node/DiskHealthIndicatorServiceTests.java +++ b/server/src/test/java/org/elasticsearch/health/node/DiskHealthIndicatorServiceTests.java @@ -234,23 +234,35 @@ public void testYellowMixedNodes() throws IOException { * of space but the DiskThresholdMonitor hasn't yet. * We expect 3 impacts and 1 diagnosis. */ - @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/90305") public void testRedNoBlockedIndicesAndRedAllRoleNodes() throws IOException { Set discoveryNodes = createNodesWithAllRoles(); - int affectedNodes = randomIntBetween(discoveryNodes.size() / 2 + 1, discoveryNodes.size()); + List affectedNodes = randomNonEmptySubsetOf(discoveryNodes).stream() + .sorted(DiscoveryNode.DISCOVERY_NODE_COMPARATOR) + .collect(Collectors.toList()); Map> indexNameToNodeIdsMap = new HashMap<>(); - Set nodeIds = discoveryNodes.stream().map(DiscoveryNode::getId).collect(Collectors.toSet()); + Set affectedNodeIds = affectedNodes.stream().map(DiscoveryNode::getId).collect(Collectors.toSet()); for (int i = 0; i < randomIntBetween(1, 20); i++) { String indexName = randomAlphaOfLength(20); - indexNameToNodeIdsMap.put(indexName, new HashSet<>(randomNonEmptySubsetOf(nodeIds))); + indexNameToNodeIdsMap.put(indexName, new HashSet<>(randomNonEmptySubsetOf(affectedNodeIds))); } ClusterService clusterService = createClusterService(Set.of(), discoveryNodes, indexNameToNodeIdsMap); DiskHealthIndicatorService diskHealthIndicatorService = new DiskHealthIndicatorService(clusterService); - HealthStatus expectedStatus = HealthStatus.RED; - HealthInfo healthInfo = createHealthInfo(new HealthInfoConfig(expectedStatus, affectedNodes, discoveryNodes)); + Map diskInfoByNode = new HashMap<>(); + for (DiscoveryNode discoveryNode : discoveryNodes) { + if (affectedNodeIds.contains(discoveryNode.getId())) { + diskInfoByNode.put(discoveryNode.getId(), new DiskHealthInfo(HealthStatus.RED, randomFrom(DiskHealthInfo.Cause.values()))); + } else { + diskInfoByNode.put(discoveryNode.getId(), new DiskHealthInfo(HealthStatus.GREEN)); + } + } + HealthInfo healthInfo = new HealthInfo(diskInfoByNode); + HealthIndicatorResult result = diskHealthIndicatorService.calculate(true, healthInfo); - assertThat(result.status(), equalTo(expectedStatus)); - assertThat(result.symptom(), containsString(affectedNodes + " node" + (affectedNodes == 1 ? "" : "s") + " with roles: [data")); + assertThat(result.status(), equalTo(HealthStatus.RED)); + assertThat( + result.symptom(), + containsString(affectedNodes.size() + " node" + (affectedNodes.size() == 1 ? "" : "s") + " with roles: " + "[data") + ); assertThat(result.symptom(), containsString(" out of disk or running low on disk space.")); assertThat(result.impacts().size(), equalTo(3)); HealthIndicatorImpact impact = result.impacts().get(0); @@ -266,23 +278,26 @@ public void testRedNoBlockedIndicesAndRedAllRoleNodes() throws IOException { assertThat(result.diagnosisList().size(), equalTo(1)); Diagnosis diagnosis = result.diagnosisList().get(0); List affectedResources = diagnosis.affectedResources(); - assertThat(affectedResources.get(0), equalTo(1)); + assertThat(affectedResources, iterableWithSize(2)); assertThat(affectedResources.get(0).getType(), is(Diagnosis.Resource.Type.NODE)); - assertThat(affectedResources.get(0).getNodes().size(), is(affectedNodes)); + assertThat(affectedResources.get(0).getNodes(), is(affectedNodes)); + + assertThat(affectedResources.get(1).getType(), is(Diagnosis.Resource.Type.INDEX)); + assertThat( + affectedResources.get(1).getValues(), + is( + indexNameToNodeIdsMap.keySet() + .stream() + .sorted(HealthIndicatorDisplayValues.indicesComparatorByPriorityAndName(clusterService.state().metadata())) + .collect(Collectors.toList()) + ) + ); - List expectedRedNodeIds = healthInfo.diskInfoByNode() - .entrySet() - .stream() - .filter(entry -> expectedStatus.equals(entry.getValue().healthStatus())) - .map(Map.Entry::getKey) - .sorted() - .collect(Collectors.toList()); - assertThat(affectedResources, equalTo(expectedRedNodeIds)); Map details = xContentToMap(result.details()); - assertThat(details.get("green_nodes"), equalTo(discoveryNodes.size() - affectedNodes)); + assertThat(details.get("green_nodes"), equalTo(discoveryNodes.size() - affectedNodes.size())); assertThat(details.get("unknown_nodes"), equalTo(0)); assertThat(details.get("yellow_nodes"), equalTo(0)); - assertThat(details.get("red_nodes"), equalTo(affectedNodes)); + assertThat(details.get("red_nodes"), equalTo(affectedNodes.size())); assertThat(details.get("blocked_indices"), equalTo(0)); }