summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@oath.com>2018-01-09 17:31:36 +0100
committerHåkon Hallingstad <hakon@oath.com>2018-01-09 17:31:36 +0100
commit2ca74fa13d78ae20cb42b0b8985cce877eaec210 (patch)
tree4bf36385b556d4c31f497dbf36574edf6c657ff2
parent08a484cbdeb14130e39eb61c315b7a5da4171e9b (diff)
Delegate to other components if specified
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminConfig.java10
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java85
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java7
3 files changed, 70 insertions, 32 deletions
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 d9726c88e4c..0be31ffdbae 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
@@ -7,13 +7,19 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
-import java.util.logging.Logger;
+import java.util.ArrayList;
+import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true)
public class NodeAdminConfig {
- private static final Logger logger = Logger.getLogger(NodeAdminConfig.class.getName());
private static final ObjectMapper mapper = new ObjectMapper();
+ /**
+ * A list of components to enable instead of the default.
+ */
+ @JsonProperty("components")
+ public List<String> components = new ArrayList<>();
+
public enum Mode {
aws_tenant,
config_server_host,
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 f5f2deb8dcb..4c4f8369bc6 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
@@ -1,13 +1,21 @@
// Copyright 2017 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.yahoo.component.ComponentId;
+import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.concurrent.classlock.ClassLocking;
+import com.yahoo.log.LogLevel;
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.component.AdminComponent;
import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
/**
* NodeAdminMain is the main component of the node admin JDisc application:
@@ -19,52 +27,73 @@ import java.util.Optional;
* be fatal: the node admin may not have installed and started the docker daemon.
*/
public class NodeAdminMain implements AutoCloseable {
+ private static final Logger logger = Logger.getLogger(NodeAdminMain.class.getName());
+
+ private final ComponentRegistry<AdminComponent> adminRegistry;
private final Docker docker;
private final MetricReceiverWrapper metricReceiver;
private final ClassLocking classLocking;
+ private List<AdminComponent> enabledComponents = new ArrayList<>();
+
private Optional<DockerAdminComponent> dockerAdmin = Optional.empty();
- public NodeAdminMain(Docker docker,
+ public NodeAdminMain(ComponentRegistry<AdminComponent> adminRegistry,
+ Docker docker,
MetricReceiverWrapper metricReceiver,
ClassLocking classLocking) {
+ this.adminRegistry = adminRegistry;
this.docker = docker;
this.metricReceiver = metricReceiver;
this.classLocking = classLocking;
}
- @Override
- public void close() {
- dockerAdmin.ifPresent(DockerAdminComponent::disable);
+ public static NodeAdminConfig getConfig() {
+ String path = Defaults.getDefaults().underVespaHome("conf/node-admin.json");
+ return NodeAdminConfig.fromFile(new File(path));
}
- public NodeAdminStateUpdater getNodeAdminStateUpdater() {
- return dockerAdmin.get().getNodeAdminStateUpdater();
+ public void start() {
+ NodeAdminConfig config = getConfig();
+
+ if (config.components.isEmpty()) {
+ enable(new DockerAdminComponent(config, docker, metricReceiver, classLocking));
+ } else {
+ logger.log(LogLevel.INFO, () -> {
+ String registeredComponentsList = adminRegistry
+ .allComponentsById().keySet().stream()
+ .map(ComponentId::stringValue)
+ .collect(Collectors.joining(", "));
+
+ String requestedComponentsList = config.components.stream()
+ .collect(Collectors.joining(", "));
+
+ return String.format(
+ "Components registered = '%s', enabled = '%s'",
+ registeredComponentsList,
+ requestedComponentsList);
+ });
+
+ for (String componentSpecificationString : config.components) {
+ enable(adminRegistry.getComponent(componentSpecificationString));
+ }
+ }
}
- public void start() {
- String staticConfigPath = Defaults.getDefaults().underVespaHome("conf/node-admin.json");
- NodeAdminConfig config = NodeAdminConfig.fromFile(new File(staticConfigPath));
-
- switch (config.mode) {
- case aws_tenant:
- case tenant:
- 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.
- return;
+ private void enable(AdminComponent component) {
+ component.enable();
+ enabledComponents.add(component);
+ }
+
+ @Override
+ public void close() {
+ int i = enabledComponents.size();
+ while (i --> 0) {
+ enabledComponents.remove(i).disable();
}
+ }
- throw new IllegalStateException("Unknown bootstrap mode: " + config.mode.name());
+ public NodeAdminStateUpdater getNodeAdminStateUpdater() {
+ return dockerAdmin.get().getNodeAdminStateUpdater();
}
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java
index ea9b38efa26..4543e4f62c0 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java
@@ -2,10 +2,12 @@
package com.yahoo.vespa.hosted.node.admin.provider;
import com.google.inject.Inject;
+import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.concurrent.classlock.ClassLocking;
import com.yahoo.container.di.componentgraph.Provider;
import com.yahoo.vespa.hosted.dockerapi.Docker;
import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper;
+import com.yahoo.vespa.hosted.node.admin.component.AdminComponent;
import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminMain;
import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater;
@@ -13,10 +15,11 @@ public class NodeAdminProvider implements Provider<NodeAdminStateUpdater> {
private final NodeAdminMain nodeAdminMain;
@Inject
- public NodeAdminProvider(Docker docker,
+ public NodeAdminProvider(ComponentRegistry<AdminComponent> adminRegistry,
+ Docker docker,
MetricReceiverWrapper metricReceiver,
ClassLocking classLocking) {
- nodeAdminMain = new NodeAdminMain(docker, metricReceiver, classLocking);
+ nodeAdminMain = new NodeAdminMain(adminRegistry, docker, metricReceiver, classLocking);
nodeAdminMain.start();
}