Draw service graph
diff --git a/views/ngXosViews/diagnostic/env/default.js b/views/ngXosViews/diagnostic/env/default.js
index e392e57..f139cf2 100644
--- a/views/ngXosViews/diagnostic/env/default.js
+++ b/views/ngXosViews/diagnostic/env/default.js
@@ -8,6 +8,6 @@
 
 module.exports = {
   host: 'http://clnode078.clemson.cloudlab.us:9999/',
-  xoscsrftoken: 'bOPR48s9Dbax56Lh0IRgnKhAR8QuPZU7',
-  xossessionid: 'dzjxtlsxinrnzz2ajhxo2nsn07c4z0vm'
+  xoscsrftoken: '3l5fr6tkXW0dxJ2OqqD0ftEzzD9URc4C',
+  xossessionid: 'tagguvgkn2vpif4eml6ynvdw9vlx6os9'
 };
diff --git a/views/ngXosViews/diagnostic/spec/serviceChain.test.js b/views/ngXosViews/diagnostic/spec/serviceChain.test.js
index dcd9da0..af9a701 100644
--- a/views/ngXosViews/diagnostic/spec/serviceChain.test.js
+++ b/views/ngXosViews/diagnostic/spec/serviceChain.test.js
@@ -114,7 +114,7 @@
     ];
 
     it('should return a tree ordered by relations', () => {
-      let tree = Service.buildServiceTree(services, relations);
+      let tree = Service.buildSubscriberServiceTree(services, relations);
 
       expect(tree.name).toBe('fakeSubs');
       expect(tree.parent).toBeNull();
@@ -154,4 +154,44 @@
     });
   });
 
+  describe('Given a list of services and COARSE tenant', () => {
+    
+    const coarseTenants = [
+      {
+        humanReadableName: 'coarse-1',
+        provider_service: 1,
+        subscriber_service: 2
+      },
+      {
+        humanReadableName: 'coarse-2',
+        provider_service: 2,
+        subscriber_service: 3
+      }
+    ];
+
+    const services = [
+      {
+        id: 1,
+        humanReadableName: 'vbng'
+      },
+      {
+        id: 2,
+        humanReadableName: 'vsg'
+      },
+      {
+        id: 3,
+        humanReadableName: 'volt'
+      }
+    ];
+
+    it('should build the tenancy graph', () => {
+      let tree = Service.buildServiceTree(services, coarseTenants);
+
+      expect(tree.type).toBe('subscriber');
+      expect(tree.children[0].humanReadableName).toBe('volt');
+      expect(tree.children[0].children[0].humanReadableName).toBe('vsg');
+      expect(tree.children[0].children[0].children[0].humanReadableName).toBe('vbng');
+    });
+  });
+
 });
\ No newline at end of file
diff --git a/views/ngXosViews/diagnostic/src/js/diagnostic.js b/views/ngXosViews/diagnostic/src/js/diagnostic.js
index 938b2f6..f499d4e 100644
--- a/views/ngXosViews/diagnostic/src/js/diagnostic.js
+++ b/views/ngXosViews/diagnostic/src/js/diagnostic.js
@@ -11,7 +11,7 @@
         Subscribers.queryWithDevices().$promise
         .then((subscribers) => {
           this.subscribers = subscribers;
-          return ServiceRelation.get(subscribers[0]);
+          return ServiceRelation.get();
         })
         .then((serviceChain) => {
           this.serviceChain = serviceChain;
diff --git a/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js b/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js
index f87e397..8703344 100644
--- a/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js
+++ b/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js
@@ -66,7 +66,7 @@
           + (step * i) // space between elements
           + (el / 2) // this el width
           + previousElWidth; // previous elements width
-          console.log(`${i} elPos: ${previousElWidth}`);
+
         xPos.push(svgWidth - elPos);
       })
 
diff --git a/views/ngXosViews/diagnostic/src/js/rest_services.js b/views/ngXosViews/diagnostic/src/js/rest_services.js
index 396439c..6e3771a 100644
--- a/views/ngXosViews/diagnostic/src/js/rest_services.js
+++ b/views/ngXosViews/diagnostic/src/js/rest_services.js
@@ -187,7 +187,7 @@
       return tree;
     };
 
-    const buildServiceTree = (services, tenants, subscriber = {id: 1, name: 'fakeSubs'}) => {
+    const buildSubscriberServiceTree = (services, tenants, subscriber = {id: 1, name: 'fakeSubs'}) => {
 
       // find the root service
       // it is the one attached to subsriber_root
@@ -206,7 +206,43 @@
 
     };
 
-    const get = (subscriber) => {
+    // applying domain knowledge to build the global service tree
+    const buildServiceTree = (services, tenants) => {
+
+      // TODO refactor
+      const buildChild = (services, tenants, currentService) => {
+        let tenant = lodash.find(tenants, {subscriber_service: currentService.id});
+        if(tenant){
+          let next = lodash.find(services, {id: tenant.provider_service});
+          currentService.children = [buildChild(services, tenants, next)];
+        }
+        else {
+          currentService.children = [
+            {
+              name: 'Router',
+              type: 'router',
+              children: []
+            }
+          ]
+        }
+        currentService.type = 'service';
+        delete currentService.id; // conflict with d3
+        return currentService;
+      }
+      let baseService = lodash.find(services, {id: 3});
+
+      const baseData = {
+        name: 'Subscriber',
+        type: 'subscriber',
+        parent: null,
+        children: [buildChild(services, tenants, baseService)]
+      };
+
+      console.log(baseData);
+      return baseData;
+    };
+
+    const getBySubscriber = (subscriber) => {
       var deferred = $q.defer();
       var services, tenants;
       Services.query().$promise
@@ -216,7 +252,7 @@
       })
       .then((res) => {
         tenants = res;
-        deferred.resolve(buildServiceTree(services, tenants, subscriber));
+        deferred.resolve(buildSubscriberServiceTree(services, tenants, subscriber));
       })
       .catch((e) => {
         throw new Error(e);
@@ -225,11 +261,32 @@
       return deferred.promise;
     };
 
+    const get = () => {
+      var deferred = $q.defer();
+      var services, tenants;
+      Services.query().$promise
+      .then((res) => {
+        services = res;
+        return Tenant.query({kind: 'coarse'}).$promise;
+      })
+      .then((res) => {
+        tenants = res;
+        deferred.resolve(buildServiceTree(services, tenants));
+      })
+      .catch((e) => {
+        throw new Error(e);
+      });
+
+      return deferred.promise;
+    }
+
     // export APIs
     return {
       get: get,
-      buildLevel: buildLevel,
       buildServiceTree: buildServiceTree,
+      getBySubscriber: getBySubscriber,
+      buildLevel: buildLevel,
+      buildSubscriberServiceTree: buildSubscriberServiceTree,
       findLevelRelation: findLevelRelation,
       findLevelServices: findLevelServices,
       depthOf: depthOf,
diff --git a/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js b/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
index 872c778..05ddba7 100644
--- a/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
+++ b/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
@@ -119,7 +119,10 @@
       // Enter any new nodes at the parent's previous position.
       var nodeEnter = node.enter().append('g')
         .attr({
-          class: d => `node ${d.type}`,
+          class: d => {
+            console.log(d);
+            return `node ${d.type}`
+          },
           transform: `translate(${source.y0}, ${source.x0})`
         });