Merge "Add alertmanager as a k8s service"
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml
new file mode 100644
index 0000000..e1403ee
--- /dev/null
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml
@@ -0,0 +1,71 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: alertmanager
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  labels:
+    k8s-app: alertmanager
+    kubernetes.io/cluster-service: "true"
+    addonmanager.kubernetes.io/mode: Reconcile
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      k8s-app: alertmanager
+  template:
+    metadata:
+      name: alertmanager
+      labels:
+        k8s-app: alertmanager
+      annotations:
+        scheduler.alpha.kubernetes.io/critical-pod: ''
+        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
+    spec:
+      serviceAccountName: alertmanager
+      affinity:
+        nodeAffinity:
+          requiredDuringSchedulingIgnoredDuringExecution:
+            nodeSelectorTerms:
+              - matchExpressions:
+                - key: node-role.kubernetes.io/master
+                  operator: In
+                  values: ["true"]
+      tolerations:
+        - key: "node-role.kubernetes.io/master"
+          operator: "Exists"
+          effect: "NoSchedule"
+      containers:
+      - name: alertmanager
+        image: "{{ common.addons.get('alertmanager',{}).get('image', 'docker-prod-local.artifactory.mirantis.com/openstack-docker/alertmanager:2018.8.0') }}"
+        ports:
+        - name: alertmanager
+          containerPort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}
+        env:
+        - name: ALERTMANAGER_CONFIG_DIR
+          value: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('config', '/etc/alertmanager') }}"
+        - name: ALERTMANAGER_DATA_DIR
+          value: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('data', '/data') }}"
+        - name: ALERTMANAGER_BIND_PORT
+          value: "{{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}"
+        - name: ALERTMANAGER_BIND_ADDRESS
+          value: "{{ common.addons.get('alertmanager',{}).get('bind', {}).get('address', '0.0.0.0') }}"
+        - name: ALERTMANAGER_DISCOVERY_DOMAIN
+          value: "*.alertmanager.stacklight"
+        - name: ALERTMANAGER_USE_STATIC_DATADIR
+          value: "True"
+        - name: ALERTMANAGER_KUBERNETES_DNS
+          value: "True"
+        volumeMounts:
+        - name: config-volume
+          mountPath: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('config', '/etc/alertmanager') }}"
+        - name: data-volume
+          mountPath: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('data', '/data') }}"
+      volumes:
+      - name: config-volume
+        hostPath:
+          path: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('host_config', '/srv/volumes/local/alertmanager/config') }}"
+      - name: data-volume
+        hostPath:
+          path: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('host_data', '/srv/volumes/local/alertmanager/data') }}"
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml
new file mode 100644
index 0000000..b8c7dce
--- /dev/null
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml
@@ -0,0 +1,8 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+kind: Namespace
+apiVersion: v1
+metadata:
+  name: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  labels:
+    addonmanager.kubernetes.io/mode: Reconcile
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml
new file mode 100644
index 0000000..49c4bb4
--- /dev/null
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml
@@ -0,0 +1,45 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  labels:
+    addonmanager.kubernetes.io/mode: Reconcile
+  name: alertmanager
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: alertmanager
+  labels:
+    addonmanager.kubernetes.io/mode: Reconcile
+rules:
+- apiGroups:
+  - ""
+  resources:
+  - nodes
+  - nodes/proxy
+  - services
+  - endpoints
+  - pods
+  verbs:
+  - get
+  - list
+  - watch
+---
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: alertmanager
+  labels:
+    kubernetes.io/cluster-service: "true"
+    addonmanager.kubernetes.io/mode: Reconcile
+roleRef:
+  kind: ClusterRole
+  name: alertmanager
+  apiGroup: rbac.authorization.k8s.io
+subjects:
+- kind: ServiceAccount
+  name: alertmanager
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml
new file mode 100644
index 0000000..e4bb185
--- /dev/null
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml
@@ -0,0 +1,21 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: alertmanager
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  labels:
+    kubernetes.io/cluster-service: "true"
+    addonmanager.kubernetes.io/mode: Reconcile
+    kubernetes.io/name: "Alertmanager"
+spec:
+  type: NodePort
+  ports:
+    - name: http
+      port: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}
+      protocol: TCP
+      targetPort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}
+      nodePort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('node_port', '31993') }}
+  selector:
+    k8s-app: alertmanager
diff --git a/kubernetes/master/kube-addons.sls b/kubernetes/master/kube-addons.sls
index 42e1b76..6fcedb1 100644
--- a/kubernetes/master/kube-addons.sls
+++ b/kubernetes/master/kube-addons.sls
@@ -205,6 +205,23 @@
 
 {%- endif %}
 
+{%- if common.addons.get('alertmanager', {'enabled': False}).enabled %}
+
+{%- set am_resources = ['deploy', 'ns', 'sa', 'svc'] %}
+{%- for resource in am_resources %}
+
+/etc/kubernetes/addons/alertmanager/alertmanager-{{ resource }}.yml:
+  file.managed:
+    - source: salt://kubernetes/files/kube-addons/alertmanager/alertmanager-{{ resource }}.yml
+    - template: jinja
+    - group: root
+    - dir_mode: 755
+    - makedirs: True
+
+{%- endfor %}
+
+{%- endif %}
+
 {%- if common.addons.get('dns', {'enabled': False}).enabled %}
 
 /etc/kubernetes/addons/dns/kubedns-svc.yaml: