aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfreva <valerijf@yahoo-inc.com>2016-12-14 16:19:19 +0100
committerfreva <valerijf@yahoo-inc.com>2016-12-14 16:19:19 +0100
commit4c62a0d432bd4e6871ba2da54e03d0874e5e2dd9 (patch)
tree60890185624ce1e7aeb0b891e4ee7cc4c1e8cda6
parented1dfcffd8308725fc81a875457ea0f1c04beda8 (diff)
Moved path resolving to Enviroment through PathResolver
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java7
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java20
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java3
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java9
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java129
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/PathResolver.java35
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/maintenance/Maintainer.java86
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImplTest.java11
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/LocalZoneUtils.java43
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/RunVespaLocal.java26
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java12
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerTester.java24
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/StorageMaintainerMock.java10
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java5
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java20
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/EnvironmentTest.java (renamed from node-admin/src/test/java/com/yahoo/vespa/hosted/node/maintenance/MaintainerTest.java)17
16 files changed, 245 insertions, 212 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java
index 542598496ca..07e44a58f44 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java
@@ -18,7 +18,6 @@ import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec;
import com.yahoo.vespa.hosted.node.admin.orchestrator.Orchestrator;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
import java.io.InputStreamReader;
import java.net.Inet6Address;
@@ -78,13 +77,11 @@ public class DockerOperationsImpl implements DockerOperations {
private final Docker docker;
private final Environment environment;
- private final Maintainer maintainer;
private GaugeWrapper numberOfRunningContainersGauge;
- public DockerOperationsImpl(Docker docker, Environment environment, Maintainer maintainer, MetricReceiverWrapper metricReceiver) {
+ public DockerOperationsImpl(Docker docker, Environment environment, MetricReceiverWrapper metricReceiver) {
this.docker = docker;
this.environment = environment;
- this.maintainer = maintainer;
setMetrics(metricReceiver);
}
@@ -208,7 +205,7 @@ public class DockerOperationsImpl implements DockerOperations {
command.withVolume("/etc/hosts", "/etc/hosts");
for (String pathInNode : DIRECTORIES_TO_MOUNT.keySet()) {
- String pathInHost = maintainer.pathInHostFromPathInNode(nodeSpec.containerName, pathInNode).toString();
+ String pathInHost = environment.pathInHostFromPathInNode(nodeSpec.containerName, pathInNode).toString();
command.withVolume(pathInHost, pathInNode);
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
index f94fa3067f0..a9048b06cf5 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
@@ -27,13 +27,13 @@ public class StorageMaintainer {
private static final long intervalSec = 1000;
private final Object monitor = new Object();
- private final Maintainer maintainer;
+ private final Environment environment;
private Map<ContainerName, MetricsCache> metricsCacheByContainerName = new ConcurrentHashMap<>();
- public StorageMaintainer(Maintainer maintainer) {
- this.maintainer = maintainer;
+ public StorageMaintainer(Environment environment) {
+ this.environment = environment;
}
public Map<String, Number> updateIfNeededAndGetDiskMetricsFor(ContainerName containerName) {
@@ -48,7 +48,7 @@ public class StorageMaintainer {
// Throttle to one disk usage calculation at a time.
synchronized (monitor) {
PrefixLogger logger = PrefixLogger.getNodeAgentLogger(StorageMaintainer.class, containerName);
- File containerDir = maintainer.pathInNodeAdminFromPathInNode(containerName, "/home/").toFile();
+ File containerDir = environment.pathInNodeAdminFromPathInNode(containerName, "/home/").toFile();
try {
long used = getDiscUsedInBytes(containerDir);
metricsCache.metrics.put("node.disk.used", used);
@@ -92,19 +92,19 @@ public class StorageMaintainer {
String[] pathsToClean = {"/home/y/logs/elasticsearch2", "/home/y/logs/logstash2",
"/home/y/logs/daemontools_y", "/home/y/logs/nginx", "/home/y/logs/vespa"};
for (String pathToClean : pathsToClean) {
- File path = maintainer.pathInNodeAdminFromPathInNode(containerName, pathToClean).toFile();
+ File path = environment.pathInNodeAdminFromPathInNode(containerName, pathToClean).toFile();
if (path.exists()) {
DeleteOldAppData.deleteFiles(path.getAbsolutePath(), Duration.ofDays(3).getSeconds(), ".*\\.log\\..+", false);
DeleteOldAppData.deleteFiles(path.getAbsolutePath(), Duration.ofDays(3).getSeconds(), ".*QueryAccessLog.*", false);
}
}
- File logArchiveDir = maintainer.pathInNodeAdminFromPathInNode(containerName, "/home/y/logs/vespa/logarchive").toFile();
+ File logArchiveDir = environment.pathInNodeAdminFromPathInNode(containerName, "/home/y/logs/vespa/logarchive").toFile();
if (logArchiveDir.exists()) {
DeleteOldAppData.deleteFiles(logArchiveDir.getAbsolutePath(), Duration.ofDays(31).getSeconds(), null, false);
}
- File fileDistrDir = maintainer.pathInNodeAdminFromPathInNode(containerName, "/home/y/var/db/vespa/filedistribution").toFile();
+ File fileDistrDir = environment.pathInNodeAdminFromPathInNode(containerName, "/home/y/var/db/vespa/filedistribution").toFile();
if (fileDistrDir.exists()) {
DeleteOldAppData.deleteFiles(fileDistrDir.getAbsolutePath(), Duration.ofDays(31).getSeconds(), null, false);
}
@@ -120,7 +120,7 @@ public class StorageMaintainer {
Maintainer.deleteOldAppData(NODE_ADMIN_LOGGER);
Maintainer.cleanCoreDumps(NODE_ADMIN_LOGGER);
- File nodeAdminJDiskLogsPath = maintainer.pathInNodeAdminFromPathInNode(new ContainerName("node-admin"),
+ File nodeAdminJDiskLogsPath = environment.pathInNodeAdminFromPathInNode(new ContainerName("node-admin"),
"/home/y/logs/jdisc_core/").toFile();
DeleteOldAppData.deleteFiles(nodeAdminJDiskLogsPath.getAbsolutePath(), Duration.ofDays(31).getSeconds(), null, false);
}
@@ -130,10 +130,6 @@ public class StorageMaintainer {
Maintainer.archiveAppData(logger, containerName);
}
- public Maintainer getMaintainer() {
- return maintainer;
- }
-
private static class MetricsCache {
private final Instant nextUpdateAt;
private final Map<String, Number> metrics = new HashMap<>();
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java
index 36157bffb03..38bef540ce8 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImpl.java
@@ -547,8 +547,7 @@ public class NodeAgentImpl implements NodeAgent {
private void configureContainerMetrics(ContainerNodeSpec nodeSpec) {
if (! storageMaintainer.isPresent()) return;
- final Path yamasAgentFolder = storageMaintainer.get().getMaintainer()
- .pathInNodeAdminFromPathInNode(nodeSpec.containerName, "/etc/yamas-agent/");
+ final Path yamasAgentFolder = environment.pathInNodeAdminFromPathInNode(nodeSpec.containerName, "/etc/yamas-agent/");
Path vespaCheckPath = Paths.get(getDefaults().underVespaHome("libexec/yms/yms_check_vespa"));
SecretAgentScheduleMaker scheduleMaker = new SecretAgentScheduleMaker("vespa", 60, vespaCheckPath, "all")
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java
index d4916ea1c02..9918824c7f2 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java
@@ -22,7 +22,6 @@ import com.yahoo.vespa.hosted.node.admin.orchestrator.Orchestrator;
import com.yahoo.vespa.hosted.node.admin.orchestrator.OrchestratorImpl;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.SecretAgentScheduleMaker;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
import java.io.IOException;
import java.nio.file.Path;
@@ -49,15 +48,14 @@ public class ComponentsProviderImpl implements ComponentsProvider {
private static final int NODE_ADMIN_STATE_INTERVAL_MILLIS = 5 * 60000;
public ComponentsProviderImpl(Docker docker, MetricReceiverWrapper metricReceiver, Environment environment,
- Maintainer maintainer, Optional<StorageMaintainer> storageMaintainer) {
+ Optional<StorageMaintainer> storageMaintainer) {
String baseHostName = HostName.getLocalhost();
Set<String> configServerHosts = environment.getConfigServerHosts();
Orchestrator orchestrator = new OrchestratorImpl(configServerHosts);
NodeRepository nodeRepository = new NodeRepositoryImpl(configServerHosts, WEB_SERVICE_PORT, baseHostName);
- final DockerOperations dockerOperations = new DockerOperationsImpl(
- docker, environment, maintainer, metricReceiver);
+ final DockerOperations dockerOperations = new DockerOperationsImpl(docker, environment, metricReceiver);
final Function<String, NodeAgent> nodeAgentFactory =
(hostName) -> new NodeAgentImpl(hostName, nodeRepository, orchestrator, dockerOperations,
storageMaintainer, metricReceiver, environment);
@@ -75,8 +73,7 @@ public class ComponentsProviderImpl implements ComponentsProvider {
docker,
metricReceiver,
new Environment(),
- new Maintainer(),
- config.isRunningLocally() ? Optional.empty() : Optional.of(new StorageMaintainer(new Maintainer())));
+ config.isRunningLocally() ? Optional.empty() : Optional.of(new StorageMaintainer(new Environment())));
if (! config.isRunningLocally()) initializeNodeAgentSecretAgent(docker);
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java
index 5dda3a6b313..609646221c0 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java
@@ -2,13 +2,21 @@
package com.yahoo.vespa.hosted.node.admin.util;
import com.yahoo.net.HostName;
+import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import java.util.Set;
+import java.util.TimeZone;
import java.util.stream.Collectors;
/**
@@ -18,6 +26,9 @@ import java.util.stream.Collectors;
* @author musum
*/
public class Environment {
+ private static final DateFormat filenameFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
+ public static final String APPLICATION_STORAGE_CLEANUP_PATH_PREFIX = "cleanup_";
+
private static final String ENV_CONFIGSERVERS = "services__addr_configserver";
private static final String ENVIRONMENT = "ENVIRONMENT";
private static final String REGION = "REGION";
@@ -27,25 +38,34 @@ public class Environment {
private final String region;
private final String parentHostHostname;
private final InetAddressResolver inetAddressResolver;
+ private final PathResolver pathResolver;
+
+ static {
+ filenameFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
public Environment() {
- this(getConfigServerHostsFromEnvironment(),
- getEnvironmentVariable(ENVIRONMENT),
- getEnvironmentVariable(REGION),
- HostName.getLocalhost(),
- new InetAddressResolver());
+ this(
+ getConfigServerHostsFromEnvironment(),
+ getEnvironmentVariable(ENVIRONMENT),
+ getEnvironmentVariable(REGION),
+ HostName.getLocalhost(),
+ new InetAddressResolver(),
+ new PathResolver());
}
public Environment(Set<String> configServerHosts,
String environment,
String region,
String parentHostHostname,
- InetAddressResolver inetAddressResolver) {
+ InetAddressResolver inetAddressResolver,
+ PathResolver pathResolver) {
this.configServerHosts = configServerHosts;
this.environment = environment;
this.region = region;
this.parentHostHostname = parentHostHostname;
this.inetAddressResolver = inetAddressResolver;
+ this.pathResolver = pathResolver;
}
public Set<String> getConfigServerHosts() { return configServerHosts; }
@@ -86,4 +106,101 @@ public class Environment {
return inetAddressResolver.getInetAddressForHost(hostname);
}
+ public PathResolver getPathResolver() {
+ return pathResolver;
+ }
+
+ /**
+ * Absolute path in node admin to directory with processed and reported core dumps
+ */
+ public Path pathInNodeAdminToDoneCoredumps() {
+ return pathResolver.getApplicationStoragePathForNodeAdmin().resolve("processed-coredumps");
+ }
+
+ /**
+ * Absolute path in node admin container to the node cleanup directory.
+ */
+ public Path pathInNodeAdminToNodeCleanup(ContainerName containerName) {
+ return pathResolver.getApplicationStoragePathForNodeAdmin()
+ .resolve(APPLICATION_STORAGE_CLEANUP_PATH_PREFIX + containerName.asString() +
+ "_" + filenameFormatter.format(Date.from(Instant.now())));
+ }
+
+ /**
+ * Translates an absolute path in node agent container to an absolute path in node admin container.
+ * @param containerName name of the node agent container
+ * @param absolutePathInNode absolute path in that container
+ * @return the absolute path in node admin container pointing at the same inode
+ */
+ public Path pathInNodeAdminFromPathInNode(ContainerName containerName, String absolutePathInNode) {
+ Path pathInNode = Paths.get(absolutePathInNode);
+ if (! pathInNode.isAbsolute()) {
+ throw new IllegalArgumentException("The specified path in node was not absolute: " + absolutePathInNode);
+ }
+
+ return pathResolver.getApplicationStoragePathForNodeAdmin()
+ .resolve(containerName.asString())
+ .resolve(PathResolver.ROOT.relativize(pathInNode));
+ }
+
+ /**
+ * Translates an absolute path in node agent container to an absolute path in host.
+ * @param containerName name of the node agent container
+ * @param absolutePathInNode absolute path in that container
+ * @return the absolute path in host pointing at the same inode
+ */
+ public Path pathInHostFromPathInNode(ContainerName containerName, String absolutePathInNode) {
+ Path pathInNode = Paths.get(absolutePathInNode);
+ if (! pathInNode.isAbsolute()) {
+ throw new IllegalArgumentException("The specified path in node was not absolute: " + absolutePathInNode);
+ }
+
+ return pathResolver.getApplicationStoragePathForHost()
+ .resolve(containerName.asString())
+ .resolve(PathResolver.ROOT.relativize(pathInNode));
+ }
+
+
+ public static class Builder {
+ private Set<String> configServerHosts = Collections.emptySet();
+ private String environment;
+ private String region;
+ private String parentHostHostname;
+ private InetAddressResolver inetAddressResolver;
+ private PathResolver pathResolver;
+
+ public Builder configServerHosts(String... hosts) {
+ configServerHosts = Arrays.stream(hosts).collect(Collectors.toSet());
+ return this;
+ }
+
+ public Builder environment(String environment) {
+ this.environment = environment;
+ return this;
+ }
+
+ public Builder region(String region) {
+ this.region = region;
+ return this;
+ }
+
+ public Builder parentHostHostname(String parentHostHostname) {
+ this.parentHostHostname = parentHostHostname;
+ return this;
+ }
+
+ public Builder inetAddressResolver(InetAddressResolver inetAddressResolver) {
+ this.inetAddressResolver = inetAddressResolver;
+ return this;
+ }
+
+ public Builder pathResolver(PathResolver pathResolver) {
+ this.pathResolver = pathResolver;
+ return this;
+ }
+
+ public Environment build() {
+ return new Environment(configServerHosts, environment, region, parentHostHostname, inetAddressResolver, pathResolver);
+ }
+ }
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/PathResolver.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/PathResolver.java
new file mode 100644
index 00000000000..c6c6c28c31b
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/PathResolver.java
@@ -0,0 +1,35 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.util;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/**
+ * @author freva
+ */
+public class PathResolver {
+ static final Path ROOT = Paths.get("/");
+
+ private static final Path RELATIVE_APPLICATION_STORAGE_PATH = Paths.get("home/docker/container-storage");
+ private final Path applicationStoragePathForNodeAdmin;
+ private final Path applicationStoragePathForHost;
+
+ public PathResolver() {
+ this(
+ Paths.get("/host").resolve(RELATIVE_APPLICATION_STORAGE_PATH),
+ ROOT.resolve(RELATIVE_APPLICATION_STORAGE_PATH));
+ }
+
+ public PathResolver(Path applicationStoragePathForNodeAdmin, Path applicationStoragePathForHost) {
+ this.applicationStoragePathForNodeAdmin = applicationStoragePathForNodeAdmin;
+ this.applicationStoragePathForHost = applicationStoragePathForHost;
+ }
+
+ public Path getApplicationStoragePathForNodeAdmin() {
+ return applicationStoragePathForNodeAdmin;
+ }
+
+ public Path getApplicationStoragePathForHost() {
+ return applicationStoragePathForHost;
+ }
+}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/maintenance/Maintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/maintenance/Maintainer.java
index 828755390e3..926db67b35a 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/maintenance/Maintainer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/maintenance/Maintainer.java
@@ -9,6 +9,7 @@ import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import com.yahoo.vespa.hosted.dockerapi.ProcessResult;
import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
+import com.yahoo.vespa.hosted.node.admin.util.PathResolver;
import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger;
import io.airlift.airline.Arguments;
import io.airlift.airline.Cli;
@@ -24,17 +25,11 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
import java.time.Duration;
-import java.time.Instant;
import java.util.Arrays;
-import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
-import java.util.TimeZone;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
@@ -43,19 +38,12 @@ import java.util.regex.Pattern;
* @author freva
*/
public class Maintainer {
- private static final Path ROOT = Paths.get("/");
- private static final Path RELATIVE_APPLICATION_STORAGE_PATH = Paths.get("home/docker/container-storage");
- private static final Path APPLICATION_STORAGE_PATH_FOR_NODE_ADMIN = Paths.get("/host").resolve(RELATIVE_APPLICATION_STORAGE_PATH);
- private static final Path APPLICATION_STORAGE_PATH_FOR_HOST = ROOT.resolve(RELATIVE_APPLICATION_STORAGE_PATH);
- private static final String APPLICATION_STORAGE_CLEANUP_PATH_PREFIX = "cleanup_";
-
+ private static final Environment environment = new Environment.Builder().pathResolver(new PathResolver()).build();
private static final Maintainer maintainer = new Maintainer();
private static final CoredumpHandler COREDUMP_HANDLER =
new CoredumpHandler(HttpClientBuilder.create().build(), new CoreCollector(maintainer));
private static final Gson gson = new Gson();
- private static DateFormat filenameFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
-
private static final String JOB_DELETE_OLD_APP_DATA = "delete-old-app-data";
private static final String JOB_ARCHIVE_APP_DATA = "archive-app-data";
private static final String JOB_CLEAN_CORE_DUMPS = "clean-core-dumps";
@@ -63,10 +51,6 @@ public class Maintainer {
private static Optional<String> kernelVersion = Optional.empty();
- static {
- filenameFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
- }
-
@SuppressWarnings("unchecked")
public static void main(String[] args) {
LogSetup.initVespaLogging(Maintainer.class.getSimpleName().toLowerCase());
@@ -153,7 +137,7 @@ public class Maintainer {
return new ProcessResult(process.waitFor(), output, errors);
}
- public static String[] concatenateArrays(String[] ar1, String... ar2) {
+ private static String[] concatenateArrays(String[] ar1, String... ar2) {
String[] concatenated = new String[ar1.length + ar2.length];
System.arraycopy(ar1, 0, concatenated, 0, ar1.length);
System.arraycopy(ar2, 0, concatenated, ar1.length, ar2.length);
@@ -164,8 +148,8 @@ public class Maintainer {
public static class DeleteOldAppDataArguments implements Runnable {
@Override
public void run() {
- String path = APPLICATION_STORAGE_PATH_FOR_NODE_ADMIN.toString();
- String regex = "^" + Pattern.quote(APPLICATION_STORAGE_CLEANUP_PATH_PREFIX);
+ String path = environment.getPathResolver().getApplicationStoragePathForNodeAdmin().toString();
+ String regex = "^" + Pattern.quote(Environment.APPLICATION_STORAGE_CLEANUP_PATH_PREFIX);
DeleteOldAppData.deleteDirectories(path, Duration.ofDays(7).getSeconds(), regex);
}
@@ -175,7 +159,7 @@ public class Maintainer {
public static class CleanCoreDumpsArguments implements Runnable {
@Override
public void run() {
- Path doneCoredumps = maintainer.pathInNodeAdminToDoneCoredumps();
+ Path doneCoredumps = environment.pathInNodeAdminToDoneCoredumps();
if (doneCoredumps.toFile().exists()) {
COREDUMP_HANDLER.removeOldCoredumps(doneCoredumps);
@@ -200,7 +184,7 @@ public class Maintainer {
Logger logger = Logger.getLogger(ArchiveApplicationData.class.getName());
Maintainer maintainer = new Maintainer();
- File yVarDir = maintainer.pathInNodeAdminFromPathInNode(containerName, "/home/y/var").toFile();
+ File yVarDir = environment.pathInNodeAdminFromPathInNode(containerName, "/home/y/var").toFile();
if (yVarDir.exists()) {
logger.info("Recursively deleting " + yVarDir);
try {
@@ -210,13 +194,13 @@ public class Maintainer {
}
}
- Path from = maintainer.pathInNodeAdminFromPathInNode(containerName, "/");
+ Path from = environment.pathInNodeAdminFromPathInNode(containerName, "/");
if (!Files.exists(from)) {
logger.info("The container storage at " + from + " doesn't exist");
return;
}
- Path to = maintainer.pathInNodeAdminToNodeCleanup(containerName);
+ Path to = environment.pathInNodeAdminToNodeCleanup(containerName);
logger.info("Moving container storage from " + from + " to " + to);
try {
Files.move(from, to);
@@ -246,8 +230,8 @@ public class Maintainer {
try {
Map<String, Object> attributesMap = (Map<String, Object>) gson.fromJson(attributes, Map.class);
- Path path = maintainer.pathInNodeAdminFromPathInNode(new ContainerName(container), "/home/y/var/crash");
- Path doneCoredumps = maintainer.pathInNodeAdminToDoneCoredumps();
+ Path path = environment.pathInNodeAdminFromPathInNode(new ContainerName(container), "/home/y/var/crash");
+ Path doneCoredumps = environment.pathInNodeAdminToDoneCoredumps();
COREDUMP_HANDLER.removeJavaCoredumps(path);
COREDUMP_HANDLER.processAndReportCoredumps(path, doneCoredumps, attributesMap);
@@ -258,54 +242,6 @@ public class Maintainer {
}
- /**
- * Absolute path in node admin to directory with processed and reported core dumps
- */
- private Path pathInNodeAdminToDoneCoredumps() {
- return APPLICATION_STORAGE_PATH_FOR_NODE_ADMIN.resolve("processed-coredumps");
- }
-
- /**
- * Absolute path in node admin container to the node cleanup directory.
- */
- public Path pathInNodeAdminToNodeCleanup(ContainerName containerName) {
- return APPLICATION_STORAGE_PATH_FOR_NODE_ADMIN.resolve(APPLICATION_STORAGE_CLEANUP_PATH_PREFIX +
- containerName.asString() + "_" + filenameFormatter.format(Date.from(Instant.now())));
- }
-
- /**
- * Translates an absolute path in node agent container to an absolute path in node admin container.
- * @param containerName name of the node agent container
- * @param absolutePathInNode absolute path in that container
- * @return the absolute path in node admin container pointing at the same inode
- */
- public Path pathInNodeAdminFromPathInNode(ContainerName containerName, String absolutePathInNode) {
- Path pathInNode = Paths.get(absolutePathInNode);
- if (! pathInNode.isAbsolute()) {
- throw new IllegalArgumentException("The specified path in node was not absolute: " + absolutePathInNode);
- }
-
- return APPLICATION_STORAGE_PATH_FOR_NODE_ADMIN
- .resolve(containerName.asString())
- .resolve(ROOT.relativize(pathInNode));
- }
-
- /**
- * Translates an absolute path in node agent container to an absolute path in host.
- * @param containerName name of the node agent container
- * @param absolutePathInNode absolute path in that container
- * @return the absolute path in host pointing at the same inode
- */
- public Path pathInHostFromPathInNode(ContainerName containerName, String absolutePathInNode) {
- Path pathInNode = Paths.get(absolutePathInNode);
- if (! pathInNode.isAbsolute()) {
- throw new IllegalArgumentException("The specified path in node was not absolute: " + absolutePathInNode);
- }
-
- return APPLICATION_STORAGE_PATH_FOR_HOST
- .resolve(containerName.asString())
- .resolve(ROOT.relativize(pathInNode));
- }
public static String getKernelVersion() throws IOException, InterruptedException {
if (! kernelVersion.isPresent()) {
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImplTest.java
index 5a431c491b8..b3b804ec7ad 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImplTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImplTest.java
@@ -7,13 +7,10 @@ import com.yahoo.vespa.hosted.dockerapi.Docker;
import com.yahoo.vespa.hosted.dockerapi.ProcessResult;
import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
-import com.yahoo.vespa.hosted.node.admin.util.InetAddressResolver;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
import org.hamcrest.CoreMatchers;
import org.junit.Test;
import org.mockito.InOrder;
-import java.util.Collections;
import java.util.Optional;
import static org.hamcrest.core.Is.is;
@@ -26,14 +23,10 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class DockerOperationsImplTest {
- private final Environment environment = new Environment(Collections.emptySet(),
- "dev",
- "us-east-1",
- "parent.host.name.yahoo.com",
- new InetAddressResolver());
+ private final Environment environment = new Environment.Builder().build();
private final Docker docker = mock(Docker.class);
private final DockerOperationsImpl dockerOperations = new DockerOperationsImpl(docker, environment,
- new Maintainer(), new MetricReceiverWrapper(MetricReceiver.nullImplementation));
+ new MetricReceiverWrapper(MetricReceiver.nullImplementation));
@Test
public void absenceOfNodeProgramIsSuccess() throws Exception {
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/LocalZoneUtils.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/LocalZoneUtils.java
index 9d5726d7071..da8dda707d5 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/LocalZoneUtils.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/LocalZoneUtils.java
@@ -11,7 +11,6 @@ import com.yahoo.vespa.hosted.dockerapi.DockerImpl;
import com.yahoo.vespa.hosted.dockerapi.ProcessResult;
import com.yahoo.vespa.hosted.node.admin.util.ConfigServerHttpRequestExecutor;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
import com.yahoo.vespa.hosted.provision.Node;
import java.io.IOException;
@@ -34,10 +33,6 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
/**
* @author freva
*/
@@ -126,19 +121,13 @@ public class LocalZoneUtils {
}
public static void buildVespaLocalDockerImage(Docker docker, DockerImage vespaBaseImage) throws IOException {
- Path dockerfileTemplatePath = Paths.get("node-admin/Dockerfile.template");
-
- String dockerfileTemplate = new String(Files.readAllBytes(dockerfileTemplatePath))
- .replaceAll("\\$NODE_ADMIN_FROM_IMAGE", vespaBaseImage.asString())
- .replaceAll("\\$VESPA_HOME", Defaults.getDefaults().vespaHome());
-
/*
* Because the daemon could be running on a remote machine, docker build command will upload the entire
* build path to daemon and then execute the Dockerfile. This means that:
* 1. We cant use relative paths in Dockerfile
* 2. We should avoid using a large directory as build root
*
- * Therefore, copy docker-api jar to node-admin/target and used node-admin as build root instead of vespa/
+ * Therefore, copy docker-api jar to node-admin/target and use node-admin as build root instead of vespa/
*/
Files.copy(PROJECT_ROOT.resolve("docker-api/target/docker-api-jar-with-dependencies.jar"),
PROJECT_ROOT.resolve("node-admin/target/docker-api-jar-with-dependencies.jar"),
@@ -146,7 +135,16 @@ public class LocalZoneUtils {
Path dockerfilePath = PROJECT_ROOT.resolve("node-admin/Dockerfile");
+ Path dockerfileTemplatePath = Paths.get("node-admin/Dockerfile.template");
+ String dockerfileTemplate = new String(Files.readAllBytes(dockerfileTemplatePath))
+ .replaceAll("\\$NODE_ADMIN_FROM_IMAGE", vespaBaseImage.asString())
+ .replaceAll("\\$VESPA_HOME", Defaults.getDefaults().vespaHome());
Files.write(dockerfilePath, dockerfileTemplate.getBytes());
+
+ String servicesXml = new String(Files.readAllBytes(PROJECT_ROOT.resolve("node-admin/src/main/application/services.xml")))
+ .replaceAll("(<isRunningLocally>).*(<\\/isRunningLocally>)", "$1true$2");
+ Files.write(PROJECT_ROOT.resolve("node-admin/include/services.xml"), servicesXml.getBytes());
+
docker.buildImage(dockerfilePath.getParent().toFile(), VESPA_LOCAL_IMAGE);
}
@@ -253,26 +251,5 @@ public class LocalZoneUtils {
return false;
}
-
- public static Maintainer getMaintainer(Path pathToContainerStorage) {
- Maintainer maintainer = mock(Maintainer.class);
- when(maintainer.pathInHostFromPathInNode(any(), any())).thenAnswer(invocation -> {
- Object[] args = invocation.getArguments();
- return pathToContainerStorage
- .resolve(((ContainerName) args[0]).asString())
- .resolve((String) args[1]);
- });
- when(maintainer.pathInNodeAdminFromPathInNode(any(), any())).thenAnswer(invocation -> {
- Object[] args = invocation.getArguments();
- return maintainer.pathInHostFromPathInNode((ContainerName) args[0], (String) args[1]);
- });
- when(maintainer.pathInNodeAdminToNodeCleanup(any())).thenAnswer(invocation -> {
- Object[] args = invocation.getArguments();
- return pathToContainerStorage
- .resolve("cleanup_" + ((ContainerName) args[0]).asString() + "_" + System.currentTimeMillis());
- });
-
- return maintainer;
- }
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/RunVespaLocal.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/RunVespaLocal.java
index dabb5db44ef..635bcaaf33e 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/RunVespaLocal.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/RunVespaLocal.java
@@ -11,6 +11,7 @@ import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater;
import com.yahoo.vespa.hosted.node.admin.provider.ComponentsProviderImpl;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.InetAddressResolver;
+import com.yahoo.vespa.hosted.node.admin.util.PathResolver;
import com.yahoo.vespa.hosted.provision.Node;
import java.io.IOException;
@@ -20,7 +21,6 @@ import java.net.URL;
import java.net.UnknownHostException;
import java.nio.file.Path;
import java.time.Duration;
-import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutionException;
@@ -40,9 +40,12 @@ import static org.junit.Assert.assertTrue;
* @author freva
*/
public class RunVespaLocal {
- private static final Environment environment = new Environment(
- Collections.singleton(LocalZoneUtils.CONFIG_SERVER_HOSTNAME), "prod", "vespa-local",
- HostName.getLocalhost(), new InetAddressResolver());
+ private static final Environment.Builder environmentBuilder = new Environment.Builder()
+ .configServerHosts(LocalZoneUtils.CONFIG_SERVER_HOSTNAME)
+ .environment("prod")
+ .region("vespa-local")
+ .parentHostHostname(HostName.getLocalhost())
+ .inetAddressResolver(new InetAddressResolver());
private NodeAdminStateUpdater nodeAdminStateUpdater = null;
private final Docker docker;
@@ -71,7 +74,7 @@ public class RunVespaLocal {
*/
void startLocalZoneWithNodes(int numNodesToProvision) throws IOException, InterruptedException, ExecutionException {
logger.info("Starting config-server");
- LocalZoneUtils.startConfigServerIfNeeded(docker, environment);
+ LocalZoneUtils.startConfigServerIfNeeded(docker, environmentBuilder.build());
logger.info("Waiting until config-server is ready to serve");
URL configServerUrl = new URL("http://" + LocalZoneUtils.CONFIG_SERVER_HOSTNAME +
@@ -85,16 +88,17 @@ public class RunVespaLocal {
/**
* Start node-admin in IDE
- * @param pathToContainerStorage Path to where the container data will be stored, the path must exist and must
- * be writeable by user, normally /home/docker/container-storage
+ * @param pathResolver Instance of {@link PathResolver} that specifies the path to where the container data will
+ * be stored, the path must exist and must be writeable by user,
+ * normally /home/docker/container-storage
*/
- void startNodeAdminInIDE(Path pathToContainerStorage) {
+ void startNodeAdminInIDE(PathResolver pathResolver) {
logger.info("Starting node-admin");
+ environmentBuilder.pathResolver(pathResolver);
nodeAdminStateUpdater = new ComponentsProviderImpl(
docker,
new MetricReceiverWrapper(MetricReceiver.nullImplementation),
- environment,
- LocalZoneUtils.getMaintainer(pathToContainerStorage),
+ environmentBuilder.build(),
Optional.empty()).getNodeAdminStateUpdater();
}
@@ -109,7 +113,7 @@ public class RunVespaLocal {
LocalZoneUtils.provisionHost(hostname);
logger.info("Starting node-admin");
- LocalZoneUtils.startNodeAdminIfNeeded(docker, environment, pathToContainerStorage);
+ LocalZoneUtils.startNodeAdminIfNeeded(docker, environmentBuilder.build(), pathToContainerStorage);
try {
URL nodeUrl = new URL("http://localhost:" + System.getenv("VESPA_WEB_SERVICE_PORT") + "/");
assertTrue(LocalZoneUtils.isReachableURL(nodeUrl, Duration.ofSeconds(120)));
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java
index 14f3a78339f..dff653ab94a 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java
@@ -13,10 +13,7 @@ import com.yahoo.vespa.hosted.dockerapi.Docker;
import com.yahoo.vespa.hosted.node.admin.docker.DockerOperationsImpl;
import com.yahoo.vespa.hosted.node.admin.provider.ComponentsProvider;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
-import com.yahoo.vespa.hosted.node.admin.util.InetAddressResolver;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
-import java.util.Collections;
import java.util.Optional;
import java.util.function.Function;
@@ -26,19 +23,14 @@ import java.util.function.Function;
* @author dybis
*/
public class ComponentsProviderWithMocks implements ComponentsProvider {
- static final Maintainer maintainer = new Maintainer();
static final CallOrderVerifier callOrderVerifier = new CallOrderVerifier();
static final NodeRepoMock nodeRepositoryMock = new NodeRepoMock(callOrderVerifier);
static final OrchestratorMock orchestratorMock = new OrchestratorMock(callOrderVerifier);
static final Docker dockerMock = new DockerMock(callOrderVerifier);
- private Environment environment = new Environment(Collections.emptySet(),
- "dev",
- "us-east-1",
- "parent.host.name.yahoo.com",
- new InetAddressResolver());
+ private final Environment environment = new Environment.Builder().build();
private final MetricReceiverWrapper mr = new MetricReceiverWrapper(MetricReceiver.nullImplementation);
- private final DockerOperations dockerOperations = new DockerOperationsImpl(dockerMock, environment, maintainer, mr);
+ private final DockerOperations dockerOperations = new DockerOperationsImpl(dockerMock, environment, mr);
private final Function<String, NodeAgent> nodeAgentFactory =
(hostName) -> new NodeAgentImpl(hostName, nodeRepositoryMock, orchestratorMock,
dockerOperations, Optional.empty(), mr, environment);
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerTester.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerTester.java
index 92bf218ed54..a5b0d7bb7a7 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerTester.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerTester.java
@@ -14,12 +14,10 @@ import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgent;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.InetAddressResolver;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.Collections;
import java.util.Optional;
import java.util.function.Function;
@@ -42,12 +40,6 @@ public class DockerTester implements AutoCloseable {
public DockerTester() {
- callOrderVerifier = new CallOrderVerifier();
- StorageMaintainerMock storageMaintainer = new StorageMaintainerMock(callOrderVerifier);
- orchestratorMock = new OrchestratorMock(callOrderVerifier);
- nodeRepositoryMock = new NodeRepoMock(callOrderVerifier);
- dockerMock = new DockerMock(callOrderVerifier);
-
InetAddressResolver inetAddressResolver = mock(InetAddressResolver.class);
try {
when(inetAddressResolver.getInetAddressForHost(any(String.class))).thenReturn(InetAddress.getByName("1.1.1.1"));
@@ -55,15 +47,17 @@ public class DockerTester implements AutoCloseable {
throw new RuntimeException(e);
}
- Environment environment = new Environment(Collections.emptySet(),
- "dev",
- "us-east-1",
- "parent.host.name.yahoo.com",
- inetAddressResolver);
+ Environment environment = new Environment.Builder().inetAddressResolver(inetAddressResolver).build();
+
+ callOrderVerifier = new CallOrderVerifier();
+ StorageMaintainerMock storageMaintainer = new StorageMaintainerMock(environment, callOrderVerifier);
+ orchestratorMock = new OrchestratorMock(callOrderVerifier);
+ nodeRepositoryMock = new NodeRepoMock(callOrderVerifier);
+ dockerMock = new DockerMock(callOrderVerifier);
+
MetricReceiverWrapper mr = new MetricReceiverWrapper(MetricReceiver.nullImplementation);
- final Maintainer maintainer = new Maintainer();
- final DockerOperations dockerOperations = new DockerOperationsImpl(dockerMock, environment, maintainer, mr);
+ final DockerOperations dockerOperations = new DockerOperationsImpl(dockerMock, environment, mr);
Function<String, NodeAgent> nodeAgentFactory = (hostName) -> new NodeAgentImpl(hostName, nodeRepositoryMock,
orchestratorMock, dockerOperations, Optional.of(storageMaintainer), mr, environment);
nodeAdmin = new NodeAdminImpl(dockerOperations, nodeAgentFactory, Optional.of(storageMaintainer), 100, mr);
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/StorageMaintainerMock.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/StorageMaintainerMock.java
index f8e9577f945..a2b3d655b6c 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/StorageMaintainerMock.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/StorageMaintainerMock.java
@@ -5,9 +5,7 @@ import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec;
import com.yahoo.vespa.hosted.node.admin.maintenance.StorageMaintainer;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
-import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -17,12 +15,8 @@ import java.util.Map;
public class StorageMaintainerMock extends StorageMaintainer {
private final CallOrderVerifier callOrderVerifier;
- public StorageMaintainerMock(CallOrderVerifier callOrderVerifier) {
- this(new Maintainer(), callOrderVerifier);
- }
-
- public StorageMaintainerMock(Maintainer maintainer, CallOrderVerifier callOrderVerifier) {
- super(maintainer);
+ public StorageMaintainerMock(Environment environment, CallOrderVerifier callOrderVerifier) {
+ super(environment);
this.callOrderVerifier = callOrderVerifier;
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
index 68162b19d15..886536a5555 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
@@ -1,7 +1,7 @@
package com.yahoo.vespa.hosted.node.admin.maintenance;
+import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.maintenance.DeleteOldAppDataTest;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
@@ -23,7 +23,8 @@ public class StorageMaintainerTest {
int writeSize = 10000;
DeleteOldAppDataTest.writeNBytesToFile(folder.newFile(), writeSize);
- StorageMaintainer storageMaintainer = new StorageMaintainer(new Maintainer());
+ Environment environment = new Environment.Builder().build();
+ StorageMaintainer storageMaintainer = new StorageMaintainer(environment);
long usedBytes = storageMaintainer.getDiscUsedInBytes(folder.getRoot());
if (usedBytes * 4 < writeSize || usedBytes > writeSize * 4)
fail("Used bytes is " + usedBytes + ", but wrote " + writeSize + " bytes, not even close.");
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java
index a56b2e163be..a113f82cc8c 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentImplTest.java
@@ -16,7 +16,7 @@ import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepository;
import com.yahoo.vespa.hosted.node.admin.orchestrator.Orchestrator;
import com.yahoo.vespa.hosted.node.admin.util.Environment;
import com.yahoo.vespa.hosted.node.admin.util.InetAddressResolver;
-import com.yahoo.vespa.hosted.node.maintenance.Maintainer;
+import com.yahoo.vespa.hosted.node.admin.util.PathResolver;
import com.yahoo.vespa.hosted.provision.Node;
import org.junit.Test;
import org.mockito.InOrder;
@@ -24,7 +24,6 @@ import org.mockito.InOrder;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -57,14 +56,16 @@ public class NodeAgentImplTest {
private final NodeRepository nodeRepository = mock(NodeRepository.class);
private final Orchestrator orchestrator = mock(Orchestrator.class);
private final StorageMaintainer storageMaintainer = mock(StorageMaintainer.class);
- private final Maintainer maintainer = mock(Maintainer.class);
private final MetricReceiverWrapper metricReceiver = new MetricReceiverWrapper(MetricReceiver.nullImplementation);
- private final Environment environment = new Environment(Collections.emptySet(),
- "dev",
- "us-east-1",
- "parent.host.name.yahoo.com",
- new InetAddressResolver());
+ private final PathResolver pathResolver = mock(PathResolver.class);
+ private final Environment environment = new Environment.Builder()
+ .environment("dev")
+ .region("us-east-1")
+ .parentHostHostname("parent.host.name.yahoo.com")
+ .inetAddressResolver(new InetAddressResolver())
+ .pathResolver(pathResolver).build();
+
private final NodeAgentImpl nodeAgent = new NodeAgentImpl(hostName, nodeRepository, orchestrator, dockerOperations,
Optional.of(storageMaintainer), metricReceiver, environment);
@@ -146,8 +147,7 @@ public class NodeAgentImplTest {
when(dockerOperations.shouldScheduleDownloadOfImage(any())).thenReturn(false);
when(dockerOperations.startContainerIfNeeded(eq(nodeSpec))).thenReturn(true);
when(dockerOperations.getVespaVersion(eq(containerName))).thenReturn(Optional.of(vespaVersion));
- when(storageMaintainer.getMaintainer()).thenReturn(maintainer);
- when(maintainer.pathInNodeAdminFromPathInNode(any(ContainerName.class), any(String.class))).thenReturn(Files.createTempDirectory("foo"));
+ when(pathResolver.getApplicationStoragePathForNodeAdmin()).thenReturn(Files.createTempDirectory("foo"));
when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec));
nodeAgent.tick();
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/maintenance/MaintainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/EnvironmentTest.java
index 5010ffd8549..a1e438ccc02 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/maintenance/MaintainerTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/EnvironmentTest.java
@@ -1,5 +1,5 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.node.maintenance;
+package com.yahoo.vespa.hosted.node.admin.util;
import com.yahoo.vespa.hosted.dockerapi.ContainerName;
import org.junit.Test;
@@ -7,20 +7,21 @@ import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
- * @author valerijf
+ * @author freva
*/
-public class MaintainerTest {
+public class EnvironmentTest {
+ private final Environment environment = new Environment.Builder().pathResolver(new PathResolver()).build();
+
@Test
public void testPathInNodeToPathInNodeAdminAndHost() {
ContainerName containerName = new ContainerName("docker1-1");
- Maintainer maintainer = new Maintainer();
assertEquals(
"/host/home/docker/container-storage/" + containerName.asString(),
- maintainer.pathInNodeAdminFromPathInNode(containerName, "/").toString());
+ environment.pathInNodeAdminFromPathInNode(containerName, "/").toString());
assertEquals(
"/home/docker/container-storage/" + containerName.asString(),
- maintainer.pathInHostFromPathInNode(containerName, "/").toString());
+ environment.pathInHostFromPathInNode(containerName, "/").toString());
}
@Test
@@ -30,12 +31,12 @@ public class MaintainerTest {
String[] absolutePathsInContainer = {"//home/y/var", "/home/y/var", "/home/y/var/"};
for (String pathInContainer : absolutePathsInContainer) {
- assertEquals(expected, new Maintainer().pathInNodeAdminFromPathInNode(containerName, pathInContainer).toString());
+ assertEquals(expected, environment.pathInNodeAdminFromPathInNode(containerName, pathInContainer).toString());
}
}
@Test(expected=IllegalArgumentException.class)
public void testNonAbsolutePathInNodeConversion() {
- new Maintainer().pathInNodeAdminFromPathInNode(new ContainerName("container-1"), "home/y/var");
+ environment.pathInNodeAdminFromPathInNode(new ContainerName("container-1"), "home/y/var");
}
}