diff options
author | Valerij Fredriksen <freva@users.noreply.github.com> | 2018-01-19 09:47:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-19 09:47:27 +0100 |
commit | 9ee45d79d98222549352d38e9a3f9c717082c323 (patch) | |
tree | a657b1d7933b15495eb79f49c09e3045b1a4cd4e /node-maintainer | |
parent | b9e38300bf58e9eaa1a1b977f2d8b5303982d8a3 (diff) | |
parent | 827a3a370531aea57470eab116d92983f022b467 (diff) |
Merge pull request #4694 from vespa-engine/freva/remove-node-repo-dependance
Remove node-repo dependance from spec-verifier
Diffstat (limited to 'node-maintainer')
55 files changed, 464 insertions, 1467 deletions
diff --git a/node-maintainer/pom.xml b/node-maintainer/pom.xml index 1fe3eb23857..9e4bedeef3d 100644 --- a/node-maintainer/pom.xml +++ b/node-maintainer/pom.xml @@ -41,6 +41,11 @@ <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> + <dependency> + <groupId>io.airlift</groupId> + <artifactId>airline</artifactId> + <version>0.6</version> + </dependency> <dependency> <groupId>org.hamcrest</groupId> @@ -64,11 +69,6 @@ <version>2.8.3</version> </dependency> <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-exec</artifactId> - <version>1.3</version> - </dependency> - <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/Main.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/Main.java new file mode 100644 index 00000000000..a33dd07dff2 --- /dev/null +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/Main.java @@ -0,0 +1,84 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.node.verification; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yahoo.log.LogLevel; +import com.yahoo.log.LogSetup; +import com.yahoo.vespa.hosted.node.verification.commons.CommandExecutor; +import com.yahoo.vespa.hosted.node.verification.commons.report.HardwareDivergenceReport; +import com.yahoo.vespa.hosted.node.verification.hardware.HardwareBenchmarker; +import com.yahoo.vespa.hosted.node.verification.spec.SpecVerifier; +import io.airlift.command.Cli; +import io.airlift.command.Help; +import io.airlift.command.Option; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author freva + */ +public class Main { + private static final String EXECUTABLE_NAME = "node-verifier"; + private static final Logger logger = Logger.getLogger(Main.class.getName()); + private static final ObjectMapper om = new ObjectMapper(); + + public static void main(String[] args) { + LogSetup.initVespaLogging(EXECUTABLE_NAME); + + try { + System.out.println(execute(args, new CommandExecutor())); + } catch (Exception e) { + logger.log(LogLevel.ERROR, "Something went wrong", e); + System.exit(1); + } + } + + @SuppressWarnings("unchecked") + public static String execute(String[] args, CommandExecutor commandExecutor) throws IOException { + Cli.CliBuilder<Object> builder = Cli.builder(EXECUTABLE_NAME) + .withDescription("Verifies that node meets the expected specification and benchmarks") + .withDefaultCommand(Help.class) + .withCommands(Help.class, SpecVerifier.class, HardwareBenchmarker.class); + + Object command = builder.build().parse(args); + if (command instanceof VerifierCommand) { + HardwareDivergenceReport report = ((VerifierCommand) command).getPreviousHardwareDivergence(); + ((VerifierCommand) command).run(report, commandExecutor); + return hardwareDivergenceReportToString(report); + } else if (command instanceof Runnable) { + ((Runnable) command).run(); + return ""; + } + + throw new RuntimeException("Unknown command class " + command.getClass().getName()); + } + + public static abstract class VerifierCommand { + @Option(name = {"-h", "--divergence"}, description = "JSON of the previous hardware divergence report") + private String hardwareDivergence; + + private HardwareDivergenceReport getPreviousHardwareDivergence() { + if (hardwareDivergence == null) { + return new HardwareDivergenceReport(); + } + try { + return om.readValue(hardwareDivergence, HardwareDivergenceReport.class); + } catch (IOException e) { + logger.log(Level.WARNING, "Failed to parse hardware divergence:\n" + hardwareDivergence, e.getMessage()); + return new HardwareDivergenceReport(); + } + } + + protected abstract void run(HardwareDivergenceReport hardwareDivergenceReport, CommandExecutor commandExecutor); + } + + private static String hardwareDivergenceReportToString(HardwareDivergenceReport hardwareDivergenceReport) throws IOException { + if (hardwareDivergenceReport.isHardwareDivergenceReportEmpty()) { + return "null"; + } else { + return om.writeValueAsString(hardwareDivergenceReport); + } + } +} diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGenerator.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGenerator.java deleted file mode 100644 index 7e8b198428f..00000000000 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGenerator.java +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -/** - * Makes the URL used to retrieve the JSON from the node repository with information about the node's spec. - * - * @author olaaun - * @author sgrostad - */ -public class HostURLGenerator { - - private static final String NODE_HOSTNAME_PREFIX = "/nodes/v2/node/"; - private static final String PORT_NUMBER = ":4080"; - private static final String HTTP = "http://"; - private static final String PARSE_ALL_HOSTNAMES_REGEX = ","; - private static final String PROTOCOL_REGEX = "^(https?|file)://.*$"; - - public static List<URL> generateNodeInfoUrl(CommandExecutor commandExecutor, String commaSeparatedUrls) throws IOException { - List<URL> nodeInfoUrls = new ArrayList<>(); - String[] configServerHostNames = commaSeparatedUrls.split(PARSE_ALL_HOSTNAMES_REGEX); - String nodeHostName = generateNodeHostName(commandExecutor); - for (String configServerHostName : configServerHostNames) { - nodeInfoUrls.add(buildNodeInfoURL(configServerHostName, nodeHostName)); - } - return nodeInfoUrls; - } - - protected static String generateNodeHostName(CommandExecutor commandExecutor) throws IOException { - String nodeHostName = getEnvironmentVariable(commandExecutor); - return nodeHostName; - } - - protected static String getEnvironmentVariable(CommandExecutor commandExecutor) throws IOException { - List<String> output = commandExecutor.executeCommand("hostname"); - if (output.size() == 1) { - return output.get(0); - } - throw new IOException("Unexpected output from \"hostname\" command."); - } - - protected static URL buildNodeInfoURL(String configServerHostName, String nodeHostName) throws MalformedURLException { - if (configServerHostName.matches(PROTOCOL_REGEX)) { - return new URL(configServerHostName + NODE_HOSTNAME_PREFIX + nodeHostName); - } - return new URL(HTTP + configServerHostName + PORT_NUMBER + NODE_HOSTNAME_PREFIX + nodeHostName); - } - -} diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifier.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifier.java index db4eb6e73cd..496bf47bd7c 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifier.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifier.java @@ -27,25 +27,30 @@ public class IPAddressVerifier { private static final Logger logger = Logger.getLogger(IPAddressVerifier.class.getName()); - public void reportFaultyIpAddresses(NodeRepoJsonModel nodeRepoJsonModel, SpecVerificationReport specVerificationReport) { - String[] faultyIpAddresses = getFaultyIpAddresses(nodeRepoJsonModel); + private final String expectedHostname; + + public IPAddressVerifier(String expectedHostname) { + this.expectedHostname = expectedHostname; + } + + public void reportFaultyIpAddresses(NodeSpec nodeSpec, SpecVerificationReport specVerificationReport) { + String[] faultyIpAddresses = getFaultyIpAddresses(nodeSpec); if (faultyIpAddresses.length > 0) { specVerificationReport.setFaultyIpAddresses(faultyIpAddresses); } } - public String[] getFaultyIpAddresses(NodeRepoJsonModel jsonModel) { - String expectedHostname = jsonModel.getHostname(); + public String[] getFaultyIpAddresses(NodeSpec nodeSpec) { List<String> faultyIpAddresses = new ArrayList<>(); if (expectedHostname == null || expectedHostname.equals("")) return new String[0]; - if (!isValidIpv4(jsonModel.getIpv4Address(), expectedHostname)) { - faultyIpAddresses.add(jsonModel.getIpv4Address()); + if (!isValidIpv4(nodeSpec.getIpv4Address(), expectedHostname)) { + faultyIpAddresses.add(nodeSpec.getIpv4Address()); } - if (!isValidIpv6(jsonModel.getIpv6Address(), expectedHostname)) { - faultyIpAddresses.add(jsonModel.getIpv6Address()); + if (!isValidIpv6(nodeSpec.getIpv6Address(), expectedHostname)) { + faultyIpAddresses.add(nodeSpec.getIpv6Address()); } - return faultyIpAddresses.stream().toArray(String[]::new); + return faultyIpAddresses.toArray(new String[0]); } private boolean isValidIpv4(String ipv4Address, String expectedHostname) { @@ -76,12 +81,11 @@ public class IPAddressVerifier { return false; } - protected String reverseLookUp(String ipAddress) throws NamingException { + String reverseLookUp(String ipAddress) throws NamingException { Hashtable<String, String> env = new Hashtable<>(); env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); - String attributeName = ipAddress; DirContext ctx = new InitialDirContext(env); - Attributes attrs = ctx.getAttributes(attributeName, new String[]{"PTR"}); + Attributes attrs = ctx.getAttributes(ipAddress, new String[]{"PTR"}); for (NamingEnumeration<? extends Attribute> ae = attrs.getAll(); ae.hasMoreElements(); ) { Attribute attr = ae.next(); Enumeration<?> vals = attr.getAll(); @@ -95,7 +99,7 @@ public class IPAddressVerifier { return ""; } - protected String convertIpv6ToLookupFormat(String ipAddress) { + String convertIpv6ToLookupFormat(String ipAddress) { StringBuilder newIpAddress = new StringBuilder(); String doubleColonReplacement = "0.0.0.0.0.0.0.0.0.0.0.0."; String domain = "ip6.arpa"; @@ -108,14 +112,14 @@ public class IPAddressVerifier { } String trailingZeroes = "0000"; String paddedHextet = (reversedHextet + trailingZeroes).substring(0, trailingZeroes.length()); - String punctuatedHextet = paddedHextet.replaceAll(".(?=)", "$0."); + String punctuatedHextet = paddedHextet.replaceAll(".", "$0."); newIpAddress.append(punctuatedHextet); } newIpAddress.append(domain); return newIpAddress.toString(); } - protected String convertIpv4ToLookupFormat(String ipAddress) { + String convertIpv4ToLookupFormat(String ipAddress) { String domain = "in-addr.arpa"; String[] octets = ipAddress.split("\\."); StringBuilder convertedIpAddress = new StringBuilder(); diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverter.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverter.java index 5cf4bede3f1..bdc4ea0789c 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverter.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverter.java @@ -4,7 +4,7 @@ package com.yahoo.vespa.hosted.node.verification.commons.noderepo; import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo; /** - * Converts a NodeRepoJsonModel object to a HardwareInfo object. + * Converts a NodeSpec object to a HardwareInfo object. * * @author olaaun * @author sgrostad @@ -15,23 +15,23 @@ public class NodeJsonConverter { nodeRepoHardwareInfo.setInterfaceSpeedMbs(1000); } - protected static void setIpv6Interface(NodeRepoJsonModel nodeRepoJsonModel, HardwareInfo nodeRepoHardwareInfo) { - if (nodeRepoJsonModel.getIpv6Address() != null) { + private static void setIpv6Interface(NodeSpec nodeSpec, HardwareInfo nodeRepoHardwareInfo) { + if (nodeSpec.getIpv6Address() != null) { nodeRepoHardwareInfo.setIpv6Interface(true); } } - protected static void setIpv4Interface(NodeRepoJsonModel nodeRepoJsonModel, HardwareInfo nodeRepoHardwareInfo) { - if (nodeRepoJsonModel.getIpv4Address() != null) { + private static void setIpv4Interface(NodeSpec nodeSpec, HardwareInfo nodeRepoHardwareInfo) { + if (nodeSpec.getIpv4Address() != null) { nodeRepoHardwareInfo.setIpv4Interface(true); } } - public static HardwareInfo convertJsonModelToHardwareInfo(NodeRepoJsonModel nodeRepoJsonModel) { - HardwareInfo nodeRepoHardwareInfo = nodeRepoJsonModel.copyToHardwareInfo(); + public static HardwareInfo convertJsonModelToHardwareInfo(NodeSpec nodeSpec) { + HardwareInfo nodeRepoHardwareInfo = nodeSpec.copyToHardwareInfo(); addStandardSpecifications(nodeRepoHardwareInfo); - setIpv4Interface(nodeRepoJsonModel, nodeRepoHardwareInfo); - setIpv6Interface(nodeRepoJsonModel, nodeRepoHardwareInfo); + setIpv4Interface(nodeSpec, nodeRepoHardwareInfo); + setIpv6Interface(nodeSpec, nodeRepoHardwareInfo); return nodeRepoHardwareInfo; } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetriever.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetriever.java deleted file mode 100644 index 465d42a1f1d..00000000000 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetriever.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.noderepo; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; -import java.net.URL; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Parse JSON from node repository and stores information as a NodeRepoJsonModel object. - * - * @author olaaun - * @author sgrostad - */ -public class NodeRepoInfoRetriever { - - private static final Logger logger = Logger.getLogger(NodeRepoInfoRetriever.class.getName()); - - public static NodeRepoJsonModel retrieve(List<URL> nodeInfoUrls) throws IOException { - NodeRepoJsonModel nodeRepoJsonModel; - ObjectMapper objectMapper = new ObjectMapper(); - for (URL nodeInfoURL : nodeInfoUrls) { - try { - nodeRepoJsonModel = objectMapper.readValue(nodeInfoURL, NodeRepoJsonModel.class); - return nodeRepoJsonModel; - } catch (IOException e) { - logger.log(Level.WARNING, "Failed to parse JSON from config server: " + nodeInfoURL.toString(), e); - } - } - throw new IOException("Failed to parse JSON from all possible config servers."); - } - -} - diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoJsonModel.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeSpec.java index 5d7ff0df8d1..68a8060a6ad 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoJsonModel.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeSpec.java @@ -1,8 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.commons.noderepo; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.net.InetAddresses; import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo; import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo.DiskType; @@ -13,29 +11,25 @@ import java.net.InetAddress; import java.util.stream.Stream; /** - * Object with the information node repositories has about the node. + * Object with the information about a node * - * @author olaaun - * @author sgrostad + * @author freva */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class NodeRepoJsonModel { - - @JsonProperty("minDiskAvailableGb") - private double minDiskAvailableGb; - @JsonProperty("minMainMemoryAvailableGb") - private double minMainMemoryAvailableGb; - @JsonProperty("minCpuCores") - private double minCpuCores; - @JsonProperty("fastDisk") - private boolean fastDisk; - @JsonProperty("ipAddresses") - private String[] ipAddresses; - @JsonProperty - private String hostname; - @JsonProperty - private String hardwareDivergence; - private String nodeRepoUrl; +public class NodeSpec { + private final double minDiskAvailableGb; + private final double minMainMemoryAvailableGb; + private final double minCpuCores; + private final boolean fastDisk; + private final String[] ipAddresses; + + public NodeSpec(double minDiskAvailableGb, double minMainMemoryAvailableGb, double minCpuCores, boolean fastDisk, + String[] ipAddresses) { + this.minDiskAvailableGb = minDiskAvailableGb; + this.minMainMemoryAvailableGb = minMainMemoryAvailableGb; + this.minCpuCores = minCpuCores; + this.fastDisk = fastDisk; + this.ipAddresses = ipAddresses; + } public HardwareInfo copyToHardwareInfo() { HardwareInfo hardwareInfo = new HardwareInfo(); @@ -60,29 +54,4 @@ public class NodeRepoJsonModel { .filter(ip -> ip instanceof Inet4Address) .findFirst().map(InetAddress::getHostAddress).orElse(null); } - - public double getMinDiskAvailableGb() { - return minDiskAvailableGb; - } - - public double getMinMainMemoryAvailableGb() { - return minMainMemoryAvailableGb; - } - - public double getMinCpuCores() { - return minCpuCores; - } - - public boolean isFastDisk() { - return fastDisk; - } - - public String getHostname() { - return hostname; - } - - public String getHardwareDivergence() { - return hardwareDivergence; - } - } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParser.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParser.java index 5da5abd4ad2..55bf1dd0e0b 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParser.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParser.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.node.verification.commons.parser; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.regex.Pattern; /** @@ -33,12 +34,10 @@ public class OutputParser { return results; } - public static ParseResult parseSingleOutput(ParseInstructions parseInstructions, List<String> commandOutput) { + public static Optional<ParseResult> parseSingleOutput(ParseInstructions parseInstructions, List<String> commandOutput) { List<ParseResult> parseResults = parseOutput(parseInstructions, commandOutput); - if (parseResults.size() == 0) { - return new ParseResult("invalid", "invalid"); - } - return parseResults.get(0); + if (parseResults.isEmpty()) return Optional.empty(); + return Optional.ofNullable(parseResults.get(0)); } private static boolean matchingSearchWord(List<String> searchWords, String searchWordCandidate) { diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/HardwareDivergenceReport.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/HardwareDivergenceReport.java index 11830c24cef..972733abdd2 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/HardwareDivergenceReport.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/HardwareDivergenceReport.java @@ -38,10 +38,6 @@ public class HardwareDivergenceReport { @JsonIgnore public boolean isHardwareDivergenceReportEmpty() { - if (specVerificationReport == null && benchmarkReport == null) { - return true; - } - return false; + return specVerificationReport == null && benchmarkReport == null; } - } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/Reporter.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/Reporter.java deleted file mode 100644 index 11835cab14b..00000000000 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/Reporter.java +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.report; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoInfoRetriever; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoJsonModel; - -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Responsible for printing hardware divergence report to standard out - * - * @author sgrostad - * @author olaaun - */ -public class Reporter { - - private static final Logger logger = Logger.getLogger(Reporter.class.getName()); - - private static void printHardwareDivergenceReport(HardwareDivergenceReport hardwareDivergenceReport) throws IOException { - ObjectMapper om = new ObjectMapper(); - String report; - if (hardwareDivergenceReport.isHardwareDivergenceReportEmpty()) { - report = "null"; - } else { - report = om.writeValueAsString(hardwareDivergenceReport); - } - System.out.print(report); - } - - public static void reportBenchmarkResults(BenchmarkReport benchmarkReport, List<URL> nodeInfoUrls) throws IOException { - HardwareDivergenceReport hardwareDivergenceReport = generateHardwareDivergenceReport(nodeInfoUrls); - hardwareDivergenceReport.setBenchmarkReport(benchmarkReport); - printHardwareDivergenceReport(hardwareDivergenceReport); - } - - public static void reportSpecVerificationResults(SpecVerificationReport specVerificationReport, List<URL> nodeInfoUrls) throws IOException { - HardwareDivergenceReport hardwareDivergenceReport = generateHardwareDivergenceReport(nodeInfoUrls); - hardwareDivergenceReport.setSpecVerificationReport(specVerificationReport); - printHardwareDivergenceReport(hardwareDivergenceReport); - } - - private static HardwareDivergenceReport generateHardwareDivergenceReport(List<URL> nodeInfoUrls) throws IOException { - NodeRepoJsonModel nodeRepoJsonModel = NodeRepoInfoRetriever.retrieve(nodeInfoUrls); - ObjectMapper om = new ObjectMapper(); - if (nodeRepoJsonModel.getHardwareDivergence() == null || nodeRepoJsonModel.getHardwareDivergence().equals("null")) { - return new HardwareDivergenceReport(); - } - try { - HardwareDivergenceReport hardwareDivergenceReport = om.readValue(nodeRepoJsonModel.getHardwareDivergence(), HardwareDivergenceReport.class); - return hardwareDivergenceReport; - } catch (IOException e) { - logger.log(Level.WARNING, "Failed to parse hardware divergence report from node repo. Report:\n" + nodeRepoJsonModel.getHardwareDivergence(), e.getMessage()); - return new HardwareDivergenceReport(); - } - } - -} diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarker.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarker.java index 7e151a6a87e..9b3d8f45e1d 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarker.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarker.java @@ -1,33 +1,35 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.hardware; -import com.yahoo.log.LogSetup; +import com.yahoo.vespa.hosted.node.verification.Main; import com.yahoo.vespa.hosted.node.verification.commons.CommandExecutor; -import com.yahoo.vespa.hosted.node.verification.commons.HostURLGenerator; import com.yahoo.vespa.hosted.node.verification.commons.report.BenchmarkReport; -import com.yahoo.vespa.hosted.node.verification.commons.report.Reporter; +import com.yahoo.vespa.hosted.node.verification.commons.report.HardwareDivergenceReport; import com.yahoo.vespa.hosted.node.verification.hardware.benchmarks.Benchmark; import com.yahoo.vespa.hosted.node.verification.hardware.benchmarks.BenchmarkResults; import com.yahoo.vespa.hosted.node.verification.hardware.benchmarks.CPUBenchmark; import com.yahoo.vespa.hosted.node.verification.hardware.benchmarks.DiskBenchmark; import com.yahoo.vespa.hosted.node.verification.hardware.benchmarks.MemoryBenchmark; +import io.airlift.command.Command; -import java.io.IOException; -import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; /** * Benchmarks different hardware components and creates report */ -public class HardwareBenchmarker { +@Command(name = "benchmark", description = "Run node benchmarks") +public class HardwareBenchmarker extends Main.VerifierCommand { - private static final Logger logger = Logger.getLogger(HardwareBenchmarker.class.getName()); + @Override + public void run(HardwareDivergenceReport hardwareDivergenceReport, CommandExecutor commandExecutor) { + BenchmarkReport benchmarkReport = hardwareBenchmarks(commandExecutor); - public static boolean hardwareBenchmarks(CommandExecutor commandExecutor, List<URL> nodeInfoUrls) throws IOException { + hardwareDivergenceReport.setBenchmarkReport(benchmarkReport); + } + + private BenchmarkReport hardwareBenchmarks(CommandExecutor commandExecutor) { BenchmarkResults benchmarkResults = new BenchmarkResults(); List<Benchmark> benchmarks = new ArrayList<>(Arrays.asList( new DiskBenchmark(benchmarkResults, commandExecutor), @@ -36,25 +38,6 @@ public class HardwareBenchmarker { for (Benchmark benchmark : benchmarks) { benchmark.doBenchmark(); } - BenchmarkReport benchmarkReport = BenchmarkResultInspector.makeBenchmarkReport(benchmarkResults); - Reporter.reportBenchmarkResults(benchmarkReport, nodeInfoUrls); - return benchmarkReport.isAllBenchmarksOK(); - } - - public static void main(String[] args) throws IOException { - LogSetup.initVespaLogging("hardware-benchmarker"); - CommandExecutor commandExecutor = new CommandExecutor(); - List<URL> nodeInfoUrls; - if (args.length == 0) { - throw new IllegalStateException("Expected config server URL as parameter"); - } - try { - nodeInfoUrls = HostURLGenerator.generateNodeInfoUrl(commandExecutor, args[0]); - HardwareBenchmarker.hardwareBenchmarks(commandExecutor, nodeInfoUrls); - } catch (IOException e) { - logger.log(Level.WARNING, e.getMessage()); - } - + return BenchmarkResultInspector.makeBenchmarkReport(benchmarkResults); } - } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/CPUBenchmark.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/CPUBenchmark.java index a55a92ba8a3..57763177a5b 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/CPUBenchmark.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/CPUBenchmark.java @@ -48,21 +48,21 @@ public class CPUBenchmark implements Benchmark { } } - protected List<ParseResult> parseCpuCyclesPerSec(List<String> commandOutput) { + List<ParseResult> parseCpuCyclesPerSec(List<String> commandOutput) { List<String> searchWords = new ArrayList<>(Arrays.asList(CYCLES_SEARCH_WORD, SECONDS_SEARCH_WORD)); ParseInstructions parseInstructions = new ParseInstructions(SEARCH_ELEMENT_INDEX, RETURN_ELEMENT_INDEX, SPLIT_REGEX_STRING, searchWords); return OutputParser.parseOutput(parseInstructions, commandOutput); } - protected void setCpuCyclesPerSec(List<ParseResult> parseResults) { + void setCpuCyclesPerSec(List<ParseResult> parseResults) { double cpuCyclesPerSec = getCyclesPerSecond(parseResults); if (cpuCyclesPerSec > 0) { benchmarkResults.setCpuCyclesPerSec(cpuCyclesPerSec); } } - protected double getCyclesPerSecond(List<ParseResult> parseResults) { + private double getCyclesPerSecond(List<ParseResult> parseResults) { double cycles = -1; double seconds = -1; for (ParseResult parseResult : parseResults) { @@ -83,7 +83,7 @@ public class CPUBenchmark implements Benchmark { return -1; } - protected double makeCyclesDouble(String cycles) { + double makeCyclesDouble(String cycles) { cycles = cycles.replaceAll("[^\\d]", ""); if (checkIfNumber(cycles)) { return Double.parseDouble(cycles); @@ -91,7 +91,7 @@ public class CPUBenchmark implements Benchmark { return -1; } - protected double makeSecondsDouble(String seconds) { + double makeSecondsDouble(String seconds) { seconds = seconds.replaceAll(",", "."); if (checkIfNumber(seconds)) { return Double.parseDouble(seconds); @@ -99,7 +99,7 @@ public class CPUBenchmark implements Benchmark { return -1; } - protected boolean checkIfNumber(String numberCandidate) { + boolean checkIfNumber(String numberCandidate) { if (numberCandidate == null || numberCandidate.equals("")) { return false; } @@ -111,7 +111,7 @@ public class CPUBenchmark implements Benchmark { return true; } - protected double convertToGHz(double cycles, double seconds) { + double convertToGHz(double cycles, double seconds) { double giga = 1000000000.0; return (cycles / seconds) / giga; } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmark.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmark.java index 39a6f66460b..a7fc5809058 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmark.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmark.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -42,25 +43,24 @@ public class DiskBenchmark implements Benchmark { public void doBenchmark() { try { List<String> commandOutput = commandExecutor.executeCommand(DISK_BENCHMARK_COMMAND); - ParseResult parseResult = parseDiskSpeed(commandOutput); + Optional<ParseResult> parseResult = parseDiskSpeed(commandOutput); setDiskSpeed(parseResult); } catch (IOException e) { logger.log(Level.WARNING, "Failed to perform disk benchmark", e); } } - protected ParseResult parseDiskSpeed(List<String> commandOutput) { + Optional<ParseResult> parseDiskSpeed(List<String> commandOutput) { List<String> searchWords = new ArrayList<>(Arrays.asList(KILO_BYTE_SEARCH_WORD, MEGA_BYTE_SEARCH_WORD, GIGA_BYTE_SEARCH_WORD)); ParseInstructions parseInstructions = new ParseInstructions(SEARCH_ELEMENT_INDEX, RETURN_ELEMENT_INDEX, SPLIT_REGEX_STRING, searchWords); return OutputParser.parseSingleOutput(parseInstructions, commandOutput); } - protected void setDiskSpeed(ParseResult parseResult) { - double diskSpeedMBs = getDiskSpeedInMBs(parseResult); - benchmarkResults.setDiskSpeedMbs(diskSpeedMBs); + void setDiskSpeed(Optional<ParseResult> parseResult) { + benchmarkResults.setDiskSpeedMbs(parseResult.map(this::getDiskSpeedInMBs).orElse(0.0d)); } - protected double getDiskSpeedInMBs(ParseResult parseResult) { + double getDiskSpeedInMBs(ParseResult parseResult) { double diskSpeedMBs = 0; double convertKBsToMBs = 1 / 1000.0; double convertGBsToMBs = 1000.0; @@ -85,7 +85,7 @@ public class DiskBenchmark implements Benchmark { return diskSpeedMBs; } - protected boolean checkSpeedValidity(String speed) { + boolean checkSpeedValidity(String speed) { try { Double.parseDouble(speed); } catch (NullPointerException | NumberFormatException e) { @@ -94,7 +94,7 @@ public class DiskBenchmark implements Benchmark { return true; } - protected Double convertToMBs(String speed, double numberToConvert) { + Double convertToMBs(String speed, double numberToConvert) { double speedMbs = Double.parseDouble(speed); return speedMbs * numberToConvert; } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmark.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmark.java index b701d9a02f8..7a72999a1e4 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmark.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmark.java @@ -7,9 +7,9 @@ import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseInstructions import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseResult; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -27,7 +27,8 @@ public class MemoryBenchmark implements Benchmark { private static final String MEM_BENCHMARK_DELETE_FOLDER = "rm -rf RAM_test"; private static final String MEM_BENCHMARK_WRITE_SPEED = "dd if=/dev/zero of=RAM_test/data_tmp bs=1M count=512"; private static final String MEM_BENCHMARK_READ_SPEED = "dd if=RAM_test/data_tmp of=/dev/null bs=1M count=512"; - private static final String READ_AND_WRITE_SEARCH_WORD = "GB/s"; + private static final String READ_AND_WRITE_SEARCH_WORD_GB = "GB/s"; + private static final String READ_AND_WRITE_SEARCH_WORD_MB = "MB/s"; private static final String SPLIT_REGEX_STRING = " "; private static final int SEARCH_ELEMENT_INDEX = 8; private static final int RETURN_ELEMENT_INDEX = 7; @@ -44,12 +45,12 @@ public class MemoryBenchmark implements Benchmark { public void doBenchmark() { try { setupMountPoint(); - List<String> commandOutput = commandExecutor.executeCommand(MEM_BENCHMARK_WRITE_SPEED); - ParseResult parseResult = parseMemorySpeed(commandOutput); - updateMemoryWriteSpeed(parseResult.getValue()); - commandOutput = commandExecutor.executeCommand(MEM_BENCHMARK_READ_SPEED); - parseResult = parseMemorySpeed(commandOutput); - updateMemoryReadSpeed(parseResult.getValue()); + + parseMemorySpeed(commandExecutor.executeCommand(MEM_BENCHMARK_WRITE_SPEED)) + .ifPresent(benchmarkResults::setMemoryWriteSpeedGBs); + + parseMemorySpeed(commandExecutor.executeCommand(MEM_BENCHMARK_READ_SPEED)) + .ifPresent(benchmarkResults::setMemoryReadSpeedGBs); } catch (IOException e) { logger.log(Level.WARNING, "Failed to perform memory benchmark", e); } finally { @@ -75,31 +76,27 @@ public class MemoryBenchmark implements Benchmark { } } - protected ParseResult parseMemorySpeed(List<String> commandOutput) { - List<String> searchWords = new ArrayList<>(Arrays.asList(READ_AND_WRITE_SEARCH_WORD)); - ParseInstructions parseInstructions = new ParseInstructions(SEARCH_ELEMENT_INDEX, RETURN_ELEMENT_INDEX, SPLIT_REGEX_STRING, searchWords); - return OutputParser.parseSingleOutput(parseInstructions, commandOutput); - } + protected Optional<Double> parseMemorySpeed(List<String> commandOutput) { + Optional<ParseResult> parseResultGb = parseMemorySpeed(commandOutput, READ_AND_WRITE_SEARCH_WORD_GB); + if (parseResultGb.isPresent()) return parseDouble(parseResultGb.get().getValue()); - protected void updateMemoryWriteSpeed(String memorySpeed) { - if (!isValidMemory(memorySpeed)) return; - double memoryWriteSpeedGbs = Double.parseDouble(memorySpeed); - benchmarkResults.setMemoryWriteSpeedGBs(memoryWriteSpeedGbs); + Optional<ParseResult> parseResultMb = parseMemorySpeed(commandOutput, READ_AND_WRITE_SEARCH_WORD_MB); + if (parseResultMb.isPresent()) return parseDouble(parseResultMb.get().getValue()).map(v -> v / 1000.0d); + + return Optional.empty(); } - protected void updateMemoryReadSpeed(String memorySpeed) { - if (!isValidMemory(memorySpeed)) return; - double memoryReadSpeedGbs = Double.parseDouble(memorySpeed); - benchmarkResults.setMemoryReadSpeedGBs(memoryReadSpeedGbs); + private Optional<ParseResult> parseMemorySpeed(List<String> commandOutput, String searchWord) { + List<String> searchWords = Collections.singletonList(searchWord); + ParseInstructions parseInstructions = new ParseInstructions(SEARCH_ELEMENT_INDEX, RETURN_ELEMENT_INDEX, SPLIT_REGEX_STRING, searchWords); + return OutputParser.parseSingleOutput(parseInstructions, commandOutput); } - protected boolean isValidMemory(String benchmarkOutput) { + private Optional<Double> parseDouble(String benchmarkOutput) { try { - Double.parseDouble(benchmarkOutput); + return Optional.of(Double.parseDouble(benchmarkOutput)); } catch (NumberFormatException | NullPointerException e) { - return false; + return Optional.empty(); } - return true; } - } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifier.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifier.java index e4cae4d7e9e..627477def0f 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifier.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifier.java @@ -1,24 +1,21 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.spec; -import com.yahoo.log.LogSetup; +import com.google.common.base.Strings; +import com.yahoo.vespa.defaults.Defaults; +import com.yahoo.vespa.hosted.node.verification.Main; import com.yahoo.vespa.hosted.node.verification.commons.CommandExecutor; -import com.yahoo.vespa.hosted.node.verification.commons.HostURLGenerator; import com.yahoo.vespa.hosted.node.verification.commons.noderepo.IPAddressVerifier; import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeJsonConverter; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoInfoRetriever; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoJsonModel; -import com.yahoo.vespa.hosted.node.verification.commons.report.Reporter; +import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeSpec; +import com.yahoo.vespa.hosted.node.verification.commons.report.HardwareDivergenceReport; import com.yahoo.vespa.hosted.node.verification.commons.report.SpecVerificationReport; import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo; import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfoRetriever; +import io.airlift.command.Command; +import io.airlift.command.Option; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.Optional; /** * Creates two HardwareInfo objects, one with spec from node repository and one from spec retrieved at the node. @@ -27,44 +24,47 @@ import java.util.logging.Logger; * @author olaaun * @author sgrostad */ -public class SpecVerifier { +@Command(name = "specification", description = "Verify that node's actual hardware and configuration matches the expected") +public class SpecVerifier extends Main.VerifierCommand { - private static final Logger logger = Logger.getLogger(SpecVerifier.class.getName()); + @Option(name = {"-d", "--disk"}, required = true, description = "Expected disk size in GB") + private double diskAvailableGb; - public static boolean verifySpec(CommandExecutor commandExecutor, List<URL> nodeInfoUrls) throws IOException { - NodeRepoJsonModel nodeRepoJsonModel = getNodeRepositoryJSON(nodeInfoUrls); - VerifierSettings verifierSettings = new VerifierSettings(nodeRepoJsonModel); - HardwareInfo actualHardware = HardwareInfoRetriever.retrieve(commandExecutor, verifierSettings); - SpecVerificationReport specVerificationReport = makeVerificationReport(actualHardware, nodeRepoJsonModel); - Reporter.reportSpecVerificationResults(specVerificationReport, nodeInfoUrls); - return specVerificationReport.isValidSpec(); - } + @Option(name = {"-m", "--memory"}, required = true, description = "Expected main memory size in GB") + private double mainMemoryAvailableGb; - protected static SpecVerificationReport makeVerificationReport(HardwareInfo actualHardware, NodeRepoJsonModel nodeRepoJsonModel) { - SpecVerificationReport specVerificationReport = HardwareNodeComparator.compare(NodeJsonConverter.convertJsonModelToHardwareInfo(nodeRepoJsonModel), actualHardware); - IPAddressVerifier ipAddressVerifier = new IPAddressVerifier(); - ipAddressVerifier.reportFaultyIpAddresses(nodeRepoJsonModel, specVerificationReport); - return specVerificationReport; - } + @Option(name = {"-c", "--cpu_cores"}, required = true, description = "Expected number of CPU cores") + private double cpuCores; + + @Option(name = {"-s", "--is_ssd"}, required = true, description = "Set to true if disk is SSD", allowedValues = {"true", "false"}) + private String fastDisk; + + @Option(name = {"-i", "--ips"}, description = "Comma separated list of IP addresses assigned to this node") + private String ipAddresses; - protected static NodeRepoJsonModel getNodeRepositoryJSON(List<URL> nodeInfoUrls) throws IOException { - NodeRepoJsonModel nodeRepoJsonModel = NodeRepoInfoRetriever.retrieve(nodeInfoUrls); - return nodeRepoJsonModel; + @Override + public void run(HardwareDivergenceReport hardwareDivergenceReport, CommandExecutor commandExecutor) { + String[] ips = Optional.ofNullable(ipAddresses) + .filter(s -> !Strings.isNullOrEmpty(s)) + .map(s -> s.split(",")) + .orElse(new String[0]); + + NodeSpec nodeSpec = new NodeSpec(diskAvailableGb, mainMemoryAvailableGb, cpuCores, Boolean.valueOf(fastDisk), ips); + SpecVerificationReport specVerificationReport = verifySpec(nodeSpec, commandExecutor); + + hardwareDivergenceReport.setSpecVerificationReport(specVerificationReport); } - public static void main(String[] args) { - LogSetup.initVespaLogging("spec-verifier"); - CommandExecutor commandExecutor = new CommandExecutor(); - List<URL> nodeInfoUrls; - if (args.length == 0) { - throw new IllegalStateException("Expected config server URL as parameter"); - } - try { - nodeInfoUrls = HostURLGenerator.generateNodeInfoUrl(commandExecutor, args[0]); - SpecVerifier.verifySpec(commandExecutor, nodeInfoUrls); - } catch (IOException e) { - logger.log(Level.WARNING, e.getMessage()); - } + private SpecVerificationReport verifySpec(NodeSpec nodeSpec, CommandExecutor commandExecutor) { + VerifierSettings verifierSettings = new VerifierSettings(nodeSpec); + HardwareInfo actualHardware = HardwareInfoRetriever.retrieve(commandExecutor, verifierSettings); + return makeVerificationReport(actualHardware, nodeSpec); } + private static SpecVerificationReport makeVerificationReport(HardwareInfo actualHardware, NodeSpec nodeSpec) { + SpecVerificationReport specVerificationReport = HardwareNodeComparator.compare(NodeJsonConverter.convertJsonModelToHardwareInfo(nodeSpec), actualHardware); + IPAddressVerifier ipAddressVerifier = new IPAddressVerifier(Defaults.getDefaults().vespaHostname()); + ipAddressVerifier.reportFaultyIpAddresses(nodeSpec, specVerificationReport); + return specVerificationReport; + } } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/VerifierSettings.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/VerifierSettings.java index 2b5a19ce818..f2e78d672cb 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/VerifierSettings.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/VerifierSettings.java @@ -1,7 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.spec; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoJsonModel; +import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeSpec; /** * Contains information on what spec should be verified or not. @@ -17,8 +17,8 @@ public class VerifierSettings { this.checkIPv6 = true; } - public VerifierSettings(NodeRepoJsonModel nodeRepoJsonModel) { - checkIPv6 = nodeRepoJsonModel.getIpv6Address() != null; + public VerifierSettings(NodeSpec nodeSpec) { + checkIPv6 = nodeSpec.getIpv6Address() != null; } public boolean isCheckIPv6() { diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/CPURetriever.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/CPURetriever.java index b8ae5d89b55..6416babb79b 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/CPURetriever.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/CPURetriever.java @@ -7,8 +7,7 @@ import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseInstructions import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseResult; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -46,18 +45,17 @@ public class CPURetriever implements HardwareRetriever { } } - protected List<ParseResult> parseCPUInfoFile(List<String> commandOutput) { - List<String> searchWords = new ArrayList<>(Arrays.asList(SEARCH_WORD)); + List<ParseResult> parseCPUInfoFile(List<String> commandOutput) { + List<String> searchWords = Collections.singletonList(SEARCH_WORD); ParseInstructions parseInstructions = new ParseInstructions(SEARCH_ELEMENT_INDEX, RETURN_ELEMENT_INDEX, REGEX_SPLIT, searchWords); - List<ParseResult> parseResults = OutputParser.parseOutput(parseInstructions, commandOutput); - return parseResults; + return OutputParser.parseOutput(parseInstructions, commandOutput); } - protected void setCpuCores(List<ParseResult> parseResults) { + void setCpuCores(List<ParseResult> parseResults) { hardwareInfo.setMinCpuCores(countCpuCores(parseResults)); } - protected int countCpuCores(List<ParseResult> parseResults) { + private int countCpuCores(List<ParseResult> parseResults) { return parseResults.size(); } diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetriever.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetriever.java index 8058c9438d7..2eb6bf80bc5 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetriever.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetriever.java @@ -8,8 +8,7 @@ import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseResult; import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo.DiskType; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -48,7 +47,7 @@ public class DiskRetriever implements HardwareRetriever { updateDiskSize(); } - protected void updateDiskType() { + void updateDiskType() { try { List<String> commandOutput = commandExecutor.executeCommand(DISK_CHECK_TYPE); ParseResult parseResult = parseDiskType(commandOutput); @@ -58,7 +57,7 @@ public class DiskRetriever implements HardwareRetriever { } } - protected void updateDiskSize() { + void updateDiskSize() { try { List<String> commandOutput = commandExecutor.executeCommand(DISK_CHECK_SIZE); List<ParseResult> parseResult = parseDiskSize(commandOutput); @@ -68,17 +67,14 @@ public class DiskRetriever implements HardwareRetriever { } } - protected ParseResult parseDiskType(List<String> commandOutput) throws IOException { - List<String> searchWords = new ArrayList<>(Arrays.asList(DISK_NAME)); + ParseResult parseDiskType(List<String> commandOutput) throws IOException { + List<String> searchWords = Collections.singletonList(DISK_NAME); ParseInstructions parseInstructions = new ParseInstructions(DISK_TYPE_SEARCH_ELEMENT_INDEX, DISK_TYPE_RETURN_ELEMENT_INDEX, DISK_TYPE_REGEX_SPLIT, searchWords); - ParseResult parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); - if (!parseResult.getSearchWord().equals(DISK_NAME)) { - throw new IOException("Parsing for disk type failed"); - } - return parseResult; + return OutputParser.parseSingleOutput(parseInstructions, commandOutput) + .orElseThrow(() -> new IOException("Parsing for disk type failed")); } - protected void setDiskType(ParseResult parseResult) { + void setDiskType(ParseResult parseResult) { hardwareInfo.setDiskType(DiskType.UNKNOWN); String fastDiskSymbol = "0"; String nonFastDiskSymbol = "1"; @@ -89,13 +85,13 @@ public class DiskRetriever implements HardwareRetriever { } } - protected List<ParseResult> parseDiskSize(List<String> commandOutput) { - List<String> searchWords = new ArrayList<>(Arrays.asList(DISK_SIZE_SEARCH_WORD)); + List<ParseResult> parseDiskSize(List<String> commandOutput) { + List<String> searchWords = Collections.singletonList(DISK_SIZE_SEARCH_WORD); ParseInstructions parseInstructions = new ParseInstructions(DISK_SIZE_SEARCH_ELEMENT_INDEX, DISK_SIZE_RETURN_ELEMENT_INDEX, DISK_SIZE_REGEX_SPLIT, searchWords); return OutputParser.parseOutput(parseInstructions, commandOutput); } - protected void setDiskSize(List<ParseResult> parseResults) { + private void setDiskSize(List<ParseResult> parseResults) { double diskSize = 0; try { for (ParseResult parseResult : parseResults) { diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareRetriever.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareRetriever.java index d77342db982..fe02262e80f 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareRetriever.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareRetriever.java @@ -5,7 +5,7 @@ package com.yahoo.vespa.hosted.node.verification.spec.retrievers; * @author olaaun * @author sgrostad */ -public interface HardwareRetriever { +interface HardwareRetriever { /** * Should retrieve spec from some part of the hardware, and store the result in hardwareinfo instance passed to class diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/MemoryRetriever.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/MemoryRetriever.java index c6655e13797..2f5bbfc48dd 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/MemoryRetriever.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/MemoryRetriever.java @@ -7,8 +7,7 @@ import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseInstructions import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseResult; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -46,22 +45,19 @@ public class MemoryRetriever implements HardwareRetriever { } } - protected ParseResult parseMemInfoFile(List<String> commandOutput) throws IOException { - List<String> searchWords = new ArrayList<>(Arrays.asList(SEARCH_WORD)); + ParseResult parseMemInfoFile(List<String> commandOutput) throws IOException { + List<String> searchWords = Collections.singletonList(SEARCH_WORD); ParseInstructions parseInstructions = new ParseInstructions(SEARCH_ELEMENT_INDEX, RETURN_ELEMENT_INDEX, REGEX_SPLIT, searchWords); - ParseResult parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); - if (!parseResult.getSearchWord().matches(SEARCH_WORD)) { - throw new IOException("Failed to parse memory info file."); - } - return parseResult; + return OutputParser.parseSingleOutput(parseInstructions, commandOutput) + .orElseThrow(() -> new IOException("Failed to parse memory info file.")); } - protected void updateMemoryInfo(ParseResult parseResult) { + void updateMemoryInfo(ParseResult parseResult) { double memory = convertKBToGB(parseResult.getValue()); hardwareInfo.setMinMainMemoryAvailableGb(memory); } - protected double convertKBToGB(String totMem) { + double convertKBToGB(String totMem) { String[] split = totMem.split(" "); double value = Double.parseDouble(split[0]); double kiloToGiga = 1000000.0; diff --git a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetriever.java b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetriever.java index f30d455f339..5afdbbb1c78 100644 --- a/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetriever.java +++ b/node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetriever.java @@ -11,6 +11,7 @@ import org.apache.commons.exec.ExecuteException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -63,7 +64,7 @@ public class NetRetriever implements HardwareRetriever { updateHardwareInfoWithNet(parseResults); } - protected List<ParseResult> findInterface() { + List<ParseResult> findInterface() { List<ParseResult> parseResults = new ArrayList<>(); try { List<String> commandOutput = commandExecutor.executeCommand(NET_FIND_INTERFACE); @@ -75,14 +76,13 @@ public class NetRetriever implements HardwareRetriever { return parseResults; } - protected List<ParseResult> parseNetInterface(List<String> commandOutput) { + List<ParseResult> parseNetInterface(List<String> commandOutput) { List<String> searchWords = new ArrayList<>(Arrays.asList(SEARCH_WORD_INTERFACE_IP4, SEARCH_WORD_INTERFACE_IPV6)); ParseInstructions parseInstructions = new ParseInstructions(INTERFACE_SEARCH_ELEMENT_INDEX, INTERFACE_RETURN_ELEMENT_INDEX, INTERFACE_NAME_REGEX_SPLIT, searchWords); - List<ParseResult> parseResults = OutputParser.parseOutput(parseInstructions, commandOutput); - return parseResults; + return OutputParser.parseOutput(parseInstructions, commandOutput); } - protected void findInterfaceSpeed(List<ParseResult> parseResults) { + void findInterfaceSpeed(List<ParseResult> parseResults) { try { List<String> commandOutput = commandExecutor.executeCommand(NET_CHECK_INTERFACE_SPEED); ParseResult parseResult = parseInterfaceSpeed(commandOutput); @@ -92,17 +92,14 @@ public class NetRetriever implements HardwareRetriever { } } - protected ParseResult parseInterfaceSpeed(List<String> commandOutput) throws IOException { - List<String> searchWords = new ArrayList<>(Arrays.asList(SEARCH_WORD_INTERFACE_SPEED)); + ParseResult parseInterfaceSpeed(List<String> commandOutput) throws IOException { + List<String> searchWords = Collections.singletonList(SEARCH_WORD_INTERFACE_SPEED); ParseInstructions parseInstructions = new ParseInstructions(INTERFACE_SPEED_SEARCH_ELEMENT_INDEX, INTERFACE_SPEED_RETURN_ELEMENT_INDEX, INTERFACE_SPEED_REGEX_SPLIT, searchWords); - ParseResult parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); - if (!parseResult.getSearchWord().matches(SEARCH_WORD_INTERFACE_SPEED)) { - throw new IOException("Failed to parse interface speed output."); - } - return parseResult; + return OutputParser.parseSingleOutput(parseInstructions, commandOutput) + .orElseThrow(() -> new IOException("Failed to parse interface speed output.")); } - protected void testPingResponse(List<ParseResult> parseResults) { + private void testPingResponse(List<ParseResult> parseResults) { try { List<String> commandOutput = commandExecutor.executeCommand(PING_NET_COMMAND); parseResults.add(parsePingResponse(commandOutput)); @@ -113,17 +110,14 @@ public class NetRetriever implements HardwareRetriever { } } - protected ParseResult parsePingResponse(List<String> commandOutput) throws IOException { - List<String> searchWords = new ArrayList<>(Arrays.asList(PING_SEARCH_WORD)); + ParseResult parsePingResponse(List<String> commandOutput) throws IOException { + List<String> searchWords = Collections.singletonList(PING_SEARCH_WORD); ParseInstructions parseInstructions = new ParseInstructions(PING_SEARCH_ELEMENT_INDEX, PING_RETURN_ELEMENT_INDEX, PING_SPLIT_REGEX_STRING, searchWords); - ParseResult parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); - if (!parseResult.getSearchWord().matches(PING_SEARCH_WORD)) { - throw new IOException("Failed to parse ping output."); - } - return new ParseResult(PING_SEARCH_WORD, parseResult.getValue()); + return new ParseResult(PING_SEARCH_WORD, OutputParser.parseSingleOutput(parseInstructions, commandOutput) + .orElseThrow(()->new IOException("Failed to parse ping output.")).getValue()); } - protected void updateHardwareInfoWithNet(List<ParseResult> parseResults) { + void updateHardwareInfoWithNet(List<ParseResult> parseResults) { hardwareInfo.setIpv6Interface(false); hardwareInfo.setIpv4Interface(false); for (ParseResult parseResult : parseResults) { @@ -147,11 +141,11 @@ public class NetRetriever implements HardwareRetriever { } } - protected double convertInterfaceSpeed(String speed) { + double convertInterfaceSpeed(String speed) { return Double.parseDouble(speed.replaceAll("[^\\d.]", "")); } - protected void setIpv6Connectivity(ParseResult parseResult) { + void setIpv6Connectivity(ParseResult parseResult) { String pingResponse = parseResult.getValue(); String packetLoss = pingResponse.replaceAll("[^\\d.]", ""); if (packetLoss.equals("")) return; diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/maintainer/CoreCollectorTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/maintainer/CoreCollectorTest.java index 6e308e0201e..869b53dc7a7 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/maintainer/CoreCollectorTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/maintainer/CoreCollectorTest.java @@ -58,7 +58,7 @@ public class CoreCollectorTest { } private void mockExec(String[] cmd, String output, String error) throws IOException, InterruptedException { - when(processExecuter.exec(cmd)).thenReturn(new Pair<Integer, String>(error.isEmpty() ? 0 : 1, output + error)); + when(processExecuter.exec(cmd)).thenReturn(new Pair<>(error.isEmpty() ? 0 : 1, output + error)); } static final String GDB_PATH = getDefaults().underVespaHome("bin64/gdb"); diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGeneratorTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGeneratorTest.java deleted file mode 100644 index 773172de807..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGeneratorTest.java +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons; - -import com.yahoo.vespa.hosted.node.verification.mock.MockCommandExecutor; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.net.URL; -import java.util.List; - - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -/** - * @author sgrostad - * @author olaaun - */ - -public class HostURLGeneratorTest { - - private MockCommandExecutor mockCommandExecutor; - private static final String CAT_NODE_HOST_NAME_PATH = "cat src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorTest"; - private static final String CAT_WRONG_HOSTNAME_PATH = "cat src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorExceptionTest"; - private static final String CONFIG_SERVER_HOSTNAME_1 = "http://cfg1.prod.region1:4080"; - private static final String CONFIG_SERVER_HOSTNAME_2 = "http://cfg2.prod.region1:4080"; - private static final String NODE_HOSTNAME_PREFIX = "/nodes/v2/node/"; - private static final String EXPECTED_HOSTNAME = "expected.hostname"; - - @Before - public void setup() { - mockCommandExecutor = new MockCommandExecutor(); - } - - - @Test - public void generateNodeInfoUrl_find_config_server_test_if_url_is_formatted_correctly() throws Exception { - mockCommandExecutor.addCommand(CAT_NODE_HOST_NAME_PATH); - List<URL> urls = HostURLGenerator.generateNodeInfoUrl(mockCommandExecutor, CONFIG_SERVER_HOSTNAME_1 + "," + CONFIG_SERVER_HOSTNAME_2); - String expectedUrl1 = CONFIG_SERVER_HOSTNAME_1 + NODE_HOSTNAME_PREFIX + EXPECTED_HOSTNAME; - String expectedUrl2 = CONFIG_SERVER_HOSTNAME_2 + NODE_HOSTNAME_PREFIX + EXPECTED_HOSTNAME; - assertEquals(expectedUrl1, urls.get(0).toString()); - assertEquals(expectedUrl2, urls.get(1).toString()); - } - - @Test - public void generateNodeInfoURL_expected_IOException() { - try { - mockCommandExecutor.addCommand(CAT_WRONG_HOSTNAME_PATH); - HostURLGenerator.generateNodeInfoUrl(mockCommandExecutor, CONFIG_SERVER_HOSTNAME_1); - fail("Expected an IOException to be thrown"); - } catch (IOException e) { - String expectedExceptionMessage = "Unexpected output from \"hostname\" command."; - assertEquals(expectedExceptionMessage, e.getMessage()); - } - } - - @Test - public void generateNodeInfoUrl_retrieve_config_server_as_parameter_test_if_url_is_formatted_correctly() throws Exception { - mockCommandExecutor.addCommand(CAT_NODE_HOST_NAME_PATH); - String configServerHostname = "cfg1.prod.region1"; - List<URL> actualUrls = HostURLGenerator.generateNodeInfoUrl(mockCommandExecutor, configServerHostname); - String expectedUrl = CONFIG_SERVER_HOSTNAME_1 + NODE_HOSTNAME_PREFIX + EXPECTED_HOSTNAME; - String actualUrl = actualUrls.get(0).toString(); - assertEquals(expectedUrl, actualUrl); - } - - @Test - public void buildNodeInfoURL_should_add_protocol_and_port_in_front_when_protocol_is_absent() throws IOException { - String configServerHostName = "www.yahoo.com"; - String nodeHostName = "index.html"; - String nodeHostnamePrefix = "/nodes/v2/node/"; - String portNumber = ":4080"; - String expectedUrl = "http://" + configServerHostName + portNumber + nodeHostnamePrefix + nodeHostName; - assertEquals(expectedUrl, HostURLGenerator.buildNodeInfoURL(configServerHostName, nodeHostName).toString()); - } - - @Test - public void buildNodeInfoURL_should_not_add_protocol_and_port_in_front_when_protocol_already_exists() throws IOException { - String configServerHostName = "http://www.yahoo.com"; - String nodeHostName = "index.html"; - String nodeHostnamePrefix = "/nodes/v2/node/"; - String expectedUrl = configServerHostName + nodeHostnamePrefix + nodeHostName; - assertEquals(expectedUrl, HostURLGenerator.buildNodeInfoURL(configServerHostName, nodeHostName).toString()); - } - -} diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifierTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifierTest.java index 197b4836bc8..fc846e3eba6 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifierTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifierTest.java @@ -4,11 +4,6 @@ package com.yahoo.vespa.hosted.node.verification.commons.noderepo; import org.junit.Before; import org.junit.Test; -import java.net.URL; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; - import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doReturn; @@ -18,46 +13,38 @@ import static org.mockito.Mockito.spy; * @author sgrostad * @author olaaun */ - public class IPAddressVerifierTest { - private IPAddressVerifier ipAddressVerifier = spy(new IPAddressVerifier()); - private String ipv4Address; - private String ipv6Address; - private NodeRepoJsonModel nodeRepoJsonModel; - private static final String ABSOLUTE_PATH = Paths.get(".").toAbsolutePath().normalize().toString(); - private static final String RESOURCE_PATH = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/IPAddressVerifierTest.json"; - private static final String URL_RESOURCE_PATH = "file://" + ABSOLUTE_PATH + "/" + RESOURCE_PATH; + private final String ipv4Address = "10.2.4.8"; + private final String ipv6Address = "fdab:0:0:0:0:0:0:1234"; + private final NodeSpec nodeSpec = new NodeSpec(1920, 256, 48, true, new String[]{ipv4Address, ipv6Address}); + private final String hostname = "test123.region.domain.tld"; + + private IPAddressVerifier ipAddressVerifier = spy(new IPAddressVerifier(hostname)); private String ipv4LookupFormat; private String ipv6LookupFormat; @Before public void setup() throws Exception { - ipv4Address = "172.16.254.1"; - ipv6Address = "2001:db8:0:1234:0:567:8:1"; - ArrayList<URL> nodeRepoUrl = new ArrayList<>(Arrays.asList(new URL(URL_RESOURCE_PATH))); - nodeRepoJsonModel = NodeRepoInfoRetriever.retrieve(nodeRepoUrl); - ipv4LookupFormat = "1.254.16.172.in-addr.arpa"; - ipv6LookupFormat = "1.0.0.0.8.0.0.0.7.6.5.0.0.0.0.0.4.3.2.1.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"; + ipv4LookupFormat = "8.4.2.10.in-addr.arpa"; + ipv6LookupFormat = "4.3.2.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.a.d.f.ip6.arpa"; } @Test public void getFaultyIpAddresses_should_return_IP_address_when_different_hostname() throws Exception { - String realHostName = "host.name"; String wrongHostName = "www.yahoo.com"; - doReturn(realHostName).when(ipAddressVerifier).reverseLookUp(ipv4LookupFormat); + doReturn(hostname).when(ipAddressVerifier).reverseLookUp(ipv4LookupFormat); doReturn(wrongHostName).when(ipAddressVerifier).reverseLookUp(ipv6LookupFormat); - String[] faultyIpAddresses = ipAddressVerifier.getFaultyIpAddresses(nodeRepoJsonModel); + String[] faultyIpAddresses = ipAddressVerifier.getFaultyIpAddresses(nodeSpec); String[] expectedFaultyIpAddresses = new String[]{ipv6Address}; assertArrayEquals(expectedFaultyIpAddresses, faultyIpAddresses); } @Test public void getFaultyIpAddresses_should_return_empty_array_when_all_addresses_point_to_correct_hostname() throws Exception { - String realHostName = "host.name"; - doReturn(realHostName).when(ipAddressVerifier).reverseLookUp(ipv4LookupFormat); - doReturn(realHostName).when(ipAddressVerifier).reverseLookUp(ipv6LookupFormat); - String[] faultyIpAddresses = ipAddressVerifier.getFaultyIpAddresses(nodeRepoJsonModel); + doReturn(hostname).when(ipAddressVerifier).reverseLookUp(ipv4LookupFormat); + doReturn(hostname).when(ipAddressVerifier).reverseLookUp(ipv6LookupFormat); + String[] faultyIpAddresses = ipAddressVerifier.getFaultyIpAddresses(nodeSpec); String[] expectedFaultyIpAddresses = new String[]{}; assertArrayEquals(expectedFaultyIpAddresses, faultyIpAddresses); } @@ -76,7 +63,8 @@ public class IPAddressVerifierTest { @Test public void getFaultyIpAddresses_should_return_empty_array_when_parameters_are_invalid() { - assertEquals(0, ipAddressVerifier.getFaultyIpAddresses(new NodeRepoJsonModel()).length); + final NodeSpec nodeWithNoIP = new NodeSpec(1920, 256, 48, true, new String[0]); + assertEquals(0, ipAddressVerifier.getFaultyIpAddresses(nodeWithNoIP).length); } } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverterTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverterTest.java deleted file mode 100644 index 0940efd08d3..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverterTest.java +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.noderepo; - -import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo; -import org.junit.Test; - -import java.io.File; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author sgrostad - * @author olaaun - */ - -public class NodeJsonConverterTest { - - private static final double DELTA = 0.1; - - @Test - public void convertJsonModel_should_return_correct_HardwareInfo() throws Exception { - List<URL> urls = new ArrayList<>(Arrays.asList(new File("src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json").toURI().toURL())); - NodeRepoJsonModel nodeRepoJsonModel = NodeRepoInfoRetriever.retrieve(urls); - HardwareInfo hardwareInfo = NodeJsonConverter.convertJsonModelToHardwareInfo(nodeRepoJsonModel); - double expectedMinDiskAvailable = 500.0; - double expectedMinMainMemoryAvailable = 24.0; - double expectedMinCpuCores = 24.0; - double expectedInterfaceSpeedMbs = 1000; - assertEquals(expectedMinDiskAvailable, hardwareInfo.getMinDiskAvailableGb(), DELTA); - assertEquals(expectedMinMainMemoryAvailable, hardwareInfo.getMinMainMemoryAvailableGb(), DELTA); - assertEquals(expectedMinCpuCores, hardwareInfo.getMinCpuCores(), DELTA); - assertTrue(hardwareInfo.getIpv4Interface()); - assertFalse(hardwareInfo.getIpv6Interface()); - assertEquals(expectedInterfaceSpeedMbs, hardwareInfo.getInterfaceSpeedMbs(), DELTA); - assertEquals(hardwareInfo.getDiskType(), HardwareInfo.DiskType.SLOW); - } - -} diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetrieverTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetrieverTest.java deleted file mode 100644 index 97bf3fdeb11..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetrieverTest.java +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.noderepo; - -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -/** - * @author sgrostad - * @author olaaun - */ - -public class NodeRepoInfoRetrieverTest { - - private NodeRepoInfoRetriever nodeRepoInfoRetriever; - private List<URL> urls; - private static final double DELTA = 0.1; - private static final String ABSOLUTE_PATH = Paths.get(".").toAbsolutePath().normalize().toString(); - private static final String RESOURCE_PATH = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources"; - private static final String URL_RESOURCE_PATH = "file://" + ABSOLUTE_PATH + "/" + RESOURCE_PATH; - - @Before - public void setup() { - nodeRepoInfoRetriever = new NodeRepoInfoRetriever(); - urls = new ArrayList<>(); - } - - @Test - public void retrieve_should_return_nodeJSONModel_when_parameter_contains_valid_url() throws IOException { - urls.add(new URL(URL_RESOURCE_PATH + "/nodeInfoTest.json")); - NodeRepoJsonModel nodeRepoJsonModel = NodeRepoInfoRetriever.retrieve(urls); - double expectedMinDiskAvailable = 500.0; - double expectedMinMainMemoryAvailable = 24.0; - double expectedMinCpuCores = 24.0; - assertEquals(expectedMinDiskAvailable, nodeRepoJsonModel.getMinDiskAvailableGb(), DELTA); - assertEquals(expectedMinMainMemoryAvailable, nodeRepoJsonModel.getMinMainMemoryAvailableGb(), DELTA); - assertEquals(expectedMinCpuCores, nodeRepoJsonModel.getMinCpuCores(), DELTA); - } - - @Test - public void retrieve_should_throw_IOException_when_no_valid_URLs() throws MalformedURLException { - urls = new ArrayList<>(); - String exceptionMessage = "Failed to parse JSON from all possible config servers."; - try { - NodeRepoInfoRetriever.retrieve(urls); - fail("Retrieve should have thrown IOException"); - } catch (IOException e) { - assertEquals(exceptionMessage, e.getMessage()); - } - urls.add(new URL("file:///dev/null")); - try { - NodeRepoInfoRetriever.retrieve(urls); - fail("Retrieve should have thrown IOException"); - } catch (IOException e) { - assertEquals(exceptionMessage, e.getMessage()); - } - } - -} diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParserTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParserTest.java index 09286f4e61a..06d34a452eb 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParserTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParserTest.java @@ -6,7 +6,9 @@ import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Optional; import static org.junit.Assert.assertEquals; @@ -56,7 +58,7 @@ public class OutputParserTest { @Test public void parseOutput_searching_for_word_containing_capital_s() { - searchWords = new ArrayList<>(Arrays.asList(REGEX_SEARCH_WORD)); + searchWords = Collections.singletonList(REGEX_SEARCH_WORD); ParseInstructions parseInstructions = new ParseInstructions(1, 8, " ", searchWords); List<ParseResult> parseResults = OutputParser.parseOutput(parseInstructions, commandOutput); ParseResult expectedParseResult1 = new ParseResult("Should", RETURN_VALUE); @@ -67,20 +69,19 @@ public class OutputParserTest { @Test public void parseSingleOutput_should_return_first_match() { - searchWords = new ArrayList<>(Arrays.asList(SEARCH_WORD_1)); + searchWords = Collections.singletonList(SEARCH_WORD_1); ParseInstructions parseInstructions = new ParseInstructions(6, 8, " ", searchWords); - ParseResult parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); + Optional<ParseResult> parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); ParseResult expectedParseResult = new ParseResult(SEARCH_WORD_1, RETURN_VALUE); - assertEquals(expectedParseResult, parseResult); + assertEquals(Optional.of(expectedParseResult), parseResult); } @Test public void parseSingleOutput_should_return_invalid_parseResult() { - searchWords = new ArrayList<>(Arrays.asList("No match")); + searchWords = Collections.singletonList("No match"); ParseInstructions parseInstructions = new ParseInstructions(6, 8, " ", searchWords); - ParseResult parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); - ParseResult expectedParseResult = new ParseResult("invalid", "invalid"); - assertEquals(expectedParseResult, parseResult); + Optional<ParseResult> parseResult = OutputParser.parseSingleOutput(parseInstructions, commandOutput); + assertEquals(Optional.empty(), parseResult); } } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/BenchmarkReportTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/BenchmarkReportTest.java deleted file mode 100644 index 931b42bb2a0..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/BenchmarkReportTest.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.report; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * @author sgrostad - * @author olaaun - */ - -public class BenchmarkReportTest { - - private BenchmarkReport benchmarkReport = new BenchmarkReport(); - - @Test - public void create_report_from_BenchmarkResults_should_create_correct_report() throws Exception { - double expectedCpuCyclesPerSec = 4; - double expectedDiskSpeedMbps = 120; - double expectedMemoryReadSpeedGBs = 7.1; - double expectedMemoryWriteSpeedGBs = 5.9; - benchmarkReport.setCpuCyclesPerSec(expectedCpuCyclesPerSec); - benchmarkReport.setDiskSpeedMbs(expectedDiskSpeedMbps); - benchmarkReport.setMemoryReadSpeedGBs(expectedMemoryReadSpeedGBs); - benchmarkReport.setMemoryWriteSpeedGBs(expectedMemoryWriteSpeedGBs); - ObjectMapper om = new ObjectMapper(); - String expectedResultJson = "{\"cpuCyclesPerSec\":4.0,\"diskSpeedMbs\":120.0,\"memoryWriteSpeedGBs\":5.9,\"memoryReadSpeedGBs\":7.1}"; - assertEquals(expectedResultJson, om.writeValueAsString(benchmarkReport)); - } - -} diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/ReporterTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/ReporterTest.java deleted file mode 100644 index 5f469db7f53..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/ReporterTest.java +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.report; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.net.URL; -import java.nio.file.Paths; -import java.util.List; -import java.util.ArrayList; -import java.util.Arrays; - -import static org.junit.Assert.assertEquals; - -/** - * @author sgrostad - * @author olaaun - */ - -public class ReporterTest { - - private final ByteArrayOutputStream println = new ByteArrayOutputStream(); - private static final String ABSOLUTE_PATH = Paths.get(".").toAbsolutePath().normalize().toString(); - private static final String RESOURCE_PATH_TO_VALID_HARDWARE_DIVERGENCE = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json"; - private static final String RESOURCE_PATH_TO_INVALID_HARDWARE_DIVERGENCE = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoNotInterpretableHardwareDivergence.json"; - private static final String RESOURCE_PATH_TO_EMPTY_HARDWARE_DIVERGENCE = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepo.json"; - private static final String URL_VALID_RESOURCE_PATH = "file://" + ABSOLUTE_PATH + "/" + RESOURCE_PATH_TO_VALID_HARDWARE_DIVERGENCE; - private static final String URL_INVALID_RESOURCE_PATH = "file://" + ABSOLUTE_PATH + "/" + RESOURCE_PATH_TO_INVALID_HARDWARE_DIVERGENCE; - private static final String URL_EMPTY_RESOURCE_PATH = "file://" + ABSOLUTE_PATH + "/" + RESOURCE_PATH_TO_EMPTY_HARDWARE_DIVERGENCE; - private static List<URL> nodeInfoUrlsToValidHardwareDivergence; - private static List<URL> nodeInfoUrlsToNOTValidHardwareDivergence; - private static List<URL> nodeInfoUrlsWithNoHardwareDivergence; - - @Before - public void setup() throws IOException { - System.setOut(new PrintStream(println)); - URL nodeInfoUrlWithAlreadyExistingHardwareDivergence = new URL(URL_VALID_RESOURCE_PATH); - nodeInfoUrlsToValidHardwareDivergence = new ArrayList<>(Arrays.asList(nodeInfoUrlWithAlreadyExistingHardwareDivergence)); - URL nodeInfoUrlWithExistingButWrongHardwareDivergence = new URL(URL_INVALID_RESOURCE_PATH); - nodeInfoUrlsToNOTValidHardwareDivergence = new ArrayList<>(Arrays.asList(nodeInfoUrlWithExistingButWrongHardwareDivergence)); - URL nodeInfoUrlWithNoHardwareDivergence = new URL(URL_EMPTY_RESOURCE_PATH); - nodeInfoUrlsWithNoHardwareDivergence = new ArrayList<>(Arrays.asList(nodeInfoUrlWithNoHardwareDivergence)); - } - - @After - public void cleanUpStream() { - System.setOut(System.out); - } - - @Test - public void reportBenchmarkResults_should_update_already_existing_hardwareDivergence_changing_existing_values() throws Exception { - BenchmarkReport benchmarkReport = new BenchmarkReport(); - double cpuCyclesPerSec = 0.3; - double memoryReadSpeedGBs = 0.1; - benchmarkReport.setCpuCyclesPerSec(cpuCyclesPerSec); - benchmarkReport.setMemoryReadSpeedGBs(memoryReadSpeedGBs); - String expectedReport = "{\"benchmarkReport\":{\"cpuCyclesPerSec\":0.3,\"memoryReadSpeedGBs\":0.1}}"; - Reporter.reportBenchmarkResults(benchmarkReport, nodeInfoUrlsToValidHardwareDivergence); - assertEquals(expectedReport, println.toString()); - } - - @Test - public void reportBenchmarkResults_should_should_update_already_existing_hardwareDivergence_prints_null_when_empty_benchmarkReport() throws Exception { - BenchmarkReport benchmarkReport = new BenchmarkReport(); - String expectedReport = "null"; - Reporter.reportBenchmarkResults(benchmarkReport, nodeInfoUrlsToValidHardwareDivergence); - assertEquals(expectedReport, println.toString()); - } - - @Test - public void reportSpecVerificationResults_should_update_already_existing_hardwareDivergence_adding_report_type() throws Exception { - SpecVerificationReport specVerificationReport = new SpecVerificationReport(); - double actualDiskSpaceAvailable = 150D; - boolean actualIpv6Connection = false; - specVerificationReport.setActualDiskSpaceAvailable(actualDiskSpaceAvailable); - specVerificationReport.setActualIpv6Connection(actualIpv6Connection); - String expectedReport = "{\"specVerificationReport\":{\"actualDiskSpaceAvailable\":150.0,\"actualIpv6Connection\":false},\"benchmarkReport\":{\"cpuCyclesPerSec\":0.5}}"; - Reporter.reportSpecVerificationResults(specVerificationReport, nodeInfoUrlsToValidHardwareDivergence); - assertEquals(expectedReport, println.toString()); - } - - @Test - public void reportSpecVerificationResults_make_new_correct_hardwareDivergence_because_old_is_wrong() throws Exception { - SpecVerificationReport specVerificationReport = new SpecVerificationReport(); - double actualDiskSpaceAvailable = 150D; - specVerificationReport.setActualDiskSpaceAvailable(actualDiskSpaceAvailable); - String expectedReport = "{\"specVerificationReport\":{\"actualDiskSpaceAvailable\":150.0}}"; - Reporter.reportSpecVerificationResults(specVerificationReport, nodeInfoUrlsToNOTValidHardwareDivergence); - assertEquals(expectedReport, println.toString()); - } - - @Test - public void reportSpecVerificationResults_make_new_empty_hardwareDivergence_because_there_is_no_old() throws Exception { - SpecVerificationReport specVerificationReport = new SpecVerificationReport(); - String expectedReport = "null"; - Reporter.reportSpecVerificationResults(specVerificationReport, nodeInfoUrlsWithNoHardwareDivergence); - assertEquals(expectedReport, println.toString()); - } - -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/SpecVerificationReportTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/SpecVerificationReportTest.java deleted file mode 100644 index 72629cc565d..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/SpecVerificationReportTest.java +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.node.verification.commons.report; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yahoo.vespa.hosted.node.verification.mock.MockCommandExecutor; -import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * @author sgrostad - * @author olaaun - */ - -public class SpecVerificationReportTest { - - private SpecVerificationReport specVerificationReport; - private static final String REPORT_PATH = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/reportJSON"; - - @Before - public void setup() { - specVerificationReport = new SpecVerificationReport(); - } - - @Test - public void VerificationReport_returns_empty_string_when_all_specs_are_correct() throws Exception { - String expectedJson = "{}"; - ObjectMapper om = new ObjectMapper(); - String actualJson = om.writeValueAsString(specVerificationReport); - assertEquals(expectedJson, actualJson); - } - - @Test - public void Json_is_in_wanted_format_when_all_specs_are_wrong() throws Exception { - specVerificationReport.setActualInterfaceSpeed(100D); - specVerificationReport.setActualDiskSpaceAvailable(500D); - specVerificationReport.setActualDiskType(HardwareInfo.DiskType.FAST); - specVerificationReport.setActualMemoryAvailable(123D); - specVerificationReport.setActualcpuCores(4); - specVerificationReport.setFaultyIpAddresses(new String[]{"2001:db8:0:1234:0:567:8:1"}); - String expectedJson = MockCommandExecutor.readFromFile(REPORT_PATH).get(0); - ObjectMapper om = new ObjectMapper(); - String actualJson = om.writeValueAsString(specVerificationReport); - assertEquals(expectedJson, actualJson); - } - -} diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarkerTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarkerTest.java index 6848fc045e2..13e13f1f83f 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarkerTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarkerTest.java @@ -1,52 +1,77 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.hardware; +import com.yahoo.vespa.hosted.node.verification.Main; import com.yahoo.vespa.hosted.node.verification.mock.MockCommandExecutor; -import org.junit.Before; import org.junit.Test; -import java.net.URL; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; - -import static org.junit.Assert.assertTrue; - -/** - * @author sgrostad - * @author olaaun - */ +import static org.junit.Assert.assertEquals; public class HardwareBenchmarkerTest { - private MockCommandExecutor mockCommandExecutor; private static final String RESOURCE_PATH = "src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/"; private static final String VALID_DISK_BENCHMARK_PATH = RESOURCE_PATH + "diskBenchmarkValidOutput"; + private static final String VALID_SLOW_DISK_BENCHMARK_PATH = RESOURCE_PATH + "diskBenchmarkValidSlowOutput"; private static final String VALID_CPU_BENCHMARK_PATH = RESOURCE_PATH + "cpuCyclesWithCommasTimeWithDotTest.txt"; private static final String VALID_MEMORY_WRITE_BENCHMARK_PATH = RESOURCE_PATH + "validMemoryWriteSpeed"; private static final String VALID_MEMORY_READ_BENCHMARK_PATH = RESOURCE_PATH + "validMemoryReadSpeed"; - private static final String ABSOLUTE_PATH = Paths.get(".").toAbsolutePath().normalize().toString(); - private static final String VALID_NODE_REPO_JSON_WITHOUT_HARDWARE_DIVERGENCE = RESOURCE_PATH + "nodeRepoWithoutHardwareDivergence.json"; - private static final String URL_TO_NODE_REPO_JSON = "file://" + ABSOLUTE_PATH + "/" + VALID_NODE_REPO_JSON_WITHOUT_HARDWARE_DIVERGENCE; + private final MockCommandExecutor commandExecutor = new MockCommandExecutor(); + + @Test + public void benchmark_with_no_failures() throws Exception { + commandExecutor.addCommand("cat " + VALID_DISK_BENCHMARK_PATH); + commandExecutor.addCommand("cat " + VALID_CPU_BENCHMARK_PATH); + commandExecutor.addDummyCommand(); + commandExecutor.addDummyCommand(); + commandExecutor.addCommand("cat " + VALID_MEMORY_WRITE_BENCHMARK_PATH); + commandExecutor.addCommand("cat " + VALID_MEMORY_READ_BENCHMARK_PATH); + commandExecutor.addDummyCommand(); + commandExecutor.addDummyCommand(); - @Before - public void setup() { - mockCommandExecutor = new MockCommandExecutor(); + String result = Main.execute(new String[] { + "benchmark", + }, commandExecutor); + assertEquals("null", result); } @Test - public void hardwareBenchmarks_should_return_true() throws Exception { - mockCommandExecutor.addCommand("cat " + VALID_DISK_BENCHMARK_PATH); - mockCommandExecutor.addCommand("cat " + VALID_CPU_BENCHMARK_PATH); - mockCommandExecutor.addDummyCommand(); - mockCommandExecutor.addDummyCommand(); - mockCommandExecutor.addCommand("cat " + VALID_MEMORY_WRITE_BENCHMARK_PATH); - mockCommandExecutor.addCommand("cat " + VALID_MEMORY_READ_BENCHMARK_PATH); - mockCommandExecutor.addDummyCommand(); - mockCommandExecutor.addDummyCommand(); - assertTrue(HardwareBenchmarker.hardwareBenchmarks(mockCommandExecutor, new ArrayList<URL>(Arrays.asList(new URL(URL_TO_NODE_REPO_JSON))))); + public void disk_benchmark_failure() throws Exception { + commandExecutor.addCommand("cat " + VALID_SLOW_DISK_BENCHMARK_PATH); + commandExecutor.addCommand("cat " + VALID_CPU_BENCHMARK_PATH); + commandExecutor.addDummyCommand(); + commandExecutor.addDummyCommand(); + commandExecutor.addCommand("cat " + VALID_MEMORY_WRITE_BENCHMARK_PATH); + commandExecutor.addCommand("cat " + VALID_MEMORY_READ_BENCHMARK_PATH); + commandExecutor.addDummyCommand(); + commandExecutor.addDummyCommand(); + + String result = Main.execute(new String[]{ + "benchmark", + }, commandExecutor); + + assertEquals("{\"benchmarkReport\":{\"diskSpeedMbs\":49.0}}", result); } + @Test + public void preserve_previous_spec_verifier_result() throws Exception { + commandExecutor.addCommand("cat " + VALID_DISK_BENCHMARK_PATH); + commandExecutor.addCommand("cat " + VALID_CPU_BENCHMARK_PATH); + commandExecutor.addDummyCommand(); + commandExecutor.addDummyCommand(); + commandExecutor.addCommand("cat " + VALID_MEMORY_WRITE_BENCHMARK_PATH); + commandExecutor.addCommand("cat " + VALID_MEMORY_READ_BENCHMARK_PATH); + commandExecutor.addDummyCommand(); + commandExecutor.addDummyCommand(); + + final String previousResult = "{\"specVerificationReport\":{\"actualMemoryAvailable\":4.042128}}"; + + String result = Main.execute(new String[] { + "benchmark", + "-h", previousResult + }, commandExecutor); + + assertEquals(previousResult, result); + } } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmarkTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmarkTest.java index 8254718f36d..f2dbfbdbb6f 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmarkTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmarkTest.java @@ -6,8 +6,8 @@ import com.yahoo.vespa.hosted.node.verification.mock.MockCommandExecutor; import org.junit.Before; import org.junit.Test; -import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -58,31 +58,29 @@ public class DiskBenchmarkTest { @Test public void parseDiskSpeed_valid_input() throws Exception { List<String> mockCommandOutput = MockCommandExecutor.readFromFile(VALID_OUTPUT_FILE); - ParseResult parseResult = diskBenchmark.parseDiskSpeed(mockCommandOutput); + Optional<ParseResult> parseResult = diskBenchmark.parseDiskSpeed(mockCommandOutput); ParseResult expectedParseResult = new ParseResult("MB/s", "243"); - assertEquals(expectedParseResult, parseResult); + assertEquals(Optional.of(expectedParseResult), parseResult); } @Test public void parseDiskSpeed_invalid_input() throws Exception { List<String> mockCommandOutput = MockCommandExecutor.readFromFile(INVALID_OUTPUT_FILE); - ParseResult parseResult = diskBenchmark.parseDiskSpeed(mockCommandOutput); - ParseResult expectedParseResult = new ParseResult("invalid", "invalid"); - assertEquals(expectedParseResult, parseResult); + Optional<ParseResult> parseResult = diskBenchmark.parseDiskSpeed(mockCommandOutput); + assertEquals(Optional.empty(), parseResult); } @Test public void setDiskSpeed_valid_input() { ParseResult parseResult = new ParseResult("MB/s", "243"); - diskBenchmark.setDiskSpeed(parseResult); + diskBenchmark.setDiskSpeed(Optional.of(parseResult)); double expectedDiskSpeed = 243; assertEquals(expectedDiskSpeed, benchmarkResults.getDiskSpeedMbs(), DELTA); } @Test public void setDiskSpeed_invalid_input() { - ParseResult parseResult = new ParseResult("invalid", "invalid"); - diskBenchmark.setDiskSpeed(parseResult); + diskBenchmark.setDiskSpeed(Optional.empty()); double expectedDiskSpeed = 0; assertEquals(expectedDiskSpeed, benchmarkResults.getDiskSpeedMbs(), DELTA); } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmarkTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmarkTest.java index e2c5cdfa555..e2dc19c4f4c 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmarkTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmarkTest.java @@ -1,22 +1,19 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.hardware.benchmarks; -import com.yahoo.vespa.hosted.node.verification.commons.parser.ParseResult; import com.yahoo.vespa.hosted.node.verification.mock.MockCommandExecutor; import org.junit.Before; import org.junit.Test; import java.util.List; +import java.util.Optional; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; /** * @author sgrostad * @author olaaun */ - public class MemoryBenchmarkTest { private MemoryBenchmark memoryBenchmark; @@ -47,70 +44,30 @@ public class MemoryBenchmarkTest { } @Test - public void parseMemorySpeed_valid_output() throws Exception { + public void parseMemorySpeed_valid_output() { Double expectedSpeed = 12.1; String mockOutput = "This is a test \n the memory speed to be found is " + expectedSpeed + " GB/s"; List<String> mockCommandOutput = commandExecutor.outputFromString(mockOutput); - ParseResult parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); - ParseResult expectedParseResult = new ParseResult("GB/s", expectedSpeed.toString()); - assertEquals(expectedParseResult, parseResult); - } - - @Test - public void parseMemorySpeed_invalid_output() throws Exception { - List<String> mockCommandOutput = commandExecutor.outputFromString(""); - ParseResult parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); - ParseResult expectedParseResult = new ParseResult("invalid", "invalid"); - assertEquals(expectedParseResult, parseResult); - mockCommandOutput = commandExecutor.outputFromString("Exit status 1"); - parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); - assertEquals(expectedParseResult, parseResult); - } - - @Test - public void memoryReadSpeed_valid_input_should_update_hardwareResults() { - Double expectedMemoryReadSpeed = 12.1; - memoryBenchmark.updateMemoryReadSpeed(expectedMemoryReadSpeed.toString()); - assertEquals(expectedMemoryReadSpeed, benchmarkResults.getMemoryReadSpeedGBs(), DELTA); - } - - @Test - public void memoryReadSpeed_invalid_input_should_not_update_hardwareResults() { - memoryBenchmark.updateMemoryReadSpeed("Invalid speed"); - assertEquals(0D, benchmarkResults.getMemoryReadSpeedGBs(), DELTA); - } - - @Test - public void memoryWriteSpeed_valid_input_should_update_hardwareResults() { - Double expectedMemoryWriteSpeed = 3.8; - memoryBenchmark.updateMemoryWriteSpeed(expectedMemoryWriteSpeed.toString()); - assertEquals(expectedMemoryWriteSpeed, benchmarkResults.getMemoryWriteSpeedGBs(), DELTA); - } - - @Test - public void memoryWriteSpeed_invalid_input_should_not_update_hardwareResults() { - memoryBenchmark.updateMemoryWriteSpeed("Invalid speed"); - assertEquals(0D, benchmarkResults.getMemoryWriteSpeedGBs(), DELTA); + Optional<Double> parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); + assertEquals(Optional.of(12.1), parseResult); } @Test - public void isValidMemory_should_return_true_when_parameter_is_number() { - String benchmarkOutput = "6.32"; - boolean validMemory = memoryBenchmark.isValidMemory(benchmarkOutput); - assertTrue(validMemory); + public void parseMemorySpeed_slow_but_valid_output() { + Double expectedSpeed = 960D; + String mockOutput = "This is a test \n the memory speed to be found is " + expectedSpeed + " MB/s"; + List<String> mockCommandOutput = commandExecutor.outputFromString(mockOutput); + Optional<Double> parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); + assertEquals(Optional.of(0.96), parseResult); } @Test - public void isValidMemory_should_return_false_when_parameter_is_not_number() { - String benchmarkOutput = ""; - boolean validMemory = memoryBenchmark.isValidMemory(benchmarkOutput); - assertFalse(validMemory); - benchmarkOutput = null; - validMemory = memoryBenchmark.isValidMemory(benchmarkOutput); - assertFalse(validMemory); - benchmarkOutput = "Exit status 127"; - validMemory = memoryBenchmark.isValidMemory(benchmarkOutput); - assertFalse(validMemory); + public void parseMemorySpeed_invalid_output() { + List<String> mockCommandOutput = commandExecutor.outputFromString(""); + Optional<Double> parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); + assertEquals(Optional.empty(), parseResult); + mockCommandOutput = commandExecutor.outputFromString("Exit status 1"); + parseResult = memoryBenchmark.parseMemorySpeed(mockCommandOutput); + assertEquals(Optional.empty(), parseResult); } - } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/diskBenchmarkValidSlowOutput b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/diskBenchmarkValidSlowOutput new file mode 100644 index 00000000000..773850d8640 --- /dev/null +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/diskBenchmarkValidSlowOutput @@ -0,0 +1,5 @@ +49 MB/s + +real 0m1.448s +user 0m0.000s +sys 0m0.260s
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/nodeRepoWithoutHardwareDivergence.json b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/nodeRepoWithoutHardwareDivergence.json deleted file mode 100644 index ad2444c9076..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/nodeRepoWithoutHardwareDivergence.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "url": "https://example.com:4443/zone/v2/prod/us-west-1/nodes/v2/node/host.name", - "state": "active", - "type": "host", - "hostname": "host.name", - "openStackId": "653c39c1-bda4-47ee-a277-d5319eb57af7", - "flavor": "C-77E/256/960", - "canonicalFlavor": "C-77E/256/960", - "minDiskAvailableGb": 1759.84, - "minMainMemoryAvailableGb": 4.042128, - "description": "BARE_METAL with 48.0 CPUs, 256.0 Gb memory and 1920.0 Gb ssd", - "minCpuCores": 4.0, - "cost": 150, - "fastDisk": true, - "environment": "BARE_METAL", - "owner": { - "tenant": "hosted-vespa", - "application": "routing", - "instance": "default" - }, - "membership": { - "clustertype": "container", - "clusterid": "node-admin", - "group": "0", - "index": 77, - "retired": false - }, - "restartGeneration": 0, - "currentRestartGeneration": 0, - "wantedDockerImage": "docker-registry:4443/vespa/ci:6.128.19", - "wantedVespaVersion": "6.128.19", - "rebootGeneration": 3, - "currentRebootGeneration": 3, - "vespaVersion": "6.130.27", - "currentDockerImage": "docker-registry:4443/vespa/ci:6.130.27", - "hostedVersion": "6.130.27", - "convergedStateVersion": "6.130.27", - "failCount": 1, - "hardwareFailure": false, - "wantToRetire": false, - "wantToDeprovision": false, - "history": [ - { - "event": "failed", - "at": 1499293603487, - "agent": "system" - }, - { - "event": "rebooted", - "at": 1499351267086, - "agent": "system" - }, - { - "event": "readied", - "at": 1499351270674, - "agent": "system" - }, - { - "event": "requested", - "at": 1499350936347, - "agent": "system" - }, - { - "event": "reserved", - "at": 1499353058227, - "agent": "application" - }, - { - "event": "activated", - "at": 1499353080459, - "agent": "application" - } - ], - "ipAddresses": [ - ], - "additionalIpAddresses": [ - ] -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/mock/MockCommandExecutor.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/mock/MockCommandExecutor.java index 6e89b91aa94..88df18e9d4b 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/mock/MockCommandExecutor.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/mock/MockCommandExecutor.java @@ -19,7 +19,7 @@ public class MockCommandExecutor extends CommandExecutor { private ArrayList<String> mockCommands; private int counter; - public static final String DUMMY_COMMAND = "DUMMY"; + private static final String DUMMY_COMMAND = "DUMMY"; public MockCommandExecutor() { mockCommands = new ArrayList<>(); diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifierTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifierTest.java index 16e72521853..d819a9dd269 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifierTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifierTest.java @@ -1,115 +1,98 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.verification.spec; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoInfoRetriever; -import com.yahoo.vespa.hosted.node.verification.commons.noderepo.NodeRepoJsonModel; -import com.yahoo.vespa.hosted.node.verification.commons.report.SpecVerificationReport; +import com.yahoo.vespa.hosted.node.verification.Main; import com.yahoo.vespa.hosted.node.verification.mock.MockCommandExecutor; -import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo; -import org.junit.Before; import org.junit.Test; -import java.io.File; -import java.net.URL; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; /** - * @author sgrostad - * @author olaaun + * @author freva */ - public class SpecVerifierTest { - private MockCommandExecutor mockCommandExecutor; - private static final String ABSOLUTE_PATH = Paths.get(".").toAbsolutePath().normalize().toString(); private static final String RESOURCE_PATH = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources"; - private static final String URL_RESOURCE_PATH = "file://" + ABSOLUTE_PATH + "/" + RESOURCE_PATH; - private static final String NODE_REPO_PATH = "src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json"; private static final String CPU_INFO_PATH = RESOURCE_PATH + "/cpuinfoTest"; private static final String MEMORY_INFO_PATH = RESOURCE_PATH + "/meminfoTest"; private static final String FAST_DISK_TYPE_INFO_PATH = RESOURCE_PATH + "/DiskTypeFastDisk"; - private static final String NON_FAST_DISK_TYPE_INFO_PATH = RESOURCE_PATH + "/DiskTypeNonFastDisk"; private static final String DISK_SIZE_INFO_PATH = RESOURCE_PATH + "/filesize"; private static final String NET_INTERFACE_INFO_PATH = RESOURCE_PATH + "/ifconfig"; private static final String NET_INTERFACE_SPEED_INFO_PATH = RESOURCE_PATH + "/eth0"; private static final String PING_RESPONSE = RESOURCE_PATH + "/validpingresponse"; - private static final String INVALID_PING_RESPONSE = RESOURCE_PATH + "/pingresponse-all-packets-lost"; - private static final double DELTA = 0.1; - List<URL> nodeInfoUrls; + private final MockCommandExecutor commandExecutor = new MockCommandExecutor(); - @Before - public void setup() { - mockCommandExecutor = new MockCommandExecutor(); - nodeInfoUrls = new ArrayList<>(); - } + @Test + public void spec_verification_with_failures() throws Exception { + commandExecutor.addCommand("cat " + CPU_INFO_PATH); + commandExecutor.addCommand("cat " + MEMORY_INFO_PATH); + commandExecutor.addCommand("cat " + FAST_DISK_TYPE_INFO_PATH); + commandExecutor.addCommand("cat " + DISK_SIZE_INFO_PATH); + commandExecutor.addCommand("cat " + NET_INTERFACE_INFO_PATH); + commandExecutor.addCommand("cat " + NET_INTERFACE_SPEED_INFO_PATH); + commandExecutor.addCommand("cat " + PING_RESPONSE); + String result = Main.execute(new String[] { + "specification", + "-d", "250", + "-m", "64", + "-c", "1.5", + "-s", "true", + "-i", "10.11.12.13,::1234" + }, commandExecutor); - @Test - public void verifySpec_equal_nodeRepoInfo_and_hardware_should_return_true() throws Exception { - nodeInfoUrls.add(new URL(URL_RESOURCE_PATH + "/nodeRepo.json")); - mockCommandExecutor.addCommand("cat " + CPU_INFO_PATH); - mockCommandExecutor.addCommand("cat " + MEMORY_INFO_PATH); - mockCommandExecutor.addCommand("cat " + FAST_DISK_TYPE_INFO_PATH); - mockCommandExecutor.addCommand("cat " + DISK_SIZE_INFO_PATH); - mockCommandExecutor.addCommand("cat " + NET_INTERFACE_INFO_PATH); - mockCommandExecutor.addCommand("cat " + NET_INTERFACE_SPEED_INFO_PATH); - mockCommandExecutor.addCommand("cat " + PING_RESPONSE); - assertTrue(SpecVerifier.verifySpec(mockCommandExecutor, nodeInfoUrls)); + assertEquals( + "{\"specVerificationReport\":{\"" + + "actualMemoryAvailable\":4.042128,\"" + + "actualDiskSpaceAvailable\":1760.0,\"" + + "actualcpuCores\":4,\"" + + "faultyIpAddresses\":[\"10.11.12.13\",\"0:0:0:0:0:0:0:1234\"]}}", result); } @Test - public void verifySpec_unequal_nodeRepoInfo_and_hardware_should_return_false() throws Exception { - nodeInfoUrls.add(new URL(URL_RESOURCE_PATH + "/nodeRepo.json")); - mockCommandExecutor.addCommand("cat " + CPU_INFO_PATH); - mockCommandExecutor.addCommand("cat " + MEMORY_INFO_PATH); - mockCommandExecutor.addCommand("cat " + NON_FAST_DISK_TYPE_INFO_PATH); - mockCommandExecutor.addCommand("cat " + DISK_SIZE_INFO_PATH); - mockCommandExecutor.addCommand("cat " + NET_INTERFACE_INFO_PATH + "NoIpv6"); - mockCommandExecutor.addCommand("cat " + NET_INTERFACE_SPEED_INFO_PATH); - mockCommandExecutor.addCommand("cat " + INVALID_PING_RESPONSE); - assertFalse(SpecVerifier.verifySpec(mockCommandExecutor, nodeInfoUrls)); - } + public void benchmark_with_no_failures() throws Exception { + commandExecutor.addCommand("cat " + CPU_INFO_PATH); + commandExecutor.addCommand("cat " + MEMORY_INFO_PATH); + commandExecutor.addCommand("cat " + FAST_DISK_TYPE_INFO_PATH); + commandExecutor.addCommand("cat " + DISK_SIZE_INFO_PATH); + commandExecutor.addCommand("cat " + NET_INTERFACE_INFO_PATH); + commandExecutor.addCommand("cat " + NET_INTERFACE_SPEED_INFO_PATH); + commandExecutor.addCommand("cat " + PING_RESPONSE); - @Test - public void makeVerificationSpecReport_should_return_false_interface_speed_and_ipv6_connection() throws Exception { - HardwareInfo actualHardware = new HardwareInfo(); - actualHardware.setMinCpuCores(24); - actualHardware.setMinMainMemoryAvailableGb(24); - actualHardware.setInterfaceSpeedMbs(100); //this is wrong - actualHardware.setMinDiskAvailableGb(500); - actualHardware.setIpv4Interface(true); - actualHardware.setIpv6Interface(true); - actualHardware.setIpv6Connection(true); - actualHardware.setDiskType(HardwareInfo.DiskType.SLOW); - nodeInfoUrls.add(new File(NODE_REPO_PATH).toURI().toURL()); - NodeRepoJsonModel nodeRepoJsonModel = NodeRepoInfoRetriever.retrieve(nodeInfoUrls); - SpecVerificationReport verificationSpecVerificationReport = SpecVerifier.makeVerificationReport(actualHardware, nodeRepoJsonModel); - String expectedJson = "{\"actualInterfaceSpeed\":100.0}"; - ObjectMapper om = new ObjectMapper(); - String actualJson = om.writeValueAsString(verificationSpecVerificationReport); - assertEquals(expectedJson, actualJson); + String result = Main.execute(new String[] { + "specification", + "-d", "1760", + "-m", "4", + "-c", "4", + "-s", "true", + }, commandExecutor); + + assertEquals("null", result); } @Test - public void getNodeRepositoryJSON_should_return_valid_nodeRepoJSONModel() throws Exception { - nodeInfoUrls.add(new URL(URL_RESOURCE_PATH + "/nodeRepo.json")); - NodeRepoJsonModel actualNodeRepoJsonModel = SpecVerifier.getNodeRepositoryJSON(nodeInfoUrls); - double expectedMinCpuCores = 4D; - double expectedMinMainMemoryAvailableGb = 4.04D; - double expectedMinDiskAvailableGb = 1759.84; - boolean expectedFastDisk = true; - assertEquals(expectedMinCpuCores, actualNodeRepoJsonModel.getMinCpuCores(), DELTA); - assertEquals(expectedMinMainMemoryAvailableGb, actualNodeRepoJsonModel.getMinMainMemoryAvailableGb(), DELTA); - assertEquals(expectedMinDiskAvailableGb, actualNodeRepoJsonModel.getMinDiskAvailableGb(), DELTA); - assertEquals(expectedFastDisk, actualNodeRepoJsonModel.isFastDisk()); - } + public void preserve_previous_benchmark_result() throws Exception { + commandExecutor.addCommand("cat " + CPU_INFO_PATH); + commandExecutor.addCommand("cat " + MEMORY_INFO_PATH); + commandExecutor.addCommand("cat " + FAST_DISK_TYPE_INFO_PATH); + commandExecutor.addCommand("cat " + DISK_SIZE_INFO_PATH); + commandExecutor.addCommand("cat " + NET_INTERFACE_INFO_PATH); + commandExecutor.addCommand("cat " + NET_INTERFACE_SPEED_INFO_PATH); + commandExecutor.addCommand("cat " + PING_RESPONSE); + final String previousResult = "{\"specVerificationReport\":{\"actualMemoryAvailable\":4.042128}," + + "\"benchmarkReport\":{\"diskSpeedMbs\":49.0}}"; + + String result = Main.execute(new String[] { + "specification", + "-d", "1760", + "-m", "4", + "-c", "4", + "-s", "true", + "-h", previousResult + }, commandExecutor); + + assertEquals("{\"benchmarkReport\":{\"diskSpeedMbs\":49.0}}", result); + } } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskInfoTest b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskInfoTest deleted file mode 100644 index 80c8b713e84..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskInfoTest +++ /dev/null @@ -1,2 +0,0 @@ -NAME ROTA -vda 1
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeInvalid b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeInvalid deleted file mode 100644 index bd0824b2eba..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeInvalid +++ /dev/null @@ -1,2 +0,0 @@ -Name Rota -sda z
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeNonFastDisk b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeNonFastDisk deleted file mode 100644 index efe71b963c1..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeNonFastDisk +++ /dev/null @@ -1,2 +0,0 @@ -Name Rota -sda 1
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/IPAddressVerifierTest.json b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/IPAddressVerifierTest.json deleted file mode 100644 index a3bd4957467..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/IPAddressVerifierTest.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "url": "https://example.com:4443/zone/v2/prod/us-west-1/nodes/v2/node/host.name", - "id": "host.name", - "state": "active", - "type": "host", - "hostname": "host.name", - "openStackId": "653c39c1-bda4-47ee-a277-d5319eb57af7", - "flavor": "C-77E/256/960", - "canonicalFlavor": "C-77E/256/960", - "minDiskAvailableGb": 1920.0, - "minMainMemoryAvailableGb": 256.0, - "description": "BARE_METAL with 48.0 CPUs, 256.0 Gb memory and 1920.0 Gb ssd", - "minCpuCores": 48.0, - "cost": 150, - "fastDisk": true, - "environment": "BARE_METAL", - "owner": { - "tenant": "hosted-vespa", - "application": "routing", - "instance": "default" - }, - "membership": { - "clustertype": "container", - "clusterid": "node-admin", - "group": "0", - "index": 77, - "retired": false - }, - "restartGeneration": 0, - "currentRestartGeneration": 0, - "wantedDockerImage": "docker-registry:4443/vespa/ci:6.132.102", - "wantedVespaVersion": "6.132.102", - "rebootGeneration": 3, - "currentRebootGeneration": 3, - "vespaVersion": "6.132.102", - "currentDockerImage": "docker-registry:4443/vespa/ci:6.132.102", - "hostedVersion": "6.132.102", - "convergedStateVersion": "6.132.102", - "failCount": 1, - "hardwareFailure": false, - "wantToRetire": false, - "wantToDeprovision": false, - "history": [ - { - "event": "failed", - "at": 1499293603487, - "agent": "system" - }, - { - "event": "rebooted", - "at": 1499351267086, - "agent": "system" - }, - { - "event": "readied", - "at": 1499351270674, - "agent": "system" - }, - { - "event": "requested", - "at": 1499350936347, - "agent": "system" - }, - { - "event": "reserved", - "at": 1499353058227, - "agent": "application" - }, - { - "event": "activated", - "at": 1499353080459, - "agent": "application" - } - ], - "ipAddresses": [ - "172.16.254.1", - "2001:db8:0:1234:0:567:8:1" - ], - "additionalIpAddresses": [ - ] -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/executeTestFile.txt b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/executeTestFile.txt deleted file mode 100644 index 8d4cafee461..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/executeTestFile.txt +++ /dev/null @@ -1,4 +0,0 @@ -This file test -if executeCommand -reads -this file properly.
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/filesize b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/filesize index d8148474ced..535a509dcc1 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/filesize +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/filesize @@ -1,2 +1,2 @@ PV Size 799.65 GB / not usable 0.00 GB - PV Size 960.19 GB / not usable 0.01 GB
\ No newline at end of file + PV Size 960.35 GB / not usable 0.01 GB
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorExceptionTest b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorExceptionTest deleted file mode 100644 index e48aae651f9..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorExceptionTest +++ /dev/null @@ -1,3 +0,0 @@ -Not -valid -hostname
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorTest b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorTest deleted file mode 100644 index 7e62b32ad26..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorTest +++ /dev/null @@ -1 +0,0 @@ -expected.hostname
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/invalidFilesize b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/invalidFilesize deleted file mode 100644 index 3a0c1be8ef7..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/invalidFilesize +++ /dev/null @@ -1,2 +0,0 @@ -This should -not 123 work
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoNotInterpretableHardwareDivergence.json b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoNotInterpretableHardwareDivergence.json deleted file mode 100644 index 1bfeab96b08..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoNotInterpretableHardwareDivergence.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "url": "https://api.vespayahoo.com", - "id": "id.prod.yahoo.com", - "state": "failed", - "type": "host", - "hostname": "hostname", - "openStackId": "4a8689e1-3a8e-4f50-b99f-d33b245a9661", - "flavor": "C-2T/24/500", - "canonicalFlavor": "C-2B/24/500", - "minDiskAvailableGb": 500.0, - "minMainMemoryAvailableGb": 24.0, - "description": "BARE_METAL with 24.0 CPUs, 24.0 Gb memory and 500.0 Gb disk", - "minCpuCores": 24.0, - "cost": 70, - "fastDisk": false, - "environment": "BARE_METAL", - "owner": { - "tenant": "hosted-vespa", - "application": "routing", - "instance": "default" - }, - "membership": { - "clustertype": "container", - "clusterid": "node-admin", - "group": "0", - "index": 32, - "retired": false - }, - "restartGeneration": 0, - "currentRestartGeneration": 0, - "wantedDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:6.138.1", - "wantedVespaVersion": "6.138.1", - "rebootGeneration": 49, - "currentRebootGeneration": 49, - "vespaVersion": "6.138.18", - "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:6.138.18", - "hostedVersion": "6.138.18", - "convergedStateVersion": "6.138.18", - "failCount": 44, - "hardwareFailure": true, - "hardwareFailureDescription": "disk_smart", - "wantToRetire": false, - "wantToDeprovision": false, - "history": [ - { - "event": "readied", - "at": 1501070910372, - "agent": "system" - }, - { - "event": "reserved", - "at": 1501070952692, - "agent": "application" - }, - { - "event": "activated", - "at": 1501070958698, - "agent": "application" - }, - { - "event": "rebooted", - "at": 1501656469859, - "agent": "system" - }, - { - "event": "down", - "at": 1502809344596, - "agent": "system" - }, - { - "event": "failed", - "at": 1502812976621, - "agent": "system" - } - ], - "ipAddresses": [ - ], - "additionalIpAddresses": [ - ], - "hardwareDivergence": "{\"hardwareDivergence\": null - it will not manage to parse this}" -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json deleted file mode 100644 index c557afb3256..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "url": "https://example.com:4443/zone/v2/prod/eu-west-1/nodes/v2/node/host.name", - "id": "host.name", - "state": "ready", - "type": "tenant", - "hostname": "", - "openStackId": "77df66c5-3cbc-4905-b0e9-f790bddd13bf", - "fastDisk": false, - "flavor": "C-2B/24/500", - "canonicalFlavor": "C-2B/24/500", - "minDiskAvailableGb": 500.0, - "minMainMemoryAvailableGb": 24.0, - "description": "BARE_METAL with 24.0 CPUs, 24.0 Gb memory and 500.0 Gb disk", - "minCpuCores": 24.0, - "cost": 66, - "environment": "BARE_METAL", - "rebootGeneration": 10, - "currentRebootGeneration": 10, - "vespaVersion": "6.120.30", - "currentDockerImage": "docker-registry:4443/vespa/ci:6.120.30", - "hostedVersion": "6.120.30", - "convergedStateVersion": "6.120.30", - "failCount": 0, - "hardwareFailure": false, - "wantToRetire": false, - "wantToDeprovision": false, - "history": [ - { - "event": "readied", - "at": 1489609585827, - "agent": "system" - }, - { - "event": "rebooted", - "at": 1498309261481, - "agent": "system" - }, - { - "event": "requested", - "at": 1499332178235, - "agent": "system" - } - ], - "ipAddresses": [ - "10.200.66.16" - ], - "additionalIpAddresses": [], - "hardwareDivergence": "{\"benchmarkReport\": {\"cpuCyclesPerSec\": 0.5}}" -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepo.json b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepo.json deleted file mode 100644 index ad2444c9076..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepo.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "url": "https://example.com:4443/zone/v2/prod/us-west-1/nodes/v2/node/host.name", - "state": "active", - "type": "host", - "hostname": "host.name", - "openStackId": "653c39c1-bda4-47ee-a277-d5319eb57af7", - "flavor": "C-77E/256/960", - "canonicalFlavor": "C-77E/256/960", - "minDiskAvailableGb": 1759.84, - "minMainMemoryAvailableGb": 4.042128, - "description": "BARE_METAL with 48.0 CPUs, 256.0 Gb memory and 1920.0 Gb ssd", - "minCpuCores": 4.0, - "cost": 150, - "fastDisk": true, - "environment": "BARE_METAL", - "owner": { - "tenant": "hosted-vespa", - "application": "routing", - "instance": "default" - }, - "membership": { - "clustertype": "container", - "clusterid": "node-admin", - "group": "0", - "index": 77, - "retired": false - }, - "restartGeneration": 0, - "currentRestartGeneration": 0, - "wantedDockerImage": "docker-registry:4443/vespa/ci:6.128.19", - "wantedVespaVersion": "6.128.19", - "rebootGeneration": 3, - "currentRebootGeneration": 3, - "vespaVersion": "6.130.27", - "currentDockerImage": "docker-registry:4443/vespa/ci:6.130.27", - "hostedVersion": "6.130.27", - "convergedStateVersion": "6.130.27", - "failCount": 1, - "hardwareFailure": false, - "wantToRetire": false, - "wantToDeprovision": false, - "history": [ - { - "event": "failed", - "at": 1499293603487, - "agent": "system" - }, - { - "event": "rebooted", - "at": 1499351267086, - "agent": "system" - }, - { - "event": "readied", - "at": 1499351270674, - "agent": "system" - }, - { - "event": "requested", - "at": 1499350936347, - "agent": "system" - }, - { - "event": "reserved", - "at": 1499353058227, - "agent": "application" - }, - { - "event": "activated", - "at": 1499353080459, - "agent": "application" - } - ], - "ipAddresses": [ - ], - "additionalIpAddresses": [ - ] -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepoVirtualMachine.json b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepoVirtualMachine.json deleted file mode 100644 index 100e9337f9d..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepoVirtualMachine.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "url": "https://example.com:4443/zone/v2/prod/eu-west-1/nodes/v2/node/host.name", - "id": "host.name", - "state": "ready", - "type": "tenant", - "hostname": "host.name", - "parentHostname": "parent.name", - "openStackId": "9171477a-35be-4a60-81b0-2b631a36c712", - "flavor": "v-4-8-100", - "canonicalFlavor": "v-4-8-100", - "minDiskAvailableGb": 100.0, - "minMainMemoryAvailableGb": 8.0, - "description": "VIRTUAL_MACHINE with 4.0 CPUs, 8.0 Gb memory and 100.0 Gb disk", - "minCpuCores": 4.0, - "cost": 15, - "fastDisk": false, - "environment": "VIRTUAL_MACHINE", - "rebootGeneration": 9, - "currentRebootGeneration": 9, - "vespaVersion": "6.132.102", - "currentDockerImage": "docker-registry:4443/vespa/ci:6.132.102", - "hostedVersion": "6.132.102", - "convergedStateVersion": "6.132.102", - "failCount": 2, - "hardwareFailure": false, - "wantToRetire": false, - "wantToDeprovision": false, - "history": [ - { - "event": "readied", - "at": 1488621028325, - "agent": "system" - }, - { - "event": "rebooted", - "at": 1500455903916, - "agent": "system" - }, - { - "event": "requested", - "at": 1501598263220, - "agent": "system" - } - ], - "ipAddresses": [ - "10.201.13.46" - ], - "additionalIpAddresses": [ - ] -}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/pingresponse-all-packets-lost b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/pingresponse-all-packets-lost deleted file mode 100644 index 29d6383b52c..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/pingresponse-all-packets-lost +++ /dev/null @@ -1 +0,0 @@ -100 diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/reportJSON b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/reportJSON deleted file mode 100644 index 839fb8224ab..00000000000 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/reportJSON +++ /dev/null @@ -1 +0,0 @@ -{"actualMemoryAvailable":123.0,"actualDiskType":"FAST","actualDiskSpaceAvailable":500.0,"actualInterfaceSpeed":100.0,"actualcpuCores":4,"faultyIpAddresses":["2001:db8:0:1234:0:567:8:1"]}
\ No newline at end of file diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetrieverTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetrieverTest.java index de4bf946d59..220d89f3be9 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetrieverTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetrieverTest.java @@ -39,7 +39,7 @@ public class DiskRetrieverTest { commandExecutor.addCommand(CAT_RESOURCE_PATH + "filesize"); diskRetriever.updateInfo(); assertEquals(DiskType.FAST, hardwareInfo.getDiskType()); - double expectedSize = 1759.84; + double expectedSize = 1760.0; assertEquals(expectedSize, hardwareInfo.getMinDiskAvailableGb(), DELTA); } @@ -54,7 +54,7 @@ public class DiskRetrieverTest { public void updateDiskSize__should_store_diskSize_in_hardwareInfo() throws IOException { commandExecutor.addCommand(CAT_RESOURCE_PATH + "filesize"); diskRetriever.updateDiskSize(); - double expectedSize = 1759.84; + double expectedSize = 1760.0; assertEquals(expectedSize, hardwareInfo.getMinDiskAvailableGb(), DELTA); } @@ -79,7 +79,7 @@ public class DiskRetrieverTest { public void parseDiskType_with_invalid_outputstream_does_not_contain_searchword_should_throw_exception() throws Exception { List<String> mockOutput = commandExecutor.outputFromString("Name Rota"); try { - ParseResult parseResult = diskRetriever.parseDiskType(mockOutput); + diskRetriever.parseDiskType(mockOutput); fail("Should have thrown IOException when outputstream doesn't contain search word"); } catch (IOException e) { String expectedExceptionMessage = "Parsing for disk type failed"; @@ -95,7 +95,7 @@ public class DiskRetrieverTest { List<ParseResult> parseResults = diskRetriever.parseDiskSize(mockOutput); ParseResult expectedParseResult1 = new ParseResult("Size", "799.65"); assertEquals(expectedParseResult1, parseResults.get(0)); - ParseResult expectedParseResult2 = new ParseResult("Size", "960.19"); + ParseResult expectedParseResult2 = new ParseResult("Size", "960.35"); assertEquals(expectedParseResult2, parseResults.get(1)); } diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareInfoRetrieverTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareInfoRetrieverTest.java index 552d57d2b59..0ebf1a2b26a 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareInfoRetrieverTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareInfoRetrieverTest.java @@ -46,7 +46,7 @@ public class HardwareInfoRetrieverTest { expectedHardwareInfo.setMinCpuCores(4); expectedHardwareInfo.setMinMainMemoryAvailableGb(4.042128); expectedHardwareInfo.setInterfaceSpeedMbs(1000); - expectedHardwareInfo.setMinDiskAvailableGb(1759.84); + expectedHardwareInfo.setMinDiskAvailableGb(1760.0); expectedHardwareInfo.setIpv4Interface(true); expectedHardwareInfo.setIpv6Interface(false); expectedHardwareInfo.setIpv6Connection(false); diff --git a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetrieverTest.java b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetrieverTest.java index 565712608f5..eb9f122b726 100644 --- a/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetrieverTest.java +++ b/node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetrieverTest.java @@ -9,7 +9,7 @@ import org.junit.Test; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; @@ -84,8 +84,7 @@ public class NetRetrieverTest { public void parseNetInterface_get_ipv_from_ifconfigNotIpv6_testFile() throws IOException { List<String> mockOutput = MockCommandExecutor.readFromFile(NET_FIND_INTERFACE + "NoIpv6"); parseResults = net.parseNetInterface(mockOutput); - ArrayList<ParseResult> expextedParseResults = new ArrayList<>(Arrays.asList( - new ParseResult("inet", "inet"))); + List<ParseResult> expextedParseResults = Collections.singletonList(new ParseResult("inet", "inet")); assertEquals(expextedParseResults, parseResults); } @@ -130,7 +129,7 @@ public class NetRetrieverTest { public void parsePingResponse_invalid_ping_response_should_throw_IOException() throws IOException { List<String> mockCommandOutput = MockCommandExecutor.readFromFile(INVALID_PING_RESPONSE); try { - ParseResult parseResult = net.parsePingResponse(mockCommandOutput); + net.parsePingResponse(mockCommandOutput); fail("Expected an IOException to be thrown"); } catch (IOException e) { String expectedExceptionMessage = "Failed to parse ping output."; |