Add cid nodes into offline pike dpdk

Change-Id: I8c08f0f674537b6215b82f5b4b4edec76adb1b0b
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/init.yml
new file mode 100644
index 0000000..36c6046
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/init.yml
@@ -0,0 +1,91 @@
+classes:
+  - system.linux.system.haveged
+  - system.linux.system.repo_local.mcp.apt_mirantis.docker
+  - system.linux.system.repo_local.mcp.extra
+  - system.linux.system.repo.mcp.apt_mirantis.ubuntu
+  - system.linux.system.repo.mcp.apt_mirantis.glusterfs
+  - system.linux.system.repo.mcp.apt_mirantis.saltstack
+  - system.glusterfs.client.cluster
+  - system.glusterfs.client.volume.aptly
+  - system.glusterfs.client.volume.gerrit
+  - system.glusterfs.client.volume.jenkins
+  - system.glusterfs.client.volume.registry
+  - system.glusterfs.client.volume.salt_pki
+  - system.glusterfs.client.volume.mysql
+  - system.glusterfs.client.volume.openldap
+ #- system.glusterfs.client.volume.salt
+  # Docker
+  - system.docker.host
+
+  # Generate aptly-publisher config to use for jenkins slaves
+  - system.aptly.client.publisher
+
+  # Keepalived
+  - system.keepalived.cluster.instance.cicd_control_vip
+
+  # HAProxy
+  - system.salt.minion.cert.proxy.cicd
+  - system.haproxy.proxy.single
+  - system.haproxy.proxy.listen.cicd.aptly
+  - system.haproxy.proxy.listen.cicd.gerrit
+  - system.haproxy.proxy.listen.cicd.jenkins
+  - system.haproxy.proxy.listen.docker.registry
+  - system.haproxy.proxy.listen.docker.visualizer
+  - system.haproxy.proxy.listen.openldap
+  - system.haproxy.proxy.listen.phpldapadmin
+  - system.haproxy.proxy.listen.mysql
+  - system.haproxy.proxy.listen.stats
+  - cluster.virtual-offline-pike-ovs-dpdk.infra
+parameters:
+  _param:
+    apt_mk_version: proposed
+    admin_email: root@localhost
+    cluster_node01_name: ${_param:cicd_control_node01_hostname}
+    cluster_node01_address: ${_param:cicd_control_node01_address}
+    cluster_node02_name: ${_param:cicd_control_node02_hostname}
+    cluster_node02_address: ${_param:cicd_control_node02_address}
+    cluster_node03_name: ${_param:cicd_control_node03_hostname}
+    cluster_node03_address: ${_param:cicd_control_node03_address}
+    keepalived_vip_virtual_router_id: 180
+    keepalived_vip_password: r00tme
+    keepalived_vip_interface: ens4
+    cluster_vip_address: ${_param:control_vip_address}
+    control_vip_address: ${_param:cicd_control_address}
+    jenkins_slave_user_id: 10000
+    jenkins_slave_group_id: ${_param:jenkins_slave_user_id}
+    # Docker images and versions
+    docker_registry_http_secret: aikemee4AhK0Eechai2eh6aa3eeWiet9
+    # CI/CD service databases
+    mysql_admin_password: r00tme
+    mysql_gerrit_password: r00tme
+    nginx_proxy_gerrit_server_site_host: ${_param:cluster_public_host}
+    nginx_proxy_gerrit_server_site_port: 8070
+    gerrit_http_listen_url: proxy-https://*:8080/
+    gerrit_pipeline_library_repo: http://${_param:aptly_server_address}:8088/pipeline-library.git
+    gerrit_mk_pipelines_repo: http://${_param:aptly_server_address}:8088/mk-pipelines.git
+    # Proxy
+    cluster_ssl_certificate:
+      enabled: true
+      pem_file: /etc/haproxy/ssl/${_param:cluster_public_host}-all.pem
+    haproxy_bind_address: ${_param:cluster_vip_address}
+    haproxy_mysql_source_port: 13306
+  aptly:
+    publisher:
+      source:
+        registry: ${_param:aptly_server_address}:5000
+        image: aptly-publisher:${_param:apt_mk_version}
+  docker:
+    host:
+      insecure_registries:
+        - ${_param:aptly_server_address}:5000
+  linux:
+    system:
+      package:
+        ca-certificates-java:
+          version: latest
+      directory:
+         /var/lib/jenkins/:
+            user: ${_param:jenkins_slave_user_id}
+            group: ${_param:jenkins_slave_group_id}
+
+
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/leader.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/leader.yml
new file mode 100644
index 0000000..fbaf2c0
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/leader.yml
@@ -0,0 +1,77 @@
+classes:
+  - service.python.environment
+  # Services
+  - system.docker.client
+  # Docker services
+  - system.docker.swarm.stack.docker
+  - system.docker.swarm.stack.gerrit
+  - system.docker.swarm.stack.jenkins
+  - system.docker.swarm.stack.ldap
+  # Jenkins
+  - system.jenkins.client
+  - system.jenkins.client.credential.gerrit
+  - system.jenkins.client.credential.salt
+  # Jobs
+  - system.jenkins.client.job.aptly
+  - system.jenkins.client.job.git-mirrors.downstream.pipelines
+  - system.jenkins.client.job.deploy.openstack
+  - system.jenkins.client.job.deploy.update
+  - system.jenkins.client.job.validate
+  # Security
+  - system.jenkins.client.security.ldap
+  - system.jenkins.client.security.matrix
+  # Slaves
+  - system.jenkins.client.node
+  # OpenLDAP
+  - system.openldap.client
+  - system.openldap.client.people.admin
+
+  # Gerrit
+  - system.gerrit.client
+  - system.gerrit.client.project.ci
+
+  - system.docker.swarm.master
+
+  - cluster.virtual-offline-pike-ovs-dpdk.cicd.control
+
+parameters:
+  linux:
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+
+  _param:
+    # Jenkins
+    jenkins_slave_user: admin
+    jenkins_client_user: admin
+    jenkins_slave_password: ${_param:jenkins_admin_password}
+    jenkins_client_password: ${_param:jenkins_admin_password}
+    jenkins_admin_email: ${_param:admin_email}
+    aptly_api_port: 8080
+    aptly_public_port: 80
+    #jenkins_admin_public_key: ${_param:jenkins_admin_public_key_generated}
+    #jenkins_admin_private_key: ${_param:jenkins_admin_private_key_generated}
+    # Jobs params
+    jenkins_gerrit_url: ssh://admin@${_param:haproxy_gerrit_bind_host}:${_param:haproxy_gerrit_ssh_bind_port}
+    jenkins_offline_deployment: "true"
+    jenkins_aptly_api_url: http://${_param:aptly_server_address}:${_param:aptly_api_port}
+    jenkins_aptly_url: http://${_param:aptly_server_address}:${_param:aptly_public_port}
+    jenkins_aptly_storages: "local"
+
+    # Gerrit
+    gerrit_admin_email: ${_param:admin_email}
+    gerrit_public_host: https://${_param:nginx_proxy_gerrit_server_site_host}:${_param:nginx_proxy_gerrit_server_site_port}
+    gerrit_admin_public_key: ${_param:jenkins_admin_public_key}
+    gerrit_admin_private_key: ${_param:jenkins_admin_private_key}
+    gerrit_auth_type: LDAP
+    gerrit_ldap_server: "ldap://${_param:cluster_vip_address}"
+    gerrit_ldap_bind_user: "cn=admin,${_param:openldap_dn}"
+    gerrit_ldap_bind_password: ${_param:openldap_admin_password}
+    gerrit_ldap_account_base: ou=people,${_param:openldap_dn}
+    gerrit_ldap_group_base: ou=groups,${_param:openldap_dn}
+
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/manager.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/manager.yml
new file mode 100644
index 0000000..4f1db94
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/control/manager.yml
@@ -0,0 +1,13 @@
+classes:
+  - system.docker.swarm.manager
+  - cluster.virtual-offline-pike-ovs-dpdk.cicd.control
+parameters:
+  linux:
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
\ No newline at end of file
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/init.yml
new file mode 100644
index 0000000..f0e2416
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/init.yml
@@ -0,0 +1,158 @@
+parameters:
+  _param:
+    cicd_control_address: 172.16.10.80
+    cicd_control_node01_address: 172.16.10.91
+    cicd_control_node02_address: 172.16.10.92
+    cicd_control_node03_address: 172.16.10.93
+    cicd_control_hostname: cid
+    cicd_control_node01_hostname: cid01
+    cicd_control_node02_hostname: cid02
+    cicd_control_node03_hostname: cid03
+    salt_minion_ca_host: cid01.${_param:cluster_domain}
+    git_pipeline_library_upstream: http://${_param:aptly_server_address}:8088/pipeline-library
+    git_mk_pipelines_upstream: http://${_param:aptly_server_address}:8088/Mirantis/mk-pipelines
+    control_vip_address: 172.16.10.254
+    glusterfs_service_host: ${_param:control_vip_address}
+    docker_image_registry: ${_param:aptly_server_address}:5000/mirantis/external/registry:${_param:apt_mk_version}
+    docker_image_compose: ${_param:aptly_server_address}:5000/mirantis/external/compose:${_param:apt_mk_version}
+    docker_image_visualizer: ${_param:aptly_server_address}:5000/mirantis/external/visualizer:${_param:apt_mk_version}
+    docker_image_gerrit: ${_param:aptly_server_address}:5000/mirantis/cicd/gerrit:${_param:apt_mk_version}
+    docker_image_mysql: ${_param:aptly_server_address}:5000/mirantis/cicd/mysql:${_param:apt_mk_version}
+    docker_image_jenkins: ${_param:aptly_server_address}:5000/mirantis/cicd/jenkins:${_param:apt_mk_version}
+    docker_image_jenkins_slave: ${_param:aptly_server_address}:5000/mirantis/cicd/jnlp-slave:${_param:apt_mk_version}
+    docker_image_openldap: ${_param:aptly_server_address}:5000/mirantis/external/openldap:${_param:apt_mk_version}
+    docker_image_phpldapadmin: ${_param:aptly_server_address}:5000/mirantis/cicd/phpldapadmin:${_param:apt_mk_version}
+    aptly_publisher_image: ${_param:aptly_server_address}:5000/mirantis/cicd/aptly-publisher:${_param:apt_mk_version}
+    docker_image_aptly:
+      base: ${_param:aptly_server_address}:5000/mirantis/cicd/aptly:${_param:apt_mk_version}
+      api: ${_param:aptly_server_address}:5000/mirantis/cicd/aptly-api:${_param:apt_mk_version}
+      public: ${_param:aptly_server_address}:5000/mirantis/cicd/aptly-public:${_param:apt_mk_version}
+    # OpenLDAP
+    openldap_organisation: "${_param:cluster_name}"
+    openldap_dn: "dc=virtual-offline-pike-ovs-dpdk,dc=local"
+    openldap_domain: "virtual-offline-pike-ovs-dpdk.local"
+    openldap_admin_password: r00tme
+    openldap_config_password: r00tme
+    openldap_readonly_password: r00tme
+    # Jenkins
+    jenkins_admin_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3hnJDKW4R+aXxdaSJSQmV4a6tRmRI1CECkccApr0h15dXGhgeRyrtMsXKpVkQpweQX+75rJHVcNvHpCsR3wLhS/vgOowQh+Xc7bvl9MzoYBGUw5VZyRD4HoHrp2FEUHQqwnOYubFdHBnOi6HZDdf1axFzjmymQX/XvuAd4vCmtW/wumaJ6tH/VlM57ik5jsWwKQIQZl7ODmlGusycuD5QEPade+cHEijGbLtRyMrP+BFJAzVmav2jeu1CtLD8AaKHB+mtfbHYhFkYhLlmFenztbB9S2kJhuSDjB4c8Xxj3N0O1rhKAJPi2o4LS8boa38EnTz55wq02/DxNMSgs9H0BFKK5qRuhaG4GBvwYC9HR/uzH4abFdNAr2kBLMbAo49qwJL4dfyY87T3JLSEUpg1Ycr31A2e1v8kBOCMipFOkOwlVm1F2P178YJmCcIl2NnzIvfI7SKvVgjgmoxfDZu55CMqf+W6hlMrchhGvXmTDFNfW7cr8ak4GCgZLUIkzWPRcgfwLN+328JhCgGeHfSkQBzMD4sZR0yw3Pc939gMXkRIsfDNnTJ8qZTDkiYfktUt3pRp8AudqQ++cf95nf2lTOyGehXkn7oHGAQfJ9mlSOTTM/e9shtT+jqsB5HW0BRVqtsm7cvyhYKQZCfWOhInBg4hfK5rJVGjCSLckTa4jQ==
+    jenkins_admin_private_key: |
+      -----BEGIN RSA PRIVATE KEY-----
+      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
+      -----END RSA PRIVATE KEY-----
+    jenkins_admin_password: ${_param:openldap_admin_password}
+    jenkins_security_ldap_server: ${_param:cicd_control_address}
+    salt_api_password: 'hovno12345!'
+    jenkins_security_ldap_root_dn: ${_param:openldap_dn}
+    jenkins_security_ldap_manager_dn: "cn=admin,${_param:openldap_dn}"
+    jenkins_security_ldap_manager_password: ${_param:openldap_admin_password}
+    # Gerrit
+    gerrit_admin_password: ${_param:openldap_admin_password}
+
+    # Aptly
+    aptly_gpg_keypair_id: none
+    aptly_gpg_passphrase: none
+    aptly_server_secure: false
+    aptly_gpg_private_key: none
+    aptly_gpg_public_key: |
+      -----BEGIN PGP PUBLIC KEY BLOCK-----
+      Version: GnuPG v1
+
+      mQENBFnU98YBCACdTxOkxAJJQaQ4B9sEsh9s4MMOMxPSCwvzgGbk6HECDBhz2auF
+      FfVydNbjLfoih8qdaLSmBQg8+FtdYJHEG1lekeiUETOxJnkhUFXq85KGNj9BbGBr
+      m3/6Jo58pdMNdUMurAs807STvH3iTAhYymggX1u9GyjKbv24p2KMGuK1gC3W04NG
+      qOQX3iwjmBWq87fX7tNLafptCq5A9TAv4Dvt1XZgGCiLI+EcPyfgNB1W/+EOOkFu
+      jFdM43nm0YE3Bf4uuVR/u0REprYJfChdS6qYYgI3n2LuPyi9WMVVee+1RZmTwFcB
+      cS53h+gq1GHOhj+YOwm3+ctmIoTNi26siutdABEBAAG0Kk1pcmFudGlzIE9mZmxp
+      bmUgQXB0bHkgPGluZm9AbWlyYW50aXMuY29tPokBOAQTAQIAIgUCWdT3xgIbAwYL
+      CQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQpIXB3agnLgS9wQf7B2LiR4wQh7Vq
+      Vwx1dKrhj0AXF7jSYfYJ/vtV6mXb0AxAxC3BVoW+KLPB+W9lHCXBRYXf1pJZIYcx
+      v0rTGeqzpcxVmMIT1E4OAmZp8pFlBsFNTERG2z01kdnd3oddF3GSiP1cTg2+c9hJ
+      UGJR0tAbPXDm0dXhuDD428IuSx5o4bdNdCshPYRe/P3CGG+KrySLL0/06UU2I5Mx
+      f4pctRouWfrQDA6sIS+P58NKwIpXdWj1pPogJzVUJqHHyAUM8Ri+AZoXtKjqXAqN
+      QNCd/xPaL9dtGxKTMDDKHvqyF5MpU3eYcEFIi79nunfC6Iaw+Izo+hYpiBlb2s6Q
+      kCgR2y/f17kBDQRZ1PfGAQgA1NqQorh2cvogoU4DbRwnQKZDCCt4WnbvcJf8WZw7
+      sINbqJm3pd/UjVwcPG0GFe9w7/eEdKv6N/fVMJYo/Dj34j2waN46sIBBaXi8pPuC
+      rs/fV+KFGmdXNrOED8LeJ835+6eAm3W/930P1o/Rncfi7ANQr4nuSkzCoXhwo9n8
+      RX70L1pYtGw1v3qMaDBKHGpZ0ZqSewSlQYclWG5EKg6ecR0wnLK9W62b5uExbexh
+      7d+W22NTZ9j7SVfwHG4IleZ03B+ak0NqlKpdEA9+8QLdrQsqFN8qDHqJ46ag+5xt
+      pAPmw1S2va7Gkr0BMxzdxwA5d4ZauevaEKTi5NLGdNZuHQARAQABiQEfBBgBAgAJ
+      BQJZ1PfGAhsMAAoJEKSFwd2oJy4E5R4H/3XjYvsalh2g4iYEOjZ1Ld55AA+NDlnp
+      eXJfEOlhxdnAvkTc1CfKdT3qaN5hG0m7sVowaeVbf4cDNwIQy+R75V73h2DQpno3
+      746DDC0C2jRzDBwKrUU9Y/du3REcq4kMCnhtVBMSX6rbJoxSFdCzLu/XJd9oeXbb
+      kObIeoe9FWIrswFB4NUhTHLn1bk5p8zsVbsRm3jl6ofoQmFKFoK6FauuNeB+Fc/1
+      UdMpUb1Y9dpE/akgRm/79NRHKA4plQ2X/CGZu+KIw4XVn/0ilU8FbsX+KXcp8ui0
+      XRqg8z44wtlroFTrnR+DgqplsellsrM+xGtZb9VrjFLeP89jzhrBWgE=
+      =GLje
+      -----END PGP PUBLIC KEY BLOCK-----
+  linux:
+    network:
+      host:
+        cid:
+          address: ${_param:cicd_control_address}
+          names:
+          - ${_param:cicd_control_hostname}
+          - ${_param:cicd_control_hostname}.${_param:cluster_domain}
+        cid01:
+          address: ${_param:cicd_control_node01_address}
+          names:
+          - ${_param:cicd_control_node01_hostname}
+          - ${_param:cicd_control_node01_hostname}.${_param:cluster_domain}
+        cid02:
+          address: ${_param:cicd_control_node02_address}
+          names:
+          - ${_param:cicd_control_node02_hostname}
+          - ${_param:cicd_control_node02_hostname}.${_param:cluster_domain}
+        cid03:
+          address: ${_param:cicd_control_node03_address}
+          names:
+          - ${_param:cicd_control_node03_hostname}
+          - ${_param:cicd_control_node03_hostname}.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/worker.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/worker.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/cicd/worker.yml
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml
index 6f58513..645612b 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml
@@ -4,12 +4,17 @@
 - system.linux.system.single.debian
 - system.linux.system.repo.mcp.apt_mirantis.saltstack
 - system.linux.system.repo_local.mcp.apt_mirantis.openstack
