Alarms
diff --git a/heka/_service.sls b/heka/_service.sls
index e228165..9b0bbae 100644
--- a/heka/_service.sls
+++ b/heka/_service.sls
@@ -76,6 +76,9 @@
   'log_collector': {
     'decoder': {},
     'input': {},
+    'trigger': {},
+    'alarm': {},
+    'alarm_cluster': {},
     'filter': {},
     'splitter': {},
     'encoder': {},
@@ -84,6 +87,9 @@
   'metric_collector': {
     'decoder': {},
     'input': {},
+    'trigger': {},
+    'alarm': {},
+    'alarm_cluster': {},
     'filter': {},
     'splitter': {},
     'encoder': {},
@@ -92,6 +98,9 @@
   'remote_collector': {
     'decoder': {},
     'input': {},
+    'trigger': {},
+    'alarm': {},
+    'alarm_cluster': {},
     'filter': {},
     'splitter': {},
     'encoder': {},
@@ -100,6 +109,9 @@
   'aggregator': {
     'decoder': {},
     'input': {},
+    'trigger': {},
+    'alarm': {},
+    'alarm_cluster': {},
     'filter': {},
     'splitter': {},
     'encoder': {},
@@ -130,7 +142,7 @@
 
 {# Loading the other services' support metadata from salt-mine #}
 
-{%- if service_name in ['remote_collector', 'aggregator'] %}
+{%- if service_name in ['remote_collector'] %}
 
 {%- for node_name, node_grains in salt['mine.get']('*', 'grains.items').iteritems() %}
 {%- if node_grains.heka is defined %}
@@ -143,7 +155,7 @@
 {%- endif %}
 
 
-{# Overriding aggregated metadata from user-space pillar data #}
+{# Replacing aggregated metadata from user-space pillar data #}
 
 {%- for service_grain_name, service_grain in service_grains.iteritems() %}
 {% if salt['pillar.get']('heka:'+service_grain_name) %}
@@ -151,9 +163,6 @@
 {%- for service_action_name, service_action in service_grain.iteritems() %}
 {%- if salt['pillar.get']('heka:'+service_grain_name).get(service_action_name, False) is mapping %}
 {%- set grain_action_meta = salt['pillar.get']('heka:'+service_grain_name+':'+service_action_name) %}
-{#
-{%- set service_grains.get(service_grain_name).get(service_action_name) = salt['grains.filter_by']({'default': service_grains}, merge=grain_action_meta) %}
-#}
 {%- endif %}
 {%- endfor %}
 
@@ -231,6 +240,42 @@
 
 {%- endfor %}
 
+{%- for alarm_name, alarm in service_metadata.get('alarm', {}).iteritems() %}
+
+/etc/{{ service_name }}/filter_afd_{{ alarm_name }}.toml:
+  file.managed:
+  - source: salt://heka/files/toml/filter/afd_alarm.toml
+  - template: jinja
+  - mode: 640
+  - group: heka
+  - require:
+    - file: heka_{{ service_name }}_conf_dir
+  - require_in:
+    - file: heka_{{ service_name }}_conf_dir_clean
+  - watch_in:
+    - service: heka_{{ service_name }}_service
+  - defaults:
+      alarm_name: {{ alarm_name }}
+      alarm: {{ alarm|yaml }}
+
+/usr/share/lma_collector_modules/lma_{{ alarm_name }}.lua:
+  file.managed:
+  - source: salt://heka/files/toml/filter/lma_alarm.lua
+  - template: jinja
+  - mode: 640
+  - group: heka
+  - require:
+    - file: heka_{{ service_name }}_conf_dir
+  - require_in:
+    - file: heka_{{ service_name }}_conf_dir_clean
+  - watch_in:
+    - service: heka_{{ service_name }}_service
+  - defaults:
+      alarm_name: {{ alarm_name }}
+      alarm: {{ alarm|yaml }}
+
+{%- endfor %}
+
 {%- for filter_name, filter in service_metadata.get('filter', {}).iteritems() %}
 
 /etc/{{ service_name }}/filter_{{ filter_name }}.toml:
diff --git a/heka/files/toml/filter/afd_alarm.toml b/heka/files/toml/filter/afd_alarm.toml
new file mode 100644
index 0000000..df83cb7
--- /dev/null
+++ b/heka/files/toml/filter/afd_alarm.toml
@@ -0,0 +1,21 @@
+[afd_{{ alarm_name }}_filter]
+type = "SandboxFilter"
+filename = "/usr/share/lma_collector/filters/afd.lua"
+{%- if alarm.preserve_data is defined %}
+preserve_data = {{ alarm.preserve_data|lower }}
+{%- else %}
+preserve_data = false
+{%- endif %}
+message_matcher = "(Type == 'metric' || Type == 'heka.sandbox.metric') && (Fields[name] == 'openstack_check_api')"
+module_directory = "/usr/share/lma_collector_modules;/usr/share/heka/lua_modules"
+
+ticker_interval = 10
+
+[afd_{{ alarm_name }}_filter.config]
+hostname = '{{ grains.host }}'
+afd_type = 'service'
+afd_file = 'lma_{{ alarm_name }}'
+afd_cluster_name = 'cinder-api-check'
+afd_logical_name = 'vip'
+activate_alerting = true
+enable_notification = false
diff --git a/heka/files/toml/filter/lma_alarm.lua b/heka/files/toml/filter/lma_alarm.lua
new file mode 100644
index 0000000..cbf4a70
--- /dev/null
+++ b/heka/files/toml/filter/lma_alarm.lua
@@ -0,0 +1,44 @@
+local M = {}
+setfenv(1, M) -- Remove external access to contain everything in the module
+
+local alarms = {
+{%- for trigger_name, trigger in alarm.triggers.iteritems() %}
+{%- if trigger.get('enabled', True) %}
+  {
+    ['name'] = '{{ alarm_name }}',
+    ['description'] = '{{ alarm.get("description", "").replace("'", "\\'") }}',
+    ['severity'] = '{{ alarm.severity }}',
+    {%- if alarm.no_data_policy is defined %}
+    ['no_data_policy'] = '{{ alarm.no_data_policy }}',
+    {%- endif %}
+    ['trigger'] = {
+      ['logical_operator'] = '{{ alarm.get("logical_operator", "or") }}',
+      ['rules'] = {
+        {%- for rule in trigger.rules %}
+        {
+          ['metric'] = '{{ rule.metric }}',
+          ['fields'] = {
+            {%- for dimension_name, dimension_value in rule.dimension.iteritems() %}
+            ['{{ dimension_name }}'] = '{{ dimension_value }}',
+            {%- endfor %}
+          },
+          ['relational_operator'] = '{{ rule.relational_operator }}',
+          ['threshold'] = '{{ rule.threshold }}',
+          ['window'] = '{{ rule.window }}',
+          ['periods'] = '{{ rule.get('periods', 0) }}',
+          ['function'] = '{{ rule.function }}',
+          ['group_by'] = {
+            {%- for group_by in rule.group_by %}
+            {{ group_by }},
+            {%- endfor %}
+          },
+        },
+        {%- endfor %}
+      },
+    },
+  },
+{%- endif %}
+{%- endfor %}
+}
+
+return alarms
\ No newline at end of file
diff --git a/heka/meta/heka.yml b/heka/meta/heka.yml
index 1d5c8fe..4c4ac6b 100644
--- a/heka/meta/heka.yml
+++ b/heka/meta/heka.yml
@@ -95,10 +95,3 @@
       host: 127.0.0.1
       port: 4354
       ticker_interval: 30 
-aggregator:
-  decoder: {}
-  input: {}
-  filter: {}
-  output: {}
-  splitter: {}
-  encoder: {}
diff --git a/heka/untitled b/heka/untitled
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/heka/untitled