diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-11-15 13:15:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-15 13:15:43 +0100 |
commit | e46a3ea41199f498fd073f7321c8079bcffde49d (patch) | |
tree | dcc9aa3c49e32fe3ffb227c1622649b3b5023e11 /node-repository | |
parent | 296196dfd5103bd14fcea0f2e6a8663e023c42fc (diff) | |
parent | 20ece5aa692f2e04f79e59e12ad76d09913898f6 (diff) |
Merge pull request #11314 from vespa-engine/mpolden/passthrough-lb-service
Implement PassthroughLoadBalancerService
Diffstat (limited to 'node-repository')
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()); } + } |