-#- system.openssh.client.lab
+- system.linux.system.repo_local.mcp.salt
+- system.linux.system.repo_local.mcp.extra
+- system.linux.system.repo.mcp.apt_mirantis.percona
+- system.linux.system.repo.mcp.apt_mirantis.ubuntu
+- system.linux.system.repo.mcp.apt_mirantis.glusterfs
+- system.glusterfs.client.cluster
+- system.glusterfs.client.volume.salt_pki
 - system.salt.master.pkg
 - system.salt.master.api
 - system.salt.master.formula.pkg.gnocchi
 - system.salt.master.formula.pkg.panko
-- system.reclass.storage.salt
 - system.salt.minion.ca.salt_master
 - system.salt.minion.cert.proxy
 - system.keystone.client.single
@@ -23,14 +28,19 @@
 - system.keystone.client.service.gnocchi
 - system.gnocchi.client
 - system.gnocchi.client.v1.archive_policy.default
+- system.reclass.storage.salt
 - system.reclass.storage.system.openstack_dns_cluster
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.openstack_compute_multi
 - system.reclass.storage.system.openstack_gateway_single
 - system.reclass.storage.system.openstack_dashboard_single
 - system.reclass.storage.system.openstack_telemetry_cluster
+- system.reclass.storage.system.cicd_control_cluster
+- service.jenkins.client
+- system.jenkins.client.credential.salt
+- system.jenkins.client.job.deploy.openstack
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 - cluster.virtual-offline-pike-ovs-dpdk.infra.backup.client_common
-- cluster.virtual-offline-pike-ovs-dpdk
 parameters:
   _param:
     reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab
