Merge "send notifications via email"
diff --git a/apache/server/proxy/openstack/ironic.yml b/apache/server/proxy/openstack/ironic.yml
new file mode 100644
index 0000000..d6bd7d3
--- /dev/null
+++ b/apache/server/proxy/openstack/ironic.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    apache_proxy_ssl:
+      enabled: false
+    apache_proxy_openstack_api_host: ${_param:cluster_public_host}
+    apache_proxy_openstack_api_address: 0.0.0.0
+    apache_proxy_openstack_ironic_host: ${_param:ironic_service_host}
+  apache:
+    server:
+      site:
+        apache_proxy_openstack_api_ironic:
+          enabled: true
+          type: proxy
+          name: openstack_api_ironic
+          check: false
+          proxy:
+            host: ${_param:apache_proxy_openstack_ironic_host}
+            port: 6385
+            protocol: http
+          host:
+            name: ${_param:apache_proxy_openstack_api_host}
+            port: 6385
+            address: ${_param:apache_proxy_openstack_api_address}
+          ssl: ${_param:apache_proxy_ssl}
diff --git a/aptly/server/mirror/ubuntu/trusty/mcp/apt_mk/cassandra.yml b/aptly/server/mirror/ubuntu/trusty/mcp/apt_mk/cassandra.yml
index 938fc7b..41f7e0c 100644
--- a/aptly/server/mirror/ubuntu/trusty/mcp/apt_mk/cassandra.yml
+++ b/aptly/server/mirror/ubuntu/trusty/mcp/apt_mk/cassandra.yml
@@ -20,4 +20,4 @@
           publisher:
             component: ${_param:mirror_mirantis_openstack_trusty_cassandra_components}
             distributions:
-              - ubuntu-trusty/cassandra/${_param:apt_mk_version}/
\ No newline at end of file
+              - ubuntu-trusty/cassandra/${_param:apt_mk_version}
\ No newline at end of file
diff --git a/cassandra/backup/client/single.yml b/cassandra/backup/client/single.yml
index 90fdc5d..892f92f 100644
--- a/cassandra/backup/client/single.yml
+++ b/cassandra/backup/client/single.yml
@@ -1,4 +1,5 @@
 classes:
+- service.cassandra.backup.client
 - system.openssh.client.root
 parameters:
   _param:
diff --git a/cassandra/backup/server/single.yml b/cassandra/backup/server/single.yml
index 1762504..ffb43cf 100644
--- a/cassandra/backup/server/single.yml
+++ b/cassandra/backup/server/single.yml
@@ -1,3 +1,5 @@
+classes:
+- service.cassandra.backup.server
 parameters:
   _param:
     cassandra_backup_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzLUiHKAjfFXiZ3fsgx35uXF6VivfC5WFafu4QMalxmj6W+s277oCfdWA8Du5f1wtQXM73VQ5nHkXhM2UIfUMarsyhXK+BxKVrcgEBNHdKlDytaecUPyuOxTDdGWhN/DPv5/vL8NYWweEYBbNbLgU0Td7Rvm52TUXKThIDjeF7XDxX4ShXWipBSwU4boOUBtR8KWfga8fsqeBN+eacuAQFR3MrrOfVvAuWW6Bsf047cmd+V6Qv0raoW73Nu4M/ZAdTsaR5k62a0cHsSRoi3hCmNRqw+CZaQi8prQU6t26eWPEtznjp5EkPF+LLh8LxUoCfWqWT+Lxe8QQwT1nx/LCN
diff --git a/docker/swarm/stack/kqueen.yml b/docker/swarm/stack/kqueen.yml
index 4708725..c6b608d 100644
--- a/docker/swarm/stack/kqueen.yml
+++ b/docker/swarm/stack/kqueen.yml
@@ -8,6 +8,8 @@
     kqueen_api_db_host: etcd
     kqueen_api_debug: True
     kqueen_api_prometheus_whitelist: '172.16.10.0/24' ##REcheck with network
+    kqueen_api_ldap_uri: 'ldap://ldap'
+    kqueen_api_auth_modules: 'local'
     docker_kqueen_ui_replicas: 1
     kqueen_ui_bind_port: ${_param:haproxy_kqueen_ui_bind_port}
     kqueen_ui_bind_host: kqueen-ui
@@ -15,6 +17,8 @@
     kqueen_ui_mail_port: 10025
     kqueen_ui_debug: True
     kqueen_ui_enable_public_registration: False
+    kqueen_ui_ldap_auth_notify: False
+    kqueen_ui_local_auth_notify: True
     kqueen_credentials:
       kqueen_api_secret_key: 'pasteyoursecret'
       kqueen_ui_secret_key: 'pasteyoursecret'
@@ -33,6 +37,8 @@
               environment:
                 KQUEEN_DEBUG: ${_param:kqueen_api_debug}
                 KQUEEN_CONFIG_FILE: config/prod.py
+                KQUEEN_LDAP_URI: ${_param:kqueen_api_ldap_uri}
+                KQUEEN_AUTH_MODULES: ${_param:kqueen_api_auth_modules}
                 KQUEEN_ETCD_HOST: ${_param:kqueen_api_db_host}
                 KQUEEN_PROMETHEUS_WHITELIST: ${_param:kqueen_api_prometheus_whitelist}
                 KQUEEN_SECRET_KEY: ${_param:kqueen_credentials:kqueen_api_secret_key}
@@ -63,6 +69,8 @@
                 KQUEENUI_MAIL_SERVER: ${_param:kqueen_ui_mail_host}
                 KQUEENUI_MAIL_PORT: ${_param:kqueen_ui_mail_port}
                 KQUEENUI_ENABLE_PUBLIC_REGISTRATION: ${_param:kqueen_ui_enable_public_registration}
