Merge "Parametrize rndc key algorithm"
diff --git a/docker/swarm/stack/devops_portal.yml b/docker/swarm/stack/devops_portal.yml
index 91bca12..430c329 100644
--- a/docker/swarm/stack/devops_portal.yml
+++ b/docker/swarm/stack/devops_portal.yml
@@ -1,7 +1,7 @@
 parameters:
   _param:
     docker_devops_portal_replicas: 1
-    docker_image_devops_portal: docker-sandbox.sandbox.mirantis.net/vstoiko/oss/devops-portal:latest
+    docker_image_devops_portal: docker-prod-virtual.docker.mirantis.net/mirantis/oss/devops-portal:latest
   docker:
     client:
       stack:
diff --git a/docker/swarm/stack/jenkins/init.yml b/docker/swarm/stack/jenkins/init.yml
new file mode 100644
index 0000000..ab4f07e
--- /dev/null
+++ b/docker/swarm/stack/jenkins/init.yml
@@ -0,0 +1,3 @@
+classes:
+  - system.docker.swarm.stack.jenkins.master
+  - system.docker.swarm.stack.jenkins.slave
diff --git a/docker/swarm/stack/jenkins.yml b/docker/swarm/stack/jenkins/master.yml
similarity index 69%
rename from docker/swarm/stack/jenkins.yml
rename to docker/swarm/stack/jenkins/master.yml
index acea08b..8b66187 100644
--- a/docker/swarm/stack/jenkins.yml
+++ b/docker/swarm/stack/jenkins/master.yml
@@ -5,11 +5,11 @@
     client:
       stack:
         jenkins:
-          environment:
-            JAVA_OPTS: "-Djenkins.install.runSetupWizard=false -Dhudson.DNSMultiCast.disabled=true -Dhudson.udp=-1 -Dhudson.footerURL=https://www.mirantis.com"
-            JENKINS_NUM_EXECUTORS: 4
           service:
             master:
+              environment:
+                JAVA_OPTS: "-Djenkins.install.runSetupWizard=false -Dhudson.DNSMultiCast.disabled=true -Dhudson.udp=-1 -Dhudson.footerURL=https://www.mirantis.com"
+                JENKINS_NUM_EXECUTORS: 4
               deploy:
                 restart_policy:
                   condition: any
diff --git a/docker/swarm/stack/jenkins/slave.yml b/docker/swarm/stack/jenkins/slave.yml
new file mode 100644
index 0000000..52015ec
--- /dev/null
+++ b/docker/swarm/stack/jenkins/slave.yml
@@ -0,0 +1,71 @@
+parameters:
+  _param:
+    docker_image_jenkins_slave: tcpcloud/jnlp-slave
+    jenkins_master_host: ${_param:control_vip_address}
+    jenkins_master_port: 8081
+    jenkins_secret: "7c40abc1a7df2d26dd6b2e4421af17218df75a16fcbd5e3aa6017d9f47eaeabe"
+    jenkins_master_url: http://${_param:jenkins_master_host}:${_param:jenkins_master_port}
+    jenkins_slave_user: ${_param:jenkins_client_user}
+    jenkins_slave_password: ${_param:jenkins_client_password}
+  docker:
+    client:
+      stack:
+        jenkins:
+          service:
+            slave01:
+              environment:
+                JENKINS_URL: ${_param:jenkins_master_url}
+                JENKINS_AGENT_NAME: slave01
+                JENKINS_UPDATE_SLAVE: 'true'
+                JENKINS_LOGIN: ${_param:jenkins_slave_user}
+                JENKINS_PASSWORD: ${_param:jenkins_slave_password}
+              deploy:
+                restart_policy:
+                  condition: any
+                placement:
+                  constraints:
+                    - "node.hostname == ${_param:cluster_node01_name}"
+              image: ${_param:docker_image_jenkins_slave}
+              volumes:
+                - /etc/ssl/certs/java/cacerts:/etc/ssl/certs/java/cacerts:ro
+                - /etc/aptly-publisher.yaml:/etc/aptly-publisher.yaml:ro
+                - /var/run/docker.sock:/var/run/docker.sock
+                - /usr/bin/docker:/usr/bin/docker:ro
+            slave02:
+              environment:
+                JENKINS_URL: ${_param:jenkins_master_url}
+                JENKINS_AGENT_NAME: slave02
+                JENKINS_UPDATE_SLAVE: 'true'
+                JENKINS_LOGIN: ${_param:jenkins_slave_user}
+                JENKINS_PASSWORD: ${_param:jenkins_slave_password}
+              deploy:
+                restart_policy:
+                  condition: any
+                placement:
+                  constraints:
+                    - "node.hostname == ${_param:cluster_node02_name}"
+              image: ${_param:docker_image_jenkins_slave}
+              volumes:
+                - /etc/ssl/certs/java/cacerts:/etc/ssl/certs/java/cacerts:ro
+                - /etc/aptly-publisher.yaml:/etc/aptly-publisher.yaml:ro
+                - /var/run/docker.sock:/var/run/docker.sock
+                - /usr/bin/docker:/usr/bin/docker:ro
+            slave03:
+              environment:
+                JENKINS_URL: ${_param:jenkins_master_url}
+                JENKINS_AGENT_NAME: slave03
+                JENKINS_UPDATE_SLAVE: 'true'
+                JENKINS_LOGIN: ${_param:jenkins_slave_user}
+                JENKINS_PASSWORD: ${_param:jenkins_slave_password}
+              deploy:
+                restart_policy:
+                  condition: any
+                placement:
+                  constraints:
+                    - "node.hostname == ${_param:cluster_node03_name}"
+              image: ${_param:docker_image_jenkins_slave}
+              volumes:
+                - /etc/ssl/certs/java/cacerts:/etc/ssl/certs/java/cacerts:ro
+                - /etc/aptly-publisher.yaml:/etc/aptly-publisher.yaml:ro
+                - /var/run/docker.sock:/var/run/docker.sock
+                - /usr/bin/docker:/usr/bin/docker:ro
diff --git a/docker/swarm/stack/rundeck.yml b/docker/swarm/stack/rundeck.yml
index a4ec24b..322a285 100644
--- a/docker/swarm/stack/rundeck.yml
+++ b/docker/swarm/stack/rundeck.yml
@@ -1,7 +1,7 @@
 parameters:
   _param:
     docker_rundeck_replicas: 1
