diff options
author | Håkon Hallingstad <hakon@oath.com> | 2018-01-09 17:31:36 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@oath.com> | 2018-01-09 17:31:36 +0100 |
commit | 2ca74fa13d78ae20cb42b0b8985cce877eaec210 (patch) | |
tree | 4bf36385b556d4c31f497dbf36574edf6c657ff2 | |
parent | 08a484cbdeb14130e39eb61c315b7a5da4171e9b (diff) |
Delegate to other components if specified
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(); } |