Merge "Add new job to build opencontrail"
diff --git a/apache/server/site/ironic.yml b/apache/server/site/ironic.yml
new file mode 100644
index 0000000..74173a0
--- /dev/null
+++ b/apache/server/site/ironic.yml
@@ -0,0 +1,11 @@
+parameters:
+  apache:
+    server:
+      site:
+        ironic:
+          name: 'ironic'
+          enabled: true
+          type: 'static'
+          root: '/var/www/httproot'
+          host:
+            name: ${linux:system:name}.${linux:system:domain}
diff --git a/designate/server/backend/bind.yml b/designate/server/backend/bind.yml
index 2b40424..c057eb7 100644
--- a/designate/server/backend/bind.yml
+++ b/designate/server/backend/bind.yml
@@ -1,15 +1,18 @@
 parameters:
+  _param:
+    designate_bind9_rndc_algorithm: hmac-sha512
   designate:
     server:
       backend:
         bind9:
           rndc_key: "${_param:designate_bind9_rndc_key}"
+          rndc_algorithm: "${_param:designate_bind9_rndc_algorithm}"
   bind:
     server:
       key:
         designate:
           secret: "${_param:designate_bind9_rndc_key}"
-          algorithm: hmac-sha512
+          algorithm: "${_param:designate_bind9_rndc_algorithm}"
       allow_new_zones: true
       query: true
       control:
@@ -33,4 +36,4 @@
       key:
         designate:
           secret: "${_param:designate_bind9_rndc_key}"
-          algorithm: hmac-sha512
+          algorithm: "${_param:designate_bind9_rndc_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/monitoring.yml b/docker/swarm/stack/monitoring.yml
index 4371367..7c03c35 100644
--- a/docker/swarm/stack/monitoring.yml
+++ b/docker/swarm/stack/monitoring.yml
@@ -15,6 +15,23 @@
               driver_opts:
                 encrypted: 1
           service:
+            remote_agent:
+              networks:
+                - monitoring
+              deploy:
+                replicas: 1
+                labels:
+                  com.mirantis.monitoring: "remote_agent"
+                restart_policy:
+                  condition: any
+              labels:
+                com.mirantis.monitoring: "remote_agent"
+              image: ${_param:docker_image_remote_agent}
+              ports:
+                - 15014:${telegraf:remote_agent:output:prometheus_client:bind:port}
+              volumes:
+                - ${telegraf:remote_agent:dir:config}:/etc/telegraf
+                - ${telegraf:remote_agent:dir:config_d}:/etc/telegraf/telegraf.d
             alertmanager:
               networks:
                 - monitoring
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/galera/server/database/ironic.yml b/galera/server/database/ironic.yml
new file mode 100644
index 0000000..8cb14a3
--- /dev/null
+++ b/galera/server/database/ironic.yml
@@ -0,0 +1,15 @@
+parameters:
+  mysql:
+    server:
+      database:
+        ironic:
+          encoding: utf8
+          users:
+          - name: ironic
+            password: ${_param:mysql_ironic_password}
+            host: '%'
+            rights: all
+          - name: ironic
+            password: ${_param:mysql_ironic_password}
+            host: ${_param:cluster_local_address}
+            rights: all
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/haproxy/proxy/listen/mysql.yml b/haproxy/proxy/listen/mysql.yml
index a7ef910..40a9f35 100644
--- a/haproxy/proxy/listen/mysql.yml
+++ b/haproxy/proxy/listen/mysql.yml
@@ -7,7 +7,7 @@
       listen:
         mysql:
           mode: tcp
-          balance: source
+          balance: first
           binds:
             - address: ${_param:haproxy_bind_address}
               port: ${_param:haproxy_mysql_bind_port}
diff --git a/haproxy/proxy/listen/openstack/galera.yml b/haproxy/proxy/listen/openstack/galera.yml
index 254dc3b..7298cfc 100644
--- a/haproxy/proxy/listen/openstack/galera.yml
+++ b/haproxy/proxy/listen/openstack/galera.yml
@@ -11,6 +11,7 @@
         mysql_cluster:
           type: mysql
           service_name: mysql
+          balance: first
           binds:
           - address: ${_param:cluster_vip_address}
             port: 3306
