Merge "Fix missing node"
diff --git a/classes/cluster/aaa_ha_freeipa/aaa/freeipa_client.yml b/classes/cluster/aaa_ha_freeipa/aaa/freeipa_client.yml
index c9150cb..438737a 100644
--- a/classes/cluster/aaa_ha_freeipa/aaa/freeipa_client.yml
+++ b/classes/cluster/aaa_ha_freeipa/aaa/freeipa_client.yml
@@ -2,6 +2,7 @@
 #- system.haproxy.proxy.listen.
 #- system.linux.system.repo.freeipa
 #- system.salt.minion.cert.
+- system.linux.network.hosts
 - system.freeipa.client.cluster
 - system.freeipa.client.dns
 - system.freeipa.client.nsupdate
diff --git a/classes/cluster/ceph_ha/ceph/cfs.yml b/classes/cluster/ceph_ha/ceph/cfs.yml
index a47023e..084de38 100644
--- a/classes/cluster/ceph_ha/ceph/cfs.yml
+++ b/classes/cluster/ceph_ha/ceph/cfs.yml
@@ -1,3 +1,4 @@
 classes:
 - system.linux.system.repo.ubuntu
+- system.linux.network.hosts
 - cluster.ceph_ha.infra
diff --git a/classes/cluster/ceph_ha/ceph/mon.yml b/classes/cluster/ceph_ha/ceph/mon.yml
index 33e9d6d..055a2c8 100644
--- a/classes/cluster/ceph_ha/ceph/mon.yml
+++ b/classes/cluster/ceph_ha/ceph/mon.yml
@@ -1,3 +1,4 @@
 classes:
 - system.ceph.mon.cluster
-- cluster.ceph_ha.ceph.common
\ No newline at end of file
+- cluster.ceph_ha.ceph.common
+- system.linux.network.hosts
diff --git a/classes/cluster/ceph_ha/ceph/osd.yml b/classes/cluster/ceph_ha/ceph/osd.yml
index a01c57e..85e650a 100644
--- a/classes/cluster/ceph_ha/ceph/osd.yml
+++ b/classes/cluster/ceph_ha/ceph/osd.yml
@@ -1,5 +1,6 @@
 classes:
 - service.ceph.osd.cluster
+- system.linux.network.hosts
 - cluster.ceph_ha.ceph.common
 parameters:
   ceph:
diff --git a/classes/cluster/ceph_ha/infra/config.yml b/classes/cluster/ceph_ha/infra/config.yml
index 806bbce..123cb65 100644
--- a/classes/cluster/ceph_ha/infra/config.yml
+++ b/classes/cluster/ceph_ha/infra/config.yml
@@ -87,7 +87,7 @@
             ceph_osd_node03_address:
               value_template: <<node_control_ip>>
         ceph_mon_01:
-          expression: <<node_hostname>>__equals__cmn03
+          expression: <<node_hostname>>__equals__cmn01
           cluster_param:
             ceph_mon_node01_address:
               value_template: <<node_control_ip>>
diff --git a/classes/cluster/k8s_aio_calico/kubernetes/compute.yml b/classes/cluster/k8s_aio_calico/kubernetes/compute.yml
index 56843a7..63f79b9 100644
--- a/classes/cluster/k8s_aio_calico/kubernetes/compute.yml
+++ b/classes/cluster/k8s_aio_calico/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.k8s_aio_calico
diff --git a/classes/cluster/k8s_aio_contrail/kubernetes/compute.yml b/classes/cluster/k8s_aio_contrail/kubernetes/compute.yml
index ca0e765..5fd2102 100644
--- a/classes/cluster/k8s_aio_contrail/kubernetes/compute.yml
+++ b/classes/cluster/k8s_aio_contrail/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.k8s_aio_contrail.infra
diff --git a/classes/cluster/k8s_ha_calico/kubernetes/compute.yml b/classes/cluster/k8s_ha_calico/kubernetes/compute.yml
index 8716a14..d9b8de4 100644
--- a/classes/cluster/k8s_ha_calico/kubernetes/compute.yml
+++ b/classes/cluster/k8s_ha_calico/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.k8s_ha_calico
diff --git a/classes/cluster/k8s_ha_calico_syndic/kubernetes/compute.yml b/classes/cluster/k8s_ha_calico_syndic/kubernetes/compute.yml
index 0be36d0..ac070a8 100644
--- a/classes/cluster/k8s_ha_calico_syndic/kubernetes/compute.yml
+++ b/classes/cluster/k8s_ha_calico_syndic/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.k8s_ha_calico_syndic
diff --git a/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml b/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml
index 6d06f59..8a4855b 100644
--- a/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml
+++ b/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.k8s_ha_contrail.opencontrail.compute
diff --git a/classes/cluster/model_manager/model_manager/dashboard.yml b/classes/cluster/model_manager/model_manager/dashboard.yml
index 4e0e85e..4dbdcee 100644
--- a/classes/cluster/model_manager/model_manager/dashboard.yml
+++ b/classes/cluster/model_manager/model_manager/dashboard.yml
@@ -2,6 +2,7 @@
 - system.linux.system.repo.ubuntu
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.saltstack.xenial
+- system.linux.network.hosts
 - system.model_manager.server.integration
 - cluster.model_manager.model_manager.identity
 - cluster.model_manager
diff --git a/classes/cluster/model_manager/model_manager/init.yml b/classes/cluster/model_manager/model_manager/init.yml
index 0e5dded..781d1f4 100644
--- a/classes/cluster/model_manager/model_manager/init.yml
+++ b/classes/cluster/model_manager/model_manager/init.yml
@@ -14,6 +14,7 @@
     # identity params
     openstack_region: RegionOne
     admin_email: root@localhost
+    openstack_version: mitaka
     keystone_version: mitaka
     keystone_service_token: qzWYJmNiiXYRSipdWda0
     rabbitmq_openstack_password: workshop
