diff options
8 files changed, 53 insertions, 89 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminComponent.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminComponent.java index 928bf17db6e..5d8fed67682 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminComponent.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminComponent.java @@ -14,7 +14,10 @@ import com.yahoo.vespa.hosted.node.admin.maintenance.acl.AclMaintainer; 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.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.OrchestratorImpl; +import com.yahoo.vespa.hosted.node.admin.util.ConfigServerHttpRequestExecutor; import com.yahoo.vespa.hosted.node.admin.util.Environment; import java.time.Clock; @@ -29,23 +32,18 @@ public class DockerAdminComponent implements AdminComponent { private static final Duration NODE_AGENT_SCAN_INTERVAL = Duration.ofSeconds(30); private static final Duration NODE_ADMIN_CONVERGE_STATE_INTERVAL = Duration.ofSeconds(30); - private final Environment environment; - private final NodeRepository nodeRepository; - private final Orchestrator orchestrator; + private final NodeAdminConfig config; private final Docker docker; private final MetricReceiverWrapper metricReceiver; private final ClassLocking classLocking; + private Optional<NodeAdminStateUpdater> nodeAdminStateUpdater = Optional.empty(); - public DockerAdminComponent(Environment environment, - NodeRepository nodeRepository, - Orchestrator orchestrator, + public DockerAdminComponent(NodeAdminConfig config, Docker docker, MetricReceiverWrapper metricReceiver, ClassLocking classLocking) { - this.environment = environment; - this.nodeRepository = nodeRepository; - this.orchestrator = orchestrator; + this.config = config; this.docker = docker; this.metricReceiver = metricReceiver; this.classLocking = classLocking; @@ -57,6 +55,13 @@ public class DockerAdminComponent implements AdminComponent { return; } + + Environment environment = new Environment(); + ConfigServerHttpRequestExecutor requestExecutor = + ConfigServerHttpRequestExecutor.create(environment.getConfigServerUris()); + NodeRepository nodeRepository = new NodeRepositoryImpl(requestExecutor); + Orchestrator orchestrator = new OrchestratorImpl(requestExecutor); + Clock clock = Clock.systemUTC(); String dockerHostHostName = HostName.getLocalhost(); ProcessExecuter processExecuter = new ProcessExecuter(); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminConfig.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminConfig.java new file mode 100644 index 00000000000..d1aaefab3dd --- /dev/null +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/DockerAdminConfig.java @@ -0,0 +1,9 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.vespa.hosted.node.admin.nodeadmin; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class DockerAdminConfig { +} diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminConfig.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminConfig.java index 9caf1307aa4..d9726c88e4c 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminConfig.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminConfig.java @@ -14,14 +14,18 @@ public class NodeAdminConfig { private static final Logger logger = Logger.getLogger(NodeAdminConfig.class.getName()); private static final ObjectMapper mapper = new ObjectMapper(); - enum Mode { + public enum Mode { + aws_tenant, + config_server_host, tenant, - config_server_host } @JsonProperty("mode") public Mode mode = Mode.tenant; + @JsonProperty("docker") + public DockerAdminConfig docker = new DockerAdminConfig(); + public static NodeAdminConfig fromFile(File file) { if (!file.exists()) { return new NodeAdminConfig(); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java index 58358efff33..f5f2deb8dcb 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java @@ -5,14 +5,9 @@ import com.yahoo.concurrent.classlock.ClassLocking; import com.yahoo.vespa.defaults.Defaults; import com.yahoo.vespa.hosted.dockerapi.Docker; import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; -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.OrchestratorImpl; -import com.yahoo.vespa.hosted.node.admin.util.ConfigServerHttpRequestExecutor; -import com.yahoo.vespa.hosted.node.admin.util.Environment; import java.io.File; +import java.util.Optional; /** * NodeAdminMain is the main component of the node admin JDisc application: @@ -24,34 +19,27 @@ import java.io.File; * be fatal: the node admin may not have installed and started the docker daemon. */ public class NodeAdminMain implements AutoCloseable { - private final DockerAdminComponent dockerAdmin; + private final Docker docker; + private final MetricReceiverWrapper metricReceiver; + private final ClassLocking classLocking; + + private Optional<DockerAdminComponent> dockerAdmin = Optional.empty(); public NodeAdminMain(Docker docker, MetricReceiverWrapper metricReceiver, ClassLocking classLocking) { - Environment environment = new Environment(); - ConfigServerHttpRequestExecutor requestExecutor = - ConfigServerHttpRequestExecutor.create(environment.getConfigServerUris()); - - NodeRepository nodeRepository = new NodeRepositoryImpl(requestExecutor); - Orchestrator orchestrator = new OrchestratorImpl(requestExecutor); - - dockerAdmin = new DockerAdminComponent( - environment, - nodeRepository, - orchestrator, - docker, - metricReceiver, - classLocking); + this.docker = docker; + this.metricReceiver = metricReceiver; + this.classLocking = classLocking; } @Override public void close() { - dockerAdmin.disable(); + dockerAdmin.ifPresent(DockerAdminComponent::disable); } public NodeAdminStateUpdater getNodeAdminStateUpdater() { - return dockerAdmin.getNodeAdminStateUpdater(); + return dockerAdmin.get().getNodeAdminStateUpdater(); } public void start() { @@ -59,19 +47,24 @@ public class NodeAdminMain implements AutoCloseable { NodeAdminConfig config = NodeAdminConfig.fromFile(new File(staticConfigPath)); switch (config.mode) { + case aws_tenant: case tenant: - dockerAdmin.enable(); - break; + dockerAdmin = Optional.of(new DockerAdminComponent( + config, + docker, + metricReceiver, + classLocking)); + dockerAdmin.get().enable(); + return; case config_server_host: // TODO: // - install and start docker daemon // - Read config that specifies which containers to start how // - use thin static backends for node repo and orchestrator // - Start node admin state updater. - break; - default: - throw new IllegalStateException( - "Unknown bootstrap mode: " + config.mode.name()); + return; } + + throw new IllegalStateException("Unknown bootstrap mode: " + config.mode.name()); } } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/AddYumRepoTask.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/AddYumRepoTask.java index b3c85b8614e..48ed43f2920 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/AddYumRepoTask.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/AddYumRepoTask.java @@ -30,19 +30,13 @@ public class AddYumRepoTask implements Task { public AddYumRepoTask(Params params) { validateRepositoryId(params.repositoryId); this.params = params; - Task.validateVariant(variantName()); - } - - @Override - public String variantName() { - return params.repositoryId; } @Override public boolean execute(TaskContext context) { - Path path = Paths.get("/etc/yum.repos.d",params.repositoryId, ".repo"); + Path path = Paths.get("/etc/yum.repos.d",params.repositoryId + ".repo"); - if (path.toFile().exists()) { + if (context.getFileSystem().isRegularFile(path)) { return false; } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/MakeDirectoryTask.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/MakeDirectoryTask.java index c406cd13c22..cf0cb36d17a 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/MakeDirectoryTask.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/MakeDirectoryTask.java @@ -11,7 +11,6 @@ public class MakeDirectoryTask implements Task { MakeDirectoryTask(Path directory) { this.directory = directory; - validate(); } public MakeDirectoryTask withParents() { @@ -19,11 +18,6 @@ public class MakeDirectoryTask implements Task { return this; } - @Override - public String variantName() { - return directory.getFileName().toString(); - } - private boolean makeDirectory(FileSystem fileSystem, Path directory, boolean withParents) { diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/Task.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/Task.java index c630bbeb3e1..4d40ac02440 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/Task.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/Task.java @@ -3,26 +3,7 @@ package com.yahoo.vespa.hosted.node.admin.task; import com.yahoo.vespa.hosted.node.admin.io.FileSystem; -import java.util.regex.Pattern; - public interface Task { - /** - * If the task supports different variants, this method should be overridden - * to return something distinctive for this task instance. For instance a - * "WriteFileTask" that supports writing files at a 'path' could return - * the stem of the filename as the variantName(). variantName() must match - * NAME_PATTERN to ensure name is valid as key in various contexts. - */ - default String variantName() { return ""; } - - default void validate() { validateVariant(variantName()); } - static void validateVariant(String variant) { - Pattern variantPattern = Pattern.compile("^[a-zA-Z0-9_-]*$"); - if (!variantPattern.matcher(variant).matches()) { - throw new IllegalArgumentException("variantName '" + variant + "' is not a valid"); - } - } - interface TaskContext { FileSystem getFileSystem(); boolean executeSubtask(Task task); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/WriteFileTask.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/WriteFileTask.java index 694454e121a..8c56c2629f1 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/WriteFileTask.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/WriteFileTask.java @@ -44,22 +44,6 @@ public class WriteFileTask implements Task { public WriteFileTask(Params params) { this.params = params; - Task.validateVariant(variantName()); - } - - @Override - public String variantName() { - return filenameStem(params.path); - } - - static String filenameStem(Path path) { - String filename = path.getFileName().toString(); - int i = filename.indexOf('.'); - if (i >= 0) { - return filename.substring(0, i); - } else { - return filename; - } } @Override |