1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jclouds.cloudloadbalancers.domain;
20
21 import static com.google.common.base.Preconditions.checkArgument;
22 import static com.google.common.base.Preconditions.checkNotNull;
23
24 import java.util.List;
25 import java.util.Map;
26
27 import org.jclouds.cloudloadbalancers.domain.internal.BaseLoadBalancer;
28
29 import com.google.common.collect.ImmutableList;
30 import com.google.common.collect.ImmutableMap;
31 import com.google.common.collect.ImmutableSet;
32
33
34
35
36
37
38
39
40 public class LoadBalancerRequest extends BaseLoadBalancer<NodeRequest, LoadBalancerRequest> {
41
42 @SuppressWarnings("unchecked")
43 public static Builder builder() {
44 return new Builder();
45 }
46
47
48
49
50 @Override
51 public Builder toBuilder() {
52 return new Builder().from(this);
53 }
54
55 public static class Builder extends BaseLoadBalancer.Builder<NodeRequest, LoadBalancerRequest> {
56 private VirtualIP.Type virtualIPType;
57 private Integer virtualIPId;
58 private List<Map<String, String>> virtualIps;
59
60 public Builder virtualIPId(Integer virtualIPId) {
61 this.virtualIPId = virtualIPId;
62 return this;
63 }
64
65 public Builder virtualIPType(VirtualIP.Type virtualIPType) {
66 this.virtualIPType = virtualIPType;
67 return this;
68 }
69
70 public LoadBalancerRequest build() {
71 return virtualIps == null ? new LoadBalancerRequest(name, protocol, port, algorithm, nodes, virtualIPType,
72 virtualIPId) : new LoadBalancerRequest(name, protocol, port, algorithm, nodes, virtualIps);
73 }
74
75 @Override
76 public Builder nodes(Iterable<NodeRequest> nodes) {
77 this.nodes = ImmutableSet.<NodeRequest> copyOf(checkNotNull(nodes, "nodes"));
78 return this;
79 }
80
81 @Override
82 public Builder node(NodeRequest nodes) {
83 this.nodes.add(checkNotNull(nodes, "nodes"));
84 return this;
85 }
86
87 private Builder virtualIPs(List<Map<String, String>> virtualIPs) {
88 this.virtualIps = virtualIPs;
89 return this;
90 }
91
92 @Override
93 public Builder algorithm(String algorithm) {
94 return Builder.class.cast(super.algorithm(algorithm));
95 }
96
97 @Override
98 public Builder from(LoadBalancerRequest in) {
99 return Builder.class.cast(super.from(in)).virtualIPs(in.virtualIps);
100 }
101
102 @Override
103 public Builder name(String name) {
104 return Builder.class.cast(super.name(name));
105 }
106
107 @Override
108 public Builder port(Integer port) {
109 return Builder.class.cast(super.port(port));
110 }
111
112 @Override
113 public Builder protocol(String protocol) {
114 return Builder.class.cast(super.protocol(protocol));
115 }
116
117 }
118
119 private final List<Map<String, String>> virtualIps;
120
121 public LoadBalancerRequest(String name, String protocol, int port, String algorithm, Iterable<NodeRequest> nodes,
122 VirtualIP.Type virtualIPType, Integer virtualIPId) {
123 this(name, protocol, port, algorithm, nodes, getVirtualIPsFromOptions(virtualIPType, virtualIPId));
124 }
125
126 private LoadBalancerRequest(String name, String protocol, int port, String algorithm, Iterable<NodeRequest> nodes,
127 List<Map<String, String>> virtualIPsFromOptions) {
128 super(name, protocol, port, algorithm, nodes);
129 this.virtualIps = checkNotNull(virtualIPsFromOptions, "virtualIPsFromOptions");
130 }
131
132 static List<Map<String, String>> getVirtualIPsFromOptions(VirtualIP.Type virtualIPType, Integer virtualIPId) {
133 checkArgument(virtualIPType == null || virtualIPId == null,
134 "virtualIPType and virtualIPId cannot both be specified");
135 if (virtualIPType != null)
136 return ImmutableList.<Map<String, String>> of(ImmutableMap.of("type", virtualIPType.name()));
137 else if (virtualIPId != null)
138 return ImmutableList.<Map<String, String>> of(ImmutableMap.of("id", virtualIPId.toString()));
139 else
140 throw new IllegalArgumentException("virtualIPType or virtualIPId must be specified");
141 }
142
143 @Override
144 public String toString() {
145 return String.format("[algorithm=%s, name=%s, nodes=%s, port=%s, protocol=%s, virtualIps=%s]", algorithm, name,
146 nodes, port, protocol, virtualIps);
147 }
148
149 }