initial import

Change-Id: Ief25aef0066ea96bd2c329ccef974c072b3a5a73
diff --git a/net/api/src/main/java/net/onrc/onos/api/Description.java b/net/api/src/main/java/net/onrc/onos/api/Description.java
new file mode 100644
index 0000000..8a3c127
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/Description.java
@@ -0,0 +1,7 @@
+package net.onrc.onos.api;
+
+/**
+ * Base abstraction of a piece of information about network elements.
+ */
+public interface Description {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/DeviceId.java b/net/api/src/main/java/net/onrc/onos/api/DeviceId.java
new file mode 100644
index 0000000..2210742
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/DeviceId.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.api;
+
+import java.net.URI;
+
+/**
+ * Immutable representaion of a device identity.
+ */
+public class DeviceId {
+
+    private final URI uri;
+
+    public DeviceId(URI uri) {
+        this.uri = uri;
+    }
+
+    /**
+     * Returns the backing URI.
+     *
+     * @return backing device URI
+     */
+    public URI uri() {
+        return uri;
+    }
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/PortNumber.java b/net/api/src/main/java/net/onrc/onos/api/PortNumber.java
new file mode 100644
index 0000000..9a6dddd
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/PortNumber.java
@@ -0,0 +1,7 @@
+package net.onrc.onos.api;
+
+/**
+ * Representation of a port number.
+ */
+public interface PortNumber {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/Provider.java b/net/api/src/main/java/net/onrc/onos/api/Provider.java
new file mode 100644
index 0000000..1b38cf4
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/Provider.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.api;
+
+/**
+ * Abstraction of a provider of information about network environment.
+ */
+public interface Provider {
+
+    ProviderId id();
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/ProviderBroker.java b/net/api/src/main/java/net/onrc/onos/api/ProviderBroker.java
new file mode 100644
index 0000000..ef2d4dc
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/ProviderBroker.java
@@ -0,0 +1,27 @@
+package net.onrc.onos.api;
+
+/**
+ * Broker used for registering/unregistering information providers with the core.
+ *
+ * @param <T> type of the information provider
+ * @param <S> type of the provider service
+ */
+public interface ProviderBroker<T extends Provider, S extends ProviderService> {
+
+    /**
+     * Registers the supplied provider with the core.
+     *
+     * @param provider provider to be registered
+     * @return provider service for injecting information into core
+     */
+    S register(T provider);
+
+    /**
+     * Unregisters the supplied provider. As a result the previously issued
+     * provider service will be invalidated.
+     *
+     * @param provider provider to be unregistered
+     */
+    void unregister(T provider);
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/ProviderId.java b/net/api/src/main/java/net/onrc/onos/api/ProviderId.java
new file mode 100644
index 0000000..3f29bac
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/ProviderId.java
@@ -0,0 +1,43 @@
+package net.onrc.onos.api;
+
+/**
+ * Notion of provider identity.
+ */
+public class ProviderId {
+
+    private final String id;
+
+    public ProviderId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        ProviderId that = (ProviderId) o;
+
+        if (!id.equals(that.id)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "ProviderId{" +
+                "id='" + id + '\'' +
+                '}';
+    }
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/ProviderService.java b/net/api/src/main/java/net/onrc/onos/api/ProviderService.java
new file mode 100644
index 0000000..add3366
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/ProviderService.java
@@ -0,0 +1,8 @@
+package net.onrc.onos.api;
+
+/**
+ * Abstraction of a service through which providers can inject information
+ * about the network environment into the core.
+ */
+public interface ProviderService {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/device/DeviceDescription.java b/net/api/src/main/java/net/onrc/onos/api/device/DeviceDescription.java
new file mode 100644
index 0000000..ef9a694
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/device/DeviceDescription.java
@@ -0,0 +1,21 @@
+package net.onrc.onos.api.device;
+
+import net.onrc.onos.api.Description;
+
+import java.net.URI;
+
+/**
+ * Carrier of immutable information about a device.
+ */
+public interface DeviceDescription extends Description {
+
+    /**
+     * Protocol/provider specific URI that can be used to encode the identity
+     * information required to communicate with the device externally, e.g.
+     * datapath ID.
+     *
+     * @return provider specific URI for the device
+     */
+    URI deviceURI();
+
+}
\ No newline at end of file
diff --git a/net/api/src/main/java/net/onrc/onos/api/device/DeviceProvider.java b/net/api/src/main/java/net/onrc/onos/api/device/DeviceProvider.java
new file mode 100644
index 0000000..c93cab5
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/device/DeviceProvider.java
@@ -0,0 +1,9 @@
+package net.onrc.onos.api.device;
+
+import net.onrc.onos.api.Provider;
+
+/**
+ * Abstraction of a device information provider.
+ */
+public interface DeviceProvider extends Provider {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/device/DeviceProviderBroker.java b/net/api/src/main/java/net/onrc/onos/api/device/DeviceProviderBroker.java
new file mode 100644
index 0000000..fdbe322
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/device/DeviceProviderBroker.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.api.device;
+
+import net.onrc.onos.api.ProviderBroker;
+
+/**
+ * Abstraction of a device provider brokerage.
+ */
+public interface DeviceProviderBroker
+        extends ProviderBroker<DeviceProvider, DeviceProviderService> {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/device/DeviceProviderService.java b/net/api/src/main/java/net/onrc/onos/api/device/DeviceProviderService.java
new file mode 100644
index 0000000..b0a33a6
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/device/DeviceProviderService.java
@@ -0,0 +1,44 @@
+package net.onrc.onos.api.device;
+
+import net.onrc.onos.api.ProviderService;
+
+import java.util.List;
+
+/**
+ * Service through which device providers can inject device information into
+ * the core.
+ */
+public interface DeviceProviderService extends ProviderService {
+
+    // TODO: define suspend and remove actions on the mezzanine administrative API
+
+    /**
+     * Signals the core that a device has connected or has been detected somehow.
+     *
+     * @param deviceDescription information about network device
+     */
+    void deviceConnected(DeviceDescription deviceDescription);
+
+    /**
+     * Signals the core that a device has disconnected or is no longer reachable.
+     *
+     * @param deviceDescription device to be removed
+     */
+    void deviceDisconnected(DeviceDescription deviceDescription);
+
+    /**
+     * Sends information about all ports of a device. It is up to the core to
+     * determine what has changed.
+     *
+     * @param ports list of device ports
+     */
+    void updatePorts(List<PortDescription> ports);
+
+    /**
+     * Used to notify the core about port status change of a single port.
+     *
+     * @param port description of the port that changed
+     */
+    void portStatusChanged(PortDescription port);
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/device/PortDescription.java b/net/api/src/main/java/net/onrc/onos/api/device/PortDescription.java
new file mode 100644
index 0000000..9f5db2a
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/device/PortDescription.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.api.device;
+
+/**
+ * Information about a port.
+ */
+public interface PortDescription {
+
+    // TODO: possibly relocate this to a common ground so that this can also used by host tracking if required
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/host/HostDescription.java b/net/api/src/main/java/net/onrc/onos/api/host/HostDescription.java
new file mode 100644
index 0000000..a397155
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/host/HostDescription.java
@@ -0,0 +1,11 @@
+package net.onrc.onos.api.host;
+
+/**
+ * Information describing host and its location.
+ */
+public interface HostDescription {
+
+    // IP, MAC, VLAN-ID, HostLocation -> (ConnectionPoint + timestamp)
+    
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/host/HostProvider.java b/net/api/src/main/java/net/onrc/onos/api/host/HostProvider.java
new file mode 100644
index 0000000..f05e26d
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/host/HostProvider.java
@@ -0,0 +1,9 @@
+package net.onrc.onos.api.host;
+
+import net.onrc.onos.api.Provider;
+
+/**
+ * Provider of information about hosts and their location on the network.
+ */
+public interface HostProvider extends Provider {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/host/HostProviderBroker.java b/net/api/src/main/java/net/onrc/onos/api/host/HostProviderBroker.java
new file mode 100644
index 0000000..c799b20
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/host/HostProviderBroker.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.api.host;
+
+import net.onrc.onos.api.ProviderBroker;
+
+/**
+ * Abstraction of a host provider brokerage.
+ */
+public interface HostProviderBroker
+        extends ProviderBroker<HostProvider, HostProviderService> {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/host/HostProviderService.java b/net/api/src/main/java/net/onrc/onos/api/host/HostProviderService.java
new file mode 100644
index 0000000..662ba75
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/host/HostProviderService.java
@@ -0,0 +1,12 @@
+package net.onrc.onos.api.host;
+
+import net.onrc.onos.api.ProviderService;
+
+/**
+ * Means of conveying host information to the core.
+ */
+public interface HostProviderService extends ProviderService {
+    
+    void hostDetected(HostDescription hostDescription);
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/link/LinkDescription.java b/net/api/src/main/java/net/onrc/onos/api/link/LinkDescription.java
new file mode 100644
index 0000000..c40f522
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/link/LinkDescription.java
@@ -0,0 +1,17 @@
+package net.onrc.onos.api.link;
+
+/**
+ * Describes an infrastructure link.
+ */
+public interface LinkDescription {
+
+    // TODO: src, dst connection points, which are pairs of (DeviceId, PortNumber)
+
+//    On the north:
+//    Link = (ConnectPoint src, ConnectPoint dst);
+//    ConnectPoint = (DeviceId, PortNumber);
+
+//    On the south
+//    LinkDescription ~ Link
+
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/link/LinkProvider.java b/net/api/src/main/java/net/onrc/onos/api/link/LinkProvider.java
new file mode 100644
index 0000000..4d7ab86
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/link/LinkProvider.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.api.link;
+
+import net.onrc.onos.api.Provider;
+
+/**
+ * Abstraction of an entity providing information about infrastructure links
+ * to the core.
+ */
+public interface LinkProvider extends Provider {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/link/LinkProviderBroker.java b/net/api/src/main/java/net/onrc/onos/api/link/LinkProviderBroker.java
new file mode 100644
index 0000000..8da7bab
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/link/LinkProviderBroker.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.api.link;
+
+import net.onrc.onos.api.ProviderBroker;
+
+/**
+ * Abstraction of an infrastructure link provider brokerage.
+ */
+public interface LinkProviderBroker
+        extends ProviderBroker<LinkProvider, LinkProviderService> {
+}
diff --git a/net/api/src/main/java/net/onrc/onos/api/link/LinkProviderService.java b/net/api/src/main/java/net/onrc/onos/api/link/LinkProviderService.java
new file mode 100644
index 0000000..23fced8
--- /dev/null
+++ b/net/api/src/main/java/net/onrc/onos/api/link/LinkProviderService.java
@@ -0,0 +1,24 @@
+package net.onrc.onos.api.link;
+
+import net.onrc.onos.api.ProviderService;
+
+/**
+ * Means for injecting link information into the core.
+ */
+public interface LinkProviderService extends ProviderService {
+
+    /**
+     * Signals that an infrastructure link has been connected.
+     *
+     * @param linkDescription link information
+     */
+    void linkConnected(LinkDescription linkDescription);
+
+    /**
+     * Signals that an infrastructure link has been disconnected.
+     *
+     * @param linkDescription link information
+     */
+    void linkDisconnected(LinkDescription linkDescription);
+
+}