diff --git a/classes/cluster/os_ha_contrail_40/infra/config.yml b/classes/cluster/os_ha_contrail_40/infra/config.yml
new file mode 100644
index 0000000..377bb15
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/infra/config.yml
@@ -0,0 +1,162 @@
+classes:
+- service.git.client
+- system.linux.system.single
+- system.linux.system.repo.mcp.salt
+- system.openssh.client.lab
+- system.salt.master.api
+- system.salt.master.pkg
+- system.reclass.storage.salt
+- system.salt.minion.ca.salt_master
+- system.salt.minion.cert.proxy
+- system.sphinx.server.doc.reclass
+- system.keystone.client.core
+- system.keystone.client.service.designate
+- system.keystone.client.service.cinder
+- system.keystone.client.service.cinder2
+- system.keystone.client.service.cinder3
+- system.keystone.client.service.glance
+- system.keystone.client.service.glare
+- system.keystone.client.service.heat
+- system.keystone.client.service.heat-cfn
+- system.keystone.client.service.keystone
+- system.keystone.client.service.neutron
+- system.keystone.client.service.nova-ec2
+- system.keystone.client.service.nova21
+- system.keystone.client.service.nova-placement
+- system.mysql.client
+- system.mysql.client.database.cinder
+- system.mysql.client.database.glance
+- system.mysql.client.database.heat
+- system.mysql.client.database.keystone
+- system.mysql.client.database.nova
+- system.mysql.client.database.nova_api
+- system.mysql.client.database.neutron
+- system.reclass.storage.system.openstack_control_cluster
+- system.reclass.storage.system.opencontrail_control_cluster
+- cluster.os_ha_contrail_40.openstack.proxy
+- cluster.os_ha_contrail_40
+parameters:
+  _param:
+    reclass_data_repository: "https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab"
+    reclass_data_revision: master
+    reclass_config_master: ${_param:infra_config_deploy_address}
+    single_address: ${_param:infra_config_address}
+    salt_master_host: 127.0.0.1
+    salt_master_base_environment: prd
+    salt_minion_ca_host: ${linux:network:fqdn}
+    salt_api_password_hash: "$6$sGnRlxGf$al5jMCetLP.vfI/fTl3Z0N7Za1aeiexL487jAtyRABVfT3NlwZxQGVhO7S1N8OwS/34VHYwZQA8lkXwKMN/GS1"
+  linux:
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+  nginx:
+    server:
+      site:
+        nginx_proxy_openstack_web:
+          proxy:
+            host: ${_param:openstack_control_address}
+        nginx_proxy_openstack_api_heat_cfn:
+          enabled: false
+  salt:
+    master:
+      reactor:
+        reclass/minion/classify:
+        - salt://reclass/reactor/node_register.sls
+  reclass:
+    storage:
+      class_mapping:
+        common_node:
+          expression: all
+          node_param:
+            single_address:
+              value_template: <<node_control_ip>>
+            linux_system_codename:
+              value_template: <<node_os>>
+            salt_master_host:
+              value_template: <<node_master_ip>>
+        infra_config:
+          expression: <<node_hostname>>__startswith__cfg
+          cluster_param:
+            infra_config_address:
+              value_template: <<node_control_ip>>
+            infra_config_deploy_address:
+              value_template: <<node_deploy_ip>>
+            cluster_domain:
+              value_template: <<node_domain>>
+        openstack_control01:
+          expression: <<node_hostname>>__equals__ctl01
+          cluster_param:
+            openstack_control_node01_address:
+              value_template: <<node_control_ip>>
+        openstack_control02:
+          expression: <<node_hostname>>__equals__ctl02
+          cluster_param:
+            openstack_control_node02_address:
+              value_template: <<node_control_ip>>
+        openstack_control03:
+          expression: <<node_hostname>>__equals__ctl03
+          cluster_param:
+            openstack_control_node03_address:
+              value_template: <<node_control_ip>>
+        opencontrail_control:
+          expression: <<node_hostname>>__startswith__ntw
+          cluster_param:
+            opencontrail_control_system_codename:
+              value_template: <<node_os>>
+            opencontrail_control_interface_name:
+              value_template: <<node_control_iface>>
+        opencontrail_control01:
+          expression: <<node_hostname>>__equals__ntw01
+          cluster_param:
+            opencontrail_control_node01_address:
+              value_template: <<node_control_ip>>
+        opencontrail_control02:
+          expression: <<node_hostname>>__equals__ntw02
+          cluster_param:
+            opencontrail_control_node02_address:
+              value_template: <<node_control_ip>>
+        opencontrail_control03:
+          expression: <<node_hostname>>__equals__ntw03
+          cluster_param:
+            opencontrail_control_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_compute:
+          expression: <<node_hostname>>__startswith__cmp
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.compute
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+      node:
+        openstack_control_node01:
+          classes:
+          - service.galera.master.cluster
+          - cluster.os_ha_contrail_40.openstack.dashboard
+          params:
+            mysql_cluster_role: master
+            linux_system_codename: xenial
+            horizon_identity_host: ${_param:openstack_control_address}
+        openstack_control_node02:
+          classes:
+          - service.galera.slave.cluster
+          - cluster.os_ha_contrail_40.openstack.dashboard
+          params:
+            mysql_cluster_role: slave
+            linux_system_codename: xenial
+            horizon_identity_host: ${_param:openstack_control_address}
+        openstack_control_node03:
+          classes:
+          - service.galera.slave.cluster
+          - cluster.os_ha_contrail_40.openstack.dashboard
+          params:
+            mysql_cluster_role: slave
+            linux_system_codename: xenial
+            horizon_identity_host: ${_param:openstack_control_address}
diff --git a/classes/cluster/os_ha_contrail_40/infra/init.yml b/classes/cluster/os_ha_contrail_40/infra/init.yml
new file mode 100644
index 0000000..fdb1dc3
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/infra/init.yml
@@ -0,0 +1,21 @@
+parameters:
+  _param:
+    cluster_domain: os_ha_contrail_40.local
+    cluster_name: os_ha_contrail_40
+    infra_config_deploy_address: 192.168.10.100
+    infra_config_address: 172.16.10.100
+    infra_config_hostname: cfg01
+    linux_system_repo_mcp_salt_version: nightly
+  linux:
+    network:
+      host:
+        cfg01:
+          address: ${_param:infra_config_address}
+          names:
+          - ${_param:infra_config_hostname}
+          - ${_param:infra_config_hostname}.${_param:cluster_domain}
+        cfg:
+          address: ${_param:infra_config_address}
+          names:
+          - cfg
+          - cfg.${_param:cluster_domain}
diff --git a/classes/cluster/os_ha_contrail_40/init.yml b/classes/cluster/os_ha_contrail_40/init.yml
new file mode 100644
index 0000000..610e351
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/init.yml
@@ -0,0 +1,11 @@
+classes:
+- system.linux.system.repo.mcp.extra
+- system.linux.system.single
+- system.rsyslog.client.single
+- system.openssh.server.team.lab
+- system.openssh.server.team.tcpcloud
+- system.openssh.server.team.mcp_qa
+- cluster.os_ha_contrail_40.infra
+- cluster.os_ha_contrail_40.opencontrail
+- cluster.os_ha_contrail_40.openstack
+- cluster.overrides
diff --git a/classes/cluster/os_ha_contrail_40/opencontrail/control.yml b/classes/cluster/os_ha_contrail_40/opencontrail/control.yml
new file mode 100644
index 0000000..6b10371
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/opencontrail/control.yml
@@ -0,0 +1,66 @@
+classes:
+- system.linux.system.lowmem
+- system.linux.system.repo.cassandra
+- system.linux.system.repo.mcp.contrail
+- system.linux.system.repo.mcp.openstack
+- system.linux.system.repo.mcp.extra
+- system.linux.system.repo.saltstack.xenial
+- system.opencontrail.client.resource.edge_router
+- system.opencontrail.control.cluster4_0
+- system.opencontrail.client.cluster
+- system.opencontrail.client.resource.control_node
+- system.opencontrail.client.resource.config_node
+- system.opencontrail.client.resource.database_node
+- system.opencontrail.client.resource.analytics_node
+- system.haproxy.proxy.listen.opencontrail.analytics
+- cluster.os_ha_contrail_40
+parameters:
+  _param:
+    keepalived_vip_interface: eth1
+    cluster_vip_address: ${_param:opencontrail_control_address}
+    cluster_local_address: ${_param:single_address}
+    cluster_node01_hostname: ntw01
+    cluster_node01_address: ${_param:opencontrail_control_node01_address}
+    cluster_node02_hostname: ntw02
+    cluster_node02_address: ${_param:opencontrail_control_node02_address}
+    cluster_node03_hostname: ntw03
+    cluster_node03_address: ${_param:opencontrail_control_node03_address}
+    opencontrail_router01_hostname: vsrx01.${_param:cluster_domain}
+    opencontrail_router01_address: 172.16.10.131
+  linux:
+    network:
+      interface:
+        iface:
+          enabled: true
+          name: ${_param:opencontrail_control_interface_name}
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+  keepalived:
+    cluster:
+      instance:
+        VIP:
+          virtual_router_id: 144
+  opencontrail:
+    web:
+      database:
+        port: 9042
+      network:
+        host: ${_param:openstack_control_address}
+      identity:
+        host: ${_param:openstack_control_address}
+    common:
+      network:
+        host: ${_param:openstack_control_address}
+      identity:
+        host: ${_param:openstack_control_address}
+    config:
+      network:
+        host: ${_param:openstack_control_address}
+      identity:
+        host: ${_param:openstack_control_address}
+      message_queue:
+        engine: rabbitmq
+        host: ${_param:openstack_control_address}
+        port: 5672
diff --git a/classes/cluster/os_ha_contrail_40/opencontrail/init.yml b/classes/cluster/os_ha_contrail_40/opencontrail/init.yml
new file mode 100644
index 0000000..7e1e78c
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/opencontrail/init.yml
@@ -0,0 +1,37 @@
+parameters:
+  _param:
+    opencontrail_analytics_address: ${_param:openstack_control_address}
+    opencontrail_analytics_node01_address: ${_param:openstack_control_node01_address}
+    opencontrail_analytics_node02_address: ${_param:openstack_control_node02_address}
+    opencontrail_analytics_node03_address: ${_param:openstack_control_node03_address}
+
+    opencontrail_control_address: 172.16.10.252
+    opencontrail_control_node01_hostname: ntw01
+    opencontrail_control_node02_hostname: ntw02
+    opencontrail_control_node03_hostname: ntw03
+    opencontrail_control_node01_address: 172.16.10.111
+    opencontrail_control_node02_address: 172.16.10.112
+    opencontrail_control_node03_address: 172.16.10.113
+  linux:
+    network:
+      host:
+        ntw:
+          address: ${_param:opencontrail_control_address}
+          names:
+          - ntw
+          - ntw.${_param:cluster_domain}
+        ntw01:
+          address: ${_param:opencontrail_control_node01_address}
+          names:
+          - ${_param:opencontrail_control_node01_hostname}
+          - ${_param:opencontrail_control_node01_hostname}.${_param:cluster_domain}
+        ntw02:
+          address: ${_param:opencontrail_control_node02_address}
+          names:
+          - ${_param:opencontrail_control_node02_hostname}
+          - ${_param:opencontrail_control_node02_hostname}.${_param:cluster_domain}
+        ntw03:
+          address: ${_param:opencontrail_control_node03_address}
+          names:
+          - ${_param:opencontrail_control_node03_hostname}
+          - ${_param:opencontrail_control_node03_hostname}.${_param:cluster_domain}
diff --git a/classes/cluster/os_ha_contrail_40/openstack/compute.yml b/classes/cluster/os_ha_contrail_40/openstack/compute.yml
new file mode 100644
index 0000000..3a51815
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/openstack/compute.yml
@@ -0,0 +1,63 @@
+classes:
+- system.linux.system.repo.mcp.contrail
+- system.linux.system.repo.mcp.openstack
+- system.linux.system.repo.mcp.extra
+- system.linux.system.repo.saltstack.xenial
+- system.linux.network.hosts
+- system.nova.compute.cluster
+- system.opencontrail.compute.cluster4_0
+- system.opencontrail.client.cluster
+- system.opencontrail.client.resource.virtual_router
+- service.opencontrail.compute.cluster
+- cluster.os_ha_contrail_40
+parameters:
+  _param:
+    cluster_vip_address: ${_param:openstack_control_address}
+    cluster_local_address: ${_param:single_address}
+    cluster_node01_hostname: ctl01
+    cluster_node01_address: ${_param:openstack_control_node01_address}
+    cluster_node02_hostname: ctl02
+    cluster_node02_address: ${_param:openstack_control_node02_address}
+    cluster_node03_hostname: ctl03
+    cluster_node03_address: ${_param:openstack_control_node03_address}
+    opencontrail_compute_address: ${_param:single_address}
+    opencontrail_compute_gateway: 172.16.10.1
+    opencontrail_compute_iface: ens4
+    linux_system_codename: xenial
+  linux:
+    network:
+      concat_iface_files:
+      - src: '/etc/network/interfaces.d/50-cloud-init.cfg'
+        dst: '/etc/network/interfaces'
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: manual
+        vhost0:
+          enabled: true
+          type: eth
+          mtu: 1500
+          address: ${_param:single_address}
+          netmask: '255.255.255.0'
+          pre_up_cmds:
+          - /usr/lib/contrail/if-vhost0
+          use_interfaces:
+          - ens4
+  nova:
+    compute:
+      vncproxy_url: http://${_param:cluster_vip_address}:6080
+      message_queue:
+        members:
+          - host: ${_param:openstack_control_node01_address}
+          - host: ${_param:openstack_control_node02_address}
+          - host: ${_param:openstack_control_node03_address}
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+        notify_on:
+          state_change: vm_and_task_state
+  opencontrail:
+    common:
+      network:
+        host: ${_param:openstack_control_address}
diff --git a/classes/cluster/os_ha_contrail_40/openstack/control.yml b/classes/cluster/os_ha_contrail_40/openstack/control.yml
new file mode 100644
index 0000000..141c562
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/openstack/control.yml
@@ -0,0 +1,165 @@
+classes:
+- system.linux.system.lowmem
+- system.linux.system.repo.glusterfs
+- system.linux.system.repo.mcp.contrail
+- system.linux.system.repo.mcp.openstack
+- system.linux.system.repo.mcp.extra
+- system.linux.system.repo.saltstack.xenial
+- system.memcached.server.single
+- system.rabbitmq.server.cluster
+- system.rabbitmq.server.vhost.openstack
+- system.keystone.server.wsgi
+- system.keystone.server.cluster
+- system.glusterfs.server.volume.glance
+- system.glusterfs.server.volume.keystone
+- system.glusterfs.server.cluster
+- system.glusterfs.client.cluster
+- system.glusterfs.client.volume.glance
+- system.glusterfs.client.volume.keystone
+- system.glance.control.cluster
+- system.nova.control.cluster
+- system.neutron.control.opencontrail.cluster
+- system.cinder.control.cluster
+- system.heat.server.cluster
+- system.designate.server.cluster
+- system.designate.server.backend.bind
+- system.galera.server.cluster
+- system.galera.server.database.cinder
+- system.galera.server.database.glance
+- system.galera.server.database.heat
+- system.galera.server.database.keystone
+- system.galera.server.database.nova
+- system.galera.server.database.designate
+- system.haproxy.proxy.listen.openstack.nova-placement
+- cluster.os_ha_contrail_40
+parameters:
+  _param:
+    keepalived_vip_interface: ens4
+    cluster_vip_address: ${_param:openstack_control_address}
+    cluster_local_address: ${_param:single_address}
+    cluster_node01_hostname: ctl01
+    cluster_node01_address: ${_param:openstack_control_node01_address}
+    cluster_node02_hostname: ctl02
+    cluster_node02_address: ${_param:openstack_control_node02_address}
+    cluster_node03_hostname: ctl03
+    cluster_node03_address: ${_param:openstack_control_node03_address}
+    keepalived_openstack_telemetry_vip_interface: ens4
+  linux:
+    system:
+      package:
+        python-msgpack:
+          version: latest
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+  keepalived:
+    cluster:
+      instance:
+        VIP:
+          virtual_router_id: 150
+  bind:
+    server:
+      control:
+        mgmt:
+          enabled: true
+          bind:
+            address: ${_param:single_address}
+            port: 953
+          allow:
+            - ${_param:openstack_control_node01_address}
+            - ${_param:openstack_control_node02_address}
+            - ${_param:openstack_control_node03_address}
+          keys:
+            - designate
+  keystone:
+    server:
+      admin_email: ${_param:admin_email}
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+  designate:
+    server:
+      pools:
+        default:
+          description: 'test pool'
+          targets:
+            default:
+              description: 'test target1'
+            default1:
+              type: ${_param:designate_pool_target_type}
+              description: 'test target2'
+              masters: ${_param:designate_pool_target_masters}
+              options:
+                host: ${_param:openstack_control_node02_address}
+                port: 53
+                rndc_host: ${_param:openstack_control_node02_address}
+                rndc_port: 953
+                rndc_key_file: /etc/designate/rndc.key
+            default2:
+              type: ${_param:designate_pool_target_type}
+              description: 'test target3'
+              masters: ${_param:designate_pool_target_masters}
+              options:
+                host: ${_param:openstack_control_node03_address}
+                port: 53
+                rndc_host: ${_param:openstack_control_node03_address}
+                rndc_port: 953
+                rndc_key_file: /etc/designate/rndc.key
+  glance:
+    server:
+      storage:
+        engine: file
+      images: []
+      workers: 1
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+  heat:
+    server:
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+  nova:
+    controller:
+      networking: contrail
+      cpu_allocation: 54
+      bind:
+        private_address: ${_param:cluster_local_address}
+        public_address: ${_param:cluster_vip_address}
+        novncproxy_port: 6080
+      vncproxy_url: http://${_param:cluster_vip_address}:6080
+      cache:
+        engine: memcached
+        prefix: CACHE_NOVA
+        members:
+        - host: 127.0.0.1
+          port: 11211
+      workers: 1
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+  neutron:
+    server:
+      plugin: contrail
+      tunnel_type: vxlan
+      public_networks: []
+      contrail:
+        version: ${_param:opencontrail_version}
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+  cinder:
+    volume:
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+    controller:
+      notification:
+        driver: messagingv2
+        topics: "notifications"
+
diff --git a/classes/cluster/os_ha_contrail_40/openstack/dashboard.yml b/classes/cluster/os_ha_contrail_40/openstack/dashboard.yml
new file mode 100644
index 0000000..57dd254
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/openstack/dashboard.yml
@@ -0,0 +1,22 @@
+classes:
+- system.linux.system.repo.ubuntu
+- system.linux.system.repo.mcp.openstack
+- system.linux.system.repo.mcp.extra
+- system.linux.system.repo.saltstack.xenial
+- system.horizon.server.cluster
+- system.horizon.server.plugin.contrail
+- system.horizon.server.plugin.overrides
+- cluster.os_ha_contrail_40
+parameters:
+  _param:
+    horizon_site_branding: OpenStack Dashboard
+  linux:
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+
diff --git a/classes/cluster/os_ha_contrail_40/openstack/init.yml b/classes/cluster/os_ha_contrail_40/openstack/init.yml
new file mode 100644
index 0000000..c129dea
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/openstack/init.yml
@@ -0,0 +1,202 @@
+parameters:
+  _param:
+    openstack_proxy_hostname: prx
+    openstack_proxy_address: ${_param:openstack_proxy_node01_address}
+    openstack_proxy_node01_hostname: prx01
+    openstack_proxy_node01_address: ${_param:infra_config_address}
+
+    openstack_control_address: 172.16.10.254
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    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_database_address: ${_param:openstack_control_address}
+    openstack_database_node01_hostname: dbs01
+    openstack_database_node02_hostname: dbs02
+    openstack_database_node03_hostname: dbs03
+    openstack_database_node01_address: ${_param:openstack_control_node01_address}
+    openstack_database_node02_address: ${_param:openstack_control_node02_address}
+    openstack_database_node03_address: ${_param:openstack_control_node02_address}
+
+    openstack_message_queue_address: ${_param:openstack_control_address}
+    openstack_message_queue_node01_hostname: msg01
+    openstack_message_queue_node02_hostname: msg02
+    openstack_message_queue_node03_hostname: msg03
+    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}
+
+    openstack_compute_node01_hostname: cmp01
+    openstack_compute_node02_hostname: cmp02
+    openstack_compute_node01_address: 172.16.10.105
+    openstack_compute_node02_address: 172.16.10.106
+
+    openstack_version: ocata
+    apt_mk_version: nightly
+    openstack_region: RegionOne
+    admin_email: root@localhost
+    cluster_public_host: ${_param:openstack_proxy_address}
+    opencontrail_version: 4.0
+    opencontrail_compute_dns: 8.8.8.8
+    opencontrail_stats_password: contrail123
+    galera_server_cluster_name: openstack_cluster
+    galera_server_maintenance_password: workshop
+    galera_server_admin_password: workshop
+    rabbitmq_secret_key: workshop
+    rabbitmq_admin_password: workshop
+    rabbitmq_openstack_password: workshop
+    rabbitmq_cold_password: workshop
+    designate_bind9_rndc_key: 4pc+X4PDqb2q+5o72dISm72LM1Ds9X2EYZjqg+nmsS7FhdTwzFFY8l/iEDmHxnyjkA33EQC8
+    designate_domain_id: 5186883b-91fb-4891-bd49-e6769234a8fc
+    designate_pool_ns_records:
+      - hostname: 'ns1.example.org.'
+        priority: 10
+    designate_pool_nameservers:
+      - host: ${_param:openstack_control_node01_address}
+        port: 53
+      - host: ${_param:openstack_control_node02_address}
+        port: 53
+      - host: ${_param:openstack_control_node03_address}
+        port: 53
+    designate_pool_target_type: bind9
+    designate_pool_target_masters:
+      - host: ${_param:openstack_control_node01_address}
+        port: 5354
+      - host: ${_param:openstack_control_node02_address}
+        port: 5354
+      - host: ${_param:openstack_control_node03_address}
+        port: 5354
+    designate_pool_target_options:
+      host: ${_param:openstack_control_node01_address}
+      port: 53
+      rndc_host: ${_param:openstack_control_node01_address}
+      rndc_port: 953
+      rndc_key_file: /etc/designate/rndc.key
+    designate_version: ${_param:openstack_version}
+    cluster_vip_address: ${_param:openstack_control_address}
+    glance_version: ${_param:openstack_version}
+    glance_service_host: ${_param:openstack_control_address}
+    keystone_version: ${_param:openstack_version}
+    keystone_service_host: ${_param:openstack_control_address}
+    heat_version: ${_param:openstack_version}
+    heat_service_host: ${_param:openstack_control_address}
+    heat_domain_admin_password: workshop
+    cinder_version: ${_param:openstack_version}
+    cinder_service_host: ${_param:openstack_control_address}
+    nova_version: ${_param:openstack_version}
+    nova_service_host: ${_param:openstack_control_address}
+    nova_vncproxy_url: http://${_param:openstack_control_address}:8060
+    neutron_version: ${_param:openstack_version}
+    neutron_service_host: ${_param:openstack_control_address}
+    glusterfs_service_host: ${_param:openstack_control_address}
+    designate_service_host: ${_param:openstack_control_address}
+    mysql_admin_user: root
+    mysql_admin_password: workshop
+    mysql_designate_password: workshop
+    mysql_cinder_password: workshop
+    mysql_glance_password: workshop
+    mysql_heat_password: workshop
+    mysql_keystone_password: workshop
+    mysql_neutron_password: workshop
+    mysql_nova_password: workshop
+    keystone_service_token: workshop
+    keystone_admin_password: workshop
+    keystone_cinder_password: workshop
+    keystone_glance_password: workshop
+    keystone_heat_password: workshop
+    keystone_keystone_password: workshop
+    keystone_neutron_password: workshop
+    keystone_nova_password: workshop
+    keystone_designate_password: workshop
+    metadata_password: workshop
+    horizon_version: ${_param:openstack_version}
+    horizon_secret_key: opaesee8Que2yahJoh9fo0eefo1Aeyo6ahyei8zeiboh3aeth5loth7ieNa5xi5e
+    horizon_identity_host: ${_param:openstack_control_address}
+    horizon_identity_encryption: none
+    horizon_identity_version: 2
+  linux:
+    network:
+      host:
+        prx:
+          address: ${_param:openstack_proxy_address}
+          names:
+          - prx
+          - prx.${_param:cluster_domain}
+        prx01:
+          address: ${_param:openstack_proxy_node01_address}
+          names:
+          - ${_param:openstack_proxy_node01_hostname}
+          - prx01.${_param:cluster_domain}
+        ctl:
+          address: ${_param:openstack_control_address}
+          names:
+          - ctl
+          - ctl.${_param:cluster_domain}
+        ctl01:
+          address: ${_param:openstack_control_node01_address}
+          names:
+          - ${_param:openstack_control_node01_hostname}
+          - ${_param:openstack_control_node01_hostname}.${_param:cluster_domain}
+        ctl02:
+          address: ${_param:openstack_control_node02_address}
+          names:
+          - ${_param:openstack_control_node02_hostname}
+          - ${_param:openstack_control_node02_hostname}.${_param:cluster_domain}
+        ctl03:
+          address: ${_param:openstack_control_node03_address}
+          names:
+          - ${_param:openstack_control_node03_hostname}
+          - ${_param:openstack_control_node03_hostname}.${_param:cluster_domain}
+        msg:
+          address: ${_param:openstack_message_queue_address}
+          names:
+          - msg
+          - msg.${_param:cluster_domain}
+        msg01:
+          address: ${_param:openstack_message_queue_node01_address}
+          names:
+          - ${_param:openstack_message_queue_node01_hostname}
+          - ${_param:openstack_message_queue_node01_hostname}.${_param:cluster_domain}
+        msg02:
+          address: ${_param:openstack_message_queue_node02_address}
+          names:
+          - ${_param:openstack_message_queue_node02_hostname}
+          - ${_param:openstack_message_queue_node02_hostname}.${_param:cluster_domain}
+        msg03:
+          address: ${_param:openstack_message_queue_node03_address}
+          names:
+          - ${_param:openstack_message_queue_node03_hostname}
+          - ${_param:openstack_message_queue_node03_hostname}.${_param:cluster_domain}
+        dbs:
+          address: ${_param:openstack_database_address}
+          names:
+          - dbs
+          - dbs.${_param:cluster_domain}
+        dbs01:
+          address: ${_param:openstack_database_node01_address}
+          names:
+          - ${_param:openstack_database_node01_hostname}
+          - ${_param:openstack_database_node01_hostname}.${_param:cluster_domain}
+        dbs02:
+          address: ${_param:openstack_database_node02_address}
+          names:
+          - ${_param:openstack_database_node02_hostname}
+          - ${_param:openstack_database_node02_hostname}.${_param:cluster_domain}
+        dbs03:
+          address: ${_param:openstack_database_node03_address}
+          names:
+          - ${_param:openstack_database_node03_hostname}
+          - ${_param:openstack_database_node03_hostname}.${_param:cluster_domain}
+        cmp01:
+          address: ${_param:openstack_compute_node01_address}
+          names:
+          - ${_param:openstack_compute_node01_hostname}
+          - ${_param:openstack_compute_node01_hostname}.${_param:cluster_domain}
+        cmp02:
+          address: ${_param:openstack_compute_node02_address}
+          names:
+          - ${_param:openstack_compute_node02_hostname}
+          - ${_param:openstack_compute_node02_hostname}.${_param:cluster_domain}
diff --git a/classes/cluster/os_ha_contrail_40/openstack/proxy.yml b/classes/cluster/os_ha_contrail_40/openstack/proxy.yml
new file mode 100644
index 0000000..bb121e2
--- /dev/null
+++ b/classes/cluster/os_ha_contrail_40/openstack/proxy.yml
@@ -0,0 +1,17 @@
+classes:
+- system.nginx.server.single
+- system.nginx.server.proxy.opencontrail_web
+- system.nginx.server.proxy.openstack_api
+- system.nginx.server.proxy.openstack_vnc
+- system.nginx.server.proxy.openstack_web
+- system.salt.minion.cert.proxy
+- cluster.os_ha_contrail_40
+parameters:
+  _param:
+    cluster_vip_address: ${_param:openstack_proxy_address}
+    nginx_proxy_ssl:
+      enabled: true
+      authority: ${_param:salt_minion_ca_authority}
+      engine: salt
+      mode: secure
+    salt_minion_ca_host: cfg01.${_param:cluster_domain}
diff --git a/classes/cluster/os_ha_ovs/openstack/control.yml b/classes/cluster/os_ha_ovs/openstack/control.yml
index d2740df..4db2dac 100644
--- a/classes/cluster/os_ha_ovs/openstack/control.yml
+++ b/classes/cluster/os_ha_ovs/openstack/control.yml
@@ -24,6 +24,7 @@
 - system.designate.server.backend.bind
 - system.galera.server.cluster
 - system.galera.server.database.cinder
