Support auxiliary location in Host

Change-Id: If65ee733f03aa098a1db2b4ab663b1591495b061
diff --git a/core/api/src/main/java/org/onosproject/net/DefaultHost.java b/core/api/src/main/java/org/onosproject/net/DefaultHost.java
index 8e6c195..5c28a04 100644
--- a/core/api/src/main/java/org/onosproject/net/DefaultHost.java
+++ b/core/api/src/main/java/org/onosproject/net/DefaultHost.java
@@ -37,6 +37,7 @@
     private final MacAddress mac;
     private final VlanId vlan;
     private final Set<HostLocation> locations;
+    private final Set<HostLocation> auxLocations;
     private final Set<IpAddress> ips;
     private final VlanId innerVlan;
     private final EthType tpid;
@@ -116,15 +117,7 @@
     public DefaultHost(ProviderId providerId, HostId id, MacAddress mac, VlanId vlan,
                        Set<HostLocation> locations, Set<IpAddress> ips, VlanId innerVlan,
                        EthType tpid, boolean configured, Annotations... annotations) {
-        super(providerId, id, annotations);
-        this.mac = mac;
-        this.vlan = vlan;
-        this.locations = new HashSet<>(locations);
-        this.ips = new HashSet<>(ips);
-        this.configured = configured;
-        this.innerVlan = innerVlan;
-        this.tpid = tpid;
-        this.suspended = false;
+        this(providerId, id, mac, vlan, locations, ips, innerVlan, tpid, configured, false, annotations);
     }
 
     /**
@@ -145,10 +138,34 @@
     public DefaultHost(ProviderId providerId, HostId id, MacAddress mac,
                        VlanId vlan, Set<HostLocation> locations, Set<IpAddress> ips, VlanId innerVlan,
                        EthType tpid, boolean configured, boolean suspended, Annotations... annotations) {
+        this(providerId, id, mac, vlan, locations, null, ips, innerVlan, tpid, configured, suspended, annotations);
+    }
+
+    /**
+     * Creates an end-station host using the supplied information.
+     *
+     * @param providerId    provider identity
+     * @param id            host identifier
+     * @param mac           host MAC address
+     * @param vlan          host VLAN identifier
+     * @param locations     set of host locations
+     * @param auxLocations  set of auxiliary locations, or null if unspecified
+     * @param ips           host IP addresses
+     * @param configured    true if configured via NetworkConfiguration
+     * @param innerVlan     host inner VLAN identifier
+     * @param tpid          outer TPID of a host
+     * @param suspended     true if the host is suspended due to policy violation.
+     * @param annotations   optional key/value annotations
+     */
+    public DefaultHost(ProviderId providerId, HostId id, MacAddress mac,
+                       VlanId vlan, Set<HostLocation> locations, Set<HostLocation> auxLocations,
+                       Set<IpAddress> ips, VlanId innerVlan,
+                       EthType tpid, boolean configured, boolean suspended, Annotations... annotations) {
         super(providerId, id, annotations);
         this.mac = mac;
         this.vlan = vlan;
         this.locations = new HashSet<>(locations);
+        this.auxLocations = (auxLocations != null) ? new HashSet<>(auxLocations) : null;
         this.ips = new HashSet<>(ips);
         this.configured = configured;
         this.innerVlan = innerVlan;
@@ -188,6 +205,11 @@
     }
 
     @Override
+    public Set<HostLocation> auxLocations() {
+        return auxLocations;
+    }
+
+    @Override
     public VlanId vlan() {
         return vlan;
     }
@@ -215,7 +237,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, mac, vlan, locations, suspended);
+        return Objects.hash(id, mac, vlan, locations, auxLocations, ips, innerVlan, tpid, suspended);
     }
 
     @Override
@@ -229,6 +251,7 @@
                     Objects.equals(this.mac, other.mac) &&
                     Objects.equals(this.vlan, other.vlan) &&
                     Objects.equals(this.locations, other.locations) &&
+                    Objects.equals(this.auxLocations, other.auxLocations) &&
                     Objects.equals(this.ipAddresses(), other.ipAddresses()) &&
                     Objects.equals(this.innerVlan, other.innerVlan) &&
                     Objects.equals(this.tpid, other.tpid) &&
@@ -245,6 +268,7 @@
                 .add("mac", mac())
                 .add("vlan", vlan())
                 .add("locations", locations())
+                .add("auxLocations", auxLocations())
                 .add("ipAddresses", ipAddresses())
                 .add("annotations", annotations())
                 .add("configured", configured())
diff --git a/core/api/src/main/java/org/onosproject/net/Host.java b/core/api/src/main/java/org/onosproject/net/Host.java
index d4a922e..bf49bd9 100644
--- a/core/api/src/main/java/org/onosproject/net/Host.java
+++ b/core/api/src/main/java/org/onosproject/net/Host.java
@@ -65,13 +65,20 @@
     HostLocation location();
 
     /**
-     * Returns all host locations where the host attaches to the network edge.
+     * Returns host locations where the host attaches to the network edge.
      *
-     * @return all host locations
+     * @return host locations
      */
     Set<HostLocation> locations();
 
     /**
+     * Returns host auxiliary locations, which could be useful for app operations in addition to the attach points.
+     *
+     * @return auxiliary locations, or null if unspecified
+     */
+    Set<HostLocation> auxLocations();
+
+    /**
      * Returns true if configured by NetworkConfiguration.
      *
      * @return configured/learnt dynamically
@@ -106,5 +113,4 @@
      */
     boolean suspended();
 
-
 }