[CORD-2742] Remove elements from the service graph

Change-Id: Ibcb9fac4428f0b168ff66fab3219b8357e732dc5
diff --git a/src/app/service-graph/services/graph.store.ts b/src/app/service-graph/services/graph.store.ts
index 0dd6653..0edba0f 100644
--- a/src/app/service-graph/services/graph.store.ts
+++ b/src/app/service-graph/services/graph.store.ts
@@ -23,6 +23,7 @@
 import {BehaviorSubject} from 'rxjs/BehaviorSubject';
 import {Observable} from 'rxjs/Observable';
 import {IXosBaseModel, IXosSgLink, IXosSgNode} from '../interfaces';
+import {IWSEvent, IWSEventService} from '../../datasources/websocket/global';
 
 
 export interface IXosGraphStore {
@@ -41,7 +42,8 @@
   static $inject = [
     '$log',
     'XosModelStore',
-    'XosDebouncer'
+    'XosDebouncer',
+    'WebSocket'
   ];
 
   // graphs
@@ -64,7 +66,8 @@
   constructor (
     private $log: ng.ILogService,
     private XosModelStore: IXosModelStoreService,
-    private XosDebouncer: IXosDebouncer
+    private XosDebouncer: IXosDebouncer,
+    private webSocket: IWSEventService,
   ) {
     this.$log.info('[XosGraphStore] Setup');
 
@@ -72,6 +75,34 @@
     this.ServiceGraphSubject = new BehaviorSubject(this.serviceGraph);
 
     this.loadData();
+
+    // handle model deletion
+    this.webSocket.list()
+      .filter((e: IWSEvent) => {
+
+        const model = this.getModelType(e.msg.object);
+
+        switch (model) {
+          case 'service':
+          case 'serviceinstance':
+          case 'instance':
+          case 'network':
+            return true;
+          case 'servicedependency':
+          case 'serviceinstanceLink':
+            // NOTE ServiceDependency are considered links, they are automatically removed by the graph library
+            return false;
+          default:
+            return false;
+        }
+      })
+      .subscribe((event: IWSEvent) => {
+        if (event.deleted) {
+          const nodeId = this.getNodeId(event.msg.object);
+          this.serviceGraph.removeNode(nodeId);
+          this.efficientNext(this.ServiceGraphSubject, this.serviceGraph);
+        }
+      });
   }
 
   $onDestroy() {