+                KQUEENUI_LDAP_AUTH_NOTIFY: ${_param:kqueen_ui_ldap_auth_notify}
+                KQUEENUI_LOCAL_AUTH_NOTIFY: ${_param:kqueen_ui_local_auth_notify}
                 STATIC_DIR: /mnt/static/
               deploy:
                 replicas: ${_param:docker_kqueen_ui_replicas}
diff --git a/docker/swarm/stack/monitoring/alertmanager.yml b/docker/swarm/stack/monitoring/alertmanager.yml
index 662baf4..1f15be5 100644
--- a/docker/swarm/stack/monitoring/alertmanager.yml
+++ b/docker/swarm/stack/monitoring/alertmanager.yml
@@ -1,6 +1,9 @@
 classes:
 - system.prometheus.alertmanager.container
 parameters:
+  _param:
+    alertmanager_external_url: ${_param:cluster_public_host}
+    alertmanager_external_proto: http
   docker:
     client:
       stack:
@@ -34,4 +37,4 @@
                 ALERTMANAGER_BIND_PORT: ${prometheus:alertmanager:bind:port}
                 ALERTMANAGER_BIND_ADDRESS: ${prometheus:alertmanager:bind:address}
                 ALERTMANAGER_DISCOVERY_DOMAIN: 'monitoring_alertmanager'
-                ALERTMANAGER_EXTERNAL_URL: "http://${_param:stacklight_monitor_address}:15011"
+                ALERTMANAGER_EXTERNAL_URL: "${_param:alertmanager_external_proto}://${_param:alertmanager_external_url}:15011"
diff --git a/docker/swarm/stack/monitoring/prometheus/global.yml b/docker/swarm/stack/monitoring/prometheus/global.yml
index d86f456..6114f44 100644
--- a/docker/swarm/stack/monitoring/prometheus/global.yml
+++ b/docker/swarm/stack/monitoring/prometheus/global.yml
@@ -7,3 +7,5 @@
             server:
               deploy:
                 mode: global
+              environment:
+                PROMETHEUS_USE_STATIC_DATADIR: "true"
diff --git a/fluentd/label/default_metric/prometheus.yml b/fluentd/label/default_metric/prometheus.yml
index 9eb3b1b..a13b786 100644
--- a/fluentd/label/default_metric/prometheus.yml
+++ b/fluentd/label/default_metric/prometheus.yml
@@ -3,7 +3,7 @@
     agent:
       plugin:
         fluent-plugin-prometheus:
-          gem: ['fluent-plugin-prometheus']
+          deb: ['td-agent-additional-plugins']
       config:
         input:
           prometheus:
diff --git a/gerrit/client/project/vnf_onboarding.yml b/gerrit/client/project/vnf_onboarding.yml
index 9cefb95..1e7d238 100644
--- a/gerrit/client/project/vnf_onboarding.yml
+++ b/gerrit/client/project/vnf_onboarding.yml
@@ -42,3 +42,11 @@
           require_change_id: true
           require_agreement: false
           merge_content: true
+        vnf-onboarding/platform-tests:
+          enabled: true
+          description: VNF onboarding platform tests
+          upstream: https://gerrit.mcp.mirantis.net/vnf-onboarding/platform-tests
+          access: ${gerrit:client:default_access}
+          require_change_id: true
+          require_agreement: false
+          merge_content: true
diff --git a/glusterfs/server/cluster.yml b/glusterfs/server/cluster.yml
index 87aa0e9..16453c9 100644
--- a/glusterfs/server/cluster.yml
+++ b/glusterfs/server/cluster.yml
@@ -2,6 +2,8 @@
 - service.glusterfs.server
 parameters:
   glusterfs:
+    monitoring:
+      glusterfs_service_host: ${_param:glusterfs_service_host}
     _support:
       iptables:
         enabled: false
diff --git a/haproxy/proxy/listen/radosgw.yml b/haproxy/proxy/listen/radosgw.yml
index ecdeb6b..434555d 100644
--- a/haproxy/proxy/listen/radosgw.yml
+++ b/haproxy/proxy/listen/radosgw.yml
@@ -2,6 +2,12 @@
   _param:
     haproxy_radosgw_bind_port: 8080
     haproxy_radosgw_source_port: 8080
+    ceph_rgw_node01_hostname: ${_param:cluster_node01_hostname}
+    ceph_rgw_node02_hostname: ${_param:cluster_node02_hostname}
+    ceph_rgw_node03_hostname: ${_param:cluster_node03_hostname}
+    ceph_rgw_node01_address: ${_param:cluster_node01_address}
+    ceph_rgw_node02_address: ${_param:cluster_node02_address}
+    ceph_rgw_node03_address: ${_param:cluster_node03_address}
   haproxy:
     proxy:
       listen:
@@ -12,15 +18,15 @@
             - address: ${_param:cluster_vip_address}
               port: ${_param:haproxy_radosgw_bind_port}
           servers:
-            - name: ${_param:cluster_node01_hostname}
-              host: ${_param:cluster_node01_address}
+            - name: ${_param:ceph_rgw_node01_hostname}
+              host: ${_param:ceph_rgw_node01_address}
               port: ${_param:haproxy_radosgw_source_port}
               params: check
-            - name: ${_param:cluster_node02_hostname}
-              host: ${_param:cluster_node02_address}
+            - name: ${_param:ceph_rgw_node02_hostname}
+              host: ${_param:ceph_rgw_node02_address}
               port: ${_param:haproxy_radosgw_source_port}
               params: check
-            - name: ${_param:cluster_node03_hostname}
-              host: ${_param:cluster_node03_address}
+            - name: ${_param:ceph_rgw_node03_hostname}
+              host: ${_param:ceph_rgw_node03_address}
               port: ${_param:haproxy_radosgw_source_port}
               params: check
diff --git a/jenkins/client/approved_scripts.yml b/jenkins/client/approved_scripts.yml
index 80cfd95..634aa0e 100644
--- a/jenkins/client/approved_scripts.yml
+++ b/jenkins/client/approved_scripts.yml
@@ -15,6 +15,7 @@
         - method groovy.util.Node attributes
         - method groovy.util.XmlParser parse java.io.File
         - method groovy.util.XmlParser parseText java.lang.String
