Merge "fix compute storage client ceph key"
diff --git a/aptly/server/mirror/ubuntu/trusty/mos8.yml b/aptly/server/mirror/ubuntu/trusty/mos8.yml
index e6e6707..c85363f 100644
--- a/aptly/server/mirror/ubuntu/trusty/mos8.yml
+++ b/aptly/server/mirror/ubuntu/trusty/mos8.yml
@@ -13,6 +13,7 @@
             component: main
             distributions:
               - mos8/mos8.0
+        # FIXME, enable hotfix once contain packages, otherwise broke aptly publish
         #mirantis-openstack-8.0-hotfix-trusty:
         #  source: http://mirror.fuel-infra.org/mos-repos/ubuntu/8.0-mu-3/
         #  distribution: mos8.0-hotfix
@@ -37,6 +38,7 @@
             component: main
             distributions:
               - mos8/mos8.0-proposed
+        # FIXME, enable security once contain packages, otherwise broke aptly publish
         #mirantis-openstack-8.0-security-trusty:
         #  source: http://mirror.fuel-infra.org/mos-repos/ubuntu/8.0-mu-3/
         #  distribution: mos8.0-security
diff --git a/aptly/server/mirror/ubuntu/trusty/mos9.yml b/aptly/server/mirror/ubuntu/trusty/mos9.yml
index 20f87b2..29415ab 100644
--- a/aptly/server/mirror/ubuntu/trusty/mos9.yml
+++ b/aptly/server/mirror/ubuntu/trusty/mos9.yml
@@ -37,6 +37,7 @@
             component: main
             distributions:
               - mos9/mos9.0-proposed
+        # FIXME, enable security once contain packages, otherwise broke aptly publish
         #mirantis-openstack-9.0-security-trusty:
         #  source: http://mirror.fuel-infra.org/mos-repos/ubuntu/9.0/
         #  distribution: mos9.0-security
@@ -62,7 +63,7 @@
             distributions:
               - mos9/mos9.0-updates
         mirantis-openstack-9.0-extras-murano:
-          source: http://mirror.fuel-infra.org/extras/murano-plugin-repos/release/1.1.0/ubuntu/9.0/
+          source: http://mirror.fuel-infra.org/extras/murano-plugin-repos/release/1.2.0/ubuntu/9.0/
           distribution: mos9.0
           components: main restricted
           architectures: amd64
diff --git a/aptly/server/mirror/ubuntu/trusty/ubuntu.yml b/aptly/server/mirror/ubuntu/trusty/ubuntu.yml
index 22e83df..3cd7c7b 100644
--- a/aptly/server/mirror/ubuntu/trusty/ubuntu.yml
+++ b/aptly/server/mirror/ubuntu/trusty/ubuntu.yml
@@ -1,10 +1,12 @@
 parameters:
+  _param:
+    linux_system_country_code: cz
   aptly:
     server:
       mirror:
         # trusty
         trusty-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty
           components: main
           architectures: amd64
@@ -17,7 +19,7 @@
             distributions:
               - ubuntu/trusty
         trusty-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty
           components: multiverse
           architectures: amd64
@@ -30,7 +32,7 @@
             distributions:
               - ubuntu/trusty
         trusty-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty
           components: restricted
           architectures: amd64
@@ -43,7 +45,7 @@
             distributions:
               - ubuntu/trusty
         trusty-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty
           components: universe
           architectures: amd64
@@ -58,7 +60,7 @@
 
         # trusty-updates
         trusty-updates-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-updates
           components: main
           architectures: amd64
@@ -71,7 +73,7 @@
             distributions:
               - ubuntu/trusty-updates
         trusty-updates-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-updates
           components: multiverse
           architectures: amd64
@@ -84,7 +86,7 @@
             distributions:
               - ubuntu/trusty-updates
         trusty-updates-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-updates
           components: restricted
           architectures: amd64
@@ -97,7 +99,7 @@
             distributions:
               - ubuntu/trusty-updates
         trusty-updates-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-updates
           components: universe
           architectures: amd64
@@ -112,7 +114,7 @@
 
         #trusty-security:
         trusty-security-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-security
           components: main
           architectures: amd64
@@ -125,7 +127,7 @@
             distributions:
               - ubuntu/trusty-security
         trusty-security-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-security
           components: multiverse
           architectures: amd64
@@ -138,7 +140,7 @@
             distributions:
               - ubuntu/trusty-security
         trusty-security-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-security
           components: restricted
           architectures: amd64
