Merge "moving virtual labs to new templates && system update"
diff --git a/classes/cluster/os_aio_contrail/openstack/compute.yml b/classes/cluster/os_aio_contrail/openstack/compute.yml
index f2916e6..fd9efe0 100755
--- a/classes/cluster/os_aio_contrail/openstack/compute.yml
+++ b/classes/cluster/os_aio_contrail/openstack/compute.yml
@@ -3,6 +3,7 @@
 - system.linux.system.repo.mcp.openstack
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.saltstack.xenial
+- system.linux.network.hosts
 - system.opencontrail.compute.cluster
 - system.opencontrail.client.cluster
 - system.opencontrail.client.resource.virtual_router
diff --git a/classes/cluster/os_aio_contrail/openstack/init.yml b/classes/cluster/os_aio_contrail/openstack/init.yml
index 721257a..938d9bd 100755
--- a/classes/cluster/os_aio_contrail/openstack/init.yml
+++ b/classes/cluster/os_aio_contrail/openstack/init.yml
@@ -10,8 +10,6 @@
     openstack_message_queue_address: ${_param:openstack_control_node01_address}
     openstack_message_queue_node01_hostname: msg01
     openstack_message_queue_node01_address: ${_param:openstack_control_node01_address}
-    openstack_compute_node01_hostname: cmp01
-    openstack_compute_node02_hostname: cmp02
     openstack_compute_node01_address: 172.16.10.95
     openstack_compute_node02_address: 172.16.10.96
 
diff --git a/classes/cluster/os_aio_ovs/openstack/compute.yml b/classes/cluster/os_aio_ovs/openstack/compute.yml
index 3631a07..605d429 100644
--- a/classes/cluster/os_aio_ovs/openstack/compute.yml
+++ b/classes/cluster/os_aio_ovs/openstack/compute.yml
@@ -2,6 +2,7 @@
 - system.linux.system.repo.mcp.openstack
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.saltstack.xenial
+- system.linux.network.hosts
 - service.neutron.compute.single
 - cluster.os_aio_ovs
 parameters:
diff --git a/classes/cluster/os_ha_contrail/openstack/compute.yml b/classes/cluster/os_ha_contrail/openstack/compute.yml
index 04cfed4..75921c9 100755
--- a/classes/cluster/os_ha_contrail/openstack/compute.yml
+++ b/classes/cluster/os_ha_contrail/openstack/compute.yml
@@ -3,6 +3,7 @@
 - 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.cluster
 - system.opencontrail.client.cluster
diff --git a/classes/cluster/os_ha_ovs/openstack/compute.yml b/classes/cluster/os_ha_ovs/openstack/compute.yml
index e86bf67..17634d0 100644
--- a/classes/cluster/os_ha_ovs/openstack/compute.yml
+++ b/classes/cluster/os_ha_ovs/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - cluster.os_ha_ovs
diff --git a/classes/cluster/os_ha_ovs_syndic/openstack/compute.yml b/classes/cluster/os_ha_ovs_syndic/openstack/compute.yml
index c3b76fd..544640d 100644
--- a/classes/cluster/os_ha_ovs_syndic/openstack/compute.yml
+++ b/classes/cluster/os_ha_ovs_syndic/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - cluster.os_ha_ovs_syndic
diff --git a/classes/cluster/sl_os_contrail/openstack/compute.yml b/classes/cluster/sl_os_contrail/openstack/compute.yml
index 702ce7c..bbc62d7 100755
--- a/classes/cluster/sl_os_contrail/openstack/compute.yml
+++ b/classes/cluster/sl_os_contrail/openstack/compute.yml
@@ -3,6 +3,7 @@
 - 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.cluster
 - system.opencontrail.client.cluster
diff --git a/classes/cluster/sl_os_ovs/openstack/compute.yml b/classes/cluster/sl_os_ovs/openstack/compute.yml
index 337e062..0a17475 100644
--- a/classes/cluster/sl_os_ovs/openstack/compute.yml
+++ b/classes/cluster/sl_os_ovs/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.prometheus.exporters.libvirt
diff --git a/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml b/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml
index aff7d8b..ba54ac1 100644
--- a/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml
+++ b/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml
@@ -19,10 +19,6 @@
 - system.keystone.client.service.designate
 - system.mysql.client.single
 - 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.cicd_control_cluster
 - cluster.virtual-mcp-ocata-cicd.openstack.proxy
 - cluster.virtual-mcp-ocata-cicd.stacklight.proxy
 - cluster.virtual-mcp-ocata-cicd.infra