+        - method hudson.EnvVars get java.lang.String java.lang.String
         - method hudson.PluginManager getPlugins
         - method hudson.PluginWrapper getShortName
         - method hudson.model.Hudson getSlaves
@@ -143,3 +144,4 @@
         - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods intersect java.util.List java.lang.Iterable
         - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods reverse java.util.List
         - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.util.Collection java.lang.String
+        - staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods init java.util.List
diff --git a/jenkins/client/job/deploy/update/cloud_update.yml b/jenkins/client/job/deploy/update/cloud_update.yml
index 8fc84ee..3034ea5 100644
--- a/jenkins/client/job/deploy/update/cloud_update.yml
+++ b/jenkins/client/job/deploy/update/cloud_update.yml
@@ -48,6 +48,18 @@
               type: boolean
               default: 'true'
               description: "Stop API services before update"
+            TARGET_KERNEL_UPDATES:
+              type: string
+              default: "cfg,ctl,prx,msg,dbs"
+              description: "Comma separated list of nodes to update kernel if newer version is available (Valid values are cfg,ctl,prx,msg,dbs,log,mon,mtr,ntw,nal,gtw-virtual,cmn,rgw,cid,cmp,kvm,osd,gtw-physical)"
+            TARGET_REBOOT:
+              type: string
+              default: "cfg,ctl,prx,msg,dbs"
+              description: "Comma separated list of nodes to reboot after update or physical machine rollback (Valid values are cfg,ctl,prx,msg,dbs,log,mon,mtr,ntw,nal,gtw-virtual,cmn,rgw,cid,cmp,kvm,osd,gtw-physical)"
+            TARGET_HIGHSTATE:
+              type: string
+              default: "cfg,ctl,prx,msg,dbs"
+              description: "Comma separated list of nodes to run Salt Highstate on after update or physical machine rollback (Valid values are cfg,ctl,prx,msg,dbs,log,mon,mtr,ntw,nal,gtw-virtual,cmn,rgw,cid,cmp,kvm,osd,gtw-physical)"
             TARGET_UPDATES:
               type: string
               default: "cfg,ctl,prx,msg,dbs"
@@ -56,10 +68,10 @@
               type: string
               default: ""
               description: "Comma separated list of nodes to rollback (Valid values are ctl,prx,msg,dbs,log,mon,mtr,ntw,nal,gtw-virtual,cmn,rgw,cmp,kvm,osd,gtw-physical)"
-            TARGET_MERGES:
+            TARGET_SNAPSHOT_MERGES:
               type: string
               default: ""
-              description: "Comma separated list of nodes to merge (Valid values are cfg,ctl,prx,msg,dbs,log,mon,mtr,ntw,nal,gtw-virtual,cmn,rgw,cid)"
+              description: "Comma separated list of nodes to merge live snapshot for (Valid values are cfg,ctl,prx,msg,dbs,log,mon,mtr,ntw,nal,gtw-virtual,cmn,rgw,cid)"
             CTL_TARGET:
               type: string
               default: "ctl*"
@@ -124,10 +136,6 @@
               type: string
               default: "gtw01*"
               description: "Salt targeted physical or virtual GTW nodes (ex. gtw01*)"
-            REBOOT:
-              type: boolean
-              default: 'false'
-              description: "Reboot nodes after update"
             ROLLBACK_PKG_VERSIONS:
               type: string
               default: ""
diff --git a/jenkins/client/job/git-mirrors/2way.yml b/jenkins/client/job/git-mirrors/2way.yml
index ba17f9f..bb6b44b 100644
--- a/jenkins/client/job/git-mirrors/2way.yml
+++ b/jenkins/client/job/git-mirrors/2way.yml
@@ -1,7 +1,7 @@
 parameters:
   _param:
     jenkins_pollscm_spec: "H/60 * * * *"
-    job_description: <br>Syncronizes code projects with GitHub.<br>
+    job_description_2way: <br>Syncronizes code projects with GitHub.<br>
   jenkins:
     client:
       job_template:
@@ -20,8 +20,12 @@
               source: mcp/mcp-offline-model
               target: Mirantis/mcp-offline-model
               branches: "master"
+            - name: mcp-drivetrain-model
+              source: mcp/mcp-drivetrain-model
+              target: Mirantis/mcp-drivetrain-model
+              branches: "master"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_2way}
             discard:
               build:
                 keep_num: 10
diff --git a/jenkins/client/job/oscore/init.yml b/jenkins/client/job/oscore/init.yml
index 4df13c4..2f45ef8 100644
--- a/jenkins/client/job/oscore/init.yml
+++ b/jenkins/client/job/oscore/init.yml
@@ -5,7 +5,7 @@
   - system.jenkins.client.job.oscore.salt_virtual_models
 parameters:
   _param:
-     job_description: <br>Deploy and test OpenStack.<br>
+     job_description_oscore: <br>Deploy and test OpenStack.<br>
   jenkins:
     client:
       view:
diff --git a/jenkins/client/job/oscore/qa.yml b/jenkins/client/job/oscore/qa.yml
index c8908e7..eb565a2 100644
--- a/jenkins/client/job/oscore/qa.yml
+++ b/jenkins/client/job/oscore/qa.yml
@@ -5,7 +5,7 @@
         oscore-build-docker-image:
           name: "{{job_prefix}}-{{oscore-qa-project}}-build-docker-image"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 25
@@ -50,7 +50,7 @@
         oscore-docker-image-systest-template:
           name: "{{job_prefix}}-{{oscore-qa-project}}-image-systest-{{model}}"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
