Merge "Add test in init.yml"
diff --git a/ceph/client/single.yml b/ceph/client/single.yml
index b01458f..6ff7cd8 100644
--- a/ceph/client/single.yml
+++ b/ceph/client/single.yml
@@ -20,10 +20,18 @@
           osd_journal_size: 7500
         mon:
           mon_debug_dump_transactions: False
+        client:
+          rbd_cache_size: 268435456
+          rbd_cache_max_dirty: 134217728
+          rbd_cache_max_dirty_age: 5
+          rbd_cache: True
+      # TODO: Configure these keys on cluster level
       # keyring:
+      #   images:
+      #     key:
       #   object:
-      #     key: 
+      #     key:
       #   cinder:
-      #     key: 
+      #     key:
       #   nova:
-      #     key: 
\ No newline at end of file
+      #     key:
diff --git a/docker/swarm/network/monitoring.yml b/docker/swarm/network/monitoring.yml
new file mode 100644
index 0000000..a049aac
--- /dev/null
+++ b/docker/swarm/network/monitoring.yml
@@ -0,0 +1,8 @@
+parameters:
+  docker:
+    client:
+      network:
+        monitoring:
+          driver: overlay
+          opt:
+            encrypted: true
diff --git a/docker/swarm/service/dashboard/grafana_server.yml b/docker/swarm/service/dashboard/grafana_server.yml
new file mode 100644
index 0000000..4ed587e
--- /dev/null
+++ b/docker/swarm/service/dashboard/grafana_server.yml
@@ -0,0 +1,13 @@
+parameters:
+  docker:
+    client:
+      service:
+        grafana_server:
+          replica: 1
+          environment:
+            GF_SECURITY_ADMIN_PASSWORD: ${_param:grafana_admin_password}
+          restart:
+            condition: any
+          image: ${_param:docker_image_grafana}
+          ports:
+            - 15013:3000
diff --git a/docker/swarm/service/monitoring/prometheus_alertmanager.yml b/docker/swarm/service/monitoring/prometheus_alertmanager.yml
new file mode 100644
index 0000000..74b20f5
--- /dev/null
+++ b/docker/swarm/service/monitoring/prometheus_alertmanager.yml
@@ -0,0 +1,23 @@
+include:
+- service.prometheus.alertmanager.container
+parameters:
+  docker:
+    client:
+      service:
+        prometheus_alertmanager:
+          network: monitoring
+          replica: 2
+          environment:
+            config_dir: /opt/alertmanager/config
+            bind_port: ${prometheus:alertmanager:bind:port}
+            bind_address: ${prometheus:alertmanager:bind:address}
+          restart:
+            condition: any
+          image: ${_param:docker_image_alertmanager}
+          ports:
+            - 15011:${prometheus:alertmanager:bind:port}
+          volume:
+            site:
+              type: bind
+              source: /srv/volumes/prometheus-config
+              destination: /opt/alertmanager/config
diff --git a/docker/swarm/service/monitoring/prometheus_pushgateway.yml b/docker/swarm/service/monitoring/prometheus_pushgateway.yml
new file mode 100644
index 0000000..7ba37af
--- /dev/null
+++ b/docker/swarm/service/monitoring/prometheus_pushgateway.yml
@@ -0,0 +1,12 @@
+parameters:
+  docker:
+    client:
+      service:
+        prometheus_pushgateway:
+          network: monitoring
+          replica: 2
+          restart:
+            condition: any
+          image: ${_param:docker_image_pushgateway}
+          ports:
+            - 15012:9091
diff --git a/docker/swarm/service/monitoring/prometheus_server.yml b/docker/swarm/service/monitoring/prometheus_server.yml
new file mode 100644
index 0000000..24a9193
--- /dev/null
+++ b/docker/swarm/service/monitoring/prometheus_server.yml
@@ -0,0 +1,29 @@
+include:
+- service.prometheus.server.container
+parameters:
+  docker:
+    client:
+      service:
+        prometheus_server:
+          network: monitoring
+          replica: 1
+          environment:
+            config_dir: /opt/prometheus/config
+            bind_port: ${prometheus:server:bind:port}
+            bind_address: ${prometheus:server:bind:address}
+            alertmanager_port: ${prometheus:alertmanager:bind:port}
+            storage_local_engine: ${prometheus:server:storage:local:engine}
+            storage_local_retention: ${prometheus:server:storage:local:retention}
+            storage_local_memory_chunks: ${prometheus:server:storage:local:memory_chunks}
+            storage_local_max_chunks_to_persist: ${prometheus:server:storage:local:max_chunks_to_persist}
+            storage_local_num_fingerprint_mutexes: ${prometheus:server:storage:local:num_fingerprint_mutexes}
+          restart:
+            condition: any
+          image: ${_param:docker_image_prometheus}
+          ports:
+            - 15010:${prometheus:server:bind:port}
+          volume:
+            site:
+              type: bind
+              source: /srv/volumes/prometheus-config
+              destination: /opt/prometheus/config
diff --git a/glusterfs/client/volume/aptly.yml b/glusterfs/client/volume/aptly.yml
index 1c252e3..86a1b40 100644
--- a/glusterfs/client/volume/aptly.yml
+++ b/glusterfs/client/volume/aptly.yml
@@ -7,4 +7,4 @@
         aptly:
           path: /srv/volumes/aptly
           server: ${_param:aptly_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/artifactory.yml b/glusterfs/client/volume/artifactory.yml
index f9c951e..2d36961 100644
--- a/glusterfs/client/volume/artifactory.yml
+++ b/glusterfs/client/volume/artifactory.yml
@@ -7,4 +7,4 @@
         artifactory:
           path: /srv/volumes/artifactory
           server: ${_param:artifactory_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/gerrit.yml b/glusterfs/client/volume/gerrit.yml
index 6199aa6..39e9559 100644
--- a/glusterfs/client/volume/gerrit.yml
+++ b/glusterfs/client/volume/gerrit.yml
@@ -7,6 +7,6 @@
         gerrit:
           path: /srv/volumes/gerrit
           server: ${_param:gerrit_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
           user: 1000
           group: 1000
diff --git a/glusterfs/client/volume/glance.yml b/glusterfs/client/volume/glance.yml
index 66a4166..25cc988 100644
--- a/glusterfs/client/volume/glance.yml
+++ b/glusterfs/client/volume/glance.yml
@@ -9,3 +9,4 @@
           server: ${_param:glance_glusterfs_service_host}
           user: glance
           group: glance
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/jenkins.yml b/glusterfs/client/volume/jenkins.yml
index cb6cea7..8ca47e2 100644
--- a/glusterfs/client/volume/jenkins.yml
+++ b/glusterfs/client/volume/jenkins.yml
@@ -7,6 +7,6 @@
         jenkins:
           path: /srv/volumes/jenkins
           server: ${_param:jenkins_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
           user: 1000
           group: 1000
diff --git a/glusterfs/client/volume/keystone.yml b/glusterfs/client/volume/keystone.yml
index 188ea03..415e93f 100644
--- a/glusterfs/client/volume/keystone.yml
+++ b/glusterfs/client/volume/keystone.yml
@@ -8,4 +8,5 @@
           path: /var/lib/keystone/fernet-keys
           server: ${_param:keystone_glusterfs_service_host}
           user: keystone
-          group: keystone
\ No newline at end of file
+          group: keystone
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/mysql.yml b/glusterfs/client/volume/mysql.yml
index a6458c6..3208a71 100644
--- a/glusterfs/client/volume/mysql.yml
+++ b/glusterfs/client/volume/mysql.yml
@@ -7,4 +7,4 @@
         mysql:
           path: /srv/volumes/mysql
           server: ${_param:mysql_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/openldap.yml b/glusterfs/client/volume/openldap.yml
index 792f15f..0de1d10 100644
--- a/glusterfs/client/volume/openldap.yml
+++ b/glusterfs/client/volume/openldap.yml
@@ -7,4 +7,4 @@
         openldap:
           path: /srv/volumes/openldap
           server: ${_param:openldap_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/postgresql.yml b/glusterfs/client/volume/postgresql.yml
index d2337e7..087afa9 100644
--- a/glusterfs/client/volume/postgresql.yml
+++ b/glusterfs/client/volume/postgresql.yml
@@ -7,4 +7,4 @@
         postgresql:
           path: /srv/volumes/postgresql
           server: ${_param:postgresql_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/prometheus.yml b/glusterfs/client/volume/prometheus.yml
new file mode 100644
index 0000000..f8b2f3d
--- /dev/null
+++ b/glusterfs/client/volume/prometheus.yml
@@ -0,0 +1,10 @@
+parameters:
+  _param:
+    prometheus_glusterfs_service_host: ${_param:glusterfs_service_host}
+  glusterfs:
+    client:
+      volumes:
+        prometheus-config:
+          path: /srv/volumes/prometheus-config
+          server: ${_param:prometheus_glusterfs_service_host}
+          opts: 'defaults'
diff --git a/glusterfs/client/volume/registry.yml b/glusterfs/client/volume/registry.yml
index 875895a..2bb5019 100644
--- a/glusterfs/client/volume/registry.yml
+++ b/glusterfs/client/volume/registry.yml
@@ -7,4 +7,4 @@
         registry:
           path: /srv/volumes/registry
           server: ${_param:registry_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/client/volume/salt.yml b/glusterfs/client/volume/salt.yml
index c3a9570..7ed434a 100644
--- a/glusterfs/client/volume/salt.yml
+++ b/glusterfs/client/volume/salt.yml
@@ -7,4 +7,4 @@
         saltmaster:
           path: /etc/salt/pki/master
           server: ${_param:salt_glusterfs_service_host}
-          opts: 'defaults'
+          opts: "defaults,backup-volfile-servers=${_param:cluster_node01_address}:${_param:cluster_node02_address}:${_param:cluster_node03_address}"
diff --git a/glusterfs/server/volume/prometheus.yml b/glusterfs/server/volume/prometheus.yml
new file mode 100644
index 0000000..2c4ca31
--- /dev/null
+++ b/glusterfs/server/volume/prometheus.yml
@@ -0,0 +1,17 @@
+parameters:
+  glusterfs:
+    server:
+      volumes:
+        prometheus-config:
+          storage: /srv/glusterfs/prometheus-config
+          replica: 3
+          bricks:
+            - ${_param:cluster_node01_address}:/srv/glusterfs/prometheus-config
+            - ${_param:cluster_node02_address}:/srv/glusterfs/prometheus-config
+            - ${_param:cluster_node03_address}:/srv/glusterfs/prometheus-config
+          options:
+            cluster.readdir-optimize: On
+            nfs.disable: On
+            network.remote-dio: On
+            diagnostics.client-log-level: WARNING
+            diagnostics.brick-log-level: WARNING
diff --git a/jenkins/client/job/deploy/init.yml b/jenkins/client/job/deploy/init.yml
index d725c20..102fe73 100644
--- a/jenkins/client/job/deploy/init.yml
+++ b/jenkins/client/job/deploy/init.yml
@@ -1,3 +1,4 @@
 classes:
   - system.jenkins.client.job.deploy.lab
   - system.jenkins.client.job.deploy.update
+  - system.jenkins.client.job.deploy.openstack
diff --git a/jenkins/client/job/deploy/openstack.yml b/jenkins/client/job/deploy/openstack.yml
new file mode 100644
index 0000000..48de021
--- /dev/null
+++ b/jenkins/client/job/deploy/openstack.yml
@@ -0,0 +1,33 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        deploy_openstack:
+          type: workflow-scm
+          name: deploy-openstack
+          display_name: "Deploy - OpenStack"
+          discard:
+            build:
+              keep_num: 20
+          concurrent: true
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: lab-pipeline.groovy
+          param:
+            # deployments and test settings
+            STACK_TYPE:
+              type: string
+              default: "physical"
+            INSTALL:
+              type: string
+              default: "core,kvm,openstack,stacklight"
+
+            # salt master
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+            SALT_MASTER_URL:
+              type: string
+              default: ""
diff --git a/jenkins/client/job/gating.yml b/jenkins/client/job/gating.yml
index 357bc8e..1024a1e 100644
--- a/jenkins/client/job/gating.yml
+++ b/jenkins/client/job/gating.yml
@@ -44,6 +44,9 @@
               JOBS_NAMESPACE:
                 type: string
                 default: "{{name}}"
+              SKIP_TEST:
+                type: string
+                default: false
               CREDENTIALS_ID:
                 type: string
                 default: "gerrit"
\ No newline at end of file
diff --git a/jenkins/client/job/kill_stuck_jobs.yml b/jenkins/client/job/kill_stuck_jobs.yml
new file mode 100644
index 0000000..57f0b3f
--- /dev/null
+++ b/jenkins/client/job/kill_stuck_jobs.yml
@@ -0,0 +1,25 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        kill-stuck-jobs:
+          name: kill-stuck-jobs
+          discard:
+            build:
+              keep_num: 3
+            artifact:
+              keep_num: 3
+          type: workflow-scm
+          concurrent: true
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: abort-long-running-jobs.groovy
+          trigger:
+            timer:
+              spec: "H H * * *"
+          param:
+            MAX_DURATION_IN_HOURS:
+              type: string
+              default: "24"
diff --git a/jenkins/client/job/test_pipelines.yml b/jenkins/client/job/test_pipelines.yml
index 02a64f2..b418626 100644
--- a/jenkins/client/job/test_pipelines.yml
+++ b/jenkins/client/job/test_pipelines.yml
@@ -2,8 +2,8 @@
   jenkins:
     client:
       job:
-        test-mk-pipelines-pipeline:
-          name: test-mk-pipelines
+        test-mk-mk-pipelines:
+          name: test-mk-mk-pipelines
           discard:
             build:
               keep_num: 25
@@ -15,11 +15,11 @@
             type: git
             url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
             credentials: "gerrit"
-            script: git-mirror-2way-pipeline.groovy
+            script: test-groovy-pipeline.groovy
           trigger:
             gerrit:
               project:
-                mk/mk-pipelines":
+                "mk/mk-pipelines":
                   branches:
                     - master
               event:
@@ -37,7 +37,7 @@
               default: "gerrit"
             GRADLE_IMAGE:
               type: string
-              default: niaquinto/gradle
+              default: "niaquinto/gradle"
             GRADLE_CMD:
               type: string
-              default: check
+              default: "check"
diff --git a/jenkins/slave/debian.yml b/jenkins/slave/debian.yml
new file mode 100644
index 0000000..af3c719
--- /dev/null
+++ b/jenkins/slave/debian.yml
@@ -0,0 +1,8 @@
+classes:
+  - system.jenkins.slave
+parameters:
+  linux:
+    system:
+      package:
+        devscripts:
+          version: latest
diff --git a/linux/system/repo/glusterfs.yml b/linux/system/repo/glusterfs.yml
new file mode 100644
index 0000000..da4cddf
--- /dev/null
+++ b/linux/system/repo/glusterfs.yml
@@ -0,0 +1,9 @@
+parameters:
+  linux:
+    system:
+      repo:
+        glusterfs-ppa:
+          source: "deb http://ppa.launchpad.net/gluster/glusterfs-3.7/ubuntu trusty main"
+          architectures: amd64
+          key_id: 3FE869A9
+          key_server: keyserver.ubuntu.com
\ No newline at end of file
diff --git a/linux/system/repo/mcp/contrail.yml b/linux/system/repo/mcp/contrail.yml
new file mode 100644
index 0000000..9f65ee3
--- /dev/null
+++ b/linux/system/repo/mcp/contrail.yml
@@ -0,0 +1,11 @@
+parameters:
+  _param:
+    linux_repo_contrail_component: oc311
+    apt_mk_version: stable
+  linux:
+    system:
+      repo:
+        mcp_opencontrail:
+          source: "deb [arch=amd64] http://apt-mk.mirantis.com/${_param:linux_system_codename}/ ${_param:apt_mk_version} ${_param:openstack_version} ${_param:linux_repo_contrail_component} extra"
+          architectures: amd64
+          key_url: "http://apt-mk.mirantis.com/public.gpg"
diff --git a/linux/system/repo/mcp/extra.yml b/linux/system/repo/mcp/extra.yml
new file mode 100644
index 0000000..0bd9f13
--- /dev/null
+++ b/linux/system/repo/mcp/extra.yml
@@ -0,0 +1,10 @@
+parameters:
+  _param:
+    apt_mk_version: stable
+  linux:
+    system:
+      repo:
+        mcp_extra:
+          source: "deb [arch=amd64] http://apt-mk.mirantis.com/${_param:linux_system_codename}/ ${_param:apt_mk_version} extra"
+          architectures: amd64
+          key_url: "http://apt-mk.mirantis.com/public.gpg"
diff --git a/linux/system/repo/mcp/openstack.yml b/linux/system/repo/mcp/openstack.yml
new file mode 100644
index 0000000..b463b90
--- /dev/null
+++ b/linux/system/repo/mcp/openstack.yml
@@ -0,0 +1,26 @@
+parameters:
+  _param:
+    mcp_repo_version: 1.0
+  linux:
+    system:
+      repo:
+        mirantis_openstack:
+          source: "deb http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename} ${_param:openstack_version} main"
+          architectures: amd64
+          key_url: "http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename}/archive-mcp${_param:mcp_repo_version}.key"
+        mirantis_openstack_hotfix:
+          source: "deb http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename} ${_param:openstack_version}-hotfix main"
+          architectures: amd64
+          key_url: "http://mirror.fuel-infra.org/mcp-repos/{_param:mcp_repo_version/${_param:linux_system_codename}/archive-mcp${_param:mcp_repo_version}.key"
+        mirantis_openstack_security:
+          source: "deb http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename} ${_param:openstack_version}-security main"
+          architectures: amd64
+          key_url: "http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename}/archive-mcp${_param:mcp_repo_version}.key"
+        mirantis_openstack_updates:
+          source: "deb http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename} ${_param:openstack_version}-updates main"
+          architectures: amd64
+          key_url: "http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename}/archive-mcp${_param:mcp_repo_version}.key"
+        mirantis_openstack_holdback:
+          source: "deb http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename} ${_param:openstack_version}-holdback main"
+          architectures: amd64
+          key_url: "http://mirror.fuel-infra.org/mcp-repos/${_param:mcp_repo_version}/${_param:linux_system_codename}/archive-mcp${_param:mcp_repo_version}.key"
diff --git a/linux/system/repo/mcp/salt.yml b/linux/system/repo/mcp/salt.yml
new file mode 100644
index 0000000..e7240a4
--- /dev/null
+++ b/linux/system/repo/mcp/salt.yml
@@ -0,0 +1,10 @@
+parameters:
+  _param:
+    apt_mk_version: stable
+  linux:
+    system:
+      repo:
+        mcp_salt:
+          source: "deb [arch=amd64] http://apt-mk.mirantis.com/${_param:linux_system_codename}/ ${_param:apt_mk_version} salt"
+          architectures: amd64
+          key_url: "http://apt-mk.mirantis.com/public.gpg"
diff --git a/linux/system/repo/mcp10.yml b/linux/system/repo/mcp10.yml
deleted file mode 100644
index 2581543..0000000
--- a/linux/system/repo/mcp10.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-parameters:
-  linux:
-    system:
-      repo:
-        mirantis_openstack:
-          source: "deb http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename} mitaka main"
-          architectures: amd64
-          key_url: "http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename}/archive-mcp1.0.key"
-        mirantis_openstack_hotfix:
-          source: "deb http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename} mitaka-hotfix main"
-          architectures: amd64
-          key_url: "http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename}/archive-mcp1.0.key"
-        mirantis_openstack_security:
-          source: "deb http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename} mitaka-security main"
-          architectures: amd64
-          key_url: "http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename}/archive-mcp1.0.key"
-        mirantis_openstack_updates:
-          source: "deb http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename} mitaka-updates main"
-          architectures: amd64
-          key_url: "http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename}/archive-mcp1.0.key"
-        mirantis_openstack_holdback:
-          source: "deb http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename} mitaka-holdback main"
-          architectures: amd64
-          key_url: "http://mirror.fuel-infra.org/mcp-repos/1.0/${_param:linux_system_codename}/archive-mcp1.0.key"
diff --git a/linux/system/repo/mcp_contrail.yml b/linux/system/repo/mcp_contrail.yml
deleted file mode 100644
index 85f0aa4..0000000
--- a/linux/system/repo/mcp_contrail.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-parameters:
-  _param:
-    linux_repo_contrail_component: oc311
-  linux:
-    system:
-      repo:
-        tcpcloud_opencontrail:
-          source: "deb [arch=amd64] http://apt-mk.mirantis.com/${_param:linux_system_codename}/ nightly ${_param:openstack_version} ${_param:linux_repo_contrail_component} extra"
-          architectures: amd64
-          key_url: "http://apt-mk.mirantis.com/public.gpg"
-
-
-
diff --git a/linux/system/repo/saltstack/trusty.yml b/linux/system/repo/saltstack/trusty.yml
new file mode 100644
index 0000000..c20d4dc
--- /dev/null
+++ b/linux/system/repo/saltstack/trusty.yml
@@ -0,0 +1,9 @@
+parameters:
+  _param:
+    salt_version: 2016.3
+  linux:
+    system:
+      repo:
+        salt:
+          source: "deb http://repo.saltstack.com/apt/ubuntu/14.04/amd64/${_param:salt_version} trusty main"
+          key_url: "http://repo.saltstack.com/apt/ubuntu/14.04/amd64/${_param:salt_version}/SALTSTACK-GPG-KEY.pub"
\ No newline at end of file
diff --git a/linux/system/repo/saltstack/xenial.yml b/linux/system/repo/saltstack/xenial.yml
new file mode 100644
index 0000000..0c933b8
--- /dev/null
+++ b/linux/system/repo/saltstack/xenial.yml
@@ -0,0 +1,9 @@
+parameters:
+  _param:
+    salt_version: 2016.3
+  linux:
+    system:
+      repo:
+        salt:
+          source: "deb http://repo.saltstack.com/apt/ubuntu/16.04/amd64/${_param:salt_version} xenial main"
+          key_url: "http://repo.saltstack.com/apt/ubuntu/16.04/amd64/${_param:salt_version}/SALTSTACK-GPG-KEY.pub"
\ No newline at end of file
diff --git a/linux/system/repo/saltstack_2016_3_trusty.yml b/linux/system/repo/saltstack_2016_3_trusty.yml
index 19e4814..c7e03d7 100644
--- a/linux/system/repo/saltstack_2016_3_trusty.yml
+++ b/linux/system/repo/saltstack_2016_3_trusty.yml
@@ -1,3 +1,4 @@
+##Obsolete, please use repo/saltstack/trusty
 parameters:
   linux:
     system:
diff --git a/linux/system/repo/saltstack_2016_3_xenial.yml b/linux/system/repo/saltstack_2016_3_xenial.yml
index 6fed4c5..413294f 100644
--- a/linux/system/repo/saltstack_2016_3_xenial.yml
+++ b/linux/system/repo/saltstack_2016_3_xenial.yml
@@ -1,3 +1,4 @@
+##Obsolete, please use repo/saltstack/xenial
 parameters:
   linux:
     system:
diff --git a/linux/system/sudo.yml b/linux/system/sudo.yml
index d5badb8..cafd360 100644
--- a/linux/system/sudo.yml
+++ b/linux/system/sudo.yml
@@ -21,6 +21,8 @@
     - /bin/su -
     - /bin/su
     - /usr/sbin/visudo
+    sudo_coreutils_safe:
+    - /usr/bin/less
     sudo_salt_safe:
     - /usr/bin/salt state*
     - /usr/bin/salt service*
diff --git a/openssh/server/team/l1_support.yml b/openssh/server/team/l1_support.yml
index 206291c..d0be2ed 100644
--- a/openssh/server/team/l1_support.yml
+++ b/openssh/server/team/l1_support.yml
@@ -33,6 +33,7 @@
         aliases:
           command:
             L1_SUPPORT_SALT: ${_param:sudo_salt_safe}
+            L1_SUPPORT_COREUTILS: ${_param:sudo_coreutils_safe}
             L1_SUPPORT_SALT_TRUSTED: ${_param:sudo_salt_trusted}
             L1_SUPPORT_RESTRICTED_SHELLS: ${_param:sudo_shells}
             L1_SUPPORT_RESTRICTED: ${_param:sudo_restricted_su}
diff --git a/openssh/server/team/mmo_de.yml b/openssh/server/team/mmo_devops.yml
similarity index 100%
rename from openssh/server/team/mmo_de.yml
rename to openssh/server/team/mmo_devops.yml
diff --git a/prometheus/server/target/etcd.yml b/prometheus/server/target/etcd.yml
new file mode 100644
index 0000000..e343bda
--- /dev/null
+++ b/prometheus/server/target/etcd.yml
@@ -0,0 +1,6 @@
+classes:
+- service.etcd.server.cluster
+parameters:
+  server:
+    target:
+      etcd: ${etcd:server:members}
diff --git a/prometheus/server/target/kubernetes.yml b/prometheus/server/target/kubernetes.yml
new file mode 100644
index 0000000..293895b
--- /dev/null
+++ b/prometheus/server/target/kubernetes.yml
@@ -0,0 +1,10 @@
+classes:
+- service.kubernetes.master.cluster
+parameters:
+  server:
+    target:
+      kubernetes:
+        api_ip: ${kubernetes:master:apiserver:address}
+        ssl_dir: /opt/prometheus/config
+        cert_name: kubelet-client.crt
+        key_name: kubelet-client.key
diff --git a/salt/master/formula/git/monitoring.yml b/salt/master/formula/git/monitoring.yml
new file mode 100644
index 0000000..e0cf30d
--- /dev/null
+++ b/salt/master/formula/git/monitoring.yml
@@ -0,0 +1,14 @@
+parameters:
+  salt:
+    master:
+      environment:
+        dev:
+          formula:
+            prometheus:
+              source: git
+              address: '${_param:salt_master_environment_repository}/salt-formula-prometheus.git'
+              revision: ${_param:salt_master_environment_revision}
+            telegraf:
+              source: git
+              address: '${_param:salt_master_environment_repository}/salt-formula-telegraf.git'
+              revision: ${_param:salt_master_environment_revision}
diff --git a/salt/master/formula/pkg/monitoring.yml b/salt/master/formula/pkg/monitoring.yml
new file mode 100644
index 0000000..375cbd8
--- /dev/null
+++ b/salt/master/formula/pkg/monitoring.yml
@@ -0,0 +1,12 @@
+parameters:
+  salt:
+    master:
+      environment:
+        prd:
+          formula:
+            prometheus:
+              source: pkg
+              name: salt-formula-prometheus
+            telegraf:
+              source: pkg
+              name: salt-formula-telegraf
diff --git a/salt/master/git.yml b/salt/master/git.yml
index bcde77c..02d0b67 100644
--- a/salt/master/git.yml
+++ b/salt/master/git.yml
@@ -6,6 +6,7 @@
 - system.salt.master.formula.git.openstack
 - system.salt.master.formula.git.saltstack
 - system.salt.master.formula.git.stacklight
+- system.salt.master.formula.git.monitoring
 parameters:
   _param:
     salt_master_environment_repository: "https://github.com/salt-formulas"
diff --git a/salt/master/pkg.yml b/salt/master/pkg.yml
index 7686f07..b075138 100644
--- a/salt/master/pkg.yml
+++ b/salt/master/pkg.yml
@@ -6,4 +6,5 @@
 - system.salt.master.formula.pkg.openstack
 - system.salt.master.formula.pkg.saltstack
 - system.salt.master.formula.pkg.stacklight
-- system.linux.system.repo.tcp_salt
+- system.salt.master.formula.pkg.monitoring
+- system.linux.system.repo.mcp.salt
diff --git a/salt/minion/cert/k8s_client_prometheus.yml b/salt/minion/cert/k8s_client_prometheus.yml
new file mode 100644
index 0000000..04cd374
--- /dev/null
+++ b/salt/minion/cert/k8s_client_prometheus.yml
@@ -0,0 +1,12 @@
+parameters:
+  salt:
+    minion:
+      cert:
+        k8s_client_prometheus:
+          host: ${_param:salt_minion_ca_host}
+          authority: ${_param:salt_minion_ca_authority}
+          key_file: /srv/volumes/prometheus-config/kubelet-client.key
+          cert_file: /srv/volumes/prometheus-config/kubelet-client.crt
+          common_name: kubelet-client
+          signing_policy: cert_client
+          alternative_names: IP:${_param:cluster_vip_address},IP:${_param:cluster_node01_address},IP:${_param:cluster_node02_address},IP:${_param:cluster_node03_address},IP:${_param:kubernetes_internal_api_address}
diff --git a/telegraf/agent/init.yml b/telegraf/agent/init.yml
new file mode 100644
index 0000000..57a1f61
--- /dev/null
+++ b/telegraf/agent/init.yml
@@ -0,0 +1,11 @@
+paramaters:
+  telegraf:
+    agent:
+      input:
+        diskio:
+      output:
+        prometheus_client:
+          bind:
+            address: 0.0.0.0
+            port: 9126
+          engine: prometheus