@@ -151,7 +153,7 @@
             distributions:
               - ubuntu/trusty-security
         trusty-security-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-security
           components: universe
           architectures: amd64
@@ -166,7 +168,7 @@
 
         #trusty-proposed:
         trusty-proposed-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-proposed
           components: main
           architectures: amd64
@@ -179,7 +181,7 @@
             distributions:
               - ubuntu/trusty-proposed
         trusty-proposed-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-proposed
           components: multiverse
           architectures: amd64
@@ -192,7 +194,7 @@
             distributions:
               - ubuntu/trusty-proposed
         trusty-proposed-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-proposed
           components: restricted
           architectures: amd64
@@ -205,7 +207,7 @@
             distributions:
               - ubuntu/trusty-proposed
         trusty-proposed-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-proposed
           components: universe
           architectures: amd64
@@ -220,7 +222,7 @@
 
         #trusty-backports:
         trusty-backports-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-backports
           components: main
           architectures: amd64
@@ -233,7 +235,7 @@
             distributions:
               - ubuntu/trusty-backports
         trusty-backports-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-backports
           components: multiverse
           architectures: amd64
@@ -246,7 +248,7 @@
             distributions:
               - ubuntu/trusty-backports
         trusty-backports-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-backports
           components: restricted
           architectures: amd64
@@ -259,7 +261,7 @@
             distributions:
               - ubuntu/trusty-backports
         trusty-backports-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: trusty-backports
           components: universe
           architectures: amd64
diff --git a/aptly/server/mirror/ubuntu/xenial/ceph_mirantis.yml b/aptly/server/mirror/ubuntu/xenial/ceph_mirantis.yml
index 1bc4341..3401a4e 100644
--- a/aptly/server/mirror/ubuntu/xenial/ceph_mirantis.yml
+++ b/aptly/server/mirror/ubuntu/xenial/ceph_mirantis.yml
@@ -2,7 +2,7 @@
   aptly:
     server:
       mirror:
-        ceph-mirantis-xenial:
+        ubuntu-xenial-ceph-mirantis:
           source: http://eu.mirror.fuel-infra.org/decapod/ceph/apt
           distribution: jewel-xenial
           components: main
@@ -12,8 +12,8 @@
           publisher:
             component: ceph-mirantis
             distributions:
-              - xenial/nightly
-        decapod-ceph-mirantis-xenial:
+              - ubuntu-xenial/nightly
+        ubuntu-xenial-decapod-ceph-mirantis:
           source: http://eu.mirror.fuel-infra.org/decapod/ceph/apt
           distribution: jewel-xenial
           components: main
diff --git a/aptly/server/mirror/ubuntu/xenial/ubuntu.yml b/aptly/server/mirror/ubuntu/xenial/ubuntu.yml
index 10c54a5..4675063 100644
--- a/aptly/server/mirror/ubuntu/xenial/ubuntu.yml
+++ b/aptly/server/mirror/ubuntu/xenial/ubuntu.yml
@@ -1,10 +1,14 @@
 parameters:
+  _param:
+    linux_system_country_code_default: cz
+    linux_system_country_code: ${_param:linux_system_country_code_default}
   aptly:
     server:
       mirror:
         # xenial
         xenial-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial
           components: main
           architectures: amd64
@@ -17,7 +21,8 @@
             distributions:
               - ubuntu/xenial
         xenial-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial
           components: multiverse
           architectures: amd64
@@ -30,7 +35,8 @@
             distributions:
               - ubuntu/xenial
         xenial-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial
           components: restricted
           architectures: amd64
@@ -43,7 +49,8 @@
             distributions:
               - ubuntu/xenial
         xenial-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial
           components: universe
           architectures: amd64
@@ -58,7 +65,8 @@
 
         # xenial-updates
         xenial-updates-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-updates
           components: main
           architectures: amd64
@@ -71,7 +79,8 @@
             distributions:
               - ubuntu/xenial-updates
         xenial-updates-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-updates
           components: multiverse
           architectures: amd64
@@ -84,7 +93,8 @@
             distributions:
               - ubuntu/xenial-updates
         xenial-updates-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-updates
           components: restricted
           architectures: amd64
@@ -97,7 +107,8 @@
             distributions:
               - ubuntu/xenial-updates
         xenial-updates-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-updates
           components: universe
           architectures: amd64
@@ -112,7 +123,8 @@
 
         #xenial-security:
         xenial-security-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-security
           components: main
           architectures: amd64