diff --git a/jenkins/client/job/oscore/salt_virtual_models.yml b/jenkins/client/job/oscore/salt_virtual_models.yml
index 82b51ee..17c4aa8 100644
--- a/jenkins/client/job/oscore/salt_virtual_models.yml
+++ b/jenkins/client/job/oscore/salt_virtual_models.yml
@@ -4,7 +4,7 @@
       job:
         oscore-test_virtual_model:
           concurrent: true
-          description: ${_param:job_description}
+          description: ${_param:job_description_oscore}
           discard:
             build:
               keep_num: 30
@@ -47,6 +47,10 @@
               type: string
               description: Version of formulas for salt-master bootstrap
               default: "nightly"
+            BOOTSTRAP_EXTRA_REPO_PARAMS:
+              type: string
+              default: ""
+              description: "Defines a list of extra repos with parameters, format: repo 1, repo priority 1, repo pin 1; repo 2, repo priority 2, repo pin 2"
             # openstack api
             OPENSTACK_API_URL:
               type: string
@@ -97,7 +101,7 @@
           type: workflow-scm
         oscore-test_virtual_models:
           concurrent: true
-          description: ${_param:job_description}
+          description: ${_param:job_description_oscore}
           discard:
             build:
               keep_num: 30
diff --git a/jenkins/client/job/oscore/security_tests.yml b/jenkins/client/job/oscore/security_tests.yml
index d564574..8c6e39d 100644
--- a/jenkins/client/job/oscore/security_tests.yml
+++ b/jenkins/client/job/oscore/security_tests.yml
@@ -5,7 +5,7 @@
         bandit-scanner-template-downstream:
           name: "{{job_prefix}}-bandit-downstream-{{project}}"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -95,7 +95,7 @@
         bandit-scanner-template-upstream:
           name: "{{job_prefix}}-bandit-upstream-{{project}}"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
diff --git a/jenkins/client/job/oscore/tests.yml b/jenkins/client/job/oscore/tests.yml
index 122f793..56ecfe2 100644
--- a/jenkins/client/job/oscore/tests.yml
+++ b/jenkins/client/job/oscore/tests.yml
@@ -5,7 +5,7 @@
         test-openstack-component-formula:
           name: "{{job_prefix}}-formula-systest-{{model}}-{{openstack_version}}"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -147,7 +147,7 @@
         test-openstack-component-periodic:
           name: "{{job_prefix}}-{{milestone}}-{{model}}-{{openstack_version}}-{{formula_pkg_revision}}"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -286,7 +286,7 @@
         test-runner-template:
           name: "{{job_prefix}}-{{test_type}}-runner"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -381,7 +381,7 @@
         results-checker-template:
           name: "{{job_prefix}}-{{test_type}}-results-checker"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -454,7 +454,7 @@
         deploy-kvm-virtual-template:
           name: "{{job_prefix}}-deploy-kvm-VMs"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -536,7 +536,7 @@
         oscore-oscc-ci-template:
           name: "{{job_prefix}}-oscc-ci"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -598,10 +598,18 @@
                 type: boolean
                 default: "{{auto_promote}}"
                 description: Enable to autopromote repo
+              TEST_MULTINODE:
+                type: boolean
+                default: "{{test_multinode}}"
+                description: Whether to test nightly snapshot against multi-node virtual models
+              STACK_CLUSTER_NAMES:
+                type: string
+                default: "{{stack_cluster_names}}"
+                description: "Cluster name to use from reclass to deploy multi-node"
         build-salt-formula-refspec-template:
           name: "{{job_prefix}}-build-salt-formula-refspec"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -671,7 +679,7 @@
         test-salt-formula-refspec-template:
           name: "{{job_prefix}}-test-salt-formula-refspec"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
@@ -688,7 +696,7 @@
             trigger:
               gerrit:
                 project:
-                  "^salt-formulas/(nova|cinder|glance|keystone|horizon|neutron|designate|heat|ironic|barbican|aodh|ceilometer|gnocchi|panko|manila|salt|linux|reclass|galera|memcached|rabbitmq|bind|apache)$":
+                  "^salt-formulas/(nova|cinder|glance|keystone|horizon|neutron|designate|heat|ironic|barbican|aodh|ceilometer|gnocchi|panko|manila|salt|linux|reclass|galera|memcached|rabbitmq|bind|apache|runtest)$":
                     compare_type: 'REG_EXP'
                     branches:
                       - master
@@ -764,7 +772,7 @@
         test-deploy-virtual-model-change-template:
           name: "{{job_prefix}}-deploy-virtual-model-change-{{job_suffix}}"
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_oscore}
             discard:
               build:
                 keep_num: 30
diff --git a/jenkins/client/job/salt-formulas/git-mirrors/2way.yml b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
index cccd01a..a2b000a 100644
--- a/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
+++ b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
@@ -1,7 +1,7 @@
 parameters:
   _param:
     jenkins_pollscm_spec: "H/60 * * * *"
-    job_description: <br>Syncronizes code projects with GitHub.<br>
+    job_description_2way: <br>Syncronizes code projects with GitHub.<br>
   jenkins:
     client:
       job_template:
@@ -369,7 +369,7 @@
               branches: ${_param:salt_formulas_branches}
               notification_recipients: ${_param:salt_formulas_notification_recipients}
           template:
-            description: ${_param:job_description}
+            description: ${_param:job_description_2way}
             discard:
               build:
                 keep_num: 10
@@ -415,7 +415,7 @@
                 default: "{{notification_recipients}}"
       job:
         git-mirror-2way-salt-formulas-scripts:
-          description: ${_param:job_description}
+          description: ${_param:job_description_2way}
           discard:
             build:
               keep_num: 10
@@ -449,7 +449,7 @@
               type: string
               default: "master"
         git-mirror-2way-salt-formulas-cookiecutter:
-          description: ${_param:job_description}
+          description: ${_param:job_description_2way}
           discard:
             build:
               keep_num: 10