+- system.galera.server.database.designate
 - system.galera.server.database.glance
 - system.galera.server.database.heat
 - system.galera.server.database.keystone
diff --git a/classes/cluster/sl_k8s_calico/infra/init.yml b/classes/cluster/sl_k8s_calico/infra/init.yml
index 5a4b58d..027faca 100644
--- a/classes/cluster/sl_k8s_calico/infra/init.yml
+++ b/classes/cluster/sl_k8s_calico/infra/init.yml
@@ -9,9 +9,6 @@
 - system.openssh.server.team.mcp_qa
 - system.openssh.server.team.k8s_team
 - system.rsyslog.client.single
-- system.telegraf.agent
-- system.prometheus.collector
-- service.grafana.collector
 parameters:
   _param:
     # infra service addresses
diff --git a/classes/cluster/sl_k8s_calico/kubernetes/compute.yml b/classes/cluster/sl_k8s_calico/kubernetes/compute.yml
index 81cb2d7..057919c 100644
--- a/classes/cluster/sl_k8s_calico/kubernetes/compute.yml
+++ b/classes/cluster/sl_k8s_calico/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.sl_k8s_calico
diff --git a/classes/cluster/sl_k8s_calico/stacklight/client.yml b/classes/cluster/sl_k8s_calico/stacklight/client.yml
index 5fd4043..393449c 100644
--- a/classes/cluster/sl_k8s_calico/stacklight/client.yml
+++ b/classes/cluster/sl_k8s_calico/stacklight/client.yml
@@ -4,9 +4,6 @@
 - system.grafana.client
 - system.grafana.client.datasource.prometheus
 - system.kibana.client.single
