#
# Copyright 2020 The dNation Jsonnet Translator Authors. All Rights Reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

apiVersion: v1
kind: ConfigMap
metadata:
  name: jsonnet-rule-cm
  namespace: default
  labels:
    prometheus_rule_jsonnet: "1"
  annotations:
    prometheus_label: "prometheus_rule=1"
data:
  example-rule.jsonnet: |-
    {
      newRuleGroup(name):: {
        name: name,
        rules: [],
        alertFullName(name):: '%s%s' % ['TEST_ALERT', name],

        local escapeDoubleBrackets(string) =
          std.strReplace(
            std.strReplace(
              std.strReplace(
                std.strReplace(
                  string, '{{', '{{`{{'
                ), '}}', '}}`}}'
              ), '{{`{{', '{{`{{`}}'
            ), '}}`}}', '{{`}}`}}'
          ),

        addAlert(name, message, expr, operator, threshold, severity):: self {
          local ruleGroup = self,
          rules+: [{
            alert: ruleGroup.alertFullName(name),
            annotations: {
              message: escapeDoubleBrackets(message),
            },
            expr: '%s %s %s' % [expr, operator, threshold],
            'for': '5m',
            labels: {
              severity: severity,
            },
          }],
        },

        thresholdExpression(alertName, severity, default)::
          '%s' % default,

        addAlertPair(name, message, expr, thresholds)::
          self
          .addAlert(name, message, expr, thresholds.operator, self.thresholdExpression(name, 'critical', thresholds.critical), 'critical')
          .addAlert(name, message, expr, thresholds.operator, self.thresholdExpression(name, 'warning', thresholds.warning), 'warning'),

      },
      groups: [
        $.newRuleGroup('JSONNET_RULE')
        .addAlertPair(
          name='NodesHealthHigh',
          message='"TEST: Node Health Low%',
          expr='round(sum(kube_node_info) by (job, node) / (sum(kube_node_info) by (job, node) + sum(kube_node_spec_unschedulable) by (job, node) + sum(kube_node_status_condition{condition="DiskPressure", status="true"}) by (job, node) + sum(kube_node_status_condition{condition="MemoryPressure", status="true"}) by (job, node) ) * 100)',
          thresholds={ operator: '<', warning: 99, critical: 95 }
        ),
      ],
    }
