summaryrefslogtreecommitdiffstats
path: root/node-maintainer
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2018-01-19 09:47:27 +0100
committerGitHub <noreply@github.com>2018-01-19 09:47:27 +0100
commit9ee45d79d98222549352d38e9a3f9c717082c323 (patch)
treea657b1d7933b15495eb79f49c09e3045b1a4cd4e /node-maintainer
parentb9e38300bf58e9eaa1a1b977f2d8b5303982d8a3 (diff)
parent827a3a370531aea57470eab116d92983f022b467 (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')
-rw-r--r--node-maintainer/pom.xml10
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/Main.java84
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGenerator.java54
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifier.java34
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverter.java18
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetriever.java37
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeSpec.java (renamed from node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoJsonModel.java)65
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParser.java9
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/HardwareDivergenceReport.java6
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/commons/report/Reporter.java63
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarker.java43
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/CPUBenchmark.java14
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmark.java16
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmark.java51
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifier.java86
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/VerifierSettings.java6
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/CPURetriever.java14
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetriever.java26
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareRetriever.java2
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/MemoryRetriever.java18
-rw-r--r--node-maintainer/src/main/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetriever.java40
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/maintainer/CoreCollectorTest.java2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/HostURLGeneratorTest.java88
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/IPAddressVerifierTest.java42
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeJsonConverterTest.java44
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/noderepo/NodeRepoInfoRetrieverTest.java68
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/parser/OutputParserTest.java17
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/BenchmarkReportTest.java33
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/ReporterTest.java104
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/commons/report/SpecVerificationReportTest.java49
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/HardwareBenchmarkerTest.java85
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/DiskBenchmarkTest.java16
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/benchmarks/MemoryBenchmarkTest.java77
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/diskBenchmarkValidSlowOutput5
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/hardware/resources/nodeRepoWithoutHardwareDivergence.json78
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/mock/MockCommandExecutor.java2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/SpecVerifierTest.java149
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskInfoTest2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeInvalid2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/DiskTypeNonFastDisk2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/IPAddressVerifierTest.json81
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/executeTestFile.txt4
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/filesize2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorExceptionTest3
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/hostURLGeneratorTest1
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/invalidFilesize2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoNotInterpretableHardwareDivergence.json81
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeInfoTest.json49
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepo.json78
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/nodeRepoVirtualMachine.json50
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/pingresponse-all-packets-lost1
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/resources/reportJSON1
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/DiskRetrieverTest.java8
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/HardwareInfoRetrieverTest.java2
-rw-r--r--node-maintainer/src/test/java/com/yahoo/vespa/hosted/node/verification/spec/retrievers/NetRetrieverTest.java7
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.";