@@ -125,7 +137,8 @@
             distributions:
               - ubuntu/xenial-security
         xenial-security-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-security
           components: multiverse
           architectures: amd64
@@ -138,7 +151,8 @@
             distributions:
               - ubuntu/xenial-security
         xenial-security-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-security
           components: restricted
           architectures: amd64
@@ -151,7 +165,8 @@
             distributions:
               - ubuntu/xenial-security
         xenial-security-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-security
           components: universe
           architectures: amd64
@@ -166,7 +181,8 @@
 
         #xenial-proposed:
         xenial-proposed-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-proposed
           components: main
           architectures: amd64
@@ -179,7 +195,8 @@
             distributions:
               - ubuntu/xenial-proposed
         xenial-proposed-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-proposed
           components: multiverse
           architectures: amd64
@@ -192,7 +209,7 @@
             distributions:
               - ubuntu/xenial-proposed
         xenial-proposed-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-proposed
           components: restricted
           architectures: amd64
@@ -205,7 +222,7 @@
             distributions:
               - ubuntu/xenial-proposed
         xenial-proposed-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-proposed
           components: universe
           architectures: amd64
@@ -220,7 +237,7 @@
 
         #xenial-backports:
         xenial-backports-main:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-backports
           components: main
           architectures: amd64
@@ -233,7 +250,7 @@
             distributions:
               - ubuntu/xenial-backports
         xenial-backports-multiverse:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-backports
           components: multiverse
           architectures: amd64
@@ -246,7 +263,8 @@
             distributions:
               - ubuntu/xenial-backports
         xenial-backports-restricted:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-backports
           components: restricted
           architectures: amd64
@@ -259,7 +277,8 @@
             distributions:
               - ubuntu/xenial-backports
         xenial-backports-universe:
-          source: http://cz.archive.ubuntu.com/ubuntu/
+          sources: true
+          source: http://${_param:linux_system_country_code}.archive.ubuntu.com/ubuntu/
           distribution: xenial-backports
           components: universe
           architectures: amd64
diff --git a/aptly/server/single.yml b/aptly/server/single.yml
index 095c396..8b71974 100644
--- a/aptly/server/single.yml
+++ b/aptly/server/single.yml
@@ -73,6 +73,7 @@
     server:
       enabled: true
       secure: ${_param:aptly_server_secure}
