View Javadoc

1   /**
2    * Licensed to jclouds, Inc. (jclouds) under one or more
3    * contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  jclouds licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * @author Adrian Cole
36   * @see <a href=
37   *      "http://docs.rackspacecloud.com/loadbalancers/api/v1.0/clb-devguide/content/ch04s01s02.html"
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      * {@inheritDoc}
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 }