Support multiple instances of telegraf

Change-Id: Ifd51b315e458daf4b490296d9755ac1d7dbc4658
diff --git a/metadata/service/agent.yml b/metadata/service/agent/init.yml
similarity index 100%
rename from metadata/service/agent.yml
rename to metadata/service/agent/init.yml
diff --git a/metadata/service/agent/remote.yml b/metadata/service/agent/remote.yml
new file mode 100644
index 0000000..19d5e6d
--- /dev/null
+++ b/metadata/service/agent/remote.yml
@@ -0,0 +1,13 @@
+applications:
+  - telegraf
+classes:
+ - service.telegraf.support
+parameters:
+  telegraf:
+    remote_agent:
+      enabled: true
+      interval: 15
+      round_interval: false
+      metric_batch_size: 1000
+      metric_buffer_limit: 10000
+      collection_jitter: 2
diff --git a/telegraf/agent.sls b/telegraf/agent.sls
index 5c2728f..9ac49d7 100644
--- a/telegraf/agent.sls
+++ b/telegraf/agent.sls
@@ -1,29 +1,28 @@
-{% from "telegraf/map.jinja" import agent, service_grains with context %}
-{%- if agent.enabled %}
+{% from "telegraf/map.jinja" import telegraf_grains with context %}
+{%- set agent = telegraf_grains.telegraf.get('agent', {}) %}
+{%- if agent.get('enabled', False) %}
 
-telegraf_packages:
+telegraf_packages_agent:
   pkg.installed:
     - names: {{ agent.pkgs }}
 
-telegraf_config:
+telegraf_config_agent:
   file.managed:
-    - name: {{ agent.file.config }}
+    - name: {{ agent.dir.config }}/telegraf.conf
     - source: salt://telegraf/files/telegraf.conf
     - user: root
     - group: root
     - mode: 644
     - template: jinja
     - require:
-      - pkg: telegraf_packages
+      - pkg: telegraf_packages_agent
 
-{%- set telegraf_input = service_grains.telegraf.agent.input %}
-
-{%- for name,values in telegraf_input.iteritems() %}
+{%- for name,values in agent.input.iteritems() %}
 
 {%- if values is not mapping or values.get('enabled', True) %}
-input_{{ name }}:
+input_{{ name }}_agent:
   file.managed:
-    - name: {{ agent.dir.config }}/input-{{ name }}.conf
+    - name: {{ agent.dir.config_d }}/input-{{ name }}.conf
     - source:
       - salt://telegraf/files/input/{{ name }}.conf
       - salt://telegraf/files/input/generic.conf
@@ -32,10 +31,10 @@
     - mode: 644
     - template: jinja
     - require:
-      - pkg: telegraf_packages
+      - pkg: telegraf_packages_agent
     {%- if not grains.get('noservices', False)%}
     - watch_in:
-      - service: telegraf_service
+      - service: telegraf_service_agent
     {%- endif %}
     - defaults:
         name: {{ name }}
@@ -48,18 +47,18 @@
     - optional_groups:
       - {{ name }}
     - require:
-      - pkg: telegraf_packages
+      - pkg: telegraf_packages_agent
 {%- endif %}
 
 {%- else %}
-input_{{name }}:
+input_{{name }}_agent:
   file.absent:
-    - name: {{ agent.dir.config }}/input-{{ name }}.conf
+    - name: {{ agent.dir.config_d }}/input-{{ name }}.conf
     - require:
-      - pkg: telegraf_packages
+      - pkg: telegraf_packages_agent
     {%- if not grains.get('noservices', False)%}
     - watch_in:
-      - service: telegraf_service
+      - service: telegraf_service_agent
     {%- endif %}
 {%- endif %}
 
@@ -67,19 +66,19 @@
 
 {%- for name,values in agent.output.iteritems() %}
 
-output_{{ name }}:
+output_{{ name }}_agent:
   file.managed:
-    - name: {{ agent.dir.config }}/output-{{ name }}.conf
+    - name: {{ agent.dir.config_d }}/output-{{ name }}.conf
     - source: salt://telegraf/files/output/{{ name }}.conf
     - user: root
     - group: root
     - mode: 644
     - template: jinja
     - require:
-      - pkg: telegraf_packages
+      - pkg: telegraf_packages_agent
     {%- if not grains.get('noservices', False)%}
     - watch_in:
-      - service: telegraf_service
+      - service: telegraf_service_agent
     {%- endif %}
     - defaults:
         name: {{ name }}
@@ -89,12 +88,12 @@
 
 {%- if not grains.get('noservices', False)%}
 
-telegraf_service:
+telegraf_service_agent:
   service.running:
     - name: telegraf
     - enable: True
     - watch:
-      - file: telegraf_config
+      - file: telegraf_config_agent
 
 {%- endif %}
 
diff --git a/telegraf/init.sls b/telegraf/init.sls
index 97bf655..7345d3b 100644
--- a/telegraf/init.sls
+++ b/telegraf/init.sls
@@ -1,2 +1,7 @@
 include:
+  {%- if pillar.telegraf.agent is defined %}
   - telegraf.agent