diff --git a/haproxy/proxy/listen/openstack/ironic.yml b/haproxy/proxy/listen/openstack/ironic.yml
new file mode 100644
index 0000000..221a9cc
--- /dev/null
+++ b/haproxy/proxy/listen/openstack/ironic.yml
@@ -0,0 +1,25 @@
+parameters:
+  haproxy:
+    proxy:
+      listen:
+        ironic:
+          type: general-service
+          service_name: ironic
+          check: false
+          binds:
+          - address: ${_param:cluster_vip_address}
+            port: 6385
+          servers:
+          - name: ctl01
+            host: ${_param:cluster_node01_address}
+            port: 6385
+            params: check
+          - name: ctl02
+            host: ${_param:cluster_node02_address}
+            port: 6385
+            params: check
+          - name: ctl03
+            host: ${_param:cluster_node03_address}
+            port: 6385
+            params: check
+
diff --git a/ironic/api/cluster.yml b/ironic/api/cluster.yml
new file mode 100644
index 0000000..c476c40
--- /dev/null
+++ b/ironic/api/cluster.yml
@@ -0,0 +1,9 @@
+classes:
+- service.ironic.api.cluster
+parameters:
+  ironic:
+    api:
+      enabled: true
+      version: ${_param:ironic_version}
+      bind:
+        address: ${_param:cluster_local_address}
diff --git a/ironic/api/single.yml b/ironic/api/single.yml
new file mode 100644
index 0000000..0800579
--- /dev/null
+++ b/ironic/api/single.yml
@@ -0,0 +1,7 @@
+classes:
+- service.ironic.api.single
+parameters:
+  ironic:
+    api:
+      bind:
+        address: ${_param:single_address}
diff --git a/ironic/conductor/cluster.yml b/ironic/conductor/cluster.yml
new file mode 100644
index 0000000..ad4666f
--- /dev/null
+++ b/ironic/conductor/cluster.yml
@@ -0,0 +1,6 @@
+classes:
+- service.ironic.conductor.cluster
+parameters:
+  ironic:
+    conductor:
+      api_url: 'http://${_param:cluster_vip_address}'
diff --git a/ironic/conductor/single.yml b/ironic/conductor/single.yml
new file mode 100644
index 0000000..69e6c20
--- /dev/null
+++ b/ironic/conductor/single.yml
@@ -0,0 +1,7 @@
+classes:
+- service.ironic.conductor.single
+parameters:
+  ironic:
+    conductor:
+      enabled: true
+      version: ${_param:ironic_version}
diff --git a/ironic/tftpd_hpa.yml b/ironic/tftpd_hpa.yml
new file mode 100644
index 0000000..fc1dd74
--- /dev/null
+++ b/ironic/tftpd_hpa.yml
@@ -0,0 +1,14 @@
+classes:
+  - service.tftpd_hpa.server.single
+parameters:
+  tftpd_hpa:
+    server:
+      enabled: true
+      bind:
+        address: '0.0.0.0'
+        port: 69
+      username: 'ironic'
+      path: /var/lib/tftpboot
+      options:
+       - secure
+       - map-file: '/var/lib/tftpboot/map-file'
diff --git a/jenkins/client/job/debian/packages/salt-multi.yml b/jenkins/client/job/debian/packages/salt-multi.yml
index d216e9d..85b95c7 100644
--- a/jenkins/client/job/debian/packages/salt-multi.yml
+++ b/jenkins/client/job/debian/packages/salt-multi.yml
@@ -25,6 +25,8 @@
               dist: trusty
             - name: swift
               dist: trusty
+            - name: ironic
+              dist: trusty
             - name: ceilometer
               dist: xenial
             - name: cinder
@@ -45,6 +47,8 @@
               dist: xenial
             - name: swift
               dist: xenial
+            - name: ironic
+              dist: xenial
           template:
             discard:
               build:
@@ -117,4 +121,4 @@
                 default: 'true'
               UPLOAD_APTLY:
                 type: boolean
-                default: 'true'
\ No newline at end of file
+                default: 'true'
diff --git a/jenkins/client/job/debian/packages/salt.yml b/jenkins/client/job/debian/packages/salt.yml
index ecd7432..1fbee1e 100644
--- a/jenkins/client/job/debian/packages/salt.yml
+++ b/jenkins/client/job/debian/packages/salt.yml
@@ -129,6 +129,8 @@
               dist: trusty
             - name: ntp
               dist: trusty
+            - name: octavia
+              dist: trusty
             - name: opencontrail
               dist: trusty
             - name: openldap