-      gpg_keypair_id: ${_param:aptly_gpg_keypair_id}
-      gpg_public_key: ${_param:aptly_gpg_public_key}
-      gpg_private_key: ${_param:aptly_gpg_private_key}
+      gpg:
+        keypair_id: ${_param:aptly_gpg_keypair_id}
+        public_key: ${_param:aptly_gpg_public_key}
+        private_key: ${_param:aptly_gpg_private_key}
diff --git a/devops_portal/service/gerrit.yml b/devops_portal/service/gerrit.yml
new file mode 100644
index 0000000..6dcad9c
--- /dev/null
+++ b/devops_portal/service/gerrit.yml
@@ -0,0 +1,9 @@
+parameters:
+  devops_portal:
+    config:
+      service:
+        gerrit:
+          endpoint:
+            address: ${_param:haproxy_gerrit_bind_host}
+            port: ${_param:haproxy_gerrit_bind_port}
+            https: ${_param:haproxy_gerrit_ssl:enabled}
diff --git a/devops_portal/service/jenkins.yml b/devops_portal/service/jenkins.yml
new file mode 100644
index 0000000..349a707
--- /dev/null
+++ b/devops_portal/service/jenkins.yml
@@ -0,0 +1,9 @@
+parameters:
+  devops_portal:
+    config:
+      service:
+        jenkins:
+          endpoint:
+            address: ${_param:haproxy_jenkins_bind_host}
+            port: ${_param:haproxy_jenkins_bind_port}
+            https: ${_param:haproxy_jenkins_ssl:enabled}
diff --git a/devops_portal/service/rundeck.yml b/devops_portal/service/rundeck.yml
new file mode 100644
index 0000000..1a15473
--- /dev/null
+++ b/devops_portal/service/rundeck.yml
@@ -0,0 +1,13 @@
+parameters:
+  devops_portal:
+    config:
+      service:
+        rundeck:
+          configure_proxy: true
+          credentials:
+            username: admin
+            password: ${_param:rundeck_admin_password}
+          endpoint:
+            address: ${_param:haproxy_rundeck_bind_host}
+            port: ${_param:haproxy_rundeck_bind_port}
+            https: ${_param:haproxy_rundeck_ssl:enabled}
diff --git a/docker/swarm/service/devops_portal.yml b/docker/swarm/service/devops_portal.yml
new file mode 100644
index 0000000..6a82aa5
--- /dev/null
+++ b/docker/swarm/service/devops_portal.yml
@@ -0,0 +1,23 @@
+parameters:
+  _param:
+    docker_devops_portal_replicas: 1
+    docker_image_devops_portal: docker-sandbox.sandbox.mirantis.net/ikharin/oss/devops-portal:latest
+  docker:
+    client:
+      service:
+        devops-portal:
+          replicas: ${_param:docker_devops_portal_replicas}
+          image: ${_param:docker_image_devops_portal}
+          restart:
+            condition: any
+          ports:
+            - 18800:8000
+          volume:
+            nginx:
+              type: bind
+              source: /srv/volumes/devops_portal/nginx/
+              destination: /etc/nginx/config
+            config:
+              type: bind
+              source: /srv/volumes/devops_portal/config/
+              destination: /opt/devops-portal/config
diff --git a/docker/swarm/service/rundeck.yml b/docker/swarm/service/rundeck.yml
new file mode 100644
index 0000000..baad94a
--- /dev/null
+++ b/docker/swarm/service/rundeck.yml
@@ -0,0 +1,47 @@
+parameters:
+  _param:
+    docker_rundeck_replicas: 1
+    docker_image_rundeck: docker-sandbox.sandbox.mirantis.net/ikharin/oss/rundeck:latest
+    rundeck_admin_password: password
+  docker:
+    client:
+      service:
+        rundeck:
+          environment:
+            SERVER_URL: "http://${_param:haproxy_rundeck_bind_host}:${_param:haproxy_rundeck_bind_port}"
+            RUNDECK_ADMIN_PASSWORD: ${_param:rundeck_admin_password}
+          replicas: ${_param:docker_rundeck_replicas}
+          image: ${_param:docker_image_rundeck}
+          restart:
+            condition: any
+          ports:
+            - 14440:4440
+          volume:
+            etc:
+              type: bind
+              source: /srv/volumes/rundeck/etc
+              destination: /etc/rundeck
+            rundeck:
+              type: bind
+              source: /srv/volumes/rundeck/rundeck
+              destination: /var/rundeck
+            mysql:
+              type: bind
+              source: /srv/volumes/rundeck/mysql
+              destination: /var/lib/mysql
+            log:
+              type: bind
+              source: /srv/volumes/rundeck/log
+              destination: /var/log/rundeck
+            logs:
+              type: bind
+              source: /srv/volumes/rundeck/logs
+              destination: /var/lib/rundeck/logs
+            plugins:
+              type: bind
+              source: /srv/volumes/rundeck/plugins
+              destination: /opt/rundeck-plugins
+            storage:
+              type: bind
+              source: /srv/volumes/rundeck/storage
+              destination: /var/lib/rundeck/var/storage
diff --git a/glusterfs/client/volume/devops_portal.yml b/glusterfs/client/volume/devops_portal.yml
new file mode 100644
index 0000000..9a3c291
--- /dev/null
+++ b/glusterfs/client/volume/devops_portal.yml
@@ -0,0 +1,10 @@
+parameters:
+  _param:
+    devops_portal_glusterfs_service_host: ${_param:glusterfs_service_host}
+  glusterfs:
+    client:
+      volumes:
+        devops_portal:
+          path: /srv/volumes/devops_portal
+          server: ${_param:devops_portal_glusterfs_service_host}
+          opts: 'defaults'
diff --git a/glusterfs/client/volume/rundeck.yml b/glusterfs/client/volume/rundeck.yml
new file mode 100644
index 0000000..b226aeb
--- /dev/null
+++ b/glusterfs/client/volume/rundeck.yml
@@ -0,0 +1,10 @@
+parameters:
+  _param:
+    rundeck_glusterfs_service_host: ${_param:glusterfs_service_host}
+  glusterfs:
+    client:
+      volumes:
+        rundeck:
+          path: /srv/volumes/rundeck
+          server: ${_param:rundeck_glusterfs_service_host}
+          opts: 'defaults'
diff --git a/glusterfs/server/volume/devops_portal.yml b/glusterfs/server/volume/devops_portal.yml
new file mode 100644
index 0000000..0b71b62
--- /dev/null
+++ b/glusterfs/server/volume/devops_portal.yml
@@ -0,0 +1,17 @@
+parameters:
+  glusterfs:
+    server:
+      volumes:
+        devops_portal:
+          storage: /srv/glusterfs/devops_portal
+          replica: 3
+          bricks:
+            - ${_param:cluster_node01_address}:/srv/glusterfs/devops_portal
+            - ${_param:cluster_node02_address}:/srv/glusterfs/devops_portal
+            - ${_param:cluster_node03_address}:/srv/glusterfs/devops_portal
+          options:
+            cluster.readdir-optimize: On
+            nfs.disable: On
+            network.remote-dio: On
+            diagnostics.client-log-level: WARNING
+            diagnostics.brick-log-level: WARNING
diff --git a/glusterfs/server/volume/rundeck.yml b/glusterfs/server/volume/rundeck.yml
new file mode 100644
index 0000000..22e5563
--- /dev/null
+++ b/glusterfs/server/volume/rundeck.yml
@@ -0,0 +1,17 @@
+parameters:
+  glusterfs:
+    server:
+      volumes:
+        rundeck:
+          storage: /srv/glusterfs/rundeck
+          replica: 3
+          bricks:
+            - ${_param:cluster_node01_address}:/srv/glusterfs/rundeck
+            - ${_param:cluster_node02_address}:/srv/glusterfs/rundeck
+            - ${_param:cluster_node03_address}:/srv/glusterfs/rundeck
+          options:
+            cluster.readdir-optimize: On
+            nfs.disable: On
+            network.remote-dio: On
+            diagnostics.client-log-level: WARNING
+            diagnostics.brick-log-level: WARNING
diff --git a/haproxy/proxy/listen/oss/devops_portal.yml b/haproxy/proxy/listen/oss/devops_portal.yml
new file mode 100644
index 0000000..e5c25cf
--- /dev/null
+++ b/haproxy/proxy/listen/oss/devops_portal.yml
@@ -0,0 +1,37 @@
+parameters:
+  _param:
+    haproxy_devops_portal_bind_host: ${_param:haproxy_bind_address}
+    haproxy_devops_portal_bind_port: 8800
+    haproxy_devops_portal_ssl:
+      enabled: false
+  haproxy:
+    proxy:
+      listen:
+        devops_portal:
+          mode: http
+          options:
+            - forwardfor
+            - httpchk
+            - httpclose
+            - httplog
+          balance: source
+          http_request:
+            - action: "add-header X-Forwarded-Proto https"
+              condition: "if { ssl_fc }"
+          binds:
+            - address: ${_param:haproxy_devops_portal_bind_host}
+              port: ${_param:haproxy_devops_portal_bind_port}
+              ssl: ${_param:haproxy_devops_portal_ssl}
+          servers:
+            - name: ${_param:cluster_node01_name}
+              host: ${_param:cluster_node01_address}
+              port: 18800
+              params: check
+            - name: ${_param:cluster_node02_name}
+              host: ${_param:cluster_node02_address}
+              port: 18800
+              params: backup check
+            - name: ${_param:cluster_node03_name}
+              host: ${_param:cluster_node03_address}
+              port: 18800
+              params: backup check
diff --git a/haproxy/proxy/listen/oss/rundeck.yml b/haproxy/proxy/listen/oss/rundeck.yml
new file mode 100644
index 0000000..fbabb38
--- /dev/null
+++ b/haproxy/proxy/listen/oss/rundeck.yml
@@ -0,0 +1,37 @@
+parameters:
+  _param:
+    haproxy_rundeck_bind_host: ${_param:haproxy_bind_address}
+    haproxy_rundeck_bind_port: 4440
+    haproxy_rundeck_ssl:
+      enabled: false
+  haproxy:
+    proxy:
+      listen:
+        rundeck:
+          mode: http
+          options:
+            - forwardfor
+            - httpchk
+            - httpclose
+            - httplog
+          balance: source
+          http_request:
+            - action: "add-header X-Forwarded-Proto https"
+              condition: "if { ssl_fc }"
+          binds:
+            - address: ${_param:haproxy_rundeck_bind_host}
+              port: ${_param:haproxy_rundeck_bind_port}
+              ssl: ${_param:haproxy_rundeck_ssl}
+          servers:
+            - name: ${_param:cluster_node01_name}
+              host: ${_param:cluster_node01_address}
+              port: 14440
+              params: check
+            - name: ${_param:cluster_node02_name}
+              host: ${_param:cluster_node02_address}
+              port: 14440
+              params: backup check
+            - name: ${_param:cluster_node03_name}
+              host: ${_param:cluster_node03_address}
+              port: 14440
+              params: backup check
diff --git a/horizon/server/single.yml b/horizon/server/single.yml
index 5a83b2a..c20de5a 100644
--- a/horizon/server/single.yml
+++ b/horizon/server/single.yml
@@ -1,6 +1,5 @@
 classes:
 - service.horizon.server.single
