summaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-05-06 12:50:34 +0200
committerJon Bratseth <bratseth@gmail.com>2020-05-06 12:50:34 +0200
commit3993c44146615752132084387209417cea4d8ec3 (patch)
tree181ba81b3f0e044a8352005f42d6b20e03708699 /controller-api
parenta2e37ad30ec60c4ac7c785176aee2e9fb12aa0b5 (diff)
Propagate cluster info
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java35
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java47
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java2
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationData.java30
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java39
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java29
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeResources.java24
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ProvisionResource.java5
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java2
9 files changed, 212 insertions, 1 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java
new file mode 100644
index 00000000000..3df967f85b9
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java
@@ -0,0 +1,35 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.api.integration.configserver;
+
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.ClusterSpec;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * The client-side version of the node repository's view of applications
+ *
+ * @author bratseth
+ */
+public class Application {
+
+ private ApplicationId id;
+ private Map<ClusterSpec.Id, Cluster> clusters;
+
+ public Application(ApplicationId id, Collection<Cluster> clusters) {
+ this.id = id;
+ this.clusters = clusters.stream().collect(Collectors.toMap(c -> c.id(), c -> c));
+ }
+
+ public ApplicationId id() { return id; }
+
+ public Map<ClusterSpec.Id, Cluster> clusters() { return clusters; }
+
+ @Override
+ public String toString() {
+ return "application '" + id + "'";
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java
new file mode 100644
index 00000000000..b418ae2eac8
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java
@@ -0,0 +1,47 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.api.integration.configserver;
+
+import com.yahoo.config.provision.ClusterResources;
+import com.yahoo.config.provision.ClusterSpec;
+
+import java.util.Optional;
+
+/**
+ * @author bratseth
+ */
+public class Cluster {
+
+ private ClusterSpec.Id id;
+ private ClusterResources min;
+ private ClusterResources max;
+ private ClusterResources current;
+ private Optional<ClusterResources> target;
+ private Optional<ClusterResources> suggested;
+
+ public Cluster(ClusterSpec.Id id,
+ ClusterResources min,
+ ClusterResources max,
+ ClusterResources current,
+ Optional<ClusterResources> target,
+ Optional<ClusterResources> suggested) {
+ this.id = id;
+ this.min = min;
+ this.max = max;
+ this.current = current;
+ this.target = target;
+ this.suggested = suggested;
+ }
+
+ public ClusterSpec.Id id() { return id; }
+ public ClusterResources min() { return min; }
+ public ClusterResources max() { return max; }
+ public ClusterResources current() { return current; }
+ public Optional<ClusterResources> target() { return target; }
+ public Optional<ClusterResources> suggested() { return suggested; }
+
+ @Override
+ public String toString() {
+ return "cluster '" + id + "'";
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java
index c5a016d53c8..b5d49df7e9c 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java
@@ -70,6 +70,8 @@ public interface NodeRepository {
.collect(Collectors.toList());
}
+ Application getApplication(ZoneId zone, ApplicationId application);
+
/** Upgrade all nodes of given type to a new version */
void upgrade(ZoneId zone, NodeType type, Version version);
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationData.java
new file mode 100644
index 00000000000..1fc6d7f898a
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationData.java
@@ -0,0 +1,30 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.api.integration.noderepository;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Application;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author bratseth
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ApplicationData {
+
+ @JsonProperty
+ public String id;
+ @JsonProperty
+ public Map<String, ClusterData> clusters;
+
+ public Application toApplication() {
+ return new Application(ApplicationId.fromFullString(id),
+ clusters.entrySet().stream().map(e -> e.getValue().toCluster(e.getKey())).collect(Collectors.toList()));
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java
new file mode 100644
index 00000000000..298928a881d
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java
@@ -0,0 +1,39 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.api.integration.noderepository;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yahoo.config.provision.ClusterSpec;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster;
+
+import java.util.Optional;
+
+/**
+ * @author bratseth
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ClusterData {
+
+ @JsonProperty("min")
+ public ClusterResourcesData min;
+ @JsonProperty("max")
+ public ClusterResourcesData max;
+ @JsonProperty("current")
+ public ClusterResourcesData current;
+ @JsonProperty("suggested")
+ public ClusterResourcesData suggested;
+ @JsonProperty("target")
+ public ClusterResourcesData target;
+
+ public Cluster toCluster(String id) {
+ return new Cluster(ClusterSpec.Id.from(id),
+ min.toClusterResources(),
+ max.toClusterResources(),
+ current.toClusterResources(),
+ target == null ? Optional.empty() : Optional.of(target.toClusterResources()),
+ suggested == null ? Optional.empty() : Optional.of(suggested.toClusterResources()));
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java
new file mode 100644
index 00000000000..571af2a80c0
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java
@@ -0,0 +1,29 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.api.integration.noderepository;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yahoo.config.provision.ClusterResources;
+
+import java.util.Optional;
+
+/**
+ * @author bratseth
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ClusterResourcesData {
+
+ @JsonProperty
+ public int nodes;
+ @JsonProperty
+ public int groups;
+ @JsonProperty
+ public NodeResources resources;
+
+ public ClusterResources toClusterResources() {
+ return new ClusterResources(nodes, groups, resources.toNodeResources());
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeResources.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeResources.java
index ded61c7a94e..b46412376c7 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeResources.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeResources.java
@@ -73,6 +73,30 @@ public class NodeResources {
this.storageType = storageType;
}
+ public com.yahoo.config.provision.NodeResources toNodeResources() {
+ return new com.yahoo.config.provision.NodeResources(vcpu, memoryGb, diskGb, bandwidthGbps,
+ toDiskSpeed(diskSpeed),
+ toStorageType(storageType));
+ }
+
+ private com.yahoo.config.provision.NodeResources.DiskSpeed toDiskSpeed(String diskSpeed) {
+ switch (diskSpeed) {
+ case "fast" : return com.yahoo.config.provision.NodeResources.DiskSpeed.fast;
+ case "slow" : return com.yahoo.config.provision.NodeResources.DiskSpeed.slow;
+ case "any" : return com.yahoo.config.provision.NodeResources.DiskSpeed.any;
+ default : throw new IllegalArgumentException("Unknown disk speed '" + diskSpeed + "'");
+ }
+ }
+
+ private com.yahoo.config.provision.NodeResources.StorageType toStorageType(String storageType) {
+ switch (storageType) {
+ case "remote" : return com.yahoo.config.provision.NodeResources.StorageType.remote;
+ case "local" : return com.yahoo.config.provision.NodeResources.StorageType.local;
+ case "any" : return com.yahoo.config.provision.NodeResources.StorageType.any;
+ default : throw new IllegalArgumentException("Unknown storage type '" + storageType + "'");
+ }
+ }
+
@Override
public String toString() {
return "NodeResources{" +
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ProvisionResource.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ProvisionResource.java
index 5eeb1f7401e..97720adbcc6 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ProvisionResource.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ProvisionResource.java
@@ -53,11 +53,14 @@ public interface ProvisionResource {
NodeList listNodes(@QueryParam("recursive") boolean recursive,
@QueryParam("hostname") String hostnamesString);
- @GET
@Path("/node/")
NodeList listNodesWithParent(@QueryParam("recursive") boolean recursive,
@QueryParam("parentHost") String parentHostname);
+ @GET
+ @Path("/application/{application}")
+ ApplicationData getApplication(@PathParam("application") String applicationId);
+
@PUT
@Path("/state/{state}/{hostname}")
String setState(@PathParam("state") NodeState state, @PathParam("hostname") String hostname);
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
index 80de7f802b6..2ed4c057dfd 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
@@ -107,11 +107,13 @@ enum PathGroup {
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/deploying/{*}",
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/job/{*}",
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/environment/{environment}/region/{region}/nodes",
+ "/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/environment/{environment}/region/{region}/clusters",
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/environment/{environment}/region/{region}/logs",
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/environment/{environment}/region/{region}/suspended",
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/environment/{environment}/region/{region}/service/{*}",
"/application/v4/tenant/{tenant}/application/{application}/instance/{ignored}/environment/{environment}/region/{region}/global-rotation/{*}",
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{ignored}/nodes",
+ "/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{ignored}/clusters",
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{ignored}/logs",
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{ignored}/suspended",
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{ignored}/service/{*}",