Slaves config file is now a jinja2 template

Change-Id: I593ea08f87997dbd99934ad3b34c38c34fe1b824
diff --git a/podder/handlers.py b/podder/handlers.py
index 6b261a6..40d53a8 100644
--- a/podder/handlers.py
+++ b/podder/handlers.py
@@ -17,6 +17,7 @@
     get_all_running_containers, inspect_container, remove_container
 
 from structlog import get_logger
+import yaml
 
 log = get_logger()
 
@@ -48,7 +49,6 @@
     # Assuming only one network exists....
     return create_networking_config(network[0], { l : l for l in links})
 
-
 def process_value(value):
     if value is None:
         return None
@@ -68,7 +68,6 @@
 def construct_container_spec(config):
     container_spec = {}
     container_spec['image'] = get_entry('image', config, mandatory=True)
-    #TODO need to rewrite command to connect to right service instance
     container_spec['command'] = get_entry('command', config, mandatory=True)
     container_spec['environment'] = get_entry('environment', config, noneval={})
     container_spec['ports'] = get_entry('ports', config)
@@ -86,7 +85,11 @@
                     log.info('Removing container {}'.format(container['Names']))
                     remove_container(container['Id'])
 
-def start_slaves(service, instance_name, instance_id, data, config):
+def start_slaves(service, instance_name, instance_id, data, conf):
+    network = obtain_network_name(data)
+    # still assuming a single network
+    config = yaml.load(conf.render(data=data, network=network[0]))
+
     if service not in config['services']:
         log.debug('Unknown service {}'.format(service))
         return
@@ -94,7 +97,7 @@
         if slave not in config['slaves']:
             log.debug('Unknown slave service {}'.format(slave))
             continue
-        network = obtain_network_name(data)
+
         netcfg = create_network_config(network, get_entry('links', config['slaves'][slave]))
         container_spec = construct_container_spec(config['slaves'][slave])
         container_spec['networking_config'] = netcfg
@@ -107,11 +110,14 @@
         container_spec['environment']['PODDER_MASTER'] = instance_name
 
         container = create_container(container_spec)
+        log.info('Starting slaves for {}'.format(instance_name))
         start_container(container)
 
 
-def stop_slaves(service, instance_name, instance_id, data, config):
+def stop_slaves(service, instance_name, instance_id, data, conf):
     log.info('Stopping slaves for {}'.format(instance_name))
+    network = obtain_network_name(data)
+    config = yaml.load(conf.render())
     if service in config['services']:
         service_shutdown(service, instance_name, config)
     else:
diff --git a/podder/main.py b/podder/main.py
index 3f74446..d02fc63 100755
--- a/podder/main.py
+++ b/podder/main.py
@@ -25,7 +25,7 @@
 from common.utils.nethelpers import get_my_primary_local_ipv4
 
 defs = dict(
-    slaves=os.environ.get('SLAVES', './slaves.yml'),
+    slaves=os.environ.get('SLAVES', './slaves.yml.j2'),
     config=os.environ.get('CONFIG', './podder.yml'),
     consul=os.environ.get('CONSUL', 'localhost:8500'),
     external_host_address=os.environ.get('EXTERNAL_HOST_ADDRESS',
@@ -110,15 +110,20 @@
 
     return args
 
-def load_config(config):
-    path = config
+def load_file(file):
+    path = file
     if path.startswith('.'):
         dir = os.path.dirname(os.path.abspath(__file__))
         path = os.path.join(dir, path)
     path = os.path.abspath(path)
     with open(path) as fd:
-        config = yaml.load(fd)
-    return config
+        contents = fd.read()
+    return contents
+
+def load_config(config):
+    contents = load_file(config)
+    return yaml.load(contents)
+
 
 banner = r'''
  _____
@@ -139,7 +144,7 @@
     def __init__(self):
         self.args = args = parse_args()
         self.config = load_config(args.config)
-        self.slave_config = load_config(args.slaves)
+        self.slave_config = load_file(args.slaves)
 
         verbosity_adjust = (args.verbose or 0) - (args.quiet or 0)
         self.log = setup_logging(self.config.get('logging', {}),
diff --git a/podder/podder.py b/podder/podder.py
index daa9e91..7cd166d 100644
--- a/podder/podder.py
+++ b/podder/podder.py
@@ -16,6 +16,7 @@
 
 from handlers import handler_start, handler_stop
 from structlog import get_logger
+from jinja2 import Template
 
 from common.utils.dockerhelpers import EventProcessor
 
@@ -27,7 +28,7 @@
         self.log.info('Initializing Podder')
         self.running = False
         self.events = EventProcessor()
-        self.handlers = { 'podder_config' : slave_config }
+        self.handlers = { 'podder_config' : Template(slave_config) }
 
     def run(self):
         if self.running:
diff --git a/podder/slaves.yml b/podder/slaves.yml.j2
similarity index 65%
rename from podder/slaves.yml
rename to podder/slaves.yml.j2
index 2adc46b..668d7d6 100644
--- a/podder/slaves.yml
+++ b/podder/slaves.yml.j2
@@ -1,3 +1,11 @@
+{% macro address(data, network) -%}
+    {% if data is defined and network is defined -%}
+    {{ data['NetworkSettings']['Networks'][network]['IPAddress'] }}:{{ data['NetworkSettings']['Ports']['50555/tcp'][0]['HostPort'] }}
+    {%- else -%}
+    None:None
+    {%- endif %}
+{%- endmacro %}
+
 services:
   cord/voltha:
     slaves: ["chameleon", "ofagent"]
@@ -7,12 +15,12 @@
   chameleon:
     image: cord/chameleon
     command: [
-      "/chameleon/main.py",
+      "/chameleon/chameleon/main.py",
       "-v",
       "--consul=consul:8500",
       "--fluentd=fluentd:24224",
       "--rest-port=8881",
-      "--grpc-endpoint=@voltha-grpc",
+      "--grpc-endpoint={{ address(data, network) }}",
       "--instance-id-is-container-name",
       "-v"
     ]
@@ -32,12 +40,12 @@
   ofagent:
     image: cord/ofagent
     command: [
-      "/ofagent/main.py",
+      "/ofagent/ofagent/main.py",
       "-v",
       "--consul=${DOCKER_HOST_IP}:8500",
       "--fluentd=fluentd:24224",
       "--controller=${DOCKER_HOST_IP}:6633",
-      "--grpc-endpoint=@voltha-grpc",
+      "--grpc-endpoint={{ address(data, network) }}",
       "--instance-id-is-container-name",
       "-v"
     ]