@@ -55,9 +51,127 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_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:
+        cicd_control_node01:
+          name: ${_param:cicd_control_node01_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.cicd.control.master
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: xenial
+            single_address: ${_param:cicd_control_node01_address}
+            keepalived_vip_priority: 103
+        cicd_control_node02:
+          name: ${_param:cicd_control_node02_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.cicd.control.slave
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: xenial
+            single_address: ${_param:cicd_control_node02_address}
+            keepalived_vip_priority: 102
+            docker_swarm_role: worker
+        cicd_control_node03:
+          name: ${_param:cicd_control_node03_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.cicd.control.slave
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: xenial
+            single_address: ${_param:cicd_control_node03_address}
+            keepalived_vip_priority: 101
+            docker_swarm_role: worker
         openstack_control_node01:
           classes:
           - service.galera.master.cluster
@@ -76,22 +190,3 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp-ocata-cicd.openstack.proxy
-          params:
-            linux_system_codename: xenial
diff --git a/classes/cluster/virtual-mcp-ocata-cicd/openstack/compute.yml b/classes/cluster/virtual-mcp-ocata-cicd/openstack/compute.yml
index fb66a2f..d6fcac1 100644
--- a/classes/cluster/virtual-mcp-ocata-cicd/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-ocata-cicd/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml b/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
index 7d4f5f2..4a0dafa 100644
--- a/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
@@ -166,16 +166,6 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml b/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml
index 20916d2..2852360 100644
--- a/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml
@@ -20,9 +20,6 @@
 - system.keystone.client.service.designate
 - system.mysql.client.single
 - 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.stacklightv2_server_cluster
 - cluster.virtual-mcp-ocata-dvr.openstack.proxy
 - cluster.virtual-mcp-ocata-dvr.stacklight.proxy
@@ -56,8 +53,94 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -77,22 +160,7 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
+        stacklight_server_node01:
           classes:
-          - cluster.virtual-mcp-ocata-dvr.openstack.proxy
-          params:
-            linux_system_codename: xenial
+          - system.influxdb.server.single
+          - system.influxdb.database.stacklight
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp-ocata-dvr/openstack/compute.yml b/classes/cluster/virtual-mcp-ocata-dvr/openstack/compute.yml
index 6d75d6c..4e4a03e 100644
--- a/classes/cluster/virtual-mcp-ocata-dvr/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-ocata-dvr/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.ceilometer.agent.cluster
diff --git a/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml b/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml
index 537cafb..9690b49 100644
--- a/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-dvr/openstack/init.yml
@@ -157,16 +157,6 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml b/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml
index a1e70bb..7204cba 100644
--- a/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml
@@ -19,9 +19,6 @@
 - system.keystone.client.service.designate
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp-ocata-ovs.openstack.proxy
 - cluster.virtual-mcp-ocata-ovs.stacklight.proxy
@@ -55,8 +52,94 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -76,25 +159,6 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp-ocata-ovs.openstack.proxy
-          params:
-            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
diff --git a/classes/cluster/virtual-mcp-ocata-ovs/openstack/compute.yml b/classes/cluster/virtual-mcp-ocata-ovs/openstack/compute.yml
index 781acac..6d80e49 100644
--- a/classes/cluster/virtual-mcp-ocata-ovs/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-ocata-ovs/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml b/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml
index cd42a02..9aa45ce 100644
--- a/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-ovs/openstack/init.yml
@@ -152,16 +152,6 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp05-dvr/infra/config.yml b/classes/cluster/virtual-mcp05-dvr/infra/config.yml
index f752a2d..9b92254 100644
--- a/classes/cluster/virtual-mcp05-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp05-dvr/infra/config.yml
@@ -14,9 +14,6 @@
 - system.keystone.client.service.nova21
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp05-dvr.openstack.proxy
 - cluster.virtual-mcp05-dvr.stacklight.proxy
@@ -50,39 +47,114 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
           - service.galera.master.cluster
           params:
             mysql_cluster_role: master
+            linux_system_codename: xenial
         openstack_control_node02:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
+            linux_system_codename: xenial
         openstack_control_node03:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
+            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
-          - system.influxdb.database.stacklight
\ No newline at end of file
+          - system.influxdb.database.stacklight
diff --git a/classes/cluster/virtual-mcp05-dvr/init.yml b/classes/cluster/virtual-mcp05-dvr/init.yml
index 4732fd1..b7e9786 100644
--- a/classes/cluster/virtual-mcp05-dvr/init.yml
+++ b/classes/cluster/virtual-mcp05-dvr/init.yml
@@ -13,24 +13,30 @@
     cluster_domain: virtual-mcp05-dvr.local
     cluster_name: virtual-mcp05-dvr
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_database_address: 172.16.10.254
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
+    openstack_gateway_hostname: gtw
+    openstack_gateway_address: ${_param:openstack_gateway_node01_address}
+    openstack_gateway_node01_hostname: gtw01
+    openstack_gateway_node01_address: 172.16.10.94
     openstack_database_address: ${_param:openstack_control_address}
-    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_node03_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}
-    openstack_gateway_address: 172.16.10.110
+
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
diff --git a/classes/cluster/virtual-mcp05-dvr/openstack/compute.yml b/classes/cluster/virtual-mcp05-dvr/openstack/compute.yml
index 417fa61..5ea97c8 100644
--- a/classes/cluster/virtual-mcp05-dvr/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp05-dvr/openstack/compute.yml
@@ -3,6 +3,7 @@
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
 - system.linux.network.interface.single_ovs_dvr
+- system.linux.network.hosts
 - cluster.virtual-mcp05-dvr
 - system.heka.alarm.openstack_compute
 parameters:
diff --git a/classes/cluster/virtual-mcp05-dvr/openstack/init.yml b/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
index 4e1133c..73108aa 100644
--- a/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
@@ -115,17 +115,7 @@
           - ctl03
           - ctl03.${_param:cluster_domain}
         gtw01:
-          address: ${_param:openstack_gateway_address}
+          address: ${_param:openstack_gateway_node01_address}
           names:
           - gtw01
-          - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
+          - gtw01.${_param:cluster_domain}
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp05-ovs/infra/config.yml b/classes/cluster/virtual-mcp05-ovs/infra/config.yml
index f09d72e..6994b27 100644
--- a/classes/cluster/virtual-mcp05-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp05-ovs/infra/config.yml
@@ -14,9 +14,6 @@
 - system.keystone.client.service.nova21
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp05-ovs.openstack.proxy
 - cluster.virtual-mcp05-ovs.stacklight.proxy
@@ -50,42 +47,114 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
           - service.galera.master.cluster
           params:
             mysql_cluster_role: master
+            linux_system_codename: xenial
         openstack_control_node02:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
+            linux_system_codename: xenial
         openstack_control_node03:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp05-ovs.openstack.proxy
+            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
-          - system.influxdb.database.stacklight
+          - system.influxdb.database.stacklight
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp05-ovs/init.yml b/classes/cluster/virtual-mcp05-ovs/init.yml
index 27f0242..0db990b 100644
--- a/classes/cluster/virtual-mcp05-ovs/init.yml
+++ b/classes/cluster/virtual-mcp05-ovs/init.yml
@@ -13,26 +13,34 @@
     cluster_domain: virtual-mcp05-ovs.local
     cluster_name: virtual-mcp05-ovs
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
+    openstack_gateway_hostname: gtw
+    openstack_gateway_address: ${_param:openstack_gateway_node01_address}
+    openstack_gateway_node01_hostname: gtw01
+    openstack_gateway_node01_address: 172.16.10.94
     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}
-    openstack_gateway_address: 172.16.10.110
+
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
     stacklight_log_address: ${_param:stacklight_monitor_address}
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp05-ovs/openstack/compute.yml b/classes/cluster/virtual-mcp05-ovs/openstack/compute.yml
index 9316e40..8737159 100644
--- a/classes/cluster/virtual-mcp05-ovs/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp05-ovs/openstack/compute.yml
@@ -3,6 +3,7 @@
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
 - system.linux.network.interface.single_ovs_dvr
+- system.linux.network.hosts
 - system.heka.alarm.openstack_compute
 - cluster.virtual-mcp05-ovs
 parameters:
diff --git a/classes/cluster/virtual-mcp05-ovs/openstack/init.yml b/classes/cluster/virtual-mcp05-ovs/openstack/init.yml
index a557f04..442516f 100644
--- a/classes/cluster/virtual-mcp05-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp05-ovs/openstack/init.yml
@@ -119,13 +119,4 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
+
diff --git a/classes/cluster/virtual-mcp10-contrail/infra/config.yml b/classes/cluster/virtual-mcp10-contrail/infra/config.yml
index 9996261..1b8b3d2 100755
--- a/classes/cluster/virtual-mcp10-contrail/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-contrail/infra/config.yml
@@ -15,9 +15,7 @@
 - system.keystone.client.service.nova21
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
-- system.reclass.storage.system.openstack_compute_multi
-- system.reclass.storage.system.openstack_dashboard_single
-- system.reclass.storage.system.openstack_proxy_single
+- system.reclass.storage.system.opencontrail_control_cluster
 - system.reclass.storage.system.stacklight_server_cluster
 - cluster.virtual-mcp10-contrail.openstack.proxy
 - cluster.virtual-mcp10-contrail.stacklight.proxy
@@ -49,27 +47,115 @@
             host: prx
         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_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>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
           - service.galera.master.cluster
           params:
             mysql_cluster_role: master
+            linux_system_codename: xenial
         openstack_control_node02:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
+            linux_system_codename: xenial
         openstack_control_node03:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp10-contrail.openstack.proxy
+            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
diff --git a/classes/cluster/virtual-mcp10-contrail/init.yml b/classes/cluster/virtual-mcp10-contrail/init.yml
index 45741a8..6fab7f0 100755
--- a/classes/cluster/virtual-mcp10-contrail/init.yml
+++ b/classes/cluster/virtual-mcp10-contrail/init.yml
@@ -14,22 +14,21 @@
     cluster_name: virtual-mcp10-contrail
 
     # infra service addresses
-    infra_config_address: 172.16.10.100
-
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
-
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
     openstack_database_address: ${_param:openstack_control_address}
-    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_address: ${_param:openstack_control_node01_address}
     openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
@@ -51,7 +50,7 @@
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
     stacklight_log_address: ${_param:stacklight_monitor_address}
+    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
+
diff --git a/classes/cluster/virtual-mcp10-contrail/openstack/compute.yml b/classes/cluster/virtual-mcp10-contrail/openstack/compute.yml
index 8c50b04..4457e18 100755
--- a/classes/cluster/virtual-mcp10-contrail/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp10-contrail/openstack/compute.yml
@@ -3,6 +3,7 @@
 - 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.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp10-contrail/openstack/init.yml b/classes/cluster/virtual-mcp10-contrail/openstack/init.yml
index d00d8e7..e7462cb 100755
--- a/classes/cluster/virtual-mcp10-contrail/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-contrail/openstack/init.yml
@@ -143,13 +143,3 @@
           names:
           - dbs03
           - dbs03.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp10-dvr/infra/config.yml b/classes/cluster/virtual-mcp10-dvr/infra/config.yml
index 93dd07a..7aa4041 100644
--- a/classes/cluster/virtual-mcp10-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-dvr/infra/config.yml
@@ -14,9 +14,6 @@
 - system.keystone.client.service.nova21
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp10-dvr.openstack.proxy
 - cluster.virtual-mcp10-dvr.stacklight.proxy
@@ -50,38 +47,113 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
           - service.galera.master.cluster
           params:
             mysql_cluster_role: master
+            linux_system_codename: xenial
         openstack_control_node02:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
+            linux_system_codename: xenial
         openstack_control_node03:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
+            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
diff --git a/classes/cluster/virtual-mcp10-dvr/init.yml b/classes/cluster/virtual-mcp10-dvr/init.yml
index a4e8672..5e74e05 100644
--- a/classes/cluster/virtual-mcp10-dvr/init.yml
+++ b/classes/cluster/virtual-mcp10-dvr/init.yml
@@ -13,24 +13,30 @@
     cluster_domain: virtual-mcp10-dvr.local
     cluster_name: virtual-mcp10-dvr
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_database_address: 172.16.10.254
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
+    openstack_gateway_hostname: gtw
+    openstack_gateway_address: ${_param:openstack_gateway_node01_address}
+    openstack_gateway_node01_hostname: gtw01
+    openstack_gateway_node01_address: 172.16.10.94
     openstack_database_address: ${_param:openstack_control_address}
-    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_node03_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}
-    openstack_gateway_address: 172.16.10.110
+
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
diff --git a/classes/cluster/virtual-mcp10-dvr/openstack/compute.yml b/classes/cluster/virtual-mcp10-dvr/openstack/compute.yml
index 43d3ab7..e25f34d 100644
--- a/classes/cluster/virtual-mcp10-dvr/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp10-dvr/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.linux.network.interface.single_ovs_dvr
diff --git a/classes/cluster/virtual-mcp10-dvr/openstack/init.yml b/classes/cluster/virtual-mcp10-dvr/openstack/init.yml
index f5683a3..45767fb 100644
--- a/classes/cluster/virtual-mcp10-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-dvr/openstack/init.yml
@@ -120,13 +120,4 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
+
diff --git a/classes/cluster/virtual-mcp10-ovs/infra/config.yml b/classes/cluster/virtual-mcp10-ovs/infra/config.yml
index a4461c3..35cda38 100644
--- a/classes/cluster/virtual-mcp10-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-ovs/infra/config.yml
@@ -14,9 +14,6 @@
 - system.keystone.client.service.nova21
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp10-ovs.openstack.proxy
 - cluster.virtual-mcp10-ovs.stacklight.proxy
