diff options
author | freva <valerijf@yahoo-inc.com> | 2016-12-14 16:19:19 +0100 |
---|---|---|
committer | freva <valerijf@yahoo-inc.com> | 2016-12-14 16:19:19 +0100 |
commit | 4c62a0d432bd4e6871ba2da54e03d0874e5e2dd9 (patch) | |
tree | 60890185624ce1e7aeb0b891e4ee7cc4c1e8cda6 | |
parent | ed1dfcffd8308725fc81a875457ea0f1c04beda8 (diff) |
Moved path resolving to Enviroment through PathResolver
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"); } } |