-- system.heka.log_collector.single
-- system.heka.log_collector.output.telegraf
-- cluster.sl_k8s_calico
 parameters:
   _param:
     # Elasticsearch/Kibana client parameters
diff --git a/classes/cluster/sl_k8s_calico/stacklight/init.yml b/classes/cluster/sl_k8s_calico/stacklight/init.yml
index 6df9960..3237575 100644
--- a/classes/cluster/sl_k8s_calico/stacklight/init.yml
+++ b/classes/cluster/sl_k8s_calico/stacklight/init.yml
@@ -1,5 +1,8 @@
 classes:
+- service.grafana.collector
 - system.linux.system.repo.mcp.extra
+- system.heka.log_collector.single
+- system.heka.log_collector.output.telegraf
 - system.prometheus.collector
 - system.telegraf.agent
 parameters:
diff --git a/classes/cluster/sl_k8s_contrail/infra/init.yml b/classes/cluster/sl_k8s_contrail/infra/init.yml
index 92f6893..d5b43d9 100644
--- a/classes/cluster/sl_k8s_contrail/infra/init.yml
+++ b/classes/cluster/sl_k8s_contrail/infra/init.yml
@@ -1,11 +1,8 @@
 classes:
-- service.grafana.collector
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.mcp.salt
 - system.linux.system.repo.ubuntu
 - system.rsyslog.client.single
