VOL-282: Integrate demo components (e.g. dashd, shovel) with the clustered consul service

This submission migrates the dashd service to Docker swarm mode. The dashd implementation
did not use the '@' character to distinguish between a Consul service and a Docker service.

This submission adds support for both service types and a v3 compose file for a 'stats'
service stack. The shovel service will be added to this stackfile in a future submission.

Change-Id: Iad4695641d489666ed27a78b0a79539357a8e2be
diff --git a/compose/docker-compose-stats-swarm.yml b/compose/docker-compose-stats-swarm.yml
new file mode 100644
index 0000000..19a7d00
--- /dev/null
+++ b/compose/docker-compose-stats-swarm.yml
@@ -0,0 +1,35 @@
+#
+# This stackfile deploys dashd to a docker swarm.
+#
+# Dashd depends on:
+# - consul     (service)
+# - kafka      (service)
+# - grafana    (service)
+# - voltha_net (overlay network)
+#
+# To deploy the stack, issue the command:
+#
+#     docker stack deploy -c docker-compose-stats-swarm.yml stats
+#
+
+version: "3"
+services:
+  dashd:
+    image: cord/dashd
+    deploy:
+      replicas: 1
+    entrypoint:
+      - /dashd/dashd/main.py
+      - --kafka=kafka
+      - --consul=consul:8500
+      - --grafana_url=http://admin:admin@grafana:80/api
+      - --topic=voltha.kpis
+      - --docker_host=${DOCKER_HOST_IP}
+    networks:
+      - voltha-net
+      
+networks:
+  voltha-net:
+    external:
+      name: voltha_net
+
diff --git a/dashd/dashd_impl.py b/dashd/dashd_impl.py
index 1df892b..e933cd4 100755
--- a/dashd/dashd_impl.py
+++ b/dashd/dashd_impl.py
@@ -86,7 +86,7 @@
 
 
 class DashDaemon(object):
-    def __init__(self, consul_endpoint, grafana_url, topic="voltha.heartbeat"):
+    def __init__(self, consul_endpoint, kafka_endpoint, grafana_url, topic="voltha.heartbeat"):
         #logging.basicConfig(
         # format='%(asctime)s:%(name)s:' +
         #        '%(levelname)s:%(process)d:%(message)s',
@@ -98,22 +98,25 @@
         self.topic = topic
         self.dash_template = DashTemplate(grafana_url)
         self.grafana_url = grafana_url
-        self.kafka_endpoint = None
+        self.kafka_endpoint = kafka_endpoint
         self.consul_endpoint = consul_endpoint
-        retrys = 10
-        while True:
-            try:
-                self.kafka_endpoint = get_endpoint_from_consul(self.consul_endpoint,
-                'kafka')
-                break
-            except:
-                log.error("unable-to-communicate-with-consul")
-                self.stop()
-            retrys -= 1
-            if retrys == 0:
-                log.error("unable-to-communicate-with-consul")
-                self.stop()
-            time.sleep(10)
+
+        if kafka_endpoint.startswith('@'):
+            retrys = 10
+            while True:
+                try:
+                    self.kafka_endpoint = get_endpoint_from_consul(
+                        self.consul_endpoint, kafka_endpoint[1:])
+                    break
+                except:
+                    log.error("unable-to-communicate-with-consul")
+                    self.stop()
+                retrys -= 1
+                if retrys == 0:
+                    log.error("unable-to-communicate-with-consul")
+                    self.stop()
+                time.sleep(10)
+
         self.on_start_callback = None
 
         self._client = KafkaClient(self.kafka_endpoint)
@@ -455,7 +458,7 @@
 
     args = parse_options()
 
-    dashd = DashDaemon(args.consul, args.grafana_url, args.topic)
+    dashd = DashDaemon(args.consul, args.kafka, args.grafana_url, args.topic)
     reactor.callWhenRunning(dashd.start)
     reactor.run()
     log.info("completed!")
diff --git a/dashd/main.py b/dashd/main.py
index 578958f..ba9c242 100755
--- a/dashd/main.py
+++ b/dashd/main.py
@@ -212,6 +212,7 @@
                                                  topic=args.topic)
             self.dashd_server = yield \
                     DashDaemon(args.consul, #'10.0.2.15:8500',
+                               args.kafka,
                                args.grafana_url, #'http://admin:admin@localhost:8882/api',
                                topic=args.topic )  #"voltha.kpis")