blob: be61ad3cca55f428a58e54ec3050dbdfb4be506f [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.openstack.neutron.v2.domain;
import java.beans.ConstructorProperties;
import javax.inject.Named;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
/**
* A Neutron Floating IP
*
*/
public class FloatingIP {
private String id;
@Named("router_id")
private String routerId;
@Named("tenant_id")
private String tenantId;
// Only mandatory attribute when creating
@Named("floating_network_id")
private String floatingNetworkId;
@Named("fixed_ip_address")
private String fixedIpAddress;
@Named("floating_ip_address")
private String floatingIpAddress;
@Named("port_id")
private String portId;
/**
* Deserialization constructor
*/
@ConstructorProperties({"id", "router_id", "tenant_id", "floating_network_id", "fixed_ip_address",
"floating_ip_address", "port_id"})
private FloatingIP(String id, String routerId, String tenantId, String floatingNetworkId, String fixedIpAddress,
String floatingIpAddress, String portId) {
this.id = id;
this.routerId = routerId;
this.tenantId = tenantId;
this.floatingNetworkId = floatingNetworkId;
this.fixedIpAddress = fixedIpAddress;
this.floatingIpAddress = floatingIpAddress;
this.portId = portId;
}
private FloatingIP() {}
/**
* @param floatingIP The floating IP to copy from
*/
private FloatingIP(FloatingIP floatingIP) {
this(floatingIP.id, floatingIP.routerId, floatingIP.tenantId, floatingIP.floatingNetworkId,
floatingIP.fixedIpAddress, floatingIP.floatingIpAddress, floatingIP.portId);
}
/**
* @return the id of the floating IP
*/
@Nullable
public String getId() {
return id;
}
/**
* @return the router id of this floating IP
*/
@Nullable
public String getRouterId() {
return routerId;
}
/**
* @return the tenant id of the Floating IP
*/
@Nullable
public String getTenantId() {
return tenantId;
}
/**
* @return the floating network id for this floating IP
*/
@Nullable
public String getFloatingNetworkId() {
return floatingNetworkId;
}
/**
* @return the fixed IP address for this floating IP
*/
@Nullable
public String getFixedIpAddress() {
return fixedIpAddress;
}
/**
* @return the floating IP address for this floating IP
*/
@Nullable
public String getFloatingIpAddress() {
return floatingIpAddress;
}
/**
* @return the port id for this floating IP
*/
@Nullable
public String getPortId() {
return portId;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
FloatingIP that = (FloatingIP) o;
return Objects.equal(this.id, that.id) &&
Objects.equal(this.routerId, that.routerId) &&
Objects.equal(this.tenantId, that.tenantId) &&
Objects.equal(this.floatingNetworkId, that.floatingNetworkId) &&
Objects.equal(this.fixedIpAddress, that.fixedIpAddress) &&
Objects.equal(this.floatingIpAddress, that.floatingIpAddress) &&
Objects.equal(this.portId, that.portId);
}
@Override
public int hashCode() {
return Objects.hashCode(id, routerId, tenantId, floatingNetworkId, fixedIpAddress, floatingIpAddress,
portId);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("id", id)
.add("routerId", routerId)
.add("tenantId", tenantId)
.add("floatingNetworkId", floatingNetworkId)
.add("fixedIpAddress", fixedIpAddress)
.add("floatingIpAddress", floatingIpAddress)
.add("portId", portId)
.toString();
}
/**
* @return the Builder for creating a new floating IP
*/
public static CreateBuilder createBuilder(String floatingNetworkId) {
return new CreateBuilder(floatingNetworkId);
}
/**
* @return the Builder for updating a floating IP
*/
public static UpdateBuilder updateBuilder() {
return new UpdateBuilder();
}
private abstract static class Builder<ParameterizedBuilderType> {
protected FloatingIP floatingIP;
/**
* No-parameters constructor.
* */
private Builder() {
floatingIP = new FloatingIP();
}
protected abstract ParameterizedBuilderType self();
/**
* Provide the tenantId for this Floating IP. Admin-only.
* When keystone is enabled, it is not mandatory to specify tenant_id for resources in create requests, as the
* tenant identifier will be derived from the Authentication token. Please note that the default authorization
* settings only allow administrative users to create resources on behalf of a different tenant.
*
* @return the Builder.
* @see FloatingIP#getTenantId()
*/
public ParameterizedBuilderType tenantId(String tenantId) {
floatingIP.tenantId = tenantId;
return self();
}
/**
* Provides the floating network id for this Floating IP.
* Mandatory when creating a floating IP.
* Floating IPs can only be created on external networks. If the network specified by floating_network_id is not
* external (for example, router:external=false), a 400 error is returned.
*
* @return the Builder.
* @see FloatingIP#getFloatingNetworkId() ()
*/
public ParameterizedBuilderType floatingNetworkId(String floatingNetworkId) {
floatingIP.floatingNetworkId = floatingNetworkId;
return self();
}
/**
* Provides the fixed ip address for this Floating IP.
* As an OpenStack Networking port might be associated with multiple IP addresses, the particular IP address to
* associate with the floating IP can be specified using the fixed_ip_address request body parameter. The default
* logic of this operation is to associate the floating IP with a single IP address configured on a port; hence,
* if a port has multiple IP addresses, it is mandatory to specify the fixed_ip_address attribute. If an invalid
* IP address is specified in fixed_ip_address a 400 error will be returned.
*
* @return the Builder.
* @see FloatingIP#getFixedIpAddress()
*/
public ParameterizedBuilderType fixedIpAddress(String fixedIpAddress) {
floatingIP.fixedIpAddress = fixedIpAddress;
return self();
}
/**
* Provides the port id for this Floating IP.
* Users can associate the floating IP with an internal port using the port_id attribute in the request body.
* If an invalid port identifier is specified, a 404 error will be returned. The internal OpenStack Networking
* port associated with the Floating IP must have at least an IP address configured, otherwise a 400 error will
* be returned.
*
* @return the Builder.
* @see FloatingIP#getPortId()
*/
public ParameterizedBuilderType portId(String portId) {
floatingIP.portId = portId;
return self();
}
}
public static class CreateBuilder extends Builder<CreateBuilder> {
/**
* Supply required properties for creating a Builder
*/
private CreateBuilder(String floatingNetworkId) {
floatingIP.floatingNetworkId = floatingNetworkId;
}
/**
* @return a CreateFloatingIP constructed with this Builder.
*/
public CreateFloatingIP build() {
return new CreateFloatingIP(floatingIP);
}
protected CreateBuilder self() {
return this;
}
}
public static class UpdateBuilder extends Builder<UpdateBuilder> {
/**
* Supply required properties for updating a Builder
*/
private UpdateBuilder() {
}
/**
* Provide the floating ip address for this Floating IP.
* An address for the floating ip will be automatically allocated, unless the floating_ip_address attribute is
* specified in the request body. If the requested floating IP address does not fall in the external network's
* subnet range, a 400 error will be returned. If the requested floating IP address is already in use, a 409
* error code will be returned.
*
* @return the Builder.
* @see FloatingIP#getFloatingIpAddress()
*/
public UpdateBuilder floatingIpAddress(String floatingIpAddress) {
floatingIP.floatingIpAddress = floatingIpAddress;
return this;
}
/**
* @return a UpdateFloatingIP constructed with this Builder.
*/
public UpdateFloatingIP build() {
return new UpdateFloatingIP(floatingIP);
}
protected UpdateBuilder self() {
return this;
}
}
public static class CreateFloatingIP extends FloatingIP {
private CreateFloatingIP(FloatingIP floatingIP) {
super(floatingIP);
}
}
public static class UpdateFloatingIP extends FloatingIP {
private UpdateFloatingIP(FloatingIP floatingIP) {
super(floatingIP);
}
}
}