ONOS-6886 Move interface classes from incubator to core

Change-Id: Iaae4d98279e4b77fc3f0b5a63d547921f93aeb46
diff --git a/core/api/src/main/java/org/onosproject/net/intf/Interface.java b/core/api/src/main/java/org/onosproject/net/intf/Interface.java
new file mode 100644
index 0000000..9c059e4
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intf/Interface.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.net.intf;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.host.InterfaceIpAddress;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * An Interface maps network configuration information (such as addresses and
+ * vlans) to a port in the network.
+ */
+
+public class Interface {
+    public static final String NO_INTERFACE_NAME = "";
+
+    private final String name;
+    private final ConnectPoint connectPoint;
+    private final List<InterfaceIpAddress> ipAddresses;
+    private final MacAddress macAddress;
+    // TODO: Deprecate this due to ambiguity
+    private final VlanId vlan;
+    private final VlanId vlanUntagged;
+    private final Set<VlanId> vlanTagged;
+    private final VlanId vlanNative;
+
+    /**
+     * Creates new Interface with the provided configuration.
+     *
+     * @param name name of the interface
+     * @param connectPoint the connect point this interface maps to
+     * @param ipAddresses list of IP addresses
+     * @param macAddress MAC address
+     * @param vlan VLAN ID
+     */
+    public Interface(String name, ConnectPoint connectPoint,
+                     List<InterfaceIpAddress> ipAddresses,
+                     MacAddress macAddress, VlanId vlan) {
+        this(name, connectPoint, ipAddresses, macAddress, vlan, null, null, null);
+    }
+
+    /**
+     * Creates new Interface with the provided configuration.
+     *
+     * @param name name of the interface
+     * @param connectPoint the connect point this interface maps to
+     * @param ipAddresses list of IP addresses
+     * @param macAddress MAC address
+     * @param vlan VLAN ID
+     * @param vlanUntagged untagged VLAN.
+     *                     Cannot be used with vlanTagged or vlanNative.
+     * @param vlanTagged   tagged VLANs.
+     *                     Cannot be used with vlanUntagged.
+     * @param vlanNative   native vLAN. Optional.
+     *                     Can only be used when vlanTagged is specified. Cannot be used with vlanUntagged.
+     */
+    public Interface(String name, ConnectPoint connectPoint,
+                     List<InterfaceIpAddress> ipAddresses,
+                     MacAddress macAddress, VlanId vlan,
+                     VlanId vlanUntagged, Set<VlanId> vlanTagged, VlanId vlanNative) {
+        this.name = name == null ? NO_INTERFACE_NAME : name;
+        this.connectPoint = checkNotNull(connectPoint);
+        this.ipAddresses = ipAddresses == null ? Lists.newArrayList() : ipAddresses;
+        this.macAddress = macAddress == null ? MacAddress.NONE : macAddress;
+        this.vlan = vlan == null ? VlanId.NONE : vlan;
+        this.vlanUntagged = vlanUntagged == null ? VlanId.NONE : vlanUntagged;
+        this.vlanTagged = vlanTagged == null ? ImmutableSet.of() : ImmutableSet.copyOf(vlanTagged);
+        this.vlanNative = vlanNative == null ? VlanId.NONE : vlanNative;
+    }
+
+    /**
+     * Retrieves the name of the interface.
+     *
+     * @return name
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Retrieves the connection point that this interface maps to.
+     *
+     * @return the connection point
+     */
+    public ConnectPoint connectPoint() {
+        return connectPoint;
+    }
+
+    /**
+     * Retrieves a list of IP addresses that are assigned to the interface in
+     * the order that they were configured.
+     *
+     * @return list of IP addresses
+     */
+    public List<InterfaceIpAddress> ipAddressesList() {
+        return ipAddresses;
+    }
+
+    /**
+     * Retrieves the MAC address that is assigned to the interface.
+     *
+     * @return the MAC address
+     */
+    public MacAddress mac() {
+        return macAddress;
+    }
+
+    /**
+     * Retrieves the VLAN ID that is assigned to the interface.
+     *
+     * @return the VLAN ID
+     */
+    public VlanId vlan() {
+        return vlan;
+    }
+
+    /**
+     * Retrieves the VLAN ID that is assigned to untagged packets.
+     *
+     * @return the VLAN ID
+     */
+    public VlanId vlanUntagged() {
+        return vlanUntagged;
+    }
+
+    /**
+     * Retrieves the set of VLAN IDs that are allowed on this interface.
+     *
+     * @return the VLAN ID
+     */
+    public Set<VlanId> vlanTagged() {
+        return vlanTagged;
+    }
+
+    /**
+     * Retrieves the VLAN ID that is assigned to untagged packets on this
+     * tagged interface.
+     *
+     * @return the VLAN ID
+     */
+    public VlanId vlanNative() {
+        return vlanNative;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof Interface)) {
+            return false;
+        }
+
+        Interface otherInterface = (Interface) other;
+
+        return Objects.equals(name, otherInterface.name) &&
+                Objects.equals(connectPoint, otherInterface.connectPoint) &&
+                Objects.equals(ipAddresses, otherInterface.ipAddresses) &&
+                Objects.equals(macAddress, otherInterface.macAddress) &&
+                Objects.equals(vlan, otherInterface.vlan) &&
+                Objects.equals(vlanUntagged, otherInterface.vlanUntagged) &&
+                Objects.equals(vlanTagged, otherInterface.vlanTagged) &&
+                Objects.equals(vlanNative, otherInterface.vlanNative);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(connectPoint, name, ipAddresses, macAddress, vlan,
+                vlanUntagged, vlanTagged, vlanNative);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("name", name)
+                .add("connectPoint", connectPoint)
+                .add("ipAddresses", ipAddresses)
+                .add("macAddress", macAddress)
+                .add("vlan", vlan)
+                .add("vlanUntagged", vlanUntagged)
+                .add("vlanTagged", vlanTagged)
+                .add("vlanNative", vlanNative)
+                .toString();
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intf/InterfaceAdminService.java b/core/api/src/main/java/org/onosproject/net/intf/InterfaceAdminService.java
new file mode 100644
index 0000000..c276c96
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intf/InterfaceAdminService.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.net.intf;
+
+import org.onosproject.net.ConnectPoint;
+
+/**
+ * Provides a means to modify the interfaces configuration.
+ */
+public interface InterfaceAdminService {
+
+    /**
+     * Adds a new interface configuration to the system.
+     *
+     * @param intf interface to add
+     */
+    void add(Interface intf);
+
+    /**
+     * Removes an interface configuration from the system.
+     *
+     * @param connectPoint connect point of the interface
+     * @param name name of the interface
+     * @return the result of removal
+     */
+    boolean remove(ConnectPoint connectPoint, String name);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java b/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java
new file mode 100644
index 0000000..1e7d9ba
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.net.intf;
+
+import org.joda.time.LocalDateTime;
+import org.onosproject.event.AbstractEvent;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Describes an interface event.
+ */
+public class InterfaceEvent extends AbstractEvent<InterfaceEvent.Type, Interface> {
+
+    private final Interface prevSubject;
+
+    public enum Type {
+        /**
+         * Indicates a new interface has been added.
+         */
+        INTERFACE_ADDED,
+
+        /**
+         * Indicates an interface has been updated.
+         */
+        INTERFACE_UPDATED,
+
+        /**
+         * Indicates an interface has been removed.
+         */
+        INTERFACE_REMOVED
+    }
+
+    /**
+     * Creates an interface event with type and subject.
+     *
+     * @param type event type
+     * @param subject subject interface
+     */
+    public InterfaceEvent(Type type, Interface subject) {
+        this(type, subject, null);
+    }
+
+    /**
+     * Creates an interface event with type, subject and time of event.
+     *
+     * @param type event type
+     * @param subject subject interface
+     * @param time time of event
+     */
+    public InterfaceEvent(Type type, Interface subject, long time) {
+        this(type, subject, null, time);
+    }
+
+    /**
+     * Creates an interface event with type, subject and previous subject.
+     *
+     * @param type event type
+     * @param subject subject interface
+     * @param prevSubject previous interface subject
+     */
+    public InterfaceEvent(Type type, Interface subject, Interface prevSubject) {
+        super(type, subject);
+        this.prevSubject = prevSubject;
+    }
+
+    /**
+     * Creates an interface event with type, subject, previous subject and time.
+     *
+     * @param type event type
+     * @param subject subject interface
+     * @param prevSubject previous interface subject
+     * @param time time of event
+     */
+    public InterfaceEvent(Type type, Interface subject, Interface prevSubject, long time) {
+        super(type, subject, time);
+        this.prevSubject = prevSubject;
+    }
+
+    /**
+     * Returns the previous interface subject.
+     *
+     * @return previous subject of interface or null if the event is not interface specific.
+     */
+    public Interface prevSubject() {
+        return prevSubject;
+    }
+
+    @Override
+    public String toString() {
+        if (prevSubject == null) {
+            return super.toString();
+        }
+        return toStringHelper(this)
+                .add("time", new LocalDateTime(time()))
+                .add("type", type())
+                .add("subject", subject())
+                .add("prevSubject", prevSubject)
+                .toString();
+     }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intf/InterfaceListener.java b/core/api/src/main/java/org/onosproject/net/intf/InterfaceListener.java
new file mode 100644
index 0000000..878b52d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intf/InterfaceListener.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.net.intf;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Listener for interface events.
+ */
+public interface InterfaceListener extends EventListener<InterfaceEvent> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intf/InterfaceService.java b/core/api/src/main/java/org/onosproject/net/intf/InterfaceService.java
new file mode 100644
index 0000000..3e2f742
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intf/InterfaceService.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.net.intf;
+
+import java.util.Set;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.event.ListenerService;
+import org.onosproject.net.ConnectPoint;
+
+/**
+ * Service for interacting with interfaces.
+ */
+
+public interface InterfaceService
+        extends ListenerService<InterfaceEvent, InterfaceListener> {
+
+    /**
+     * Returns the set of all interfaces in the system.
+     *
+     * @return set of interfaces
+     */
+    Set<Interface> getInterfaces();
+
+    /**
+     * Returns the interface with the given name.
+     *
+     * @param connectPoint connect point of the interface
+     * @param name name of the interface
+     * @return interface if it exists, otherwise null
+     */
+    Interface getInterfaceByName(ConnectPoint connectPoint, String name);
+
+    /**
+     * Returns the set of interfaces configured on the given port.
+     *
+     * @param port connect point
+     * @return set of interfaces
+     */
+    Set<Interface> getInterfacesByPort(ConnectPoint port);
+
+    /**
+     * Returns the set of interfaces with the given IP address.
+     *
+     * @param ip IP address
+     * @return set of interfaces
+     */
+    Set<Interface> getInterfacesByIp(IpAddress ip);
+
+    /**
+     * Returns the set of interfaces in the given VLAN.
+     *
+     * @param vlan VLAN ID of the interfaces
+     * @return set of interfaces
+     */
+    Set<Interface> getInterfacesByVlan(VlanId vlan);
+
+    /**
+     * Returns an interface that has an address that is in the same subnet as
+     * the given IP address.
+     *
+     * @param ip IP address to find matching subnet interface for
+     * @return interface
+     */
+    Interface getMatchingInterface(IpAddress ip);
+
+    /**
+     * Returns all interfaces that have an address that is in the same
+     * subnet as the given IP address.
+     *
+     * @param ip IP address to find matching subnet interface for
+     * @return a set of interfaces
+     */
+    Set<Interface> getMatchingInterfaces(IpAddress ip);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intf/package-info.java b/core/api/src/main/java/org/onosproject/net/intf/package-info.java
new file mode 100644
index 0000000..6119e10
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intf/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.
+ */
+
+/**
+ * Interface Service.
+ */
+package org.onosproject.net.intf;
diff --git a/core/api/src/test/java/org/onosproject/net/intf/InterfaceServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/intf/InterfaceServiceAdapter.java
new file mode 100644
index 0000000..8eb2214
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/intf/InterfaceServiceAdapter.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.net.intf;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.Set;
+
+/**
+ * Interface service adapter class for tests.
+ */
+public class InterfaceServiceAdapter implements InterfaceService {
+    @Override
+    public Set<Interface> getInterfaces() {
+        return null;
+    }
+
+    @Override
+    public Interface getInterfaceByName(ConnectPoint connectPoint, String name) {
+        return null;
+    }
+
+    @Override
+    public Set<Interface> getInterfacesByPort(ConnectPoint port) {
+        return null;
+    }
+
+    @Override
+    public Set<Interface> getInterfacesByIp(IpAddress ip) {
+        return null;
+    }
+
+    @Override
+    public Set<Interface> getInterfacesByVlan(VlanId vlan) {
+        return null;
+    }
+
+    @Override
+    public Interface getMatchingInterface(IpAddress ip) {
+        return null;
+    }
+
+    @Override
+    public Set<Interface> getMatchingInterfaces(IpAddress ip) {
+        return null;
+    }
+
+    @Override
+    public void addListener(InterfaceListener listener) {
+
+    }
+
+    @Override
+    public void removeListener(InterfaceListener listener) {
+
+    }
+}