@@ -41,7 +51,12 @@
     single_address: 172.16.10.100
     salt_master_host: 127.0.0.1
     salt_master_base_environment: prd
-    salt_minion_ca_host: ${linux:network:fqdn}
+    salt_minion_ca_host: cfg01.${_param:cluster_domain}
+    jenkins_git_url: 'git@cfg01:/home/repo'
+    jenkins_gerrit_url: ${_param:jenkins_git_url}
+    salt_api_password: 'hovno12345!'
+    jenkins_salt_api_url: "http://${_param:salt_master_host}:6969"
+    jenkins_pipeline_library_url: git@cfg01:/home/repo/mcp-ci/pipeline-library
     salt_api_password_hash: "$6$sGnRlxGf$al5jMCetLP.vfI/fTl3Z0N7Za1aeiexL487jAtyRABVfT3NlwZxQGVhO7S1N8OwS/34VHYwZQA8lkXwKMN/GS1"
   linux:
     network:
@@ -52,6 +67,19 @@
           proto: static
           address: ${_param:single_address}
           netmask: 255.255.255.0
+  jenkins:
+    client:
+      lib:
+        pipeline-library:
+          url: ${_param:jenkins_pipeline_library_url}
+          branch: ${_param:jenkins_pipelines_branch}
+      master:
+        host: ${_param:salt_master_host}
+        port: 8081
+        password: r00tme
+      globalenvprop:
+        OFFLINE_DEPLOYMENT:
+          value: "true"
   salt:
     master:
       backup: true
