diff options
Diffstat (limited to 'node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java')
-rw-r--r-- | node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminMain.java | 77 |
1 files changed, 33 insertions, 44 deletions
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 4ee84d12b1d..3e9cb239890 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 @@ -10,11 +10,9 @@ import com.yahoo.vespa.hosted.dockerapi.Docker; import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; import com.yahoo.vespa.hosted.node.admin.ConfigServerConfig; import com.yahoo.vespa.hosted.node.admin.component.AdminComponent; +import com.yahoo.vespa.hosted.node.admin.provider.NodeAdminStateUpdater; 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; @@ -24,8 +22,8 @@ import java.util.stream.Collectors; * - It will "start" (only) the necessary components. * - Other components MUST NOT try to start (typically in constructor) since the features * they provide is NOT WANTED and possibly destructive, and/or the environment may be - * incompatible. For instance, trying to contact the Docker daemon too early will - * be fatal: the node admin may not have installed and started the docker daemon. + * incompatible. For instance, trying to contact the Docker daemon too early will 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()); @@ -36,9 +34,7 @@ public class NodeAdminMain implements AutoCloseable { private final MetricReceiverWrapper metricReceiver; private final ClassLocking classLocking; - private List<AdminComponent> enabledComponents = new ArrayList<>(); - - private Optional<DockerAdminComponent> dockerAdmin = Optional.empty(); + private AdminComponent mainAdminComponent = null; public NodeAdminMain(ComponentRegistry<AdminComponent> adminRegistry, ConfigServerConfig configServerConfig, @@ -59,53 +55,46 @@ public class NodeAdminMain implements AutoCloseable { public void start() { NodeAdminConfig config = getConfig(); + mainAdminComponent = selectAdminComponent(config); + mainAdminComponent.enable(); + } - if (config.components.isEmpty()) { - dockerAdmin = Optional.of(new DockerAdminComponent( - configServerConfig, config, docker, metricReceiver, classLocking)); - enable(dockerAdmin.get()); - } 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); - }); + private AdminComponent selectAdminComponent(NodeAdminConfig config) { + if (config.mainComponent == null) { + return new DockerAdminComponent(configServerConfig, config, docker, metricReceiver, classLocking); + } - for (String componentSpecificationString : config.components) { - AdminComponent component = - adminRegistry.getComponent(componentSpecificationString); - if (component == null) { - throw new IllegalArgumentException("There is no component named '" + - componentSpecificationString + "'"); - } - enable(component); - } + logger.log(LogLevel.INFO, () -> { + String registeredComponentsList = adminRegistry + .allComponentsById().keySet().stream() + .map(ComponentId::stringValue) + .collect(Collectors.joining(", ")); + + return String.format( + "Components registered = '%s', enabled = '%s'", + registeredComponentsList, + config.mainComponent); + }); + + AdminComponent component = adminRegistry.getComponent(config.mainComponent); + if (component == null) { + throw new IllegalArgumentException("There is no component named '" + + config.mainComponent + "'"); } - } - private void enable(AdminComponent component) { - component.enable(); - enabledComponents.add(component); + return component; } @Override public void close() { - int i = enabledComponents.size(); - while (i --> 0) { - enabledComponents.remove(i).disable(); + if (mainAdminComponent != null) { + mainAdminComponent.disable(); + mainAdminComponent = null; } } public NodeAdminStateUpdater getNodeAdminStateUpdater() { - return dockerAdmin.get().getNodeAdminStateUpdater(); + assert mainAdminComponent != null : "start() hasn't been called yet"; + return mainAdminComponent.getNodeAdminStateUpdater(); } } |