-- system.horizon.server.plugin.theme
 parameters:
   _param:
     horizon_site_branding: OpenStack Dashboard
diff --git a/jenkins/client/approved_scripts.yml b/jenkins/client/approved_scripts.yml
new file mode 100644
index 0000000..3be23f3
--- /dev/null
+++ b/jenkins/client/approved_scripts.yml
@@ -0,0 +1,89 @@
+parameters:
+  jenkins:
+    client:
+      approved_scripts:
+        - field java.lang.String value
+        - field java.util.ArrayList size
+        - method com.cloudbees.jenkins.plugins.sshcredentials.SSHUserPrivateKey getPrivateKey
+        - method com.cloudbees.plugins.credentials.common.IdCredentials getId
+        - method com.cloudbees.plugins.credentials.common.PasswordCredentials getPassword
+        - method com.cloudbees.plugins.credentials.common.UsernameCredentials getUsername
+        - method groovy.json.JsonBuilder toPrettyString
+        - method groovy.json.JsonSlurperClassic parseText java.lang.String
+        - method groovy.lang.GString getBytes
+        - method groovy.lang.GroovyObject getProperty java.lang.String
+        - method hudson.PluginManager getPlugins
+        - method hudson.PluginWrapper getShortName
+        - method hudson.model.Item getName
+        - method hudson.model.ItemGroup getItem java.lang.String
+        - method hudson.model.ItemGroup getItems
+        - method hudson.model.Job getBuilds
+        - method hudson.model.Job getLastBuild
+        - method hudson.model.Run getEnvironment
+        - method hudson.model.Run getResult
+        - method hudson.model.Run getTimeInMillis
+        - method hudson.model.Run isBuilding
+        - method java.io.File getAbsolutePath
+        - method java.io.File getName
+        - method java.io.File getParent
+        - method java.io.Writer write java.lang.String
+        - method java.lang.AutoCloseable close
+        - method java.lang.Class isInstance java.lang.Object
+        - method java.lang.Iterable iterator
+        - method java.net.HttpURLConnection getResponseCode
+        - method java.net.HttpURLConnection setRequestMethod java.lang.String
+        - method java.net.URI getHost
+        - method java.net.URI getPort
+        - method java.net.URL openConnection
+        - method java.net.URLConnection getHeaderField java.lang.String
+        - method java.net.URLConnection getInputStream
+        - method java.net.URLConnection getOutputStream
+        - method java.net.URLConnection setDoOutput boolean
+        - method java.net.URLConnection setRequestProperty java.lang.String java.lang.String
+        - method java.util.Collection remove java.lang.Object
+        - method java.util.LinkedHashMap$LinkedHashIterator hasNext
+        - method java.util.List subList int int
+        - method java.util.Map remove java.lang.Object
+        - method java.util.Map size
+        - method java.util.regex.MatchResult group int
+        - method java.util.regex.Matcher matches
+        - method java.util.regex.Pattern matcher java.lang.CharSequence
+        - method jenkins.model.Jenkins getPluginManager
+        - method org.jenkinsci.plugins.workflow.job.WorkflowRun doStop
+        - method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper build
+        - new groovy.json.JsonBuilder java.lang.Object
+        - new groovy.json.JsonSlurperClassic
+        - new java.io.File java.lang.String
+        - new java.io.OutputStreamWriter java.io.OutputStream
+        - new java.lang.Exception java.lang.String
+        - new java.lang.InterruptedException
+        - new java.net.URI java.lang.String
+        - new java.util.Date
+        - staticField groovy.io.FileType FILES
+        - staticMethod com.cloudbees.plugins.credentials.CredentialsProvider lookupCredentials java.lang.Class hudson.model.ItemGroup
+        - staticMethod java.lang.Integer valueOf java.lang.String
+        - staticMethod java.lang.String format java.lang.String java.lang.Object[]
+        - staticMethod java.lang.System exit int
+        - staticMethod java.lang.System getProperty java.lang.String
+        - staticMethod java.lang.System getenv java.lang.String
+        - staticMethod java.util.regex.Pattern quote java.lang.String
+        - staticMethod jenkins.model.Jenkins getInstance
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods collect java.util.Map groovy.lang.Closure
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods eachFile java.io.File groovy.io.FileType groovy.lang.Closure
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods find java.util.Collection groovy.lang.Closure
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods findAll java.util.List groovy.lang.Closure
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods get java.util.Map java.lang.Object java.lang.Object
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.Iterable int
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.String int
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getBytes java.io.File
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getText java.io.InputStream
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods hasProperty java.lang.Object java.lang.String
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods iterator java.lang.Object
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods iterator java.lang.Object[]
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods plus java.util.List java.lang.Iterable
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods plus java.util.List java.lang.Object
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods plus java.util.List java.util.Collection
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println java.lang.Object java.lang.Object
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods putAt java.lang.Object java.lang.String java.lang.Object
+        - staticMethod org.codehaus.groovy.runtime.EncodingGroovyMethods encodeBase64 byte[]
+        - staticMethod org.codehaus.groovy.runtime.ScriptBytecodeAdapter bitwiseNegate java.lang.Object
diff --git a/jenkins/client/init.yml b/jenkins/client/init.yml
index aac50e9..41e639d 100644
--- a/jenkins/client/init.yml
+++ b/jenkins/client/init.yml
@@ -1,6 +1,7 @@
 classes:
   - service.jenkins.support
   - service.jenkins.client