@@ -163,6 +191,21 @@
           cluster_param:
             openstack_telemetry_node03_address:
               value_template: <<node_control_ip>>
+        cicd_control_node01:
+          expression: <<node_hostname>>__equals__cid01
+          cluster_param:
+            cicd_control_node01_address:
+              value_template: <<node_control_ip>>
+        cicd_control_node02:
+          expression: <<node_hostname>>__equals__cid02
+          cluster_param:
+            cicd_control_node02_address:
+              value_template: <<node_control_ip>>
+        cicd_control_node03:
+          expression: <<node_hostname>>__equals__cid03
+          cluster_param:
+            cicd_control_node03_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/init.yml
index b01723d..da495f8 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/init.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/init.yml
@@ -1,4 +1,111 @@
+classes:
+- system.linux.network.dynamic_hosts
+- system.linux.system.repo_local.mcp.extra
+- system.linux.system.repo.mcp.apt_mirantis.saltstack
+- system.linux.system.repo.mcp.apt_mirantis.ubuntu
+- system.linux.system.repo_local.mcp.apt_mirantis.openstack
+- system.linux.system.single
+- system.linux.system.single.debian
+- system.watchdog.server
+- system.rsyslog.client.single
+- system.openssh.server.team.lab
+- system.openssh.server.team.tcpcloud
+- system.openssh.server.team.mcp_qa
+- system.auditd.server.ciscat
+- system.salt.minion.single
+- system.rsyslog.client.single
+- cluster.virtual-offline-pike-ovs-dpdk.openstack
+- cluster.virtual-offline-pike-ovs-dpdk.cicd
 parameters:
+  _param:
+    cluster_domain: virtual-offline-pike-ovs-dpdk.local
+    cluster_name: virtual-offline-pike-ovs-dpdk
+    infra_config_hostname: cfg01
+    local_repos: true
+    apt_mk_version: proposed
+    openstack_version: pike
+    jenkins_pipelines_branch: '${_param:apt_mk_version}'
+    # new in 2018.7+
+    linux_system_repo_url: http://${_param:local_repo_url}/${_param:apt_mk_version}/
+    #
+    local_repo_url: mirror.mcp.mirantis.local.test
+    linux_repo_refresh_db: true
+    aptly_server_address: 10.170.0.226
+    docker_compose_image: ${_param:aptly_server_address}:5000/compose:1.8.0
+    # infra service addresses
+    infra_config_address: 172.16.10.100
+    # openstack service addresses
+    openstack_proxy_address: 172.16.10.121
+    openstack_proxy_node01_address: 172.16.10.121
+    openstack_control_address: 172.16.10.254
+    openstack_control_node01_address: 172.16.10.101
+    openstack_control_node02_address: 172.16.10.102
+    openstack_control_node03_address: 172.16.10.103
+    openstack_gateway_address: 172.16.10.110
+    openstack_database_address: ${_param:openstack_control_address}
+    openstack_message_queue_address: ${_param:openstack_control_address}
+    openstack_message_queue_node01_address: ${_param:openstack_control_node01_address}
+    openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
+    openstack_message_queue_node03_address: ${_param:openstack_control_node03_address}
+    glusterfs_node01_address: ${_param:openstack_control_node01_address}
+    glusterfs_node02_address: ${_param:openstack_control_node02_address}
+    glusterfs_node03_address: ${_param:openstack_control_node03_address}
+    openstack_gateway_address: 172.16.10.110
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
+    remote_rsyslog_host: 127.0.0.3
+    remote_rsyslog_port: 10514
+    salt_minion_ca_host: ${_param:infra_config_hostname}.${_param:cluster_domain}
+  rsyslog:
+    client:
+      run_user: syslog
+      run_group: adm
+      enabled: true
+      rainerscript:
+        module:
+          imfile: {}
+        input:
+          imfile:
+            nginx:
+              File: "/var/log/nginx/*.log"
+              Tag: "nginx__"
+              Severity: "notice"
+              Facility: "local0"
+              PersistStateInterval: "0"
+              Ruleset: "myapp_logs"
+            apache2:
+              File: "/var/log/apache2/*.log"
+              Tag: "apache2__"
+              Severity: "notice"
+              Facility: "local0"
+              Ruleset: "myapp_logs"
+              PersistStateInterval: "0"
+            rabbitmq:
+              File: "/var/log/rabbitmq/*.log"
+              Tag: "rabbitmq__"
+              Severity: "notice"
+              Facility: "local0"
+              PersistStateInterval: "0"
+              Ruleset: "myapp_logs"
+        template:
+          ImfileFilePath:
+            parameter:
+              type: string
+              string: "<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%$.suffix%%msg:::sp-if-no-1st-sp%%msg%\n"
+        ruleset:
+          remote_logs:
+            description: 'action(type="omfwd" Target="${_param:remote_rsyslog_host}" Port="${_param:remote_rsyslog_port}" Protocol="udp" Template="ImfileFilePath")'
+          myapp_logs:
+            description: 'set $.suffix=re_extract($!metadata!filename, "(.*)/([^/]*[^/.log])", 0, 2, "all.log"); call remote_logs'
+      output:
+        remote:
+          somehost.domain:
+            action: "@${_param:remote_rsyslog_host}:${_param:remote_rsyslog_port}"
+            filter: "*.*"
+            enabled: true
+  salt:
+    minion:
+      trusted_ca_minions:
+        - ${_param:salt_minion_ca_host}
   linux:
     network:
       host:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml
deleted file mode 100644
index 84fdfce..0000000
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml
+++ /dev/null
@@ -1,95 +0,0 @@
-classes:
-- system.linux.network.dynamic_hosts
-- system.linux.system.repo_local.mcp.extra
-- system.linux.system.repo.mcp.apt_mirantis.saltstack
-- system.linux.system.repo.mcp.apt_mirantis.ubuntu
-- system.linux.system.single
-- system.linux.system.single.debian
-- system.watchdog.server
-- system.rsyslog.client.single
-- system.openssh.server.team.lab
-- system.openssh.server.team.tcpcloud
-- system.openssh.server.team.mcp_qa
-- system.auditd.server.ciscat
-- cluster.virtual-offline-pike-ovs-dpdk.infra
-- cluster.virtual-offline-pike-ovs-dpdk.openstack
-
-parameters:
-  _param:
-    cluster_domain: virtual-offline-pike-ovs-dpdk.local
-    cluster_name: virtual-offline-pike-ovs-dpdk
-    infra_config_hostname: cfg01
-    local_repos: true
-    # new in 2018.7+
-    linux_system_repo_url: http://${_param:local_repo_url}/${_param:apt_mk_version}/
-    #
-    local_repo_url: mirror.mcp.mirantis.local.test
-    linux_repo_refresh_db: true
-    aptly_server_address: 10.170.0.226
-    # infra service addresses
-    infra_config_address: 172.16.10.100
-    # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
-    openstack_control_address: 172.16.10.254
-    openstack_control_node01_address: 172.16.10.101
-    openstack_control_node02_address: 172.16.10.102
-    openstack_control_node03_address: 172.16.10.103
-    openstack_gateway_address: 172.16.10.110
-    openstack_database_address: ${_param:openstack_control_address}
-    openstack_message_queue_address: ${_param:openstack_control_address}
-    openstack_message_queue_node01_address: ${_param:openstack_control_node01_address}
-    openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
-    openstack_message_queue_node03_address: ${_param:openstack_control_node03_address}
-    # stacklight service addresses
-    openstack_gateway_address: 172.16.10.110
-    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
-    remote_rsyslog_host: 127.0.0.3
-    remote_rsyslog_port: 10514
-  rsyslog:
-    client:
-      run_user: syslog
-      run_group: adm
-      enabled: true
-      rainerscript:
-        module:
-          imfile: {}
-        input:
-          imfile:
-            nginx:
-              File: "/var/log/nginx/*.log"
-              Tag: "nginx__"
-              Severity: "notice"
-              Facility: "local0"
-              PersistStateInterval: "0"
-              Ruleset: "myapp_logs"
-            apache2:
-              File: "/var/log/apache2/*.log"
-              Tag: "apache2__"
-              Severity: "notice"
-              Facility: "local0"
-              Ruleset: "myapp_logs"
-              PersistStateInterval: "0"
-            rabbitmq:
-              File: "/var/log/rabbitmq/*.log"
-              Tag: "rabbitmq__"
-              Severity: "notice"
-              Facility: "local0"
-              PersistStateInterval: "0"
-              Ruleset: "myapp_logs"
-        template:
-          ImfileFilePath:
-            parameter:
-              type: string
-              string: "<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%$.suffix%%msg:::sp-if-no-1st-sp%%msg%\n"
-        ruleset:
-          remote_logs:
-            description: 'action(type="omfwd" Target="${_param:remote_rsyslog_host}" Port="${_param:remote_rsyslog_port}" Protocol="udp" Template="ImfileFilePath")'
-          myapp_logs:
-            description: 'set $.suffix=re_extract($!metadata!filename, "(.*)/([^/]*[^/.log])", 0, 2, "all.log"); call remote_logs'
-      output:
-        remote:
-          somehost.domain:
-            action: "@${_param:remote_rsyslog_host}:${_param:remote_rsyslog_port}"
-            filter: "*.*"
-            enabled: true
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml
index 85e9a29..633c0ae 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml
@@ -12,7 +12,7 @@
 - system.ceilometer.client.nova_compute
 - system.ceilometer.agent.telemetry.cluster
 - system.ceilometer.agent.polling.default
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 - system.nova.compute.nfv.hugepages
 - system.nova.compute.nfv.cpu_pinning
 - system.neutron.compute.nfv.dpdk
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml
index 757102c..5c41cab 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml
@@ -17,6 +17,13 @@
 - system.glusterfs.server.volume.keystone
 - system.glusterfs.server.volume.backup
 - system.glusterfs.server.cluster