-- system.telegraf.agent
-- system.prometheus.collector
 parameters:
   _param:
     # infra service addresses
diff --git a/classes/cluster/sl_k8s_contrail/kubernetes/compute.yml b/classes/cluster/sl_k8s_contrail/kubernetes/compute.yml
index fb174a5..351f55e 100644
--- a/classes/cluster/sl_k8s_contrail/kubernetes/compute.yml
+++ b/classes/cluster/sl_k8s_contrail/kubernetes/compute.yml
@@ -1,6 +1,7 @@
 classes:
 - system.linux.system.repo.docker
 - system.kubernetes.pool.cluster
+- system.linux.network.hosts
 - system.salt.minion.cert.k8s_client
 - system.salt.minion.cert.etcd_client
 - cluster.sl_k8s_contrail.opencontrail.compute
diff --git a/classes/cluster/sl_k8s_contrail/stacklight/client.yml b/classes/cluster/sl_k8s_contrail/stacklight/client.yml
index 6cb2915..393449c 100644
--- a/classes/cluster/sl_k8s_contrail/stacklight/client.yml
+++ b/classes/cluster/sl_k8s_contrail/stacklight/client.yml
@@ -4,9 +4,6 @@
 - system.grafana.client
 - system.grafana.client.datasource.prometheus
 - system.kibana.client.single
