Hyunsun Moon
Committed by Gerrit Code Review

Added builder and more logs for VtnService and VtnPort

Change-Id: I52f672caebf1946b9bb01c9de0ca2ad2cee23f69
......@@ -16,12 +16,15 @@
package org.onosproject.xosclient.api;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import java.util.Map;
import java.util.Objects;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Representation of port in a CORD VTN controlled network, it can be for VM
* or container.
......@@ -36,23 +39,12 @@ public final class VtnPort {
// TODO remove this when XOS provides vSG information
private final Map<IpAddress, MacAddress> addressPairs;
/**
* Creates a new vtn port with the specified entities.
*
* @param id vtn port id
* @param name vtn port name
* @param serviceId id of the service this port is in
* @param mac mac address
* @param ip ip address
* @param addressPairs ip and mac pairs of nested container
*/
public VtnPort(VtnPortId id,
String name,
VtnServiceId serviceId,
MacAddress mac,
IpAddress ip,
Map<IpAddress, MacAddress> addressPairs) {
private VtnPort(VtnPortId id,
String name,
VtnServiceId serviceId,
MacAddress mac,
IpAddress ip,
Map<IpAddress, MacAddress> addressPairs) {
this.id = id;
this.name = name;
this.serviceId = serviceId;
......@@ -143,4 +135,161 @@ public final class VtnPort {
.add("addressPairs", addressPairs)
.toString();
}
/**
* Returns a new vtn port builder instance.
*
* @return new vtn port builder
*/
public static final Builder builder() {
return new Builder();
}
/**
* Builder of VTN port entities.
*/
public static final class Builder {
private VtnPortId id;
private String name;
private VtnServiceId serviceId;
private MacAddress mac;
private IpAddress ip;
// TODO remove this when XOS provides vSG information
private Map<IpAddress, MacAddress> addressPairs;
private Builder() {
}
/**
* Builds an immutable VTN port.
*
* @return vtn port instance
*/
public VtnPort build() {
checkNotNull(id, "VTN port ID cannot be null");
checkNotNull(serviceId, "VTN port service ID cannot be null");
checkNotNull(mac, "VTN port MAC address cannot be null");
checkNotNull(ip, "VTN port IP address cannot be null");
addressPairs = addressPairs == null ? ImmutableMap.of() : addressPairs;
return new VtnPort(id,
name,
serviceId,
mac,
ip,
addressPairs);
}
/**
* Returns VTN port builder with the supplied port ID.
*
* @param id port identifier
* @return vtn port builder
*/
public Builder id(VtnPortId id) {
this.id = id;
return this;
}
/**
* Returns VTN port builder with the supplied port name.
* Port name can be null.
*
* @param name port name
* @return vtn port builder
*/
public Builder name(String name) {
this.name = name;
return this;
}
/**
* Returns VTN port builder with the supplied service ID.
*
* @param serviceId vtn port service id
* @return vtn port builder
*/
public Builder serviceId(VtnServiceId serviceId) {
this.serviceId = serviceId;
return this;
}
/**
* Returns VTN port builder with the supplied MAC address.
*
* @param mac mac address
* @return vtn port builder
*/
public Builder mac(MacAddress mac) {
if (mac == null) {
final String msg = "VTN port MAC address cannot be null";
throw new IllegalArgumentException(msg);
}
this.mac = mac;
return this;
}
/**
* Returns VTN port builder with the supplied MAC address.
*
* @param mac mac address as a string
* @return vtn port builder
*/
public Builder mac(String mac) {
try {
return mac(MacAddress.valueOf(mac));
} catch (IllegalArgumentException | NullPointerException e) {
final String msg = "Malformed MAC address string " + mac +
" for VTN port MAC address";
throw new IllegalArgumentException(msg);
}
}
/**
* Returns VTN port builder with the supplied IP address.
*
* @param ip ip address
* @return vtn port builder
*/
public Builder ip(IpAddress ip) {
if (ip == null) {
final String msg = "VTN port IP address cannot be null";
throw new IllegalArgumentException(msg);
}
this.ip = ip;
return this;
}
/**
* Returns VTN port builder with the supplied IP address.
*
* @param ip ip address as a string
* @return vtn port builder
*/
public Builder ip(String ip) {
try {
return ip(IpAddress.valueOf(ip));
} catch (IllegalArgumentException | NullPointerException e) {
final String msg = "Malformed IP address string " + ip +
" for VTN port IP address";
throw new IllegalArgumentException(msg);
}
}
/**
* Returns VTN port builder with the supplied address pairs.
*
* @param addressPairs address pairs
* @return vtn port builder
*/
public Builder addressPairs(Map<IpAddress, MacAddress> addressPairs) {
if (addressPairs == null) {
final String msg = "VTN address pairs cannot be null";
throw new IllegalArgumentException(msg);
}
this.addressPairs = addressPairs;
return this;
}
}
}
......
......@@ -36,7 +36,7 @@ public final class VtnPortId extends Identifier<String> {
* @return instance port id
*/
public static VtnPortId of(String id) {
checkArgument(!Strings.isNullOrEmpty(id));
checkArgument(!Strings.isNullOrEmpty(id), "VTN port ID cannot be null");
return new VtnPortId(id);
}
}
......
......@@ -16,7 +16,8 @@
package org.onosproject.xosclient.api;
import com.google.common.base.MoreObjects;
import com.google.common.collect.Sets;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onosproject.xosclient.api.VtnServiceApi.NetworkType;
......@@ -25,6 +26,7 @@ import org.onosproject.xosclient.api.VtnServiceApi.ServiceType;
import java.util.Objects;
import java.util.Set;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
......@@ -42,37 +44,24 @@ public final class VtnService {
private final Set<VtnServiceId> providerServices;
private final Set<VtnServiceId> tenantServices;
/**
* Creates a new VTN service with the specified entities.
*
* @param id service id
* @param name user friendly name
* @param serviceType service type
* @param networkType network type
* @param vni vni of this service network
* @param subnet service network subnet range
* @param serviceIp service ip for indirect service access
* @param providerServices provider services
* @param tenantServices tenant services
*/
public VtnService(VtnServiceId id,
String name,
ServiceType serviceType,
NetworkType networkType,
long vni,
IpPrefix subnet,
IpAddress serviceIp,
Set<VtnServiceId> providerServices,
Set<VtnServiceId> tenantServices) {
this.id = checkNotNull(id);
private VtnService(VtnServiceId id,
String name,
ServiceType serviceType,
NetworkType networkType,
long vni,
IpPrefix subnet,
IpAddress serviceIp,
Set<VtnServiceId> providerServices,
Set<VtnServiceId> tenantServices) {
this.id = id;
this.name = name;
this.serviceType = serviceType;
this.networkType = networkType;
this.vni = vni;
this.subnet = checkNotNull(subnet);
this.serviceIp = checkNotNull(serviceIp);
this.providerServices = providerServices == null ? Sets.newHashSet() : providerServices;
this.tenantServices = tenantServices == null ? Sets.newHashSet() : tenantServices;
this.subnet = subnet;
this.serviceIp = serviceIp;
this.providerServices = providerServices;
this.tenantServices = tenantServices;
}
/**
......@@ -187,4 +176,231 @@ public final class VtnService {
.add("tenantServices", tenantServices)
.toString();
}
/**
* Returns a new builder instance.
*
* @return new builder
*/
public static final Builder build() {
return new Builder();
}
/**
* Builder of VTN service entities.
*/
public static final class Builder {
private VtnServiceId id;
private String name;
private ServiceType serviceType;
private NetworkType networkType;
private long vni = -1;
private IpPrefix subnet;
private IpAddress serviceIp;
private Set<VtnServiceId> providerServices;
private Set<VtnServiceId> tenantServices;
private Builder() {
}
/**
* Builds an immutable VTN service.
*
* @return vtn service instance
*/
public VtnService build() {
checkNotNull(id, "VTN service ID cannot be null");
checkArgument(!Strings.isNullOrEmpty(name), "VTN service name cannot be null");
checkNotNull(serviceType, "VTN service type cannot be null");
checkNotNull(networkType, "VTN network type cannot be null");
checkArgument(vni > 0, "VTN network VNI is not set");
checkNotNull(subnet, "VTN subnet cannot be null");
checkNotNull(serviceIp, "VTN service IP cannot be null");
providerServices = providerServices == null ? ImmutableSet.of() : providerServices;
tenantServices = tenantServices == null ? ImmutableSet.of() : tenantServices;
return new VtnService(id,
name,
serviceType,
networkType,
vni,
subnet,
serviceIp,
providerServices,
tenantServices);
}
/**
* Returns VTN service builder with the supplied service ID.
*
* @param id service identifier
* @return vtn service builder
*/
public Builder id(VtnServiceId id) {
this.id = id;
return this;
}
/**
* Returns VTN service builder with the supplied service name.
*
* @param name service name
* @return vtn service builder
*/
public Builder name(String name) {
if (Strings.isNullOrEmpty(name)) {
final String msg = "VTN service name cannot be null";
throw new IllegalArgumentException(msg);
}
this.name = name;
return this;
}
/**
* Returns VTN service builder with the supplied service type.
*
* @param serviceType service type
* @return vtn service builder
*/
public Builder serviceType(ServiceType serviceType) {
this.serviceType = serviceType;
return this;
}
/**
* Returns VTN service builder with the supplied network type.
*
* @param networkType network type
* @return vtn service builder
*/
public Builder networkType(NetworkType networkType) {
this.networkType = networkType;
return this;
}
/**
* Returns VTN service builder with the supplied VNI.
*
* @param vni vni of the service network
* @return vtn service builder
*/
public Builder vni(long vni) {
if (vni < 0 || vni > 16777215) {
final String msg = "VNI " + vni + " is out of range";
throw new IllegalArgumentException(msg);
}
this.vni = vni;
return this;
}
/**
* Returns VTN service builder with the supplied VNI.
*
* @param vni vni of the service network as a string
* @return vtn service builder
*/
public Builder vni(String vni) {
try {
return vni(Long.parseLong(vni));
} catch (NumberFormatException | NullPointerException e) {
final String msg = "Malformed number string " + vni +
" for VTN network VNI";
throw new IllegalArgumentException(msg);
}
}
/**
* Returns VTN service builder with the supplied subnet.
*
* @param subnet subnet of the service network
* @return vtn service builder
*/
public Builder subnet(IpPrefix subnet) {
if (subnet == null) {
final String msg = "VTN service subnet is null";
throw new IllegalArgumentException(msg);
}
this.subnet = subnet;
return this;
}
/**
* Returns VTN service builder with the supplied subnet.
*
* @param subnet subnet of the service network as a string
* @return vtn service builder
*/
public Builder subnet(String subnet) {
try {
return subnet(IpPrefix.valueOf(subnet));
} catch (IllegalArgumentException | NullPointerException e) {
final String msg = "Malformed IP prefix string " + subnet +
" for VTN service subnet";
throw new IllegalArgumentException(msg);
}
}
/**
* Returns VTN service builder with the supplied service IP address.
*
* @param serviceIp service ip address
* @return vtn service builder
*/
public Builder serviceIp(IpAddress serviceIp) {
if (serviceIp == null) {
final String msg = "VTN service IP cannot be null";
throw new IllegalArgumentException(msg);
}
this.serviceIp = serviceIp;
return this;
}
/**
* Returns VTN service builder with the supplied service IP address.
*
* @param serviceIp service ip address as a string
* @return vtn service builder
*/
public Builder serviceIp(String serviceIp) {
try {
return serviceIp(IpAddress.valueOf(serviceIp));
} catch (IllegalArgumentException | NullPointerException e) {
final String msg = "Malformed IP address string " + serviceIp +
" for VTN service IP address";
throw new IllegalArgumentException(msg);
}
}
/**
* Returns VTN service builder with the supplied provider services.
*
* @param pServices provider services
* @return vtn service builder
*/
public Builder providerServices(Set<VtnServiceId> pServices) {
if (pServices == null) {
final String msg = "Provider services cannot be null";
throw new IllegalArgumentException(msg);
}
this.providerServices = pServices;
return this;
}
/**
* Returns VTN service builder with the supplied tenant services.
*
* @param tServices tenant services
* @return vtn service builder
*/
public Builder tenantServices(Set<VtnServiceId> tServices) {
if (tServices == null) {
final String msg = "Tenant services cannot be null";
throw new IllegalArgumentException(msg);
}
this.tenantServices = tServices;
return this;
}
}
}
......
......@@ -15,9 +15,10 @@
*/
package org.onosproject.xosclient.api;
import com.google.common.base.Strings;
import org.onlab.util.Identifier;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkArgument;
/**
* Representation of VTN service identifier.
......@@ -39,7 +40,7 @@ public final class VtnServiceId extends Identifier<String> {
* @return CordServiceId
*/
public static VtnServiceId of(String id) {
checkNotNull(id);
checkArgument(!Strings.isNullOrEmpty(id), "VTN service ID cannot be null");
return new VtnServiceId(id);
}
}
......
......@@ -119,12 +119,14 @@ public final class DefaultVtnPortApi extends XosApi implements VtnPortApi {
pair -> addressPairs.put(IpAddress.valueOf(pair.getIpAddress()),
MacAddress.valueOf(pair.getMacAddress())));
return new VtnPort(VtnPortId.of(osPort.getId()),
osPort.getName(),
VtnServiceId.of(osPort.getNetworkId()),
MacAddress.valueOf(osPort.getMacAddress()),
IpAddress.valueOf(ipAddr.getIpAddress()),
addressPairs);
return VtnPort.builder()
.id(VtnPortId.of(osPort.getId()))
.name(osPort.getName())
.serviceId(VtnServiceId.of(osPort.getNetworkId()))
.mac(osPort.getMacAddress())
.ip(ipAddr.getIpAddress())
.addressPairs(addressPairs)
.build();
}
// TODO remove this when XOS provides this information
......
......@@ -19,8 +19,6 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.google.common.collect.Sets;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onosproject.xosclient.api.OpenStackAccess;
import org.onosproject.xosclient.api.VtnServiceApi;
import org.onosproject.xosclient.api.XosAccess;
......@@ -146,15 +144,17 @@ public final class DefaultVtnServiceApi extends XosApi implements VtnServiceApi
return null;
}
return new VtnService(serviceId,
osNet.getName(),
serviceType(osNet.getName()),
networkType(osNet.getName()),
Long.parseLong(osNet.getProviderSegID()),
IpPrefix.valueOf(osSubnet.getCidr()),
IpAddress.valueOf(osSubnet.getGateway()),
providerServices(serviceId),
tenantServices(serviceId));
return VtnService.build()
.id(serviceId)
.name(osNet.getName())
.serviceType(serviceType(osNet.getName()))
.networkType(networkType(osNet.getName()))
.vni(osNet.getProviderSegID())
.subnet(osSubnet.getCidr())
.serviceIp(osSubnet.getGateway())
.providerServices(providerServices(serviceId))
.tenantServices(tenantServices(serviceId))
.build();
}
// TODO remove this when XOS provides this information
......@@ -177,7 +177,7 @@ public final class DefaultVtnServiceApi extends XosApi implements VtnServiceApi
// TODO remove this when XOS provides this information
private NetworkType networkType(String netName) {
checkArgument(!Strings.isNullOrEmpty(netName));
checkArgument(!Strings.isNullOrEmpty(netName), "VTN network name cannot be null");
String name = netName.toUpperCase();
if (name.contains(PUBLIC.name())) {
......@@ -193,7 +193,7 @@ public final class DefaultVtnServiceApi extends XosApi implements VtnServiceApi
// TODO remove this when XOS provides this information
private ServiceType serviceType(String netName) {
checkArgument(!Strings.isNullOrEmpty(netName));
checkArgument(!Strings.isNullOrEmpty(netName), "VTN network name cannot be null");
String name = netName.toUpperCase();
if (name.contains(VSG.name())) {
......