-    docker_image_rundeck: docker-sandbox.sandbox.mirantis.net/ikharin/oss/rundeck:2.7.3-1
+    docker_image_rundeck: docker-prod-virtual.docker.mirantis.net/mirantis/oss/rundeck:latest
   docker:
     client:
       stack:
diff --git a/haproxy/proxy/listen/kubernetes/apiserver.yml b/haproxy/proxy/listen/kubernetes/apiserver.yml
index a45a71a..b35d1be 100644
--- a/haproxy/proxy/listen/kubernetes/apiserver.yml
+++ b/haproxy/proxy/listen/kubernetes/apiserver.yml
@@ -21,4 +21,7 @@
           - name: ${_param:cluster_node03_hostname}
             host: ${_param:cluster_node03_address}
             port: 443
-            params: check
\ No newline at end of file
+            params: check
+          timeout:
+            server: 10m
+            client: 10m
diff --git a/haproxy/proxy/listen/kubernetes/apiserver_insecure.yml b/haproxy/proxy/listen/kubernetes/apiserver_insecure.yml
index a365c51..7211507 100644
--- a/haproxy/proxy/listen/kubernetes/apiserver_insecure.yml
+++ b/haproxy/proxy/listen/kubernetes/apiserver_insecure.yml
@@ -20,6 +20,9 @@
             host: ${_param:cluster_node03_address}
             port: 8080
             params: check
+          timeout:
+            server: 10m
+            client: 10m
         k8s_cluster_localhost:
           type: kubernetes
           binds:
@@ -37,4 +40,7 @@
           - name: ${_param:cluster_node03_hostname}
             host: ${_param:cluster_node03_address}
             port: 8080
-            params: check
\ No newline at end of file
+            params: check
+          timeout:
+            server: 10m
+            client: 10m
diff --git a/jenkins/client/job/debian/packages/salt.yml b/jenkins/client/job/debian/packages/salt.yml
index ecd7432..0eec086 100644
--- a/jenkins/client/job/debian/packages/salt.yml
+++ b/jenkins/client/job/debian/packages/salt.yml
@@ -189,6 +189,8 @@
               dist: trusty
             - name: varnish
               dist: trusty
+            - name: xtrabackup
+              dist: trusty
             - name: zookeeper
               dist: trusty
             - name: aodh
@@ -375,6 +377,8 @@
               dist: xenial
             - name: varnish
               dist: xenial
+            - name: xtrabackup
+              dist: xenial
             - name: zookeeper
               dist: xenial
           template:
diff --git a/jenkins/client/job/deploy/lab/cicd.yml b/jenkins/client/job/deploy/lab/cicd.yml
index d2bd1f7..fb1dd92 100644
--- a/jenkins/client/job/deploy/lab/cicd.yml
+++ b/jenkins/client/job/deploy/lab/cicd.yml
@@ -75,9 +75,15 @@
               OPENSTACK_API_VERSION:
                 type: string
                 default: "2"
-              OPENSTACK_API_PROJECT_DOMAIN_ID:
+              OPENSTACK_API_PROJECT_DOMAIN:
                 type: string
                 default: "default"
               OPENSTACK_API_USER_DOMAIN_ID:
                 type: string
                 default: "default"
+              OPENSTACK_API_PROJECT_ID:
+                type: string
+                default: ""
+              OPENSTACK_API_USER_DOMAIN:
+                type: string
+                default: "default"
diff --git a/jenkins/client/job/deploy/lab/mk/cleanup.yml b/jenkins/client/job/deploy/lab/mk/cleanup.yml
index d11b691..a400842 100644
--- a/jenkins/client/job/deploy/lab/mk/cleanup.yml
+++ b/jenkins/client/job/deploy/lab/mk/cleanup.yml
@@ -2,10 +2,10 @@
   jenkins:
     client:
       job:
-        deploy-heat-cleanup:
+        deploy-stack-cleanup:
           type: workflow-scm
           concurrent: true
-          display_name: "Deploy - heat cleanup"
+          display_name: "Deploy - stack cleanup"
           discard:
             build:
               keep_num: 20
@@ -15,7 +15,18 @@
             credentials: "gerrit"
             script: cleanup-pipeline.groovy
           param:
-            # openstack api
+            # general parameters
+            STACK_NAME:
+              type: string
+              description: This stack will be deleted.
+            STACK_TYPE:
+              type: choice
+              choices:
+                - heat
+                - aws
+              default: 'heat'
+
+            # heat parameters
             OPENSTACK_API_URL:
               type: string
               default: "https://vpc.tcpisek.cz:5000"
@@ -31,16 +42,24 @@
             OPENSTACK_API_VERSION:
               type: string
               default: "2"
-            OPENSTACK_API_PROJECT_DOMAIN_ID:
+            OPENSTACK_API_PROJECT_DOMAIN:
               type: string
               default: "default"
-            OPENSTACK_API_USER_DOMAIN_ID:
+            OPENSTACK_API_PROJECT_ID:
+              type: string
+              default: ""
+            OPENSTACK_API_USER_DOMAIN:
               type: string
               default: "default"
-            # heat
-            HEAT_STACK_NAME:
+
+            # aws parameters
+            AWS_API_CREDENTIALS:
               type: string
-              description: This stack will be deleted.
+              default: "aws-credentials"
+            AWS_DEFAULT_REGION:
+              type: string
+              default: "us-west-2"
+
         delete-failed-stacks:
           type: workflow-scm
           concurrent: true
@@ -73,9 +92,15 @@
             OPENSTACK_API_VERSION:
               type: string
               default: "2"
-            OPENSTACK_API_PROJECT_DOMAIN_ID:
+            OPENSTACK_API_PROJECT_DOMAIN:
               type: string
               default: "default"
             OPENSTACK_API_USER_DOMAIN_ID:
               type: string
               default: "default"
+            OPENSTACK_API_PROJECT_ID:
+              type: string
+              default: ""
+            OPENSTACK_API_USER_DOMAIN:
+              type: string
+              default: "default"
diff --git a/jenkins/client/job/deploy/lab/mk/cloud.yml b/jenkins/client/job/deploy/lab/mk/cloud.yml
index d15933e..e6fb6d5 100644
--- a/jenkins/client/job/deploy/lab/mk/cloud.yml
+++ b/jenkins/client/job/deploy/lab/mk/cloud.yml
@@ -3,12 +3,12 @@
     jenkins_cloud_deploy_pipelines:
       - stack_name: k8s_calico
         stack_type: heat
-        stack_install: core,k8s
+        stack_install: core,k8s,calico
         job_timer: ""
       - stack_name: k8s_calico
         stack_type: aws
-        stack_install: core,k8s
-        job_timer: ""
+        stack_install: core,k8s,calico
+        job_timer: "H H * * *"
   jenkins:
     client:
       job_template:
@@ -21,7 +21,7 @@
               build:
                 keep_num: 20
             concurrent: true
