diff options
author | Harald Musum <musum@yahoo-inc.com> | 2017-03-03 14:28:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-03 14:28:25 +0100 |
commit | 27b365d790c435e23f2aa87aeae8a79509635115 (patch) | |
tree | 31bd34d3291cae7d6c772eac86809202fdab4b9a | |
parent | eda3c75258874f160132189d27dc6028318b4db1 (diff) | |
parent | a4a3488dbccad10b4727500d2a79cbb69a21dbd1 (diff) |
Merge pull request #1917 from yahoo/freva/remove-getContainer-by-hostname
Freva/remove get container by hostname
35 files changed, 177 insertions, 229 deletions
diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/ContainerName.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/ContainerName.java index 3ccd71bee6e..b2afddcbd45 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/ContainerName.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/ContainerName.java @@ -25,6 +25,10 @@ public class ContainerName { return name; } + public static ContainerName fromHostname(final String hostName) { + return new ContainerName(hostName.split("\\.")[0]); + } + @Override public int hashCode() { return name.hashCode(); diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java index 663bb58cacc..f61998aba4c 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java @@ -55,8 +55,6 @@ public interface Docker { List<Container> getAllContainersManagedBy(String manager); - Optional<Container> getContainer(String hostname); - Optional<Container> getContainer(ContainerName containerName); CompletableFuture<DockerImage> pullImageAsync(DockerImage image); diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java index 1ac5f62b130..c331a6dcd5c 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java @@ -341,18 +341,12 @@ public class DockerImpl implements Docker { } @Override - public Optional<Container> getContainer(String hostname) { - return listAllContainers().stream() - .flatMap(this::asContainer) - .filter(c -> Objects.equals(hostname, c.hostname)) - .findFirst(); - } - - @Override public Optional<Container> getContainer(ContainerName containerName) { return listAllContainers().stream() + .filter(container -> Arrays.stream(container.getNames()) + .map(this::decode) + .anyMatch(name -> name.equals(containerName.asString()))) .flatMap(this::asContainer) - .filter(c -> Objects.equals(containerName, c.name)) .findFirst(); } diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java index 2aac1cff676..2c28eac5e4f 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerTest.java @@ -91,23 +91,23 @@ public class DockerTest { final String containerHostname = "hostName1"; docker.createContainerCommand(dockerImage, containerName, containerHostname).withManagedBy(MANAGER_NAME).create(); - Optional<Container> container = docker.getContainer(containerHostname); + Optional<Container> container = docker.getContainer(containerName); assertTrue(container.isPresent()); assertEquals(container.get().state, Container.State.CREATED); docker.startContainer(containerName); - container = docker.getContainer(containerHostname); + container = docker.getContainer(containerName); assertTrue(container.isPresent()); assertEquals(container.get().state, Container.State.RUNNING); docker.dockerClient.pauseContainerCmd(containerName.asString()).exec(); - container = docker.getContainer(containerHostname); + container = docker.getContainer(containerName); assertTrue(container.isPresent()); assertEquals(container.get().state, Container.State.PAUSED); docker.dockerClient.unpauseContainerCmd(containerName.asString()).exec(); docker.stopContainer(containerName); - container = docker.getContainer(containerHostname); + container = docker.getContainer(containerName); assertTrue(container.isPresent()); assertEquals(container.get().state, Container.State.EXITED); diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java index f3f8b04f5da..250baddd7f6 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java @@ -195,7 +195,7 @@ public class RunSystemTests { private void startSystemTestNodeIfNeeded(ContainerName containerName) throws IOException, InterruptedException, ExecutionException { buildVespaSystestDockerImage(docker, vespaBaseImage); - Optional<Container> container = docker.getContainer(containerName.asString()); + Optional<Container> container = docker.getContainer(containerName); if (container.isPresent()) { if (container.get().state.isRunning()) return; else docker.deleteContainer(containerName); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerAclSpec.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerAclSpec.java index d1309c77487..00ce854e519 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerAclSpec.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerAclSpec.java @@ -1,5 +1,7 @@ package com.yahoo.vespa.hosted.node.admin; +import com.yahoo.vespa.hosted.dockerapi.ContainerName; + import java.util.Objects; /** @@ -11,9 +13,9 @@ public class ContainerAclSpec { private final String hostname; private final String ipAddress; - private final String trustedBy; + private final ContainerName trustedBy; - public ContainerAclSpec(String hostname, String ipAddress, String trustedBy) { + public ContainerAclSpec(String hostname, String ipAddress, ContainerName trustedBy) { this.hostname = hostname; this.ipAddress = ipAddress; this.trustedBy = trustedBy; @@ -27,7 +29,7 @@ public class ContainerAclSpec { return ipAddress; } - public String trustedBy() { + public ContainerName trustedBy() { return trustedBy; } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java index 4fe85b7ab80..5ad60475276 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/ContainerNodeSpec.java @@ -1,7 +1,6 @@ // 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; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.provision.Node; @@ -15,7 +14,6 @@ import java.util.Optional; public class ContainerNodeSpec { public final String hostname; public final Optional<DockerImage> wantedDockerImage; - public final ContainerName containerName; public final Node.State nodeState; public final String nodeType; public final String nodeFlavor; @@ -33,7 +31,6 @@ public class ContainerNodeSpec { public ContainerNodeSpec( final String hostname, final Optional<DockerImage> wantedDockerImage, - final ContainerName containerName, final Node.State nodeState, final String nodeType, final String nodeFlavor, @@ -48,14 +45,12 @@ public class ContainerNodeSpec { final Optional<Double> minMainMemoryAvailableGb, final Optional<Double> minDiskAvailableGb) { Objects.requireNonNull(hostname); - Objects.requireNonNull(containerName); Objects.requireNonNull(nodeState); Objects.requireNonNull(nodeType); Objects.requireNonNull(nodeFlavor); this.hostname = hostname; this.wantedDockerImage = wantedDockerImage; - this.containerName = containerName; this.nodeState = nodeState; this.nodeType = nodeType; this.nodeFlavor = nodeFlavor; @@ -80,7 +75,6 @@ public class ContainerNodeSpec { return Objects.equals(hostname, that.hostname) && Objects.equals(wantedDockerImage, that.wantedDockerImage) && - Objects.equals(containerName, that.containerName) && Objects.equals(nodeState, that.nodeState) && Objects.equals(nodeType, that.nodeType) && Objects.equals(nodeFlavor, that.nodeFlavor) && @@ -101,7 +95,6 @@ public class ContainerNodeSpec { return Objects.hash( hostname, wantedDockerImage, - containerName, nodeState, nodeType, nodeFlavor, @@ -122,7 +115,6 @@ public class ContainerNodeSpec { return getClass().getSimpleName() + " {" + " hostname=" + hostname + " wantedDockerImage=" + wantedDockerImage - + " containerName=" + containerName + " nodeState=" + nodeState + " nodeType = " + nodeType + " nodeFlavor = " + nodeFlavor @@ -235,7 +227,6 @@ public class ContainerNodeSpec { public static class Builder { private String hostname; private Optional<DockerImage> wantedDockerImage = Optional.empty(); - private ContainerName containerName; private Node.State nodeState; private String nodeType; private String nodeFlavor; @@ -254,7 +245,6 @@ public class ContainerNodeSpec { public Builder(ContainerNodeSpec nodeSpec) { hostname(nodeSpec.hostname); - containerName(nodeSpec.containerName); nodeState(nodeSpec.nodeState); nodeType(nodeSpec.nodeType); nodeFlavor(nodeSpec.nodeFlavor); @@ -282,11 +272,6 @@ public class ContainerNodeSpec { return this; } - public Builder containerName(ContainerName containerName) { - this.containerName = containerName; - return this; - } - public Builder nodeState(Node.State nodeState) { this.nodeState = nodeState; return this; @@ -352,7 +337,7 @@ public class ContainerNodeSpec { } public ContainerNodeSpec build() { - return new ContainerNodeSpec(hostname, wantedDockerImage, containerName, nodeState, nodeType, nodeFlavor, + return new ContainerNodeSpec(hostname, wantedDockerImage, nodeState, nodeType, nodeFlavor, vespaVersion, owner, membership, wantedRestartGeneration, currentRestartGeneration, wantedRebootGeneration, currentRebootGeneration, diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java index 3c3aeb5bba8..fece46d31c7 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperations.java @@ -15,14 +15,14 @@ public interface DockerOperations { Optional<String> getVespaVersion(ContainerName containerName); // Returns true if started - boolean startContainerIfNeeded(ContainerNodeSpec nodeSpec); + boolean startContainerIfNeeded(ContainerName containerName, ContainerNodeSpec nodeSpec); // Returns false if image is already downloaded boolean shouldScheduleDownloadOfImage(DockerImage dockerImage); - Optional<Container> getContainer(String hostname); + Optional<Container> getContainer(ContainerName containerName); - void scheduleDownloadOfImage(ContainerNodeSpec nodeSpec, Runnable callback); + void scheduleDownloadOfImage(ContainerName containerName, ContainerNodeSpec nodeSpec, Runnable callback); void removeContainer(ContainerNodeSpec nodeSpec, Container existingContainer); 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 73f01c4cae8..1ae6c64b863 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 @@ -135,10 +135,10 @@ public class DockerOperationsImpl implements DockerOperations { // Returns true if started @Override - public boolean startContainerIfNeeded(final ContainerNodeSpec nodeSpec) { - if (docker.getContainer(nodeSpec.hostname).isPresent()) return false; + public boolean startContainerIfNeeded(ContainerName containerName, final ContainerNodeSpec nodeSpec) { + if (docker.getContainer(containerName).isPresent()) return false; - startContainer(nodeSpec); + startContainer(containerName, nodeSpec); numberOfRunningContainersGauge.sample(getAllManagedContainers().size()); return true; } @@ -150,8 +150,8 @@ public class DockerOperationsImpl implements DockerOperations { } @Override - public Optional<Container> getContainer(String hostname) { - return docker.getContainer(hostname); + public Optional<Container> getContainer(ContainerName containerName) { + return docker.getContainer(containerName); } /** @@ -175,10 +175,10 @@ public class DockerOperationsImpl implements DockerOperations { } } - private void startContainer(final ContainerNodeSpec nodeSpec) { - PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, nodeSpec.containerName); + private void startContainer(ContainerName containerName, final ContainerNodeSpec nodeSpec) { + PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, containerName); - logger.info("Starting container " + nodeSpec.containerName); + logger.info("Starting container " + containerName); try { InetAddress nodeInetAddress = environment.getInetAddressForHost(nodeSpec.hostname); final boolean isIPv6 = nodeInetAddress instanceof Inet6Address; @@ -186,7 +186,7 @@ public class DockerOperationsImpl implements DockerOperations { String configServers = String.join(",", environment.getConfigServerHosts()); Docker.CreateContainerCommand command = docker.createContainerCommand( nodeSpec.wantedDockerImage.get(), - nodeSpec.containerName, + containerName, nodeSpec.hostname) .withManagedBy(MANAGER_NAME) .withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME) @@ -199,7 +199,7 @@ public class DockerOperationsImpl implements DockerOperations { command.withVolume("/etc/hosts", "/etc/hosts"); for (String pathInNode : DIRECTORIES_TO_MOUNT.keySet()) { - String pathInHost = environment.pathInHostFromPathInNode(nodeSpec.containerName, pathInNode).toString(); + String pathInHost = environment.pathInHostFromPathInNode(containerName, pathInNode).toString(); command.withVolume(pathInHost, pathInNode); } @@ -221,17 +221,17 @@ public class DockerOperationsImpl implements DockerOperations { command.create(); if (isIPv6) { - docker.connectContainerToNetwork(nodeSpec.containerName, "bridge"); - docker.startContainer(nodeSpec.containerName); - setupContainerNetworkingWithScript(nodeSpec.containerName); + docker.connectContainerToNetwork(containerName, "bridge"); + docker.startContainer(containerName); + setupContainerNetworkingWithScript(containerName); } else { - docker.startContainer(nodeSpec.containerName); + docker.startContainer(containerName); } DIRECTORIES_TO_MOUNT.entrySet().stream().filter(Map.Entry::getValue).forEach(entry -> - docker.executeInContainerAsRoot(nodeSpec.containerName, "chmod", "-R", "a+w", entry.getKey())); + docker.executeInContainerAsRoot(containerName, "chmod", "-R", "a+w", entry.getKey())); } catch (IOException e) { - throw new RuntimeException("Failed to create container " + nodeSpec.containerName.asString(), e); + throw new RuntimeException("Failed to create container " + containerName.asString(), e); } } @@ -246,8 +246,8 @@ public class DockerOperationsImpl implements DockerOperations { } @Override - public void scheduleDownloadOfImage(final ContainerNodeSpec nodeSpec, Runnable callback) { - PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, nodeSpec.containerName); + public void scheduleDownloadOfImage(ContainerName containerName, final ContainerNodeSpec nodeSpec, Runnable callback) { + PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, containerName); logger.info("Schedule async download of " + nodeSpec.wantedDockerImage.get()); final CompletableFuture<DockerImage> asyncPullResult = docker.pullImageAsync(nodeSpec.wantedDockerImage.get()); @@ -263,8 +263,8 @@ public class DockerOperationsImpl implements DockerOperations { @Override public void removeContainer(final ContainerNodeSpec nodeSpec, final Container existingContainer) { - PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, nodeSpec.containerName); final ContainerName containerName = existingContainer.name; + PrefixLogger logger = PrefixLogger.getNodeAgentLogger(DockerOperationsImpl.class, containerName); if (existingContainer.state.isRunning()) { logger.info("Stopping container " + containerName.asString()); docker.stopContainer(containerName); 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 2f97f18dcb6..405a8aded54 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 @@ -158,7 +158,7 @@ public class StorageMaintainer { /** * Checks if container has any new coredumps, reports and archives them if so */ - public void handleCoreDumpsForContainer(ContainerNodeSpec nodeSpec, Environment environment) { + public void handleCoreDumpsForContainer(ContainerName containerName, ContainerNodeSpec nodeSpec, Environment environment) { Map<String, Object> attributes = new HashMap<>(); attributes.put("hostname", nodeSpec.hostname); attributes.put("parent_hostname", HostName.getLocalhost()); @@ -182,7 +182,7 @@ public class StorageMaintainer { MaintainerExecutor maintainerExecutor = new MaintainerExecutor(true); maintainerExecutor.addJob("handle-core-dumps") .withArgument("doneCoredumpsPath", environment.pathInNodeAdminToDoneCoredumps()) - .withArgument("containerCoredumpsPath", environment.pathInNodeAdminFromPathInNode(nodeSpec.containerName, "/home/y/var/crash")) + .withArgument("containerCoredumpsPath", environment.pathInNodeAdminFromPathInNode(containerName, "/home/y/var/crash")) .withArgument("attributes", attributes); maintainerExecutor.execute(); } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java index 236f53bc18e..55abbe1c79e 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainer.java @@ -86,12 +86,12 @@ public class AclMaintainer implements Runnable { private void configureAcls() { final List<ContainerAclSpec> aclSpecs = nodeRepository.getContainerAclSpecs(nodeAdminHostnameSupplier.get()); - final Map<String, List<ContainerAclSpec>> aclSpecsGroupedByHostname = aclSpecs.stream() + final Map<ContainerName, List<ContainerAclSpec>> aclSpecsGroupedByHostname = aclSpecs.stream() .collect(Collectors.groupingBy(ContainerAclSpec::trustedBy)); - for (Map.Entry<String, List<ContainerAclSpec>> entry : aclSpecsGroupedByHostname.entrySet()) { - final String hostname = entry.getKey(); - final Optional<Container> container = dockerOperations.getContainer(hostname); + for (Map.Entry<ContainerName, List<ContainerAclSpec>> entry : aclSpecsGroupedByHostname.entrySet()) { + final ContainerName containerName = entry.getKey(); + final Optional<Container> container = dockerOperations.getContainer(containerName); if (!container.isPresent()) { // Container belongs to this Docker host, but is currently unallocated continue; diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java index e539566d393..9dca02d4fef 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImpl.java @@ -145,9 +145,8 @@ public class NodeAdminImpl implements NodeAdmin { } for (NodeAgent nodeAgent : nodeAgents.values()) { try { - final Optional<ContainerNodeSpec> containerNodeSpec = nodeAgent.getContainerNodeSpec(); - if (containerNodeSpec.isPresent() && nodes.contains(containerNodeSpec.get().hostname)) { - final ContainerName containerName = containerNodeSpec.get().containerName; + if (nodes.contains(nodeAgent.getHostname())) { + final ContainerName containerName = nodeAgent.getContainerName(); if ( ! isFrozen()) return Optional.of("Node agent for " + containerName + " is not frozen"); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgent.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgent.java index d03a5fe9af5..e4ea3acef11 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgent.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgent.java @@ -66,6 +66,10 @@ public interface NodeAgent { */ void updateContainerNodeMetrics(); + ContainerName getContainerName(); + + String getHostname(); + /** * Returns true if NodeAgent is waiting for an image download to finish */ 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 89d27d33287..3ab48869c71 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 @@ -11,7 +11,6 @@ import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; import com.yahoo.vespa.hosted.node.admin.docker.DockerOperations; import com.yahoo.vespa.hosted.node.admin.maintenance.StorageMaintainer; import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepository; -import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepositoryImpl; import com.yahoo.vespa.hosted.node.admin.orchestrator.Orchestrator; import com.yahoo.vespa.hosted.node.admin.orchestrator.OrchestratorException; import com.yahoo.vespa.hosted.node.admin.util.Environment; @@ -53,6 +52,7 @@ public class NodeAgentImpl implements NodeAgent { private DockerImage imageBeingDownloaded = null; private final String hostname; + private final ContainerName containerName; private final NodeRepository nodeRepository; private final Orchestrator orchestrator; @@ -95,10 +95,10 @@ public class NodeAgentImpl implements NodeAgent { this.nodeRepository = nodeRepository; this.orchestrator = orchestrator; this.hostname = hostName; + this.containerName = ContainerName.fromHostname(hostName); this.dockerOperations = dockerOperations; this.storageMaintainer = storageMaintainer; - this.logger = PrefixLogger.getNodeAgentLogger(NodeAgentImpl.class, - NodeRepositoryImpl.containerNameFromHostName(hostName)); + this.logger = PrefixLogger.getNodeAgentLogger(NodeAgentImpl.class, containerName); this.metricReceiver = metricReceiver; this.environment = environment; } @@ -160,7 +160,7 @@ public class NodeAgentImpl implements NodeAgent { } // If the container is already running, initialize vespaVersion and lastCpuMetric - dockerOperations.getContainer(hostname) + dockerOperations.getContainer(containerName) .filter(container -> container.state.isRunning()) .ifPresent(container -> { vespaVersion = dockerOperations.getVespaVersion(container.name); @@ -195,7 +195,7 @@ public class NodeAgentImpl implements NodeAgent { } addDebugMessage("Starting optional node program resume command"); logger.info("Starting optional node program resume command"); - dockerOperations.resumeNode(nodeSpec.containerName); + dockerOperations.resumeNode(containerName); containerState = RUNNING; } @@ -236,10 +236,10 @@ public class NodeAgentImpl implements NodeAgent { } private void startContainerIfNeeded(final ContainerNodeSpec nodeSpec) { - if (dockerOperations.startContainerIfNeeded(nodeSpec)) { + if (dockerOperations.startContainerIfNeeded(containerName, nodeSpec)) { metricReceiver.unsetMetricsForContainer(hostname); lastCpuMetric = new CpuUsageReporter(Instant.now()); - vespaVersion = dockerOperations.getVespaVersion(nodeSpec.containerName); + vespaVersion = dockerOperations.getVespaVersion(containerName); configureContainerMetrics(nodeSpec); addDebugMessage("startContainerIfNeeded: containerState " + containerState + " -> " + @@ -262,7 +262,7 @@ public class NodeAgentImpl implements NodeAgent { } Optional<String> restartReason = shouldRestartServices(nodeSpec); if (restartReason.isPresent()) { - Optional<Container> existingContainer = dockerOperations.getContainer(hostname); + Optional<Container> existingContainer = dockerOperations.getContainer(containerName); if (existingContainer.isPresent()) { logger.info("Will restart services for container " + existingContainer.get() + ": " + restartReason.get()); restartServices(nodeSpec, existingContainer.get(), orchestrator); @@ -318,7 +318,7 @@ public class NodeAgentImpl implements NodeAgent { // Returns true if container is absent on return private boolean removeContainerIfNeeded(ContainerNodeSpec nodeSpec, String hostname, Orchestrator orchestrator) throws Exception { - Optional<Container> existingContainer = dockerOperations.getContainer(hostname); + Optional<Container> existingContainer = dockerOperations.getContainer(containerName); if (!existingContainer.isPresent()) { return true; } @@ -350,7 +350,7 @@ public class NodeAgentImpl implements NodeAgent { } imageBeingDownloaded = nodeSpec.wantedDockerImage.get(); // Create a signalWorkToBeDone when download is finished. - dockerOperations.scheduleDownloadOfImage(nodeSpec, this::signalWorkToBeDone); + dockerOperations.scheduleDownloadOfImage(containerName, nodeSpec, this::signalWorkToBeDone); } else if (imageBeingDownloaded != null) { // Image was downloading, but now it's ready imageBeingDownloaded = null; } @@ -429,8 +429,8 @@ public class NodeAgentImpl implements NodeAgent { break; case active: storageMaintainer.ifPresent(maintainer -> { - maintainer.removeOldFilesFromNode(nodeSpec.containerName); - maintainer.handleCoreDumpsForContainer(nodeSpec, environment); + maintainer.removeOldFilesFromNode(containerName); + maintainer.handleCoreDumpsForContainer(containerName, nodeSpec, environment); }); scheduleDownLoadIfNeeded(nodeSpec); if (imageBeingDownloaded != null) { @@ -456,7 +456,7 @@ public class NodeAgentImpl implements NodeAgent { orchestrator.resume(nodeSpec.hostname); break; case inactive: - storageMaintainer.ifPresent(maintainer -> maintainer.removeOldFilesFromNode(nodeSpec.containerName)); + storageMaintainer.ifPresent(maintainer -> maintainer.removeOldFilesFromNode(containerName)); removeContainerIfNeededUpdateContainerState(nodeSpec); updateNodeRepoWithCurrentAttributes(nodeSpec); break; @@ -464,10 +464,10 @@ public class NodeAgentImpl implements NodeAgent { nodeRepository.markAsDirty(nodeSpec.hostname); break; case dirty: - storageMaintainer.ifPresent(maintainer -> maintainer.removeOldFilesFromNode(nodeSpec.containerName)); + storageMaintainer.ifPresent(maintainer -> maintainer.removeOldFilesFromNode(containerName)); removeContainerIfNeededUpdateContainerState(nodeSpec); logger.info("State is " + nodeSpec.nodeState + ", will delete application storage and mark node as ready"); - storageMaintainer.ifPresent(maintainer -> maintainer.archiveNodeData(nodeSpec.containerName)); + storageMaintainer.ifPresent(maintainer -> maintainer.archiveNodeData(containerName)); updateNodeRepoAndMarkNodeAsReady(nodeSpec); break; default: @@ -483,7 +483,7 @@ public class NodeAgentImpl implements NodeAgent { } if (nodeSpec == null || !vespaVersion.isPresent()) return; - Optional<Docker.ContainerStats> containerStats = dockerOperations.getContainerStats(nodeSpec.containerName); + Optional<Docker.ContainerStats> containerStats = dockerOperations.getContainerStats(containerName); if ( ! containerStats.isPresent()) return; Docker.ContainerStats stats = containerStats.get(); @@ -537,7 +537,7 @@ public class NodeAgentImpl implements NodeAgent { .declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, "node.disk.limit").sample(diskGB * bytesInGB)); storageMaintainer.ifPresent(maintainer -> maintainer - .updateIfNeededAndGetDiskMetricsFor(nodeSpec.containerName) + .updateIfNeededAndGetDiskMetricsFor(containerName) .forEach((metricName, metricValue) -> metricReceiver.declareGauge(MetricReceiverWrapper.APPLICATION_DOCKER, dimensions, metricName).sample(metricValue.doubleValue()))); @@ -563,6 +563,14 @@ public class NodeAgentImpl implements NodeAgent { } } + public String getHostname() { + return hostname; + } + + public ContainerName getContainerName() { + return containerName; + } + @Override public boolean isDownloadingImage() { return imageBeingDownloaded != null; @@ -577,7 +585,7 @@ public class NodeAgentImpl implements NodeAgent { private void configureContainerMetrics(ContainerNodeSpec nodeSpec) { if (! storageMaintainer.isPresent()) return; - final Path yamasAgentFolder = environment.pathInNodeAdminFromPathInNode(nodeSpec.containerName, "/etc/yamas-agent/"); + final Path yamasAgentFolder = environment.pathInNodeAdminFromPathInNode(containerName, "/etc/yamas-agent/"); Path vespaCheckPath = Paths.get(getDefaults().underVespaHome("libexec/yms/yms_check_vespa")); SecretAgentScheduleMaker scheduleMaker = new SecretAgentScheduleMaker("vespa", 60, vespaCheckPath, "all") @@ -603,9 +611,9 @@ public class NodeAgentImpl implements NodeAgent { try { scheduleMaker.writeTo(yamasAgentFolder); final String[] restartYamasAgent = new String[] {"service" , "yamas-agent", "restart"}; - dockerOperations.executeCommandInContainerAsRoot(nodeSpec.containerName, restartYamasAgent); + dockerOperations.executeCommandInContainerAsRoot(containerName, restartYamasAgent); } catch (IOException e) { - throw new RuntimeException("Failed to write secret-agent schedules for " + nodeSpec.containerName, e); + throw new RuntimeException("Failed to write secret-agent schedules for " + containerName, e); } } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java index 5e4696b4072..c51e0e6dbb0 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java @@ -89,7 +89,8 @@ public class NodeRepositoryImpl implements NodeRepository { final String path = String.format("/nodes/v2/acl/%s?children=true", hostName); final GetAclResponse response = requestExecutor.get(path, port, GetAclResponse.class); return response.trustedNodes.stream() - .map(node -> new ContainerAclSpec(node.hostname, node.ipAddress, node.trustedBy)) + .map(node -> new ContainerAclSpec( + node.hostname, node.ipAddress, ContainerName.fromHostname(node.trustedBy))) .collect(Collectors.toList()); } catch (ConfigServerHttpRequestExecutor.NotFoundException e) { return Collections.emptyList(); @@ -122,7 +123,6 @@ public class NodeRepositoryImpl implements NodeRepository { return new ContainerNodeSpec( hostName, Optional.ofNullable(node.wantedDockerImage).map(DockerImage::new), - containerNameFromHostName(hostName), nodeState, node.nodeType, node.nodeFlavor, @@ -138,10 +138,6 @@ public class NodeRepositoryImpl implements NodeRepository { Optional.ofNullable(node.minDiskAvailableGb)); } - public static ContainerName containerNameFromHostName(final String hostName) { - return new ContainerName(hostName.split("\\.")[0]); - } - @Override public void updateNodeAttributes(final String hostName, final NodeAttributes nodeAttributes) { UpdateNodeAttributesResponse response = requestExecutor.patch( diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java index 33a2a8d81a5..9eae307d335 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java @@ -2,7 +2,7 @@ package com.yahoo.vespa.hosted.node.admin.orchestrator; import com.yahoo.vespa.defaults.Defaults; -import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepositoryImpl; +import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.node.admin.util.ConfigServerHttpRequestExecutor; import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger; @@ -89,7 +89,7 @@ public class OrchestratorImpl implements Orchestrator { } private PrefixLogger getLogger(String hostName) { - return PrefixLogger.getNodeAgentLogger(OrchestratorImpl.class, NodeRepositoryImpl.containerNameFromHostName(hostName)); + return PrefixLogger.getNodeAgentLogger(OrchestratorImpl.class, ContainerName.fromHostname(hostName)); } private String getSuspendPath(String hostName) { 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 856bf4338d4..1dd8381b7c4 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 @@ -55,7 +55,7 @@ public class LocalZoneUtils { private static final Path PROJECT_ROOT = Paths.get("").toAbsolutePath(); public static void startConfigServerIfNeeded(Docker docker, Environment environment) throws UnknownHostException { - Optional<Container> container = docker.getContainer(CONFIG_SERVER_HOSTNAME); + Optional<Container> container = docker.getContainer(CONFIG_SERVER_CONTAINER_NAME); if (container.isPresent()) { if (container.get().state.isRunning()) return; else docker.deleteContainer(CONFIG_SERVER_CONTAINER_NAME); 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 c371b7fe66c..6cc681bdf5f 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 @@ -19,7 +19,6 @@ import java.net.URL; import java.net.UnknownHostException; import java.nio.file.Path; import java.time.Duration; -import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.logging.Logger; diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/CallOrderVerifier.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/CallOrderVerifier.java index e9dde8f93cd..572ceb6d2a0 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/CallOrderVerifier.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/CallOrderVerifier.java @@ -20,7 +20,7 @@ import static org.junit.Assert.assertTrue; * @author freva */ public class CallOrderVerifier { - private static final int waitForCallOrderTimeout = 60000; //ms + private static final int waitForCallOrderTimeout = 600; //ms private final LinkedList<String> callOrder = new LinkedList<>(); private final Object monitor = new Object(); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java index 06f8079172d..11a01c10f1b 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerFailTest.java @@ -17,9 +17,8 @@ public class DockerFailTest { public void dockerFailTest() throws Exception { try (DockerTester dockerTester = new DockerTester()) { ContainerNodeSpec containerNodeSpec = new ContainerNodeSpec.Builder() - .hostname("hostName") + .hostname("host1.test.yahoo.com") .wantedDockerImage(new DockerImage("dockerImage")) - .containerName(new ContainerName("container")) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -35,15 +34,15 @@ public class DockerFailTest { CallOrderVerifier callOrderVerifier = dockerTester.getCallOrderVerifier(); callOrderVerifier.assertInOrder( - "createContainerCommand with DockerImage { imageId=dockerImage }, HostName: hostName, ContainerName { name=container }", - "executeInContainerAsRoot with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); + "createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); - dockerTester.deleteContainer(containerNodeSpec.containerName); + dockerTester.deleteContainer(new ContainerName("host1")); callOrderVerifier.assertInOrder( - "deleteContainer with ContainerName { name=container }", - "createContainerCommand with DockerImage { imageId=dockerImage }, HostName: hostName, ContainerName { name=container }", - "executeInContainerAsRoot with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); + "deleteContainer with ContainerName { name=host1 }", + "createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); } } } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java index 75c25b3b93e..8c7eda50a24 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/DockerMock.java @@ -97,13 +97,6 @@ public class DockerMock implements Docker { } @Override - public Optional<Container> getContainer(String hostname) { - synchronized (monitor) { - return containers.stream().filter(container -> container.hostname.equals(hostname)).findFirst(); - } - } - - @Override public Optional<Container> getContainer(ContainerName containerName) { synchronized (monitor) { return containers.stream().filter(container -> container.name.equals(containerName)).findFirst(); 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 aef03327645..5f1fa19666f 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,9 +14,11 @@ 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.admin.util.PathResolver; import java.net.InetAddress; import java.net.UnknownHostException; +import java.nio.file.Paths; import java.util.Optional; import java.util.function.Function; @@ -46,7 +48,9 @@ public class DockerTester implements AutoCloseable { throw new RuntimeException(e); } - Environment environment = new Environment.Builder().inetAddressResolver(inetAddressResolver).build(); + Environment environment = new Environment.Builder() + .inetAddressResolver(inetAddressResolver) + .pathResolver(new PathResolver(Paths.get("/tmp"), Paths.get("/tmp"))).build(); callOrderVerifier = new CallOrderVerifier(); orchestratorMock = new OrchestratorMock(callOrderVerifier); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java index 582df7d22f6..d827ac1b517 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/MultiDockerTest.java @@ -18,9 +18,9 @@ public class MultiDockerTest { @Test public void test() throws InterruptedException, IOException { try (DockerTester dockerTester = new DockerTester()) { - addAndWaitForNode(dockerTester, "host1", new ContainerName("container1"), new DockerImage("image1")); + addAndWaitForNode(dockerTester, "host1.test.yahoo.com", new DockerImage("image1")); ContainerNodeSpec containerNodeSpec2 = - addAndWaitForNode(dockerTester, "host2", new ContainerName("container2"), new DockerImage("image2")); + addAndWaitForNode(dockerTester, "host2.test.yahoo.com", new DockerImage("image2")); dockerTester.updateContainerNodeSpec( new ContainerNodeSpec.Builder(containerNodeSpec2) @@ -33,39 +33,38 @@ public class MultiDockerTest { Thread.sleep(10); } - addAndWaitForNode(dockerTester, "host3", new ContainerName("container3"), new DockerImage("image1")); + addAndWaitForNode(dockerTester, "host3.test.yahoo.com", new DockerImage("image1")); CallOrderVerifier callOrderVerifier = dockerTester.getCallOrderVerifier(); callOrderVerifier.assertInOrder( - "createContainerCommand with DockerImage { imageId=image1 }, HostName: host1, ContainerName { name=container1 }", - "executeInContainerAsRoot with ContainerName { name=container1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]", + "createContainerCommand with DockerImage { imageId=image1 }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]", - "createContainerCommand with DockerImage { imageId=image2 }, HostName: host2, ContainerName { name=container2 }", - "executeInContainerAsRoot with ContainerName { name=container2 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]", + "createContainerCommand with DockerImage { imageId=image2 }, HostName: host2.test.yahoo.com, ContainerName { name=host2 }", + "executeInContainerAsRoot with ContainerName { name=host2 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]", - "stopContainer with ContainerName { name=container2 }", - "deleteContainer with ContainerName { name=container2 }", + "stopContainer with ContainerName { name=host2 }", + "deleteContainer with ContainerName { name=host2 }", - "createContainerCommand with DockerImage { imageId=image1 }, HostName: host3, ContainerName { name=container3 }", - "executeInContainerAsRoot with ContainerName { name=container3 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); + "createContainerCommand with DockerImage { imageId=image1 }, HostName: host3.test.yahoo.com, ContainerName { name=host3 }", + "executeInContainerAsRoot with ContainerName { name=host3 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); callOrderVerifier.assertInOrderWithAssertMessage("Maintainer did not receive call to delete application storage", - "deleteContainer with ContainerName { name=container2 }", - "DeleteContainerStorage with ContainerName { name=container2 }"); + "deleteContainer with ContainerName { name=host2 }", + "DeleteContainerStorage with ContainerName { name=host2 }"); callOrderVerifier.assertInOrder( - "updateNodeAttributes with HostName: host1, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image1, vespaVersion=''}", - "updateNodeAttributes with HostName: host2, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image2, vespaVersion=''}", - "markAsReady with HostName: host2", - "updateNodeAttributes with HostName: host3, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image1, vespaVersion=''}"); + "updateNodeAttributes with HostName: host1.test.yahoo.com, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image1, vespaVersion=''}", + "updateNodeAttributes with HostName: host2.test.yahoo.com, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image2, vespaVersion=''}", + "markAsReady with HostName: host2.test.yahoo.com", + "updateNodeAttributes with HostName: host3.test.yahoo.com, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image1, vespaVersion=''}"); } } - private ContainerNodeSpec addAndWaitForNode(DockerTester tester, String hostName, ContainerName containerName, DockerImage dockerImage) throws InterruptedException { + private ContainerNodeSpec addAndWaitForNode(DockerTester tester, String hostName, DockerImage dockerImage) throws InterruptedException { ContainerNodeSpec containerNodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(dockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -80,6 +79,7 @@ public class MultiDockerTest { Thread.sleep(10); } + ContainerName containerName = ContainerName.fromHostname(hostName); tester.getCallOrderVerifier().assertInOrder( "createContainerCommand with " + dockerImage + ", HostName: " + hostName + ", " + containerName, "executeInContainerAsRoot with " + containerName + ", args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/NodeStateTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/NodeStateTest.java index 222d46658eb..187bfa22195 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/NodeStateTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/NodeStateTest.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.hosted.node.admin.integrationTests; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.docker.DockerOperationsImpl; import com.yahoo.vespa.hosted.provision.Node; @@ -17,9 +16,8 @@ import java.io.IOException; */ public class NodeStateTest { private final ContainerNodeSpec initialContainerNodeSpec = new ContainerNodeSpec.Builder() - .hostname("host1") + .hostname("host1.test.yahoo.com") .wantedDockerImage(new DockerImage("dockerImage")) - .containerName(new ContainerName("container")) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -36,8 +34,8 @@ public class NodeStateTest { } tester.getCallOrderVerifier().assertInOrder( - "createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1, ContainerName { name=container }", - "executeInContainerAsRoot with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); + "createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); } @@ -57,9 +55,9 @@ public class NodeStateTest { } dockerTester.getCallOrderVerifier() - .assertInOrder("executeInContainerAsRoot with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", stop]", - "stopContainer with ContainerName { name=container }", - "deleteContainer with ContainerName { name=container }"); + .assertInOrder("executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", stop]", + "stopContainer with ContainerName { name=host1 }", + "deleteContainer with ContainerName { name=host1 }"); } } @@ -79,8 +77,8 @@ public class NodeStateTest { CallOrderVerifier callOrderVerifier = dockerTester.getCallOrderVerifier(); callOrderVerifier.assertInOrderWithAssertMessage("Node set to inactive, but no stop/delete call received", - "stopContainer with ContainerName { name=container }", - "deleteContainer with ContainerName { name=container }"); + "stopContainer with ContainerName { name=host1 }", + "deleteContainer with ContainerName { name=host1 }"); // Change node state to active @@ -91,9 +89,9 @@ public class NodeStateTest { // Check that the container is started again after the delete call callOrderVerifier.assertInOrderWithAssertMessage("Node not started again after being put to active state", - "deleteContainer with ContainerName { name=container }", - "createContainerCommand with DockerImage { imageId=newDockerImage }, HostName: host1, ContainerName { name=container }", - "executeInContainerAsRoot with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); + "deleteContainer with ContainerName { name=host1 }", + "createContainerCommand with DockerImage { imageId=newDockerImage }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", resume]"); } } } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java index 59e945a4fb8..c2bff95c8d1 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RebootTest.java @@ -1,7 +1,6 @@ // 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.integrationTests; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; import com.yahoo.vespa.hosted.node.admin.docker.DockerOperationsImpl; @@ -39,8 +38,8 @@ public class RebootTest { CallOrderVerifier callOrderVerifier = dockerTester.getCallOrderVerifier(); // Check that the container is started and NodeRepo has received the PATCH update - callOrderVerifier.assertInOrder("createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1, ContainerName { name=container }", - "updateNodeAttributes with HostName: host1, NodeAttributes{restartGeneration=1, rebootGeneration=null, dockerImage=dockerImage, vespaVersion='null'}"); + callOrderVerifier.assertInOrder("createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "updateNodeAttributes with HostName: host1.test.yahoo.com, NodeAttributes{restartGeneration=1, rebootGeneration=null, dockerImage=dockerImage, vespaVersion='null'}"); NodeAdminStateUpdater updater = dockerTester.getNodeAdminStateUpdater(); assertThat(updater.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.SUSPENDED), @@ -57,15 +56,14 @@ public class RebootTest { assertTrue(nodeAdmin.freezeNodeAgentsAndCheckIfAllFrozen()); - callOrderVerifier.assertInOrder("executeInContainer with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", stop]"); + callOrderVerifier.assertInOrder("executeInContainer with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", stop]"); } } private ContainerNodeSpec createContainerNodeSpec() { return new ContainerNodeSpec.Builder() - .hostname("host1") + .hostname("host1.test.yahoo.com") .wantedDockerImage(new DockerImage("dockerImage")) - .containerName(new ContainerName("container")) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java index c945f2d84f6..d7fd753fabe 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RestartTest.java @@ -1,7 +1,6 @@ // 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.integrationTests; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; import com.yahoo.vespa.hosted.node.admin.docker.DockerOperationsImpl; @@ -32,23 +31,22 @@ public class RestartTest { CallOrderVerifier callOrderVerifier = dockerTester.getCallOrderVerifier(); // Check that the container is started and NodeRepo has received the PATCH update - callOrderVerifier.assertInOrder("createContainerCommand with DockerImage { imageId=image:1.2.3 }, HostName: host1, ContainerName { name=container }", - "updateNodeAttributes with HostName: host1, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image:1.2.3, vespaVersion=''}"); + callOrderVerifier.assertInOrder("createContainerCommand with DockerImage { imageId=image:1.2.3 }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "updateNodeAttributes with HostName: host1.test.yahoo.com, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=image:1.2.3, vespaVersion=''}"); wantedRestartGeneration = 2; currentRestartGeneration = 1; dockerTester.updateContainerNodeSpec(createContainerNodeSpec(wantedRestartGeneration, currentRestartGeneration)); - callOrderVerifier.assertInOrder("Suspend for host1", - "executeInContainerAsRoot with ContainerName { name=container }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", restart-vespa]"); + callOrderVerifier.assertInOrder("Suspend for host1.test.yahoo.com", + "executeInContainerAsRoot with ContainerName { name=host1 }, args: [" + DockerOperationsImpl.NODE_PROGRAM + ", restart-vespa]"); } } private ContainerNodeSpec createContainerNodeSpec(long wantedRestartGeneration, long currentRestartGeneration) { return new ContainerNodeSpec.Builder() - .hostname("host1") + .hostname("host1.test.yahoo.com") .wantedDockerImage(new DockerImage("image:1.2.3")) - .containerName(new ContainerName("container")) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ResumeTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ResumeTest.java index b3209d9a050..6292c07bd04 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ResumeTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ResumeTest.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.hosted.node.admin.integrationTests; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdmin; import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.provision.Node; import org.junit.Test; @@ -29,9 +28,8 @@ public class ResumeTest { final NodeAdminStateUpdater nodeAdminStateUpdater = dockerTester.getNodeAdminStateUpdater(); dockerTester.addContainerNodeSpec(new ContainerNodeSpec.Builder() - .hostname("host1") + .hostname("host1.test.yahoo.com") .wantedDockerImage(new DockerImage("dockerImage")) - .containerName(new ContainerName("container")) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -47,8 +45,8 @@ public class ResumeTest { CallOrderVerifier callOrderVerifier = dockerTester.getCallOrderVerifier(); // Check that the container is started and NodeRepo has received the PATCH update - callOrderVerifier.assertInOrder("createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1, ContainerName { name=container }", - "updateNodeAttributes with HostName: host1, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=dockerImage, vespaVersion=''}"); + callOrderVerifier.assertInOrder("createContainerCommand with DockerImage { imageId=dockerImage }, HostName: host1.test.yahoo.com, ContainerName { name=host1 }", + "updateNodeAttributes with HostName: host1.test.yahoo.com, NodeAttributes{restartGeneration=1, rebootGeneration=0, dockerImage=dockerImage, vespaVersion=''}"); // Force orchestrator to reject the suspend orchestratorMock.setForceGroupSuspendResponse(Optional.of("Orchestrator reject suspend")); @@ -80,9 +78,9 @@ public class ResumeTest { Thread.sleep(10); } - callOrderVerifier.assertInOrder("Resume for host1", - "Suspend with parent: basehostname and hostnames: [host1] - Forced response: Optional[Orchestrator reject suspend]", - "Suspend with parent: basehostname and hostnames: [host1] - Forced response: Optional.empty"); + callOrderVerifier.assertInOrder("Resume for host1.test.yahoo.com", + "Suspend with parent: basehostname and hostnames: [host1.test.yahoo.com] - Forced response: Optional[Orchestrator reject suspend]", + "Suspend with parent: basehostname and hostnames: [host1.test.yahoo.com] - Forced response: Optional.empty"); } } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RunInContainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RunInContainerTest.java index c4a3788b33f..5f445079d8e 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RunInContainerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/RunInContainerTest.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.node.admin.integrationTests; import com.yahoo.application.Networking; import com.yahoo.application.container.JDisc; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; import com.yahoo.vespa.hosted.provision.Node; @@ -111,9 +110,8 @@ public class RunInContainerTest { ComponentsProviderWithMocks.nodeRepositoryMock .addContainerNodeSpec(new ContainerNodeSpec.Builder() - .hostname("hostName") + .hostname("host1.test.yahoo.com") .wantedDockerImage(new DockerImage("dockerImage")) - .containerName(new ContainerName("container")) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -123,7 +121,7 @@ public class RunInContainerTest { ComponentsProviderWithMocks.orchestratorMock.setForceGroupSuspendResponse(Optional.of("Denied")); assertThat(doPutCall("suspend"), is(false)); ComponentsProviderWithMocks.callOrderVerifier - .assertInOrder("Suspend with parent: localhost and hostnames: [hostName] - Forced response: Optional[Denied]"); + .assertInOrder("Suspend with parent: localhost and hostnames: [host1.test.yahoo.com] - Forced response: Optional[Denied]"); assertThat(doGetInfoCall(), is("{\"dockerHostHostName\":\"localhost\",\"NodeAdmin\":{\"isFrozen\":true,\"NodeAgents\":[]}}")); } 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 6107ca74752..c67b6a0e7e5 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 @@ -29,7 +29,7 @@ public class StorageMaintainerMock extends StorageMaintainer { } @Override - public void handleCoreDumpsForContainer(ContainerNodeSpec nodeSpec, Environment environment) { + public void handleCoreDumpsForContainer(ContainerName containerName, ContainerNodeSpec nodeSpec, Environment environment) { } @Override diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java index d10c2a4c9a3..fde8009bdd3 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/acl/AclMaintainerTest.java @@ -150,16 +150,17 @@ public class AclMaintainerTest { } private Container makeContainer(String hostname, Container.State state, int pid) { + final ContainerName containerName = new ContainerName(hostname); final Container container = new Container(hostname, new DockerImage("mock"), - new ContainerName(hostname), state, pid); - when(dockerOperations.getContainer(eq(hostname))).thenReturn(Optional.of(container)); + containerName, state, pid); + when(dockerOperations.getContainer(eq(containerName))).thenReturn(Optional.of(container)); return container; } private static List<ContainerAclSpec> makeAclSpecs(int count, ContainerName containerName) { return IntStream.rangeClosed(1, count) .mapToObj(i -> new ContainerAclSpec("node-" + i, "::" + i, - containerName.asString())) + containerName)) .collect(Collectors.toList()); } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImplTest.java index 17f70ce5efa..4b663c9865d 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminImplTest.java @@ -57,14 +57,13 @@ public class NodeAdminImplTest { final NodeAgent nodeAgent2 = mock(NodeAgentImpl.class); when(nodeAgentFactory.apply(any(String.class))).thenReturn(nodeAgent1).thenReturn(nodeAgent2); - final String hostName = "host"; + final String hostName = "host1.test.yahoo.com"; final DockerImage dockerImage = new DockerImage("image"); - final ContainerName containerName = new ContainerName("container"); + final ContainerName containerName = new ContainerName("host1"); final Container existingContainer = new Container(hostName, dockerImage, containerName, Container.State.RUNNING, 5); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(dockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java index 556f417c648..1f99eeae949 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java @@ -3,13 +3,11 @@ package com.yahoo.vespa.hosted.node.admin.nodeadmin; import com.yahoo.prelude.semantics.RuleBaseException; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.node.admin.integrationTests.CallOrderVerifier; import com.yahoo.vespa.hosted.node.admin.integrationTests.OrchestratorMock; import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepository; import com.yahoo.vespa.hosted.provision.Node; import org.junit.Test; -import org.mockito.stubbing.Answer; import java.util.ArrayList; import java.util.Collections; @@ -35,7 +33,7 @@ public class NodeAdminStateUpdaterTest { NodeAdmin nodeAdmin = mock(NodeAdmin.class); final List<ContainerNodeSpec> accumulatedArgumentList = Collections.synchronizedList(new ArrayList<>()); doAnswer( - (Answer<Void>) invocation -> { + invocation -> { List<ContainerNodeSpec> containersToRunInArgument = (List<ContainerNodeSpec>) invocation.getArguments()[0]; containersToRunInArgument.forEach(accumulatedArgumentList::add); if (accumulatedArgumentList.size() == 2) { @@ -83,8 +81,7 @@ public class NodeAdminStateUpdaterTest { private ContainerNodeSpec createSample() { return new ContainerNodeSpec.Builder() - .hostname("hostName") - .containerName(new ContainerName("containerName")) + .hostname("host1.test.yahoo.com") .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") 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 5ef0c9f0d61..baf69167296 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 @@ -51,7 +51,8 @@ public class NodeAgentImplTest { private static final double MIN_DISK_AVAILABLE_GB = 1.0; private static final String vespaVersion = "7.8.9"; - private final String hostName = "hostname"; + private final String hostName = "host1.test.yahoo.com"; + private final ContainerName containerName = new ContainerName("host1"); private final DockerOperations dockerOperations = mock(DockerOperations.class); private final NodeRepository nodeRepository = mock(NodeRepository.class); private final Orchestrator orchestrator = mock(Orchestrator.class); @@ -74,11 +75,9 @@ public class NodeAgentImplTest { final long restartGeneration = 1; final long rebootGeneration = 0; final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(dockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -92,11 +91,11 @@ public class NodeAgentImplTest { .build(); Docker.ContainerStats containerStats = new ContainerStatsImpl(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>()); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, dockerImage, containerName, Container.State.RUNNING, 1))); when(dockerOperations.getContainerStats(any())).thenReturn(Optional.of(containerStats)); when(dockerOperations.shouldScheduleDownloadOfImage(any())).thenReturn(false); - when(dockerOperations.startContainerIfNeeded(eq(nodeSpec))).thenReturn(false); + when(dockerOperations.startContainerIfNeeded(eq(containerName), eq(nodeSpec))).thenReturn(false); when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); nodeAgent.vespaVersion = nodeSpec.vespaVersion; @@ -105,7 +104,7 @@ public class NodeAgentImplTest { verify(dockerOperations, never()).removeContainer(any(), any()); verify(orchestrator, never()).suspend(any(String.class)); - verify(dockerOperations, never()).scheduleDownloadOfImage(any(), any()); + verify(dockerOperations, never()).scheduleDownloadOfImage(eq(containerName), any(), any()); final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository); // TODO: Verify this isn't run unless 1st time @@ -126,11 +125,9 @@ public class NodeAgentImplTest { final long restartGeneration = 1; final long rebootGeneration = 0; final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(dockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -143,10 +140,10 @@ public class NodeAgentImplTest { .minDiskAvailableGb(MIN_DISK_AVAILABLE_GB) .build(); - when(dockerOperations.getContainer(eq(hostName))).thenReturn(Optional.empty()); + when(dockerOperations.getContainer(eq(containerName))).thenReturn(Optional.empty()); when(dockerOperations.getContainerStats(eq(containerName))).thenReturn(Optional.empty()); when(dockerOperations.shouldScheduleDownloadOfImage(any())).thenReturn(false); - when(dockerOperations.startContainerIfNeeded(eq(nodeSpec))).thenReturn(true); + when(dockerOperations.startContainerIfNeeded(eq(containerName), eq(nodeSpec))).thenReturn(true); when(dockerOperations.getVespaVersion(eq(containerName))).thenReturn(Optional.of(vespaVersion)); when(pathResolver.getApplicationStoragePathForNodeAdmin()).thenReturn(Files.createTempDirectory("foo")); when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); @@ -155,7 +152,7 @@ public class NodeAgentImplTest { verify(dockerOperations, never()).removeContainer(any(), any()); verify(orchestrator, never()).suspend(any(String.class)); - verify(dockerOperations, never()).scheduleDownloadOfImage(any(), any()); + verify(dockerOperations, never()).scheduleDownloadOfImage(eq(containerName), any(), any()); final InOrder inOrder = inOrder(dockerOperations, orchestrator, nodeRepository); inOrder.verify(dockerOperations, times(1)).resumeNode(eq(containerName)); @@ -170,7 +167,6 @@ public class NodeAgentImplTest { @Test public void containerIsNotStoppedIfNewImageMustBePulled() throws Exception { - final ContainerName containerName = new ContainerName("container"); final DockerImage oldDockerImage = new DockerImage("old-image"); final DockerImage newDockerImage = new DockerImage("new-image"); final long wantedRestartGeneration = 2; @@ -178,7 +174,6 @@ public class NodeAgentImplTest { final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(newDockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -191,7 +186,7 @@ public class NodeAgentImplTest { when(dockerOperations.shouldScheduleDownloadOfImage(any())).thenReturn(true); when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, oldDockerImage, containerName, Container.State.RUNNING, 1))); nodeAgent.tick(); @@ -202,7 +197,7 @@ public class NodeAgentImplTest { final InOrder inOrder = inOrder(dockerOperations); inOrder.verify(dockerOperations, times(1)).shouldScheduleDownloadOfImage(eq(newDockerImage)); - inOrder.verify(dockerOperations, times(1)).scheduleDownloadOfImage(eq(nodeSpec), any()); + inOrder.verify(dockerOperations, times(1)).scheduleDownloadOfImage(eq(containerName), eq(nodeSpec), any()); } @Test @@ -210,11 +205,9 @@ public class NodeAgentImplTest { final long wantedRestartGeneration = 2; final long currentRestartGeneration = 1; final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(dockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -232,7 +225,7 @@ public class NodeAgentImplTest { fail("Expected to throw an exception"); } catch (Exception ignored) { } - verify(dockerOperations, never()).startContainerIfNeeded(eq(nodeSpec)); + verify(dockerOperations, never()).startContainerIfNeeded(eq(containerName), eq(nodeSpec)); verify(orchestrator, never()).resume(any(String.class)); verify(nodeRepository, never()).updateNodeAttributes(any(String.class), any(NodeAttributes.class)); } @@ -242,10 +235,8 @@ public class NodeAgentImplTest { final long restartGeneration = 1; final long rebootGeneration = 0; final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) - .containerName(containerName) .nodeState(Node.State.failed) .nodeType("tenant") .nodeFlavor("docker") @@ -257,7 +248,7 @@ public class NodeAgentImplTest { .build(); when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, dockerImage, containerName, Container.State.RUNNING, 1))); nodeAgent.vespaVersion = nodeSpec.vespaVersion; @@ -279,10 +270,8 @@ public class NodeAgentImplTest { final long restartGeneration = 1; final long rebootGeneration = 0; final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) - .containerName(containerName) .nodeState(Node.State.ready) .nodeType("tenant") .nodeFlavor("docker") @@ -295,7 +284,7 @@ public class NodeAgentImplTest { .build(); when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, dockerImage, containerName, Container.State.RUNNING, 1))); nodeAgent.vespaVersion = nodeSpec.vespaVersion; @@ -303,7 +292,7 @@ public class NodeAgentImplTest { nodeAgent.tick(); verify(dockerOperations, never()).removeContainer(any(), any()); - verify(dockerOperations, never()).startContainerIfNeeded(eq(nodeSpec)); + verify(dockerOperations, never()).startContainerIfNeeded(eq(containerName), eq(nodeSpec)); verify(orchestrator, never()).resume(any(String.class)); verify(nodeRepository).updateNodeAttributes( hostName, new NodeAttributes() @@ -318,10 +307,8 @@ public class NodeAgentImplTest { final long restartGeneration = 1; final long rebootGeneration = 0; final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) - .containerName(containerName) .nodeState(Node.State.inactive) .nodeType("tenant") .nodeFlavor("docker") @@ -334,7 +321,7 @@ public class NodeAgentImplTest { .build(); when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, dockerImage, containerName, Container.State.RUNNING, 1))); nodeAgent.vespaVersion = nodeSpec.vespaVersion; @@ -356,11 +343,9 @@ public class NodeAgentImplTest { private ContainerNodeSpec makeContainer(Node.State nodeState, Optional<Long> wantedRestartGeneration) { final DockerImage dockerImage = new DockerImage("dockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec.Builder nodeSpecBuilder = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(dockerImage) - .containerName(containerName) .nodeState(nodeState) .nodeType("tenant") .nodeFlavor("docker") @@ -376,7 +361,7 @@ public class NodeAgentImplTest { boolean shouldBeRunning = nodeState != Node.State.dirty && nodeState != Node.State.provisioned; when(nodeRepository.getContainerNodeSpec(hostName)).thenReturn(Optional.of(nodeSpec)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, dockerImage, containerName, @@ -388,7 +373,6 @@ public class NodeAgentImplTest { private void nodeRunningContainerIsTakenDownAndCleanedAndRecycled(Node.State nodeState, Optional<Long> wantedRestartGeneration) throws Exception { final ContainerNodeSpec nodeSpec = makeContainer(nodeState, wantedRestartGeneration); - final ContainerName containerName = nodeSpec.containerName; nodeAgent.tick(); @@ -398,7 +382,7 @@ public class NodeAgentImplTest { inOrder.verify(storageMaintainer, times(1)).archiveNodeData(eq(containerName)); inOrder.verify(nodeRepository, times(1)).markAsReady(eq(hostName)); - verify(dockerOperations, never()).startContainerIfNeeded(any()); + verify(dockerOperations, never()).startContainerIfNeeded(eq(containerName), any()); verify(orchestrator, never()).resume(any(String.class)); // current Docker image and vespa version should be cleared verify(nodeRepository, times(1)).updateNodeAttributes( @@ -429,13 +413,10 @@ public class NodeAgentImplTest { @Test public void resumeProgramRunsUntilSuccess() throws Exception { final long restartGeneration = 1; - final String hostName = "hostname"; final DockerImage wantedDockerImage = new DockerImage("wantedDockerImage"); - final ContainerName containerName = new ContainerName("container-name"); final ContainerNodeSpec nodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) .wantedDockerImage(wantedDockerImage) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") @@ -448,7 +429,7 @@ public class NodeAgentImplTest { Docker.ContainerStats containerStats = new ContainerStatsImpl(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>()); when(dockerOperations.getContainerStats(any())).thenReturn(Optional.of(containerStats)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, wantedDockerImage, containerName, Container.State.RUNNING, 1))); when(nodeRepository.getContainerNodeSpec(eq(hostName))).thenReturn(Optional.of(nodeSpec)); when(dockerOperations.shouldScheduleDownloadOfImage(eq(wantedDockerImage))).thenReturn(false); @@ -493,10 +474,9 @@ public class NodeAgentImplTest { Map<String, Object> blkio_stats = (Map<String, Object>) dockerStats.get("blkio_stats"); Docker.ContainerStats stats = new ContainerStatsImpl(networks, cpu_stats, memory_stats, blkio_stats); - final ContainerName containerName = new ContainerName("cont-name"); when(dockerOperations.getContainerStats(eq(containerName))).thenReturn(Optional.of(stats)); - when(dockerOperations.getContainer(eq(hostName))).thenReturn( + when(dockerOperations.getContainer(eq(containerName))).thenReturn( Optional.of(new Container(hostName, new DockerImage("wantedDockerImage"), containerName, Container.State.RUNNING, 1))); nodeAgent.vespaVersion = Optional.of("1.2.3"); @@ -504,7 +484,6 @@ public class NodeAgentImplTest { ContainerNodeSpec.Membership membership = new ContainerNodeSpec.Membership("clustType", "clustId", "grp", 3, false); nodeAgent.lastNodeSpec = new ContainerNodeSpec.Builder() .hostname(hostName) - .containerName(containerName) .nodeState(Node.State.active) .nodeType("tenant") .nodeFlavor("docker") diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java index 3fa8d70bfdb..7670c5c14b0 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java @@ -6,7 +6,6 @@ import com.google.common.collect.Sets; import com.yahoo.application.Networking; import com.yahoo.application.container.JDisc; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; -import com.yahoo.vespa.hosted.dockerapi.ContainerName; import com.yahoo.vespa.hosted.dockerapi.DockerImage; import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAttributes; import com.yahoo.vespa.hosted.provision.Node; @@ -91,7 +90,6 @@ public class NodeRepositoryImplTest { final ContainerNodeSpec nodeSpec = containersToRun.get(0); assertThat(nodeSpec.hostname, is("host4.yahoo.com")); assertThat(nodeSpec.wantedDockerImage.get(), is(new DockerImage("image-123"))); - assertThat(nodeSpec.containerName, is(new ContainerName("host4"))); assertThat(nodeSpec.nodeState, is(Node.State.reserved)); assertThat(nodeSpec.wantedRestartGeneration.get(), is(0L)); assertThat(nodeSpec.currentRestartGeneration.get(), is(0L)); @@ -108,7 +106,6 @@ public class NodeRepositoryImplTest { Optional<ContainerNodeSpec> nodeSpec = nodeRepositoryApi.getContainerNodeSpec(hostname); assertThat(nodeSpec.isPresent(), is(true)); assertThat(nodeSpec.get().hostname, is(hostname)); - assertThat(nodeSpec.get().containerName, is(new ContainerName("host4"))); } @Test diff --git a/node-admin/src/test/resources/docker.stats.metrics.expected.json b/node-admin/src/test/resources/docker.stats.metrics.expected.json index a4b3c921334..0845f5acb82 100644 --- a/node-admin/src/test/resources/docker.stats.metrics.expected.json +++ b/node-admin/src/test/resources/docker.stats.metrics.expected.json @@ -11,7 +11,7 @@ "role": "tenants", "tenantName": "tester", "zone": "dev.us-east-1", - "host": "hostname", + "host": "host1.test.yahoo.com", "vespaVersion": "1.2.3", "state": "active", "clusterid": "clustId", @@ -39,7 +39,7 @@ "clustertype":"clustType", "role":"tenants", "tenantName":"tester", - "host":"hostname", + "host":"host1.test.yahoo.com", "vespaVersion":"1.2.3", "state":"active", "clusterid":"clustId", @@ -68,7 +68,7 @@ "clustertype":"clustType", "role":"tenants", "tenantName":"tester", - "host":"hostname", + "host":"host1.test.yahoo.com", "vespaVersion":"1.2.3", "state":"active", "clusterid":"clustId", @@ -99,7 +99,7 @@ "clustertype":"clustType", "role":"tenants", "tenantName":"tester", - "host":"hostname", + "host":"host1.test.yahoo.com", "vespaVersion":"1.2.3", "state":"active", "clusterid":"clustId", |