summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-11-15 10:46:01 +0100
committerMartin Polden <mpolden@mpolden.no>2019-11-15 10:46:01 +0100
commit20ece5aa692f2e04f79e59e12ad76d09913898f6 (patch)
treeae29ec76f1da9eddb4ffabedd36f11c8cc1dddbd /node-repository
parente3d4fb83a60b0762fadc9b881cb879c9d59c6fda (diff)
Implement PassthroughLoadBalancerService
Intended for development purposes.
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerService.java38
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java26
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerServiceTest.java30
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java4
4 files changed, 85 insertions, 13 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerService.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerService.java
new file mode 100644
index 00000000000..891faceca7a
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerService.java
@@ -0,0 +1,38 @@
+// 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.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.ClusterSpec;
+
+import java.util.Comparator;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Implementation of a load balancer service that returns a real as the load balancer instance. This is intended for
+ * development purposes.
+ *
+ * @author mpolden
+ */
+public class PassthroughLoadBalancerService implements LoadBalancerService {
+
+ @Override
+ public LoadBalancerInstance create(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals, boolean force) {
+ var real = reals.stream()
+ .min(Comparator.naturalOrder())
+ .orElseThrow(() -> new IllegalArgumentException("No reals given"));
+ return new LoadBalancerInstance(real.hostname(), Optional.empty(), Set.of(real.port()),
+ Set.of(real.ipAddress() + "/32"), Set.of());
+ }
+
+ @Override
+ public void remove(ApplicationId application, ClusterSpec.Id cluster) {
+ // Nothing to remove
+ }
+
+ @Override
+ public Protocol protocol() {
+ return Protocol.ipv4;
+ }
+
+}
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 331ffe7e202..f670ff93073 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
@@ -10,6 +10,7 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.IP;
+import java.util.ArrayList;
import java.util.Comparator;
import java.util.Objects;
import java.util.Optional;
@@ -23,28 +24,30 @@ import java.util.stream.Collectors;
* @author ogronnesby
*/
public class SharedLoadBalancerService implements LoadBalancerService {
+
private static final Comparator<Node> hostnameComparator = Comparator.comparing(Node::hostname);
+
private final NodeRepository nodeRepository;
@Inject
public SharedLoadBalancerService(NodeRepository nodeRepository) {
- this.nodeRepository = Objects.requireNonNull(nodeRepository, "Missing nodeRepository value");
+ this.nodeRepository = Objects.requireNonNull(nodeRepository, "nodeRepository must be non-null");
}
@Override
public LoadBalancerInstance create(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals, boolean force) {
- final var proxyNodes = nodeRepository.getNodes(NodeType.proxy);
+ var proxyNodes = new ArrayList<>(nodeRepository.getNodes(NodeType.proxy));
proxyNodes.sort(hostnameComparator);
if (proxyNodes.size() == 0) {
- throw new IllegalStateException("Missing proxy nodes in nodeRepository");
+ throw new IllegalStateException("Missing proxy nodes in node repository");
}
- final var firstProxyNode = proxyNodes.get(0);
- final var networkNames = proxyNodes.stream()
- .flatMap(node -> node.ipAddresses().stream())
- .map(SharedLoadBalancerService::addNetworKPrefixLength)
- .collect(Collectors.toSet());
+ var firstProxyNode = proxyNodes.get(0);
+ var networkNames = proxyNodes.stream()
+ .flatMap(node -> node.ipAddresses().stream())
+ .map(SharedLoadBalancerService::withPrefixLength)
+ .collect(Collectors.toSet());
return new LoadBalancerInstance(
HostName.from(firstProxyNode.hostname()),
@@ -65,12 +68,11 @@ public class SharedLoadBalancerService implements LoadBalancerService {
return Protocol.dualstack;
}
- private static String addNetworKPrefixLength(String address) {
+ private static String withPrefixLength(String address) {
if (IP.isV6(address)) {
return address + "/128";
}
- else {
- return address + "/32";
- }
+ return address + "/32";
}
+
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerServiceTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerServiceTest.java
new file mode 100644
index 00000000000..402eaf37529
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/PassthroughLoadBalancerServiceTest.java
@@ -0,0 +1,30 @@
+// 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.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.ClusterSpec;
+import com.yahoo.config.provision.HostName;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author mpolden
+ */
+public class PassthroughLoadBalancerServiceTest {
+
+ @Test
+ public void create() {
+ var lbService = new PassthroughLoadBalancerService();
+ var real = new Real(HostName.from("host1.example.com"), "192.0.2.10");
+ var reals = Set.of(real, new Real(HostName.from("host2.example.com"), "192.0.2.11"));
+ var instance = lbService.create(ApplicationId.from("tenant1", "app1", "default"),
+ ClusterSpec.Id.from("c1"), reals, false);
+ assertEquals(real.hostname(), instance.hostname());
+ assertEquals(Set.of(real.port()), instance.ports());
+ assertEquals(Set.of(real.ipAddress() + "/32"), instance.networks());
+ }
+
+}
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 5344fbc3c5f..1829a93c34f 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
@@ -17,6 +17,7 @@ import static org.junit.Assert.assertEquals;
* @author ogronnesby
*/
public class SharedLoadBalancerServiceTest {
+
private final ProvisioningTester tester = new ProvisioningTester.Builder().build();
private final SharedLoadBalancerService loadBalancerService = new SharedLoadBalancerService(tester.nodeRepository());
private final ApplicationId applicationId = ApplicationId.from("tenant1", "application1", "default");
@@ -29,7 +30,7 @@ public class SharedLoadBalancerServiceTest {
@Test
public void test_create_lb() {
tester.makeReadyNodes(2, "default", NodeType.proxy);
- final var lb = loadBalancerService.create(applicationId, clusterId, reals, false);
+ var lb = loadBalancerService.create(applicationId, clusterId, reals, false);
assertEquals(HostName.from("host-1.yahoo.com"), lb.hostname());
assertEquals(Optional.empty(), lb.dnsZone());
@@ -46,4 +47,5 @@ public class SharedLoadBalancerServiceTest {
public void test_protocol() {
assertEquals(LoadBalancerService.Protocol.dualstack, loadBalancerService.protocol());
}
+
}