blob: 3c0a7083c1103c6dfdd3e0acbe4f8e867a40bec1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.ec2.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableMap;
/**
* Amazon EC2 VPCs contain one or more subnets.
*
* @see <a href="http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html" >doc</a>
*
* @author Adrian Cole
* @author Andrew Bayer
*/
public final class Subnet {
public static enum State {
/**
* The subnet is available for use.
*/
AVAILABLE,
/**
* The subnet is not yet available for use.
*/
PENDING, UNRECOGNIZED;
public String value() {
return name().toLowerCase();
}
public static State fromValue(String v) {
try {
return valueOf(v.toUpperCase());
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}
private final String subnetId;
private final State subnetState;
private final String vpcId;
private final String cidrBlock;
private final int availableIpAddressCount;
private final String availabilityZone;
private final Map<String, String> tags;
private Subnet(String subnetId, State subnetState, String vpcId, String cidrBlock, int availableIpAddressCount,
String availabilityZone, ImmutableMap<String, String> tags) {
this.subnetId = checkNotNull(subnetId, "subnetId");
this.subnetState = checkNotNull(subnetState, "subnetState for %s", subnetId);
this.vpcId = checkNotNull(vpcId, "vpcId for %s", subnetId);
this.cidrBlock = checkNotNull(cidrBlock, "cidrBlock for %s", subnetId);
this.availableIpAddressCount = availableIpAddressCount;
this.availabilityZone = checkNotNull(availabilityZone, "availabilityZone for %s", subnetId);
this.tags = checkNotNull(tags, "tags for %s", subnetId);
}
/**
* The subnet ID, ex. subnet-c5473ba8
*/
public String getSubnetId() {
return subnetId;
}
/**
* The subnet state - either available or pending.
*/
public State getSubnetState() {
return subnetState;
}
/**
* The vpc ID this subnet belongs to.
*/
public String getVpcId() {
return vpcId;
}
/**
* The CIDR block for this subnet.
*/
public String getCidrBlock() {
return cidrBlock;
}
/**
* The number of available IPs in this subnet.
*/
public int getAvailableIpAddressCount() {
return availableIpAddressCount;
}
/**
* The availability zone this subnet is in.
*/
public String getAvailabilityZone() {
return availabilityZone;
}
/**
* Tags that are attached to this subnet.
*/
public Map<String, String> getTags() {
return tags;
}
@Override
public int hashCode() {
return Objects.hashCode(subnetId, vpcId, availabilityZone);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
Subnet that = Subnet.class.cast(obj);
return Objects.equal(this.subnetId, that.subnetId) && Objects.equal(this.vpcId, that.vpcId)
&& Objects.equal(this.availabilityZone, that.availabilityZone);
}
@Override
public String toString() {
return string().toString();
}
private final ToStringHelper string() {
return Objects.toStringHelper(this).omitNullValues().add("subnetId", subnetId).add("subnetState", subnetState)
.add("vpcId", vpcId).add("cidrBlock", cidrBlock).add("availableIpAddressCount", availableIpAddressCount)
.add("availabilityZone", availabilityZone).add("tags", tags);
}
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return builder().from(this);
}
public static final class Builder {
private String subnetId;
private State subnetState;
private String vpcId;
private String cidrBlock;
private int availableIpAddressCount;
private String availabilityZone;
private ImmutableMap.Builder<String, String> tags = ImmutableMap.<String, String> builder();
/**
* @see Subnet#getSubnetId()
*/
public Builder subnetId(String subnetId) {
this.subnetId = subnetId;
return this;
}
/**
* @see Subnet#getState()
*/
public Builder subnetState(State subnetState) {
this.subnetState = subnetState;
return this;
}
/**
* @see Subnet#getVpcId()
*/
public Builder vpcId(String vpcId) {
this.vpcId = vpcId;
return this;
}
/**
* @see Subnet#getCidrBlock()
*/
public Builder cidrBlock(String cidrBlock) {
this.cidrBlock = cidrBlock;
return this;
}
/**
* @see Subnet#getAvailableIpAddressCount()
*/
public Builder availableIpAddressCount(int availableIpAddressCount) {
this.availableIpAddressCount = availableIpAddressCount;
return this;
}
/**
* @see Subnet#getAvailabilityZone()
*/
public Builder availabilityZone(String availabilityZone) {
this.availabilityZone = availabilityZone;
return this;
}
/**
* @see Subnet#getTags()
*/
public Builder tags(Map<String, String> tags) {
this.tags.putAll(checkNotNull(tags, "tags"));
return this;
}
/**
* @see Subnet#getTags()
*/
public Builder tag(String key) {
return tag(key, "");
}
/**
* @see Subnet#getTags()
*/
public Builder tag(String key, String value) {
this.tags.put(checkNotNull(key, "key"), checkNotNull(value, "value"));
return this;
}
public Subnet build() {
return new Subnet(subnetId, subnetState, vpcId, cidrBlock, availableIpAddressCount, availabilityZone,
tags.build());
}
public Builder from(Subnet in) {
return this.subnetId(in.getSubnetId()).subnetState(in.getSubnetState()).vpcId(in.getVpcId())
.cidrBlock(in.getCidrBlock()).availableIpAddressCount(in.getAvailableIpAddressCount())
.availabilityZone(in.getAvailabilityZone()).tags(in.getTags());
}
}
}