-            display_name: "Deploy {{stack_type}} {{stack_name}} stack"
+            display_name: "Deploy - {{stack_name}} {{stack_type}}"
             scm:
               type: git
               url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
@@ -31,7 +31,12 @@
               timer:
                 spec: "{{job_timer}}"
             param:
-              # deployments and test settings
+              # general parameters
+              ASK_ON_ERROR:
+                type: boolean
+                default: 'false'
+
+              # deployments
               STACK_NAME:
                 type: string
                 description: Heat stack name. Will be generated if missing.
@@ -66,7 +71,7 @@
                 default: "master"
               STACK_CLEANUP_JOB:
                 type: string
-                default: ''
+                default: 'deploy-stack-cleanup'
 
               # salt master
               SALT_MASTER_CREDENTIALS:
@@ -104,12 +109,18 @@
               OPENSTACK_API_VERSION:
                 type: string
                 default: "2"
-              OPENSTACK_API_PROJECT_DOMAIN_ID:
+              OPENSTACK_API_PROJECT_DOMAIN:
                 type: string
                 default: "default"
               OPENSTACK_API_USER_DOMAIN_ID:
                 type: string
                 default: "default"
+              OPENSTACK_API_PROJECT_ID:
+                type: string
+                default: ""
+              OPENSTACK_API_USER_DOMAIN:
+                type: string
+                default: "default"
 
               # heat
               HEAT_STACK_ENVIRONMENT:
@@ -130,12 +141,8 @@
                 type: string
                 default: "docker-dev-virtual.docker.mirantis.net/mirantis/kubernetes/k8s-conformance:v1.5.1-3_1482332392819"
 
-              # Tempest settings
-              TEMPEST_IMAGE_LINK:
+              # Openstack settings
+              TEMPEST_IMAGE:
                 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/lab/mk/init.yml b/jenkins/client/job/deploy/lab/mk/init.yml
index c9833ef..1ddd863 100644
--- a/jenkins/client/job/deploy/lab/mk/init.yml
+++ b/jenkins/client/job/deploy/lab/mk/init.yml
@@ -58,7 +58,7 @@
                 default: 'false'
               STACK_CLEANUP_JOB:
                 type: string
-                default: 'deploy-heat-cleanup'
+                default: 'deploy-stack-cleanup'
               # heat
               HEAT_STACK_ENVIRONMENT:
                 type: string
@@ -103,7 +103,7 @@
               OPENSTACK_USER_DOMAIN:
                 type: string
                 default: "default"
-              OPENSTACK_API_USER_DOMAIN_ID:
+              OPENSTACK_API_USER_DOMAIN:
                 type: string
                 default: "default"
 
diff --git a/jenkins/client/job/deploy/update/package.yml b/jenkins/client/job/deploy/update/package.yml
index 273796c..a4e7fc0 100644
--- a/jenkins/client/job/deploy/update/package.yml
+++ b/jenkins/client/job/deploy/update/package.yml
@@ -36,7 +36,7 @@
             TARGET_SUBSET_LIVE:
               type: string
               default: '1'
-              description: Number of selected noded to live apply selected package update.
+              description: Number of selected nodes to live apply selected package update.
             TARGET_BATCH_LIVE:
               type: string
               description: Batch size for the complete live package update on all nodes, empty string means apply to all targetted nodes.