diff --git a/jenkins/client/job/salt-models/tests.yml b/jenkins/client/job/salt-models/tests.yml
index bebc115..80135b5 100644
--- a/jenkins/client/job/salt-models/tests.yml
+++ b/jenkins/client/job/salt-models/tests.yml
@@ -294,7 +294,7 @@
                 default: "1"
               EXTRA_FORMULAS:
                 type: string
-                default: "aptly artifactory backupninja collectd devops-portal docker elasticsearch freeipa gerrit glusterfs grafana haproxy heka horizon influxdb jenkins keepalived kibana libvirt maas memcached mysql nginx ntp openldap openssh postfix prometheus rsync rsyslog rundeck sensu sphinx telegraf xtrabackup watchdog"
+                default: "aptly artifactory backupninja collectd devops-portal docker elasticsearch fluentd freeipa gerrit glusterfs grafana haproxy heka horizon influxdb jenkins keepalived kibana libvirt maas memcached mysql nginx ntp openldap openssh postfix prometheus rsync rsyslog rundeck sensu sphinx telegraf xtrabackup watchdog"
       job:
         test-salt-model-node:
           name: test-salt-model-node
diff --git a/jenkins/client/job/validate.yml b/jenkins/client/job/validate.yml
index 168dcfd..c97c0ad 100644
--- a/jenkins/client/job/validate.yml
+++ b/jenkins/client/job/validate.yml
@@ -364,3 +364,43 @@
             PROXY:
               type: string
               default: ""
