ONOS-4326: Focusing on add/remove cluster member. (WIP).
If reviewing this, please refer to http://tinyurl.com/onos-ui-topo-model
Change-Id: Ic6568074ac768ec828f9103e92caab5e9a06ade6
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 6d5de44..420768f 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
@@ -17,6 +17,7 @@
package org.onosproject.ui.impl.topo.model;
import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
import org.onosproject.cluster.RoleInfo;
import org.onosproject.event.EventDispatcher;
import org.onosproject.net.Device;
@@ -24,11 +25,16 @@
import org.onosproject.net.Host;
import org.onosproject.net.Link;
import org.onosproject.net.region.Region;
+import org.onosproject.ui.model.ServiceBundle;
import org.onosproject.ui.model.topo.UiClusterMember;
import org.onosproject.ui.model.topo.UiDevice;
import org.onosproject.ui.model.topo.UiTopology;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import static org.onosproject.ui.impl.topo.model.UiModelEvent.Type.DEVICE_ADDED;
+import static org.onosproject.ui.impl.topo.model.UiModelEvent.Type.CLUSTER_MEMBER_ADDED_OR_UPDATED;
+import static org.onosproject.ui.impl.topo.model.UiModelEvent.Type.CLUSTER_MEMBER_REMOVED;
+import static org.onosproject.ui.impl.topo.model.UiModelEvent.Type.DEVICE_ADDED_OR_UPDATED;
import static org.onosproject.ui.impl.topo.model.UiModelEvent.Type.DEVICE_REMOVED;
/**
@@ -36,10 +42,14 @@
*/
class ModelCache {
+ private static final Logger log = LoggerFactory.getLogger(ModelCache.class);
+
+ private final ServiceBundle services;
private final EventDispatcher dispatcher;
private final UiTopology uiTopology = new UiTopology();
- ModelCache(EventDispatcher eventDispatcher) {
+ ModelCache(ServiceBundle services, EventDispatcher eventDispatcher) {
+ this.services = services;
this.dispatcher = eventDispatcher;
}
@@ -59,6 +69,7 @@
* Create our internal model of the global topology.
*/
void load() {
+ // TODO - implement loading of initial state
// loadClusterMembers();
// loadRegions();
// loadDevices();
@@ -74,20 +85,36 @@
* @param cnode controller node to be added/updated
*/
void addOrUpdateClusterMember(ControllerNode cnode) {
- UiClusterMember member = uiTopology.findClusterMember(cnode.id());
- if (member != null) {
- member.update(cnode);
- } else {
+ NodeId id = cnode.id();
+ UiClusterMember member = uiTopology.findClusterMember(id);
+ if (member == null) {
member = new UiClusterMember(cnode);
uiTopology.add(member);
}
- // TODO: post event
+ // inject computed data about the cluster node, into the model object
+ ControllerNode.State state = services.cluster().getState(id);
+ member.setState(state);
+ member.setDeviceCount(services.mastership().getDevicesOf(id).size());
+ // NOTE: UI-attached is session-based data, not global
+
+ dispatcher.post(new UiModelEvent(CLUSTER_MEMBER_ADDED_OR_UPDATED, member));
}
+ /**
+ * Removes from the model the specified controller node.
+ *
+ * @param cnode controller node to be removed
+ */
void removeClusterMember(ControllerNode cnode) {
- // TODO: find cluster member assoc. with parameter; remove from model
- // TODO: post event
+ NodeId id = cnode.id();
+ UiClusterMember member = uiTopology.findClusterMember(id);
+ if (member != null) {
+ uiTopology.remove(member);
+ dispatcher.post(new UiModelEvent(CLUSTER_MEMBER_REMOVED, member));
+ } else {
+ log.warn("Tried to remove non-member cluster node {}", id);
+ }
}
void updateMasterships(DeviceId deviceId, RoleInfo roleInfo) {
@@ -111,7 +138,7 @@
UiDevice uiDevice = new UiDevice();
// TODO: post the (correct) event
- dispatcher.post(new UiModelEvent(DEVICE_ADDED, uiDevice));
+ dispatcher.post(new UiModelEvent(DEVICE_ADDED_OR_UPDATED, uiDevice));
}
void removeDevice(Device device) {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java
index c37f27d..1a2c66c 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java
@@ -29,8 +29,12 @@
}
enum Type {
- DEVICE_ADDED,
+ CLUSTER_MEMBER_ADDED_OR_UPDATED,
+ CLUSTER_MEMBER_REMOVED,
+
+ DEVICE_ADDED_OR_UPDATED,
DEVICE_REMOVED,
+
// TODO...
}
}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
index 0a4ce99..48ae42f 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
@@ -59,6 +59,7 @@
import org.onosproject.net.statistic.StatisticService;
import org.onosproject.net.topology.TopologyService;
import org.onosproject.ui.impl.topo.UiTopoSession;
+import org.onosproject.ui.model.ServiceBundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -122,7 +123,7 @@
@Activate
protected void activate() {
- cache = new ModelCache(eventDispatcher);
+ cache = new ModelCache(new DefaultServiceBundle(), eventDispatcher);
eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
@@ -180,6 +181,52 @@
removeListener(session);
}
+ /**
+ * Default implementation of service bundle to return references to our
+ * dynamically injected services.
+ */
+ private class DefaultServiceBundle implements ServiceBundle {
+ @Override
+ public ClusterService cluster() {
+ return clusterService;
+ }
+
+ @Override
+ public MastershipService mastership() {
+ return mastershipService;
+ }
+
+ @Override
+ public RegionService region() {
+ return regionService;
+ }
+
+ @Override
+ public DeviceService device() {
+ return deviceService;
+ }
+
+ @Override
+ public LinkService link() {
+ return linkService;
+ }
+
+ @Override
+ public HostService host() {
+ return hostService;
+ }
+
+ @Override
+ public IntentService intent() {
+ return intentService;
+ }
+
+ @Override
+ public FlowRuleService flow() {
+ return flowService;
+ }
+ }
+
private class InternalClusterListener implements ClusterEventListener {
@Override