@@ -189,6 +191,8 @@
               dist: trusty
             - name: varnish
               dist: trusty
+            - name: xtrabackup
+              dist: trusty
             - name: zookeeper
               dist: trusty
             - name: aodh
@@ -315,6 +319,8 @@
               dist: xenial
             - name: ntp
               dist: xenial
+            - name: octavia
+              dist: xenial
             - name: opencontrail
               dist: xenial
             - name: openldap
@@ -375,6 +381,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..a79414b 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.
@@ -54,6 +59,9 @@
               STACK_REUSE:
                 type: boolean
                 default: 'false'
+              STACK_COMPUTE_COUNT:
+                type: string
+                default: '2'
 
               STACK_TEMPLATE_URL:
                 type: string
@@ -66,7 +74,7 @@
                 default: "master"
               STACK_CLEANUP_JOB:
                 type: string
-                default: ''
+                default: 'deploy-stack-cleanup'
 
               # salt master
               SALT_MASTER_CREDENTIALS:
@@ -104,12 +112,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 +144,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/init.yml b/jenkins/client/job/deploy/update/init.yml
index a65d440..ba3383a 100644
--- a/jenkins/client/job/deploy/update/init.yml
+++ b/jenkins/client/job/deploy/update/init.yml
@@ -3,3 +3,5 @@
   - system.jenkins.client.job.deploy.update.config
   - system.jenkins.client.job.deploy.update.saltenv
   - system.jenkins.client.job.deploy.update.upgrade
+  - system.jenkins.client.job.deploy.update.upgrade_compute
+  - system.jenkins.client.job.deploy.update.restore_mysql
\ No newline at end of file
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..cf39dbd 100644
--- a/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
+++ b/jenkins/client/job/salt-formulas/git-mirrors/2way.yml
@@ -48,6 +48,7 @@
             - name: horizon
             - name: influxdb
             - name: iptables
+            - name: ironic
             - name: isc-dhcp
             - name: java
             - name: jenkins
@@ -77,6 +78,7 @@
             - name: nodejs
             - name: nova
             - name: ntp
+            - name: octavia
             - name: opencontrail
             - name: openldap
             - name: openssh
@@ -106,6 +108,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..68792d4 100644
--- a/jenkins/client/job/salt-formulas/tests.yml
+++ b/jenkins/client/job/salt-formulas/tests.yml
@@ -47,6 +47,7 @@
             - name: horizon
             - name: influxdb
             - name: iptables
+            - name: ironic
             - name: isc-dhcp
             - name: java
             - name: jenkins
@@ -76,6 +77,7 @@
             - name: nodejs
             - name: nova
             - name: ntp
+            - name: octavia
             - name: opencontrail
             - name: openldap
             - name: openssh
@@ -107,6 +109,7 @@
             - name: telegraf
             - name: tftpd-hpa
             - name: varnish
+            - name: xtrabackup
             - name: zookeeper
           template:
             discard:
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
diff --git a/keystone/client/core.yml b/keystone/client/core.yml
new file mode 100644
index 0000000..0614f40
--- /dev/null
+++ b/keystone/client/core.yml
@@ -0,0 +1,32 @@
+parameters:
+  linux:
+    system:
+      job:
+        keystone_job_rotate:
+          command: '/usr/bin/keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone >> /var/log/key_rotation_log 2>> /var/log/key_rotation_log'
+          enabled: true
+          user: root
+          minute: 0
+  keystone:
+    client:
+      enabled: true
+      server:
+        identity:
+          admin:
+            host: ${_param:keystone_service_host}
+            port: 35357
+            token: ${_param:keystone_service_token}
+          roles:
+          - admin
+          - Member
+          project:
+            service:
+              description: "OpenStack Service tenant"
+            admin:
+              description: "OpenStack Admin tenant"
+              user:
+                admin:
+                  is_admin: true
+                  password: ${_param:keystone_admin_password}
+                  email: ${_param:admin_email}
+
diff --git a/keystone/client/service/ironic.yml b/keystone/client/service/ironic.yml
new file mode 100644
index 0000000..7635e2c
--- /dev/null
+++ b/keystone/client/service/ironic.yml
@@ -0,0 +1,30 @@
+parameters:
+  _param:
+    cluster_public_protocol: https
+  keystone:
+    client:
+      server:
+        identity:
+          project:
+            service:
+              user:
+                ironic:
+                  is_admin: true
+                  password: ${_param:keystone_ironic_password}
+                  email: ${_param:admin_email}
+          service:
+            ironic:
+              type: baremetal
+              description: OpenStack Baremetal Service
+              endpoints:
+              - region: ${_param:openstack_region}
+                public_address: ${_param:cluster_public_host}
+                public_protocol: ${_param:cluster_public_protocol}
+                public_port: 6385
+                public_path: ''
+                internal_address: ${_param:ironic_service_host}
+                internal_port: 6385
+                internal_path: ''
+                admin_address: ${_param:ironic_service_host}
+                admin_port: 6385
+                admin_path: ''
diff --git a/keystone/client/service/keystone3.yml b/keystone/client/service/keystone3.yml
index 9dd9eef..cc385f2 100644
--- a/keystone/client/service/keystone3.yml
+++ b/keystone/client/service/keystone3.yml
@@ -6,7 +6,7 @@
       server:
         identity:
           service:
-            keystone3:
+            keystone:
               type: identity
               description: OpenStack Identity Service v3
               endpoints:
diff --git a/maas/region/single.yml b/maas/region/single.yml
index 569d475..d3227ca 100644
--- a/maas/region/single.yml
+++ b/maas/region/single.yml
@@ -2,15 +2,42 @@
   - service.maas.region.single
   - service.maas.region.vendor_repo
 parameters:
+  _param:
+    maas_admin_username: mirantis
   maas:
+    cluster:
+      enabled: true
+      role: master
+      region:
+        host: ${_param:single_address}
+        port: 5242
     region:
+      salt_master_ip: ${_param:infra_config_deploy_address}
       theme: mirantis
       enable_iframe: True
       bind:
-        host: ${_param:cluster_vip_address}
+        host: ${_param:single_address}
+      admin:
+        username: ${_param:maas_admin_username}
+        password: ${_param:maas_admin_password}
+        email:  email@example.com
       database:
         engine: postgresql
-        host: 10.0.175.10
+        host: localhost
         name: maasdb
-        password: password
-        username: maas
\ No newline at end of file
+        password: ${_param:maas_db_password}
+        username: maas
+      maas_config:
+        commissioning_distro_series: xenial
+        default_distro_series: xenial
+        default_osystem: 'ubuntu'
+        default_storage_layout: lvm
+        disk_erase_with_secure_erase: true
+        dnssec_validation: 'no'
+        enable_third_party_drivers: true
+        maas_name: mas01
+        active_discovery_interval: '600'
+        ntp_external_only: true
+        upstream_dns: ${_param:dns_server01}
+        enable_http_proxy: false
+        default_min_hwe_kernel: ''
diff --git a/mysql/client/database/ironic.yml b/mysql/client/database/ironic.yml
new file mode 100644
index 0000000..e142e64
--- /dev/null
+++ b/mysql/client/database/ironic.yml
@@ -0,0 +1,18 @@
+parameters:
+  mysql:
+    client:
+      server:
+        database:
+          database:
+            ironic:
+              encoding: utf8
+              users:
+              - name: ironic
+                password: ${_param:mysql_ironic_password}
+                host: '%'
+                rights: all
+              - name: ironic
+                password: ${_param:mysql_ironic_password}
+                host: ${_param:cluster_local_address}
+                rights: all
+
diff --git a/neutron/client/service/ironic.yml b/neutron/client/service/ironic.yml
new file mode 100644
index 0000000..c400f96
--- /dev/null
+++ b/neutron/client/service/ironic.yml
@@ -0,0 +1,19 @@
+parameters:
+  neutron:
+    client:
+      enabled: true
+      server:
+        admin_identity:
+          endpoint_type: internalURL
+          network:
+            baremetal-flat-network:
+              tenant: admin
+              shared: True
+              admin_state_up: True
+              provider_network_type: flat
+              provider_physical_network: physnet1
+              port_security_enabled: false
+              subnet:
+                baremetal-subnet:
+                  cidr: 192.168.90.0/24
+                  enable_dhcp: true
diff --git a/openssh/server/team/stacklight.yml b/openssh/server/team/stacklight.yml
index 6d55bee..8e28534 100644
--- a/openssh/server/team/stacklight.yml
+++ b/openssh/server/team/stacklight.yml
@@ -186,7 +186,7 @@
     ityaptin:
       key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDLTkl8X9HIJxruAHkmGNQTovy7DCr256pH68xh2DHWinPKUW4ccsCBbqJeF56aEA41OKJlEVOYzD3gQJkDAAbDdy9BlI14oEtzmk3yAtgBwwUzUNMq7oCPrbt4xNg5U26JSb26j69r5vQ4vXA2hf0bCQ68vb3VDqMMaMbneI3rP3qSaq7dauR8sEjx1XAtNen5SygLE46k0pCObJmahGkg39HisoJ/gkjoi/xvQn1JzrYSxWObrBfUbtQN3JbCRozSp/0Env0hMbXj7cS3J/uY68zAWc7GAEFKSmPAol4d/93sRknFUSQKqZjsDaLfiGLte/7oFwLquaz6AJw+mwP ityaptin@ityaptin.local
     isvetlov:
