diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2020-03-25 14:49:50 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2020-03-25 14:49:50 +0100 |
commit | f2e14e9ac5e5ea2b05f7aa34bf21dc73b6d8e0eb (patch) | |
tree | 2704a33e1614e66b20e26151e9f50942add36e4c | |
parent | 668412faf939d3d3d185c6e7c81056c4cdb5afe3 (diff) |
Move group argument inside Capacity
43 files changed, 260 insertions, 685 deletions
diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json index 0c061dd8222..4ccf34d30b0 100644 --- a/config-model-api/abi-spec.json +++ b/config-model-api/abi-spec.json @@ -606,521 +606,5 @@ "public static final com.yahoo.config.application.api.ValidationOverrides empty", "public static final com.yahoo.config.application.api.ValidationOverrides all" ] - }, - "com.yahoo.config.model.api.ApplicationInfo": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(com.yahoo.config.provision.ApplicationId, long, com.yahoo.config.model.api.Model)", - "public com.yahoo.config.provision.ApplicationId getApplicationId()", - "public long getGeneration()", - "public com.yahoo.config.model.api.Model getModel()", - "public java.lang.String toString()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigChangeAction$Type": { - "superClass": "java.lang.Enum", - "interfaces": [], - "attributes": [ - "public", - "final", - "enum" - ], - "methods": [ - "public static com.yahoo.config.model.api.ConfigChangeAction$Type[] values()", - "public static com.yahoo.config.model.api.ConfigChangeAction$Type valueOf(java.lang.String)", - "public java.lang.String toString()" - ], - "fields": [ - "public static final enum com.yahoo.config.model.api.ConfigChangeAction$Type RESTART", - "public static final enum com.yahoo.config.model.api.ConfigChangeAction$Type REFEED" - ] - }, - "com.yahoo.config.model.api.ConfigChangeAction": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.config.model.api.ConfigChangeAction$Type getType()", - "public abstract java.lang.String getMessage()", - "public abstract java.util.List getServices()", - "public abstract boolean allowed()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigChangeRefeedAction": { - "superClass": "java.lang.Object", - "interfaces": [ - "com.yahoo.config.model.api.ConfigChangeAction" - ], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public com.yahoo.config.model.api.ConfigChangeAction$Type getType()", - "public java.lang.String name()", - "public abstract java.lang.String getDocumentType()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigChangeRestartAction": { - "superClass": "java.lang.Object", - "interfaces": [ - "com.yahoo.config.model.api.ConfigChangeAction" - ], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public com.yahoo.config.model.api.ConfigChangeAction$Type getType()", - "public boolean allowed()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigDefinitionRepo": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract java.util.Map getConfigDefinitions()", - "public abstract com.yahoo.vespa.config.buildergen.ConfigDefinition get(com.yahoo.vespa.config.ConfigDefinitionKey)" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigDefinitionStore": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.vespa.config.ConfigDefinition getConfigDefinition(com.yahoo.vespa.config.ConfigDefinitionKey)" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigModelPlugin": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [], - "fields": [] - }, - "com.yahoo.config.model.api.ConfigServerSpec": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract java.lang.String getHostName()", - "public abstract int getConfigServerPort()", - "public int getHttpPort()", - "public abstract int getZooKeeperPort()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ContainerEndpoint": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(java.lang.String, java.util.List)", - "public java.lang.String clusterId()", - "public java.util.List names()", - "public boolean equals(java.lang.Object)", - "public int hashCode()", - "public java.lang.String toString()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.EndpointCertificateMetadata": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(java.lang.String, java.lang.String, int)", - "public java.lang.String keyName()", - "public java.lang.String certName()", - "public int version()", - "public java.lang.String toString()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.EndpointCertificateSecrets": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(java.lang.String, java.lang.String)", - "public java.lang.String certificate()", - "public java.lang.String key()", - "public boolean isMissing()" - ], - "fields": [ - "public static final com.yahoo.config.model.api.EndpointCertificateSecrets MISSING" - ] - }, - "com.yahoo.config.model.api.FileDistribution": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract void startDownload(java.lang.String, int, java.util.Set)", - "public abstract java.io.File getFileReferencesDir()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.HostInfo": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(java.lang.String, java.util.Collection)", - "public java.lang.String getHostname()", - "public java.util.Collection getServices()", - "public boolean equals(java.lang.Object)", - "public int hashCode()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.HostProvisioner": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.config.provision.HostSpec allocateHost(java.lang.String)", - "public abstract java.util.List prepare(com.yahoo.config.provision.ClusterSpec, com.yahoo.config.provision.Capacity, int, com.yahoo.config.provision.ProvisionLogger)" - ], - "fields": [] - }, - "com.yahoo.config.model.api.Model": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.vespa.config.ConfigPayload getConfig(com.yahoo.vespa.config.ConfigKey, com.yahoo.vespa.config.buildergen.ConfigDefinition)", - "public abstract java.util.Set allConfigsProduced()", - "public abstract java.util.Collection getHosts()", - "public abstract java.util.Set allConfigIds()", - "public abstract void distributeFiles(com.yahoo.config.model.api.FileDistribution)", - "public abstract java.util.Set fileReferences()", - "public abstract com.yahoo.config.provision.AllocatedHosts allocatedHosts()", - "public boolean allowModelVersionMismatch(java.time.Instant)", - "public boolean skipOldConfigModels(java.time.Instant)", - "public com.yahoo.component.Version version()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ModelContext$Properties": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract boolean multitenant()", - "public abstract com.yahoo.config.provision.ApplicationId applicationId()", - "public abstract java.util.List configServerSpecs()", - "public abstract com.yahoo.config.provision.HostName loadBalancerName()", - "public abstract java.net.URI ztsUrl()", - "public abstract java.lang.String athenzDnsSuffix()", - "public abstract boolean hostedVespa()", - "public abstract com.yahoo.config.provision.Zone zone()", - "public abstract java.util.Set endpoints()", - "public abstract boolean isBootstrap()", - "public abstract boolean isFirstTimeDeployment()", - "public boolean useDedicatedNodeForLogserver()", - "public abstract boolean useAdaptiveDispatch()", - "public java.util.Optional tlsSecrets()", - "public java.util.Optional endpointCertificateSecrets()", - "public abstract double defaultTermwiseLimit()", - "public abstract boolean useBucketSpaceMetric()", - "public boolean useNewAthenzFilter()", - "public boolean usePhraseSegmenting()", - "public java.lang.String proxyProtocol()", - "public java.util.Optional athenzDomain()", - "public boolean useDedicatedNodesWhenUnspecified()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ModelContext": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.config.application.api.ApplicationPackage applicationPackage()", - "public abstract java.util.Optional previousModel()", - "public abstract java.util.Optional permanentApplicationPackage()", - "public abstract java.util.Optional hostProvisioner()", - "public abstract com.yahoo.config.application.api.DeployLogger deployLogger()", - "public abstract com.yahoo.config.model.api.ConfigDefinitionRepo configDefinitionRepo()", - "public abstract com.yahoo.config.application.api.FileRegistry getFileRegistry()", - "public abstract com.yahoo.config.model.api.ModelContext$Properties properties()", - "public java.util.Optional appDir()", - "public java.util.Optional wantedDockerImageRepository()", - "public abstract com.yahoo.component.Version modelVespaVersion()", - "public abstract com.yahoo.component.Version wantedNodeVespaVersion()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ModelCreateResult": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(com.yahoo.config.model.api.Model, java.util.List)", - "public com.yahoo.config.model.api.Model getModel()", - "public java.util.List getConfigChangeActions()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ModelFactory": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.component.Version version()", - "public abstract com.yahoo.config.model.api.Model createModel(com.yahoo.config.model.api.ModelContext)", - "public abstract com.yahoo.config.model.api.ModelCreateResult createAndValidateModel(com.yahoo.config.model.api.ModelContext, com.yahoo.config.model.api.ValidationParameters)" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ModelState": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract com.yahoo.config.model.api.Model getModel()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.PortInfo": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(int, java.util.Collection)", - "public int getPort()", - "public java.util.Collection getTags()", - "public boolean equals(java.lang.Object)", - "public int hashCode()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.ServiceInfo": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(java.lang.String, java.lang.String, java.util.Collection, java.util.Map, java.lang.String, java.lang.String)", - "public java.lang.String getServiceName()", - "public java.lang.String getConfigId()", - "public java.lang.String getServiceType()", - "public java.util.Optional getProperty(java.lang.String)", - "public java.util.Collection getPorts()", - "public java.lang.String getHostName()", - "public boolean equals(java.lang.Object)", - "public int hashCode()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.SuperModel": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>()", - "public void <init>(java.util.Map, boolean)", - "public java.util.Map getModelsPerTenant()", - "public java.util.Map getModels()", - "public boolean isComplete()", - "public java.util.List getAllApplicationInfos()", - "public java.util.Optional getApplicationInfo(com.yahoo.config.provision.ApplicationId)", - "public com.yahoo.config.model.api.SuperModel cloneAndSetApplication(com.yahoo.config.model.api.ApplicationInfo)", - "public com.yahoo.config.model.api.SuperModel cloneAndRemoveApplication(com.yahoo.config.provision.ApplicationId)", - "public com.yahoo.config.model.api.SuperModel cloneAsComplete()", - "public java.util.Set getApplicationIds()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.SuperModelListener": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract void applicationActivated(com.yahoo.config.model.api.SuperModel, com.yahoo.config.model.api.ApplicationInfo)", - "public abstract void applicationRemoved(com.yahoo.config.model.api.SuperModel, com.yahoo.config.provision.ApplicationId)", - "public abstract void notifyOfCompleteness(com.yahoo.config.model.api.SuperModel)" - ], - "fields": [] - }, - "com.yahoo.config.model.api.SuperModelProvider": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract void registerListener(com.yahoo.config.model.api.SuperModelListener)", - "public abstract com.yahoo.config.model.api.SuperModel getSuperModel()" - ], - "fields": [] - }, - "com.yahoo.config.model.api.TlsSecrets": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>(java.lang.String, java.lang.String)", - "public void <init>(com.yahoo.config.model.api.EndpointCertificateSecrets)", - "public java.lang.String certificate()", - "public java.lang.String key()", - "public boolean isMissing()" - ], - "fields": [ - "public static final com.yahoo.config.model.api.TlsSecrets MISSING" - ] - }, - "com.yahoo.config.model.api.ValidationParameters$CheckRouting": { - "superClass": "java.lang.Enum", - "interfaces": [], - "attributes": [ - "public", - "final", - "enum" - ], - "methods": [ - "public static com.yahoo.config.model.api.ValidationParameters$CheckRouting[] values()", - "public static com.yahoo.config.model.api.ValidationParameters$CheckRouting valueOf(java.lang.String)" - ], - "fields": [ - "public static final enum com.yahoo.config.model.api.ValidationParameters$CheckRouting TRUE", - "public static final enum com.yahoo.config.model.api.ValidationParameters$CheckRouting FALSE" - ] - }, - "com.yahoo.config.model.api.ValidationParameters$FailOnIncompatibleChange": { - "superClass": "java.lang.Enum", - "interfaces": [], - "attributes": [ - "public", - "final", - "enum" - ], - "methods": [ - "public static com.yahoo.config.model.api.ValidationParameters$FailOnIncompatibleChange[] values()", - "public static com.yahoo.config.model.api.ValidationParameters$FailOnIncompatibleChange valueOf(java.lang.String)" - ], - "fields": [ - "public static final enum com.yahoo.config.model.api.ValidationParameters$FailOnIncompatibleChange TRUE", - "public static final enum com.yahoo.config.model.api.ValidationParameters$FailOnIncompatibleChange FALSE" - ] - }, - "com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors": { - "superClass": "java.lang.Enum", - "interfaces": [], - "attributes": [ - "public", - "final", - "enum" - ], - "methods": [ - "public static com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors[] values()", - "public static com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors valueOf(java.lang.String)" - ], - "fields": [ - "public static final enum com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors TRUE", - "public static final enum com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors FALSE" - ] - }, - "com.yahoo.config.model.api.ValidationParameters": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public" - ], - "methods": [ - "public void <init>()", - "public void <init>(com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors)", - "public void <init>(com.yahoo.config.model.api.ValidationParameters$CheckRouting)", - "public void <init>(com.yahoo.config.model.api.ValidationParameters$IgnoreValidationErrors, com.yahoo.config.model.api.ValidationParameters$FailOnIncompatibleChange, com.yahoo.config.model.api.ValidationParameters$CheckRouting)", - "public boolean ignoreValidationErrors()", - "public boolean failOnIncompatibleChanges()", - "public boolean checkRouting()" - ], - "fields": [] } }
\ No newline at end of file diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/HostProvisioner.java b/config-model-api/src/main/java/com/yahoo/config/model/api/HostProvisioner.java index bf58000dd36..4edf3c455d0 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/HostProvisioner.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/HostProvisioner.java @@ -18,15 +18,17 @@ public interface HostProvisioner { // TODO: Remove HostSpec allocateHost(String alias); + @Deprecated // TODO: Remove after April 2020 + List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger); + /** * Prepares allocation of a set of hosts with a given type, common id and the amount. * * @param cluster the cluster to allocate nodes to * @param capacity the capacity describing the capacity requested - * @param groups the number of groups to divide the nodes into * @param logger a logger to which messages to the deployer may be written * @return the specification of the allocated hosts */ - List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger); + List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, ProvisionLogger logger); } diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/package-info.java b/config-model-api/src/main/java/com/yahoo/config/model/api/package-info.java index a3478026520..689e2524dde 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/package-info.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/package-info.java @@ -1,6 +1,5 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. @ExportPackage -@PublicApi // Not really "public", only annotated as such to enable the ABI checker plugin package com.yahoo.config.model.api; import com.yahoo.osgi.annotation.ExportPackage; diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java index f909f3864da..201b69c1aae 100644 --- a/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java +++ b/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java @@ -45,10 +45,16 @@ public class HostsXmlProvisioner implements HostProvisioner { } @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ClusterSpec cluster, Capacity quantity, int groups, ProvisionLogger logger) { throw new UnsupportedOperationException("Prepare on an XML host provisioner is not supported"); } + @Override + public List<HostSpec> prepare(ClusterSpec cluster, Capacity quantity, ProvisionLogger logger) { + throw new UnsupportedOperationException("Prepare on an XML host provisioner is not supported"); + } + private HostSpec host2HostSpec(Host host) { return new HostSpec(host.hostname(), host.aliases()); } diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java index 6047b6a9818..9b19c8590e5 100644 --- a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java +++ b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java @@ -113,18 +113,20 @@ public class InMemoryProvisioner implements HostProvisioner { } @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ClusterSpec cluster, Capacity requestedCapacity, int groups, ProvisionLogger logger) { - if (cluster.group().isPresent() && groups > 1) + return prepare(cluster, requestedCapacity.withGroups(groups), logger); + } + + @Override + public List<HostSpec> prepare(ClusterSpec cluster, Capacity requestedCapacity, ProvisionLogger logger) { + if (cluster.group().isPresent() && requestedCapacity.groups() > 1) throw new IllegalArgumentException("Cannot both be specifying a group and ask for groups to be created"); - if (requestedCapacity.nodeCount() % groups != 0) - throw new IllegalArgumentException("Requested " + requestedCapacity.nodeCount() + " nodes in " + - groups + " groups, but the node count is not divisible into this number of groups"); int capacity = failOnOutOfCapacity || requestedCapacity.isRequired() - ? requestedCapacity.nodeCount() - : Math.min(requestedCapacity.nodeCount(), freeNodes.get(defaultResources).size() + totalAllocatedTo(cluster)); - if (groups > capacity) - groups = capacity; + ? requestedCapacity.nodes() + : Math.min(requestedCapacity.nodes(), freeNodes.get(defaultResources).size() + totalAllocatedTo(cluster)); + int groups = requestedCapacity.groups() > capacity ? capacity : requestedCapacity.groups(); List<HostSpec> allocation = new ArrayList<>(); if (groups == 1) { diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java index 7d9b78719ea..8945223447f 100644 --- a/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java +++ b/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java @@ -42,7 +42,14 @@ public class SingleNodeProvisioner implements HostProvisioner { } @Override - public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { // TODO: This should fail if capacity requested is more than 1 + @Deprecated // TODO: Remove after April 2020 + public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { + return prepare(cluster, capacity.withGroups(groups), logger); + } + + @Override + public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { + // TODO: This should fail if capacity requested is more than 1 List<HostSpec> hosts = new ArrayList<>(); hosts.add(new HostSpec(host.hostname(), host.aliases(), ClusterMembership.from(cluster, counter++))); return hosts; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java index 3765e683b18..557a61ec211 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java @@ -111,8 +111,8 @@ public class HostSystem extends AbstractConfigProducer<Host> { } } - public Map<HostResource, ClusterMembership> allocateHosts(ClusterSpec cluster, Capacity capacity, int groups, DeployLogger logger) { - List<HostSpec> allocatedHosts = provisioner.prepare(cluster, capacity, groups, new ProvisionDeployLogger(logger)); + public Map<HostResource, ClusterMembership> allocateHosts(ClusterSpec cluster, Capacity capacity, DeployLogger logger) { + List<HostSpec> allocatedHosts = provisioner.prepare(cluster, capacity, new ProvisionDeployLogger(logger)); // TODO: Even if HostResource owns a set of memberships, we need to return a map because the caller needs the current membership. Map<HostResource, ClusterMembership> retAllocatedHosts = new LinkedHashMap<>(); for (HostSpec spec : allocatedHosts) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java index 384d891003e..f3f53538ddc 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java @@ -201,7 +201,7 @@ public class NodesSpecification { .combinedId(combinedId.map(ClusterSpec.Id::from)) .dockerImageRepo(dockerImageRepo) .build(); - return hostSystem.allocateHosts(cluster, Capacity.fromCount(count, resources, required, canFail), groups, logger); + return hostSystem.allocateHosts(cluster, Capacity.fromCount(count, groups, resources, required, canFail), logger); } private static Optional<NodeResources> getResources(ModelElement nodesElement) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index c1f793e255d..1670cc46fef 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -673,10 +673,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { .dockerImageRepo(deployState.getWantedDockerImageRepo()) .build(); Capacity capacity = Capacity.fromCount(1, + 1, Optional.empty(), false, ! deployState.getProperties().isBootstrap()); - HostResource host = hostSystem.allocateHosts(clusterSpec, capacity, 1, log).keySet().iterator().next(); + HostResource host = hostSystem.allocateHosts(clusterSpec, capacity, log).keySet().iterator().next(); return singleHostContainerCluster(cluster, host, context); } } @@ -688,10 +689,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { .build(); int nodeCount = deployState.zone().environment().isProduction() ? 2 : 1; Capacity capacity = Capacity.fromCount(nodeCount, + 1, Optional.empty(), false, !deployState.getProperties().isBootstrap()); - var hosts = hostSystem.allocateHosts(clusterSpec, capacity, 1, log); + var hosts = hostSystem.allocateHosts(clusterSpec, capacity, log); return createNodesFromHosts(log, hosts, cluster); } return singleHostContainerCluster(cluster, hostSystem.getHost(Container.SINGLENODE_CONTAINER_SERVICESPEC), context); @@ -721,7 +723,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { .build(); Map<HostResource, ClusterMembership> hosts = cluster.getRoot().hostSystem().allocateHosts(clusterSpec, - Capacity.fromRequiredNodeType(type), 1, log); + Capacity.fromRequiredNodeType(type), log); return createNodesFromHosts(context.getDeployLogger(), hosts, cluster); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java index 4b7f727ff63..cf1ae637cf9 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java @@ -109,7 +109,13 @@ public class VespaModelFactoryTest { } @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { + return prepare(cluster, capacity.withGroups(groups), logger); + } + + @Override + public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { return List.of(new HostSpec(hostName, List.of(), ClusterMembership.from(ClusterSpec.request(ClusterSpec.Type.container, new ClusterSpec.Id(routingClusterName)).vespaVersion("6.42").build(), diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Capacity.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Capacity.java index 59d6ec8feb8..a37f315be9d 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/Capacity.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Capacity.java @@ -11,7 +11,8 @@ import java.util.Optional; */ public final class Capacity { - private final int nodeCount; + private final int nodes; + private final int groups; private final boolean required; @@ -21,8 +22,12 @@ public final class Capacity { private final NodeType type; - private Capacity(int nodeCount, Optional<NodeResources> nodeResources, boolean required, boolean canFail, NodeType type) { - this.nodeCount = nodeCount; + private Capacity(int nodes, int groups, Optional<NodeResources> nodeResources, boolean required, boolean canFail, NodeType type) { + if (nodes > 0 && groups > 0 && nodes % groups != 0) + throw new IllegalArgumentException("The number of nodes (" + nodes + + ") must be divisible by the number of groups (" + groups + ")"); + this.nodes = nodes; + this.groups = groups; this.required = required; this.canFail = canFail; this.nodeResources = nodeResources; @@ -30,7 +35,14 @@ public final class Capacity { } /** Returns the number of nodes requested */ - public int nodeCount() { return nodeCount; } + @Deprecated // TODO: Remove after April 2020 + public int nodeCount() { return nodes; } + + /** Returns the number of nodes requested (across all groups), or 0 if not specified */ + public int nodes() { return nodes; } + + /** Returns the number of groups requested, or 0 if not specified */ + public int groups() { return groups; } /** * The node flavor requested, or empty if no legacy flavor name has been used. @@ -38,7 +50,7 @@ public final class Capacity { * * @deprecated use nodeResources instead */ - @Deprecated + @Deprecated // TODO: Remove after March 2020 public Optional<String> flavor() { if (nodeResources().isEmpty()) return Optional.empty(); return nodeResources.map(n -> n.toString()); @@ -64,32 +76,49 @@ public final class Capacity { */ public NodeType type() { return type; } + public Capacity withGroups(int groups) { + return new Capacity(nodes, groups, nodeResources, required, canFail, type); + } + @Override public String toString() { - return nodeCount + " nodes " + (nodeResources.isPresent() ? nodeResources.get() : "with default resources" ); + return nodes + " nodes " + + (groups > 1 ? "(in " + groups + " groups) " : "") + + (nodeResources.isPresent() ? nodeResources.get() : "with default resources" ); + } + + /** Create a non-required, failable capacity request */ + public static Capacity fromCount(int nodes, int groups, NodeResources resources) { + return fromCount(nodes, groups, resources, false, true); + } + + public static Capacity fromCount(int nodes, int groups, NodeResources resources, boolean required, boolean canFail) { + return new Capacity(nodes, groups, Optional.of(resources), required, canFail, NodeType.tenant); } - /** Creates this from a desired node count: The request may be satisfied with a smaller number of nodes. */ - public static Capacity fromNodeCount(int capacity) { - return fromCount(capacity, Optional.empty(), false, true); + public static Capacity fromCount(int nodes, int groups, Optional<NodeResources> resources, boolean required, boolean canFail) { + return new Capacity(nodes, groups, resources, required, canFail, NodeType.tenant); } /** Create a non-required, failable capacity request */ - public static Capacity fromCount(int nodeCount, NodeResources resources) { - return fromCount(nodeCount, resources, false, true); + @Deprecated // TODO: Remove after April 2020 + public static Capacity fromCount(int nodes, NodeResources resources) { + return fromCount(nodes, 0, resources, false, true); } - public static Capacity fromCount(int nodeCount, NodeResources resources, boolean required, boolean canFail) { - return new Capacity(nodeCount, Optional.of(resources), required, canFail, NodeType.tenant); + @Deprecated // TODO: Remove after April 2020 + public static Capacity fromCount(int nodes, NodeResources resources, boolean required, boolean canFail) { + return new Capacity(nodes, 0, Optional.of(resources), required, canFail, NodeType.tenant); } - public static Capacity fromCount(int nodeCount, Optional<NodeResources> resources, boolean required, boolean canFail) { - return new Capacity(nodeCount, resources, required, canFail, NodeType.tenant); + @Deprecated // TODO: Remove after April 2020 + public static Capacity fromCount(int nodes, Optional<NodeResources> resources, boolean required, boolean canFail) { + return new Capacity(nodes, 0, resources, required, canFail, NodeType.tenant); } /** Creates this from a node type */ public static Capacity fromRequiredNodeType(NodeType type) { - return new Capacity(0, Optional.empty(), true, false, type); + return new Capacity(0, 0, Optional.empty(), true, false, type); } } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Provisioner.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Provisioner.java index 6be1d49ebd3..e308d631442 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/Provisioner.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Provisioner.java @@ -19,10 +19,12 @@ public interface Provisioner { * @param applicationId the application requesting hosts * @param cluster the specification of the cluster to allocate nodes for * @param capacity the capacity requested - * @param groups the number of node groups to divide the requested capacity into * @param logger a logger which receives messages which are returned to the requestor * @return the specification of the hosts allocated */ + List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, ProvisionLogger logger); + + @Deprecated // TODO: Remove after April 2020 List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger); /** @@ -40,7 +42,6 @@ public interface Provisioner { * @param transaction Transaction with operations to commit together with any operations done within the provisioner. * @param application the application to remove */ - @SuppressWarnings("deprecation") void remove(NestedTransaction transaction, ApplicationId application); /** diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java index ee4cc4a3043..daacdf9fd50 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java @@ -36,8 +36,14 @@ public class ProvisionerAdapter implements HostProvisioner { } @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { - return provisioner.prepare(applicationId, cluster, capacity, groups, logger); + return provisioner.prepare(applicationId, cluster, capacity.withGroups(groups), logger); + } + + @Override + public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { + return provisioner.prepare(applicationId, cluster, capacity, logger); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/StaticProvisioner.java b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/StaticProvisioner.java index 26d322665f0..8ddfb1e8b09 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/StaticProvisioner.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/StaticProvisioner.java @@ -33,8 +33,15 @@ public class StaticProvisioner implements HostProvisioner { throw new UnsupportedOperationException("Allocating a single host from provisioning info is not supported"); } + @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { + return prepare(cluster, capacity.withGroups(groups), logger); + } + + @Override + public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { List<HostSpec> hostsAlreadyAllocatedToCluster = allocatedHosts.getHosts().stream() .filter(host -> host.membership().isPresent() && matches(host.membership().get().cluster(), cluster)) @@ -42,7 +49,7 @@ public class StaticProvisioner implements HostProvisioner { if ( ! hostsAlreadyAllocatedToCluster.isEmpty()) return hostsAlreadyAllocatedToCluster; else - return fallback.prepare(cluster, capacity, groups, logger); + return fallback.prepare(cluster, capacity, logger); } private boolean matches(ClusterSpec nodeCluster, ClusterSpec requestedCluster) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java index 85f07da0325..41712be07f0 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java @@ -299,8 +299,14 @@ public class DeployTester { } @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { - return hostProvisioner.prepare(cluster, capacity, groups, logger); + return hostProvisioner.prepare(cluster, capacity.withGroups(groups), logger); + } + + @Override + public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { + return hostProvisioner.prepare(cluster, capacity, logger); } @Override diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java index 70bba674778..5b0bb7885d8 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java @@ -237,11 +237,17 @@ public class SessionHandlerTest { public Collection<HostSpec> lastHosts; @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { throw new UnsupportedOperationException(); } @Override + public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { + throw new UnsupportedOperationException(); + } + + @Override public void activate(NestedTransaction transaction, ApplicationId application, Collection<HostSpec> hosts) { activated = true; lastApplicationId = application; diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java index 40115170b69..a3b0f3ec44a 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java @@ -342,11 +342,17 @@ public class SessionPreparerTest { private static class FailWithTransientExceptionProvisioner implements Provisioner { @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { throw new LoadBalancerServiceException("Unable to create load balancer", new Exception("some internal exception")); } @Override + public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { + throw new LoadBalancerServiceException("Unable to create load balancer", new Exception("some internal exception")); + } + + @Override public void activate(NestedTransaction transaction, ApplicationId application, Collection<HostSpec> hosts) { } @Override diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java index 94f8fb29b9a..c8fe626dc72 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java @@ -32,7 +32,7 @@ public class CapacityPolicies { } public int decideSize(Capacity capacity, ClusterSpec cluster, ApplicationId application) { - int requestedNodes = capacity.nodeCount(); + int requestedNodes = capacity.nodes(); if (application.instance().isTester()) return 1; @@ -42,7 +42,7 @@ public class CapacityPolicies { switch(zone.environment()) { case dev : case test : return 1; - case perf : return Math.min(capacity.nodeCount(), 3); + case perf : return Math.min(capacity.nodes(), 3); case staging: return requestedNodes <= 1 ? requestedNodes : Math.max(2, requestedNodes / 10); case prod : return requestedNodes; default : throw new IllegalArgumentException("Unsupported environment " + zone.environment()); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java index 1086a3a7cd9..fb83385920c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java @@ -86,12 +86,10 @@ public class InfraDeployerImpl implements InfraDeployer { try (Mutex lock = nodeRepository.lock(application.getApplicationId())) { NodeType nodeType = application.getCapacity().type(); Version targetVersion = infrastructureVersions.getTargetVersionFor(nodeType); - hostSpecs = provisioner.prepare( - application.getApplicationId(), - application.getClusterSpecWithVersion(targetVersion), - application.getCapacity(), - 1, // groups - logger::log); + hostSpecs = provisioner.prepare(application.getApplicationId(), + application.getClusterSpecWithVersion(targetVersion), + application.getCapacity(), + logger::log); prepared = true; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index 73061acd9c1..cc59984e9d6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -70,38 +70,47 @@ public class NodeRepositoryProvisioner implements Provisioner { this.activator = new Activator(nodeRepository, loadBalancerProvisioner); } + /** * Returns a list of nodes in the prepared or active state, matching the given constraints. * The nodes are ordered by increasing index number. */ + @Deprecated // TODO: Remove after April 2020 @Override - public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity requestedCapacity, + public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity requestedCapacity, int wantedGroups, ProvisionLogger logger) { + return prepare(application, cluster, requestedCapacity.withGroups(wantedGroups), logger); + } + + /** + * Returns a list of nodes in the prepared or active state, matching the given constraints. + * The nodes are ordered by increasing index number. + */ + @Override + public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity requestedCapacity, + ProvisionLogger logger) { if (cluster.group().isPresent()) throw new IllegalArgumentException("Node requests cannot specify a group"); - if (requestedCapacity.nodeCount() > 0 && requestedCapacity.nodeCount() % wantedGroups != 0) - throw new IllegalArgumentException("Requested " + requestedCapacity.nodeCount() + " nodes in " + wantedGroups + " groups, " + - "which doesn't allow the nodes to be divided evenly into groups"); log.log(zone.system().isCd() ? Level.INFO : LogLevel.DEBUG, - () -> "Received deploy prepare request for " + requestedCapacity + " in " + - wantedGroups + " groups for application " + application + ", cluster " + cluster); + () -> "Received deploy prepare request for " + requestedCapacity + + " for application " + application + ", cluster " + cluster); int effectiveGroups; NodeSpec requestedNodes; Optional<NodeResources> resources = requestedCapacity.nodeResources(); if ( requestedCapacity.type() == NodeType.tenant) { int nodeCount = capacityPolicies.decideSize(requestedCapacity, cluster, application); - if (zone.environment().isManuallyDeployed() && nodeCount < requestedCapacity.nodeCount()) - logger.log(Level.INFO, "Requested " + requestedCapacity.nodeCount() + " nodes for " + cluster + + if (zone.environment().isManuallyDeployed() && nodeCount < requestedCapacity.nodes()) + logger.log(Level.INFO, "Requested " + requestedCapacity.nodes() + " nodes for " + cluster + ", downscaling to " + nodeCount + " nodes in " + zone.environment()); resources = Optional.of(capacityPolicies.decideNodeResources(requestedCapacity, cluster)); boolean exclusive = capacityPolicies.decideExclusivity(cluster.isExclusive()); - effectiveGroups = Math.min(wantedGroups, nodeCount); // cannot have more groups than nodes + effectiveGroups = Math.min(requestedCapacity.groups(), nodeCount); // cannot have more groups than nodes requestedNodes = NodeSpec.from(nodeCount, resources.get(), exclusive, requestedCapacity.canFail()); if ( ! hasQuota(application, nodeCount)) throw new IllegalArgumentException(requestedCapacity + " requested for " + cluster + - (requestedCapacity.nodeCount() != nodeCount ? " resolved to " + nodeCount + " nodes" : "") + + (requestedCapacity.nodes() != nodeCount ? " resolved to " + nodeCount + " nodes" : "") + " exceeds your quota. Resolve this at https://cloud.vespa.ai/quota"); } else { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java index 7ab42093bab..5ec5c2c08e8 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java @@ -146,8 +146,8 @@ public class MockDeployer implements Deployer { this.clusterContexts = clusterContexts; } - public ApplicationContext(ApplicationId id, ClusterSpec cluster, Capacity capacity, int groups) { - this(id, List.of(new ClusterContext(id, cluster, capacity, groups))); + public ApplicationContext(ApplicationId id, ClusterSpec cluster, Capacity capacity) { + this(id, List.of(new ClusterContext(id, cluster, capacity))); } public ApplicationId id() { return id; } @@ -169,13 +169,11 @@ public class MockDeployer implements Deployer { private final ApplicationId id; private final ClusterSpec cluster; private final Capacity capacity; - private final int groups; - public ClusterContext(ApplicationId id, ClusterSpec cluster, Capacity capacity, int groups) { + public ClusterContext(ApplicationId id, ClusterSpec cluster, Capacity capacity) { this.id = id; this.cluster = cluster; this.capacity = capacity; - this.groups = groups; } public ApplicationId id() { return id; } @@ -183,7 +181,7 @@ public class MockDeployer implements Deployer { public ClusterSpec cluster() { return cluster; } private List<HostSpec> prepare(NodeRepositoryProvisioner provisioner) { - return provisioner.prepare(id, cluster, capacity, groups, null); + return provisioner.prepare(id, cluster, capacity, null); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 4f72864b087..22c37d935a5 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -139,19 +139,19 @@ public class MockNodeRepository extends NodeRepository { ApplicationId zoneApp = ApplicationId.from(TenantName.from("zoneapp"), ApplicationName.from("zoneapp"), InstanceName.from("zoneapp")); ClusterSpec zoneCluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); - activate(provisioner.prepare(zoneApp, zoneCluster, Capacity.fromRequiredNodeType(NodeType.host), 1, null), zoneApp, provisioner); + activate(provisioner.prepare(zoneApp, zoneCluster, Capacity.fromRequiredNodeType(NodeType.host), null), zoneApp, provisioner); ApplicationId app1 = ApplicationId.from(TenantName.from("tenant1"), ApplicationName.from("application1"), InstanceName.from("instance1")); ClusterSpec cluster1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1")).vespaVersion("6.42").build(); - provisioner.prepare(app1, cluster1, Capacity.fromCount(2, new NodeResources(2, 8, 50, 1)), 1, null); + provisioner.prepare(app1, cluster1, Capacity.fromCount(2, 1, new NodeResources(2, 8, 50, 1)), null); ApplicationId app2 = ApplicationId.from(TenantName.from("tenant2"), ApplicationName.from("application2"), InstanceName.from("instance2")); ClusterSpec cluster2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id2")).vespaVersion("6.42").build(); - activate(provisioner.prepare(app2, cluster2, Capacity.fromCount(2, new NodeResources(2, 8, 50, 1)), 1, null), app2, provisioner); + activate(provisioner.prepare(app2, cluster2, Capacity.fromCount(2, 1, new NodeResources(2, 8, 50, 1)), null), app2, provisioner); ApplicationId app3 = ApplicationId.from(TenantName.from("tenant3"), ApplicationName.from("application3"), InstanceName.from("instance3")); ClusterSpec cluster3 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id3")).vespaVersion("6.42").build(); - activate(provisioner.prepare(app3, cluster3, Capacity.fromCount(2, new NodeResources(1, 4, 100, 1), false, true), 1, null), app3, provisioner); + activate(provisioner.prepare(app3, cluster3, Capacity.fromCount(2, 1, new NodeResources(1, 4, 100, 1), false, true), null), app3, provisioner); List<Node> largeNodes = new ArrayList<>(); largeNodes.add(createNode("node13", "host13.yahoo.com", ipConfig(13), Optional.empty(), @@ -162,7 +162,7 @@ public class MockNodeRepository extends NodeRepository { setReady(largeNodes, Agent.system, getClass().getSimpleName()); ApplicationId app4 = ApplicationId.from(TenantName.from("tenant4"), ApplicationName.from("application4"), InstanceName.from("instance4")); ClusterSpec cluster4 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id4")).vespaVersion("6.42").build(); - activate(provisioner.prepare(app4, cluster4, Capacity.fromCount(2, new NodeResources(10, 48, 500, 1), false, true), 1, null), app4, provisioner); + activate(provisioner.prepare(app4, cluster4, Capacity.fromCount(2, 1, new NodeResources(10, 48, 500, 1), false, true), null), app4, provisioner); } private void activate(List<HostSpec> hosts, ApplicationId application, NodeRepositoryProvisioner provisioner) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockProvisioner.java index 3915ae41d6e..045d0cad1ad 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockProvisioner.java @@ -20,11 +20,17 @@ import java.util.List; public class MockProvisioner implements Provisioner { @Override + @Deprecated // TODO: Remove after April 2020 public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { return Collections.emptyList(); } @Override + public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, ProvisionLogger logger) { + return Collections.emptyList(); + } + + @Override public void activate(NestedTransaction transaction, ApplicationId application, Collection<HostSpec> hosts) { } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java index 3ba230f9ccd..90188525c81 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java @@ -82,7 +82,7 @@ class AutoscalingTester { } public List<HostSpec> deploy(ApplicationId application, ClusterSpec cluster, int nodes, int groups, NodeResources resources) { - List<HostSpec> hosts = provisioningTester.prepare(application, cluster, Capacity.fromCount(nodes, resources), groups); + List<HostSpec> hosts = provisioningTester.prepare(application, cluster, Capacity.fromCount(nodes, groups, resources)); for (HostSpec host : hosts) makeReady(host.hostname()); provisioningTester.deployZoneApp(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsFetcherTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsFetcherTest.java index 8c1a27f2fd1..42e366143e4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsFetcherTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsFetcherTest.java @@ -29,8 +29,8 @@ public class NodeMetricsFetcherTest { ApplicationId application1 = tester.makeApplicationId(); ApplicationId application2 = tester.makeApplicationId(); - tester.deploy(application1, Capacity.fromCount(2, resources)); // host-1.yahoo.com, host-2.yahoo.com - tester.deploy(application2, Capacity.fromCount(2, resources)); // host-4.yahoo.com, host-3.yahoo.com + tester.deploy(application1, Capacity.fromCount(2, 1, resources)); // host-1.yahoo.com, host-2.yahoo.com + tester.deploy(application2, Capacity.fromCount(2, 1, resources)); // host-4.yahoo.com, host-3.yahoo.com orchestrator.suspend(new HostName("host-4.yahoo.com")); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index e8b9813a8a2..1ac5525d817 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -322,12 +322,12 @@ public class FailedExpirerTest { public FailureScenario allocate(ClusterSpec.Type clusterType, NodeResources flavor, String... hostname) { ClusterSpec clusterSpec = ClusterSpec.request(clusterType, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - Capacity capacity = Capacity.fromCount(hostname.length, Optional.of(flavor), false, true); + Capacity capacity = Capacity.fromCount(hostname.length, 1, Optional.of(flavor), false, true); return allocate(applicationId, clusterSpec, capacity); } public FailureScenario allocate(ApplicationId applicationId, ClusterSpec clusterSpec, Capacity capacity) { - List<HostSpec> preparedNodes = provisioner.prepare(applicationId, clusterSpec, capacity, 1, null); + List<HostSpec> preparedNodes = provisioner.prepare(applicationId, clusterSpec, capacity, null); NestedTransaction transaction = new NestedTransaction().add(new CuratorTransaction(curator)); provisioner.activate(transaction, applicationId, Set.copyOf(preparedNodes)); transaction.commit(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java index 17d8b702269..cd359c9aa5f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java @@ -54,7 +54,7 @@ public class InactiveAndFailedExpirerTest { // Allocate then deallocate 2 nodes ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - List<HostSpec> preparedNodes = tester.prepare(applicationId, cluster, Capacity.fromCount(2, nodeResources), 1); + List<HostSpec> preparedNodes = tester.prepare(applicationId, cluster, Capacity.fromCount(2, 1, nodeResources)); tester.activate(applicationId, new HashSet<>(preparedNodes)); assertEquals(2, tester.getNodes(applicationId, Node.State.active).size()); tester.deactivate(applicationId); @@ -92,7 +92,7 @@ public class InactiveAndFailedExpirerTest { // Allocate and deallocate a single node ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - List<HostSpec> preparedNodes = tester.prepare(applicationId, cluster, Capacity.fromCount(2, nodeResources), 1); + List<HostSpec> preparedNodes = tester.prepare(applicationId, cluster, Capacity.fromCount(2, 1, nodeResources)); tester.activate(applicationId, new HashSet<>(preparedNodes)); assertEquals(2, tester.getNodes(applicationId, Node.State.active).size()); tester.deactivate(applicationId); @@ -124,8 +124,7 @@ public class InactiveAndFailedExpirerTest { { List<HostSpec> hostSpecs = tester.prepare(applicationId, cluster, - Capacity.fromCount(2, nodeResources), - 1); + Capacity.fromCount(2, 1, nodeResources)); tester.activate(applicationId, new HashSet<>(hostSpecs)); assertEquals(2, tester.getNodes(applicationId, Node.State.active).size()); } @@ -134,7 +133,7 @@ public class InactiveAndFailedExpirerTest { { Node toRetire = tester.getNodes(applicationId, Node.State.active).asList().get(0); tester.patchNode(toRetire.withWantToRetire(true, Agent.operator, tester.clock().instant())); - List<HostSpec> hostSpecs = tester.prepare(applicationId, cluster, Capacity.fromCount(2, nodeResources), 1); + List<HostSpec> hostSpecs = tester.prepare(applicationId, cluster, Capacity.fromCount(2, 1, nodeResources)); tester.activate(applicationId, new HashSet<>(hostSpecs)); } @@ -147,9 +146,9 @@ public class InactiveAndFailedExpirerTest { applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(2, + 1, nodeResources, - false, true), - 1) + false, true)) ) ); Orchestrator orchestrator = mock(Orchestrator.class); @@ -174,7 +173,7 @@ public class InactiveAndFailedExpirerTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyNodes(1, nodeResources); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - List<HostSpec> preparedNodes = tester.prepare(testerId, cluster, Capacity.fromCount(2, nodeResources), 1); + List<HostSpec> preparedNodes = tester.prepare(testerId, cluster, Capacity.fromCount(2, 1, nodeResources)); tester.activate(testerId, new HashSet<>(preparedNodes)); assertEquals(1, tester.getNodes(testerId, Node.State.active).size()); tester.deactivate(testerId); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index 0efca6ef826..24284031c92 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -89,17 +89,17 @@ public class NodeFailTester { // Create applications ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - Capacity capacity1 = Capacity.fromCount(5, nodeResources, false, true); - Capacity capacity2 = Capacity.fromCount(7, nodeResources, false, true); + Capacity capacity1 = Capacity.fromCount(5, 1, nodeResources, false, true); + Capacity capacity2 = Capacity.fromCount(7, 1, nodeResources, false, true); tester.activate(app1, clusterApp1, capacity1); tester.activate(app2, clusterApp2, capacity2); - assertEquals(capacity1.nodeCount(), tester.nodeRepository.getNodes(app1, Node.State.active).size()); - assertEquals(capacity2.nodeCount(), tester.nodeRepository.getNodes(app2, Node.State.active).size()); + assertEquals(capacity1.nodes(), tester.nodeRepository.getNodes(app1, Node.State.active).size()); + assertEquals(capacity2.nodes(), tester.nodeRepository.getNodes(app2, Node.State.active).size()); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1, 1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2, 1)); + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps); tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository); tester.metric = new MetricsReporterTest.TestMetric(); @@ -122,20 +122,20 @@ public class NodeFailTester { ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("6.75.0").build(); ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.75.0").build(); Capacity allHosts = Capacity.fromRequiredNodeType(NodeType.host); - Capacity capacity1 = Capacity.fromCount(3, new NodeResources(1, 4, 10, 0.3), false, true); - Capacity capacity2 = Capacity.fromCount(5, new NodeResources(1, 4, 10, 0.3), false, true); + Capacity capacity1 = Capacity.fromCount(3, 1, new NodeResources(1, 4, 10, 0.3), false, true); + Capacity capacity2 = Capacity.fromCount(5, 1, new NodeResources(1, 4, 10, 0.3), false, true); tester.activate(tenantHostApp, clusterNodeAdminApp, allHosts); tester.activate(app1, clusterApp1, capacity1); tester.activate(app2, clusterApp2, capacity2); assertEquals(Set.of(tester.nodeRepository.getNodes(NodeType.host)), Set.of(tester.nodeRepository.getNodes(tenantHostApp, Node.State.active))); - assertEquals(capacity1.nodeCount(), tester.nodeRepository.getNodes(app1, Node.State.active).size()); - assertEquals(capacity2.nodeCount(), tester.nodeRepository.getNodes(app2, Node.State.active).size()); + assertEquals(capacity1.nodes(), tester.nodeRepository.getNodes(app1, Node.State.active).size()); + assertEquals(capacity2.nodes(), tester.nodeRepository.getNodes(app2, Node.State.active).size()); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( - tenantHostApp, new MockDeployer.ApplicationContext(tenantHostApp, clusterNodeAdminApp, allHosts, 1), - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1, 1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2, 1)); + tenantHostApp, new MockDeployer.ApplicationContext(tenantHostApp, clusterNodeAdminApp, allHosts), + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps); tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository); tester.metric = new MetricsReporterTest.TestMetric(); @@ -154,7 +154,7 @@ public class NodeFailTester { assertEquals(count, tester.nodeRepository.getNodes(nodeType, Node.State.active).size()); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, allNodes, 1)); + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, allNodes)); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps); tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository); tester.metric = new MetricsReporterTest.TestMetric(); @@ -252,7 +252,7 @@ public class NodeFailTester { } private void activate(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity) { - List<HostSpec> hosts = provisioner.prepare(applicationId, cluster, capacity, 1, null); + List<HostSpec> hosts = provisioner.prepare(applicationId, cluster, capacity, null); NestedTransaction transaction = new NestedTransaction().add(new CuratorTransaction(curator)); provisioner.activate(transaction, applicationId, hosts); transaction.commit(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index cf93e8ecf6e..067d578a440 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java @@ -148,9 +148,9 @@ public class OperatorChangeApplicationMaintainerTest { new InMemoryFlagSource()); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.fromCount(wantedNodesApp1, nodeResources), 1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.fromCount(wantedNodesApp2, nodeResources), 1), - app3, new MockDeployer.ApplicationContext(app3, clusterApp3, Capacity.fromRequiredNodeType(NodeType.proxy), 0)) ; + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.fromCount(wantedNodesApp1, 1, nodeResources)), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.fromCount(wantedNodesApp2, 1, nodeResources)), + app3, new MockDeployer.ApplicationContext(app3, clusterApp3, Capacity.fromRequiredNodeType(NodeType.proxy))) ; this.deployer = new MockDeployer(provisioner, nodeRepository.clock(), apps); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java index 4ca88c10bfe..18d023400f8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java @@ -258,8 +258,8 @@ public class PeriodicApplicationMaintainerTest { new InMemoryFlagSource()); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.fromCount(wantedNodesApp1, nodeResources), 1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.fromCount(wantedNodesApp2, nodeResources), 1)); + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.fromCount(wantedNodesApp1, 1, nodeResources)), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.fromCount(wantedNodesApp2, 1, nodeResources))); this.deployer = new MockDeployer(provisioner, nodeRepository.clock(), apps); this.maintainer = new TestablePeriodicApplicationMaintainer(deployer, nodeRepository, Duration.ofDays(1), // Long duration to prevent scheduled runs during test Duration.ofMinutes(30)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java index b4e713ae492..f0b0beff696 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java @@ -48,8 +48,8 @@ public class RebalancerTest { MetricsReporterTest.TestMetric metric = new MetricsReporterTest.TestMetric(); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( - cpuApp, new MockDeployer.ApplicationContext(cpuApp, clusterSpec("c"), Capacity.fromCount(1, cpuResources), 1), - memApp, new MockDeployer.ApplicationContext(memApp, clusterSpec("c"), Capacity.fromCount(1, memResources), 1)); + cpuApp, new MockDeployer.ApplicationContext(cpuApp, clusterSpec("c"), Capacity.fromCount(1, 1, cpuResources)), + memApp, new MockDeployer.ApplicationContext(memApp, clusterSpec("c"), Capacity.fromCount(1, 1, memResources))); MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), apps); Rebalancer rebalancer = new Rebalancer(deployer, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java index b4f55c437cd..8aacf0cf067 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java @@ -61,7 +61,7 @@ public class ReservationExpirerTest { nodeRepository.setReady(nodes, Agent.system, getClass().getSimpleName()); ApplicationId applicationId = new ApplicationId.Builder().tenant("foo").applicationName("bar").instanceName("fuz").build(); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - provisioner.prepare(applicationId, cluster, Capacity.fromCount(2, new NodeResources(2, 8, 50, 1)), 1, null); + provisioner.prepare(applicationId, cluster, Capacity.fromCount(2, 1, new NodeResources(2, 8, 50, 1)), null); assertEquals(2, nodeRepository.getNodes(NodeType.tenant, Node.State.reserved).size()); // Reservation times out diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index 78600d360c9..2f2adde1ab2 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java @@ -98,7 +98,7 @@ public class RetiredExpirerTest { MockDeployer deployer = new MockDeployer(provisioner, clock, - Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(wantedNodes, nodeResources), 1))); + Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(wantedNodes, 1, nodeResources)))); createRetiredExpirer(deployer).run(); assertEquals(3, nodeRepository.getNodes(applicationId, Node.State.active).size()); assertEquals(4, nodeRepository.getNodes(applicationId, Node.State.inactive).size()); @@ -127,7 +127,7 @@ public class RetiredExpirerTest { MockDeployer deployer = new MockDeployer(provisioner, clock, - Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(2, nodeResources), 1))); + Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(2, 1, nodeResources)))); createRetiredExpirer(deployer).run(); assertEquals(2, nodeRepository.getNodes(applicationId, Node.State.active).size()); assertEquals(6, nodeRepository.getNodes(applicationId, Node.State.inactive).size()); @@ -161,7 +161,7 @@ public class RetiredExpirerTest { clock, Collections.singletonMap( applicationId, - new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(wantedNodes, nodeResources), 1))); + new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromCount(wantedNodes, 1, nodeResources)))); // Allow the 1st and 3rd retired nodes permission to inactivate doNothing() @@ -197,7 +197,7 @@ public class RetiredExpirerTest { } private void activate(ApplicationId applicationId, ClusterSpec cluster, int nodes, int groups, NodeRepositoryProvisioner provisioner) { - List<HostSpec> hosts = provisioner.prepare(applicationId, cluster, Capacity.fromCount(nodes, nodeResources), groups, null); + List<HostSpec> hosts = provisioner.prepare(applicationId, cluster, Capacity.fromCount(nodes, groups, nodeResources), null); NestedTransaction transaction = new NestedTransaction().add(new CuratorTransaction(curator)); provisioner.activate(transaction, applicationId, hosts); transaction.commit(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java index 1d028f13340..b4169cfa1a8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java @@ -45,7 +45,7 @@ public class AclProvisioningTest { // Allocate 2 nodes ApplicationId application = tester.makeApplicationId(); - List<Node> activeNodes = tester.deploy(application, Capacity.fromCount(2, new NodeResources(1, 4, 10, 1), false, true)); + List<Node> activeNodes = tester.deploy(application, Capacity.fromCount(2, 1, new NodeResources(1, 4, 10, 1), false, true)); assertEquals(2, activeNodes.size()); // Get trusted nodes for the first active node @@ -210,7 +210,7 @@ public class AclProvisioningTest { } private List<Node> deploy(ApplicationId application, int nodeCount) { - return tester.deploy(application, Capacity.fromCount(nodeCount, nodeResources)); + return tester.deploy(application, Capacity.fromCount(nodeCount, 1, nodeResources)); } private static void assertAcls(List<List<Node>> expected, NodeAcl actual) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java index 7c315a83ddc..13068f81527 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java @@ -95,7 +95,7 @@ public class DockerProvisioningTest { // Activate the zone-app, thereby allocating the parents List<HostSpec> hosts = tester.prepare(zoneApplication, ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("zone-app")).vespaVersion(wantedVespaVersion).build(), - Capacity.fromRequiredNodeType(NodeType.host), 1); + Capacity.fromRequiredNodeType(NodeType.host)); tester.activate(zoneApplication, hosts); // Try allocating tenants again @@ -298,8 +298,7 @@ public class DockerProvisioningTest { private void prepareAndActivate(ApplicationId application, int nodeCount, boolean exclusive, ProvisioningTester tester) { Set<HostSpec> hosts = new HashSet<>(tester.prepare(application, ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("myContainer")).vespaVersion("6.39").exclusive(exclusive).build(), - Capacity.fromCount(nodeCount, Optional.of(dockerFlavor), false, true), - 1)); + Capacity.fromCount(nodeCount, 1, Optional.of(dockerFlavor), false, true))); tester.activate(application, hosts); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java index 661f379f271..4a6f23eabb7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java @@ -401,11 +401,11 @@ public class DynamicDockerAllocationTest { ApplicationId application = tester.makeApplicationId(); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("1").build(); - List<HostSpec> hosts1 = tester.prepare(application, cluster, Capacity.fromCount(2, Optional.of(NodeResources.fromLegacyName("d-2-8-50")), false, true), 1); + List<HostSpec> hosts1 = tester.prepare(application, cluster, Capacity.fromCount(2, 1, Optional.of(NodeResources.fromLegacyName("d-2-8-50")), false, true)); tester.activate(application, hosts1); NodeResources resources = new NodeResources(1.5, 8, 50, 0.3); - List<HostSpec> hosts2 = tester.prepare(application, cluster, Capacity.fromCount(2, resources), 1); + List<HostSpec> hosts2 = tester.prepare(application, cluster, Capacity.fromCount(2, 1, resources)); tester.activate(application, hosts2); assertEquals(hosts1, hosts2); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java index 273fc6bbb2d..c99f7bfd9ee 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java @@ -154,7 +154,7 @@ public class LoadBalancerProvisionerTest { @Test public void provision_load_balancers_with_dynamic_node_provisioning() { - var nodes = prepare(app1, Capacity.fromCount(2, new NodeResources(1, 4, 10, 0.3), false, true), + var nodes = prepare(app1, Capacity.fromCount(2, 1, new NodeResources(1, 4, 10, 0.3), false, true), true, clusterRequest(ClusterSpec.Type.container, ClusterSpec.Id.from("qrs"))); Supplier<LoadBalancer> lb = () -> tester.nodeRepository().loadBalancers(app1).asList().get(0); @@ -172,7 +172,7 @@ public class LoadBalancerProvisionerTest { assertSame("Load balancer is deactivated", LoadBalancer.State.inactive, lb.get().state()); // Application is redeployed - nodes = prepare(app1, Capacity.fromCount(2, new NodeResources(1, 4, 10, 0.3), false, true), + nodes = prepare(app1, Capacity.fromCount(2, 1, new NodeResources(1, 4, 10, 0.3), false, true), true, clusterRequest(ClusterSpec.Type.container, ClusterSpec.Id.from("qrs"))); assertTrue("Load balancer is reconfigured with empty reals", tester.loadBalancerService().instances().get(lb.get().id()).reals().isEmpty()); @@ -229,7 +229,7 @@ public class LoadBalancerProvisionerTest { } private Set<HostSpec> prepare(ApplicationId application, ClusterSpec... specs) { - return prepare(application, Capacity.fromCount(2, new NodeResources(1, 4, 10, 0.3), false, true), false, specs); + return prepare(application, Capacity.fromCount(2, 1, new NodeResources(1, 4, 10, 0.3), false, true), false, specs); } private Set<HostSpec> prepare(ApplicationId application, Capacity capacity, boolean dynamicDockerNodes, ClusterSpec... specs) { @@ -240,7 +240,7 @@ public class LoadBalancerProvisionerTest { } Set<HostSpec> allNodes = new LinkedHashSet<>(); for (ClusterSpec spec : specs) { - allNodes.addAll(tester.prepare(application, spec, capacity, 1, false)); + allNodes.addAll(tester.prepare(application, spec, capacity, false)); } return allNodes; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java index cb5116b541e..7d3056c953b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java @@ -103,8 +103,8 @@ public class MultigroupProvisioningTest { tester.makeReadyNodes(10, small); - deploy(application1, Capacity.fromCount(1, Optional.of(small), true, true), 1, tester); - deploy(application1, Capacity.fromCount(2, Optional.of(small), true, true), 2, tester); + deploy(application1, Capacity.fromCount(1, 1, Optional.of(small), true, true), tester); + deploy(application1, Capacity.fromCount(2, 2, Optional.of(small), true, true), tester); } @Test @@ -116,8 +116,8 @@ public class MultigroupProvisioningTest { tester.makeReadyNodes(10, small); tester.makeReadyNodes(10, large); - deploy(application1, Capacity.fromCount(1, Optional.of(small), true, true), 1, tester); - deploy(application1, Capacity.fromCount(2, Optional.of(large), true, true), 2, tester); + deploy(application1, Capacity.fromCount(1, 1, Optional.of(small), true, true), tester); + deploy(application1, Capacity.fromCount(2, 2, Optional.of(large), true, true), tester); } @Test @@ -139,7 +139,7 @@ public class MultigroupProvisioningTest { tester.clock(), Collections.singletonMap(application1, new MockDeployer.ApplicationContext(application1, cluster(), - Capacity.fromCount(8, Optional.of(large), false, true), 1))); + Capacity.fromCount(8, 1, Optional.of(large), false, true)))); new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), Duration.ofHours(12)).run(); @@ -148,21 +148,21 @@ public class MultigroupProvisioningTest { } private void deploy(ApplicationId application, int nodeCount, int groupCount, NodeResources resources, ProvisioningTester tester) { - deploy(application, Capacity.fromCount(nodeCount, Optional.of(resources), false, true), groupCount, tester); + deploy(application, Capacity.fromCount(nodeCount, groupCount, Optional.of(resources), false, true), tester); } private void deploy(ApplicationId application, int nodeCount, int groupCount, ProvisioningTester tester) { - deploy(application, Capacity.fromCount(nodeCount, Optional.of(large), false, true), groupCount, tester); + deploy(application, Capacity.fromCount(nodeCount, groupCount, Optional.of(large), false, true), tester); } - private void deploy(ApplicationId application, Capacity capacity, int wantedGroups, ProvisioningTester tester) { - int nodeCount = capacity.nodeCount(); + private void deploy(ApplicationId application, Capacity capacity, ProvisioningTester tester) { + int nodeCount = capacity.nodes(); NodeResources nodeResources = capacity.nodeResources().get(); int previousActiveNodeCount = tester.getNodes(application, Node.State.active).resources(nodeResources).size(); - tester.activate(application, prepare(application, capacity, wantedGroups, tester)); + tester.activate(application, prepare(application, capacity, tester)); assertEquals("Superfluous nodes are retired, but no others - went from " + previousActiveNodeCount + " to " + nodeCount + " nodes", - Math.max(0, previousActiveNodeCount - capacity.nodeCount()), + Math.max(0, previousActiveNodeCount - capacity.nodes()), tester.getNodes(application, Node.State.active).retired().resources(nodeResources).size()); assertEquals("Other flavors are retired", 0, tester.getNodes(application, Node.State.active).not().retired().not().resources(nodeResources).size()); @@ -187,26 +187,26 @@ public class MultigroupProvisioningTest { ClusterSpec.Group group = node.allocation().get().membership().cluster().group().get(); nonretiredGroups.put(group, nonretiredGroups.getOrDefault(group, 0) + 1); - if (wantedGroups > 1) - assertTrue("Group indexes are always in [0, wantedGroups>", group.index() < wantedGroups); + if (capacity.groups() > 1) + assertTrue("Group indexes are always in [0, wantedGroups>", group.index() < capacity.groups()); } assertEquals("Total nonretired nodes", nodeCount, indexes.size()); - assertEquals("Total nonretired groups", wantedGroups, nonretiredGroups.size()); + assertEquals("Total nonretired groups", capacity.groups(), nonretiredGroups.size()); for (Integer groupSize : nonretiredGroups.values()) - assertEquals("Group size", (long)nodeCount / wantedGroups, (long)groupSize); + assertEquals("Group size", (long)nodeCount / capacity.groups(), (long)groupSize); Map<ClusterSpec.Group, Integer> allGroups = new HashMap<>(); for (Node node : tester.getNodes(application, Node.State.active).resources(nodeResources)) { ClusterSpec.Group group = node.allocation().get().membership().cluster().group().get(); allGroups.put(group, nonretiredGroups.getOrDefault(group, 0) + 1); } - assertEquals("No additional groups are retained containing retired nodes", wantedGroups, allGroups.size()); + assertEquals("No additional groups are retained containing retired nodes", capacity.groups(), allGroups.size()); } private ClusterSpec cluster() { return ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); } - private Set<HostSpec> prepare(ApplicationId application, Capacity capacity, int groupCount, ProvisioningTester tester) { - return new HashSet<>(tester.prepare(application, cluster(), capacity, groupCount)); + private Set<HostSpec> prepare(ApplicationId application, Capacity capacity, ProvisioningTester tester) { + return new HashSet<>(tester.prepare(application, cluster(), capacity)); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java index f4a65244e6f..8420bdeacfe 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java @@ -93,7 +93,7 @@ public class NodeTypeProvisioningTest { tester.provisioner(), tester.clock(), Collections.singletonMap( - application, new MockDeployer.ApplicationContext(application, clusterSpec, capacity, 1))); + application, new MockDeployer.ApplicationContext(application, clusterSpec, capacity))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10)); @@ -157,7 +157,7 @@ public class NodeTypeProvisioningTest { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), Collections.singletonMap(application, - new MockDeployer.ApplicationContext(application, clusterSpec, capacity, 1))); + new MockDeployer.ApplicationContext(application, clusterSpec, capacity))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, @@ -263,7 +263,7 @@ public class NodeTypeProvisioningTest { } private List<HostSpec> deployProxies(ApplicationId application, ProvisioningTester tester) { - return tester.prepare(application, clusterSpec, capacity, 1); + return tester.prepare(application, clusterSpec, capacity); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index 931d87a3265..89fcba83bd0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -514,7 +514,7 @@ public class ProvisioningTest { tester.makeReadyNodes(4, defaultResources); ApplicationId application = tester.makeApplicationId(); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("music")).vespaVersion("4.5.6").build(); - tester.prepare(application, cluster, Capacity.fromCount(5, Optional.empty(), false, false), 1); + tester.prepare(application, cluster, Capacity.fromCount(5, 1, Optional.empty(), false, false)); // No exception; Success } @@ -537,8 +537,8 @@ public class ProvisioningTest { @Test public void want_to_retire_but_cannot_fail() { - Capacity capacity = Capacity.fromCount(5, Optional.of(defaultResources), false, true); - Capacity capacityFORCED = Capacity.fromCount(5, Optional.of(defaultResources), false, false); + Capacity capacity = Capacity.fromCount(5, 1, Optional.of(defaultResources), false, true); + Capacity capacityFORCED = Capacity.fromCount(5, 1, Optional.of(defaultResources), false, false); ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); @@ -548,14 +548,14 @@ public class ProvisioningTest { tester.makeReadyNodes(10, defaultResources); // Allocate 5 nodes ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("music")).vespaVersion("4.5.6").build(); - tester.activate(application, tester.prepare(application, cluster, capacity, 1)); + tester.activate(application, tester.prepare(application, cluster, capacity)); assertEquals(5, NodeList.copyOf(tester.nodeRepository().getNodes(application, Node.State.active)).not().retired().size()); assertEquals(0, NodeList.copyOf(tester.nodeRepository().getNodes(application, Node.State.active)).retired().size()); // Mark the nodes as want to retire tester.nodeRepository().getNodes(application, Node.State.active).forEach(node -> tester.patchNode(node.with(node.status().withWantToRetire(true)))); // redeploy without allow failing - tester.activate(application, tester.prepare(application, cluster, capacityFORCED, 1)); + tester.activate(application, tester.prepare(application, cluster, capacityFORCED)); // Nodes are not retired since that is unsafe when we cannot fail assertEquals(5, NodeList.copyOf(tester.nodeRepository().getNodes(application, Node.State.active)).not().retired().size()); @@ -564,7 +564,7 @@ public class ProvisioningTest { tester.nodeRepository().getNodes(application, Node.State.active).forEach(node -> assertTrue(node.status().wantToRetire())); // redeploy with allowing failing - tester.activate(application, tester.prepare(application, cluster, capacity, 1)); + tester.activate(application, tester.prepare(application, cluster, capacity)); // ... old nodes are now retired assertEquals(5, NodeList.copyOf(tester.nodeRepository().getNodes(application, Node.State.active)).not().retired().size()); assertEquals(5, NodeList.copyOf(tester.nodeRepository().getNodes(application, Node.State.active)).retired().size()); @@ -718,14 +718,12 @@ public class ProvisioningTest { // Application allocates two content nodes initially, with cluster type content ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("music")).vespaVersion("1.2.3").build(); var initialNodes = tester.activate(application, tester.prepare(application, cluster, - Capacity.fromCount(2, defaultResources, false, false), - 1)); + Capacity.fromCount(2, 1, defaultResources, false, false))); // Application is redeployed with cluster type combined cluster = ClusterSpec.request(ClusterSpec.Type.combined, ClusterSpec.Id.from("music")).vespaVersion("1.2.3").build(); var newNodes = tester.activate(application, tester.prepare(application, cluster, - Capacity.fromCount(2, defaultResources, false, false), - 1)); + Capacity.fromCount(2, 1, defaultResources, false, false))); assertEquals("Node allocation remains the same", initialNodes, newNodes); assertEquals("Cluster type is updated", @@ -735,8 +733,7 @@ public class ProvisioningTest { // Application is redeployed with cluster type content again cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("music")).vespaVersion("1.2.3").build(); newNodes = tester.activate(application, tester.prepare(application, cluster, - Capacity.fromCount(2, defaultResources, false, false), - 1)); + Capacity.fromCount(2, 1, defaultResources, false, false))); assertEquals("Node allocation remains the same", initialNodes, newNodes); assertEquals("Cluster type is updated", Set.of(ClusterSpec.Type.content), @@ -773,7 +770,7 @@ public class ProvisioningTest { allHosts.addAll(content0); allHosts.addAll(content1); - Function<Integer, Capacity> capacity = count -> Capacity.fromCount(count, Optional.empty(), required, true); + Function<Integer, Capacity> capacity = count -> Capacity.fromCount(count, 1, Optional.empty(), required, true); int expectedContainer0Size = tester.capacityPolicies().decideSize(capacity.apply(container0Size), containerCluster0, application); int expectedContainer1Size = tester.capacityPolicies().decideSize(capacity.apply(container1Size), containerCluster1, application); int expectedContent0Size = tester.capacityPolicies().decideSize(capacity.apply(content0Size), contentCluster0, application); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index c0ab137066c..4119a32cd60 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -127,19 +127,19 @@ public class ProvisioningTester { } public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, int nodeCount, int groups, boolean required, NodeResources resources) { - return prepare(application, cluster, Capacity.fromCount(nodeCount, Optional.ofNullable(resources), required, true), groups); + return prepare(application, cluster, Capacity.fromCount(nodeCount, groups, Optional.ofNullable(resources), required, true)); } - public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity capacity, int groups) { - return prepare(application, cluster, capacity, groups, true); + public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity capacity) { + return prepare(application, cluster, capacity, true); } - public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity capacity, int groups, boolean idempotentPrepare) { + public List<HostSpec> prepare(ApplicationId application, ClusterSpec cluster, Capacity capacity, boolean idempotentPrepare) { Set<String> reservedBefore = toHostNames(nodeRepository.getNodes(application, Node.State.reserved)); Set<String> inactiveBefore = toHostNames(nodeRepository.getNodes(application, Node.State.inactive)); - List<HostSpec> hosts1 = provisioner.prepare(application, cluster, capacity, groups, provisionLogger); + List<HostSpec> hosts1 = provisioner.prepare(application, cluster, capacity, provisionLogger); if (idempotentPrepare) { // prepare twice to ensure idempotence - List<HostSpec> hosts2 = provisioner.prepare(application, cluster, capacity, groups, provisionLogger); + List<HostSpec> hosts2 = provisioner.prepare(application, cluster, capacity, provisionLogger); assertEquals(hosts1, hosts2); } Set<String> newlyActivated = toHostNames(nodeRepository.getNodes(application, Node.State.reserved)); @@ -160,7 +160,7 @@ public class ProvisioningTester { public void prepareAndActivateInfraApplication(ApplicationId application, NodeType nodeType, Version version) { ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from(nodeType.toString())).vespaVersion(version).build(); Capacity capacity = Capacity.fromRequiredNodeType(nodeType); - List<HostSpec> hostSpecs = prepare(application, cluster, capacity, 1, true); + List<HostSpec> hostSpecs = prepare(application, cluster, capacity, true); activate(application, hostSpecs); } @@ -333,11 +333,9 @@ public class ProvisioningTester { nodeRepository.setReady(nodes, Agent.system, getClass().getSimpleName()); ConfigServerApplication application = new ConfigServerApplication(); - List<HostSpec> hosts = prepare( - application.getApplicationId(), - application.getClusterSpecWithVersion(configServersVersion), - application.getCapacity(), - 1); + List<HostSpec> hosts = prepare(application.getApplicationId(), + application.getClusterSpecWithVersion(configServersVersion), + application.getCapacity()); activate(application.getApplicationId(), new HashSet<>(hosts)); return nodeRepository.getNodes(application.getApplicationId(), Node.State.active); } @@ -409,9 +407,8 @@ public class ProvisioningTester { public void deployZoneApp() { ApplicationId applicationId = makeApplicationId(); List<HostSpec> list = prepare(applicationId, - ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(), - Capacity.fromRequiredNodeType(NodeType.host), - 1); + ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(), + Capacity.fromRequiredNodeType(NodeType.host)); activate(applicationId, Set.copyOf(list)); } @@ -420,7 +417,7 @@ public class ProvisioningTester { } public List<Node> deploy(ApplicationId application, Capacity capacity) { - List<HostSpec> prepared = prepare(application, clusterSpec(), capacity, 1); + List<HostSpec> prepared = prepare(application, clusterSpec(), capacity); activate(application, Set.copyOf(prepared)); return getNodes(application, Node.State.active).asList(); } diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java index 299ea47b257..d113b34f3c6 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java @@ -32,6 +32,7 @@ import java.util.stream.Collectors; * @author freva */ public abstract class InfraApplication implements InfraApplicationApi { + private static final TenantName TENANT_NAME = TenantName.from("hosted-vespa"); private final ApplicationId applicationId; diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/InfraApplicationApi.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/InfraApplicationApi.java index b4b61682a33..4e7a557ffc7 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/InfraApplicationApi.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/InfraApplicationApi.java @@ -14,7 +14,9 @@ import java.util.Optional; * @author hakonhall */ public interface InfraApplicationApi { + ApplicationId getApplicationId(); Capacity getCapacity(); ClusterSpec getClusterSpecWithVersion(Version version); + } |