diff options
15 files changed, 73 insertions, 66 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index a4a4c42d9c1..5406d820498 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -264,7 +264,8 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr .cluster(endpoint.clusterName()) .first() .flatMap(LoadBalancer::instance) - .flatMap(LoadBalancerInstance::idSeed)); + .map(LoadBalancerInstance::idSeed) + .orElseThrow(() -> new IllegalArgumentException("no load balancer instance for '" + endpoint + "'"))); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java index 4dbf891b1b7..818858ef385 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java @@ -20,7 +20,7 @@ import java.util.Set; */ public class LoadBalancerInstance { - private final Optional<String> idSeed; + private final String idSeed; private final Optional<DomainName> hostname; private final Optional<String> ip4Address; private final Optional<String> ip6Address; @@ -32,7 +32,7 @@ public class LoadBalancerInstance { private final List<PrivateServiceId> serviceIds; private final CloudAccount cloudAccount; - public LoadBalancerInstance(Optional<String> idSeed, Optional<DomainName> hostname, Optional<String> ip4Address, Optional<String> ip6Address, + public LoadBalancerInstance(String idSeed, Optional<DomainName> hostname, Optional<String> ip4Address, Optional<String> ip6Address, Optional<DnsZone> dnsZone, Set<Integer> ports, Set<String> networks, Set<Real> reals, ZoneEndpoint settings, List<PrivateServiceId> serviceIds, CloudAccount cloudAccount) { this.idSeed = Objects.requireNonNull(idSeed, "idSeed must be non-null"); @@ -54,7 +54,7 @@ public class LoadBalancerInstance { } /** A unique seed to use when generating cloud-specific resource IDs for this load balancer instance. */ - public Optional<String> idSeed() { + public String idSeed() { return idSeed; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java index 6ddde1151dd..9e62edf8d4b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java @@ -7,8 +7,6 @@ import com.yahoo.config.provision.EndpointsChecker.Endpoint; import com.yahoo.config.provision.EndpointsChecker.HealthChecker; import com.yahoo.config.provision.NodeType; -import java.util.Optional; - /** * A managed load balance service. * @@ -20,18 +18,10 @@ public interface LoadBalancerService { * Provisions load balancers from the given specification. Implementations are expected to be idempotent * * @param spec Load balancer specification - * @return The provisioned load balancer instance - */ - default LoadBalancerInstance provision(LoadBalancerSpec spec) { return provision(spec, Optional.empty()); } - - /** - * Provisions load balancers from the given specification. Implementations are expected to be idempotent - * - * @param spec Load balancer specification * @param idSeed Seed for generating a unique ID for the load balancer instance * @return The provisioned load balancer instance */ - LoadBalancerInstance provision(LoadBalancerSpec spec, Optional<String> idSeed); + LoadBalancerInstance provision(LoadBalancerSpec spec, String idSeed); /** * Configures load balancers for the given specification. Implementations are expected to be idempotent @@ -56,7 +46,7 @@ public interface LoadBalancerService { boolean supports(NodeType nodeType, ClusterSpec.Type clusterType); /** See {@link HealthChecker#healthy(Endpoint)}. */ - Availability healthy(Endpoint endpoint, Optional<String> idSeed); + Availability healthy(Endpoint endpoint, String idSeed); /** Load balancer protocols */ enum Protocol { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java index 03ff17c6ebc..2b1007f75d4 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java @@ -26,13 +26,11 @@ import static java.util.stream.Collectors.toMap; public class LoadBalancerServiceMock implements LoadBalancerService { private record Key(ApplicationId application, ClusterSpec.Id cluster, String idSeed) { - @Override public int hashCode() { return idSeed == null ? Objects.hash(application, cluster) : Objects.hash(idSeed); } + @Override public int hashCode() { return idSeed.hashCode(); } @Override public boolean equals(Object o) { if (o == this) return true; if ( ! (o instanceof Key key)) return false; - if (idSeed != null) return Objects.equals(idSeed, key.idSeed); - return Objects.equals(application, key.application) && - Objects.equals(cluster, key.cluster); + return Objects.equals(idSeed, key.idSeed); } } private final Map<Key, LoadBalancerInstance> instances = new HashMap<>(); @@ -68,7 +66,7 @@ public class LoadBalancerServiceMock implements LoadBalancerService { } @Override - public LoadBalancerInstance provision(LoadBalancerSpec spec, Optional<String> idSeed) { + public LoadBalancerInstance provision(LoadBalancerSpec spec, String idSeed) { if (throwOnCreate) throw new IllegalStateException("Did not expect a new load balancer to be created"); var instance = new LoadBalancerInstance( idSeed, @@ -82,13 +80,13 @@ public class LoadBalancerServiceMock implements LoadBalancerService { spec.settings(), spec.settings().isPrivateEndpoint() ? List.of(PrivateServiceId.of("service")) : List.of(), spec.cloudAccount()); - instances.put(new Key(spec.application(), spec.cluster(), idSeed.orElse(null)), instance); + instances.put(new Key(spec.application(), spec.cluster(), idSeed), instance); return instance; } @Override public LoadBalancerInstance configure(LoadBalancerInstance instance, LoadBalancerSpec spec, boolean force) { - var id = new Key(spec.application(), spec.cluster(), instance.idSeed().orElse(null)); + var id = new Key(spec.application(), spec.cluster(), instance.idSeed()); var oldInstance = requireNonNull(instances.get(id), "expected existing load balancer " + id); if (!force && !oldInstance.reals().isEmpty() && spec.reals().isEmpty()) { throw new IllegalArgumentException("Refusing to remove all reals from load balancer " + id); @@ -102,20 +100,20 @@ public class LoadBalancerServiceMock implements LoadBalancerService { @Override public void reallocate(LoadBalancerInstance provisioned, LoadBalancerSpec spec) { - instances.put(new Key(spec.application(), spec.cluster(), provisioned.idSeed().get()), - requireNonNull(instances.remove(new Key(null, null, provisioned.idSeed().get())))); // ᕙ༼◕_◕༽ᕤ + instances.put(new Key(spec.application(), spec.cluster(), provisioned.idSeed()), + requireNonNull(instances.remove(new Key(null, null, provisioned.idSeed())))); // ᕙ༼◕_◕༽ᕤ } @Override public void remove(LoadBalancer loadBalancer) { requireNonNull(instances.remove(new Key(loadBalancer.id().application(), loadBalancer.id().cluster(), - loadBalancer.instance().get().idSeed().orElse(null))), + loadBalancer.instance().get().idSeed())), "expected load balancer to exist: " + loadBalancer.id()); } @Override - public Availability healthy(Endpoint endpoint, Optional<String> idSeed) { + public Availability healthy(Endpoint endpoint, String idSeed) { return Availability.ready; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java index 883b8dec944..f6de166ed01 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java @@ -30,24 +30,11 @@ public class SharedLoadBalancerService implements LoadBalancerService { } @Override - public LoadBalancerInstance provision(LoadBalancerSpec spec, Optional<String> idSeed) { - return create(spec); - } - - @Override - public LoadBalancerInstance configure(LoadBalancerInstance instance, LoadBalancerSpec spec, boolean force) { - return instance.with(spec.reals(), spec.settings(), Optional.empty()); - } - - @Override - public void reallocate(LoadBalancerInstance provisioned, LoadBalancerSpec spec) { - throw new UnsupportedOperationException("reallocate is not supported with " + getClass()); - } - - private LoadBalancerInstance create(LoadBalancerSpec spec) { + public LoadBalancerInstance provision(LoadBalancerSpec spec, String idSeed) { if ( ! spec.settings().isPublicEndpoint()) throw new IllegalArgumentException("non-public endpoints is not supported with " + getClass()); - return new LoadBalancerInstance(Optional.empty(), + + return new LoadBalancerInstance(idSeed, Optional.of(DomainName.of(vipHostname)), Optional.empty(), Optional.empty(), @@ -61,6 +48,16 @@ public class SharedLoadBalancerService implements LoadBalancerService { } @Override + public LoadBalancerInstance configure(LoadBalancerInstance instance, LoadBalancerSpec spec, boolean force) { + return instance.with(spec.reals(), spec.settings(), Optional.empty()); + } + + @Override + public void reallocate(LoadBalancerInstance provisioned, LoadBalancerSpec spec) { + throw new UnsupportedOperationException("reallocate is not supported with " + getClass()); + } + + @Override public void remove(LoadBalancer loadBalancer) { // Do nothing, we have no external state to modify } @@ -78,7 +75,7 @@ public class SharedLoadBalancerService implements LoadBalancerService { } @Override - public Availability healthy(Endpoint endpoint, Optional<String> idSeed) { + public Availability healthy(Endpoint endpoint, String idSeed) { return Availability.ready; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java index d511570881b..31d79d34c94 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java @@ -445,7 +445,7 @@ public class CuratorDb { } public Optional<LoadBalancer> readLoadBalancer(LoadBalancerId id) { - return read(loadBalancerPath(id), LoadBalancerSerializer::fromJson); + return read(loadBalancerPath(id), bytes -> LoadBalancerSerializer.fromJson(id, bytes)); } public void writeLoadBalancer(LoadBalancer loadBalancer, LoadBalancer.State fromState) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java index 756692917e3..e351a4cc59f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java @@ -17,6 +17,7 @@ import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.PrivateServiceId; import com.yahoo.vespa.hosted.provision.lb.Real; +import com.yahoo.vespa.hosted.provision.provisioning.LoadBalancerProvisioner; import java.io.IOException; import java.io.UncheckedIOException; @@ -71,7 +72,7 @@ public class LoadBalancerSerializer { Cursor root = slime.setObject(); root.setString(idField, loadBalancer.id().serializedForm()); - loadBalancer.instance().flatMap(LoadBalancerInstance::idSeed).ifPresent(idSeed -> root.setString(idSeedField, idSeed)); + loadBalancer.instance().map(LoadBalancerInstance::idSeed).ifPresent(idSeed -> root.setString(idSeedField, idSeed)); loadBalancer.instance().flatMap(LoadBalancerInstance::hostname).ifPresent(hostname -> root.setString(hostnameField, hostname.value())); loadBalancer.instance().flatMap(LoadBalancerInstance::ip4Address).ifPresent(ip -> root.setString(lbIpAddressField, ip)); loadBalancer.instance().flatMap(LoadBalancerInstance::ip6Address).ifPresent(ip -> root.setString(lbIp6AddressField, ip)); @@ -110,7 +111,7 @@ public class LoadBalancerSerializer { } } - public static LoadBalancer fromJson(byte[] data) { + public static LoadBalancer fromJson(LoadBalancerId id, byte[] data) { Cursor object = SlimeUtils.jsonToSlime(data).get(); Set<Real> reals = new LinkedHashSet<>(); @@ -127,7 +128,8 @@ public class LoadBalancerSerializer { Set<String> networks = new LinkedHashSet<>(); object.field(networksField).traverse((ArrayTraverser) (i, network) -> networks.add(network.asString())); - Optional<String> idSeed = SlimeUtils.optionalString(object.field(idSeedField)); + // TODO jonmv: remove fallback after data is re-written. + String idSeed = SlimeUtils.optionalString(object.field(idSeedField)).orElse(id.application().tenant().value() + id.application().application().value() + id.application().instance().value() + id.cluster().value()); Optional<DomainName> hostname = SlimeUtils.optionalString(object.field(hostnameField)).map(DomainName::of); Optional<String> ip4Address = SlimeUtils.optionalString(object.field(lbIpAddressField)); Optional<String> ip6Address = SlimeUtils.optionalString(object.field(lbIp6AddressField)); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java index 24bca326f82..0964a9d9779 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java @@ -268,7 +268,7 @@ public class LoadBalancerProvisioner { log.log(Level.INFO, () -> "Provisioning instance for " + id); try { LoadBalancerSpec spec = new LoadBalancerSpec(id.application(), id.cluster(), reals, settings, requested.cloudAccount()); - return provisionFromPool(spec, requested.type()).orElseGet(() -> service.provision(spec)) + return provisionFromPool(spec, requested.type()).orElseGet(() -> service.provision(spec, toSeed(id, requested.type()))) // Provisioning a private endpoint service requires hard resources to be ready, so we delay it until activation. .withServiceIds(currentLoadBalancer.flatMap(LoadBalancer::instance).map(LoadBalancerInstance::serviceIds).orElse(List.of())); } @@ -328,8 +328,9 @@ public class LoadBalancerProvisioner { while (head - tail < size) { ClusterSpec.Id slot = slotId(head); LoadBalancerSpec spec = preProvisionSpec(slot, nodeRepository.zone().cloud().account()); - db.writeLoadBalancer(new LoadBalancer(new LoadBalancerId(preProvisionOwner, slot), - Optional.of(service.provision(spec, Optional.of(slot.value()))), + LoadBalancerId id = new LoadBalancerId(preProvisionOwner, slot); + db.writeLoadBalancer(new LoadBalancer(id, + Optional.of(service.provision(spec, toSeed(id, NodeType.tenant))), State.active, // Keep the expirer away. nodeRepository.clock().instant()), null); @@ -337,6 +338,21 @@ public class LoadBalancerProvisioner { } } + public static String toSeed(LoadBalancerId id, NodeType type) { + return type == NodeType.tenant ? toSeed(id) : toLegacySeed(id.application(), id.cluster()); + } + + public static String toSeed(LoadBalancerId id) { + return id.serializedForm(); + } + + public static String toLegacySeed(ApplicationId application, ClusterSpec.Id cluster) { + return application.tenant().value() + + application.application().value() + + application.instance().value() + + cluster.value(); // ಠ_ಠ + } + /** Reconfigure a load balancer instance, if necessary */ private LoadBalancerInstance configureInstance(LoadBalancerId id, NodeList nodes, LoadBalancer currentLoadBalancer, diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionServiceProvider.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionServiceProvider.java index 20202ca7a74..6aafea637aa 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionServiceProvider.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionServiceProvider.java @@ -25,7 +25,7 @@ public interface ProvisionServiceProvider { } interface ProtoHealthChecker { - Availability healthy(Endpoint endpoint, Optional<String> idSeed); + Availability healthy(Endpoint endpoint, String idSeed); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java index f1a10134c7a..dd63d18ea38 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java @@ -90,7 +90,7 @@ public class LoadBalancersResponse extends SlimeJsonResponse { } instance.serviceId().ifPresent(serviceId -> lbObject.setString("serviceId", serviceId.value())); lbObject.setBool("public", instance.settings().isPublicEndpoint()); - instance.idSeed().ifPresent(idSeed -> lbObject.setString("idSeed", idSeed)); + lbObject.setString("idSeed", instance.idSeed()); }); lb.instance() .map(LoadBalancerInstance::cloudAccount) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java index 7475a3654b7..91d04ba5ff9 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java @@ -31,7 +31,7 @@ public class SharedLoadBalancerServiceTest { LoadBalancerSpec spec = new LoadBalancerSpec(applicationId, clusterId, reals, ZoneEndpoint.defaultEndpoint, CloudAccount.empty); - var lb = loadBalancerService.configure(loadBalancerService.provision(spec), spec, false); + var lb = loadBalancerService.configure(loadBalancerService.provision(spec, "seed"), spec, false); assertEquals(Optional.of(HostName.of("vip.example.com")), lb.hostname()); assertEquals(Optional.empty(), lb.dnsZone()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java index 0d3c1994ad8..c4688f0b3dd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java @@ -39,7 +39,7 @@ public class LoadBalancerSerializerTest { { var loadBalancer = new LoadBalancer(loadBalancerId, Optional.of(new LoadBalancerInstance( - Optional.of("1"), + "1", Optional.of(DomainName.of("lb-host")), Optional.empty(), Optional.empty(), @@ -58,7 +58,7 @@ public class LoadBalancerSerializerTest { LoadBalancer.State.active, now); - var serialized = LoadBalancerSerializer.fromJson(LoadBalancerSerializer.toJson(loadBalancer)); + var serialized = LoadBalancerSerializer.fromJson(loadBalancer.id(), LoadBalancerSerializer.toJson(loadBalancer)); assertEquals(loadBalancer.id(), serialized.id()); assertEquals(loadBalancer.instance().get().idSeed(), serialized.instance().get().idSeed()); assertEquals(loadBalancer.instance().get().hostname(), serialized.instance().get().hostname()); @@ -75,7 +75,7 @@ public class LoadBalancerSerializerTest { { var loadBalancer = new LoadBalancer(loadBalancerId, Optional.of(new LoadBalancerInstance( - Optional.empty(), + "", Optional.empty(), Optional.of("1.2.3.4"), Optional.of("fd00::1"), @@ -89,7 +89,7 @@ public class LoadBalancerSerializerTest { LoadBalancer.State.active, now); - var serialized = LoadBalancerSerializer.fromJson(LoadBalancerSerializer.toJson(loadBalancer)); + var serialized = LoadBalancerSerializer.fromJson(loadBalancer.id(), LoadBalancerSerializer.toJson(loadBalancer)); assertEquals(loadBalancer.id(), serialized.id()); assertEquals(loadBalancer.instance().get().idSeed(), serialized.instance().get().idSeed()); assertEquals(loadBalancer.instance().get().hostname(), serialized.instance().get().hostname()); @@ -112,7 +112,7 @@ public class LoadBalancerSerializerTest { var now = Instant.now(); var loadBalancer = new LoadBalancer(loadBalancerId, Optional.empty(), LoadBalancer.State.reserved, now); - var serialized = LoadBalancerSerializer.fromJson(LoadBalancerSerializer.toJson(loadBalancer)); + var serialized = LoadBalancerSerializer.fromJson(loadBalancerId, LoadBalancerSerializer.toJson(loadBalancer)); assertEquals(loadBalancer.id(), serialized.id()); assertEquals(loadBalancer.instance(), serialized.instance()); assertEquals(loadBalancer.state(), serialized.state()); 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 fb59b3077f8..fce788c7e32 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 @@ -50,6 +50,7 @@ import java.util.SortedSet; import java.util.function.Supplier; import java.util.stream.Collectors; +import static com.yahoo.vespa.hosted.provision.lb.LoadBalancerSpec.preProvisionOwner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertSame; @@ -190,15 +191,15 @@ public class LoadBalancerProvisionerTest { provisioner.refreshPool(); expirer.run(); assertEquals(2, tester.nodeRepository().loadBalancers().list().size()); - assertEquals(2, tester.nodeRepository().loadBalancers().list(LoadBalancerSpec.preProvisionOwner).size()); + assertEquals(2, tester.nodeRepository().loadBalancers().list(preProvisionOwner).size()); // Provision a load balancer when the pool has two entries. ClusterSpec.Id containerCluster = ClusterSpec.Id.from("qrs"); prepare(app1, clusterRequest(ClusterSpec.Type.container, containerCluster)); List<LoadBalancer> loadBalancers = tester.nodeRepository().loadBalancers().list(app1).asList(); assertEquals(1, loadBalancers.size()); - assertEquals(1, tester.nodeRepository().loadBalancers().list(LoadBalancerSpec.preProvisionOwner).asList().size()); - assertEquals(Optional.of("1"), loadBalancers.get(0).instance().get().idSeed()); + assertEquals(1, tester.nodeRepository().loadBalancers().list(preProvisionOwner).asList().size()); + assertEquals(preProvisionOwner.serializedForm() + ":1", loadBalancers.get(0).instance().get().idSeed()); // Shrink pool to 0 entries. flagSource.withIntFlag(PermanentFlags.PRE_PROVISIONED_LB_COUNT.id(), 0); @@ -214,8 +215,8 @@ public class LoadBalancerProvisionerTest { assertThrows(IllegalStateException.class, provisioner::refreshPool).getMessage()); tester.loadBalancerService().throwOnCreate(false); provisioner.refreshPool(); - assertEquals(List.of(Optional.of("3")), - tester.nodeRepository().loadBalancers().list(LoadBalancerSpec.preProvisionOwner) + assertEquals(List.of(preProvisionOwner.serializedForm() + ":3"), + tester.nodeRepository().loadBalancers().list(preProvisionOwner) .mapToList(lb -> lb.instance().get().idSeed())); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers-single.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers-single.json index 620275bb033..bc5a04edc2f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers-single.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers-single.json @@ -7,7 +7,7 @@ "dnsZone": "zone-id-1", "hostname": "lb-hosted-vespa.pre-provision-1", "id": "tenant4:application4:instance4:id4", - "idSeed": "1", + "idSeed": "hosted-vespa:pre-provision:default:1", "instance": "instance4", "networks": [ "10.2.3.0/24", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json index e8392d92522..883820634fe 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json @@ -7,6 +7,7 @@ "dnsZone": "zone-id-1", "hostname": "lb-tenant1.application1.instance1-id1", "id": "tenant1:application1:instance1:id1", + "idSeed": "tenant1:application1:instance1:id1", "instance": "instance1", "networks": [ "10.2.3.0/24", @@ -47,6 +48,7 @@ "dnsZone": "zone-id-1", "hostname": "lb-hosted-vespa.zone-config-servers-zone-config-servers", "id": "hosted-vespa:zone-config-servers:default:zone-config-servers", + "idSeed": "hosted-vespazone-config-serversdefaultzone-config-servers", "instance": "default", "networks": [ "10.2.3.0/24", @@ -78,7 +80,7 @@ "dnsZone": "zone-id-1", "hostname": "lb-hosted-vespa.pre-provision-1", "id": "tenant4:application4:instance4:id4", - "idSeed": "1", + "idSeed": "hosted-vespa:pre-provision:default:1", "instance": "instance4", "networks": [ "10.2.3.0/24", |