From 3993c44146615752132084387209417cea4d8ec3 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 6 May 2020 12:50:34 +0200 Subject: Propagate cluster info --- .../api/integration/configserver/Application.java | 35 ++++++++++++++++ .../api/integration/configserver/Cluster.java | 47 ++++++++++++++++++++++ .../integration/configserver/NodeRepository.java | 2 + .../noderepository/ApplicationData.java | 30 ++++++++++++++ .../integration/noderepository/ClusterData.java | 39 ++++++++++++++++++ .../noderepository/ClusterResourcesData.java | 29 +++++++++++++ .../integration/noderepository/NodeResources.java | 24 +++++++++++ .../noderepository/ProvisionResource.java | 5 ++- .../hosted/controller/api/role/PathGroup.java | 2 + 9 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java create mode 100644 controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java create mode 100644 controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationData.java create mode 100644 controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java create mode 100644 controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java (limited to 'controller-api') 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 clusters; + + public Application(ApplicationId id, Collection clusters) { + this.id = id; + this.clusters = clusters.stream().collect(Collectors.toMap(c -> c.id(), c -> c)); + } + + public ApplicationId id() { return id; } + + public Map 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 target; + private Optional suggested; + + public Cluster(ClusterSpec.Id id, + ClusterResources min, + ClusterResources max, + ClusterResources current, + Optional target, + Optional 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 target() { return target; } + public Optional 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 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/{*}", -- cgit v1.2.3