summaryrefslogtreecommitdiffstats
path: root/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java100
1 files changed, 100 insertions, 0 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java
new file mode 100644
index 00000000000..988819aae2d
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java
@@ -0,0 +1,100 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision;
+
+import com.yahoo.slime.ArrayTraverser;
+import com.yahoo.slime.Cursor;
+import com.yahoo.slime.Inspector;
+import com.yahoo.slime.Slime;
+import com.yahoo.vespa.config.SlimeUtils;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Logger;
+
+/**
+ * Information about provisioned hosts, and (de)serialization (from)to JSON.
+ *
+ * @author lulf
+ * @since 5.12
+ */
+public class ProvisionInfo {
+
+ private static final String mappingKey = "mapping";
+ private static final String hostSpecKey = "hostSpec";
+ private static final String hostSpecHostName = "hostName";
+ private static final String hostSpecMembership = "membership";
+ private static final String dockerImage = "dockerImage";
+
+ private final Set<HostSpec> hosts = new LinkedHashSet<>();
+
+ private ProvisionInfo(Set<HostSpec> hosts) {
+ this.hosts.addAll(hosts);
+ }
+
+ public static ProvisionInfo withHosts(Set<HostSpec> hosts) {
+ return new ProvisionInfo(hosts);
+ }
+
+ private void toSlime(Cursor cursor) {
+ Cursor array = cursor.setArray(mappingKey);
+ for (HostSpec host : hosts) {
+ Cursor object = array.addObject();
+ serializeHostSpec(object.setObject(hostSpecKey), host);
+ }
+ }
+
+ private void serializeHostSpec(Cursor cursor, HostSpec host) {
+ cursor.setString(hostSpecHostName, host.hostname());
+ if (host.membership().isPresent()) {
+ cursor.setString(hostSpecMembership, host.membership().get().stringValue());
+ if (host.membership().get().cluster().dockerImage().isPresent())
+ cursor.setString(dockerImage, host.membership().get().cluster().dockerImage().get());
+ }
+ }
+
+ public Set<HostSpec> getHosts() {
+ return Collections.unmodifiableSet(hosts);
+ }
+
+ private static ProvisionInfo fromSlime(Inspector inspector) {
+ Inspector array = inspector.field(mappingKey);
+ final Set<HostSpec> hosts = new LinkedHashSet<>();
+ array.traverse(new ArrayTraverser() {
+ @Override
+ public void entry(int i, Inspector inspector) {
+ hosts.add(createHostSpec(inspector.field(hostSpecKey)));
+ }
+ });
+ return new ProvisionInfo(hosts);
+ }
+
+ private static HostSpec createHostSpec(Inspector object) {
+ Optional<ClusterMembership> membership =
+ object.field(hostSpecMembership).valid() ? Optional.of(readMembership(object)) : Optional.empty();
+ HostSpec h = new HostSpec(object.field(hostSpecHostName).asString(), Collections.<String>emptyList(), membership);
+ return h;
+ }
+
+ private static ClusterMembership readMembership(Inspector object) {
+ return ClusterMembership.from(object.field(hostSpecMembership).asString(),
+ object.field(dockerImage).valid() ? Optional.of(object.field(dockerImage).asString()) : Optional.empty());
+ }
+
+ public byte[] toJson() throws IOException {
+ Slime slime = new Slime();
+ toSlime(slime.setObject());
+ return SlimeUtils.toJsonBytes(slime);
+ }
+
+ public static ProvisionInfo fromJson(byte[] json) {
+ return fromSlime(SlimeUtils.jsonToSlime(json).get());
+ }
+
+ public ProvisionInfo merge(ProvisionInfo provisionInfo) {
+ Set<HostSpec> mergedSet = new LinkedHashSet<>();
+ mergedSet.addAll(this.hosts);
+ mergedSet.addAll(provisionInfo.getHosts());
+ return ProvisionInfo.withHosts(mergedSet);
+ }
+
+}