+  {%- endif %}
+  {%- if pillar.telegraf.remote_agent is defined %}
+  - telegraf.remote_agent
+  {%- endif %}
diff --git a/telegraf/map.jinja b/telegraf/map.jinja
index 51580e5..c49db55 100644
--- a/telegraf/map.jinja
+++ b/telegraf/map.jinja
@@ -1,16 +1,23 @@
 {% set agent = salt['grains.filter_by']({
     'Debian': {
       'pkgs': ['telegraf'],
-      'file': {
-        'config': '/etc/telegraf/telegraf.conf'
-      },
       'dir': {
-        'config': '/etc/telegraf/telegraf.d'
+        'config': '/etc/telegraf',
+        'config_d': '/etc/telegraf/telegraf.d'
       },
     },
 }, merge=salt['pillar.get']('telegraf:agent')) %}
 
-{%- set service_grains = {'telegraf': {'agent': {'input': {}}}} %}
+{% set remote_agent = salt['grains.filter_by']({
+    'Debian': {
+      'dir': {
+        'config': '/srv/volumes/local/telegraf',
+        'config_d': '/srv/volumes/local/telegraf/telegraf.d'
+      },
+    },
+}, merge=salt['pillar.get']('telegraf:remote_agent')) %}
+
+{%- set service_grains = {'telegraf': {'agent': {'input': {}}, 'remote_agent': {'input':{}}}} %}
 {%- for service_name, service in pillar.items() %}
   {%- if service.get('_support', {}).get('telegraf', {}).get('enabled', False) %}
     {%- set grains_fragment_file = service_name+'/meta/telegraf.yml' %}
@@ -21,4 +28,5 @@
     {%- endif %}
   {%- endif %}
 {%- endfor %}
-{%- set service_grains = salt['grains.filter_by']({'default': service_grains}, merge={'telegraf': {'agent': {'input': agent.get('input', {})}}}) %}
+{%- set telegraf_grains = salt['grains.filter_by']({'default': service_grains}, merge={'telegraf': {'agent': agent}}) %}
+{%- set telegraf_grains = salt['grains.filter_by']({'default': service_grains}, merge={'telegraf': {'remote_agent': remote_agent}}) %}
diff --git a/telegraf/meta/salt.yml b/telegraf/meta/salt.yml
index 9a5ca1f..1340284 100644
--- a/telegraf/meta/salt.yml
+++ b/telegraf/meta/salt.yml
@@ -1,6 +1,6 @@
 grain:
-  {%- if pillar.get('telegraf', {}).get('agent') %}
-  {%- from "telegraf/map.jinja" import service_grains with context %}
+  {%- if pillar.get('telegraf') %}
+  {%- from "telegraf/map.jinja" import telegraf_grains with context %}
   telegraf:
-    {{ service_grains|yaml(False)|indent(4) }}
+    {{ telegraf_grains|yaml(False)|indent(4) }}
   {%- endif %}
diff --git a/telegraf/remote_agent.sls b/telegraf/remote_agent.sls
new file mode 100644
index 0000000..67441f2
--- /dev/null
+++ b/telegraf/remote_agent.sls
@@ -0,0 +1,77 @@
+{% from "telegraf/map.jinja" import telegraf_grains with context %}
+{%- set remote_agent = telegraf_grains.telegraf.get('remote_agent', {}) %}
+
+{%- if remote_agent.get('enabled', False) %}
+
+config_dir_remote_agent:
+  file.directory:
+    - name: {{remote_agent.dir.config}}
+    - makedirs: True
+    - mode: 755
+
+config_d_dir_remote_agent:
+  file.directory:
+    - name: {{remote_agent.dir.config_d}}
+    - makedirs: True
+    - mode: 755
+    - require:
+      - file: config_dir_remote_agent
+
+telegraf_config_remote_agent:
+  file.managed:
+    - name: {{ remote_agent.dir.config }}/telegraf.conf
+    - source: salt://telegraf/files/telegraf.conf
+    - user: root
+    - group: root
+    - mode: 644
+    - template: jinja
+    - require:
+      - file: config_dir_remote_agent
+
+{%- for name,values in remote_agent.get('input', {}).iteritems() %}
+
+{%- if values is not mapping or values.get('enabled', True) %}
+input_{{ name }}_remote_agent:
+  file.managed:
+    - name: {{ remote_agent.dir.config_d }}/input-{{ name }}.conf
+    - source:
+      - salt://telegraf/files/input/{{ name }}.conf
+      - salt://telegraf/files/input/generic.conf
+    - user: root
+    - group: root
+    - mode: 644
+    - template: jinja
+    - require:
+      - file: config_d_dir_remote_agent
+    - defaults:
+        name: {{ name }}
+        values: {{ values }}
+
+{%- else %}
+input_{{name }}_remote_agent:
+  file.absent:
+    - name: {{ remote_agent.dir.config_d }}/input-{{ name }}.conf
+    - require:
+      - file: config_d_dir_remote_agent
+{%- endif %}
+
+{%- endfor %}
+
+{%- for name,values in remote_agent.get('output', {}).iteritems() %}
+
+output_{{ name }}_remote_agent:
+  file.managed:
+    - name: {{ remote_agent.dir.config_d }}/output-{{ name }}.conf
+    - source: salt://telegraf/files/output/{{ name }}.conf
+    - user: root
+    - group: root
+    - mode: 644
+    - template: jinja
+    - require:
+      - file: config_d_dir_remote_agent
+    - defaults:
+        name: {{ name }}
+        values: {{ values }}
+
+{%- endfor %}
+{%- endif %}