+- system.glusterfs.server.volume.aptly
+- system.glusterfs.server.volume.gerrit
+- system.glusterfs.server.volume.jenkins
+- system.glusterfs.server.volume.mysql
+- system.glusterfs.server.volume.openldap
+- system.glusterfs.server.volume.registry
+- system.glusterfs.server.cluster
 - system.glance.control.cluster
 - system.nova.control.cluster
 - system.neutron.control.openvswitch.cluster
@@ -38,7 +45,7 @@
 - system.ceilometer.client.cinder_volume
 - system.ceilometer.client.neutron
 - system.haproxy.proxy.listen.openstack.nova-placement
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 parameters:
   _param:
     keepalived_vip_interface: ens4
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dashboard.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dashboard.yml
index 2c20b03..24f2b4b 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dashboard.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dashboard.yml
@@ -4,7 +4,7 @@
 - system.linux.system.repo_local.mcp.extra
 - system.linux.system.repo.mcp.apt_mirantis.saltstack
 - system.horizon.server.single
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 parameters:
   _param:
     horizon_site_branding: OpenStack Dashboard
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml
index ca49ae6..4fca292 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml
@@ -1,6 +1,6 @@
 classes:
 - system.powerdns.server.single
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 
 parameters:
   powerdns:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml
index 2dea160..afbe64b 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml
@@ -3,7 +3,7 @@
 - system.linux.system.repo_local.mcp.extra
 - system.linux.system.repo.mcp.apt_mirantis.saltstack
 - system.neutron.gateway.cluster
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 parameters:
   _param:
     primary_interface: ens4
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/proxy.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/proxy.yml
index a760bea..730f074 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/proxy.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/proxy.yml
@@ -4,7 +4,7 @@
 - system.nginx.server.proxy.openstack_vnc
 - system.nginx.server.proxy.openstack_web
 - system.salt.minion.cert.proxy
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 parameters:
   _param:
     cluster_public_host:  ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml
index c804e24..c1c831b 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml
@@ -4,7 +4,7 @@
 - system.linux.system.repo_local.mcp.apt_mirantis.openstack
 - system.linux.system.repo_local.mcp.extra
 - system.linux.system.repo.mcp.apt_mirantis.saltstack
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 parameters:
 
   linux:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml
index db23a37..b664387 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml
@@ -23,7 +23,7 @@
 - system.aodh.server.coordination.redis
 - system.panko.server.cluster
 - system.ceilometer.server.backend.gnocchi
-- cluster.virtual-offline-pike-ovs-dpdk
+- cluster.virtual-offline-pike-ovs-dpdk.infra
 parameters:
   _param:
     gnocchi_statsd_resource_id: 07f26121-5777-48ba-8a0b-d70468133dd9