+        cvp-stacklight:
+          type: workflow-scm
+          name: cvp-stacklight
+          display_name: "CVP - Stacklight tests"
+          discard:
+            build:
+              keep_num: 20
+            artifact:
+              keep_num: 20
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            branch: "${_param:jenkins_pipelines_branch}"
+            credentials: "gerrit"
+            script: cvp-runner.groovy
+          param:
+            SALT_MASTER_URL:
+              type: string
+              default: "${_param:jenkins_salt_api_url}"
+              description: Full Salt API address [e.g. https://10.10.10.2:6969]
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+            TESTS_REPO:
+              type: string
+              default: "https://github.com/legan4ik/stacklight-pytest"
+              description: Url for cvp-stacklight-tests
+            TESTS_SETTINGS:
+              type: string
+              default: "SL_AUTOCONF=True"
+              description: "Additional environment variables to export"
+            TESTS_SET:
+              type: string
+              default: "stacklight-pytest/stacklight_tests/tests/prometheus/"
+              description: "Leave empty for full run or choose a file, e.g. test_dashboards.py"
+            PROXY:
+              type: string
+              default: ""
+              description: Proxy address to clone repo and install python requirements
diff --git a/jenkins/client/job/vnf-onboarding/init.yml b/jenkins/client/job/vnf-onboarding/init.yml
index cd97fef..19ba3f6 100644
--- a/jenkins/client/job/vnf-onboarding/init.yml
+++ b/jenkins/client/job/vnf-onboarding/init.yml
@@ -1,6 +1,7 @@
 classes:
   - system.jenkins.client.job.vnf-onboarding.test_avi_loadbalancer
   - system.jenkins.client.job.vnf-onboarding.test_nginx_vnf
+  - system.jenkins.client.job.vnf-onboarding.test_platform
 
 parameters:
   _param:
@@ -9,3 +10,4 @@
     vnf_openstack_api_url: "${_param:cluster_public_protocol}://${_param:cluster_public_host}:5000/v2.0"
     vnf_openstack_api_credentials: "test-openstack"
     vnf_elastic_url: "${_param:stacklight_log_address}:${_param:cluster_elasticsearch_port}"
+    vnf_docker_registry_path: "docker-dev-local.docker.mirantis.net/mirantis/vnf-onboarding"
diff --git a/jenkins/client/job/vnf-onboarding/test_platform.yml b/jenkins/client/job/vnf-onboarding/test_platform.yml
new file mode 100644
index 0000000..1dd0051
--- /dev/null
+++ b/jenkins/client/job/vnf-onboarding/test_platform.yml
@@ -0,0 +1,99 @@
+parameters:
+  jenkins:
+    client:
+      plugin:
+        gerrit-trigger: {}
+      job:
+        platform_validation_pipeline:
+          type: workflow-scm
+          name: platform_validation_pipeline
+          display_name: "Validate OpenStack platform before deploy of VNF"
+          discard:
+            build:
+              keep_num: 20
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/vnf-onboarding/pipelines"
+            credentials: "${_param:vnf_gerrit_credentials}"
+            script: test_platform.groovy
+          param:
+            OPENSTACK_API_CREDENTIALS:
+              type: string
+              description: "OpenStack admin user credentials for running tests"
+              default: "${_param:vnf_openstack_api_credentials}"
+            OS_PROJECT_NAME:
+              type: string
+              description: "OpenStack project name for running tests"
+              default: "platform-test"
+            OS_AUTH_URL:
+              type: string
+              description: "OpenStack auth url"
+              default: "http://${_param:openstack_control_address}:35357/v3"
+            IMAGE_ID:
+              type: string
+              description: "Specify image id to execute tests against custom images"
+              default: ""
+            FLAVOR_ID:
+              type: string
+              description: "Specify flavor id to execute tests against custom images"
+              default: ""
+            MIN_COMPUTE_NODES:
+              type: string
+              description: "Specify number of compute nodes of environment"
+              default: '2'
+            FIXED_SHARED_NETWORK_NAME:
+              type: string
+              description: "Shared network that will be used in tests."
+              default: "test-shared"
+            COMPUTE_NODE_HOST_NAME:
+              type: string
+              description: "To run CPU pinning/NUMA topology tests against specific node"
+              default: ''
+            COMPUTE_AVAILABILITY_ZONE:
+              type: string
+              description: "To run CPU pinning/NUMA topology tests against specific node"
+              default: 'nova'
+            COMPUTE_NUMA_NODE_COUNT:
+              type: string
+              description: "Number of NUMA node for NUMA topology testing."
+              default: '2'
+            IMAGE_SSH_USER:
+              type: string
+              description: "Specify user name to login in test OpenStack VMs"
+              default: "cirros"
+            VNF_PLATFORM_TESTS_REPO:
+              type: string
+              description: "Repository with testing framework"
+              default: "${_param:jenkins_gerrit_url}vnf-onboarding/platform-tests"
+            VNF_PLATFORM_TESTS_BRANCH:
+              type: string
+              default: "master"
+            VNF_PLATFORM_TESTS_REPO_CREDENTIALS:
+              type: string
+              default: "${_param:vnf_gerrit_credentials}"
+            TEMPEST_IMAGE_DOCKER_REGISTRY_PATH:
+              type: string
+              description: "Path for docker image with testing tool.  If empty, image will be build using VNF_PLATFORM_TESTS_* parameters."
+              default: ${_param:vnf_docker_registry_path}
+            TEMPEST_IMAGE_NAME:
+              type: string
+              description: "Name of docker image with testing tool"
+              default: "platform_tests:latest"
+            ELASTIC_URL:
+              type: string
+              description: "URL to elastic search API"
+              default: "${_param:vnf_elastic_url}"
+            ELASTIC_TRANSFER_REPO:
+              type: string
+              description: "Repository with scripts for transfering test results to elastic search"
+              default: "${_param:jenkins_gerrit_url}/vnf-onboarding/nfv-platform"
+            ELASTIC_TRANSFER_REPO_CREDENTIALS:
+              type: string
+              default: "${_param:vnf_gerrit_credentials}"
+            ELASTIC_TRANSFER_REPO_BRANCH:
+              type: string
+              default: "master"
+            DOCKER_TEMPEST_PARAMS:
+              type: string
+              description: "Pass custom parameters for tempest container"
+              default: ""
diff --git a/nginx/server/proxy/openstack/aodh.yml b/nginx/server/proxy/openstack/aodh.yml
index bd73165..d15bca5 100644
--- a/nginx/server/proxy/openstack/aodh.yml
+++ b/nginx/server/proxy/openstack/aodh.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_aodh_host: ${_param:aodh_service_host}
+    nginx_proxy_openstack_aodh_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -15,7 +16,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_aodh_host}
             port: 8042
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_aodh_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 8042
diff --git a/nginx/server/proxy/openstack/barbican.yml b/nginx/server/proxy/openstack/barbican.yml
index 89e5a9c..6ac6a14 100644
--- a/nginx/server/proxy/openstack/barbican.yml
+++ b/nginx/server/proxy/openstack/barbican.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_barbican_host: ${_param:barbican_service_host}
+    nginx_proxy_openstack_barbican_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -15,7 +16,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_barbican_host}
             port: 9311
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_barbican_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 9311
diff --git a/nginx/server/proxy/openstack/ceilometer.yml b/nginx/server/proxy/openstack/ceilometer.yml
index 938b6cf..78b1f00 100644
--- a/nginx/server/proxy/openstack/ceilometer.yml
+++ b/nginx/server/proxy/openstack/ceilometer.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_ceilometer_host: ${_param:ceilometer_service_host}
+    nginx_proxy_openstack_ceilometer_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -15,7 +16,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_ceilometer_host}
             port: 8777
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_ceilometer_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 8777
diff --git a/nginx/server/proxy/openstack/cinder.yml b/nginx/server/proxy/openstack/cinder.yml
new file mode 100644
index 0000000..c89fa11
--- /dev/null
+++ b/nginx/server/proxy/openstack/cinder.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_cinder_host: ${_param:cinder_service_host}
+    nginx_proxy_openstack_cinder_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_cinder:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_cinder
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_cinder_host}
+            port: 8776
+            protocol: ${_param:nginx_proxy_openstack_cinder_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 8776
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/designate.yml b/nginx/server/proxy/openstack/designate.yml
index c238775..ce92ff6 100644
--- a/nginx/server/proxy/openstack/designate.yml
+++ b/nginx/server/proxy/openstack/designate.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_designate_host: ${_param:designate_service_host}
+    nginx_proxy_openstack_designate_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -14,7 +15,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_designate_host}
             port: 9001
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_designate_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 9001
diff --git a/nginx/server/proxy/openstack/glance.yml b/nginx/server/proxy/openstack/glance.yml
new file mode 100644
index 0000000..3479296
--- /dev/null
+++ b/nginx/server/proxy/openstack/glance.yml
@@ -0,0 +1,26 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_glance_protocol: 'http'
+    nginx_proxy_openstack_glance_host: ${_param:glance_service_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_glance:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_glance
+          check: false
+          underscores_in_headers: true
+          proxy:
+            host: ${_param:nginx_proxy_openstack_glance_host}
+            port: 9292
+            protocol: ${_param:nginx_proxy_openstack_glance_protocol}
+            size: 30000m
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 9292
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/gnocchi.yml b/nginx/server/proxy/openstack/gnocchi.yml
index 2f6d0e5..6169648 100644
--- a/nginx/server/proxy/openstack/gnocchi.yml
+++ b/nginx/server/proxy/openstack/gnocchi.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_gnocchi_host: ${_param:gnocchi_service_host}
+    nginx_proxy_openstack_gnocchi_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -15,7 +16,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_gnocchi_host}
             port: 8041
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_gnocchi_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 8041
diff --git a/nginx/server/proxy/openstack/heat.yml b/nginx/server/proxy/openstack/heat.yml
new file mode 100644
index 0000000..bfb7745
--- /dev/null
+++ b/nginx/server/proxy/openstack/heat.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_heat_host: ${_param:heat_service_host}
+    nginx_proxy_openstack_heat_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_heat:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_heat
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_heat_host}
+            port: 8004
+            protocol: ${_param:nginx_proxy_openstack_heat_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 8004
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/heat_cfn.yml b/nginx/server/proxy/openstack/heat_cfn.yml
new file mode 100644
index 0000000..99bb2d3
--- /dev/null
+++ b/nginx/server/proxy/openstack/heat_cfn.yml
@@ -0,0 +1,23 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_heat_host: ${_param:heat_service_host}
+    nginx_proxy_openstack_heat_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_heat_cfn:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_heat_cfn
+          proxy:
+            host: ${_param:nginx_proxy_openstack_heat_host}
+            port: 8000
+            protocol: ${_param:nginx_proxy_openstack_heat_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 8000
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/heat_cloudwatch.yml b/nginx/server/proxy/openstack/heat_cloudwatch.yml
new file mode 100644
index 0000000..2c6a30a
--- /dev/null
+++ b/nginx/server/proxy/openstack/heat_cloudwatch.yml
@@ -0,0 +1,23 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_heat_host: ${_param:heat_service_host}
+    nginx_proxy_openstack_heat_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_heat_cloudwatch:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_heat_cloudwatch
+          proxy:
+            host: ${_param:nginx_proxy_openstack_heat_host}
+            port: 8003
+            protocol: ${_param:nginx_proxy_openstack_heat_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 8003
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/ironic.yml b/nginx/server/proxy/openstack/ironic.yml
index 95eb1bd..6ccedb3 100644
--- a/nginx/server/proxy/openstack/ironic.yml
+++ b/nginx/server/proxy/openstack/ironic.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_ironic_host: ${_param:ironic_service_host}
+    nginx_proxy_openstack_ironic_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -14,7 +15,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_ironic_host}
             port: 6385
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_ironic_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 6385
diff --git a/nginx/server/proxy/openstack/keystone.yml b/nginx/server/proxy/openstack/keystone.yml
new file mode 100644
index 0000000..bf6646a
--- /dev/null
+++ b/nginx/server/proxy/openstack/keystone.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_keystone_host: ${_param:keystone_service_host}
+    nginx_proxy_openstack_keystone_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_keystone:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_keystone
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_keystone_host}
+            port: 5000
+            protocol: ${_param:nginx_proxy_openstack_keystone_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 5000
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/keystone_private.yml b/nginx/server/proxy/openstack/keystone_private.yml
new file mode 100644
index 0000000..bffae74
--- /dev/null
+++ b/nginx/server/proxy/openstack/keystone_private.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_keystone_host: ${_param:keystone_service_host}
+    nginx_proxy_openstack_keystone_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_keystone_private:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_keystone_private
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_keystone_host}
+            port: 35357
+            protocol: ${_param:nginx_proxy_openstack_keystone_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 35357
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/manila.yml b/nginx/server/proxy/openstack/manila.yml
index 050d0de..8157dd8 100644
--- a/nginx/server/proxy/openstack/manila.yml
+++ b/nginx/server/proxy/openstack/manila.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_manila_host: ${_param:manila_service_host}
+    nginx_proxy_openstack_manila_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -14,7 +15,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_manila_host}
             port: 8786
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_manila_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 8786
diff --git a/nginx/server/proxy/openstack/neutron.yml b/nginx/server/proxy/openstack/neutron.yml
new file mode 100644
index 0000000..9ee5796
--- /dev/null
+++ b/nginx/server/proxy/openstack/neutron.yml
@@ -0,0 +1,23 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_neutron_host: ${_param:neutron_service_host}
+    nginx_proxy_openstack_neutron_protocol: 'http'
+  nginx:
+    server:
+      site:
+        nginx_proxy_openstack_api_neutron:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_neutron
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_neutron_host}
+            port: 9696
+            protocol: ${_param:nginx_proxy_openstack_neutron_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 9696
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/nova.yml b/nginx/server/proxy/openstack/nova.yml
new file mode 100644
index 0000000..456e056
--- /dev/null
+++ b/nginx/server/proxy/openstack/nova.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_nova_host: ${_param:nova_service_host}
+    nginx_proxy_openstack_nova_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_nova:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_nova
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_nova_host}
+            port: 8774
+            protocol: ${_param:nginx_proxy_openstack_nova_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 8774
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/nova_ec2.yml b/nginx/server/proxy/openstack/nova_ec2.yml
new file mode 100644
index 0000000..27b3f91
--- /dev/null
+++ b/nginx/server/proxy/openstack/nova_ec2.yml
@@ -0,0 +1,24 @@
+parameters:
+  _param:
+    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_api_address: 0.0.0.0
+    nginx_proxy_openstack_nova_host: ${_param:nova_service_host}
+    nginx_proxy_openstack_nova_protocol: 'http'
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_api_nova_ec2:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_api_nova_ec2
+          check: false
+          proxy:
+            host: ${_param:nginx_proxy_openstack_nova_host}
+            port: 8773
+            protocol: ${_param:nginx_proxy_openstack_nova_protocol}
+          host:
+            name: ${_param:nginx_proxy_openstack_api_host}
+            port: 8773
+            address: ${_param:nginx_proxy_openstack_api_address}
+          ssl: ${_param:nginx_proxy_ssl}
diff --git a/nginx/server/proxy/openstack/panko.yml b/nginx/server/proxy/openstack/panko.yml
index 6081dd1..45d389b 100644
--- a/nginx/server/proxy/openstack/panko.yml
+++ b/nginx/server/proxy/openstack/panko.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_panko_host: ${_param:panko_service_host}
+    nginx_proxy_openstack_panko_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -15,7 +16,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_panko_host}
             port: 8977
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_panko_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 8977
diff --git a/nginx/server/proxy/openstack/placement.yml b/nginx/server/proxy/openstack/placement.yml
index eda272c..9e8b08c 100644
--- a/nginx/server/proxy/openstack/placement.yml
+++ b/nginx/server/proxy/openstack/placement.yml
@@ -3,6 +3,7 @@
     nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
     nginx_proxy_openstack_api_address: 0.0.0.0
     nginx_proxy_openstack_placement_host: ${_param:placement_service_host}