+  - system.jenkins.client.approved_scripts
 parameters:
   _param:
     jenkins_client_user: none
@@ -44,88 +45,3 @@
           enabled: true
           url: ${_param:jenkins_gerrit_url}/mcp-ci/pipeline-library
           credential_id: gerrit
-      approved_scripts:
-        - field java.lang.String value
-        - field java.util.ArrayList size
-        - method com.cloudbees.jenkins.plugins.sshcredentials.SSHUserPrivateKey getPrivateKey
-        - method com.cloudbees.plugins.credentials.common.IdCredentials getId
-        - method com.cloudbees.plugins.credentials.common.PasswordCredentials getPassword
-        - method com.cloudbees.plugins.credentials.common.UsernameCredentials getUsername
-        - method groovy.json.JsonBuilder toPrettyString
-        - method groovy.json.JsonSlurperClassic parseText java.lang.String
-        - method groovy.lang.GString getBytes
-        - method groovy.lang.GroovyObject getProperty java.lang.String
-        - method hudson.model.Run getEnvironment
-        - method java.io.File getAbsolutePath
-        - method java.io.File getName
-        - method java.io.File getParent
-        - method java.io.Writer write java.lang.String
-        - method java.lang.AutoCloseable close
-        - method java.lang.Class isInstance java.lang.Object
-        - method java.lang.Iterable iterator
-        - method java.net.HttpURLConnection getResponseCode
-        - method java.net.HttpURLConnection setRequestMethod java.lang.String
-        - method java.net.URI getHost
-        - method java.net.URI getPort
-        - method java.net.URL openConnection
-        - method java.net.URLConnection getHeaderField java.lang.String
-        - method java.net.URLConnection getInputStream
-        - method java.net.URLConnection getOutputStream
-        - method java.net.URLConnection setDoOutput boolean
-        - method java.net.URLConnection setRequestProperty java.lang.String java.lang.String
-        - method java.util.LinkedHashMap$LinkedHashIterator hasNext
-        - method java.util.Map size
-        - method java.util.regex.MatchResult group int
-        - method java.util.regex.Matcher matches
-        - method java.util.regex.Pattern matcher java.lang.CharSequence
-        - method org.jenkinsci.plugins.workflow.job.WorkflowRun doStop
-        - method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper build
-        - new groovy.json.JsonBuilder java.lang.Object
-        - new groovy.json.JsonSlurperClassic
-        - new java.io.File java.lang.String
-        - new java.io.OutputStreamWriter java.io.OutputStream
-        - new java.lang.Exception java.lang.String
-        - new java.lang.InterruptedException
-        - new java.net.URI java.lang.String
-        - new java.util.Date
-        - staticField groovy.io.FileType FILES
-        - staticMethod com.cloudbees.plugins.credentials.CredentialsProvider lookupCredentials java.lang.Class hudson.model.ItemGroup
-        - staticMethod java.lang.System getenv java.lang.String
-        - staticMethod jenkins.model.Jenkins getInstance
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods collect java.util.Map groovy.lang.Closure
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods eachFile java.io.File groovy.io.FileType groovy.lang.Closure
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods get java.util.Map java.lang.Object java.lang.Object
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.Iterable int
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.String int
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getBytes java.io.File
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getText java.io.InputStream
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods hasProperty java.lang.Object java.lang.String
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods iterator java.lang.Object
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods iterator java.lang.Object[]
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods plus java.util.List java.lang.Iterable
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods plus java.util.List java.lang.Object
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods plus java.util.List java.util.Collection
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods putAt java.lang.Object java.lang.String java.lang.Object
-        - staticMethod org.codehaus.groovy.runtime.EncodingGroovyMethods encodeBase64 byte[]
-        - staticMethod org.codehaus.groovy.runtime.ScriptBytecodeAdapter bitwiseNegate java.lang.Object
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println java.lang.Object java.lang.Object
-        - method hudson.PluginWrapper getShortName
-        - method hudson.PluginManager getPlugins
-        - method jenkins.model.Jenkins getPluginManager
-        - method hudson.model.ItemGroup getItem java.lang.String
-        - method hudson.model.Job getLastBuild
-        - method hudson.model.Run getResult
-        - method hudson.model.Job getBuilds
-        - staticMethod java.lang.String format java.lang.String java.lang.Object[]
-        - staticMethod java.util.regex.Pattern quote java.lang.String
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods findAll java.util.List groovy.lang.Closure
-        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods find java.util.Collection groovy.lang.Closure
-        - method java.util.Collection remove java.lang.Object
-        - staticMethod java.lang.System exit int
-        - method hudson.model.ItemGroup getItems
-        - method hudson.model.Item getName
-        - method java.util.Map remove java.lang.Object
-        - staticMethod java.lang.System getProperty java.lang.String
-        - staticMethod java.lang.Integer valueOf java.lang.String
-        - method java.util.List subList int int
-
diff --git a/jenkins/client/job/debian/packages/horizon/modules.yml b/jenkins/client/job/debian/packages/horizon/modules.yml
index 30d7c64..2b6477b 100644
--- a/jenkins/client/job/debian/packages/horizon/modules.yml
+++ b/jenkins/client/job/debian/packages/horizon/modules.yml
@@ -17,6 +17,18 @@
               dist: xenial
               os_version: mitaka
               branch: master