-- system.heka.log_collector.single
-- system.heka.log_collector.output.telegraf
-- cluster.sl_k8s_contrail
 parameters:
   _param:
     # Elasticsearch/Kibana client parameters
diff --git a/classes/cluster/sl_k8s_contrail/stacklight/init.yml b/classes/cluster/sl_k8s_contrail/stacklight/init.yml
index 48ad663..f57c228 100644
--- a/classes/cluster/sl_k8s_contrail/stacklight/init.yml
+++ b/classes/cluster/sl_k8s_contrail/stacklight/init.yml
@@ -1,5 +1,8 @@
 classes:
+- service.grafana.collector
 - system.linux.system.repo.mcp.extra
+- system.heka.log_collector.single
+- system.heka.log_collector.output.telegraf
 - system.prometheus.collector
 - system.telegraf.agent
 parameters:
@@ -53,4 +56,4 @@
           - ${_param:stacklight_node03_hostname}.${_param:cluster_domain}
     system:
       name: ${_param:infra_config_hostname}
-      domain: ${_param:cluster_domain}
\ No newline at end of file
+      domain: ${_param:cluster_domain}
diff --git a/classes/cluster/sl_os_contrail/infra/config.yml b/classes/cluster/sl_os_contrail/infra/config.yml
index e3c77d4..d625393 100755
--- a/classes/cluster/sl_os_contrail/infra/config.yml
+++ b/classes/cluster/sl_os_contrail/infra/config.yml
@@ -37,7 +37,6 @@
 - system.mysql.client.database.neutron
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.opencontrail_control_cluster
-- system.reclass.storage.system.stacklightv2_server_cluster
 - cluster.sl_os_contrail.openstack.proxy
 - cluster.sl_os_contrail.stacklight.proxy
 - cluster.sl_os_contrail.openstack.dashboard
