Extend host structures to store multiple locations
Also update host location format in CLI and REST API
Change-Id: I0fbd655f642627dd3eb8a2925f83a3ee016fe4aa
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 d9cfa25..defb5a3 100644
--- a/core/api/src/main/java/org/onosproject/net/DefaultHost.java
+++ b/core/api/src/main/java/org/onosproject/net/DefaultHost.java
@@ -21,6 +21,7 @@
import org.onlab.packet.VlanId;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@@ -34,7 +35,7 @@
private final MacAddress mac;
private final VlanId vlan;
- private final HostLocation location;
+ private final Set<HostLocation> locations;
private final Set<IpAddress> ips;
private final boolean configured;
@@ -70,10 +71,29 @@
public DefaultHost(ProviderId providerId, HostId id, MacAddress mac,
VlanId vlan, HostLocation location, Set<IpAddress> ips,
boolean configured, Annotations... annotations) {
+ this(providerId, id, mac, vlan, Collections.singleton(location), ips,
+ configured, 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 ips host IP addresses
+ * @param configured true if configured via NetworkConfiguration
+ * @param annotations optional key/value annotations
+ */
+ public DefaultHost(ProviderId providerId, HostId id, MacAddress mac,
+ VlanId vlan, Set<HostLocation> locations, Set<IpAddress> ips,
+ boolean configured, Annotations... annotations) {
super(providerId, id, annotations);
this.mac = mac;
this.vlan = vlan;
- this.location = location;
+ this.locations = new HashSet<>(locations);
this.ips = new HashSet<>(ips);
this.configured = configured;
}
@@ -99,7 +119,14 @@
@Override
public HostLocation location() {
- return location;
+ return locations.stream()
+ .sorted(Comparator.comparingLong(HostLocation::time).reversed())
+ .findFirst().orElse(null);
+ }
+
+ @Override
+ public Set<HostLocation> locations() {
+ return locations;
}
@Override
@@ -114,7 +141,7 @@
@Override
public int hashCode() {
- return Objects.hash(id, mac, vlan, location);
+ return Objects.hash(id, mac, vlan, locations);
}
@Override
@@ -127,7 +154,7 @@
return Objects.equals(this.id, other.id) &&
Objects.equals(this.mac, other.mac) &&
Objects.equals(this.vlan, other.vlan) &&
- Objects.equals(this.location, other.location) &&
+ Objects.equals(this.locations, other.locations) &&
Objects.equals(this.ipAddresses(), other.ipAddresses()) &&
Objects.equals(this.annotations(), other.annotations());
}
@@ -140,7 +167,7 @@
.add("id", id())
.add("mac", mac())
.add("vlan", vlan())
- .add("location", location())
+ .add("locations", locations())
.add("ipAddresses", ipAddresses())
.add("annotations", annotations())
.add("configured", configured())