HeatTemplateFormatVersion: '2012-12-12'
Description: AWS::CloudWatch::Alarm using Ceilometer.
Parameters:
  AlarmDescription:
    Type: String
    Default: An alarm
  EvaluationPeriods:
    Type: String
  MetricName:
    Type: String
  Namespace:
    Type: String
    Default: system/linux
  Period:
    Type: String
  ComparisonOperator:
    Type: String
    AllowedValues: [GreaterThanOrEqualToThreshold, GreaterThanThreshold,
                    LessThanThreshold, LessThanOrEqualToThreshold]
  Statistic:
    Type: String
    AllowedValues: [SampleCount, Average, Sum, Minimum, Maximum]
  Threshold:
    Type: String
  Units:
    Type: String
    AllowedValues: [Seconds, Microseconds, Milliseconds, Bytes, Kilobytes,
                    Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits,
                    Gigabits, Terabits, Percent, Count, Bytes/Second,
                    Kilobytes/Second, Megabytes/Second, Gigabytes/Second,
                    Terabytes/Second, Bits/Second, Kilobits/Second,
                    Megabits/Second, Gigabits/Second, Terabits/Second,
                    Count/Second, None]
    Default: None
  AlarmActions:
   Type: CommaDelimitedList
   Default: ''
  OKActions:
   Type: CommaDelimitedList
   Default: ''
  InsufficientDataActions:
   Type: CommaDelimitedList
   Default: ''
  Dimensions:
   Type: CommaDelimitedList

Mappings:
  ComparisonOperatorMap:
    LessThanOrEqualToThreshold: {Ceilometer: le}
    LessThanThreshold: {Ceilometer: lt}
    GreaterThanThreshold: {Ceilometer: gt}
    GreaterThanOrEqualToThreshold: {Ceilometer: ge}
  StatisticMap:
    SampleCount: {Ceilometer: count}
    Average: {Ceilometer: avg}
    Sum: {Ceilometer: sum}
    Minimum: {Ceilometer: min}
    Maximum: {Ceilometer: max}

Resources:
  __alarm__:
    Type: OS::Ceilometer::Alarm
    Properties:
      description:
        Ref: AlarmDescription
      meter_name:
        Ref: MetricName
      period:
        Ref: Period
      evaluation_periods:
        Ref: EvaluationPeriods
      repeat_actions: true
      threshold:
        Ref: Threshold
      alarm_actions:
        "Fn::Split": [",", {Ref: AlarmActions}]
      ok_actions:
        "Fn::Split": [",", {Ref: OKActions}]
      insufficient_data_actions:
        "Fn::Split": [",", {Ref: InsufficientDataActions}]
      statistic:
        "Fn::FindInMap": [StatisticMap, {Ref: Statistic}, Ceilometer]
      comparison_operator:
        "Fn::FindInMap": [ComparisonOperatorMap, {Ref: ComparisonOperator}, Ceilometer]
      matching_metadata:
        "Fn::MemberListToMap": [Name, Value, {"Fn::Split": [",", {Ref: Dimensions}]}]