+    nginx_proxy_openstack_placement_protocol: 'http'
   nginx:
     server:
       enabled: true
@@ -14,7 +15,7 @@
           proxy:
             host: ${_param:nginx_proxy_openstack_placement_host}
             port: 8778
-            protocol: http
+            protocol: ${_param:nginx_proxy_openstack_placement_protocol}
           host:
             name: ${_param:nginx_proxy_openstack_api_host}
             port: 8778
diff --git a/nginx/server/proxy/openstack_api.yml b/nginx/server/proxy/openstack_api.yml
index 4f6073d..f9f363d 100644
--- a/nginx/server/proxy/openstack_api.yml
+++ b/nginx/server/proxy/openstack_api.yml
@@ -1,154 +1,11 @@
-parameters:
-  _param:
-    nginx_proxy_openstack_api_host: ${_param:cluster_public_host}
-    nginx_proxy_openstack_api_address: 0.0.0.0
-    nginx_proxy_openstack_keystone_host: ${_param:keystone_service_host}
-    nginx_proxy_openstack_nova_host: ${_param:nova_service_host}
-    nginx_proxy_openstack_cinder_host: ${_param:cinder_service_host}
-    nginx_proxy_openstack_glance_host: ${_param:glance_service_host}
-    nginx_proxy_openstack_neutron_host: ${_param:neutron_service_host}
-    nginx_proxy_openstack_heat_host: ${_param:heat_service_host}
-  nginx:
-    server:
-      enabled: true
-      site:
-        nginx_proxy_openstack_api_keystone:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_keystone
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_keystone_host}
-            port: 5000
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 5000
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_keystone_private:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_keystone_private
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_keystone_host}
-            port: 35357
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 35357
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_nova:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_nova
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_nova_host}
-            port: 8774
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 8774
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_cinder:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_cinder
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_cinder_host}
-            port: 8776
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 8776
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_glance:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_glance
-          check: false
-          underscores_in_headers: true
-          proxy:
-            host: ${_param:nginx_proxy_openstack_glance_host}
-            port: 9292
-            protocol: http
-            size: 30000m
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 9292
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_neutron:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_neutron
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_neutron_host}
-            port: 9696
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 9696
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_heat_cloudwatch:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_heat_cloudwatch
-          proxy:
-            host: ${_param:nginx_proxy_openstack_heat_host}
-            port: 8003
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 8003
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_heat_cfn:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_heat_cfn
-          proxy:
-            host: ${_param:nginx_proxy_openstack_heat_host}
-            port: 8000
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 8000
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_heat:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_heat
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_heat_host}
-            port: 8004
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 8004
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
-        nginx_proxy_openstack_api_nova_ec2:
-          enabled: true
-          type: nginx_proxy
-          name: openstack_api_nova_ec2
-          check: false
-          proxy:
-            host: ${_param:nginx_proxy_openstack_nova_host}
-            port: 8773
-            protocol: http
-          host:
-            name: ${_param:nginx_proxy_openstack_api_host}
-            port: 8773
-            address: ${_param:nginx_proxy_openstack_api_address}
-          ssl: ${_param:nginx_proxy_ssl}
+classes:
+- system.nginx.server.proxy.openstack.cinder
+- system.nginx.server.proxy.openstack.glance
+- system.nginx.server.proxy.openstack.heat
+- system.nginx.server.proxy.openstack.heat_cfn
+- system.nginx.server.proxy.openstack.heat_cloudwatch
+- system.nginx.server.proxy.openstack.keystone
+- system.nginx.server.proxy.openstack.keystone_private
+- system.nginx.server.proxy.openstack.neutron
+- system.nginx.server.proxy.openstack.nova
+- system.nginx.server.proxy.openstack.nova_ec2
diff --git a/openssh/server/team/qa_scale.yml b/openssh/server/team/qa_scale.yml
index 98c5540..0414e35 100644
--- a/openssh/server/team/qa_scale.yml
+++ b/openssh/server/team/qa_scale.yml
@@ -2,6 +2,7 @@
 - system.openssh.server.team.members.listomin
 - system.openssh.server.team.members.sgalkin
 - system.openssh.server.team.members.obasov
