aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--node-admin/.gitignore1
-rw-r--r--node-admin/README.md5
-rw-r--r--node-admin/node-admin-zone-app/services.xml23
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/LocalZoneUtils.java14
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/docker/RunVespaLocal.java30
5 files changed, 58 insertions, 15 deletions
diff --git a/node-admin/.gitignore b/node-admin/.gitignore
index 67b21d2d89c..142e494f4ca 100644
--- a/node-admin/.gitignore
+++ b/node-admin/.gitignore
@@ -1 +1,2 @@
include/Dockerfile
+node-admin-zone-app/components
diff --git a/node-admin/README.md b/node-admin/README.md
index 7b3e9805d21..638f2e2632a 100644
--- a/node-admin/README.md
+++ b/node-admin/README.md
@@ -32,9 +32,10 @@ implements all of the basic methods you need to get started.
To start a local zone, simply run:
```
DockerImage vespaDockerBase = new DockerImage("docker-registry.ops.yahoo.com:4443/vespa/ci:6.53.134");
+ Path pathToVespaRoot = Paths.get("/home/valerijf/dev/vespa");
Path pathToContainerStorage = Paths.get("/home/docker/container-storage");
-
- RunVespaLocal runVespaLocal = new RunVespaLocal();
+
+ RunVespaLocal runVespaLocal = new RunVespaLocal(pathToVespaRoot);
runVespaLocal.buildVespaLocalImage(vespaDockerBase);
runVespaLocal.startLocalZoneWithNodes(5);
runVespaLocal.startNodeAdminAsContainer(pathToContainerStorage);
diff --git a/node-admin/node-admin-zone-app/services.xml b/node-admin/node-admin-zone-app/services.xml
new file mode 100644
index 00000000000..2538778e8b3
--- /dev/null
+++ b/node-admin/node-admin-zone-app/services.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<services version="1.0" application-type="hosted-infrastructure" xmlns:deploy="vespa" xmlns:preprocess="properties">
+
+ <jdisc id="node-admin" jetty="true" version="1.0">
+ <handler id="com.yahoo.vespa.hosted.node.admin.restapi.RestApiHandler" bundle="node-admin">
+ <binding>http://*/rest/*</binding>
+ </handler>
+ <component id="node-admin" class="com.yahoo.vespa.hosted.node.admin.provider.ComponentsProviderImpl" bundle="node-admin"/>
+ <component id="docker-api" class="com.yahoo.vespa.hosted.dockerapi.DockerImpl" bundle="docker-api"/>
+ <component id="metrics-wrapper" class="com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper" bundle="docker-api"/>
+
+ <config name='vespa.hosted.dockerapi.docker'>
+ <isRunningLocally>true</isRunningLocally>
+ </config>
+
+ <config name='vespa.hosted.node.admin.node-admin'>
+ <isRunningLocally>true</isRunningLocally>
+ </config>
+
+ <nodes jvmargs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:5555 -Dvespa.freezedetector.disable=true" type="host"/>
+ </jdisc>
+
+</services>
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 80e0b23b55b..f972c4c09f5 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
@@ -94,7 +94,11 @@ public class LocalZoneUtils {
.withVolume(pathToContainerStorage.toString(), "/host" + pathToContainerStorage.toString())
.withEnvironment("ENVIRONMENT", environment.getEnvironment())
.withEnvironment("REGION", environment.getRegion())
- .withEnvironment("CONFIG_SERVER_ADDRESS", CONFIG_SERVER_HOSTNAME);
+ .withEnvironment("CONFIG_SERVER_ADDRESS", CONFIG_SERVER_HOSTNAME)
+ .withEnvironment("ATHENS_DOMAIN", "fake.env")
+ .withUlimit("nofile", 262_144, 262_144)
+ .withUlimit("nproc", 32_768, 409_600)
+ .withUlimit("core", -1, -1);
if (DockerTestUtils.getSystemOS() == DockerTestUtils.OS.Mac_OS_X) {
createCmd.withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME);
@@ -134,6 +138,7 @@ public class LocalZoneUtils {
createCmd.create();
docker.startContainer(NODE_ADMIN_CONTAINER_NAME);
+ docker.executeInContainerAsRoot(NODE_ADMIN_CONTAINER_NAME, "chown", "yahoo", "/host/var/run/docker.sock");
}
public static void buildVespaLocalDockerImage(Docker docker, DockerImage vespaBaseImage) throws IOException {
@@ -216,9 +221,8 @@ public class LocalZoneUtils {
}
public static void deployApp(Docker docker, Path pathToApp, String tenantName, String applicationName) {
- Path pathToAppOnConfigServer = Paths.get("/tmp");
- docker.copyArchiveToContainer(pathToApp.toAbsolutePath().toString(),
- CONFIG_SERVER_CONTAINER_NAME, pathToAppOnConfigServer.toString());
+ Path pathToAppOnConfigServer = Paths.get("/tmp").resolve(pathToApp.getFileName());
+ docker.copyArchiveToContainer(pathToApp.toString(), CONFIG_SERVER_CONTAINER_NAME, pathToAppOnConfigServer.getParent().toString() + "/");
try { // Add tenant, ignore exception if tenant already exists
requestExecutor.put("/application/v2/tenant/" + tenantName, CONFIG_SERVER_WEB_SERVICE_PORT, Optional.empty(), Map.class);
@@ -230,7 +234,7 @@ public class LocalZoneUtils {
System.out.println("prepare " + applicationName);
final String deployPath = Defaults.getDefaults().underVespaHome("bin/deploy");
ProcessResult copyProcess = docker.executeInContainer(CONFIG_SERVER_CONTAINER_NAME, deployPath, "-e",
- tenantName, "-a", applicationName, "prepare", pathToAppOnConfigServer.resolve(pathToApp.getFileName()).toString());
+ tenantName, "-a", applicationName, "prepare", pathToAppOnConfigServer.toString());
if (! copyProcess.isSuccess()) {
throw new RuntimeException("Could not prepare " + pathToApp + " on " + CONFIG_SERVER_CONTAINER_NAME.asString() +
"\n" + copyProcess.getOutput() + "\n" + copyProcess.getErrors());
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 5bc72fb8953..58114cda78a 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
@@ -16,8 +16,9 @@ import com.yahoo.vespa.hosted.provision.Node;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.net.UnknownHostException;
+import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
import java.time.Duration;
import java.util.Set;
import java.util.concurrent.ExecutionException;
@@ -45,11 +46,13 @@ public class RunVespaLocal {
.parentHostHostname(HostName.getLocalhost())
.inetAddressResolver(new InetAddressResolver());
- private final Docker docker;
private final Logger logger = Logger.getLogger("RunVespaLocal");
+ private final Docker docker;
+ private final Path pathToVespaRoot;
- public RunVespaLocal() {
+ public RunVespaLocal(Path pathToVespaRoot) {
this.docker = DockerTestUtils.getDocker();
+ this.pathToVespaRoot = pathToVespaRoot;
}
/**
@@ -107,11 +110,10 @@ public class RunVespaLocal {
/**
* Starts node-admin inside a container
- * @param pathToNodeAdminApp Path to node-admin application.zip
* @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
*/
- public void startNodeAdminAsContainer(Path pathToNodeAdminApp, Path pathToContainerStorage) throws UnknownHostException {
+ public void startNodeAdminAsContainer(Path pathToContainerStorage) throws IOException {
logger.info("Starting node-admin");
String parentHostHostname = LocalZoneUtils.NODE_ADMIN_HOSTNAME;
LocalZoneUtils.startNodeAdminIfNeeded(docker, environmentBuilder.build(), pathToContainerStorage);
@@ -120,11 +122,23 @@ public class RunVespaLocal {
LocalZoneUtils.provisionHost(parentHostHostname);
LocalZoneUtils.getContainerNodeSpec(parentHostHostname)
.ifPresent(nodeSpec -> {
- if (nodeSpec.nodeState == Node.State.provisioned) LocalZoneUtils.setState(Node.State.dirty, nodeSpec.hostname);
- if (nodeSpec.nodeState == Node.State.dirty) LocalZoneUtils.setState(Node.State.ready, nodeSpec.hostname);
+ if (nodeSpec.nodeState == Node.State.provisioned) {
+ LocalZoneUtils.setState(Node.State.dirty, nodeSpec.hostname);
+ LocalZoneUtils.setState(Node.State.ready, nodeSpec.hostname);
+ }
});
logger.info("Deploying node-admin app");
+ Path pathToNodeAdminApp = pathToVespaRoot.resolve("node-admin/node-admin-zone-app");
+ Path pathToNodeAdminAppComponents = pathToNodeAdminApp.resolve("components");
+ Files.createDirectories(pathToNodeAdminAppComponents);
+ Path[] appComponents = {pathToVespaRoot.resolve("node-admin/target/node-admin-jar-with-dependencies.jar"),
+ pathToVespaRoot.resolve("docker-api/target/docker-api-jar-with-dependencies.jar")};
+
+ for (Path path : appComponents) {
+ Files.copy(path, pathToNodeAdminAppComponents.resolve(path.getFileName()), StandardCopyOption.REPLACE_EXISTING);
+ }
+
LocalZoneUtils.deployApp(docker, pathToNodeAdminApp, "vespa", "node-admin");
logger.info("Waiting for node-admin to serve");
@@ -149,7 +163,7 @@ public class RunVespaLocal {
Set<String> containers = LocalZoneUtils.getContainersForApp();
try {
URL nodeUrl = new URL("http://" + containers.iterator().next() + ":" + System.getenv("VESPA_WEB_SERVICE_PORT") + "/");
- assertTrue(LocalZoneUtils.isReachableURL(nodeUrl, Duration.ofSeconds(120)));
+ assertTrue(LocalZoneUtils.isReachableURL(nodeUrl, Duration.ofMinutes(3)));
logger.info("Endpoint " + nodeUrl + " is now ready");
} catch (MalformedURLException e) {
e.printStackTrace();