diff --git a/jenkins/client/job/deploy/update/restore_mysql.yml b/jenkins/client/job/deploy/update/restore_mysql.yml
new file mode 100644
index 0000000..9b2e4d7
--- /dev/null
+++ b/jenkins/client/job/deploy/update/restore_mysql.yml
@@ -0,0 +1,26 @@
+#
+# Jobs to update packages on given Salt master environment
+#
+parameters:
+  _param:
+    jenkins_salt_api_url: "http://${_param:salt_master_host}:6969"
+  jenkins:
+    client:
+      job:
+        deploy-mysql-db-restore:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Xtrabackup - restore mysql db"
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: xtrabackup-restore-mysql-db.groovy
+          param:
+            SALT_MASTER_URL:
+              type: string
+              default: "${_param:jenkins_salt_api_url}"
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+
diff --git a/jenkins/client/job/deploy/update/upgrade_compute.yml b/jenkins/client/job/deploy/update/upgrade_compute.yml
new file mode 100644
index 0000000..0d7ea78
--- /dev/null
+++ b/jenkins/client/job/deploy/update/upgrade_compute.yml
@@ -0,0 +1,42 @@
+#
+# Jobs to update packages on given Salt master environment
+#
+parameters:
+  _param:
+    jenkins_salt_api_url: "http://${_param:salt_master_host}:6969"
+  jenkins:
+    client:
+      job:
+        deploy-update-package:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Deploy - upgrade computes"
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: openstack-compute-upgrade.groovy
+          param:
+            SALT_MASTER_URL:
+              type: string
+              default: "${_param:jenkins_salt_api_url}"
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+            TARGET_SERVERS:
+              type: string
+              default: "*"
+              description: Salt compound target to match nodes to be updated [*, G@osfamily:debian].
+            TARGET_PACKAGES:
+              type: string
+              description: Space delimited list of packages to be updates [package1=version package2=version], empty string means all updating all packages to the latest version.
+            TARGET_SUBSET_TEST:
+              type: string
+              description: Number of nodes to list package updates, empty string means all targetted nodes.
+            TARGET_SUBSET_LIVE:
+              type: string
+              default: '1'
+              description: Number of selected nodes to live apply selected package update.
+            TARGET_BATCH_LIVE:
+              type: string
+              description: Batch size for the complete live package update on all nodes, empty string means apply to all targetted nodes.
diff --git a/jenkins/client/job/docker/devops-portal.yml b/jenkins/client/job/docker/devops-portal.yml
index 7af37eb..399586f 100644
--- a/jenkins/client/job/docker/devops-portal.yml
+++ b/jenkins/client/job/docker/devops-portal.yml
@@ -40,7 +40,7 @@
           param:
             IMAGE_NAME:
               type: string
-              default: "devops_portal"
+              default: "devops-portal"
             IMAGE_TAGS:
               type: string
               default: ""
diff --git a/jenkins/client/job/docker/rundeck.yml b/jenkins/client/job/docker/rundeck.yml
new file mode 100644
index 0000000..63d206f
--- /dev/null
+++ b/jenkins/client/job/docker/rundeck.yml
@@ -0,0 +1,58 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        docker-build-images-rundeck:
+          name: docker-build-images-rundeck
+          discard:
+            build:
+              keep_num: 25
+            artifact:
+              keep_num: 25
+          type: workflow-scm
+          concurrent: false
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: docker-build-to-jfrog.groovy
+          trigger:
+            gerrit:
+              project:
+                "oss/docker-rundeck":
+                  branches:
+                    - master
+              skip_vote:
+                - successful
+                - failed
+                - unstable
+                - not_built
+              event:
+                patchset:
+                  - created:
+                      excludeDrafts: false
+                      excludeNoCodeChange: false
+                change:
+                  - merged
+                comment:
+                  - addedContains:
+                      commentAddedCommentContains: 'rebuild'
+          param:
+            IMAGE_NAME:
+              type: string
+              default: "rundeck"
+            IMAGE_TAGS:
+              type: string
+              default: ""
+            CREDENTIALS_ID:
+              type: string
+              default: "gerrit"
+            DOCKERFILE_PATH:
+              type: string
+              default: "."
+            DOCKER_REGISTRY:
+              type: string
+              default: "docker-dev-virtual.docker.mirantis.net"
+            PROJECT_NAMESPACE:
+              type: string
+              default: "oss"
diff --git a/jenkins/client/job/salt-formulas/git-mirrors/2way.yml b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
index 1716a44..3869b4a 100644
--- a/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
+++ b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
@@ -106,6 +106,7 @@
             - name: taiga
             - name: telegraf
             - name: varnish
+            - name: xtrabackup
             - name: zookeeper
           template:
             discard:
diff --git a/jenkins/client/job/salt-formulas/tests.yml b/jenkins/client/job/salt-formulas/tests.yml
index 0f3b405..1e51afb 100644
--- a/jenkins/client/job/salt-formulas/tests.yml
+++ b/jenkins/client/job/salt-formulas/tests.yml
@@ -107,6 +107,7 @@
             - name: telegraf
             - name: tftpd-hpa
             - name: varnish
+            - name: xtrabackup
             - name: zookeeper
           template:
             discard:
diff --git a/jenkins/client/job/salt-models/git-mirrors.yml b/jenkins/client/job/salt-models/git-mirrors.yml
index 44b13e3..514663b 100644
--- a/jenkins/client/job/salt-models/git-mirrors.yml
+++ b/jenkins/client/job/salt-models/git-mirrors.yml
@@ -8,24 +8,34 @@
           name: git-mirror-2way-salt-model-{{name}}
           jobs:
             - name: reclass-system
