diff options
Diffstat (limited to 'node-admin')
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(); |