Add jenkins jobs
diff --git a/jenkins/client/job/aptly.yml b/jenkins/client/job/aptly.yml
new file mode 100644
index 0000000..f1c03fb
--- /dev/null
+++ b/jenkins/client/job/aptly.yml
@@ -0,0 +1,76 @@
+classes:
+  - system_extra.jenkins.client.job.common
+
+parameters:
+  jenkins:
+    client:
+      job_template:
+        aptly:
+          name: aptly-{{operation}}-{{dist}}-{{source}}-{{target}}
+          jobs:
+            - operation: promote
+              diff_only: false
+              dist: trusty
+              source: nightly
+              target: testing
+            - operation: promote
+              dist: trusty
+              source: testing
+              target: stable
+            - operation: promote
+              dist: xenial
+              source: nightly
+              target: testing
+            - operation: promote
+              dist: xenial
+              source: testing
+              target: stable
+            - operation: diff
+              diff_only: true
+              dist: trusty
+              source: nightly
+              target: testing
+            - operation: diff
+              diff_only: true
+              dist: trusty
+              source: testing
+              target: stable
+            - operation: diff
+              diff_only: true
+              dist: xenial
+              source: nightly
+              target: testing
+            - operation: diff
+              diff_only: true
+              dist: xenial
+              source: testing
+              target: stable
+          template:
+            discard:
+              build:
+                keep_num: 25
+              artifact:
+                keep_num: 25
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: aptly-promote-pipeline.groovy
+            param:
+              SOURCE:
+                type: string
+                default: "{{dist}}/{{source}}"
+              TARGET:
+                type: string
+                default: "{{dist}}/{{target}}"
+              RECREATE:
+                type: boolean
+                default: 'false'
+              DIFF_ONLY:
+                type: boolean
+                default: '{{diff_only}}'
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
diff --git a/jenkins/client/job/common.yml b/jenkins/client/job/common.yml
new file mode 100644
index 0000000..c92d623
--- /dev/null
+++ b/jenkins/client/job/common.yml
@@ -0,0 +1,9 @@
+parameters:
+  _param:
+    jenkins_gerrit_url: "ssh://jenkins-mk@gerrit.mcp.mirantis.net:29418"
+    jenkins_pipeline_libs: "${_param:jenkins_gerrit_url}/tcp/ccp-pipeline-libs"
+    jenkins_packer_pipeline: "${_param:jenkins_gerrit_url}/mk/packer-templates"
+    jenkins_contrail_pipeline: "${_param:jenkins_gerrit_url}/contrail/contrail-pipeline"
+    jenkins_aptly_api_url: "http://10.10.100.85:8081"
+    jenkins_aptly_url: "http://apt-mk.mirantis.com"
+    jenkins_pollscm_spec: "H/60 * * * *"
diff --git a/jenkins/client/job/debian/init.yml b/jenkins/client/job/debian/init.yml
new file mode 100644
index 0000000..b5b2ebd
--- /dev/null
+++ b/jenkins/client/job/debian/init.yml
@@ -0,0 +1,2 @@
+classes:
+  - system_extra.jenkins.client.job.debian.packages
diff --git a/jenkins/client/job/debian/packages/extra.yml b/jenkins/client/job/debian/packages/extra.yml
new file mode 100644
index 0000000..3681993
--- /dev/null
+++ b/jenkins/client/job/debian/packages/extra.yml
@@ -0,0 +1,117 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-debian:
+          name: build-debian-{{package}}-ubuntu-{{dist}}
+          jobs:
+            - package: librdkafka
+              dist: trusty
+            - package: python-kafka
+              dist: trusty
+            - package: liburcu
+              dist: trusty
+            - package: python-kazoo
+              dist: trusty
+            - package: python-pathlib
+              dist: trusty
+            - package: kafka
+              dist: trusty
+            - package: python-geventhttpclient
+              dist: trusty
+            - package: python-consistent-hash
+              dist: trusty
+            - package: libipfix
+              dist: trusty
+            - package: python-ncclient
+              dist: trusty
+            - package: python-pycassa
+              dist: trusty
+            - package: python-xmltodict
+              dist: trusty
+            - package: python-backports.ssl-match-hostname
+              dist: trusty
+            - package: python-certifi
+              dist: trusty
+            - package: python-docker
+              dist: trusty
+            - package: python-cassandra-driver
+              dist: trusty
+            - package: python-redis
+              dist: trusty
+            - package: python-tabulate
+              dist: trusty
+            - package: cassandra-cpp-driver
+              dist: trusty
+            - package: libuv1
+              dist: trusty
+            - package: python-sseclient
+              dist: trusty
+            - package: librdkafka
+              dist: xenial
+            - package: python-kafka
+              dist: xenial
+            - package: python-geventhttpclient
+              dist: xenial
+            - package: python-consistent-hash
+              dist: xenial
+            - package: libipfix
+              dist: xenial
+            - package: cassandra-cpp-driver
+              dist: xenial
+            - package: python-sseclient
+              dist: xenial
+          template:
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: build-debian-packages-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  debian/{{package}}:
+                    branches:
+                      - debian/{{dist}}
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/debian/{{package}}.git"
+              SOURCE_BRANCH:
+                type: string
+                default: "debian/{{dist}}"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              EXTRA_REPO_URL:
+                type: string
+                default: "deb ${_param:jenkins_aptly_url}/{{dist}}/ testing extra"
+              EXTRA_REPO_KEY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_url}/public.gpg"
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "ubuntu-{{dist}}-extra"
+              OS:
+                type: string
+                default: "ubuntu"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
diff --git a/jenkins/client/job/debian/packages/horizon/init.yml b/jenkins/client/job/debian/packages/horizon/init.yml
new file mode 100644
index 0000000..827f11a
--- /dev/null
+++ b/jenkins/client/job/debian/packages/horizon/init.yml
@@ -0,0 +1,3 @@
+classes:
+  - system_extra.jenkins.client.job.debian.packages.horizon.modules
+  - system_extra.jenkins.client.job.debian.packages.horizon.themes
diff --git a/jenkins/client/job/debian/packages/horizon/modules.yml b/jenkins/client/job/debian/packages/horizon/modules.yml
new file mode 100644
index 0000000..29336e9
--- /dev/null
+++ b/jenkins/client/job/debian/packages/horizon/modules.yml
@@ -0,0 +1,84 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-debian-horizon-module:
+          name: build-debian-horizon-module-{{name}}-{{os_version}}-{{os}}-{{dist}}
+          jobs:
+            # Trusty
+            - name: horizon-overrides-plugin
+              os: ubuntu
+              dist: trusty
+              os_version: mitaka
+              branch: master
+            # Xenial
+            - name: horizon-overrides-plugin
+              os: ubuntu
+              dist: xenial
+              os_version: mitaka
+              branch: master
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: build-debian-packages-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  salt-formulas/{{name}}:
+                    branches:
+                      - "{{branch}}"
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/horizon-modules/{{name}}.git"
+              SOURCE_BRANCH:
+                type: string
+                default: "{{branch}}"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              DEBIAN_SNAPSHOT:
+                type: boolean
+                default: 'true'
+              REVISION_POSTFIX:
+                type: string
+                default: '~{{os_version}}1{{dist}}1'
+              EXTRA_REPO_URL:
+                type: string
+                default: "deb ${_param:jenkins_aptly_url}/{{dist}}/ testing extra {{os_version}}"
+              EXTRA_REPO_KEY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_url}/public.gpg"
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "{{os}}-{{dist}}-{{os_version}}"
+              OS:
+                type: string
+                default: "{{os}}"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
diff --git a/jenkins/client/job/debian/packages/horizon/themes.yml b/jenkins/client/job/debian/packages/horizon/themes.yml
new file mode 100644
index 0000000..e6989b9
--- /dev/null
+++ b/jenkins/client/job/debian/packages/horizon/themes.yml
@@ -0,0 +1,84 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-debian-horizon-theme:
+          name: build-debian-horizon-theme-{{name}}-{{os_version}}-{{os}}-{{dist}}
+          jobs:
+            # Trusty
+            - name: horizon-mirantis-theme
+              os: ubuntu
+              dist: trusty
+              os_version: mitaka
+              branch: master
+            # Xenial
+            - name: horizon-mirantis-theme
+              os: ubuntu
+              dist: xenial
+              os_version: mitaka
+              branch: master
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: build-debian-packages-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  salt-formulas/{{name}}:
+                    branches:
+                      - "{{branch}}"
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/horizon-themes/{{name}}.git"
+              SOURCE_BRANCH:
+                type: string
+                default: "{{branch}}"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              DEBIAN_SNAPSHOT:
+                type: boolean
+                default: 'true'
+              REVISION_POSTFIX:
+                type: string
+                default: '~{{os_version}}1{{dist}}1'
+              EXTRA_REPO_URL:
+                type: string
+                default: "deb ${_param:jenkins_aptly_url}/{{dist}}/ testing extra {{os_version}}"
+              EXTRA_REPO_KEY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_url}/public.gpg"
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "{{os}}-{{dist}}-{{os_version}}"
+              OS:
+                type: string
+                default: "{{os}}"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
diff --git a/jenkins/client/job/debian/packages/init.yml b/jenkins/client/job/debian/packages/init.yml
new file mode 100644
index 0000000..972b7df
--- /dev/null
+++ b/jenkins/client/job/debian/packages/init.yml
@@ -0,0 +1,5 @@
+classes:
+  - system_extra.jenkins.client.job.debian.packages.extra
+  - system_extra.jenkins.client.job.debian.packages.salt
+  - system_extra.jenkins.client.job.debian.packages.salt-multi
+  - system_extra.jenkins.client.job.debian.packages.horizon
diff --git a/jenkins/client/job/debian/packages/salt-multi.yml b/jenkins/client/job/debian/packages/salt-multi.yml
new file mode 100644
index 0000000..35e1aa9
--- /dev/null
+++ b/jenkins/client/job/debian/packages/salt-multi.yml
@@ -0,0 +1,113 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-debian-salt-multibranch:
+          name: build-debian-salt-formula-{{name}}-ubuntu-{{dist}}
+          jobs:
+            - name: ceilometer
+              dist: trusty
+            - name: cinder
+              dist: trusty
+            - name: glance
+              dist: trusty
+            - name: heat
+              dist: trusty
+            - name: horizon
+              dist: trusty
+            - name: keystone
+              dist: trusty
+            - name: kubernetes
+              dist: trusty
+            - name: neutron
+              dist: trusty
+            - name: nova
+              dist: trusty
+            - name: swift
+              dist: trusty
+            - name: ceilometer
+              dist: xenial
+            - name: cinder
+              dist: xenial
+            - name: glance
+              dist: xenial
+            - name: heat
+              dist: xenial
+            - name: horizon
+              dist: xenial
+            - name: keystone
+              dist: xenial
+            - name: kubernetes
+              dist: xenial
+            - name: neutron
+              dist: xenial
+            - name: nova
+              dist: xenial
+            - name: swift
+              dist: xenial
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: build-debian-packages-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  salt-formulas/{{name}}:
+                    branches:
+                      - master
+                      - debian/{{dist}}
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/salt-formulas/{{name}}.git"
+              SOURCE_BRANCH:
+                type: string
+                default: "master"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              DEBIAN_BRANCH:
+                type: string
+                default: 'debian/{{dist}}'
+              DEBIAN_SNAPSHOT:
+                type: boolean
+                default: 'true'
+              EXTRA_REPO_URL:
+                type: string
+                default: "deb ${_param:jenkins_aptly_url}/{{dist}}/ testing salt salt-latest"
+              EXTRA_REPO_KEY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_url}/public.gpg"
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "ubuntu-{{dist}}-salt"
+              OS:
+                type: string
+                default: "ubuntu"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
diff --git a/jenkins/client/job/debian/packages/salt.yml b/jenkins/client/job/debian/packages/salt.yml
new file mode 100644
index 0000000..73eedef
--- /dev/null
+++ b/jenkins/client/job/debian/packages/salt.yml
@@ -0,0 +1,404 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-debian-salt-formula:
+          name: build-debian-salt-formula-{{name}}-ubuntu-{{dist}}
+          jobs:
+            - name: aodh
+              dist: trusty
+            - name: apache
+              dist: trusty
+            - name: aptly
+              dist: trusty
+            - name: artifactory
+              dist: trusty
+            - name: avinetworks
+              dist: trusty
+            - name: backupninja
+              dist: trusty
+            - name: billometer
+              dist: trusty
+            - name: bind
+              dist: trusty
+            - name: bird
+              dist: trusty
+            - name: cadf
+              dist: trusty
+            - name: calico
+              dist: trusty
+            - name: cassandra
+              dist: trusty
+            - name: ccp
+              dist: trusty
+            - name: ceph
+              dist: trusty
+            - name: chrony
+              dist: trusty
+            - name: collectd
+              dist: trusty
+            - name: dekapod
+              dist: trusty
+            - name: docker
+              dist: trusty
+            - name: dovecot
+              dist: trusty
+            - name: elasticsearch
+              dist: trusty
+            - name: etcd
+              dist: trusty
+            - name: foreman
+              dist: trusty
+            - name: freeipa
+              dist: trusty
+            - name: galera
+              dist: trusty
+            - name: gerrit
+              dist: trusty
+            - name: git
+              dist: trusty
+            - name: gitlab
+              dist: trusty
+            - name: glusterfs
+              dist: trusty
+            - name: grafana
+              dist: trusty
+            - name: graphite
+              dist: trusty
+            - name: haproxy
+              dist: trusty
+            - name: heka
+              dist: trusty
+            - name: influxdb
+              dist: trusty
+            - name: iptables
+              dist: trusty
+            - name: isc-dhcp
+              dist: trusty
+            - name: java
+              dist: trusty
+            - name: jenkins
+              dist: trusty
+            - name: kedb
+              dist: trusty
+            - name: keepalived
+              dist: trusty
+            - name: kibana
+              dist: trusty
+            - name: letsencrypt
+              dist: trusty
+            - name: libvirt
+              dist: trusty
+            - name: linux
+              dist: trusty
+            - name: logrotate
+              dist: trusty
+            - name: maas
+              dist: trusty
+            - name: magnum
+              dist: trusty
+            - name: memcached
+              dist: trusty
+            - name: midonet
+              dist: trusty
+            - name: monasca
+              dist: trusty
+            - name: mongodb
+              dist: trusty
+            - name: murano
+              dist: trusty
+            - name: mysql
+              dist: trusty
+            - name: nagios
+              dist: trusty
+            - name: network
+              dist: trusty
+            - name: nfs
+              dist: trusty
+            - name: nginx
+              dist: trusty
+            - name: nodejs
+              dist: trusty
+            - name: ntp
+              dist: trusty
+            - name: opencontrail
+              dist: trusty
+            - name: openssh
+              dist: trusty
+            - name: openvpn
+              dist: trusty
+            - name: openvstorage
+              dist: trusty
+            - name: owncloud
+              dist: trusty
+            - name: postfix
+              dist: trusty
+            - name: postgresql
+              dist: trusty
+            - name: pritunl
+              dist: trusty
+            - name: python
+              dist: trusty
+            - name: rabbitmq
+              dist: trusty
+            - name: reclass
+              dist: trusty
+            - name: redis
+              dist: trusty
+            - name: roundcube
+              dist: trusty
+            - name: rsync
+              dist: trusty
+            - name: rsyslog
+              dist: trusty
+            - name: sahara
+              dist: trusty
+            - name: salt
+              dist: trusty
+            - name: sensu
+              dist: trusty
+            - name: sentry
+              dist: trusty
+            - name: sphinx
+              dist: trusty
+            - name: statsd
+              dist: trusty
+            - name: supervisor
+              dist: trusty
+            - name: taiga
+              dist: trusty
+            - name: varnish
+              dist: trusty
+            - name: zookeeper
+              dist: trusty
+            - name: aodh
+              dist: xenial
+            - name: apache
+              dist: xenial
+            - name: aptly
+              dist: xenial
+            - name: artifactory
+              dist: xenial
+            - name: avinetworks
+              dist: xenial
+            - name: backupninja
+              dist: xenial
+            - name: billometer
+              dist: xenial
+            - name: bind
+              dist: xenial
+            - name: bird
+              dist: xenial
+            - name: cadf
+              dist: xenial
+            - name: calico
+              dist: xenial
+            - name: cassandra
+              dist: xenial
+            - name: ccp
+              dist: xenial
+            - name: ceph
+              dist: xenial
+            - name: chrony
+              dist: xenial
+            - name: collectd
+              dist: xenial
+            - name: dekapod
+              dist: xenial
+            - name: docker
+              dist: xenial
+            - name: dovecot
+              dist: xenial
+            - name: elasticsearch
+              dist: xenial
+            - name: etcd
+              dist: xenial
+            - name: foreman
+              dist: xenial
+            - name: freeipa
+              dist: xenial
+            - name: galera
+              dist: xenial
+            - name: gerrit
+              dist: xenial
+            - name: git
+              dist: xenial
+            - name: gitlab
+              dist: xenial
+            - name: glusterfs
+              dist: xenial
+            - name: grafana
+              dist: xenial
+            - name: graphite
+              dist: xenial
+            - name: haproxy
+              dist: xenial
+            - name: heka
+              dist: xenial
+            - name: influxdb
+              dist: xenial
+            - name: iptables
+              dist: xenial
+            - name: isc-dhcp
+              dist: xenial
+            - name: java
+              dist: xenial
+            - name: jenkins
+              dist: xenial
+            - name: kedb
+              dist: xenial
+            - name: keepalived
+              dist: xenial
+            - name: kibana
+              dist: xenial
+            - name: letsencrypt
+              dist: xenial
+            - name: libvirt
+              dist: xenial
+            - name: linux
+              dist: xenial
+            - name: logrotate
+              dist: xenial
+            - name: maas
+              dist: xenial
+            - name: magnum
+              dist: xenial
+            - name: memcached
+              dist: xenial
+            - name: midonet
+              dist: xenial
+            - name: monasca
+              dist: xenial
+            - name: mongodb
+              dist: xenial
+            - name: murano
+              dist: xenial
+            - name: mysql
+              dist: xenial
+            - name: nagios
+              dist: xenial
+            - name: network
+              dist: xenial
+            - name: nfs
+              dist: xenial
+            - name: nginx
+              dist: xenial
+            - name: nodejs
+              dist: xenial
+            - name: ntp
+              dist: xenial
+            - name: opencontrail
+              dist: xenial
+            - name: openssh
+              dist: xenial
+            - name: openvpn
+              dist: xenial
+            - name: openvstorage
+              dist: xenial
+            - name: owncloud
+              dist: xenial
+            - name: postfix
+              dist: xenial
+            - name: postgresql
+              dist: xenial
+            - name: pritunl
+              dist: xenial
+            - name: python
+              dist: xenial
+            - name: rabbitmq
+              dist: xenial
+            - name: reclass
+              dist: xenial
+            - name: redis
+              dist: xenial
+            - name: roundcube
+              dist: xenial
+            - name: rsync
+              dist: xenial
+            - name: rsyslog
+              dist: xenial
+            - name: sahara
+              dist: xenial
+            - name: salt
+              dist: xenial
+            - name: sensu
+              dist: xenial
+            - name: sentry
+              dist: xenial
+            - name: sphinx
+              dist: xenial
+            - name: statsd
+              dist: xenial
+            - name: supervisor
+              dist: xenial
+            - name: taiga
+              dist: xenial
+            - name: varnish
+              dist: xenial
+            - name: zookeeper
+              dist: xenial
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: build-debian-packages-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  salt-formulas/{{name}}:
+                    branches:
+                      - master
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/salt-formulas/{{name}}.git"
+              SOURCE_BRANCH:
+                type: string
+                default: "master"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              DEBIAN_SNAPSHOT:
+                type: boolean
+                default: 'true'
+              REVISION_POSTFIX:
+                type: string
+                default: '~{{dist}}1'
+              EXTRA_REPO_URL:
+                type: string
+                default: "deb ${_param:jenkins_aptly_url}/{{dist}}/ testing salt salt-latest"
+              EXTRA_REPO_KEY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_url}/public.gpg"
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "ubuntu-{{dist}}-salt"
+              OS:
+                type: string
+                default: "ubuntu"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
diff --git a/jenkins/client/job/deploy/cicd_lab.yml b/jenkins/client/job/deploy/cicd_lab.yml
new file mode 100644
index 0000000..0aa442e
--- /dev/null
+++ b/jenkins/client/job/deploy/cicd_lab.yml
@@ -0,0 +1,77 @@
+parameters:
+  jenkins:
+    client:
+      job_template:
+        deploy_heat_cicd:
+          name: deploy-heat-{{name}}
+          jobs:
+            - name: cicd-lab-dev
+              lab: cicd_lab_dev
+          template:
+            type: workflow-scm
+            concurrent: true
+            display_name: "Deploy {{name}} heat stack"
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: cicd-lab-pipeline.groovy
+            param:
+              # heat
+              HEAT_TEMPLATE_URL:
+                type: string
+                default: "git@github.com:Mirantis/mk-lab-heat-templates.git"
+              HEAT_TEMPLATE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              HEAT_TEMPLATE_BRANCH:
+                type: string
+                default: "master"
+              HEAT_STACK_NAME:
+                type: string
+                description: Heat stack name. Will be generated if missing.
+              HEAT_STACK_TEMPLATE:
+                type: string
+                default: "{{lab}}"
+              HEAT_STACK_ENVIRONMENT:
+                type: string
+                default: "tcpisek"
+              HEAT_STACK_ZONE:
+                type: string
+                default: "mirantis-zone-qa"
+              HEAT_STACK_PUBLIC_NET:
+                type: string
+                default: "mirantis-private"
+              HEAT_STACK_DELETE:
+                type: boolean
+                default: 'true'
+                description: "Delete heat stack at the end of job"
+              HEAT_STACK_REUSE:
+                type: boolean
+                default: 'false'
+                description: "Reuse existing stack and only orchestrate deployment"
+
+              # salt master
+              SALT_MASTER_CREDENTIALS:
+                type: string
+                default: "salt-qa-credentials"
+              SSH_PUBLIC_KEY:
+                type: string
+                description: "User's public SSH key to be able to login when stack is deployed"
+
+              # openstack api
+              OPENSTACK_API_URL:
+                type: string
+                default: "https://vpc.tcpisek.cz:5000/v2.0"
+              OPENSTACK_API_CREDENTIALS:
+                type: string
+                default: "openstack-qa-credentials"
+              OPENSTACK_API_PROJECT:
+                type: string
+                default: "mirantis_mk20_qa"
+              OPENSTACK_API_CLIENT:
+                type: string
+                default: "liberty"
+              OPENSTACK_API_VERSION:
+                type: string
+                default: "2"
diff --git a/jenkins/client/job/deploy/demo.yml b/jenkins/client/job/deploy/demo.yml
new file mode 100644
index 0000000..3ea8a40
--- /dev/null
+++ b/jenkins/client/job/deploy/demo.yml
@@ -0,0 +1,20 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        deploy_kafka_demo:
+          type: workflow-scm
+          concurrent: false
+          display_name: "Kafka demo"
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: kafka-demo.groovy
+          param:
+              # salt master
+              SALT_MASTER_CREDENTIALS:
+                type: string
+                default: "salt-qa-credentials"
+              SALT_URL:
+                type: string
diff --git a/jenkins/client/job/deploy/init.yml b/jenkins/client/job/deploy/init.yml
new file mode 100644
index 0000000..459ac39
--- /dev/null
+++ b/jenkins/client/job/deploy/init.yml
@@ -0,0 +1,5 @@
+classes:
+  - system_extra.jenkins.client.job.deploy.mk_lab
+  - system_extra.jenkins.client.job.deploy.cicd_lab
+  - system_extra.jenkins.client.job.deploy.demo
+  - system_extra.jenkins.client.job.deploy.reclass_update
diff --git a/jenkins/client/job/deploy/maas_lab.yml b/jenkins/client/job/deploy/maas_lab.yml
new file mode 100644
index 0000000..b4b61e4
--- /dev/null
+++ b/jenkins/client/job/deploy/maas_lab.yml
@@ -0,0 +1,67 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        heat_maas_lab:
+          type: workflow
+          concurrent: false
+          display_name: "[Heat] Deploy MAAS lab"
+          param:
+            HEAT_TEMPLATE_URL:
+              type: string
+              default: "git@github.com:Mirantis/mk-lab-heat-templates.git"
+            HEAT_TEMPLATE_CREDENTIALS:
+              type: string
+              default: "git-qa"
+            HEAT_TEMPLATE_BRANCH:
+              type: string
+              default: "master"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
+            OPENSTACK_API_VERSION:
+              type: string
+              default: "2"
+            OPENSTACK_API_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            OPENSTACK_API_CREDENTIALS:
+              type: string
+              default: "openstack-qa"
+            OPENSTACK_API_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt-qa-credentials"
+            HEAT_STACK_NAME:
+              type: string
+              default: "maas_gate"
+            HEAT_STACK_TEMPLATE:
+              type: string
+              default: "maas_lab"
+            HEAT_STACK_ENVIRONMENT:
+              type: string
+              default: "tcpisek"
+            HEAT_STACK_ZONE:
+              type: string
+              default: "mirantis-zone-qa"
+            HEAT_STACK_PUBLIC_NET:
+              type: string
+              default: "inet2"
+          libs:
+          - repository: pipeline_libs
+            file: macro/common.groovy
+          - repository: pipeline_libs
+            file: macro/git.groovy
+          - repository: pipeline_libs
+            file: macro/http.groovy
+          - repository: pipeline_libs
+            file: macro/openstack.groovy
+          - repository: pipeline_libs
+            file: macro/python.groovy
+          - repository: pipeline_libs
+            file: macro/salt.groovy
+          script:
+            repository: pipeline_libs
+            file: pipeline/provision/heat_maas_lab.groovy
diff --git a/jenkins/client/job/deploy/mk_lab.yml b/jenkins/client/job/deploy/mk_lab.yml
new file mode 100644
index 0000000..a36d26e
--- /dev/null
+++ b/jenkins/client/job/deploy/mk_lab.yml
@@ -0,0 +1,205 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        deploy-update-package:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Update system package(s)"
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: update-package.groovy
+          param:
+            SALT_MASTER_URL:
+              type: string
+              default: "http://10.10.10.1:8000"
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+            UPDATE_SERVERS:
+              type: string
+              default: "*"
+              description: Salt compound target to match nodes to be updated.
+            UPDATE_PACKAGES:
+              type: string
+              default: ""
+              description: Space delimited list of packages to be updates [package1=version package2=version], empty string means all updating all packages to the latest version.
+            UPDATE_COMMIT:
+              type: boolean
+              default: false
+
+        deploy-heat-cleanup:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Deploy - heat cleanup"
+          discard:
+            build:
+              keep_num: 20
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: cleanup-pipeline.groovy
+          param:
+            # openstack api
+            OPENSTACK_API_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            OPENSTACK_API_CREDENTIALS:
+              type: string
+              default: "openstack-qa-credentials"
+            OPENSTACK_API_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
+            OPENSTACK_API_VERSION:
+              type: string
+              default: "2"
+            # heat
+            HEAT_STACK_NAME:
+              type: string
+              description: This stack will be deleted.
+
+      job_template:
+        deploy_heat_template:
+          name: deploy-{{stack_type}}-{{lab}}
+          jobs:
+            # virtual
+            - lab: virtual_mcp05_dvr
+              install: core,openstack,dvr
+              stack_type: heat
+            - lab: virtual_mcp05_ovs
+              install: core,openstack,ovs
+              stack_type: heat
+            - lab: virtual_mcp10_contrail
+              install: core,openstack,contrail
+              stack_type: heat
+            - lab: virtual_mcp10_dvr
+              install: core,openstack,dvr
+              stack_type: heat
+            - lab: virtual_mcp10_ovs
+              install: core,openstack,ovs
+              stack_type: heat
+            - lab: virtual_mk20_advanced
+              install: core,openstack
+              stack_type: heat
+            - lab: virtual_mk20_basic
+              install: core,openstack
+              stack_type: heat
+            - lab: virtual_mk22_advanced
+              install: core,openstack
+              stack_type: heat
+            - lab: virtual_mk22_basic
+              install: core,openstack
+              stack_type: heat
+            # physical
+            - lab: mcp10_contrail
+              install: core,kvm,openstack,contrail
+              stack_type: physical
+            - lab: mcp10_opencontrail_nfv
+              install: core,kvm,openstack,nfv
+              stack_type: physical
+            - lab: mcp10_dvr
+              install: core,kvm,openstack,dvr
+              stack_type: physical
+            - lab: mcp10_non_dvr
+              install: core,kvm,openstack
+              stack_type: physical
+          template:
+            type: workflow-scm
+            discard:
+              build:
+                keep_num: 20
+            concurrent: true
+            display_name: "Deploy - {{lab}} {{stack_type}} lab"
+            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: "{{stack_type}}"
+              INSTALL:
+                type: string
+                default: "{{install}}"
+              TEST:
+                type: string
+                default: ""
+
+              # heat
+              HEAT_TEMPLATE_URL:
+                type: string
+                default: "git@github.com:Mirantis/mk-lab-heat-templates.git"
+              HEAT_TEMPLATE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              HEAT_TEMPLATE_BRANCH:
+                type: string
+                default: "composite"
+              HEAT_STACK_NAME:
+                type: string
+                description: Heat stack name. Will be generated if missing.
+              HEAT_STACK_TEMPLATE:
+                type: string
+                default: "{{lab}}"
+              HEAT_STACK_ENVIRONMENT:
+                type: string
+                default: "tcpisek"
+              HEAT_STACK_ZONE:
+                type: string
+                default: "mirantis-zone-qa"
+              HEAT_STACK_PUBLIC_NET:
+                type: string
+                default: "mirantis-private"
+              HEAT_STACK_DELETE:
+                type: boolean
+                default: 'true'
+              HEAT_STACK_REUSE:
+                type: boolean
+                default: 'false'
+
+              # salt master
+              SALT_MASTER_CREDENTIALS:
+                type: string
+                default: "salt-qa-credentials"
+              SALT_MASTER_URL:
+                type: string
+                default: ""
+
+              # openstack api
+              OPENSTACK_API_URL:
+                type: string
+                default: "https://vpc.tcpisek.cz:5000/v2.0"
+              OPENSTACK_API_CREDENTIALS:
+                type: string
+                default: "openstack-qa-credentials"
+              OPENSTACK_API_PROJECT:
+                type: string
+                default: "mirantis_mk20_qa"
+              OPENSTACK_API_CLIENT:
+                type: string
+                default: "liberty"
+              OPENSTACK_API_VERSION:
+                type: string
+                default: "2"
+
+              # k8s setttings
+              K8S_API_SERVER:
+                type: string
+                default: "http://127.0.0.1:8080"
+              K8S_CONFORMANCE_IMAGE:
+                type: string
+                default: "docker-dev-virtual.docker.mirantis.net/mirantis/kubernetes/k8s-conformance:v1.5.1-3_1482332392819"
+
+              # Tempest settings
+              TEMPEST_IMAGE_LINK:
+                type: string
+                default: "sandbox-docker-prod-local.docker.mirantis.net/mirantis/rally_tempest:0.1"
+
diff --git a/jenkins/client/job/deploy/reclass_update.yml b/jenkins/client/job/deploy/reclass_update.yml
new file mode 100644
index 0000000..1f99ddc
--- /dev/null
+++ b/jenkins/client/job/deploy/reclass_update.yml
@@ -0,0 +1,26 @@
+parameters:
+  jenkins:
+    client:
+      job_template:
+        reclass_update:
+          name: deploy-update-{{name}}
+          jobs:
+            - name: mk-ci
+              salt_url: "http://10.10.100.81:8000"
+              salt_credentials: salt-mk-ci
+          template:
+            display_name: "Deploy - update {{name}} environment"
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/salt-models/{{name}}"
+              credentials: "gerrit"
+              script: Jenkinsfile
+            param:
+              SALT_MASTER_URL:
+                type: string
+                default: "{{salt_url}}"
+              SALT_MASTER_CREDENTIALS:
+                type: string
+                default: "{{salt_credentials}}"
diff --git a/jenkins/client/job/gating.yml b/jenkins/client/job/gating.yml
new file mode 100644
index 0000000..0c4f9dd
--- /dev/null
+++ b/jenkins/client/job/gating.yml
@@ -0,0 +1,49 @@
+parameters:
+  jenkins:
+    client:
+      job_template:
+        gate-gerrit-namespace:
+          name: gate-gerrit-{{name}}
+          jobs:
+            - name: mk
+            - name: debian
+            - name: contrail
+            - name: salt-models
+            - name: salt-formulas
+          template:
+            discard:
+              build:
+                keep_num: 5
+              artifact:
+                keep_num: 5
+            type: workflow-scm
+            concurrent: true
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: gating-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  '{{name}}\/.*':
+                  compare_type: REG_EXP
+                  branches:
+                      - master
+                skip_vote:
+                  - successful
+                  - failed
+                  - unstable
+                  - not_built
+                event:
+                  comment:
+                    - added:
+                        verdictCategory: 'Workflow'
+                        commentAddedTriggerApprovalValue: '+1'
+            param:
+              JOBS_NAMESPACE:
+                type: string
+                default: "{{name}}"
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
\ No newline at end of file
diff --git a/jenkins/client/job/image/centos.yml b/jenkins/client/job/image/centos.yml
new file mode 100644
index 0000000..e4b9b72
--- /dev/null
+++ b/jenkins/client/job/image/centos.yml
@@ -0,0 +1,70 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        build-image-centos-7:
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_packer_pipeline}"
+            credentials: "gerrit"
+          display_name: "[Images] Build Centos 7"
+          param:
+            BUILD_OS:
+              type: string
+              default: "centos-7"
+            BUILD_ONLY:
+              type: string
+              default: "qemu"
+            PACKER_DEBUG:
+              type: boolean
+              default: "false"
+            PACKER_URL:
+              type: string
+              default: "https://releases.hashicorp.com/packer/0.8.6/packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP:
+              type: string
+              default: "packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP_MD5:
+              type: string
+              default: "4cda1c44cf666fada495dd8e01522e1c"
+            PACKER_ARGS:
+              type: string
+              default: ""
+            UPLOAD_URL:
+              type: string
+              default: "http://jenkins:eyoocaiG3ADireK3Eef8gae1roh5oox010.10.100.85:8088/"
+            SKIP_UPLOAD:
+              type: boolean
+              default: "false"
+            CLEANUP_OLD:
+              type: boolean
+              default: "true"
+            CLEANUP_KEEP:
+              type: string
+              default: "3"
+            GLANCE_UPLOAD:
+              type: boolean
+              default: "true"
+            GLANCE_IMG_TYPES:
+              type: string
+              default: "qcow2"
+            GLANCE_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            GLANCE_CREDENTIALS_ID:
+              type: string
+              default: "openstack-qa-credentials"
+            GLANCE_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            GLANCE_ARGS:
+              type: string
+              default: ""
+            GLANCE_PUBLIC:
+              type: boolean
+              default: "true"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
\ No newline at end of file
diff --git a/jenkins/client/job/image/debian.yml b/jenkins/client/job/image/debian.yml
new file mode 100644
index 0000000..317c5df
--- /dev/null
+++ b/jenkins/client/job/image/debian.yml
@@ -0,0 +1,70 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        build-image-debian-8:
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_packer_pipeline}"
+            credentials: "gerrit"
+          display_name: "[Images] Build Debian 8 image"
+          param:
+            BUILD_OS:
+              type: string
+              default: "debian-8"
+            BUILD_ONLY:
+              type: string
+              default: "qemu"
+            PACKER_DEBUG:
+              type: boolean
+              default: "false"
+            PACKER_URL:
+              type: string
+              default: "https://releases.hashicorp.com/packer/0.8.6/packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP:
+              type: string
+              default: "packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP_MD5:
+              type: string
+              default: "4cda1c44cf666fada495dd8e01522e1c"
+            PACKER_ARGS:
+              type: string
+              default: ""
+            UPLOAD_URL:
+              type: string
+              default: "http://jenkins:eyoocaiG3ADireK3Eef8gae1roh5oox0@10.10.100.85:8088/"
+            SKIP_UPLOAD:
+              type: boolean
+              default: "false"
+            CLEANUP_OLD:
+              type: boolean
+              default: "true"
+            CLEANUP_KEEP:
+              type: string
+              default: "3"
+            GLANCE_UPLOAD:
+              type: boolean
+              default: "true"
+            GLANCE_IMG_TYPES:
+              type: string
+              default: "qcow2"
+            GLANCE_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            GLANCE_CREDENTIALS_ID:
+              type: string
+              default: "openstack-qa-credentials"
+            GLANCE_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            GLANCE_ARGS:
+              type: string
+              default: ""
+            GLANCE_PUBLIC:
+              type: boolean
+              default: "true"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
diff --git a/jenkins/client/job/image/ubuntu.yml b/jenkins/client/job/image/ubuntu.yml
new file mode 100755
index 0000000..e49bda0
--- /dev/null
+++ b/jenkins/client/job/image/ubuntu.yml
@@ -0,0 +1,143 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        build-image-ubuntu-14-04:
+          type: workflow-scm
+          concurrent: false
+          discard:
+            build:
+              keep_num: 5
+              keep_days: 5
+            artifact:
+              keep_num: 6
+              keep_days: 6
+          scm:
+            type: git
+            url: "${_param:jenkins_packer_pipeline}"
+            credentials: "gerrit"
+          display_name: "[Images] Build Ubuntu 14.04 image"
+          param:
+            BUILD_OS:
+              type: string
+              default: "ubuntu-14.04"
+            BUILD_ONLY:
+              type: string
+              default: "qemu"
+            PACKER_DEBUG:
+              type: boolean
+              default: "false"
+            PACKER_URL:
+              type: string
+              default: "https://releases.hashicorp.com/packer/0.8.6/packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP:
+              type: string
+              default: "packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP_MD5:
+              type: string
+              default: "4cda1c44cf666fada495dd8e01522e1c"
+            PACKER_ARGS:
+              type: string
+              default: ""
+            UPLOAD_URL:
+              type: string
+              default: "http://jenkins:eyoocaiG3ADireK3Eef8gae1roh5oox0@10.10.100.85:8088/"
+            SKIP_UPLOAD:
+              type: boolean
+              default: "false"
+            CLEANUP_OLD:
+              type: boolean
+              default: "true"
+            CLEANUP_KEEP:
+              type: string
+              default: "3"
+            GLANCE_UPLOAD:
+              type: boolean
+              default: "true"
+            GLANCE_IMG_TYPES:
+              type: string
+              default: "qcow2"
+            GLANCE_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            GLANCE_CREDENTIALS_ID:
+              type: string
+              default: "openstack-qa-credentials"
+            GLANCE_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            GLANCE_ARGS:
+              type: string
+              default: ""
+            GLANCE_PUBLIC:
+              type: boolean
+              default: "true"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
+        build-image-ubuntu-16-04:
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_packer_pipeline}"
+            credentials: "gerrit"
+          display_name: "[Images] Build Ubuntu 16.04 image"
+          param:
+            BUILD_OS:
+              type: string
+              default: "ubuntu-16.04"
+            BUILD_ONLY:
+              type: string
+              default: "qemu"
+            PACKER_DEBUG:
+              type: boolean
+              default: "false"
+            PACKER_URL:
+              type: string
+              default: "https://releases.hashicorp.com/packer/0.8.6/packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP:
+              type: string
+              default: "packer_0.8.6_linux_amd64.zip"
+            PACKER_ZIP_MD5:
+              type: string
+              default: "4cda1c44cf666fada495dd8e01522e1c"
+            PACKER_ARGS:
+              type: string
+              default: ""
+            UPLOAD_URL:
+              type: string
+              default: "http://jenkins:eyoocaiG3ADireK3Eef8gae1roh5oox0@10.10.100.85:8088/"
+            SKIP_UPLOAD:
+              type: boolean
+              default: "false"
+            CLEANUP_OLD:
+              type: boolean
+              default: "true"
+            CLEANUP_KEEP:
+              type: string
+              default: "3"
+            GLANCE_UPLOAD:
+              type: boolean
+              default: "true"
+            GLANCE_IMG_TYPES:
+              type: string
+              default: "qcow2"
+            GLANCE_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            GLANCE_CREDENTIALS_ID:
+              type: string
+              default: "openstack-qa-credentials"
+            GLANCE_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            GLANCE_ARGS:
+              type: string
+              default: ""
+            GLANCE_PUBLIC:
+              type: boolean
+              default: "true"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
diff --git a/jenkins/client/job/opencontrail/build/dpdk-extra.yml b/jenkins/client/job/opencontrail/build/dpdk-extra.yml
new file mode 100644
index 0000000..3f83a25
--- /dev/null
+++ b/jenkins/client/job/opencontrail/build/dpdk-extra.yml
@@ -0,0 +1,77 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-opencontrail-dpdk-extra:
+          name: build-opencontrail-dpdk-extra-{{branch_name}}-{{os}}-{{dist}}
+          jobs:
+            - os: ubuntu
+              dist: trusty
+              branch_name: kilo
+              branch_real_name: kilo
+            - os: ubuntu
+              dist: trusty
+              branch_name: liberty
+              branch_real_name: liberty-multiqueue
+            - os: ubuntu
+              dist: trusty
+              branch_name: mitaka
+              branch_real_name: mitaka
+            - os: ubuntu
+              dist: xenial
+              branch_name: mitaka
+              branch_real_name: mitaka
+          template:
+            discard:
+             build:
+               keep_num: 5
+             artifact:
+               keep_num: 5
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: build-extra-dpdk-pipeline.groovy
+            quiet_period: 120
+            trigger:
+              gerrit:
+                project:
+                  contrail/contrail-dpdk-extra-packages:
+                    branches:
+                      - "{{branch_real_name}}"
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/contrail/contrail-dpdk-extra-packages.git"
+              SOURCE_BRANCH:
+                type: string
+                default: "{{branch_real_name}}"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "{{os}}-{{dist}}-{{branch_name}}"
+              OS:
+                type: string
+                default: "{{os}}"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
diff --git a/jenkins/client/job/opencontrail/build/generic.yml b/jenkins/client/job/opencontrail/build/generic.yml
new file mode 100644
index 0000000..5bf7e5d
--- /dev/null
+++ b/jenkins/client/job/opencontrail/build/generic.yml
@@ -0,0 +1,162 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        build-opencontrail:
+          name: build-opencontrail-{{buildname}}-{{os}}-{{dist}}
+          jobs:
+            - buildname: oc303
+              os: ubuntu
+              dist: trusty
+              branch: R3.0.3.x
+              ppa: mirantis/opencontrail-3.0.3
+              upload_source_package: false
+            - buildname: oc31
+              os: ubuntu
+              dist: trusty
+              branch: R3.1
+              ppa: mirantis/opencontrail-3.1
+              upload_source_package: true
+            - buildname: oc31
+              os: ubuntu
+              dist: xenial
+              branch: R3.1
+              ppa: mirantis/opencontrail-3.1
+              upload_source_package: true
+            - buildname: oc311
+              os: ubuntu
+              dist: trusty
+              branch: R3.1.1.x
+              ppa: irantis/mopencontrail-3.1.1
+              upload_source_package: true
+            - buildname: oc311
+              os: ubuntu
+              dist: xenial
+              branch: R3.1.1.x
+              ppa: mirantis/opencontrail-3.1.1
+              upload_source_package: true
+            - buildname: oc32
+              os: ubuntu
+              dist: trusty
+              branch: R3.2
+              ppa: mirantis/opencontrail-3.2
+              upload_source_package: true
+            - buildname: oc32
+              os: ubuntu
+              dist: xenial
+              branch: R3.2
+              ppa: mirantis/opencontrail-3.2
+              upload_source_package: true
+          template:
+            discard:
+             build:
+               keep_num: 5
+             artifact:
+               keep_num: 5
+            type: workflow-scm
+            concurrent: false
+            quiet_period: 120
+            scm:
+              type: git
+              url: "${_param:jenkins_contrail_pipeline}"
+              credentials: "gerrit"
+              github:
+                url: https://github.com/Mirantis/ccp-contrail-pipeline
+            trigger:
+              gerrit:
+                project:
+                  contrail/contrail-pipeline:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-build:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-controller:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-vrouter:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-third-party:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-generateDS:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-sandesh:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-packages:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-nova-vif-driver:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-neutron-plugin:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-nova-extensions:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-heat:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-web-storage:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-web-server-manager:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-web-controller:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-web-core:
+                    branches:
+                      - "{{branch}}"
+                  contrail/contrail-webui-third-party:
+                    branches:
+                      - "{{branch}}"
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              APTLY_URL:
+                type: string
+                default: "${_param:jenkins_aptly_api_url}"
+              APTLY_REPO:
+                type: string
+                default: "{{os}}-{{dist}}-{{buildname}}"
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/contrail"
+              SOURCE_BRANCH:
+                type: string
+                default: "{{branch}}"
+              SOURCE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              KEEP_REPOS:
+                type: boolean
+                default: 'false'
+                description: "Don't cleanup on failure"
+              OS:
+                type: string
+                default: "{{os}}"
+              DIST:
+                type: string
+                default: "{{dist}}"
+              ARCH:
+                type: string
+                default: "amd64"
+              PPA:
+                type: string
+                default: "{{ppa}}"
+              UPLOAD_SOURCE_PACKAGE:
+                type: boolean
+                default: '{{upload_source_package}}'
diff --git a/jenkins/client/job/opencontrail/build/init.yml b/jenkins/client/job/opencontrail/build/init.yml
new file mode 100644
index 0000000..9ca87f5
--- /dev/null
+++ b/jenkins/client/job/opencontrail/build/init.yml
@@ -0,0 +1,3 @@
+classes:
+  - system_extra.jenkins.client.job.opencontrail.build.generic
+  - system_extra.jenkins.client.job.opencontrail.build.dpdk-extra
diff --git a/jenkins/client/job/opencontrail/git-mirrors/2way.yml b/jenkins/client/job/opencontrail/git-mirrors/2way.yml
new file mode 100644
index 0000000..2d9a4b3
--- /dev/null
+++ b/jenkins/client/job/opencontrail/git-mirrors/2way.yml
@@ -0,0 +1,33 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job:
+        git-mirror-2way-contrail-kubernetes:
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: git-mirror-2way-pipeline.groovy
+            github:
+              url: "https://github.com/Mirantis/contrail-kubernetes"
+          trigger:
+            github:
+            pollscm:
+              spec: ${_param:jenkins_pollscm_spec}
+          param:
+            SOURCE_URL:
+              type: string
+              default: "${_param:jenkins_gerrit_url}/contrail/contrail-kubernetes.git"
+            TARGET_URL:
+              type: string
+              default: "https://github.com/Mirantis/contrail-kubernetes.git"
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
+            BRANCHES:
+              type: string
+              default: ${_param:contrail_kubernetes_branches}
diff --git a/jenkins/client/job/opencontrail/git-mirrors/downstream.yml b/jenkins/client/job/opencontrail/git-mirrors/downstream.yml
new file mode 100644
index 0000000..f10e339
--- /dev/null
+++ b/jenkins/client/job/opencontrail/git-mirrors/downstream.yml
@@ -0,0 +1,93 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        git-mirror:
+          name: git-mirror-{{name}}
+          jobs:
+            - name: contrail-build
+            - name: contrail-controller
+            - name: contrail-vrouter
+            - name: contrail-third-party
+            - name: contrail-generateDS
+            - name: contrail-sandesh
+            - name: contrail-packages
+            - name: contrail-nova-vif-driver
+            - name: contrail-neutron-plugin
+            - name: contrail-nova-extensions
+            - name: contrail-ceilometer-plugin
+            - name: contrail-heat
+            - name: contrail-web-storage
+            - name: contrail-web-server-manager
+            - name: contrail-web-controller
+            - name: contrail-web-core
+            - name: contrail-webui-third-party
+            - name: contrail-dpdk-extra-packages
+            - name: contrail-kubernetes
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: git-mirror-pipeline.groovy
+              github:
+                url: "https://github.com/Juniper/{{name}}"
+            trigger:
+              github:
+              pollscm:
+                spec: ${_param:jenkins_pollscm_spec}
+            param:
+              SOURCE_URL:
+                type: string
+                default: "https://github.com/Juniper/{{name}}.git"
+              TARGET_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/contrail/{{name}}.git"
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
+              BRANCHES:
+                type: string
+                default: ${_param:contrail_branches}
+      job:
+        git-mirror-ifmap-python-client:
+          discard:
+            build:
+              keep_num: 10
+            artifact:
+              keep_num: 10
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: git-mirror-pipeline.groovy
+            github:
+              url: "https://github.com/tcpcloud/ifmap-python-client"
+          trigger:
+            github:
+            pollscm:
+              spec: ${_param:jenkins_pollscm_spec}
+          param:
+            SOURCE_URL:
+              type: string
+              default: "https://github.com/tcpcloud/ifmap-python-client.git"
+            TARGET_URL:
+              type: string
+              default: "${_param:jenkins_gerrit_url}/contrail/ifmap-python-client.git"
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
+            BRANCHES:
+              type: string
+              default: "master"
diff --git a/jenkins/client/job/opencontrail/git-mirrors/init.yml b/jenkins/client/job/opencontrail/git-mirrors/init.yml
new file mode 100644
index 0000000..b73dfe5
--- /dev/null
+++ b/jenkins/client/job/opencontrail/git-mirrors/init.yml
@@ -0,0 +1,4 @@
+classes:
+  - system_extra.jenkins.client.job.opencontrail.git-mirrors.downstream
+  - system_extra.jenkins.client.job.opencontrail.git-mirrors.upstream
+  - system_extra.jenkins.client.job.opencontrail.git-mirrors.2way
diff --git a/jenkins/client/job/opencontrail/git-mirrors/upstream.yml b/jenkins/client/job/opencontrail/git-mirrors/upstream.yml
new file mode 100644
index 0000000..f665658
--- /dev/null
+++ b/jenkins/client/job/opencontrail/git-mirrors/upstream.yml
@@ -0,0 +1,188 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        git-mirror-upstream:
+          name: git-mirror-upstream-{{name}}
+          jobs:
+            - name: contrail-build
+              branches: ${_param:contrail_branches}
+            - name: contrail-controller
+              branches: ${_param:contrail_branches}
+            - name: contrail-vrouter
+              branches: ${_param:contrail_branches}
+            - name: contrail-third-party
+              branches: ${_param:contrail_branches}
+            - name: contrail-generateDS
+              branches: ${_param:contrail_branches}
+            - name: contrail-sandesh
+              branches: ${_param:contrail_branches}
+            - name: contrail-packages
+              branches: ${_param:contrail_branches}
+            - name: contrail-nova-vif-driver
+              branches: ${_param:contrail_branches}
+            - name: contrail-neutron-plugin
+              branches: ${_param:contrail_branches}
+            - name: contrail-nova-extensions
+              branches: ${_param:contrail_branches}
+            - name: contrail-ceilometer-plugin
+              branches: ${_param:contrail_ceilometer_plugin_branches}
+            - name: contrail-heat
+              branches: ${_param:contrail_branches}
+            - name: contrail-web-storage
+              branches: ${_param:contrail_branches}
+            - name: contrail-web-server-manager
+              branches: ${_param:contrail_branches}
+            - name: contrail-web-controller
+              branches: ${_param:contrail_branches}
+            - name: contrail-web-core
+              branches: ${_param:contrail_branches}
+            - name: contrail-webui-third-party
+              branches: ${_param:contrail_branches}
+            - name: contrail-dpdk-extra-packages
+              branches: ${_param:contrail_dpdk_extra_branches}
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: git-mirror-pipeline.groovy
+              github:
+                url: "https://github.com/Mirantis/{{name}}"
+            trigger:
+              github:
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/contrail/{{name}}.git"
+              TARGET_URL:
+                type: string
+                default: "git@github.com:Mirantis/{{name}}.git"
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
+              BRANCHES:
+                type: string
+                default: "{{branches}}"
+      job:
+        git-mirror-upstream-ifmap-python-client:
+          discard:
+            build:
+              keep_num: 10
+            artifact:
+              keep_num: 10
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: git-mirror-pipeline.groovy
+            github:
+              url: "https://github.com/tcpcloud/ifmap-python-client"
+          param:
+            SOURCE_URL:
+              type: string
+              default: "${_param:jenkins_gerrit_url}/contrail/ifmap-python-client.git"
+            TARGET_URL:
+              type: string
+              default: "git@github.com:Mirantis/ifmap-python-client.git"
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
+            BRANCHES:
+              type: string
+              default: "master"
+        # XXX: this one ccp- prefixed is kind-of obsolete and should be
+        # removed
+        git-mirror-upstream-ccp-contrail-pipeline:
+          discard:
+            build:
+              keep_num: 10
+            artifact:
+              keep_num: 10
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: git-mirror-pipeline.groovy
+            github:
+              url: https://github.com/Mirantis/ccp-contrail-pipeline
+          trigger:
+            gerrit:
+              project:
+                contrail/contrail-pipeline:
+                  branches:
+                    - master
+              message:
+                build_successful: "Build successful"
+                build_unstable: "Build unstable"
+                build_failure: "Build failed"
+              event:
+                ref:
+                  - updated
+          param:
+            SOURCE_URL:
+              type: string
+              default: "${_param:jenkins_contrail_pipeline}"
+            TARGET_URL:
+              type: string
+              default: "git@github.com:Mirantis/ccp-contrail-pipeline.git"
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
+            BRANCHES:
+              type: string
+              default: master
+        git-mirror-upstream-contrail-pipeline:
+          discard:
+            build:
+              keep_num: 10
+            artifact:
+              keep_num: 10
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: git-mirror-pipeline.groovy
+            github:
+              url: https://github.com/Mirantis/contrail-pipeline
+          trigger:
+            gerrit:
+              project:
+                contrail/contrail-pipeline:
+                  branches:
+                    - master
+              message:
+                build_successful: "Build successful"
+                build_unstable: "Build unstable"
+                build_failure: "Build failed"
+              event:
+                ref:
+                  - updated
+          param:
+            SOURCE_URL:
+              type: string
+              default: "${_param:jenkins_contrail_pipeline}"
+            TARGET_URL:
+              type: string
+              default: "git@github.com:Mirantis/contrail-pipeline.git"
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
+            BRANCHES:
+              type: string
+              default: master
diff --git a/jenkins/client/job/opencontrail/init.yml b/jenkins/client/job/opencontrail/init.yml
new file mode 100644
index 0000000..0a6613d
--- /dev/null
+++ b/jenkins/client/job/opencontrail/init.yml
@@ -0,0 +1,9 @@
+classes:
+  - system_extra.jenkins.client.job.opencontrail.build
+  - system_extra.jenkins.client.job.opencontrail.git-mirrors
+parameters:
+  _param:
+    contrail_branches: "R3.0.2.x,R3.0.3.x,R3.1,R3.1.1.x,R3.2,master"
+    contrail_kubernetes_branches: "master,release-1.2"
+    contrail_dpdk_extra_branches: "mitaka,kilo,liberty-multiqueue"
+    contrail_ceilometer_plugin_branches: "master"
diff --git a/jenkins/client/job/salt-formulas/git-mirrors/2way.yml b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
new file mode 100644
index 0000000..9b7bb78
--- /dev/null
+++ b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
@@ -0,0 +1,132 @@
+parameters:
+  jenkins:
+    client:
+      job_template:
+        git-mirror-2way-salt-formula:
+          name: git-mirror-2way-salt-formula-{{name}}
+          jobs:
+            - name: aodh
+            - name: apache
+            - name: aptly
+            - name: artifactory
+            - name: backupninja
+            - name: avinetworks
+            - name: billometer
+            - name: bind
+            - name: bird
+            - name: cadf
+            - name: calico
+            - name: cassandra
+            - name: ccp
+            - name: ceilometer
+            - name: ceph
+            - name: chrony
+            - name: cinder
+            - name: collectd
+            - name: dekapod
+            - name: docker
+            - name: dovecot
+            - name: elasticsearch
+            - name: etcd
+            - name: foreman
+            - name: freeipa
+            - name: galera
+            - name: gerrit
+            - name: git
+            - name: gitlab
+            - name: glance
+            - name: glusterfs
+            - name: grafana
+            - name: graphite
+            - name: haproxy
+            - name: heat
+            - name: heka
+            - name: horizon
+            - name: influxdb
+            - name: iptables
+            - name: isc-dhcp
+            - name: java
+            - name: jenkins
+            - name: kedb
+            - name: keepalived
+            - name: keystone
+            - name: kibana
+            - name: kubernetes
+            - name: letsencrypt
+            - name: libvirt
+            - name: linux
+            - name: logrotate
+            - name: maas
+            - name: magnum
+            - name: memcached
+            - name: midonet
+            - name: monasca
+            - name: mongodb
+            - name: murano
+            - name: mysql
+            - name: nagios
+            - name: network
+            - name: neutron
+            - name: nfs
+            - name: nginx
+            - name: nodejs
+            - name: nova
+            - name: ntp
+            - name: opencontrail
+            - name: openssh
+            - name: openvpn
+            - name: openvstorage
+            - name: owncloud
+            - name: postfix
+            - name: postgresql
+            - name: pritunl
+            - name: python
+            - name: rabbitmq
+            - name: reclass
+            - name: redis
+            - name: roundcube
+            - name: rsync
+            - name: rsyslog
+            - name: sahara
+            - name: salt
+            - name: sensu
+            - name: sentry
+            - name: sphinx
+            - name: statsd
+            - name: supervisor
+            - name: swift
+            - name: taiga
+            - name: varnish
+            - name: zookeeper
+          template:
+            discard:
+              build:
+                keep_num: 10
+              artifact:
+                keep_num: 10
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: git-mirror-2way-pipeline.groovy
+              github:
+                url: "https://github.com/salt-formulas/salt-formula-{{name}}"
+            trigger:
+              github:
+              pollscm:
+                spec: ${_param:jenkins_pollscm_spec}
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/salt-formulas/{{name}}.git"
+              TARGET_URL:
+                type: string
+                default: "git@github.com:salt-formulas/salt-formula-{{name}}.git"
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
+              BRANCHES:
+                type: string
+                default: ${_param:salt_formulas_branches}
diff --git a/jenkins/client/job/salt-formulas/git-mirrors/init.yml b/jenkins/client/job/salt-formulas/git-mirrors/init.yml
new file mode 100644
index 0000000..a0f3f34
--- /dev/null
+++ b/jenkins/client/job/salt-formulas/git-mirrors/init.yml
@@ -0,0 +1,5 @@
+classes:
+  - system_extra.jenkins.client.job.salt-formulas.git-mirrors.2way
+parameters:
+  _param:
+    salt_formulas_branches: master
diff --git a/jenkins/client/job/salt-formulas/init.yml b/jenkins/client/job/salt-formulas/init.yml
new file mode 100644
index 0000000..2a506b9
--- /dev/null
+++ b/jenkins/client/job/salt-formulas/init.yml
@@ -0,0 +1,4 @@
+classes:
+  - system_extra.jenkins.client.job.salt-formulas.git-mirrors
+  - system_extra.jenkins.client.job.salt-formulas.tests
+  - system_extra.jenkins.client.job.salt-formulas.release
diff --git a/jenkins/client/job/salt-formulas/release.yml b/jenkins/client/job/salt-formulas/release.yml
new file mode 100644
index 0000000..c686e6e
--- /dev/null
+++ b/jenkins/client/job/salt-formulas/release.yml
@@ -0,0 +1,26 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        release-salt-formulas:
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: release-salt-formulas-pipeline.groovy
+            github:
+              url: "https://github.com/salt-formulas/salt-formulas"
+          param:
+            TAG:
+              type: string
+            SOURCE_URL:
+              type: string
+              default: "https://github.com/salt-formulas/salt-formulas.git"
+            GERRIT_BASE:
+              type: string
+              default: "${_param:jenkins_gerrit_url}/salt-formulas"
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
diff --git a/jenkins/client/job/salt-formulas/tests.yml b/jenkins/client/job/salt-formulas/tests.yml
new file mode 100644
index 0000000..5d5206b
--- /dev/null
+++ b/jenkins/client/job/salt-formulas/tests.yml
@@ -0,0 +1,138 @@
+parameters:
+  jenkins:
+    client:
+      job_template:
+        test-salt-formula:
+          name: test-salt-formula-{{name}}-latest
+          jobs:
+            - name: aodh
+            - name: apache
+            - name: aptly
+            - name: artifactory
+            - name: backupninja
+            - name: avinetworks
+            - name: billometer
+            - name: bind
+            - name: bird
+            - name: cadf
+            - name: calico
+            - name: cassandra
+            - name: ccp
+            - name: ceilometer
+            - name: ceph
+            - name: chrony
+            - name: cinder
+            - name: collectd
+            - name: dekapod
+            - name: docker
+            - name: dovecot
+            - name: elasticsearch
+            - name: etcd
+            - name: foreman
+            - name: freeipa
+            - name: galera
+            - name: gerrit
+            - name: git
+            - name: gitlab
+            - name: glance
+            - name: glusterfs
+            - name: grafana
+            - name: graphite
+            - name: haproxy
+            - name: heat
+            - name: heka
+            - name: horizon
+            - name: influxdb
+            - name: iptables
+            - name: isc-dhcp
+            - name: java
+            - name: jenkins
+            - name: kedb
+            - name: keepalived
+            - name: keystone
+            - name: kibana
+            - name: kubernetes
+            - name: letsencrypt
+            - name: libvirt
+            - name: linux
+            - name: logrotate
+            - name: maas
+            - name: magnum
+            - name: memcached
+            - name: midonet
+            - name: monasca
+            - name: mongodb
+            - name: murano
+            - name: mysql
+            - name: nagios
+            - name: network
+            - name: neutron
+            - name: nfs
+            - name: nginx
+            - name: nodejs
+            - name: nova
+            - name: ntp
+            - name: opencontrail
+            - name: openssh
+            - name: openvpn
+            - name: openvstorage
+            - name: owncloud
+            - name: postfix
+            - name: postgresql
+            - name: pritunl
+            - name: python
+            - name: rabbitmq
+            - name: reclass
+            - name: redis
+            - name: roundcube
+            - name: rsync
+            - name: rsyslog
+            - name: sahara
+            - name: salt
+            - name: sensu
+            - name: sentry
+            - name: sphinx
+            - name: statsd
+            - name: supervisor
+            - name: swift
+            - name: taiga
+            - name: varnish
+            - name: zookeeper
+          template:
+            discard:
+              build:
+                keep_num: 25
+              artifact:
+                keep_num: 25
+            type: workflow-scm
+            concurrent: true
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: test-salt-formulas-pipeline.groovy
+            trigger:
+              gerrit:
+                project:
+                  salt-formulas/{{name}}:
+                    branches:
+                      - master
+                event:
+                  patchset:
+                    - created:
+                        excludeDrafts: false
+                        excludeTrivialRebase: false
+                        excludeNoCodeChange: false
+                  comment:
+                    - addedContains:
+                        commentAddedCommentContains: '(recheck|reverify)'
+            param:
+              SALT_VERSION:
+                type: string
+                default: "latest"
+              SALT_OPTS:
+                type: string
+                default: "--force-color"
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
diff --git a/jenkins/client/job/salt-models/git-mirrors.yml b/jenkins/client/job/salt-models/git-mirrors.yml
new file mode 100644
index 0000000..2cb3b24
--- /dev/null
+++ b/jenkins/client/job/salt-models/git-mirrors.yml
@@ -0,0 +1,53 @@
+classes:
+  - system_extra.jenkins.client.job.common
+parameters:
+  jenkins:
+    client:
+      job_template:
+        git_mirror_2way_salt_model:
+          name: git-mirror-2way-salt-model-{{name}}
+          param:
+            name:
+              - reclass-system
+              - slovaktelekom
+              - stacklight
+              - statens
+          template:
+            type: workflow-scm
+            concurrent: false
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: git-mirror-2way-pipeline.groovy
+              github:
+                url: "https://github.com/Mirantis/{{name}}-salt-model"
+            trigger:
+              github:
+              pollscm:
+                spec: ${_param:jenkins_pollscm_spec}
+              gerrit:
+                project:
+                  salt-models/{{name}}:
+                    branches:
+                      - master
+                message:
+                  build_successful: "Build successful"
+                  build_unstable: "Build unstable"
+                  build_failure: "Build failed"
+                event:
+                  ref:
+                    - updated
+            param:
+              SOURCE_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/salt-models/{{name}}.git"
+              TARGET_URL:
+                type: string
+                default: "git@github.com:Mirantis/{{name}}-salt-model.git"
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
+              BRANCHES:
+                type: string
+                default: "master"
diff --git a/jenkins/client/job/salt-models/init.yml b/jenkins/client/job/salt-models/init.yml
new file mode 100644
index 0000000..82f8345
--- /dev/null
+++ b/jenkins/client/job/salt-models/init.yml
@@ -0,0 +1,6 @@
+classes:
+  - system_extra.jenkins.client.job.salt-models.git-mirrors
+  - system_extra.jenkins.client.job.salt-models.tests
+parameters:
+  _param:
+    salt_formulas_branches: master
diff --git a/jenkins/client/job/salt-models/tests.yml b/jenkins/client/job/salt-models/tests.yml
new file mode 100644
index 0000000..e451daf
--- /dev/null
+++ b/jenkins/client/job/salt-models/tests.yml
@@ -0,0 +1,85 @@
+parameters:
+  _param:
+  jenkins:
+    client:
+      job_template:
+        test_salt_model:
+          name: test-salt-model-{{name}}
+          param:
+            name:
+              - mcp-baremetal-lab
+              - mcp-virtual-lab
+              - mk-ci
+              - qa
+              - stacklight
+              - training
+          template:
+            type: workflow-scm
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: test-salt-models-pipeline.groovy
+            concurrent: true
+            trigger:
+              gerrit:
+                project:
+                  salt-models/{{name}}:
+                    branches:
+                      - master
+                event:
+                  patchset:
+                    - created:
+                        excludeDrafts: false
+                        excludeTrivialRebase: false
+                        excludeNoCodeChange: false
+                  comment:
+                    - addedContains:
+                        commentAddedCommentContains: '(recheck|reverify)'
+            param:
+              SALT_OPTS:
+                type: string
+                default: "--force-color"
+              GIT_URL:
+                type: string
+                default: "${_param:jenkins_gerrit_url}/salt-models/{{name}}"
+              RECLASS_SYSTEM_GIT_URL:
+                type: string
+                description: "Run against alternate system reclass"
+              RECLASS_SYSTEM_GIT_REF:
+                type: string
+              CREDENTIALS_ID:
+                type: string
+                default: "gerrit"
+        test_system_reclass:
+          name: test-salt-model-{{name}}
+          jobs:
+            - name: reclass-system
+              clusters: "mcp-baremetal-lab,mcp-virtual-lab,qa,stacklight,training"
+          template:
+            type: workflow-scm
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: test-system-reclass-pipeline.groovy
+            concurrent: true
+            trigger:
+              gerrit:
+                project:
+                  salt-models/{{name}}:
+                    branches:
+                      - master
+                event:
+                  patchset:
+                    - created:
+                        excludeDrafts: false
+                        excludeTrivialRebase: false
+                        excludeNoCodeChange: false
+                  comment:
+                    - addedContains:
+                        commentAddedCommentContains: '(recheck|reverify)'
+            param:
+              TEST_MODELS:
+                type: string
+                default: "{{clusters}}"