Topo2: Update links on websocket events

Change-Id: I6a8b05cc0eaf67e2b10dd39aeb4b876c61c40ec6
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Region.js b/web/gui/src/main/webapp/app/view/topo2/topo2Region.js
index 09b8cd8..7938fd6 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Region.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Region.js
@@ -26,7 +26,7 @@
     var Model;
 
     // Internal
-    var instance
+    var instance;
 
     // 'static' vars
     var ROOT = '(root)';
@@ -101,6 +101,9 @@
                 regionLinks: function () {
                     return (this.model) ? this.model.get('links').models : [];
                 },
+                getLink: function (linkId) {
+                    return this.model.get('links').get(linkId);
+                },
                 filterRegionNodes: function (predicate) {
                     var nodes = this.regionNodes();
                     return _.filter(nodes, predicate);
@@ -138,6 +141,27 @@
                     }
 
                     return false;
+                },
+
+                update: function (event) {
+                    if (this[event.type]) {
+                        this[event.type](event);
+                        this.layout.update();
+                    } else {
+                        $log.error("Unhanded topology update", event);
+                    }
+                },
+
+                // Topology update event handlers
+                LINK_ADDED_OR_UPDATED: function (event) {
+                    if (event.memo === 'added') {
+                        var link = this.model.get('links').add(event.data);
+                        link.createLink();
+                    }
+                },
+                LINK_REMOVED: function (event) {
+                    var link = this.getLink(event.subject);
+                    link.remove();
                 }
             });
 
@@ -146,6 +170,7 @@
             }
 
             return getInstance();
+
         }]);
 
 })();