Implementing region hosts for topology 2
Change-Id: I6d1e45b1152b2387d4ff981dc0666868235eb1c3
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
index 30c1b80..684be94 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
@@ -193,6 +193,7 @@
private void updateRegion(UiRegion region) {
RegionId rid = region.id();
Set<DeviceId> deviceIds = services.region().getRegionDevices(rid);
+ Set<HostId> hostIds = services.region().getRegionHosts(rid);
// Make sure device objects refer to their region
deviceIds.forEach(d -> {
@@ -205,8 +206,19 @@
}
});
+ hostIds.forEach(d -> {
+ UiHost host = uiTopology.findHost(d);
+ if (host != null) {
+ host.setRegionId(rid);
+ } else {
+ // if we don't have the UiDevice in the topology, what can we do?
+ log.warn("Region host {}, but we don't have UiHost in topology", d);
+ }
+ });
+
// Make sure the region object refers to the devices
region.reconcileDevices(deviceIds);
+ region.reconcileHosts(hostIds);
fixupContainmentHierarchy(region);
}
@@ -526,26 +538,17 @@
fixupContainmentHierarchy(uiTopology.nullRegion());
uiTopology.allRegions().forEach(this::fixupContainmentHierarchy);
- // make sure devices are in the correct region
+ // make sure devices and hosts are in the correct region
Set<UiDevice> allDevices = uiTopology.allDevices();
+ Set<UiHost> allHosts = uiTopology.allHosts();
services.region().getRegions().forEach(r -> {
RegionId rid = r.id();
UiRegion region = uiTopology.findRegion(rid);
if (region != null) {
- Set<DeviceId> deviceIds = services.region().getRegionDevices(rid);
- region.reconcileDevices(deviceIds);
+ reconcileDevicesWithRegion(allDevices, r, rid, region);
+ reconcileHostsWithRegion(allHosts, r, rid, region);
- deviceIds.forEach(devId -> {
- UiDevice dev = uiTopology.findDevice(devId);
- if (dev != null) {
- dev.setRegionId(r.id());
- allDevices.remove(dev);
- } else {
- log.warn("Region device ID {} but no UiDevice in topology",
- devId);
- }
- });
} else {
log.warn("No UiRegion in topology for ID {}", rid);
}
@@ -556,11 +559,49 @@
allDevices.forEach(d -> leftOver.add(d.id()));
uiTopology.nullRegion().reconcileDevices(leftOver);
+ Set<HostId> leftOverHosts = new HashSet<>(allHosts.size());
+ allHosts.forEach(h -> leftOverHosts.add(h.id()));
+ uiTopology.nullRegion().reconcileHosts(leftOverHosts);
+
// now that we have correct region hierarchy, and devices are in their
// respective regions, we can compute synthetic links for each region.
uiTopology.computeSynthLinks();
}
+ private void reconcileHostsWithRegion(Set<UiHost> allHosts, Region r,
+ RegionId rid, UiRegion region) {
+ Set<HostId> hostIds = services.region().getRegionHosts(rid);
+ region.reconcileHosts(hostIds);
+
+ hostIds.forEach(hId -> {
+ UiHost h = uiTopology.findHost(hId);
+ if (h != null) {
+ h.setRegionId(r.id());
+ allHosts.remove(h);
+ } else {
+ log.warn("Region host ID {} but no UiHost in topology",
+ hId);
+ }
+ });
+ }
+
+ private void reconcileDevicesWithRegion(Set<UiDevice> allDevices, Region r,
+ RegionId rid, UiRegion region) {
+ Set<DeviceId> deviceIds = services.region().getRegionDevices(rid);
+ region.reconcileDevices(deviceIds);
+
+ deviceIds.forEach(devId -> {
+ UiDevice dev = uiTopology.findDevice(devId);
+ if (dev != null) {
+ dev.setRegionId(r.id());
+ allDevices.remove(dev);
+ } else {
+ log.warn("Region device ID {} but no UiDevice in topology",
+ devId);
+ }
+ });
+ }
+
// === CACHE STATISTICS