blob: 0ec107841ceffe6691c669f605929f4f61684544 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Laboratory
*
* Licensed 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.opencord.cordvtn.api.net;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.openstack4j.model.network.Port;
import java.util.Objects;
import java.util.Set;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Representation of a port holding the basic virtual port and additional service
* port specific information.
* All the services making use of CordVtnService are intended to interface
* with this VtnPort, and not allowed to directly access {@link Port} or
* {@link ServicePort}.
*/
public final class VtnPort extends ServicePort {
private static final String ERR_IP_MISSING = "VTN port IP adderess is missing";
private final NetworkId netId;
private final MacAddress mac;
private final IpAddress ip;
private VtnPort(PortId id,
NetworkId netId,
MacAddress mac,
IpAddress ip,
VlanId vlanId,
Set<AddressPair> addressPairs) {
super(id, vlanId, addressPairs);
this.netId = netId;
this.mac = mac;
this.ip = ip;
}
/**
* Returns the network ID of this port.
*
* @return network id
*/
public NetworkId netId() {
return netId;
}
/**
* Returns the MAC address of this port.
*
* @return mac address
*/
public MacAddress mac() {
return mac;
}
/**
* Returns the IP address of this port.
*
* @return ip address
*/
public IpAddress ip() {
return ip;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof VtnPort) {
VtnPort that = (VtnPort) obj;
if (Objects.equals(id, that.id) &&
Objects.equals(netId, that.netId) &&
Objects.equals(mac, that.mac) &&
Objects.equals(ip, that.ip) &&
Objects.equals(vlanId, that.vlanId) &&
Objects.equals(addressPairs, that.addressPairs)) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(id, netId, mac, ip, vlanId, addressPairs);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("id", id)
.add("netId", netId)
.add("mac", mac)
.add("ip", ip)
.add("vlanId", vlanId)
.add("addressPairs", addressPairs)
.toString();
}
/**
* Returns the immutable VTN port with the supplied Neutron port with additional
* vtn port information.
*
* @param port neutron port
* @param servicePort vtn port
* @return vtn port
*/
public static VtnPort of(Port port, ServicePort servicePort) {
validateNeutronPort(port);
if (servicePort != null) {
checkArgument(Objects.equals(port.getId(), servicePort.id().id()));
}
return builder().id(PortId.of(port.getId()))
.netId(NetworkId.of(port.getNetworkId()))
.mac(MacAddress.valueOf(port.getMacAddress()))
.ip(IpAddress.valueOf(port.getFixedIps().iterator().next().getIpAddress()))
.vlanId(servicePort == null ? null : servicePort.vlanId().orElse(null))
.addressPairs(servicePort == null ? ImmutableSet.of() : servicePort.addressPairs())
.build();
}
private static void validateNeutronPort(Port port) {
checkNotNull(port);
checkArgument(port.getFixedIps().size() > 0, ERR_IP_MISSING);
}
/**
* Returns the immutable VTN port with the supplied VTN port with additional
* vtn port information.
*
* @param vtnPort vtn port
* @param servicePort vtn port
* @return vtn port
*/
public static VtnPort of(VtnPort vtnPort, ServicePort servicePort) {
return builder(vtnPort)
.vlanId(servicePort.vlanId().orElse(null))
.addressPairs(servicePort.addressPairs())
.build();
}
/**
* Returns new vtn port builder instance.
*
* @return vtn port builder
*/
public static Builder builder() {
return new Builder();
}
/**
* Returns new vtn port builder instance with copy of the supplied vtn port.
*
* @param vtnPort vtn port
* @return vtn port builder
*/
public static Builder builder(VtnPort vtnPort) {
return new Builder().id(vtnPort.id())
.netId(vtnPort.netId())
.mac(vtnPort.mac())
.ip(vtnPort.ip())
.vlanId(vtnPort.vlanId().orElse(null))
.addressPairs(vtnPort.addressPairs());
}
/**
* Builder of the vtn port entities.
*/
public static final class Builder {
private PortId id;
private NetworkId netId;
private MacAddress mac;
private IpAddress ip;
private VlanId vlanId;
private Set<AddressPair> addressPairs = ImmutableSet.of();
private Builder() {
}
/**
* Builds an immutable vtn port.
*
* @return vtn port instance
*/
public VtnPort build() {
checkNotNull(id, "VtnPort port id cannot be null");
checkNotNull(netId, "VtnPort network id cannot be null");
checkNotNull(mac, "VtnPort mac address cannot be null");
checkNotNull(ip, "VtnPort ip address cannot be null");
addressPairs = addressPairs == null ? ImmutableSet.of() : addressPairs;
return new VtnPort(id, netId, mac, ip, vlanId, addressPairs);
}
/**
* Returns vtn port builder with the supplied port id.
*
* @param id port id
* @return vtn port builder
*/
public Builder id(PortId id) {
this.id = id;
return this;
}
/**
* Returns vtn port builder with the supplied network id.
*
* @param netId network id
* @return vtn port builder
*/
public Builder netId(NetworkId netId) {
this.netId = netId;
return this;
}
/**
* Returns vtn port builder with the supplied mac address.
*
* @param mac mac address
* @return vtn port builder
*/
public Builder mac(MacAddress mac) {
this.mac = mac;
return this;
}
/**
* Returns vtn port builder with the supplied ip address.
*
* @param ip ip address
* @return vtn port builder
*/
public Builder ip(IpAddress ip) {
this.ip = ip;
return this;
}
/**
* Returns vtn port builder with the supplied VLAN ID.
*
* @param vlanId vlan id
* @return vtn port builder
*/
public Builder vlanId(VlanId vlanId) {
this.vlanId = vlanId;
return this;
}
/**
* Returns vtn port builder with the supplied address pairs.
*
* @param addressPairs set of address pairs
* @return vtn port builder
*/
public Builder addressPairs(Set<AddressPair> addressPairs) {
this.addressPairs = addressPairs;
return this;
}
/**
* Returns vtn port builder with the given additional address pair.
*
* @param addressPair address pair to add
* @return vtn port builder
*/
public Builder addAddressPair(AddressPair addressPair) {
checkNotNull(addressPair, "VtnPort address pair cannot be null");
Set<AddressPair> updated = Sets.newHashSet(this.addressPairs);
updated.add(addressPair);
this.addressPairs = ImmutableSet.copyOf(updated);
return this;
}
}
}