@@ -164,7 +163,6 @@
           name: ${_param:stacklight_monitor_node01_hostname}
           domain: ${_param:cluster_domain}
           classes:
-          - service.galera.master.cluster
           - system.docker.swarm.master
           - cluster.${_param:cluster_name}.stacklight.client
           - cluster.${_param:cluster_name}.stacklight.server
@@ -173,12 +171,10 @@
             linux_system_codename: xenial
             single_address: ${_param:stacklight_monitor_node01_address}
             keepalived_vip_priority: 100
-            mysql_cluster_role: master
         stacklight_monitor_node02:
           name: ${_param:stacklight_monitor_node02_hostname}
           domain: ${_param:cluster_domain}
           classes:
-          - service.galera.slave.cluster
           - system.docker.swarm.manager
           - cluster.${_param:cluster_name}.stacklight.server
           params:
@@ -186,12 +182,10 @@
             linux_system_codename: xenial
             single_address: ${_param:stacklight_monitor_node02_address}
             keepalived_vip_priority: 101
-            mysql_cluster_role: slave
         stacklight_monitor_node03:
           name: ${_param:stacklight_monitor_node03_hostname}
           domain: ${_param:cluster_domain}
           classes:
-          - service.galera.slave.cluster
           - system.docker.swarm.manager
           - cluster.${_param:cluster_name}.stacklight.server
           params:
@@ -199,7 +193,6 @@
             linux_system_codename: xenial
             single_address: ${_param:stacklight_monitor_node03_address}
             keepalived_vip_priority: 102
-            mysql_cluster_role: slave
         opencontrail_control_node01:
           params:
             rabbitmq_cluster_role: master
@@ -208,4 +201,22 @@
             rabbitmq_cluster_role: slave
         opencontrail_control_node03:
           params:
-            rabbitmq_cluster_role: slave
\ No newline at end of file
+            rabbitmq_cluster_role: slave
+        openstack_control_node01:
+          classes:
+          - service.galera.master.cluster
+          params:
+            linux_system_codename: xenial
+            mysql_cluster_role: master
+        openstack_control_node02:
+          classes:
+          - service.galera.slave.cluster
+          params:
+            linux_system_codename: xenial
+            mysql_cluster_role: slave
+        openstack_control_node03:
+          classes:
+          - service.galera.slave.cluster
+          params:
+            linux_system_codename: xenial
+            mysql_cluster_role: slave
\ No newline at end of file
diff --git a/classes/cluster/sl_os_contrail/init.yml b/classes/cluster/sl_os_contrail/init.yml
index 2829b40..7da2169 100755
--- a/classes/cluster/sl_os_contrail/init.yml
+++ b/classes/cluster/sl_os_contrail/init.yml
@@ -1,5 +1,4 @@
 classes:
-- service.grafana.collector
 - system.linux.system.repo.mcp.extra
 - system.linux.system.single
 - system.rsyslog.client.single
@@ -7,8 +6,6 @@
 - system.openssh.server.team.tcpcloud
 - system.openssh.server.team.stacklight
 - system.openssh.server.team.mcp_qa
-- system.prometheus.collector
-- system.telegraf.agent
 - cluster.sl_os_contrail.infra
 - cluster.sl_os_contrail.opencontrail
 - cluster.sl_os_contrail.openstack
diff --git a/classes/cluster/sl_os_contrail/stacklight/client.yml b/classes/cluster/sl_os_contrail/stacklight/client.yml
index 2ed7c46..40a4c38 100755
--- a/classes/cluster/sl_os_contrail/stacklight/client.yml
+++ b/classes/cluster/sl_os_contrail/stacklight/client.yml
@@ -3,9 +3,6 @@
 - system.grafana.client
 - system.grafana.client.datasource.prometheus
 - system.kibana.client.single
-- system.heka.log_collector.single
-- system.heka.log_collector.output.telegraf
-- cluster.sl_os_contrail
 parameters:
   _param:
     # Elasticsearch/Kibana client parameters
diff --git a/classes/cluster/sl_os_contrail/stacklight/init.yml b/classes/cluster/sl_os_contrail/stacklight/init.yml
index 6d1102c..8c63110 100755
--- a/classes/cluster/sl_os_contrail/stacklight/init.yml
+++ b/classes/cluster/sl_os_contrail/stacklight/init.yml
@@ -1,5 +1,8 @@
 classes:
+- service.grafana.collector
 - system.linux.system.repo.mcp.extra
+- system.heka.log_collector.single
+- system.heka.log_collector.output.telegraf
 - system.prometheus.collector
 - system.telegraf.agent
 parameters:
diff --git a/classes/cluster/sl_os_contrail/stacklight/server.yml b/classes/cluster/sl_os_contrail/stacklight/server.yml
index a4a90b2..819404c 100755
--- a/classes/cluster/sl_os_contrail/stacklight/server.yml
+++ b/classes/cluster/sl_os_contrail/stacklight/server.yml
@@ -80,9 +80,4 @@
   elasticsearch:
     server:
       heap:
-        size: 1
-  keepalived:
-    cluster:
-      instance:
-        VIP:
-          enabled: false
\ No newline at end of file
+        size: 1
\ No newline at end of file
diff --git a/classes/cluster/sl_os_ovs/stacklight/client.yml b/classes/cluster/sl_os_ovs/stacklight/client.yml
index 9d5bb82..4d473ac 100644
--- a/classes/cluster/sl_os_ovs/stacklight/client.yml
+++ b/classes/cluster/sl_os_ovs/stacklight/client.yml
@@ -3,9 +3,6 @@
 - system.grafana.client
 - system.grafana.client.datasource.prometheus
 - system.kibana.client.single
-- system.heka.log_collector.single
-- system.heka.log_collector.output.telegraf
-- cluster.sl_os_ovs
 parameters:
   _param:
     # Elasticsearch/Kibana client parameters
diff --git a/classes/cluster/sl_os_ovs/stacklight/init.yml b/classes/cluster/sl_os_ovs/stacklight/init.yml
index 86b0dc3..3e56adb 100644
--- a/classes/cluster/sl_os_ovs/stacklight/init.yml
+++ b/classes/cluster/sl_os_ovs/stacklight/init.yml
@@ -1,5 +1,8 @@
 classes:
+- service.grafana.collector
 - system.linux.system.repo.mcp.extra
+- system.heka.log_collector.single
+- system.heka.log_collector.output.telegraf
 - system.prometheus.collector
 - system.telegraf.agent
 parameters:
