ONOS-2161 Add OVSDB adapter api in south bound.
Change-Id: I01e2976769b225444ab6fb94cb2fe9d26921ba1f
diff --git a/ovsdb/api/pom.xml b/ovsdb/api/pom.xml
new file mode 100644
index 0000000..62e8148
--- /dev/null
+++ b/ovsdb/api/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-ovsdb</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>onos-ovsdb-api</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-pool</groupId>
+ <artifactId>commons-pool</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-transport</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-transport-native-epoll</artifactId>
+ <version>${netty4.version}</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/EventSubject.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/EventSubject.java
new file mode 100644
index 0000000..6a06724
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/EventSubject.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+/**
+ * Represents for a entity that carry important information for listener.
+ */
+public interface EventSubject {
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java
new file mode 100644
index 0000000..1ee0a36
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a ovsdb bridge. This class is immutable.
+ */
+public final class OvsdbBridge {
+
+ private final OvsdbBridgeName bridgeName;
+ private final OvsdbDatapathId datapathId;
+
+ /**
+ * Constructor from a OvsdbBridgeName bridgeName and a OvsdbDatapathId
+ * datapathId.
+ *
+ * @param bridgeName the bridgeName to use
+ * @param datapathId the datapathId to use
+ */
+ public OvsdbBridge(OvsdbBridgeName bridgeName, OvsdbDatapathId datapathId) {
+ checkNotNull(bridgeName, "bridgeName is not null");
+ checkNotNull(datapathId, "datapathId is not null");
+ this.bridgeName = bridgeName;
+ this.datapathId = datapathId;
+ }
+
+ /**
+ * Gets the bridge name of the bridge.
+ *
+ * @return the bridge name of the bridge
+ */
+ public OvsdbBridgeName bridgeName() {
+ return bridgeName;
+ }
+
+ /**
+ * Gets the datapathId of the bridge.
+ *
+ * @return datapathId the datapathId to use
+ */
+ public OvsdbDatapathId datapathId() {
+ return datapathId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(bridgeName, datapathId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbBridge) {
+ final OvsdbBridge otherOvsdbBridge = (OvsdbBridge) obj;
+ return Objects.equals(this.bridgeName, otherOvsdbBridge.bridgeName)
+ && Objects.equals(this.datapathId,
+ otherOvsdbBridge.datapathId);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("bridgeName", bridgeName.value())
+ .add("datapathId", datapathId.value()).toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java
new file mode 100644
index 0000000..daedff5
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a bridge name. This class is immutable.
+ */
+public final class OvsdbBridgeName {
+
+ private final String value;
+
+ /**
+ * Constructor from a String bridge name.
+ *
+ * @param value the bridge name to use
+ */
+ public OvsdbBridgeName(String value) {
+ checkNotNull(value, "value is not null");
+ this.value = value;
+ }
+
+ /**
+ * Gets the value of the bridge name.
+ *
+ * @return the value of the bridge name
+ */
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbBridgeName) {
+ final OvsdbBridgeName otherBridgeName = (OvsdbBridgeName) obj;
+ return Objects.equals(this.value, otherBridgeName.value);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("value", value).toString();
+ }
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
new file mode 100644
index 0000000..08e3175
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import java.util.Set;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * Represents to provider facing side of a node.
+ */
+public interface OvsdbClientService {
+ /**
+ * Gets the node identifier.
+ *
+ * @return node identifier
+ */
+ OvsdbNodeId nodeId();
+
+ /**
+ * Creates the configuration for the tunnel.
+ *
+ * @param srcIp source IP address
+ * @param dstIp destination IP address
+ */
+ void createTunnel(IpAddress srcIp, IpAddress dstIp);
+
+ /**
+ * Drops the configuration for the tunnel.
+ *
+ * @param srcIp source IP address
+ * @param dstIp destination IP address
+ */
+ void dropTunnel(IpAddress srcIp, IpAddress dstIp);
+
+ /**
+ * Gets tunnels of the node.
+ *
+ * @return set of tunnels; empty if no tunnel is find
+ */
+ Set<OvsdbTunnel> getTunnels();
+
+ /**
+ * Creates a bridge.
+ *
+ * @param bridgeName bridge name
+ */
+ void createBridge(String bridgeName);
+
+ /**
+ * Drops a bridge.
+ *
+ * @param bridgeName bridge name
+ */
+ void dropBridge(String bridgeName);
+
+ /**
+ * Gets bridges of the node.
+ *
+ * @return set of bridges; empty if no bridge is find
+ */
+ Set<OvsdbBridge> getBridges();
+
+ /**
+ * Creates a port.
+ *
+ * @param bridgeName bridge name
+ * @param portName port name
+ */
+ void createPort(String bridgeName, String portName);
+
+ /**
+ * Drops a port.
+ *
+ * @param bridgeName bridge name
+ * @param portName port name
+ */
+ void dropPort(String bridgeName, String portName);
+
+ /**
+ * Gets ports of the bridge.
+ *
+ * @return set of ports; empty if no ports is find
+ */
+ Set<OvsdbPort> getPorts();
+
+ /**
+ * Checks if the node is still connected.
+ *
+ * @return true if the node is still connected
+ */
+ boolean isConnected();
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbController.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbController.java
new file mode 100644
index 0000000..9e24524
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbController.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import java.util.List;
+
+/**
+ * Abstraction of an ovsdb controller. Serves as a one stop shop for obtaining
+ * OvsdbNode and (un)register listeners on ovsdb events and ovsdb node events.
+ */
+public interface OvsdbController {
+
+ /**
+ * Adds Node Event Listener.
+ *
+ * @param listener node listener
+ */
+ void addNodeListener(OvsdbNodeListener listener);
+
+ /**
+ * Removes Node Event Listener.
+ *
+ * @param listener node listener
+ */
+ void removeNodeListener(OvsdbNodeListener listener);
+
+ /**
+ * Adds ovsdb event listener.
+ *
+ * @param listener event listener
+ */
+ void addOvsdbEventListener(OvsdbEventListener listener);
+
+ /**
+ * Removes ovsdb event listener.
+ *
+ * @param listener event listener
+ */
+ void removeOvsdbEventListener(OvsdbEventListener listener);
+
+ /**
+ * Gets all the nodes information.
+ *
+ * @return the list of node id
+ */
+ List<OvsdbNodeId> getNodeIds();
+
+ /**
+ * Gets a ovsdb client by node identifier.
+ *
+ * @param nodeId node identifier
+ * @return OvsdbClient ovsdb node information
+ */
+ OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbDatapathId.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbDatapathId.java
new file mode 100644
index 0000000..1a2d836
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbDatapathId.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Objects;
+
+/**
+ * The class representing a datapathid. This class is immutable.
+ */
+public final class OvsdbDatapathId {
+ private final String value;
+
+ /**
+ * Constructor from a String datapathid.
+ *
+ * @param value the datapathid to use
+ */
+ public OvsdbDatapathId(String value) {
+ checkNotNull(value, "value is not null");
+ this.value = value;
+ }
+
+ /**
+ * Gets the value of the datapathid.
+ *
+ * @return the value of the datapathid
+ */
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbDatapathId) {
+ final OvsdbDatapathId otherDatapathId = (OvsdbDatapathId) obj;
+ return Objects.equals(this.value, otherDatapathId.value);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("value", value).toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEvent.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEvent.java
new file mode 100644
index 0000000..35fac7bc
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEvent.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * The abstract event of ovsdb.
+ */
+public final class OvsdbEvent<S> {
+
+ public enum Type {
+ /**
+ * Signifies that a new ovs port update has been detected.
+ */
+ PORT_ADDED,
+ /**
+ * Signifies that a ovs port has been removed.
+ */
+ PORT_REMOVED
+ }
+
+ private final Type type;
+ private final S subject;
+
+ /**
+ * Creates an event of a given type and for the specified event subject.
+ *
+ * @param type event type
+ * @param subject event subject
+ */
+ public OvsdbEvent(Type type, S subject) {
+ this.type = type;
+ this.subject = subject;
+ }
+
+ /**
+ * Returns the type of the event.
+ *
+ * @return event type
+ */
+ public Type type() {
+ return type;
+ }
+
+ /**
+ * Returns the subject of the event.
+ *
+ * @return subject to which this event pertains
+ */
+ public S subject() {
+ return subject;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("type", type())
+ .add("subject", subject()).toString();
+ }
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEventListener.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEventListener.java
new file mode 100644
index 0000000..b7bf2b5
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+/**
+ * Allows for providers interested in ovsdb events to be notified.
+ */
+public interface OvsdbEventListener {
+ /**
+ * Handles the ovsdb event.
+ *
+ * @param event ovsdb event
+ */
+ void handle(OvsdbEvent<EventSubject> event);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeId.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeId.java
new file mode 100644
index 0000000..2c1a440
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeId.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * The class representing a OpenStack Compute or Network nodeId. This class is
+ * immutable.
+ */
+public final class OvsdbNodeId {
+ private static final String SCHEME = "ovsdb";
+ private final String nodeId;
+ private final String ipAddress;
+
+ /**
+ * Creates a new node identifier from a IpAddress ipAddress, a long port.
+ *
+ * @param ipAddress node IP address
+ * @param port node port
+ */
+ public OvsdbNodeId(IpAddress ipAddress, long port) {
+ checkNotNull(ipAddress, "ipAddress is not null");
+ this.ipAddress = ipAddress.toString();
+ this.nodeId = ipAddress + ":" + port;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(nodeId);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof OvsdbNodeId)) {
+ return false;
+ }
+
+ OvsdbNodeId otherNodeId = (OvsdbNodeId) other;
+
+ return Objects.equals(otherNodeId.nodeId, this.nodeId);
+ }
+
+ @Override
+ public String toString() {
+ return SCHEME + ":" + nodeId;
+ }
+
+ /**
+ * Gets the value of the NodeId.
+ *
+ * @return the value of the NodeId.
+ */
+ public String nodeId() {
+ return SCHEME + ":" + nodeId;
+ }
+
+ /**
+ * Get the IP address of the node.
+ *
+ * @return the IP address of the node
+ */
+ public String getIpAddress() {
+ return ipAddress;
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeListener.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeListener.java
new file mode 100644
index 0000000..ca732ef
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeListener.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+/**
+ * Allows for providers interested in node events to be notified.
+ */
+public interface OvsdbNodeListener {
+
+ /**
+ * Notifies that the node was added.
+ *
+ * @param nodeId the node where the event occurred
+ */
+ void nodeAdded(OvsdbNodeId nodeId);
+
+ /**
+ * Notifies that the node was removed.
+ *
+ * @param nodeId the node where the event occurred
+ */
+ void nodeRemoved(OvsdbNodeId nodeId);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPort.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPort.java
new file mode 100644
index 0000000..3c04f6a
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPort.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a ovsdb port. This class is immutable.
+ */
+public final class OvsdbPort {
+
+ private final OvsdbPortNumber portNumber;
+ private final OvsdbPortName portName;
+
+ /**
+ * Constructor from a OvsdbPortNumber portNumber, OvsdbPortName portName.
+ *
+ * @param portNumber the portNumber to use
+ * @param portName the portName to use
+ */
+ public OvsdbPort(OvsdbPortNumber portNumber, OvsdbPortName portName) {
+ checkNotNull(portNumber, "portNumber is not null");
+ checkNotNull(portName, "portName is not null");
+ this.portNumber = portNumber;
+ this.portName = portName;
+ }
+
+ /**
+ * Gets the port number of the port.
+ *
+ * @return the port number of the port
+ */
+ public OvsdbPortNumber portNumber() {
+ return portNumber;
+ }
+
+ /**
+ * Gets the port name of the port.
+ *
+ * @return the port name of the port
+ */
+ public OvsdbPortName portName() {
+ return portName;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(portNumber, portName);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbPort) {
+ final OvsdbPort otherOvsdbPort = (OvsdbPort) obj;
+ return Objects.equals(this.portNumber, otherOvsdbPort.portNumber)
+ && Objects.equals(this.portName, otherOvsdbPort.portName);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this)
+ .add("portNumber", String.valueOf(portNumber.value()))
+ .add("portName", portName.value()).toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortName.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortName.java
new file mode 100644
index 0000000..aa0f55b0
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortName.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a port number. This class is immutable.
+ */
+public final class OvsdbPortName {
+
+ private final String value;
+
+ /**
+ * Constructor from a String port name.
+ *
+ * @param value the port name to use
+ */
+ public OvsdbPortName(String value) {
+ checkNotNull(value, "value is not null");
+ this.value = value;
+ }
+
+ /**
+ * Gets the value of the port name.
+ *
+ * @return the value of the port name
+ */
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbPortName) {
+ final OvsdbPortName otherOvsdbPortName = (OvsdbPortName) obj;
+ return Objects.equals(this.value, otherOvsdbPortName.value);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("value", value).toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortNumber.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortNumber.java
new file mode 100644
index 0000000..9c57b5d
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortNumber.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * The class representing a port number. This class is immutable.
+ */
+public final class OvsdbPortNumber {
+
+ private final long value;
+
+ /**
+ * Constructor from a long port number.
+ *
+ * @param value the port number to use
+ */
+ public OvsdbPortNumber(long value) {
+ this.value = value;
+ }
+
+ /**
+ * Gets the value of the port number.
+ *
+ * @return the value of the port number
+ */
+ public long value() {
+ return value;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbPortNumber) {
+ final OvsdbPortNumber ovsdbPortNumber = (OvsdbPortNumber) obj;
+ return Objects.equals(this.value, ovsdbPortNumber.value);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("value", value).toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnel.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnel.java
new file mode 100644
index 0000000..e1c5c7f
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnel.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * The class representing a ovsdb tunnel. This class is immutable.
+ */
+public final class OvsdbTunnel {
+
+ private final IpAddress localIp;
+ private final IpAddress remoteIp;
+
+ public enum Type {
+ VXLAN, GRE
+ }
+
+ private final Type tunnelType;
+ private final OvsdbTunnelName tunnelName;
+
+ /**
+ * Constructor from a IpAddress localIp, IpAddress remoteIp Type tunnelType,
+ * OvsdbTunnelName tunnelName.
+ *
+ * @param localIp the localIp to use
+ * @param remoteIp the remoteIp to use
+ * @param tunnelType the tunnelType to use
+ * @param tunnelName the tunnelName to use
+ */
+ public OvsdbTunnel(IpAddress localIp, IpAddress remoteIp, Type tunnelType,
+ OvsdbTunnelName tunnelName) {
+ checkNotNull(localIp, "portName is not null");
+ checkNotNull(remoteIp, "portName is not null");
+ checkNotNull(tunnelName, "portName is not null");
+ this.localIp = localIp;
+ this.remoteIp = remoteIp;
+ this.tunnelType = tunnelType;
+ this.tunnelName = tunnelName;
+ }
+
+ /**
+ * Gets the local IP of the tunnel.
+ *
+ * @return the local IP of the tunnel
+ */
+ public IpAddress localIp() {
+ return localIp;
+ }
+
+ /**
+ * Gets the remote IP of the tunnel.
+ *
+ * @return the remote IP of the tunnel
+ */
+ public IpAddress remoteIp() {
+ return remoteIp;
+ }
+
+ /**
+ * Gets the tunnel type of the tunnel.
+ *
+ * @return the tunnel type of the tunnel
+ */
+ public Type tunnelType() {
+ return tunnelType;
+ }
+
+ /**
+ * Gets the tunnel name of the tunnel.
+ *
+ * @return the tunnel name of the tunnel
+ */
+ public OvsdbTunnelName tunnelName() {
+ return tunnelName;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(localIp, remoteIp, tunnelType, tunnelName);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbTunnel) {
+ final OvsdbTunnel otherOvsdbTunnel = (OvsdbTunnel) obj;
+ return Objects.equals(this.localIp, otherOvsdbTunnel.localIp)
+ && Objects.equals(this.remoteIp, otherOvsdbTunnel.remoteIp)
+ && Objects.equals(this.tunnelType,
+ otherOvsdbTunnel.tunnelType)
+ && Objects.equals(this.tunnelName,
+ otherOvsdbTunnel.tunnelName);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("localIp", localIp.toString())
+ .add("remoteIp", remoteIp.toString())
+ .add("tunnelType", tunnelType).add("tunnelName", tunnelName)
+ .toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnelName.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnelName.java
new file mode 100644
index 0000000..116f621
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnelName.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2015 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a tunnel name. This class is immutable.
+ */
+public final class OvsdbTunnelName {
+ private final String value;
+
+ /**
+ * Constructor from a String tunnel name.
+ *
+ * @param value the tunnel name to use
+ */
+ public OvsdbTunnelName(String value) {
+ checkNotNull(value, "value is not null");
+ this.value = value;
+ }
+
+ /**
+ * Gets the value of the tunnel name.
+ *
+ * @return the value of the tunnel name
+ */
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof OvsdbTunnelName) {
+ final OvsdbTunnelName otherOvsdbTunnelName = (OvsdbTunnelName) obj;
+ return Objects.equals(this.value, otherOvsdbTunnelName.value);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("value", value).toString();
+ }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbAgent.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbAgent.java
new file mode 100644
index 0000000..70ffae8
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbAgent.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015 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.ovsdb.controller.driver;
+
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+
+/**
+ * Responsible for keeping track of the current set of nodes connected to the
+ * system.
+ */
+public interface OvsdbAgent {
+ /**
+ * Add a node that has just connected to the system.
+ *
+ * @param nodeId the nodeId to add
+ * @param ovsdbClient the actual node object.
+ */
+ void addConnectedNode(OvsdbNodeId nodeId, OvsdbClientService ovsdbClient);
+
+ /**
+ * Clear all state in controller node maps for a node that has disconnected
+ * from the local controller. Also release control for that node from the
+ * global repository. Notify node listeners.
+ *
+ * @param nodeId the node id to be removed.
+ */
+ void removeConnectedNode(OvsdbNodeId nodeId);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbProviderService.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbProviderService.java
new file mode 100644
index 0000000..a7c0840
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbProviderService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 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.ovsdb.controller.driver;
+
+import io.netty.channel.Channel;
+
+/**
+ * Represents the driver side of an ovsdb node. This interface should never be
+ * exposed to consumers.
+ */
+public interface OvsdbProviderService {
+ /**
+ * Sets the ovsdb agent to be used. This method can only be called once.
+ *
+ * @param agent the agent to set.
+ */
+ void setAgent(OvsdbAgent agent);
+
+ /**
+ * Sets the associated Netty channel for this node.
+ *
+ * @param channel the Netty channel
+ */
+ void setChannel(Channel channel);
+
+ /**
+ * Announces to the ovsdb agent that this node has added.
+ */
+ void nodeAdded();
+
+ /**
+ * Announces to the ovsdb agent that this node has removed.
+ */
+ void nodeRemoved();
+
+ /**
+ * Sets whether the node is connected.
+ *
+ * @param connected whether the node is connected
+ */
+ void setConnection(boolean connected);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/package-info.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/package-info.java
new file mode 100644
index 0000000..b14afdf
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * Ovsdb controller node driver API.
+ */
+package org.onosproject.ovsdb.controller.driver;
\ No newline at end of file
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/package-info.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/package-info.java
new file mode 100644
index 0000000..d6fb434
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * Ovsdb controller API.
+ */
+package org.onosproject.ovsdb.controller;
\ No newline at end of file
diff --git a/ovsdb/pom.xml b/ovsdb/pom.xml
new file mode 100644
index 0000000..f0e081a
--- /dev/null
+++ b/ovsdb/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>onos-ovsdb</artifactId>
+ <name>onos-ovsdb</name>
+ <packaging>pom</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onlab-misc</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onlab-junit</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <modules>
+ <module>api</module>
+ </modules>
+</project>
\ No newline at end of file