@@ -50,42 +47,114 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
           - service.galera.master.cluster
           params:
             mysql_cluster_role: master
+            linux_system_codename: xenial
         openstack_control_node02:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
+            linux_system_codename: xenial
         openstack_control_node03:
           classes:
           - service.galera.slave.cluster
           params:
             mysql_cluster_role: slave
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp10-ovs.openstack.proxy
+            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
-          - system.influxdb.database.stacklight
+          - system.influxdb.database.stacklight
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp10-ovs/init.yml b/classes/cluster/virtual-mcp10-ovs/init.yml
index 4da06e4..aec02db 100644
--- a/classes/cluster/virtual-mcp10-ovs/init.yml
+++ b/classes/cluster/virtual-mcp10-ovs/init.yml
@@ -13,26 +13,35 @@
     cluster_domain: virtual-mcp10-ovs.local
     cluster_name: virtual-mcp10-ovs
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
+    openstack_gateway_hostname: gtw
+    openstack_gateway_address: ${_param:openstack_gateway_node01_address}
+    openstack_gateway_node01_hostname: gtw01
+    openstack_gateway_node01_address: 172.16.10.94
     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
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
-    stacklight_log_address: ${_param:stacklight_monitor_address}
-    openstack_gateway_address: 172.16.10.110
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
+    stacklight_log_address: ${_param:stacklight_monitor_address}
 
