aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-11-22 14:07:40 +0100
committerMartin Polden <mpolden@mpolden.no>2018-11-23 11:16:57 +0100
commit6f2dc7361f36eeb661da6fc8195be502855e4ec5 (patch)
tree1198c915dc43cda26e023d877de39332a119342a /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java
parent0713e24de6a12c3584112c9af60dc4105d2056d8 (diff)
Add load balancer provisioner
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java73
1 files changed, 73 insertions, 0 deletions
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
new file mode 100644
index 00000000000..07bd1ea06ed
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java
@@ -0,0 +1,73 @@
+// Copyright 2018 Yahoo Holdings. 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.ImmutableList;
+import com.google.common.collect.Ordering;
+import com.yahoo.config.provision.HostName;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Represents a load balancer for an application.
+ *
+ * @author mpolden
+ */
+public class LoadBalancer {
+
+ private final LoadBalancerId id;
+ private final HostName hostname;
+ private final List<Integer> ports;
+ private final List<Real> reals;
+ private final boolean deleted;
+
+ public LoadBalancer(LoadBalancerId id, HostName hostname, List<Integer> ports, List<Real> reals, boolean deleted) {
+ this.id = Objects.requireNonNull(id, "id must be non-null");
+ this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null");
+ this.ports = Ordering.natural().immutableSortedCopy(requirePorts(ports));
+ this.reals = ImmutableList.copyOf(Objects.requireNonNull(reals, "targets must be non-null"));
+ this.deleted = deleted;
+ }
+
+ /** An identifier for this load balancer. The ID is unique inside the zone */
+ public LoadBalancerId id() {
+ return id;
+ }
+
+ /** Fully-qualified domain name of this load balancer. This hostname can be used for query and feed. */
+ public HostName hostname() {
+ return hostname;
+ }
+
+ /** Listening port(s) of this load balancer */
+ public List<Integer> ports() {
+ return ports;
+ }
+
+ /** Real servers behind this load balancer */
+ public List<Real> reals() {
+ return reals;
+ }
+
+ /** Whether this load balancer has been deleted */
+ public boolean deleted() {
+ return deleted;
+ }
+
+ /** Return a copy of this that is marked as deleted */
+ public LoadBalancer delete() {
+ return new LoadBalancer(id, hostname, ports, reals, true);
+ }
+
+ private static List<Integer> requirePorts(List<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;
+ }
+
+}