+            # Trusty
+            - name: horizon-contrail-panels
+              os: ubuntu
+              dist: trusty
+              os_version: mitaka
+              branch: stable/mitaka
+            # Xenial
+            - name: horizon-contrail-panels
+              os: ubuntu
+              dist: xenial
+              os_version: mitaka
+              branch: stable/mitaka
           template:
             discard:
               build:
diff --git a/jenkins/client/job/deploy/lab/mk/init.yml b/jenkins/client/job/deploy/lab/mk/init.yml
index 7da9149..44b4b3d 100644
--- a/jenkins/client/job/deploy/lab/mk/init.yml
+++ b/jenkins/client/job/deploy/lab/mk/init.yml
@@ -102,3 +102,7 @@
                 type: string
                 default: "sandbox-docker-prod-local.docker.mirantis.net/mirantis/rally_tempest:0.1"
 
+              ASK_ON_ERROR:
+                type: boolean
+                default: 'false'
+
diff --git a/jenkins/client/job/deploy/openstack.yml b/jenkins/client/job/deploy/openstack.yml
index 48de021..644b16b 100644
--- a/jenkins/client/job/deploy/openstack.yml
+++ b/jenkins/client/job/deploy/openstack.yml
@@ -31,3 +31,6 @@
             SALT_MASTER_URL:
               type: string
               default: ""
+            ASK_ON_ERROR:
+                type: boolean
+                default: 'false'
diff --git a/salt/master/formula/git/oss.yml b/salt/master/formula/git/oss.yml
new file mode 100644
index 0000000..9354935
--- /dev/null
+++ b/salt/master/formula/git/oss.yml
@@ -0,0 +1,13 @@
+parameters:
+  _param:
+    salt_master_oss_repository: https://gerrit.mcp.mirantis.net/oss
+    salt_master_oss_revision: master
+  salt:
+    master:
+      environment:
+        dev:
+          formula:
+            devops-portal:
+              source: git
+              address: '${_param:salt_master_oss_repository}/salt-formula-devops-portal.git'
+              revision: ${_param:salt_master_oss_revision}