diff --git a/classes/cluster/virtual-mcp10-ovs/openstack/compute.yml b/classes/cluster/virtual-mcp10-ovs/openstack/compute.yml
index 0c22c07..fe22fbb 100644
--- a/classes/cluster/virtual-mcp10-ovs/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp10-ovs/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp10-ovs/openstack/init.yml b/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
index a7101a0..eb5a477 100644
--- a/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
@@ -120,13 +120,3 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml b/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml
index 3af2439..62fd211 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml
@@ -29,10 +29,7 @@
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.opencontrail_control_cluster
-- system.reclass.storage.system.openstack_compute_multi
-- system.reclass.storage.system.openstack_dashboard_single
-- system.reclass.storage.system.openstack_proxy_single
-- system.reclass.storage.system.stacklight_server_cluster
+- system.reclass.storage.system.stacklightv2_server_cluster
 - cluster.virtual-mcp11-contrail-nfv.openstack.proxy
 - cluster.virtual-mcp11-contrail-nfv.stacklight.proxy
 - cluster.virtual-mcp11-contrail-nfv
@@ -63,8 +60,96 @@
             host: prx
         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_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>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -84,34 +169,15 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp11-contrail-nfv.openstack.proxy
-          params:
-            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
           - system.influxdb.database.stacklight
         openstack_compute_node01:
