diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-03-01 14:25:45 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-03-01 15:10:58 +0100 |
commit | 5fa808b3f65c3391831bc71cd83e03b6085909bf (patch) | |
tree | 6f63a9280585951c2ce3c0ca1edf05009660e383 /node-repository | |
parent | b56417b41532c00a1d24d3f7394b0c8a78f7daf8 (diff) |
Limit fields that can be mutated by a LoadBalancerService
Diffstat (limited to 'node-repository')
11 files changed, 153 insertions, 120 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 c632839ddf3..9cb08d02214 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 @@ -18,6 +18,7 @@ import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.hosted.provision.flag.Flags; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerList; +import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.maintenance.PeriodicApplicationMaintainer; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.NodeAcl; @@ -199,7 +200,8 @@ public class NodeRepository extends AbstractComponent { node.allocation().ifPresent(allocation -> { trustedNodes.addAll(candidates.owner(allocation.owner()).asList()); loadBalancers.owner(allocation.owner()).asList().stream() - .map(LoadBalancer::networks) + .map(LoadBalancer::instance) + .map(LoadBalancerInstance::networks) .forEach(trustedNetworks::addAll); }); trustedPorts.add(22); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java index 9ab4fef0a0e..a6d311604fd 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java @@ -2,13 +2,10 @@ package com.yahoo.vespa.hosted.provision.lb; import com.google.common.collect.ImmutableSortedSet; -import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.RotationName; import com.yahoo.vespa.hosted.provision.maintenance.LoadBalancerExpirer; -import java.util.Collections; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -19,26 +16,13 @@ import java.util.Set; public class LoadBalancer { private final LoadBalancerId id; - private final HostName hostname; - private final Optional<DnsZone> dnsZone; - private final Set<Integer> ports; - private final Set<String> networks; - private final Set<Real> reals; + private final LoadBalancerInstance instance; private final Set<RotationName> rotations; private final boolean inactive; - public LoadBalancer(LoadBalancerId id, HostName hostname, Optional<DnsZone> dnsZone, Set<Integer> ports, Set<String> networks, Set<Real> reals, boolean inactive) { - this(id, hostname, dnsZone, ports, networks, reals, Collections.emptySet(), inactive); - } - - public LoadBalancer(LoadBalancerId id, HostName hostname, Optional<DnsZone> dnsZone, Set<Integer> ports, - Set<String> networks, Set<Real> reals, Set<RotationName> rotations, boolean inactive) { + public LoadBalancer(LoadBalancerId id, LoadBalancerInstance instance, Set<RotationName> rotations, boolean inactive) { this.id = Objects.requireNonNull(id, "id must be non-null"); - this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null"); - this.dnsZone = Objects.requireNonNull(dnsZone, "dnsZone must be non-null"); - this.ports = ImmutableSortedSet.copyOf(requirePorts(ports)); - this.networks = ImmutableSortedSet.copyOf(Objects.requireNonNull(networks, "networks must be non-null")); - this.reals = ImmutableSortedSet.copyOf(Objects.requireNonNull(reals, "targets must be non-null")); + this.instance = Objects.requireNonNull(instance, "instance must be non-null"); this.rotations = ImmutableSortedSet.copyOf(Objects.requireNonNull(rotations, "rotations must be non-null")); this.inactive = inactive; } @@ -48,39 +32,19 @@ public class LoadBalancer { return id; } - /** Fully-qualified domain name of this load balancer. This hostname can be used for query and feed */ - public HostName hostname() { - return hostname; - } - - /** ID of the DNS zone associated with this */ - public Optional<DnsZone> dnsZone() { - return dnsZone; - } - - /** Listening port(s) of this load balancer */ - public Set<Integer> ports() { - return ports; - } - - /** Networks (CIDR blocks) of this load balancer */ - public Set<String> networks() { - return networks; - } - - /** Real servers behind this load balancer */ - public Set<Real> reals() { - return reals; - } - /** The rotations of which this is a member */ public Set<RotationName> rotations() { return rotations; } + /** The instance associated with this */ + public LoadBalancerInstance instance() { + return instance; + } + /** - * Returns whether this load balancer is inactive. Inactive load balancers cannot be re-activated, and are - * eventually removed by {@link LoadBalancerExpirer}. + * Returns whether this load balancer is inactive. Inactive load balancers are eventually removed by + * {@link LoadBalancerExpirer}. Inactive load balancers may be reactivated if a deleted cluster is redeployed. */ public boolean inactive() { return inactive; @@ -88,23 +52,7 @@ public class LoadBalancer { /** Return a copy of this that is set inactive */ public LoadBalancer deactivate() { - return new LoadBalancer(id, hostname, dnsZone, ports, networks, reals, true); - } - - /** Returns a copy of this with rotation membership set to given rotations */ - public LoadBalancer with(Set<RotationName> rotations) { - return new LoadBalancer(id, hostname, dnsZone, ports, networks, reals, rotations, inactive); - } - - private static Set<Integer> requirePorts(Set<Integer> ports) { - Objects.requireNonNull(ports, "ports must be non-null"); - if (ports.isEmpty()) { - throw new IllegalArgumentException("ports must be non-empty"); - } - if (!ports.stream().allMatch(port -> port >= 1 && port <= 65535)) { - throw new IllegalArgumentException("all ports must be >= 1 and <= 65535"); - } - return ports; + return new LoadBalancer(id, instance, rotations, true); } } 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 new file mode 100644 index 00000000000..c1b4fe9b0f2 --- /dev/null +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java @@ -0,0 +1,70 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.provision.lb; + +import com.google.common.collect.ImmutableSortedSet; +import com.yahoo.config.provision.HostName; + +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +/** + * Represents a load balancer instance. This contains the fields that are owned by a {@link LoadBalancerService} and is + * immutable. + * + * @author mpolden + */ +public class LoadBalancerInstance { + + private final HostName hostname; + private final Optional<DnsZone> dnsZone; + private final Set<Integer> ports; + private final Set<String> networks; + private final Set<Real> reals; + + public LoadBalancerInstance(HostName hostname, Optional<DnsZone> dnsZone, Set<Integer> ports, Set<String> networks, + Set<Real> reals) { + this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null"); + this.dnsZone = Objects.requireNonNull(dnsZone, "dnsZone must be non-null"); + this.ports = ImmutableSortedSet.copyOf(requirePorts(ports)); + this.networks = ImmutableSortedSet.copyOf(Objects.requireNonNull(networks, "networks must be non-null")); + this.reals = ImmutableSortedSet.copyOf(Objects.requireNonNull(reals, "targets must be non-null")); + } + + /** Fully-qualified domain name of this load balancer. This hostname can be used for query and feed */ + public HostName hostname() { + return hostname; + } + + /** ID of the DNS zone associated with this */ + public Optional<DnsZone> dnsZone() { + return dnsZone; + } + + /** Listening port(s) of this load balancer */ + public Set<Integer> ports() { + return ports; + } + + /** Networks (CIDR blocks) of this load balancer */ + public Set<String> networks() { + return networks; + } + + /** Real servers behind this load balancer */ + public Set<Real> reals() { + return reals; + } + + private static Set<Integer> requirePorts(Set<Integer> ports) { + Objects.requireNonNull(ports, "ports must be non-null"); + if (ports.isEmpty()) { + throw new IllegalArgumentException("ports must be non-empty"); + } + if (!ports.stream().allMatch(port -> port >= 1 && port <= 65535)) { + throw new IllegalArgumentException("all ports must be >= 1 and <= 65535"); + } + return ports; + } + +} 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 03285fda03c..6f45403f0e6 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 @@ -14,10 +14,10 @@ import java.util.Set; public interface LoadBalancerService { /** Create a load balancer for given application cluster. Implementations are expected to be idempotent */ - LoadBalancer create(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals); + LoadBalancerInstance create(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals); - /** Permanently remove load balancer with given ID */ - void remove(LoadBalancerId loadBalancer); + /** Permanently remove load balancer for given application cluster */ + void remove(ApplicationId application, ClusterSpec.Id cluster); /** Returns the protocol supported by this load balancer service */ Protocol 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 5639ecab273..0dddcf36762 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 @@ -29,22 +29,22 @@ public class LoadBalancerServiceMock implements LoadBalancerService { } @Override - public LoadBalancer create(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals) { - LoadBalancer loadBalancer = new LoadBalancer( - new LoadBalancerId(application, cluster), + public LoadBalancerInstance create(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals) { + LoadBalancerId id = new LoadBalancerId(application, cluster); + LoadBalancerInstance instance = new LoadBalancerInstance( HostName.from("lb-" + application.toShortString() + "-" + cluster.value()), Optional.of(new DnsZone("zone-id-1")), Collections.singleton(4443), ImmutableSet.of("10.2.3.0/24", "10.4.5.0/24"), - reals, - false); + reals); + LoadBalancer loadBalancer = new LoadBalancer(id, instance, Set.of(), false); loadBalancers.put(loadBalancer.id(), loadBalancer); - return loadBalancer; + return instance; } @Override - public void remove(LoadBalancerId loadBalancer) { - loadBalancers.remove(loadBalancer); + public void remove(ApplicationId application, ClusterSpec.Id cluster) { + loadBalancers.remove(new LoadBalancerId(application, cluster)); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java index 115581c86b0..f5fd8f61474 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; * Periodically remove inactive load balancers permanently. * * When an application is removed, any associated load balancers are only deactivated. This maintainer ensures that - * such resources are eventually freed. + * underlying load balancer instances are eventually freed. * * @author mpolden */ @@ -50,7 +50,7 @@ public class LoadBalancerExpirer extends Maintainer { continue; } try { - service.remove(loadBalancer.id()); + service.remove(loadBalancer.id().application(), loadBalancer.id().cluster()); db.removeLoadBalancer(loadBalancer.id()); } catch (Exception e) { failed.add(loadBalancer.id()); 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 87b8edf5f46..17f2d7364a6 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 @@ -11,6 +11,7 @@ import com.yahoo.vespa.config.SlimeUtils; import com.yahoo.vespa.hosted.provision.lb.DnsZone; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId; +import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.Real; import java.io.IOException; @@ -44,14 +45,14 @@ public class LoadBalancerSerializer { Cursor root = slime.setObject(); root.setString(idField, loadBalancer.id().serializedForm()); - root.setString(hostnameField, loadBalancer.hostname().toString()); - loadBalancer.dnsZone().ifPresent(dnsZone -> root.setString(dnsZoneField, dnsZone.id())); + root.setString(hostnameField, loadBalancer.instance().hostname().toString()); + loadBalancer.instance().dnsZone().ifPresent(dnsZone -> root.setString(dnsZoneField, dnsZone.id())); Cursor portArray = root.setArray(portsField); - loadBalancer.ports().forEach(portArray::addLong); + loadBalancer.instance().ports().forEach(portArray::addLong); Cursor networkArray = root.setArray(networksField); - loadBalancer.networks().forEach(networkArray::addString); + loadBalancer.instance().networks().forEach(networkArray::addString); Cursor realArray = root.setArray(realsField); - loadBalancer.reals().forEach(real -> { + loadBalancer.instance().reals().forEach(real -> { Cursor realObject = realArray.addObject(); realObject.setString(hostnameField, real.hostname().value()); realObject.setString(ipAddressField, real.ipAddress()); @@ -94,11 +95,13 @@ public class LoadBalancerSerializer { }); return new LoadBalancer(LoadBalancerId.fromSerializedForm(object.field(idField).asString()), - HostName.from(object.field(hostnameField).asString()), - optionalField(object.field(dnsZoneField), DnsZone::new), - ports, - networks, - reals, + new LoadBalancerInstance( + HostName.from(object.field(hostnameField).asString()), + optionalField(object.field(dnsZoneField), DnsZone::new), + ports, + networks, + reals + ), rotations, object.field(inactiveField).asBool()); } 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 a3b779fa77e..da64e260157 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 @@ -11,6 +11,7 @@ import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId; +import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerService; import com.yahoo.vespa.hosted.provision.lb.Real; import com.yahoo.vespa.hosted.provision.node.IP; @@ -51,8 +52,11 @@ public class LoadBalancerProvisioner { try (Mutex loadBalancersLock = db.lockLoadBalancers()) { Map<LoadBalancerId, LoadBalancer> loadBalancers = new LinkedHashMap<>(); for (Map.Entry<ClusterSpec, List<Node>> kv : activeContainers(application).entrySet()) { - LoadBalancer loadBalancer = create(application, kv.getKey().id(), kv.getValue()) - .with(kv.getKey().rotations()); + LoadBalancerId id = new LoadBalancerId(application, kv.getKey().id()); + LoadBalancerInstance instance = create(application, kv.getKey().id(), kv.getValue()); + // Load balancer is always re-activated here to avoid reallocation if an application/cluster is + // deleted and then redeployed. + LoadBalancer loadBalancer = new LoadBalancer(id, instance, kv.getKey().rotations(), false); loadBalancers.put(loadBalancer.id(), loadBalancer); db.writeLoadBalancer(loadBalancer); } @@ -76,7 +80,7 @@ public class LoadBalancerProvisioner { } } - private LoadBalancer create(ApplicationId application, ClusterSpec.Id cluster, List<Node> nodes) { + private LoadBalancerInstance create(ApplicationId application, ClusterSpec.Id cluster, List<Node> nodes) { Map<HostName, Set<String>> hostnameToIpAdresses = nodes.stream() .collect(Collectors.toMap(node -> HostName.from(node.hostname()), this::reachableIpAddresses)); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/LoadBalancersResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/LoadBalancersResponse.java index 0dfe6b3c275..69e13f77a09 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/LoadBalancersResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/LoadBalancersResponse.java @@ -59,17 +59,17 @@ public class LoadBalancersResponse extends HttpResponse { lbObject.setString("tenant", lb.id().application().tenant().value()); lbObject.setString("instance", lb.id().application().instance().value()); lbObject.setString("cluster", lb.id().cluster().value()); - lbObject.setString("hostname", lb.hostname().value()); - lb.dnsZone().ifPresent(dnsZone -> lbObject.setString("dnsZone", dnsZone.id())); + lbObject.setString("hostname", lb.instance().hostname().value()); + lb.instance().dnsZone().ifPresent(dnsZone -> lbObject.setString("dnsZone", dnsZone.id())); Cursor networkArray = lbObject.setArray("networks"); - lb.networks().forEach(networkArray::addString); + lb.instance().networks().forEach(networkArray::addString); Cursor portArray = lbObject.setArray("ports"); - lb.ports().forEach(portArray::addLong); + lb.instance().ports().forEach(portArray::addLong); Cursor realArray = lbObject.setArray("reals"); - lb.reals().forEach(real -> { + lb.instance().reals().forEach(real -> { Cursor realObject = realArray.addObject(); realObject.setString("hostname", real.hostname().value()); realObject.setString("ipAddress", real.ipAddress()); 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 2cd6b38a7ae..6de93c2ae65 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 @@ -9,6 +9,7 @@ import com.yahoo.config.provision.RotationName; import com.yahoo.vespa.hosted.provision.lb.DnsZone; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId; +import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.Real; import org.junit.Test; @@ -27,29 +28,30 @@ public class LoadBalancerSerializerTest { "application1", "default"), ClusterSpec.Id.from("qrs")), - HostName.from("lb-host"), - Optional.of(new DnsZone("zone-id-1")), - ImmutableSet.of(4080, 4443), - ImmutableSet.of("10.2.3.4/24"), - ImmutableSet.of(new Real(HostName.from("real-1"), - "127.0.0.1", - 4080), - new Real(HostName.from("real-2"), - "127.0.0.2", - 4080)), + new LoadBalancerInstance( + HostName.from("lb-host"), + Optional.of(new DnsZone("zone-id-1")), + ImmutableSet.of(4080, 4443), + ImmutableSet.of("10.2.3.4/24"), + ImmutableSet.of(new Real(HostName.from("real-1"), + "127.0.0.1", + 4080), + new Real(HostName.from("real-2"), + "127.0.0.2", + 4080))), ImmutableSet.of(RotationName.from("eu-cluster"), RotationName.from("us-cluster")), false); LoadBalancer serialized = LoadBalancerSerializer.fromJson(LoadBalancerSerializer.toJson(loadBalancer)); assertEquals(loadBalancer.id(), serialized.id()); - assertEquals(loadBalancer.hostname(), serialized.hostname()); - assertEquals(loadBalancer.dnsZone(), serialized.dnsZone()); - assertEquals(loadBalancer.ports(), serialized.ports()); - assertEquals(loadBalancer.networks(), serialized.networks()); + assertEquals(loadBalancer.instance().hostname(), serialized.instance().hostname()); + assertEquals(loadBalancer.instance().dnsZone(), serialized.instance().dnsZone()); + assertEquals(loadBalancer.instance().ports(), serialized.instance().ports()); + assertEquals(loadBalancer.instance().networks(), serialized.instance().networks()); assertEquals(loadBalancer.rotations(), serialized.rotations()); assertEquals(loadBalancer.inactive(), serialized.inactive()); - assertEquals(loadBalancer.reals(), serialized.reals()); + assertEquals(loadBalancer.instance().reals(), serialized.instance().reals()); } } 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 3bbb19a5917..90339a55836 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 @@ -12,10 +12,12 @@ import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.flag.FlagId; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; +import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.Real; import com.yahoo.vespa.hosted.provision.node.Agent; import org.junit.Test; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -54,11 +56,11 @@ public class LoadBalancerProvisionerTest { assertEquals(app1, loadBalancers.get().get(0).id().application()); assertEquals(containerCluster1, loadBalancers.get().get(0).id().cluster()); - assertEquals(Collections.singleton(4443), loadBalancers.get().get(0).ports()); - assertEquals("127.0.0.1", get(loadBalancers.get().get(0).reals(), 0).ipAddress()); - assertEquals(4080, get(loadBalancers.get().get(0).reals(), 0).port()); - assertEquals("127.0.0.2", get(loadBalancers.get().get(0).reals(), 1).ipAddress()); - assertEquals(4080, get(loadBalancers.get().get(0).reals(), 1).port()); + assertEquals(Collections.singleton(4443), loadBalancers.get().get(0).instance().ports()); + assertEquals("127.0.0.1", get(loadBalancers.get().get(0).instance().reals(), 0).ipAddress()); + assertEquals(4080, get(loadBalancers.get().get(0).instance().reals(), 0).port()); + assertEquals("127.0.0.2", get(loadBalancers.get().get(0).instance().reals(), 1).ipAddress()); + assertEquals(4080, get(loadBalancers.get().get(0).instance().reals(), 1).port()); assertEquals(rotationsCluster1, loadBalancers.get().get(0).rotations()); // A container is failed @@ -71,13 +73,13 @@ public class LoadBalancerProvisionerTest { clusterRequest(ClusterSpec.Type.container, containerCluster1), clusterRequest(ClusterSpec.Type.content, contentCluster))); LoadBalancer loadBalancer = tester.nodeRepository().loadBalancers().owner(app1).asList().get(0); - assertEquals(2, loadBalancer.reals().size()); - assertTrue("Failed node is removed", loadBalancer.reals().stream() + assertEquals(2, loadBalancer.instance().reals().size()); + assertTrue("Failed node is removed", loadBalancer.instance().reals().stream() .map(Real::hostname) .map(HostName::value) .noneMatch(hostname -> hostname.equals(toFail.hostname()))); - assertEquals(containers.get().get(0).hostname(), get(loadBalancer.reals(), 0).hostname().value()); - assertEquals(containers.get().get(1).hostname(), get(loadBalancer.reals(), 1).hostname().value()); + assertEquals(containers.get().get(0).hostname(), get(loadBalancer.instance().reals(), 0).hostname().value()); + assertEquals(containers.get().get(1).hostname(), get(loadBalancer.instance().reals(), 1).hostname().value()); // Add another container cluster Set<RotationName> rotationsCluster2 = Set.of(RotationName.from("r2-1"), RotationName.from("r2-2")); @@ -97,7 +99,9 @@ public class LoadBalancerProvisionerTest { .sorted() .collect(Collectors.toList()); List<HostName> reals = loadBalancers.get().stream() - .flatMap(lb -> lb.reals().stream()) + .map(LoadBalancer::instance) + .map(LoadBalancerInstance::reals) + .flatMap(Collection::stream) .map(Real::hostname) .sorted() .collect(Collectors.toList()); |