diff --git a/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml b/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
index 3cda036..b21c692 100644
--- a/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
@@ -131,6 +131,7 @@
 
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml b/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml
index 537cafb..9b67ace 100644
--- a/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml
@@ -121,6 +121,7 @@
     ceilometer_influxdb_password: lmapass
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml b/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml
index cd42a02..46f4365 100644
--- a/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml
@@ -116,6 +116,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp05-dvr/openstack/init.yml b/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
index 28a045d..39851a2 100644
--- a/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
@@ -83,6 +83,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp05-ovs/openstack/init.yml b/classes/cluster/virtual-mcp05-ovs/openstack/init.yml
index a557f04..e948cfe 100644
--- a/classes/cluster/virtual-mcp05-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp05-ovs/openstack/init.yml
@@ -83,6 +83,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp10-contrail/openstack/init.yml b/classes/cluster/virtual-mcp10-contrail/openstack/init.yml
index d00d8e7..5e746a4 100755
--- a/classes/cluster/virtual-mcp10-contrail/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-contrail/openstack/init.yml
@@ -72,6 +72,7 @@
     ceilometer_influxdb_password: lmapass
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp10-dvr/openstack/init.yml b/classes/cluster/virtual-mcp10-dvr/openstack/init.yml
index f5683a3..4e7ca02 100644
--- a/classes/cluster/virtual-mcp10-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-dvr/openstack/init.yml
@@ -84,6 +84,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp10-ovs/openstack/init.yml b/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
index b38bac6..75e6d36 100644
--- a/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
@@ -84,6 +84,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml
index 28b0404..33345a4 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml
@@ -111,6 +111,7 @@
     ceilometer_influxdb_password: lmapass
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp11-contrail/openstack/init.yml b/classes/cluster/virtual-mcp11-contrail/openstack/init.yml
index cb3d696..f673ab7 100755
--- a/classes/cluster/virtual-mcp11-contrail/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail/openstack/init.yml
@@ -104,6 +104,7 @@
     ceilometer_influxdb_password: lmapass
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp11-dvr/openstack/init.yml b/classes/cluster/virtual-mcp11-dvr/openstack/init.yml
index 1d76d2d..3a73066 100644
--- a/classes/cluster/virtual-mcp11-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-dvr/openstack/init.yml
@@ -89,6 +89,7 @@
     ceilometer_influxdb_password: lmapass
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp11-k8s-calico-dyn/kubernetes/init.yml b/classes/cluster/virtual-mcp11-k8s-calico-dyn/kubernetes/init.yml
index 9d0cbe9..703d521 100644
--- a/classes/cluster/virtual-mcp11-k8s-calico-dyn/kubernetes/init.yml
+++ b/classes/cluster/virtual-mcp11-k8s-calico-dyn/kubernetes/init.yml
@@ -76,6 +76,7 @@
           - ndots:5
           - timeout:2
           - attempts:2
+      purge_hosts: true
       host:
         ctl:
           address: ${_param:kubernetes_control_address}
diff --git a/classes/cluster/virtual-mcp11-k8s-calico-minimal/kubernetes/init.yml b/classes/cluster/virtual-mcp11-k8s-calico-minimal/kubernetes/init.yml
index 21aaca3..a7cc262 100644
--- a/classes/cluster/virtual-mcp11-k8s-calico-minimal/kubernetes/init.yml
+++ b/classes/cluster/virtual-mcp11-k8s-calico-minimal/kubernetes/init.yml
@@ -72,6 +72,7 @@
           - ndots:5
           - timeout:2
           - attempts:2
+      purge_hosts: true
       host:
         ctl:
           address: ${_param:kubernetes_control_address}
diff --git a/classes/cluster/virtual-mcp11-k8s-calico/kubernetes/init.yml b/classes/cluster/virtual-mcp11-k8s-calico/kubernetes/init.yml
index 571f908..ed42764 100644
--- a/classes/cluster/virtual-mcp11-k8s-calico/kubernetes/init.yml
+++ b/classes/cluster/virtual-mcp11-k8s-calico/kubernetes/init.yml
@@ -76,6 +76,7 @@
           - ndots:5
           - timeout:2
           - attempts:2
+      purge_hosts: true
       host:
         ctl:
           address: ${_param:kubernetes_control_address}
diff --git a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml
index 499f290..12e5170 100644
--- a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml
+++ b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml
@@ -47,5 +47,13 @@
         contrail_cni:
           image: ${_param:kubernetes_opencontrail_cni_image}
     common:
+      addons:
+        virtlet:
+          enabled: ${_param:kubernetes_virtlet_enabled}
+          namespace: kube-system
+          image: ${_param:kubernetes_virtlet_image}
+          hosts:
+          - ${_param:kubernetes_compute_node01_hostname}
+          - ${_param:kubernetes_compute_node02_hostname}
       hyperkube:
         image: ${_param:kubernetes_hyperkube_image}
diff --git a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/control.yml b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/control.yml
index 0a87c12..3aa295b 100644
--- a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/control.yml
+++ b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/control.yml
@@ -31,13 +31,6 @@
           enabled: ${_param:kubernetes_netchecker_enabled}
           agent_image: ${_param:kubernetes_netchecker_agent_image}
           server_image: ${_param:kubernetes_netchecker_server_image}
-        virtlet:
-          enabled: ${_param:kubernetes_virtlet_enabled}
-          namespace: kube-system
-          image: ${_param:kubernetes_virtlet_image}
-          hosts:
-          - ${_param:kubernetes_compute_node01_hostname}
-          - ${_param:kubernetes_compute_node02_hostname}
         contrail_network_controller:
           namespace: kube-system
           enabled: true
diff --git a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/init.yml b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/init.yml
index e404760..51aeacd 100644
--- a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/init.yml
+++ b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/init.yml
@@ -75,6 +75,7 @@
 
   linux:
     network:
+      purge_hosts: true
       host:
         ctl:
           address: ${_param:kubernetes_control_address}
diff --git a/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml b/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml
index 5391d23..83d35b8 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml
@@ -128,6 +128,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp11-ovs-ironic/openstack/init.yml b/classes/cluster/virtual-mcp11-ovs-ironic/openstack/init.yml
index 2cc6792..45b8a3c 100644
--- a/classes/cluster/virtual-mcp11-ovs-ironic/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs-ironic/openstack/init.yml
@@ -93,6 +93,7 @@
     linux_system_repo: 'deb [arch=amd64] http://mirror.fuel-infra.org/mcp-repos/ocata/xenial ocata main'
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}
diff --git a/classes/cluster/virtual-mcp11-ovs/openstack/init.yml b/classes/cluster/virtual-mcp11-ovs/openstack/init.yml
index 45fb5ca..bb1caaf 100644
--- a/classes/cluster/virtual-mcp11-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs/openstack/init.yml
@@ -86,6 +86,7 @@
     mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
   linux:
     network:
+      purge_hosts: true
       host:
         prx:
           address: ${_param:openstack_proxy_address}