+              upstream_name: reclass-system
               branches: "master"
             - name: slovaktelekom
+              upstream_name: slovaktelekom
               branches: "master"
             - name: stacklight
+              upstream_name: stacklight
               branches: "master"
             - name: statens
+              upstream_name: statensit
               branches: "master"
             - name: aeg
+              upstream_name: aeg
               branches: "master"
             - name: att-cicd
+              upstream_name: att-cicd
               branches: "master"
             - name: mall
+              upstream_name: mall
               branches: "master"
             - name: quickplay
+              upstream_name: quickplay
               branches: "master"
             - name: ril-jamnagar
+              upstream_name: ril-jamnagar-lab
               branches: "master,jlab,next"
             - name: vf-cloudstore
+              upstream_name: vf-cloudstore
               branches: "master"
           template:
             type: workflow-scm
@@ -36,7 +46,7 @@
               credentials: "gerrit"
               script: git-mirror-2way-pipeline.groovy
               github:
-                url: "https://github.com/Mirantis/{{name}}-salt-model"
+                url: "https://github.com/Mirantis/{{upstream_name}}-salt-model"
             trigger:
               github:
               pollscm:
@@ -59,7 +69,7 @@
                 default: "${_param:jenkins_gerrit_url}/salt-models/{{name}}.git"
               TARGET_URL:
                 type: string
-                default: "git@github.com:Mirantis/{{name}}-salt-model.git"
+                default: "git@github.com:Mirantis/{{upstream_name}}-salt-model.git"
               CREDENTIALS_ID:
                 type: string
                 default: "gerrit"
diff --git a/jenkins/client/job/salt-models/tests.yml b/jenkins/client/job/salt-models/tests.yml
index 156a525..3b5f647 100644
--- a/jenkins/client/job/salt-models/tests.yml
+++ b/jenkins/client/job/salt-models/tests.yml
@@ -16,7 +16,7 @@
             - name: mcp-baremetal-lab
               extra_formulas: ""
             - name: mcp-virtual-lab
-              extra_formulas: "prometheus"
+              extra_formulas: "prometheus telegraf"
             - name: mk-ci
               extra_formulas: ""
             - name: qa
@@ -74,7 +74,7 @@
                 default: "gerrit"
               PARALLEL_NODE_GROUP_SIZE:
                 type: string
-                default: "3"
+                default: "1"
               # Salt master setup extra formulas
               EXTRA_FORMULAS:
                 type: string
@@ -160,4 +160,4 @@
                 default: master
               PARALLEL_NODE_GROUP_SIZE:
                 type: string
-                default: "3"
+                default: "1"
diff --git a/jenkins/client/job/test_devops_portal.yml b/jenkins/client/job/test_devops_portal.yml
index 5cf4c79..abe2a36 100644
--- a/jenkins/client/job/test_devops_portal.yml
+++ b/jenkins/client/job/test_devops_portal.yml
@@ -46,6 +46,7 @@
               default: |
                 npm run lint
                 npm run test:unit
+                npm run test:functional
             DEFAULT_GIT_URL:
                 type: string
                 default: "${_param:jenkins_gerrit_url}/oss/devops-portal"
diff --git a/jenkins/client/node.yml b/jenkins/client/node.yml
new file mode 100644
index 0000000..321951a
--- /dev/null
+++ b/jenkins/client/node.yml
@@ -0,0 +1,47 @@
+parameters:
+  _param:
+    jenkins_slave_executors: 4
+  jenkins:
+    client:
+      node:
+        master:
+          node_mode: Exclusive
+          remote_home: /var/lib/jenkins
+          launcher:
+            type: master
+        slave01:
+          remote_home: /var/lib/jenkins
+          desc: ""
+          num_executors: ${_param:jenkins_slave_executors}
+          node_mode: Normal
+          ret_strategy: Always
+          labels:
+            - python
+            - test
+            - docker
+          launcher:
+             type: jnlp
+        slave02:
+          remote_home: /var/lib/jenkins
+          desc: ""
+          num_executors: ${_param:jenkins_slave_executors}
+          node_mode: Normal
+          ret_strategy: Always
+          labels:
+            - python
+            - test
+            - docker
+          launcher:
+             type: jnlp
+        slave03:
+          remote_home: /var/lib/jenkins
+          desc: ""
+          num_executors: ${_param:jenkins_slave_executors}
+          node_mode: Normal
+          ret_strategy: Always
+          labels:
+            - python
+            - test
+            - docker
+          launcher:
+             type: jnlp