+- system.openssh.server.team.members.mikhailkraynov
 
 parameters:
   _param:
diff --git a/zookeeper/backup/client/single.yml b/zookeeper/backup/client/single.yml
index 0085b79..d8eaaac 100644
--- a/zookeeper/backup/client/single.yml
+++ b/zookeeper/backup/client/single.yml
@@ -1,4 +1,5 @@
 classes:
+- service.zookeeper.backup.client
 - system.openssh.client.root
 parameters:
   _param:
diff --git a/zookeeper/backup/server/single.yml b/zookeeper/backup/server/single.yml
index aaa877b..6796d8a 100644
--- a/zookeeper/backup/server/single.yml
+++ b/zookeeper/backup/server/single.yml
@@ -1,3 +1,5 @@
+classes:
+- service.zookeeper.backup.server
 parameters:
   _param:
     zookeeper_backup_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzLUiHKAjfFXiZ3fsgx35uXF6VivfC5WFafu4QMalxmj6W+s277oCfdWA8Du5f1wtQXM73VQ5nHkXhM2UIfUMarsyhXK+BxKVrcgEBNHdKlDytaecUPyuOxTDdGWhN/DPv5/vL8NYWweEYBbNbLgU0Td7Rvm52TUXKThIDjeF7XDxX4ShXWipBSwU4boOUBtR8KWfga8fsqeBN+eacuAQFR3MrrOfVvAuWW6Bsf047cmd+V6Qv0raoW73Nu4M/ZAdTsaR5k62a0cHsSRoi3hCmNRqw+CZaQi8prQU6t26eWPEtznjp5EkPF+LLh8LxUoCfWqWT+Lxe8QQwT1nx/LCN