Placed API and implementation into separate packages
Change-Id: If8a9223a7a225db1b2aa2d09738857af482736bc
diff --git a/src/main/java/org/onosproject/cordvtn/api/ConnectionHandler.java b/src/main/java/org/onosproject/cordvtn/api/ConnectionHandler.java
new file mode 100644
index 0000000..5676221
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/ConnectionHandler.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015-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.onosproject.cordvtn.api;
+
+/**
+ * Entity capable of handling a subject connected and disconnected situation.
+ */
+public interface ConnectionHandler<T> {
+
+ /**
+ * Processes the connected subject.
+ *
+ * @param subject subject
+ */
+ void connected(T subject);
+
+ /**
+ * Processes the disconnected subject.
+ *
+ * @param subject subject.
+ */
+ void disconnected(T subject);
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/CordService.java b/src/main/java/org/onosproject/cordvtn/api/CordService.java
new file mode 100644
index 0000000..b6fa9b0
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/CordService.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2015-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.onosproject.cordvtn.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.net.Host;
+import org.onosproject.openstackinterface.OpenstackNetwork;
+import org.onosproject.openstackinterface.OpenstackSubnet;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+public final class CordService {
+
+ public enum ServiceType {
+ PRIVATE,
+ PUBLIC,
+ MANAGEMENT
+ }
+
+ private final CordServiceId id;
+ private final long segmentationId;
+ private final ServiceType serviceType;
+ private final IpPrefix serviceIpRange;
+ private final IpAddress serviceIp;
+ private final Map<Host, IpAddress> hosts;
+ private final Set<CordServiceId> tenantServices;
+
+ /**
+ * Default constructor.
+ *
+ * @param vNet OpenStack network
+ * @param subnet OpenStack subnet
+ * @param hosts host and tunnel ip map
+ * @param tenantServices list of tenant service ids
+ */
+ public CordService(OpenstackNetwork vNet, OpenstackSubnet subnet,
+ Map<Host, IpAddress> hosts, Set<CordServiceId> tenantServices) {
+ this.id = CordServiceId.of(vNet.id());
+ this.segmentationId = Long.parseLong(vNet.segmentId());
+ this.serviceType = getServiceType(vNet.name());
+ this.serviceIpRange = IpPrefix.valueOf(subnet.cidr());
+ this.serviceIp = IpAddress.valueOf(subnet.gatewayIp());
+ this.hosts = hosts;
+ this.tenantServices = tenantServices;
+ }
+
+ /**
+ * Returns service ID.
+ *
+ * @return service id
+ */
+ public CordServiceId id() {
+ return id;
+ }
+
+ /**
+ * Returns segmentation ID of this service.
+ *
+ * @return segmentation id
+ */
+ public long segmentationId() {
+ return segmentationId;
+ }
+
+ /**
+ * Returns service type.
+ *
+ * @return service type
+ */
+ public ServiceType serviceType() {
+ return serviceType;
+ }
+
+ /**
+ * Returns service IP range.
+ *
+ * @return CIDR
+ */
+ public IpPrefix serviceIpRange() {
+ return serviceIpRange;
+ }
+
+ /**
+ * Returns service IP address.
+ *
+ * @return ip address
+ */
+ public IpAddress serviceIp() {
+ return serviceIp;
+ }
+
+ /**
+ * Returns hosts associated with this service.
+ *
+ * @return list of hosts
+ */
+ public Map<Host, IpAddress> hosts() {
+ return hosts;
+ }
+
+ /**
+ * Returns tenant service IDs.
+ *
+ * @return list of tenant service id
+ */
+ public Set<CordServiceId> tenantServices() {
+ return tenantServices;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof CordService)) {
+ return false;
+ }
+ final CordService other = (CordService) obj;
+ return Objects.equals(this.id, other.id);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("id", id)
+ .add("segmentationId", segmentationId)
+ .add("serviceType", serviceType)
+ .add("serviceIpRange", serviceIpRange)
+ .add("serviceIp", serviceIp)
+ .add("tenantServices", tenantServices)
+ .toString();
+ }
+
+ /**
+ * Returns network type from network name.
+ * It assumes that network name contains network type.
+ *
+ * @param netName network name
+ * @return network type, or PRIVATE if it doesn't match any type
+ */
+ private ServiceType getServiceType(String netName) {
+ checkNotNull(netName);
+
+ String name = netName.toUpperCase();
+ if (name.contains(ServiceType.PUBLIC.toString())) {
+ return ServiceType.PUBLIC;
+ } else if (name.contains(ServiceType.MANAGEMENT.toString())) {
+ return ServiceType.MANAGEMENT;
+ } else {
+ return ServiceType.PRIVATE;
+ }
+ }
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/CordServiceId.java b/src/main/java/org/onosproject/cordvtn/api/CordServiceId.java
new file mode 100644
index 0000000..b8a22a2
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/CordServiceId.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015-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.onosproject.cordvtn.api;
+
+import org.onlab.util.Identifier;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Representation of service identifier.
+ */
+public final class CordServiceId extends Identifier<String> {
+ /**
+ * Default constructor.
+ *
+ * @param id service identifier
+ */
+ private CordServiceId(String id) {
+ super(id);
+ }
+
+ /**
+ * Returns the CordServiceId with value.
+ *
+ * @param id service id
+ * @return CordServiceId
+ */
+ public static CordServiceId of(String id) {
+ checkNotNull(id);
+ return new CordServiceId(id);
+ }
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/CordVtnConfig.java b/src/main/java/org/onosproject/cordvtn/api/CordVtnConfig.java
new file mode 100644
index 0000000..008012e
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/CordVtnConfig.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2015-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.onosproject.cordvtn.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.Config;
+import org.slf4j.Logger;
+
+import java.util.Map;
+import java.util.Set;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Configuration object for CordVtn service.
+ */
+public class CordVtnConfig extends Config<ApplicationId> {
+
+ protected final Logger log = getLogger(getClass());
+
+ public static final String PRIVATE_GATEWAY_MAC = "privateGatewayMac";
+ public static final String PUBLIC_GATEWAYS = "publicGateways";
+ public static final String GATEWAY_IP = "gatewayIp";
+ public static final String GATEWAY_MAC = "gatewayMac";
+ public static final String LOCAL_MANAGEMENT_IP = "localManagementIp";
+ public static final String OVSDB_PORT = "ovsdbPort";
+
+ public static final String SSH_PORT = "sshPort";
+ public static final String SSH_USER = "sshUser";
+ public static final String SSH_KEY_FILE = "sshKeyFile";
+
+ public static final String CORDVTN_NODES = "nodes";
+ public static final String HOSTNAME = "hostname";
+ public static final String HOST_MANAGEMENT_IP = "hostManagementIp";
+ public static final String DATA_PLANE_IP = "dataPlaneIp";
+ public static final String DATA_PLANE_INTF = "dataPlaneIntf";
+ public static final String BRIDGE_ID = "bridgeId";
+
+ /**
+ * Returns the set of nodes read from network config.
+ *
+ * @return set of CordVtnNodeConfig or empty set
+ */
+ public Set<CordVtnNode> cordVtnNodes() {
+
+ Set<CordVtnNode> nodes = Sets.newHashSet();
+ JsonNode jsonNodes = object.get(CORDVTN_NODES);
+ if (jsonNodes == null) {
+ log.debug("No CORD VTN nodes found");
+ return nodes;
+ }
+
+ for (JsonNode jsonNode : jsonNodes) {
+ try {
+ NetworkAddress hostMgmt = NetworkAddress.valueOf(getConfig(jsonNode, HOST_MANAGEMENT_IP));
+ NetworkAddress localMgmt = NetworkAddress.valueOf(getConfig(object, LOCAL_MANAGEMENT_IP));
+ if (hostMgmt.prefix().contains(localMgmt.prefix()) ||
+ localMgmt.prefix().contains(hostMgmt.prefix())) {
+ log.error("hostMamt and localMgmt cannot be overlapped, skip this node");
+ continue;
+ }
+
+ Ip4Address hostMgmtIp = hostMgmt.ip().getIp4Address();
+ SshAccessInfo sshInfo = new SshAccessInfo(
+ hostMgmtIp,
+ TpPort.tpPort(Integer.parseInt(getConfig(object, SSH_PORT))),
+ getConfig(object, SSH_USER), getConfig(object, SSH_KEY_FILE));
+
+ String hostname = getConfig(jsonNode, HOSTNAME);
+ CordVtnNode newNode = new CordVtnNode(
+ hostname, hostMgmt, localMgmt,
+ NetworkAddress.valueOf(getConfig(jsonNode, DATA_PLANE_IP)),
+ TpPort.tpPort(Integer.parseInt(getConfig(object, OVSDB_PORT))),
+ sshInfo,
+ DeviceId.deviceId(getConfig(jsonNode, BRIDGE_ID)),
+ getConfig(jsonNode, DATA_PLANE_INTF),
+ CordVtnNodeState.noState());
+
+ nodes.add(newNode);
+ } catch (IllegalArgumentException | NullPointerException e) {
+ log.error("{}", e.toString());
+ }
+ }
+
+ return nodes;
+ }
+
+ /**
+ * Returns value of a given path. If the path is missing, show log and return
+ * null.
+ *
+ * @param path path
+ * @return value or null
+ */
+ private String getConfig(JsonNode jsonNode, String path) {
+ jsonNode = jsonNode.path(path);
+
+ if (jsonNode.isMissingNode()) {
+ log.error("{} is not configured", path);
+ return null;
+ } else {
+ return jsonNode.asText();
+ }
+ }
+
+ /**
+ * Returns private network gateway MAC address.
+ *
+ * @return mac address, or null
+ */
+ public MacAddress privateGatewayMac() {
+ JsonNode jsonNode = object.get(PRIVATE_GATEWAY_MAC);
+ if (jsonNode == null) {
+ return null;
+ }
+
+ try {
+ return MacAddress.valueOf(jsonNode.asText());
+ } catch (IllegalArgumentException e) {
+ log.error("Wrong MAC address format {}", jsonNode.asText());
+ return null;
+ }
+ }
+
+ /**
+ * Returns public network gateway IP and MAC address pairs.
+ *
+ * @return map of ip and mac address
+ */
+ public Map<IpAddress, MacAddress> publicGateways() {
+ JsonNode jsonNodes = object.get(PUBLIC_GATEWAYS);
+ if (jsonNodes == null) {
+ return Maps.newHashMap();
+ }
+
+ Map<IpAddress, MacAddress> publicGateways = Maps.newHashMap();
+ jsonNodes.forEach(jsonNode -> {
+ try {
+ publicGateways.put(
+ IpAddress.valueOf(jsonNode.path(GATEWAY_IP).asText()),
+ MacAddress.valueOf(jsonNode.path(GATEWAY_MAC).asText()));
+ } catch (IllegalArgumentException | NullPointerException e) {
+ log.error("Wrong address format {}", e.toString());
+ }
+ });
+
+ return publicGateways;
+ }
+}
+
diff --git a/src/main/java/org/onosproject/cordvtn/api/CordVtnNode.java b/src/main/java/org/onosproject/cordvtn/api/CordVtnNode.java
new file mode 100644
index 0000000..c63a9e4
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/CordVtnNode.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2015-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.onosproject.cordvtn.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.TpPort;
+import org.onosproject.net.DeviceId;
+
+import java.util.Comparator;
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Representation of a compute infrastructure node for CORD VTN service.
+ */
+public final class CordVtnNode {
+
+ private final String hostname;
+ private final NetworkAddress hostMgmtIp;
+ private final NetworkAddress localMgmtIp;
+ private final NetworkAddress dpIp;
+ private final TpPort ovsdbPort;
+ private final SshAccessInfo sshInfo;
+ private final DeviceId bridgeId;
+ private final String dpIntf;
+ private final CordVtnNodeState state;
+
+ public static final Comparator<CordVtnNode> CORDVTN_NODE_COMPARATOR =
+ (node1, node2) -> node1.hostname().compareTo(node2.hostname());
+
+ /**
+ * Creates a new node.
+ *
+ * @param hostname hostname
+ * @param hostMgmtIp host management network address
+ * @param localMgmtIp local management network address
+ * @param dpIp data plane network address
+ * @param ovsdbPort port number for OVSDB connection
+ * @param sshInfo SSH access information
+ * @param bridgeId integration bridge identifier
+ * @param dpIntf data plane interface name
+ * @param state cordvtn node state
+ */
+ public CordVtnNode(String hostname, NetworkAddress hostMgmtIp, NetworkAddress localMgmtIp,
+ NetworkAddress dpIp, TpPort ovsdbPort, SshAccessInfo sshInfo,
+ DeviceId bridgeId, String dpIntf, CordVtnNodeState state) {
+ this.hostname = checkNotNull(hostname, "hostname cannot be null");
+ this.hostMgmtIp = checkNotNull(hostMgmtIp, "hostMgmtIp cannot be null");
+ this.localMgmtIp = checkNotNull(localMgmtIp, "localMgmtIp cannot be null");
+ this.dpIp = checkNotNull(dpIp, "dpIp cannot be null");
+ this.ovsdbPort = checkNotNull(ovsdbPort, "ovsdbPort cannot be null");
+ this.sshInfo = checkNotNull(sshInfo, "sshInfo cannot be null");
+ this.bridgeId = checkNotNull(bridgeId, "bridgeId cannot be null");
+ this.dpIntf = checkNotNull(dpIntf, "dpIntf cannot be null");
+ this.state = state;
+ }
+
+ /**
+ * Returns cordvtn node with new state.
+ *
+ * @param node cordvtn node
+ * @param state cordvtn node init state
+ * @return cordvtn node
+ */
+ public static CordVtnNode getUpdatedNode(CordVtnNode node, CordVtnNodeState state) {
+ return new CordVtnNode(node.hostname,
+ node.hostMgmtIp, node.localMgmtIp, node.dpIp,
+ node.ovsdbPort,
+ node.sshInfo,
+ node.bridgeId,
+ node.dpIntf, state);
+ }
+
+ /**
+ * Returns the hostname.
+ *
+ * @return hostname
+ */
+ public String hostname() {
+ return this.hostname;
+ }
+
+ /**
+ * Returns the host management network address.
+ *
+ * @return network address
+ */
+ public NetworkAddress hostMgmtIp() {
+ return this.hostMgmtIp;
+ }
+
+ /**
+ * Returns the local management network address.
+ *
+ * @return network address
+ */
+ public NetworkAddress localMgmtIp() {
+ return this.localMgmtIp;
+ }
+
+ /**
+ * Returns the data plane network address.
+ *
+ * @return network address
+ */
+ public NetworkAddress dpIp() {
+ return this.dpIp;
+ }
+
+ /**
+ * Returns the port number used for OVSDB connection.
+ *
+ * @return port number
+ */
+ public TpPort ovsdbPort() {
+ return this.ovsdbPort;
+ }
+
+ /**
+ * Returns the SSH access information.
+ *
+ * @return ssh access information
+ */
+ public SshAccessInfo sshInfo() {
+ return this.sshInfo;
+ }
+
+ /**
+ * Returns the identifier of the integration bridge.
+ *
+ * @return device id
+ */
+ public DeviceId intBrId() {
+ return this.bridgeId;
+ }
+
+ /**
+ * Returns the identifier of the OVSDB device.
+ *
+ * @return device id
+ */
+ public DeviceId ovsdbId() {
+ return DeviceId.deviceId("ovsdb:" + this.hostMgmtIp.ip().toString());
+ }
+
+ /**
+ * Returns data plane interface name.
+ *
+ * @return data plane interface name
+ */
+ public String dpIntf() {
+ return this.dpIntf;
+ }
+
+ /**
+ * Returns the state of the node.
+ *
+ * @return state
+ */
+ public CordVtnNodeState state() {
+ return this.state;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj instanceof CordVtnNode) {
+ CordVtnNode that = (CordVtnNode) obj;
+ if (Objects.equals(hostname, that.hostname) &&
+ Objects.equals(hostMgmtIp, that.hostMgmtIp) &&
+ Objects.equals(localMgmtIp, that.localMgmtIp) &&
+ Objects.equals(dpIp, that.dpIp) &&
+ Objects.equals(ovsdbPort, that.ovsdbPort) &&
+ Objects.equals(sshInfo, that.sshInfo) &&
+ Objects.equals(bridgeId, that.bridgeId) &&
+ Objects.equals(dpIntf, that.dpIntf)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(hostname, hostMgmtIp, localMgmtIp, dpIp,
+ ovsdbPort, sshInfo, bridgeId, dpIntf);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("hostname", hostname)
+ .add("hostMgmtIp", hostMgmtIp)
+ .add("localMgmtIp", localMgmtIp)
+ .add("dpIp", dpIp)
+ .add("port", ovsdbPort)
+ .add("sshInfo", sshInfo)
+ .add("bridgeId", bridgeId)
+ .add("dpIntf", dpIntf)
+ .add("state", state)
+ .toString();
+ }
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/CordVtnNodeState.java b/src/main/java/org/onosproject/cordvtn/api/CordVtnNodeState.java
new file mode 100644
index 0000000..1121390
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/CordVtnNodeState.java
@@ -0,0 +1,30 @@
+/*
+ * 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.onosproject.cordvtn.api;
+
+/**
+ * Entity that defines possible init state of the cordvtn node.
+ */
+public interface CordVtnNodeState {
+ /**
+ * Returns null for no state.
+ *
+ * @return null
+ */
+ static CordVtnNodeState noState() {
+ return null;
+ }
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/CordVtnService.java b/src/main/java/org/onosproject/cordvtn/api/CordVtnService.java
new file mode 100644
index 0000000..5950670
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/CordVtnService.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2015-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.onosproject.cordvtn.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.HostId;
+
+import java.util.Map;
+
+/**
+ * Service for provisioning overlay virtual networks on compute nodes.
+ */
+public interface CordVtnService {
+
+ String CORDVTN_APP_ID = "org.onosproject.cordvtn";
+
+ /**
+ * Adds a new VM on a given node and connect point.
+ *
+ * @param node cordvtn node
+ * @param connectPoint connect point
+ */
+ void addServiceVm(CordVtnNode node, ConnectPoint connectPoint);
+
+ /**
+ * Removes a VM from a given node and connect point.
+ *
+ * @param connectPoint connect point
+ */
+ void removeServiceVm(ConnectPoint connectPoint);
+
+ /**
+ * Creates dependencies for a given tenant service.
+ *
+ * @param tServiceId id of the service which has a dependency
+ * @param pServiceId id of the service which provide dependency
+ * @param isBidirectional true to enable bidirectional connectivity between two services
+ */
+ void createServiceDependency(CordServiceId tServiceId,
+ CordServiceId pServiceId,
+ boolean isBidirectional);
+
+ /**
+ * Removes all dependencies from a given tenant service.
+ *
+ * @param tServiceId id of the service which has a dependency
+ * @param pServiceId id of the service which provide dependency
+ */
+ void removeServiceDependency(CordServiceId tServiceId, CordServiceId pServiceId);
+
+ /**
+ * Updates virtual service gateways.
+ *
+ * @param vSgHost host id of vSG host
+ * @param serviceVlan service vlan id
+ * @param vSgs map of ip and mac address of vSGs running in this vSG host
+ */
+ void updateVirtualSubscriberGateways(HostId vSgHost, String serviceVlan,
+ Map<IpAddress, MacAddress> vSgs);
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/NetworkAddress.java b/src/main/java/org/onosproject/cordvtn/api/NetworkAddress.java
new file mode 100644
index 0000000..23c7318
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/NetworkAddress.java
@@ -0,0 +1,114 @@
+/*
+ * 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.onosproject.cordvtn.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Representation of a network address, which consists of IP address and prefix.
+ */
+public final class NetworkAddress {
+ private final IpAddress ip;
+ private final IpPrefix prefix;
+
+ /**
+ * Constructor for a given IP address and prefix.
+ *
+ * @param ip ip address
+ * @param prefix ip prefix
+ */
+ public NetworkAddress(IpAddress ip, IpPrefix prefix) {
+ this.ip = ip;
+ this.prefix = prefix;
+ }
+
+ /**
+ * Converts a CIDR notation string into a network address.
+ *
+ * @param cidr cidr
+ * @return network address
+ * @throws IllegalArgumentException if the cidr is not valid
+ */
+ public static NetworkAddress valueOf(String cidr) {
+ checkArgument(cidr.contains("/"));
+
+ IpAddress ipAddress = IpAddress.valueOf(cidr.split("/")[0]);
+ IpPrefix ipPrefix = IpPrefix.valueOf(cidr);
+
+ return new NetworkAddress(ipAddress, ipPrefix);
+ }
+
+ /**
+ * Returns the IP address value of the network address.
+ *
+ * @return ip address
+ */
+ public IpAddress ip() {
+ return this.ip;
+ }
+
+ /**
+ * Returns the IP prefix value of the network address.
+ *
+ * @return ip prefix
+ */
+ public IpPrefix prefix() {
+ return this.prefix;
+ }
+
+ /**
+ * Converts a network address to a CIDR notation.
+ *
+ * @return cidr notation string
+ */
+ public String cidr() {
+ return ip.toString() + "/" + prefix.prefixLength();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj instanceof NetworkAddress) {
+ NetworkAddress that = (NetworkAddress) obj;
+ if (Objects.equals(ip, that.ip) && Objects.equals(prefix, that.prefix)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ip, prefix);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("IpAddress", ip)
+ .add("IpPrefix", prefix)
+ .toString();
+ }
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/SshAccessInfo.java b/src/main/java/org/onosproject/cordvtn/api/SshAccessInfo.java
new file mode 100644
index 0000000..7679348
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/SshAccessInfo.java
@@ -0,0 +1,119 @@
+/*
+ * 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.onosproject.cordvtn.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.TpPort;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Representation of SSH access information.
+ */
+public final class SshAccessInfo {
+
+ private final Ip4Address remoteIp;
+ private final TpPort port;
+ private final String user;
+ private final String privateKey;
+
+ /**
+ * Creates a new SSH access information.
+ *
+ * @param remoteIp ssh remote ip address
+ * @param port ssh port number
+ * @param user user name
+ * @param privateKey path of ssh private key
+ */
+ public SshAccessInfo(Ip4Address remoteIp, TpPort port, String user, String privateKey) {
+ this.remoteIp = checkNotNull(remoteIp);
+ this.port = checkNotNull(port);
+ this.user = checkNotNull(user);
+ this.privateKey = checkNotNull(privateKey);
+ }
+
+ /**
+ * Returns the remote IP address.
+ *
+ * @return ip address
+ */
+ public Ip4Address remoteIp() {
+ return this.remoteIp;
+ }
+
+ /**
+ * Returns the port number.
+ *
+ * @return ssh port
+ */
+ public TpPort port() {
+ return this.port;
+ }
+
+ /**
+ * Returns the user name.
+ *
+ * @return user name
+ */
+ public String user() {
+ return this.user;
+ }
+
+ /**
+ * Returns the private key path.
+ *
+ * @return privateKey
+ */
+ public String privateKey() {
+ return privateKey;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj instanceof SshAccessInfo) {
+ SshAccessInfo that = (SshAccessInfo) obj;
+ if (Objects.equals(remoteIp, that.remoteIp) &&
+ Objects.equals(port, that.port) &&
+ Objects.equals(user, that.user) &&
+ Objects.equals(privateKey, that.privateKey)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(remoteIp, port, user, privateKey);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("remoteIp", remoteIp)
+ .add("port", port)
+ .add("user", user)
+ .add("privateKey", privateKey)
+ .toString();
+ }
+}
diff --git a/src/main/java/org/onosproject/cordvtn/api/package-info.java b/src/main/java/org/onosproject/cordvtn/api/package-info.java
new file mode 100644
index 0000000..7d41963
--- /dev/null
+++ b/src/main/java/org/onosproject/cordvtn/api/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * API for CORD VTN application.
+ */
+package org.onosproject.cordvtn.api;
\ No newline at end of file