-          name: ${_param:openstack_compute_node01_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - cluster.${_param:cluster_name}.openstack.compute
           params:
-            salt_master_host: ${_param:reclass_config_master}
-            linux_system_codename: ${_param:linux_system_codename}
-            single_address: 172.16.10.105
             compute_vrouter_dpdk_mac_address: 02:9e:de:d3:5b:ce #must be manually changed to mac of ens4
             compute_vrouter_dpdk_pci: "'0000:00:04.0'"
         openstack_compute_node02:
-          name: ${_param:openstack_compute_node02_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - cluster.${_param:cluster_name}.openstack.compute
           params:
-            salt_master_host: ${_param:reclass_config_master}
-            linux_system_codename: ${_param:linux_system_codename}
-            single_address: 172.16.10.106
             compute_vrouter_dpdk_mac_address: 02:de:aa:e6:12:81 #must be manually changed to mac of ens4
             compute_vrouter_dpdk_pci: "'0000:00:04.0'"
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/init.yml b/classes/cluster/virtual-mcp11-contrail-nfv/init.yml
index 6749750..d9ffa88 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/init.yml
@@ -15,22 +15,21 @@
     cluster_name: virtual-mcp11-contrail-nfv
 
     # infra service addresses
-    infra_config_address: 172.16.10.100
-
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
-
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
     openstack_database_address: ${_param:openstack_control_address}
-    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_address: ${_param:openstack_control_node01_address}
     openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
@@ -42,23 +41,19 @@
     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_address: 172.16.10.111
-    opencontrail_control_node02_address: 172.16.10.112
-    opencontrail_control_node03_address: 172.16.10.113
+    opencontrail_control_address: ${_param:openstack_control_address}
+    opencontrail_control_node01_address: ${_param:openstack_control_node01_address}
+    opencontrail_control_node02_address: ${_param:openstack_control_node02_address}
+    opencontrail_control_node03_address: ${_param:openstack_control_node03_address}
 
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
     stacklight_log_address: ${_param:stacklight_monitor_address}
-
-    openstack_compute_node01_hostname: cmp01
-    openstack_compute_node02_hostname: cmp02
+    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
 
   linux:
     network:
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/compute.yml b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/compute.yml
index 51217c4..f2f7bcd 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/compute.yml
@@ -3,6 +3,7 @@
 - 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.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml
index 28b0404..dd0e610 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/init.yml
@@ -182,16 +182,6 @@
           names:
           - dbs03
           - dbs03.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp11-contrail/infra/config.yml b/classes/cluster/virtual-mcp11-contrail/infra/config.yml
index ed6c8cc..e36368a 100755
--- a/classes/cluster/virtual-mcp11-contrail/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-contrail/infra/config.yml
@@ -29,9 +29,6 @@
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.opencontrail_control_cluster
-- system.reclass.storage.system.openstack_compute_multi
-- system.reclass.storage.system.openstack_dashboard_single
-- system.reclass.storage.system.openstack_proxy_single
 - system.reclass.storage.system.stacklightv2_server_cluster
 - cluster.virtual-mcp11-contrail.openstack.proxy
 - cluster.virtual-mcp11-contrail.stacklight.proxy
@@ -63,8 +60,96 @@
             host: prx
         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_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>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -84,8 +169,7 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_proxy_node01:
+        stacklight_server_node01:
           classes:
-          - cluster.virtual-mcp11-contrail.openstack.proxy
-          params:
-            linux_system_codename: xenial
+          - system.influxdb.server.single
+          - system.influxdb.database.stacklight
diff --git a/classes/cluster/virtual-mcp11-contrail/init.yml b/classes/cluster/virtual-mcp11-contrail/init.yml
index a1e738d..2c2d8b7 100755
--- a/classes/cluster/virtual-mcp11-contrail/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail/init.yml
@@ -21,22 +21,21 @@
     cluster_name: virtual-mcp11-contrail
 
     # infra service addresses
-    infra_config_address: 172.16.10.100
-
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
-
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
     openstack_database_address: ${_param:openstack_control_address}
-    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_address: ${_param:openstack_control_node01_address}
     openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
@@ -48,19 +47,18 @@
     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_address: 172.16.10.111
-    opencontrail_control_node02_address: 172.16.10.112
-    opencontrail_control_node03_address: 172.16.10.113
+    opencontrail_control_address: ${_param:openstack_control_address}
+    opencontrail_control_node01_address: ${_param:openstack_control_node01_address}
+    opencontrail_control_node02_address: ${_param:openstack_control_node02_address}
+    opencontrail_control_node03_address: ${_param:openstack_control_node03_address}
 
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-
-    stacklight_log_address: ${_param:stacklight_monitor_address}
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
+    stacklight_log_address: ${_param:stacklight_monitor_address}
     stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
 
   linux:
diff --git a/classes/cluster/virtual-mcp11-contrail/openstack/compute.yml b/classes/cluster/virtual-mcp11-contrail/openstack/compute.yml
index 3a894f8..dc0970b 100755
--- a/classes/cluster/virtual-mcp11-contrail/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp11-contrail/openstack/compute.yml
@@ -3,6 +3,7 @@
 - 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.ceilometer.agent.cluster
 - system.opencontrail.compute.cluster
diff --git a/classes/cluster/virtual-mcp11-contrail/openstack/init.yml b/classes/cluster/virtual-mcp11-contrail/openstack/init.yml
index cb3d696..9fe26a6 100755
--- a/classes/cluster/virtual-mcp11-contrail/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail/openstack/init.yml
@@ -135,16 +135,6 @@
           names:
           - ctl03
           - ctl03.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp11-dvr/infra/config.yml b/classes/cluster/virtual-mcp11-dvr/infra/config.yml
index f2020dc..cf0a00f 100644
--- a/classes/cluster/virtual-mcp11-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-dvr/infra/config.yml
@@ -18,9 +18,6 @@
 - system.keystone.client.service.cinder3
 - system.mysql.client.single
 - 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.stacklightv2_server_cluster
 - cluster.virtual-mcp11-dvr.openstack.proxy
 - cluster.virtual-mcp11-dvr.stacklight.proxy
@@ -54,8 +51,94 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -75,22 +158,7 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
+        stacklight_server_node01:
           classes:
-          - cluster.virtual-mcp11-dvr.openstack.proxy
-          params:
-            linux_system_codename: xenial
+          - system.influxdb.server.single
+          - system.influxdb.database.stacklight
diff --git a/classes/cluster/virtual-mcp11-dvr/init.yml b/classes/cluster/virtual-mcp11-dvr/init.yml
index 6f2b69d..d8728d7 100644
--- a/classes/cluster/virtual-mcp11-dvr/init.yml
+++ b/classes/cluster/virtual-mcp11-dvr/init.yml
@@ -20,29 +20,31 @@
     cluster_domain: virtual-mcp11-dvr.local
     cluster_name: virtual-mcp11-dvr
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_database_address: 172.16.10.254
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
     openstack_database_address: ${_param:openstack_control_address}
-    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_node03_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}
-    openstack_gateway_address: 172.16.10.110
+
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-    stacklight_log_address: ${_param:stacklight_monitor_address}
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
+    stacklight_log_address: ${_param:stacklight_monitor_address}
     stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
diff --git a/classes/cluster/virtual-mcp11-dvr/openstack/compute.yml b/classes/cluster/virtual-mcp11-dvr/openstack/compute.yml
index f37432b..6abc6d0 100644
--- a/classes/cluster/virtual-mcp11-dvr/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp11-dvr/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.ceilometer.agent.cluster
diff --git a/classes/cluster/virtual-mcp11-dvr/openstack/init.yml b/classes/cluster/virtual-mcp11-dvr/openstack/init.yml
index 1d76d2d..85e22c4 100644
--- a/classes/cluster/virtual-mcp11-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-dvr/openstack/init.yml
@@ -125,16 +125,6 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp11-k8s-calico/infra/config.yml b/classes/cluster/virtual-mcp11-k8s-calico/infra/config.yml
index 865cb74..43b744b 100644
--- a/classes/cluster/virtual-mcp11-k8s-calico/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-k8s-calico/infra/config.yml
@@ -20,27 +20,71 @@
     linux_system_codename: xenial
     salt_api_password_hash: "$6$WV0P1shnoDh2gI/Z$22/Bcd7ffMv0jDlFpT63cAU4PiXHz9pjXwngToKwqAsgoeK4HNR3PiKaushjxp3JsQ8hNoJmAC6TxzVqfV8WH/"
     salt_master_host: ${_param:infra_config_deploy_address}
+  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>>__equals__cfg01
+          cluster_param:
+            infra_config_address:
+              value_template: <<node_control_ip>>
+            infra_config_deploy_address:
+              value_template: <<node_deploy_ip>>
+        infra_proxy:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.stacklight.proxy
+        kubernetes_control01:
+          expression: <<node_hostname>>__equals__ctl01
+          cluster_param:
+            kubernetes_control_node01_address:
+              value_template: <<node_control_ip>>
+        kubernetes_control02:
+          expression: <<node_hostname>>__equals__ctl02
+          cluster_param:
+            kubernetes_control_node02_address:
+              value_template: <<node_control_ip>>
+        kubernetes_control03:
+          expression: <<node_hostname>>__equals__ctl03
+          cluster_param:
+            kubernetes_control_node03_address:
+              value_template: <<node_control_ip>>
+        kubernetes_compute:
+          expression: <<node_hostname>>__startswith__cmp
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.kubernetes.compute
+        stacklight_monitor01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_node02_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_node03_address:
+              value_template: <<node_control_ip>>
       node:
-        kubernetes_compute_node01:
-          name: ${_param:kubernetes_compute_node01_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - cluster.${_param:cluster_name}.kubernetes.compute
-          params:
-            salt_master_host: ${_param:infra_config_deploy_address}
-            linux_system_codename: xenial
-            single_address: ${_param:kubernetes_compute_node01_address}
-        kubernetes_compute_node02:
-          name: ${_param:kubernetes_compute_node02_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - cluster.${_param:cluster_name}.kubernetes.compute
-          params:
-            salt_master_host: ${_param:infra_config_deploy_address}
-            linux_system_codename: xenial
-            single_address: ${_param:kubernetes_compute_node02_address}
         prx_node:
           name: ${_param:kubernetes_proxy_node01_hostname}
           domain: ${_param:cluster_domain}
@@ -89,4 +133,4 @@
             linux_system_codename: xenial
             single_address: ${_param:stacklight_node03_address}
             keepalived_vip_priority: 102
-            mysql_cluster_role: slave
+            mysql_cluster_role: slave
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp11-k8s-contrail/infra/config.yml b/classes/cluster/virtual-mcp11-k8s-contrail/infra/config.yml
index b6e8f4a..4dcefe5 100644
--- a/classes/cluster/virtual-mcp11-k8s-contrail/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-k8s-contrail/infra/config.yml
@@ -28,27 +28,71 @@
           proto: static
           address: ${_param:single_address}
           netmask: 255.255.255.0
+  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>>__equals__cfg01
+          cluster_param:
+            infra_config_address:
+              value_template: <<node_control_ip>>
+            infra_config_deploy_address:
+              value_template: <<node_deploy_ip>>
+        infra_proxy:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.stacklight.proxy
+        kubernetes_control01:
+          expression: <<node_hostname>>__equals__ctl01
+          cluster_param:
+            kubernetes_control_node01_address:
+              value_template: <<node_control_ip>>
+        kubernetes_control02:
+          expression: <<node_hostname>>__equals__ctl02
+          cluster_param:
+            kubernetes_control_node02_address:
+              value_template: <<node_control_ip>>
+        kubernetes_control03:
+          expression: <<node_hostname>>__equals__ctl03
+          cluster_param:
+            kubernetes_control_node03_address:
+              value_template: <<node_control_ip>>
+        kubernetes_compute:
+          expression: <<node_hostname>>__startswith__cmp
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.kubernetes.compute
+        stacklight_monitor01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_node02_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_node03_address:
+              value_template: <<node_control_ip>>
       node:
-        kubernetes_compute_node01:
-          name: ${_param:kubernetes_compute_node01_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - cluster.${_param:cluster_name}.kubernetes.compute
-          params:
-            salt_master_host: ${_param:infra_config_deploy_address}
-            linux_system_codename: xenial
-            single_address: ${_param:kubernetes_compute_node01_address}
-        kubernetes_compute_node02:
-          name: ${_param:kubernetes_compute_node02_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - cluster.${_param:cluster_name}.kubernetes.compute
-          params:
-            salt_master_host: ${_param:infra_config_deploy_address}
-            linux_system_codename: xenial
-            single_address: ${_param:kubernetes_compute_node02_address}
         prx_node:
           name: ${_param:kubernetes_proxy_node01_hostname}
           domain: ${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml b/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml
index a111de2..49dae30 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml
@@ -18,9 +18,6 @@
 - system.keystone.client.service.designate
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp11-ovs-dpdk.openstack.proxy
 - cluster.virtual-mcp11-ovs-dpdk.stacklight.proxy
@@ -54,8 +51,94 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -75,30 +158,15 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-            dpdk0_name: ens5
-            dpdk0_pci: '"0000:00:05.0"'
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-            dpdk0_name: ens5
-            dpdk0_pci: '"0000:00:05.0"'
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp11-ovs-dpdk.openstack.proxy
-          params:
-            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
           - system.influxdb.database.stacklight
+        openstack_compute_node01:
+          params:
+            dpdk0_name: ens5
+            dpdk0_pci: '"0000:00:05.0"'
+        openstack_compute_node02:
+          params:
+            dpdk0_name: ens5
+            dpdk0_pci: '"0000:00:05.0"'
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp11-ovs-dpdk/init.yml b/classes/cluster/virtual-mcp11-ovs-dpdk/init.yml
index 0f080dc..9ac4c6a 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/init.yml
@@ -14,26 +14,32 @@
     cluster_domain: virtual-mcp11-ovs-dpdk.local
     cluster_name: virtual-mcp11-ovs-dpdk
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
     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
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
-    stacklight_log_address: ${_param:stacklight_monitor_address}
-    openstack_gateway_address: 172.16.10.110
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
+    stacklight_log_address: ${_param:stacklight_monitor_address}
+    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
 
diff --git a/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/compute.yml b/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/compute.yml
index 53b6fb8..fb35dd4 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml b/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml
index 5391d23..fca0163 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/openstack/init.yml
@@ -164,16 +164,6 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml b/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml
index a456bd2..213c73d 100644
--- a/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml
@@ -20,10 +20,7 @@
 - system.keystone.client.service.nova-placement
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
-- system.reclass.storage.system.openstack_compute_multi
 - system.reclass.storage.system.openstack_baremetal_single
-- system.reclass.storage.system.openstack_dashboard_single
-- system.reclass.storage.system.stacklight_server_cluster
 - cluster.virtual-mcp11-ovs-ironic.openstack.proxy
 - cluster.virtual-mcp11-ovs-ironic.stacklight.proxy
 - cluster.virtual-mcp11-ovs-ironic
@@ -56,8 +53,68 @@
             host: prx
         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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        openstack_bmt:
+          expression: <<node_hostname>>__startswith__bmt
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.baremetal
+          cluster_param:
+            openstack_baremetal_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -77,29 +134,10 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp11-ovs-ironic.openstack.proxy
-          params:
-            linux_system_codename: xenial
-        stacklight_server_node01:
-          classes:
-          - system.influxdb.server.single
-          - system.influxdb.database.stacklight
         openstack_baremetal_node01:
           params:
             single_baremetal_address: ${_param:openstack_baremetal_node01_baremetal_address}
             keepalived_openstack_baremetal_vip_priority: 100
             ironic_api_type: 'deploy'
             tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
+            external_address: 10.16.0.110
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp11-ovs-ironic/openstack/compute.yml b/classes/cluster/virtual-mcp11-ovs-ironic/openstack/compute.yml
index 7cc8860..4b053a8 100644
--- a/classes/cluster/virtual-mcp11-ovs-ironic/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp11-ovs-ironic/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp11-ovs/infra/config.yml b/classes/cluster/virtual-mcp11-ovs/infra/config.yml
index ed8c765..15443b3 100644
--- a/classes/cluster/virtual-mcp11-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-ovs/infra/config.yml
@@ -17,9 +17,6 @@
 - system.keystone.client.service.cinder3
 - system.mysql.client.single
 - 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.stacklight_server_cluster
 - cluster.virtual-mcp11-ovs.openstack.proxy
 - cluster.virtual-mcp11-ovs.stacklight.proxy
@@ -53,8 +50,94 @@
             host: prx
         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>>
+        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>>
+        openstack_gateway:
+          expression: <<node_hostname>>__startswith__gtw
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.gateway
+          node_param:
+            tenant_address:
+              value_template: <<node_tenant_ip>>
+            external_address:
+              value_template: <<node_external_ip>>
+          cluster_param:
+            openstack_gateway_node01_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node01:
+          expression: <<node_hostname>>__equals__mon01
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node02:
+          expression: <<node_hostname>>__equals__mon02
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        stacklight_monitor_node03:
+          expression: <<node_hostname>>__equals__mon03
+          cluster_param:
+            stacklight_monitor_node03_address:
+              value_template: <<node_control_ip>>
+        openstack_dashboard:
+          expression: <<node_hostname>>__startswith__prx
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.openstack.dashboard
+              - cluster.<<node_cluster>>.openstack.proxy
+          cluster_param:
+            openstack_proxy_node01_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -74,25 +157,6 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        openstack_compute_node01:
-          params:
-            single_address: 172.16.10.105
-            tenant_address: 10.1.0.105
-            external_address: 10.16.0.105
-        openstack_compute_node02:
-          params:
-            single_address: 172.16.10.106
-            tenant_address: 10.1.0.106
-            external_address: 10.16.0.106
-        openstack_gateway_node01:
-          params:
-            tenant_address: 10.1.0.110
-            external_address: 10.16.0.110
-        openstack_proxy_node01:
-          classes:
-          - cluster.virtual-mcp11-ovs.openstack.proxy
-          params:
-            linux_system_codename: xenial
         stacklight_server_node01:
           classes:
           - system.influxdb.server.single
diff --git a/classes/cluster/virtual-mcp11-ovs/init.yml b/classes/cluster/virtual-mcp11-ovs/init.yml
index a5a1650..f923170 100644
--- a/classes/cluster/virtual-mcp11-ovs/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs/init.yml
@@ -14,26 +14,33 @@
     cluster_domain: virtual-mcp11-ovs.local
     cluster_name: virtual-mcp11-ovs
     # infra service addresses
-    infra_config_address: 172.16.10.100
+    # infra service addresses
+    infra_config_address: 172.16.10.90
     # openstack service addresses
-    openstack_proxy_address: 172.16.10.121
-    openstack_proxy_node01_address: 172.16.10.121
+    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_hostname: ctl
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
     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_control_node01_address: 172.16.10.91
+    openstack_control_node02_address: 172.16.10.92
+    openstack_control_node03_address: 172.16.10.93
     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
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
-    stacklight_log_address: ${_param:stacklight_monitor_address}
-    openstack_gateway_address: 172.16.10.110
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
+    stacklight_log_address: ${_param:stacklight_monitor_address}
+    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
 
diff --git a/classes/cluster/virtual-mcp11-ovs/openstack/compute.yml b/classes/cluster/virtual-mcp11-ovs/openstack/compute.yml
index 14b3d15..e1aec78 100644
--- a/classes/cluster/virtual-mcp11-ovs/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp11-ovs/openstack/compute.yml
@@ -2,6 +2,7 @@
 - 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.neutron.compute.cluster
 - system.heka.alarm.openstack_compute
diff --git a/classes/cluster/virtual-mcp11-ovs/openstack/init.yml b/classes/cluster/virtual-mcp11-ovs/openstack/init.yml
index 45fb5ca..83304b8 100644
--- a/classes/cluster/virtual-mcp11-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs/openstack/init.yml
@@ -122,16 +122,6 @@
           names:
           - gtw01
           - gtw01.${_param:cluster_domain}
-        cmp01:
-          address: 172.16.10.105
-          names:
-          - cmp01
-          - cmp01.${_param:cluster_domain}
-        cmp02:
-          address: 172.16.10.106
-          names:
-          - cmp02
-          - cmp02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/system b/classes/system
index 9b85a38..fbfbddf 160000
--- a/classes/system
+++ b/classes/system
@@ -1 +1 @@
-Subproject commit 9b85a38800599124dfe4118d9bb007eee52b6932
+Subproject commit fbfbddfcf5cae4f39663288d772e8a6cdae3ced6
diff --git a/nodes/cfg01.virtual-mcp-ocata-cicd.local.yml b/nodes/cfg01.virtual-mcp-ocata-cicd.local.yml
deleted file mode 100644
index 671695d..0000000
--- a/nodes/cfg01.virtual-mcp-ocata-cicd.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp-ocata-cicd.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp-ocata-cicd.local
diff --git a/nodes/cfg01.virtual-mcp-ocata-dvr.local.yml b/nodes/cfg01.virtual-mcp-ocata-dvr.local.yml
deleted file mode 100644
index 7bac15f..0000000
--- a/nodes/cfg01.virtual-mcp-ocata-dvr.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp-ocata-dvr.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp-ocata-dvr.local
diff --git a/nodes/cfg01.virtual-mcp-ocata-ovs.local.yml b/nodes/cfg01.virtual-mcp-ocata-ovs.local.yml
deleted file mode 100644
index 43202d6..0000000
--- a/nodes/cfg01.virtual-mcp-ocata-ovs.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp-ocata-ovs.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp-ocata-ovs.local
diff --git a/nodes/cfg01.virtual-mcp05-dvr.local.yml b/nodes/cfg01.virtual-mcp05-dvr.local.yml
deleted file mode 100755
index 5491179..0000000
--- a/nodes/cfg01.virtual-mcp05-dvr.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp05-dvr.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp05-dvr.local
diff --git a/nodes/cfg01.virtual-mcp05-ovs.local.yml b/nodes/cfg01.virtual-mcp05-ovs.local.yml
deleted file mode 100755
index 5b500f2..0000000
--- a/nodes/cfg01.virtual-mcp05-ovs.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp05-ovs.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp05-ovs.local
diff --git a/nodes/cfg01.virtual-mcp10-contrail.local.yml b/nodes/cfg01.virtual-mcp10-contrail.local.yml
deleted file mode 100755
index fb2c57c..0000000
--- a/nodes/cfg01.virtual-mcp10-contrail.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp10-contrail.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp10-contrail.local
diff --git a/nodes/cfg01.virtual-mcp10-dvr.local.yml b/nodes/cfg01.virtual-mcp10-dvr.local.yml
deleted file mode 100755
index 14cef32..0000000
--- a/nodes/cfg01.virtual-mcp10-dvr.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp10-dvr.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp10-dvr.local
diff --git a/nodes/cfg01.virtual-mcp10-ovs.local.yml b/nodes/cfg01.virtual-mcp10-ovs.local.yml
deleted file mode 100755
index d38969f..0000000
--- a/nodes/cfg01.virtual-mcp10-ovs.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp10-ovs.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp10-ovs.local
diff --git a/nodes/cfg01.virtual-mcp11-aio.local.yml b/nodes/cfg01.virtual-mcp11-aio.local.yml
deleted file mode 100644
index 88f3267..0000000
--- a/nodes/cfg01.virtual-mcp11-aio.local.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-classes:
-- system.linux.system.single
-- cluster.virtual-mcp11-aio.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
diff --git a/nodes/cfg01.virtual-mcp11-contrail-nfv.local.yml b/nodes/cfg01.virtual-mcp11-contrail-nfv.local.yml
deleted file mode 100644
index 911fdcc..0000000
--- a/nodes/cfg01.virtual-mcp11-contrail-nfv.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp11-contrail-nfv.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-contrail-nfv.local
diff --git a/nodes/cfg01.virtual-mcp11-contrail.local.yml b/nodes/cfg01.virtual-mcp11-contrail.local.yml
deleted file mode 100644
index a61f892..0000000
--- a/nodes/cfg01.virtual-mcp11-contrail.local.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-classes:
-- cluster.virtual-mcp11-contrail.infra.config
-- cluster.virtual-mcp11-contrail.stacklight.proxy
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-contrail.local
diff --git a/nodes/cfg01.virtual-mcp11-dvr.local.yml b/nodes/cfg01.virtual-mcp11-dvr.local.yml
deleted file mode 100644
index d7bac28..0000000
--- a/nodes/cfg01.virtual-mcp11-dvr.local.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-classes:
-- cluster.virtual-mcp11-dvr.infra.config
-- cluster.virtual-mcp11-dvr.stacklight.proxy
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-dvr.local
diff --git a/nodes/cfg01.virtual-mcp11-k8s-calico-minimal.local.yml b/nodes/cfg01.virtual-mcp11-k8s-calico-minimal.local.yml
deleted file mode 100644
index e972393..0000000
--- a/nodes/cfg01.virtual-mcp11-k8s-calico-minimal.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp11-k8s-calico-minimal.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-k8s-calico-minimal.local
diff --git a/nodes/cfg01.virtual-mcp11-k8s-calico.local.yml b/nodes/cfg01.virtual-mcp11-k8s-calico.local.yml
deleted file mode 100644
index 289bbfc..0000000
--- a/nodes/cfg01.virtual-mcp11-k8s-calico.local.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-classes:
-- cluster.virtual-mcp11-k8s-calico.infra.config
-- cluster.virtual-mcp11-k8s-calico.stacklight.proxy
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-k8s-calico.local
diff --git a/nodes/cfg01.virtual-mcp11-k8s-contrail.local.yml b/nodes/cfg01.virtual-mcp11-k8s-contrail.local.yml
deleted file mode 100644
index 39d9783..0000000
--- a/nodes/cfg01.virtual-mcp11-k8s-contrail.local.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-classes:
-- cluster.virtual-mcp11-k8s-contrail.infra.config
-- cluster.virtual-mcp11-k8s-contrail.stacklight.proxy
-parameters:
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-k8s-contrail.local
diff --git a/nodes/cfg01.virtual-mcp11-ovs-dpdk.local.yml b/nodes/cfg01.virtual-mcp11-ovs-dpdk.local.yml
deleted file mode 100644
index dd5440b..0000000
--- a/nodes/cfg01.virtual-mcp11-ovs-dpdk.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp11-ovs-dpdk.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-ovs-dpdk.local
diff --git a/nodes/cfg01.virtual-mcp11-ovs-ironic.local.yml b/nodes/cfg01.virtual-mcp11-ovs-ironic.local.yml
deleted file mode 100644
index 584adae..0000000
--- a/nodes/cfg01.virtual-mcp11-ovs-ironic.local.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-classes:
-- cluster.virtual-mcp11-ovs-ironic.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      domain: virtual-mcp11-ovs-ironic.local
-      name: cfg01
-  salt:
-    master:
-      environment:
-        prd:
-          formula:
-            baremetal_simulator:
-              name: salt-formula-baremetal-simulator
-              source: pkg
diff --git a/nodes/cfg01.virtual-mcp11-ovs.local.yml b/nodes/cfg01.virtual-mcp11-ovs.local.yml
deleted file mode 100644
index 1b71d63..0000000
--- a/nodes/cfg01.virtual-mcp11-ovs.local.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-classes:
-- cluster.virtual-mcp11-ovs.infra.config
-parameters:
-  _param:
-    linux_system_codename: xenial
-    reclass_data_revision: master
-  linux:
-    system:
-      name: cfg01
-      domain: virtual-mcp11-ovs.local
diff --git a/nodes/placeholder b/nodes/placeholder
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nodes/placeholder