Application manages the IP layer topology information - Interfaces

Change-Id: Ie1dea035674ee98583e98a82cca7e33ab0858b92
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStore.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStore.java
new file mode 100644
index 0000000..db1dd42
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/IpDeviceStore.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2014-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.iptopology.api.device;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onosproject.iptopology.api.DevicePrefix;
+import org.onosproject.iptopology.api.InterfaceIdentifier;
+import org.onosproject.iptopology.api.IpDevice;
+import org.onosproject.iptopology.api.DeviceIntf;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.Store;
+
+import java.util.List;
+
+/**
+ * Manages inventory of ip devices; not intended for direct use.
+ */
+public interface IpDeviceStore extends Store<IpDeviceEvent, IpDeviceStoreDelegate> {
+
+    /**
+     * Returns the number of ip devices known to the system.
+     *
+     * @return number of ip devices
+     */
+    int getIpDeviceCount();
+
+    /**
+     * Returns an iterable collection of all ip devices known to the system.
+     *
+     * @return ip device collection
+     */
+    Iterable<IpDevice> getIpDevices();
+
+
+    /**
+     * Returns an ip device with the specified identifier.
+     *
+     * @param deviceId device identifier
+     * @return ip device
+     */
+    IpDevice getIpDevice(DeviceId deviceId);
+
+    /**
+     * Creates a new infrastructure ip device, or updates an existing one using
+     * the supplied device description.
+     *
+     * @param providerId        provider identifier
+     * @param deviceId          device identifier
+     * @param deviceDescription device description
+     * @return ready to send event describing what occurred; null if no change
+     */
+    IpDeviceEvent createOrUpdateIpDevice(ProviderId providerId, DeviceId deviceId,
+                                     IpDeviceDescription deviceDescription);
+
+    /**
+     * Administratively removes the specified ip device from the store.
+     *
+     * @param deviceId device to be removed
+     * @return null if no such ip device
+     */
+    IpDeviceEvent removeIpDevice(DeviceId deviceId);
+
+    /**
+     * Updates the interface of the specified ip device using the given
+     * list of interface descriptions. The list is assumed to be comprehensive.
+     *
+     * @param providerId            provider identifier
+     * @param deviceId              ip device identifier
+     * @param interfaceDescriptions list of interface descriptions
+     * @return ready to send events describing what occurred; empty list if no change
+     */
+    List<IpDeviceEvent> updateInterfaces(ProviderId providerId, DeviceId deviceId,
+                                  List<InterfaceDescription> interfaceDescriptions);
+
+    /**
+     * Administratively removes the specified interface from the store.
+     *
+     * @param deviceId device of the interfaces to be removed
+     * @param interfaceDescriptions list of interface descriptions
+     * @return ready to send events describing what occurred.
+     */
+    List<IpDeviceEvent> removeInterfaces(DeviceId deviceId, List<InterfaceDescription> interfaceDescriptions);
+
+    /**
+     * Returns the list of interfaces that belong to the specified device.
+     *
+     * @param deviceId device identifier
+     * @return list of device interfaces
+     */
+    List<DeviceIntf> getInterfaces(DeviceId deviceId);
+
+    /**
+     * Returns the specified device interface.
+     *
+     * @param deviceId    device identifier
+     * @param ipv4Address ipv4 address of the interface
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, Ip4Address ipv4Address);
+
+    /**
+     * Returns the specified device interface.
+     *
+     * @param deviceId    device identifier
+     * @param ipv6Address ipv6 address of the interface
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, Ip6Address ipv6Address);
+
+    /**
+     * Returns the specified device interface.
+     *
+     * @param deviceId    device identifier
+     * @param intfId      interface identifier of the interface
+     * @return device interface
+     */
+    DeviceIntf getInterface(DeviceId deviceId, InterfaceIdentifier intfId);
+
+    /**
+     * Updates the prefix information of the specified ip device using the given
+     * list of prefix descriptions. The list is assumed to be comprehensive.
+     *
+     * @param providerId           provider identifier
+     * @param deviceId             ip device identifier
+     * @param prefixDescriptions   list of prefix descriptions
+     * @return ready to send events describing what occurred; empty list if no change
+     */
+    List<IpDeviceEvent>  updatePrefixes(ProviderId providerId, DeviceId deviceId,
+                                        List<PrefixDescription> prefixDescriptions);
+
+    /**
+     * Administratively removes the specified prefix from the store.
+     *
+     * @param deviceId device of the prefix to be removed
+     * @param prefixDescriptions list of prefix descriptions
+     * @return ready to send events describing what occurred.
+     */
+    List<IpDeviceEvent> removePrefixes(DeviceId deviceId, List<PrefixDescription> prefixDescriptions);
+
+    /**
+     * Returns the list of prefixes that belong to the specified device.
+     *
+     * @param deviceId device identifier
+     * @return list of device prefixes
+     */
+    List<DevicePrefix> getPrefixes(DeviceId deviceId);
+
+}
+