aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-03-01 14:25:45 +0100
committerMartin Polden <mpolden@mpolden.no>2019-03-01 15:10:58 +0100
commit5fa808b3f65c3391831bc71cd83e03b6085909bf (patch)
tree6f63a9280585951c2ce3c0ca1edf05009660e383 /node-repository
parentb56417b41532c00a1d24d3f7394b0c8a78f7daf8 (diff)
Limit fields that can be mutated by a LoadBalancerService
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java74
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java70
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java16
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java23
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java10
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/LoadBalancersResponse.java10
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java32
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java24
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());