-      key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDflz5rJEC6+yKOteNG2uzObQCtV/c/Rnu9Aku1AJWLMMlouID7RaCUrP642xH2z11kZE+sZk/4c3515M5SPQFVKhjGceftbnI9I7DI1KF4OJwMCSfmACDHM3bJcld8eiKTRBxtk32i6YPdNi6m9unHvPultTIBJCxRP/KVyxOOnQparsSSBhBj2t3Kis+3dnDZNBUJJDWyo69FD0RvAOaWZdogwes0nCl+3JJSNWsATqyS+bi4ojqJimHFKiW2sz8qMX3cMzu9uTx1OWvJWJRgOV5/tPsuuNVt75zPAOsfJnIqQJtpkdZAb4SYK+0jLFcLvB6GBgXY3aHk9nHu9MHr isvetlov@ubuntu
+      key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9lvegjKq6OP7cgF9YU9mPOk1/mfJbov3YnYnhiW1Ks0hrWZyAo+0TV3O7LgWZ8jqD9abbYaOiWCt4d9ABkLUJfCLNAqOJRapJ+tybPAxJKx4eV8pptJ7UF0EdItasTdd+gqJJ4Krk869rwmqVQ4hethdykjhKyWu3bG+uVtFUF5xUj9zaT9NThA6/Xhz0idAiTO8ArmLng4W8ne45gANaHIWXpIsklo6GLUSZwl4z6j2z4joxNJsB1hrw0msT56F26ctkDo6thNMAzPMyZsLjYJBJIRYhdC1d4Up9114nVcY4pzYw76+zXU9zED2XNRLdyAaxFlwXvumAs3iMLI8Z isvetlov@isvetlov-mac.local
     akholkin:
       key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDjpy9RI6iEDH/04eOOwreDa+R32USZiWxyFiKHa8zoDAlOfwaZVg6mZWepOxzwxCJPYusPGXCwQ6Zw9tHxVWOCgtzzPpsCCfhUU4v+99Wh08//W8d/s/WFka+5vqyskAO5Z8Ekk+kQU+jpUBG8/gMxAPBjj0fFc5BNeqDY9r9nmMNK6N2RVjvA6wZ8G5hLGxL9bn5Prhf/+avui1NAfy6gsT/mRt1W+eHWTvpijyNGm+m83jU34dQO6gE48n6WdSylLh/fY/p31rzAURaq1V/AZhdbSuZ8aJYDnfHevpK5+hMjoOop3v3hb7WHEmybGujQfW5HVaaWmG7SFlHeKGE/gZ2P9T+bQ+SgO+PmEAw4LayiBkzTPAHdZ2UGZe+3BI5gdM/ayovK2WVO1jS5FNlNGIvEQW+ws9V+ph+S1jL4jobDJEjs358iXrAYpf4JL+LvxFHiuj6EL51tbo8EU22z5mmgRQQ5eFrDzBuVLhcim651A3a5iSlmCeAQ5rTmHX/Op/PbK+3vAtI8vnlK4AhycLvWQ3kK2DRx+Uhzrlk5v6E14SopAhvpGOHqrLgmoHwHp1xt/9M1JgxkOUK5gccFKTQduxLHoTNBaNcP60IOG/MjqUPcOXSBcAN4Y1RDBg+pwXe4PFgOzwKdFoYeuhvtm8y185S0IvvfCHLCD8pNfQ== akholkin@mirantis.com
     kszukielojc:
diff --git a/prometheus/server/target/dns.yml b/prometheus/server/target/dns.yml
index 7bbf92e..ed6602d 100644
--- a/prometheus/server/target/dns.yml
+++ b/prometheus/server/target/dns.yml
@@ -20,3 +20,8 @@
               - 'tasks.monitoring_alertmanager'
               type: A
               port: ${prometheus:alertmanager:bind:port}
+            - name: 'remote_agent'
+              domain:
+              - 'tasks.monitoring_remote_agent'
+              type: A
+              port: ${telegraf:remote_agent:output:prometheus_client:bind:port}
diff --git a/reclass/storage/system/infra_maas_single.yml b/reclass/storage/system/infra_maas_single.yml
new file mode 100644
index 0000000..eb5a96b
--- /dev/null
+++ b/reclass/storage/system/infra_maas_single.yml
@@ -0,0 +1,16 @@
+parameters:
+  _param:
+    infra_maas_node01_hostname: mas01
+  reclass:
+    storage:
+      node:
+        infra_maas_node01:
+          name: ${_param:infra_maas_node01_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.maas
+          params:
+            salt_master_host: ${_param:infra_config_deploy_address}
+            linux_system_codename: xenial
+            single_address: ${_param:infra_maas_node01_deploy_address}
+
diff --git a/salt/control/cluster/infra_maas_single.yml b/salt/control/cluster/infra_maas_single.yml
new file mode 100644
index 0000000..d8675e8
--- /dev/null
+++ b/salt/control/cluster/infra_maas_single.yml
@@ -0,0 +1,20 @@
+parameters:
+  salt:
+    control:
+      size:
+        infra.maas:
+          cpu: 4
+          ram: 8192
+          disk_profile: small
+          net_profile: default
+      cluster:
+        internal:
+          domain: ${_param:cluster_domain}
+          engine: virt
+          node:
+            mas01:
+              name: ${_param:infra_maas_node01_hostname}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              image: ${_param:salt_control_xenial_image}
+              size: infra.maas
+
diff --git a/salt/master/formula/git/openstack.yml b/salt/master/formula/git/openstack.yml
index 36ddfc2..9173a4a 100644
--- a/salt/master/formula/git/openstack.yml
+++ b/salt/master/formula/git/openstack.yml
@@ -92,6 +92,10 @@
               source: git
               address: '${_param:salt_master_environment_repository}/salt-formula-nova.git'
               revision: ${_param:salt_master_environment_revision}
+            octavia:
+              source: git
+              address: '${_param:salt_master_environment_repository}/salt-formula-octavia.git'
+              revision: ${_param:salt_master_environment_revision}
             opencontrail:
               source: git
               address: '${_param:salt_master_environment_repository}/salt-formula-opencontrail.git'
diff --git a/salt/master/formula/pkg/openstack.yml b/salt/master/formula/pkg/openstack.yml
index b1222d1..827f096 100644
--- a/salt/master/formula/pkg/openstack.yml
+++ b/salt/master/formula/pkg/openstack.yml
@@ -70,6 +70,9 @@
             nova:
               source: pkg
               name: salt-formula-nova
+            octavia:
+              source: pkg
+              name: salt-formula-octavia
             opencontrail:
               source: pkg
               name: salt-formula-opencontrail
diff --git a/telegraf/agent/remote.yml b/telegraf/agent/remote.yml
new file mode 100644
index 0000000..ecbae25
--- /dev/null
+++ b/telegraf/agent/remote.yml
@@ -0,0 +1,16 @@
+classes:
+- service.telegraf.agent.remote
+parameters:
+  telegraf:
+    remote_agent:
+      dir:
+        config: /srv/volumes/local/telegraf
+        config_d: /srv/volumes/local/telegraf/telegraf.d
+      input:
+        internal:
+      output:
+        prometheus_client:
+          bind:
+            address: 0.0.0.0
+            port: 9126
+          engine: prometheus
diff --git a/xtrabackup/client/single.yml b/xtrabackup/client/single.yml
new file mode 100644
index 0000000..cbe1123
--- /dev/null
+++ b/xtrabackup/client/single.yml
@@ -0,0 +1,3 @@
+classes:
+- service.xtrabackup.client.single
+- system.openssh.client.root
\ No newline at end of file
diff --git a/xtrabackup/server/single.yml b/xtrabackup/server/single.yml
new file mode 100644
index 0000000..d1d54fd
--- /dev/null
+++ b/xtrabackup/server/single.yml
@@ -0,0 +1,2 @@
+classes:
+- service.xtrabackup.server.single