Merge "Fix CI: add more formulas to virtual_mcp11_aio"
diff --git a/classes/cluster/aaa_ha_freeipa/aaa/freeipa_server.yml b/classes/cluster/aaa_ha_freeipa/aaa/freeipa_server.yml
index 5216422..271479c 100644
--- a/classes/cluster/aaa_ha_freeipa/aaa/freeipa_server.yml
+++ b/classes/cluster/aaa_ha_freeipa/aaa/freeipa_server.yml
@@ -3,6 +3,7 @@
 #- system.linux.system.repo.saltstack.rhel7
 #- system.haproxy.proxy.listen.
 #- system.salt.minion.cert.
+- system.mysql.client
 - system.freeipa.server.cluster
 - cluster.aaa_ha_freeipa.aaa
 parameters:
@@ -11,6 +12,13 @@
     keepalived_vip_interface: ${_param:primary_interface}
     keepalived_vip_virtual_router_id: 99
 
+    freeipa_admin_password: password
+    freeipa_ldap_password: password
+    mysql_admin_user: admin
+    mysql_admin_password: password
+    freeipa_principal_user: principal
+    freeipa_dns_zone: aaa-freeipa.local
+
   freeipa:
     server:
       realm: ${_param:cluster_domain}
@@ -20,9 +28,9 @@
         - idm02.${_param:cluster_domain}
         - idm03.${_param:cluster_domain}
       admin:
-        password: password
+        password: ${_param:freeipa_admin_password}
       ldap:
-        password: password
+        password: ${_param:freeipa_ldap_password}
       dns:
         key:
           axfrkey:
diff --git a/classes/cluster/aaa_ha_freeipa/aaa/init.yml b/classes/cluster/aaa_ha_freeipa/aaa/init.yml
index 9fb2124..0cd8e4f 100644
--- a/classes/cluster/aaa_ha_freeipa/aaa/init.yml
+++ b/classes/cluster/aaa_ha_freeipa/aaa/init.yml
@@ -1,5 +1,5 @@
 classes:
-- cluster.aaa_ha_freeipa.aaa
+#- cluster.aaa_ha_freeipa.aaa
 - system.linux.system.single
 - system.openssh.server.team.lab
 - system.openssh.server.team.tcpcloud
@@ -36,11 +36,19 @@
     cluster_node03_hostname: ${_param:identity_control_node03_hostname}
     cluster_node03_address: ${_param:identity_control_node03_address}
 
+    # FIXME
+    # temporarily - fix on reclass model or here
     freeipa_node01_hostname: ${_param:cluster_node01_address}
     freeipa_node02_hostname: ${_param:cluster_node02_address}
     freeipa_node03_hostname: ${_param:cluster_node03_address}
     freeipa_client_nsupdate_01_address: ${_param:cluster_node01_address}
-
+    # temporarily - fix on reclass model or here
+    infra_freeipa_node01_hostname: ${_param:freeipa_node01_hostname}
+    infra_freeipa_node02_hostname: ${_param:freeipa_node02_hostname}
+    infra_freeipa_node03_hostname: ${_param:freeipa_node03_hostname}
+    infra_idm_node01_address: ${_param:identity_control_node01_address}
+    infra_idm_node02_address: ${_param:identity_control_node02_address}
+    infra_idm_node03_address: ${_param:identity_control_node03_address}
 
   linux:
     network:
@@ -71,21 +79,16 @@
           names:
           - ${_param:identity_control_node03_hostname}
           - ${_param:identity_control_node03_hostname}.${_param:cluster_domain}
-        cmp01:
-          address: ${_param:identity_compute_node01_address}
-          names:
-          - ${_param:identity_compute_node01_hostname}
-          - ${_param:identity_compute_node01_hostname}.${_param:cluster_domain}
-        cmp02:
-          address: ${_param:identity_compute_node02_address}
-          names:
-          - ${_param:identity_compute_node02_hostname}
-          - ${_param:identity_compute_node02_hostname}.${_param:cluster_domain}
         prx01:
           address: ${_param:identity_proxy_node01_address}
           names:
           - ${_param:identity_proxy_node01_hostname}
           - ${_param:identity_proxy_node01_hostname}.${_param:cluster_domain}
+        prx02:
+          address: ${_param:identity_proxy_node02_address}
+          names:
+          - ${_param:identity_proxy_node02_hostname}
+          - ${_param:identity_proxy_node02_hostname}.${_param:cluster_domain}
     system:
       rc:
         local: |
diff --git a/classes/cluster/aaa_ha_freeipa/infra/config.yml b/classes/cluster/aaa_ha_freeipa/infra/config.yml
index c993809..70e3c07 100644
--- a/classes/cluster/aaa_ha_freeipa/infra/config.yml
+++ b/classes/cluster/aaa_ha_freeipa/infra/config.yml
@@ -1,13 +1,15 @@
-alasses:
+classes:
 - system.linux.system.repo.ubuntu
 - system.openssh.client.lab
+- system.salt.master.single
 - system.salt.master.pkg
 - system.salt.minion.ca.salt_master
 - system.salt.master.api
-- system.salt.minion.cert.k8s_server
 - system.mysql.client
 - system.reclass.storage.salt
-- system.reclass.storage.system.kubernetes_control_cluster
+- system.reclass.storage.system.infra_idm_cluster
+- cluster.aaa_ha_freeipa.infra
+- cluster.aaa_ha_freeipa.aaa
 - cluster.aaa_ha_freeipa
 parameters:
   _param:
@@ -21,6 +23,7 @@
     salt_master_host: 127.0.0.1
   salt:
     master:
+      enabled: true
       reactor:
         reclass/minion/classify:
         - salt://reclass/reactor/node_register.sls
diff --git a/classes/cluster/aaa_ha_freeipa/init.yml b/classes/cluster/aaa_ha_freeipa/init.yml
index baec503..c9a2bed 100644
--- a/classes/cluster/aaa_ha_freeipa/init.yml
+++ b/classes/cluster/aaa_ha_freeipa/init.yml
@@ -1,4 +1,5 @@
 classes:
-- cluster.aaa_ha_freeipa.aaa.freeipa
+- cluster.aaa_ha_freeipa.aaa.freeipa_server
 - cluster.aaa_ha_freeipa.infra
 - cluster.overrides
+
diff --git a/classes/cluster/ceph_ha/ceph/common.yml b/classes/cluster/ceph_ha/ceph/common.yml
new file mode 100644
index 0000000..5117d12
--- /dev/null
+++ b/classes/cluster/ceph_ha/ceph/common.yml
@@ -0,0 +1,8 @@
+classes:
+- system.linux.system.repo.ceph
+- cluster.ceph_ha.infra
+parameters:
+  ceph:
+    common:
+      public_network: 10.1.0.0/24
+      cluster_network: 10.16.0.0/24
diff --git a/classes/cluster/ceph_ha/ceph/init.yml b/classes/cluster/ceph_ha/ceph/init.yml
index 2aedbf3..553ee24 100644
--- a/classes/cluster/ceph_ha/ceph/init.yml
+++ b/classes/cluster/ceph_ha/ceph/init.yml
@@ -1,16 +1,16 @@
 parameters:
   _param:
     linux_repo_ceph_component: kraken
-    ceph_monitor_keepalived_password: tv0jeM4m4neum1s0p3nSt4cK3m
+    ceph_version: kraken
+    ceph_mon_keepalived_password: tv0jeM4m4neum1s0p3nSt4cK3m
 
-    ceph_monitor_hostname: cmn
-    ceph_monitor_node01_hostname: cmn01
-    ceph_monitor_node02_hostname: cmn02
-    ceph_monitor_node03_hostname: cmn03
-    ceph_monitor_address: 172.16.10.89
-    ceph_monitor_node01_address: 172.16.10.91
-    ceph_monitor_node02_address: 172.16.10.92
-    ceph_monitor_node03_address: 172.16.10.93
+    ceph_mon_hostname: cmn
+    ceph_mon_node01_hostname: cmn01
+    ceph_mon_node02_hostname: cmn02
+    ceph_mon_node03_hostname: cmn03
+    ceph_mon_node01_address: ${_param:ceph_mon_node01_address}
+    ceph_mon_node02_address: ${_param:ceph_mon_node02_address}
+    ceph_mon_node03_address: ${_param:ceph_mon_node03_address}
 
     ceph_osd_node01_hostname: osd01
     ceph_osd_node02_hostname: osd02
@@ -21,29 +21,34 @@
 
     ceph_cfs_node01_hostname: cfs01
     ceph_cfs_node01_address: 172.16.10.97
+
+    ceph_cluster_fsid: a619c5fc-c4ed-4f22-9ed2-66cf2feca23d
+    ceph_mon_keyring: AQAnQIhZ6in5KxAAdf467upoRMWFcVg5pbh1yg==
+    ceph_admin_keyring: AQBHPYhZv5mYDBAAvisaSzCTQkC5gywGUp/voA==
+
   linux:
     network:
       host:
         cmn:
-          address: ${_param:ceph_monitor_address}
+          address: ${_param:ceph_mon_address}
           names:
-          - ${_param:ceph_monitor_hostname}
-          - ${_param:ceph_monitor_hostname}.${_param:cluster_domain}
+          - ${_param:ceph_mon_hostname}
+          - ${_param:ceph_mon_hostname}.${_param:cluster_domain}
         cmn01:
-          address: ${_param:ceph_monitor_node01_address}
+          address: ${_param:ceph_mon_node01_address}
           names:
-          - ${_param:ceph_monitor_node01_hostname}
-          - ${_param:ceph_monitor_node01_hostname}.${_param:cluster_domain}
+          - ${_param:ceph_mon_node01_hostname}
+          - ${_param:ceph_mon_node01_hostname}.${_param:cluster_domain}
         cmn02:
-          address: ${_param:ceph_monitor_node02_address}
+          address: ${_param:ceph_mon_node02_address}
           names:
-          - ${_param:ceph_monitor_node02_hostname}
-          - ${_param:ceph_monitor_node02_hostname}.${_param:cluster_domain}
+          - ${_param:ceph_mon_node02_hostname}
+          - ${_param:ceph_mon_node02_hostname}.${_param:cluster_domain}
         cmn03:
-          address: ${_param:ceph_monitor_node03_address}
+          address: ${_param:ceph_mon_node03_address}
           names:
-          - ${_param:ceph_monitor_node03_hostname}
-          - ${_param:ceph_monitor_node03_hostname}.${_param:cluster_domain}
+          - ${_param:ceph_mon_node03_hostname}
+          - ${_param:ceph_mon_node03_hostname}.${_param:cluster_domain}
         osd01:
           address: ${_param:ceph_osd_node01_address}
           names:
diff --git a/classes/cluster/ceph_ha/ceph/mon.yml b/classes/cluster/ceph_ha/ceph/mon.yml
new file mode 100644
index 0000000..33e9d6d
--- /dev/null
+++ b/classes/cluster/ceph_ha/ceph/mon.yml
@@ -0,0 +1,3 @@
+classes:
+- system.ceph.mon.cluster
+- cluster.ceph_ha.ceph.common
\ No newline at end of file
diff --git a/classes/cluster/ceph_ha/ceph/mon_init.yml b/classes/cluster/ceph_ha/ceph/mon_init.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/classes/cluster/ceph_ha/ceph/mon_init.yml
diff --git a/classes/cluster/ceph_ha/ceph/monitor.yml b/classes/cluster/ceph_ha/ceph/monitor.yml
deleted file mode 100644
index 14b843d..0000000
--- a/classes/cluster/ceph_ha/ceph/monitor.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-classes:
-- system.linux.system.repo.ubuntu
-- system.linux.system.repo.ceph
-- service.keepalived.cluster.single
-#- service.ceph.monitor.cluster
-- cluster.ceph_ha.infra
-parameters:
-  _param:
-    keepalived_ceph_monitor_vip_address: ${_param:ceph_monitor_address}
-    keepalived_ceph_monitor_vip_password: ${_param:ceph_monitor_keepalived_password}
-    keepalived_ceph_monitor_vip_interface: ens3
-    cluster_vip_address: ${_param:ceph_monitor_address}
-    cluster_local_address: ${_param:single_address}
-    cluster_node01_hostname: cmn01
-    cluster_node01_address: ${_param:ceph_monitor_node01_address}
-    cluster_node02_hostname: cmn02
-    cluster_node02_address: ${_param:ceph_monitor_node02_address}
-    cluster_node03_hostname: cmn03
-    cluster_node03_address: ${_param:ceph_monitor_node03_address}
-    ceph_frondend_network: 10.1.0.0/24
-    ceph_backend_network: 10.16.0.0/24
-    nova_storage_keyring: novakeyring
-    cinder_storage_keyring: cinderkeyrinig
-  ceph:
-    common:
-      version: kraken
-      fsid: a619c5fc-c4ed-4f22-9ed2-66cf2feca23d
-      public_network: 10.1.0.0/24
-      cluster_network: 10.16.0.0/24
-      members:
-        - name: ${_param:cluster_node01_hostname}
-          host: ${_param:cluster_node01_address}
-        - name: ${_param:cluster_node02_hostname}
-          host: ${_param:cluster_node02_address}
-        - name: ${_param:cluster_node03_hostname}
-          host: ${_param:cluster_node03_address}
-      keyring:
-        admin:
-          key: AQBHPYhZv5mYDBAAvisaSzCTQkC5gywGUp/voA==
-          caps:
-            mds: "allow *"
-            mgr: "allow *"
-            mon: "allow *"
-            osd: "allow *"
-
-    monitor:
-      enabled: true
-      keyring:
-        mon:
-          key: AQAnQIhZ6in5KxAAdf467upoRMWFcVg5pbh1yg==
-          caps:
-            mon: "allow *"
-        admin:
-          key: AQBHPYhZv5mYDBAAvisaSzCTQkC5gywGUp/voA==
-          caps:
-            mds: "allow *"
-            mgr: "allow *"
-            mon: "allow *"
-            osd: "allow *"
diff --git a/classes/cluster/ceph_ha/ceph/osd.yml b/classes/cluster/ceph_ha/ceph/osd.yml
index 8aed169..a09fc8e 100644
--- a/classes/cluster/ceph_ha/ceph/osd.yml
+++ b/classes/cluster/ceph_ha/ceph/osd.yml
@@ -1,33 +1,58 @@
 classes:
-- system.linux.system.repo.ceph
-- system.linux.system.repo.ubuntu
-- cluster.ceph_ha.infra
+- service.ceph.osd.cluster
+- cluster.ceph_ha.ceph.common
 parameters:
-  _param:
-    keepalived_ceph_monitor_vip_address: ${_param:ceph_monitor_address}
-    keepalived_ceph_monitor_vip_password: ${_param:ceph_monitor_keepalived_password}
-    keepalived_ceph_monitor_vip_interface: ens3
-    cluster_vip_address: ${_param:ceph_monitor_address}
-    cluster_local_address: ${_param:single_address}
-    cluster_node01_hostname: cmn01
-    cluster_node01_address: ${_param:ceph_monitor_node01_address}
-    cluster_node02_hostname: cmn02
-    cluster_node02_address: ${_param:ceph_monitor_node02_address}
-    cluster_node03_hostname: cmn03
-    cluster_node03_address: ${_param:ceph_monitor_node03_address}
-    ceph_frondend_network: 10.1.0.0/24
-    ceph_backend_network: 10.16.0.0/24
-    nova_storage_keyring: novakeyring
-    cinder_storage_keyring: cinderkeyrinig
   ceph:
     osd:
+      enabled: true
       copy_admin_key: true
       journal_type: raw
-      disks:
-        - /dev/sda:
-          journal: yes
-          journal_device: /dev/sdd
-        - /dev/sdb:
-          journal_device: /dev/sde
       dmcrypt: disable
       osd_scenario: raw_journal_devices
+      fs_type: xfs
+      disk:
+        '00':
+          rule: hdd
+          dev: /dev/vdb2
+          journal: /dev/vdb1
+          class: bestssd
+          weight: 1.5
+        '01':
+          rule: hdd
+          dev: /dev/vdc2
+          journal: /dev/vdc1
+          class: bestssd
+          weight: 1.5
+        '02':
+          rule: hdd
+          dev: /dev/vdd2
+          journal: /dev/vdd1
+          class: bestssd
+          weight: 1.5
+  linux:
+   storage:
+     disk:
+       first_drive:
+         name: /dev/vdb
+         type: gpt
+         partitions:
+         - size: 4000
+           type: xfs
+         - size: 6000
+           type: xfs
+       second_drive:
+         name: /dev/vdc
+         type: gpt
+         partitions:
+         - size: 4000
+           type: xfs
+         - size: 6000
+           type: xfs
+       third_drive:
+         name: /dev/vdd
+         type: gpt
+         partitions:
+         - size: 4000
+           type: xfs
+         - size: 6000
+           type: xfs
diff --git a/classes/cluster/ceph_ha/ceph/rgw.yml b/classes/cluster/ceph_ha/ceph/rgw.yml
new file mode 100644
index 0000000..eb6e409
--- /dev/null
+++ b/classes/cluster/ceph_ha/ceph/rgw.yml
@@ -0,0 +1,22 @@
+classes:
+- system.linux.system.repo.ceph
+- system.linux.system.repo.ubuntu
+- cluster.ceph_ha.ceph.common
+- cluster.ceph_ha.infra
+parameters:
+  _param:
+    keepalived_ceph_monitor_vip_address: ${_param:ceph_monitor_address}
+    keepalived_ceph_monitor_vip_password: ${_param:ceph_monitor_keepalived_password}
+    keepalived_ceph_monitor_vip_interface: ens3
+    cluster_vip_address: ${_param:ceph_monitor_address}
+    cluster_local_address: ${_param:single_address}
+    cluster_node01_hostname: cmn01
+    cluster_node01_address: ${_param:ceph_monitor_node01_address}
+    cluster_node02_hostname: cmn02
+    cluster_node02_address: ${_param:ceph_monitor_node02_address}
+    cluster_node03_hostname: cmn03
+    cluster_node03_address: ${_param:ceph_monitor_node03_address}
+    ceph_frondend_network: 10.1.0.0/24
+    ceph_backend_network: 10.16.0.0/24
+    nova_storage_keyring: novakeyring
+    cinder_storage_keyring: cinderkeyrinig
\ No newline at end of file
diff --git a/classes/cluster/ceph_ha/infra/config.yml b/classes/cluster/ceph_ha/infra/config.yml
index 8d76636..5038d3d 100644
--- a/classes/cluster/ceph_ha/infra/config.yml
+++ b/classes/cluster/ceph_ha/infra/config.yml
@@ -5,7 +5,7 @@
 - system.salt.minion.ca.salt_master
 - system.salt.master.api
 - system.reclass.storage.salt
-- system.reclass.storage.system.ceph_monitor_cluster
+- system.reclass.storage.system.ceph_mon_cluster
 - cluster.ceph_ha.ceph
 - cluster.ceph_ha.infra
 parameters:
@@ -40,6 +40,28 @@
         - salt://reclass/reactor/node_register.sls
   reclass:
     storage:
+      node:
+        infra_storage_rack01:
+          name: osd<<count>>
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.ceph.osd
+          repeat:
+            count: 3
+            start: 0
+            digits: 1
+            params:
+              ceph_host_id:
+                value: <<count>>
+                start: 1
+              single_address:
+                value: ceph_osd_node<<count>>_address
+                start: 1
+                digits: 2
+                interpolate: true
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: xenial
       class_mapping:
         common_node:
           expression: all
@@ -59,25 +81,35 @@
               value_template: <<node_deploy_ip>>
             cluster_domain:
               value_template: <<node_domain>>
-        ceph_osd:
-          expression: <<node_hostname>>__startswith__osd
-          node_class:
-            value_template:
-              - cluster.<<node_cluster>>.ceph.osd
-        ceph_monitor_01:
-          expression: <<node_hostname>>__equals__cmn01
+        ceph_osd_01:
+          expression: <<node_hostname>>__equals__osd0
           cluster_param:
-            ceph_monitor_01_address:
+            ceph_osd_node01_address:
               value_template: <<node_control_ip>>
-        ceph_monitor_02:
-          expression: <<node_hostname>>__equals__cmn02
+        ceph_osd_02:
+          expression: <<node_hostname>>__equals__osd1
           cluster_param:
-            ceph_monitor_02_address:
+            ceph_osd_node02_address:
               value_template: <<node_control_ip>>
-        ceph_monitor_03:
+        ceph_osd_03:
+          expression: <<node_hostname>>__equals__osd2
+          cluster_param:
+            ceph_osd_node03_address:
+              value_template: <<node_control_ip>>
+        ceph_mon_01:
           expression: <<node_hostname>>__equals__cmn03
           cluster_param:
-            ceph_monitor_03_address:
+            ceph_mon_node01_address:
+              value_template: <<node_control_ip>>
+        ceph_mon_02:
+          expression: <<node_hostname>>__equals__cmn02
+          cluster_param:
+            ceph_mon_node02_address:
+              value_template: <<node_control_ip>>
+        ceph_mon_03:
+          expression: <<node_hostname>>__equals__cmn03
+          cluster_param:
+            ceph_mon_node03_address:
               value_template: <<node_control_ip>>
         ceph_cfs:
           expression: <<node_hostname>>__startswith__cfs
diff --git a/classes/cluster/k8s_aio_calico/infra/config.yml b/classes/cluster/k8s_aio_calico/infra/config.yml
index c8f630f..fe16242 100644
--- a/classes/cluster/k8s_aio_calico/infra/config.yml
+++ b/classes/cluster/k8s_aio_calico/infra/config.yml
@@ -1,4 +1,4 @@
-alasses:
+classes:
 - system.linux.system.repo.ubuntu
 - system.openssh.client.lab
 - system.salt.master.pkg
diff --git a/classes/cluster/k8s_aio_contrail/infra/init.yml b/classes/cluster/k8s_aio_contrail/infra/init.yml
index 734adf9..199beba 100644
--- a/classes/cluster/k8s_aio_contrail/infra/init.yml
+++ b/classes/cluster/k8s_aio_contrail/infra/init.yml
@@ -1,4 +1,4 @@
-alasses:
+classes:
 - system.linux.system.single
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.mcp.salt
diff --git a/classes/cluster/k8s_ha_calico/infra/config.yml b/classes/cluster/k8s_ha_calico/infra/config.yml
index 1eb842b..23bdbb9 100644
--- a/classes/cluster/k8s_ha_calico/infra/config.yml
+++ b/classes/cluster/k8s_ha_calico/infra/config.yml
@@ -18,11 +18,23 @@
     linux_system_codename: xenial
     salt_api_password_hash: "$6$WV0P1shnoDh2gI/Z$22/Bcd7ffMv0jDlFpT63cAU4PiXHz9pjXwngToKwqAsgoeK4HNR3PiKaushjxp3JsQ8hNoJmAC6TxzVqfV8WH/"
     salt_master_host: 127.0.0.1
+    salt_master_environment_revision: master
+    salt_master_environment_repository: 'https://github.com/salt-formulas'
   salt:
     master:
       reactor:
         reclass/minion/classify:
         - salt://reclass/reactor/node_register.sls
+      environment:
+      # TODO: remove formulas in development once they are stable and part of shared the system-level reclass
+        prd:
+          formula:
+            helm:
+              source: pkg
+              name: salt-formula-helm
+              #source: git
+              #address: '${_param:salt_master_environment_repository}/salt-formula-helm.git'
+              #revision: ${_param:salt_master_environment_revision}
   reclass:
     storage:
       class_mapping:
diff --git a/classes/cluster/k8s_ha_calico/infra/init.yml b/classes/cluster/k8s_ha_calico/infra/init.yml
index 3220d0e..62922ee 100644
--- a/classes/cluster/k8s_ha_calico/infra/init.yml
+++ b/classes/cluster/k8s_ha_calico/infra/init.yml
@@ -3,10 +3,7 @@
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.mcp.salt
 - system.linux.system.repo.ubuntu
-- system.openssh.server.team.lab
-- system.openssh.server.team.tcpcloud
-- system.openssh.server.team.mcp_qa
-- system.openssh.server.team.k8s_team
+- system.openssh.server.team.all
 parameters:
   _param:
     # infra service addresses
diff --git a/classes/cluster/k8s_ha_calico/kubernetes/control.yml b/classes/cluster/k8s_ha_calico/kubernetes/control.yml
index d438c5a..c6dd6ab 100644
--- a/classes/cluster/k8s_ha_calico/kubernetes/control.yml
+++ b/classes/cluster/k8s_ha_calico/kubernetes/control.yml
@@ -6,10 +6,24 @@
 - system.kubernetes.master.cluster
 - cluster.k8s_ha_calico.kubernetes.compute
 - cluster.k8s_ha_calico
+# FIXME: replace service.helm to system.helm (once properly in reclass)
+- service.helm.client
 parameters:
   _param:
     keepalived_vip_interface: ${_param:primary_interface}
     keepalived_vip_virtual_router_id: 60
+  helm:
+    client:
+      repos:
+        mirantisworkloads: https://mirantisworkloads.storage.googleapis.com/
+      #releases:
+      # TODO: configure custom application stacks below
+      #  grafana:
+      #    chart: mirantisworkloads/grafana
+      #    version: 0.4.1
+      #    values:
+      #      replicas: 1
+      #      logLevel: INFO
   etcd:
     server:
       source:
@@ -26,7 +40,7 @@
         netchecker:
           enabled: true
         helm:
-          enabled: true
+          enabled: false
     master:
       etcd:
         ssl:
diff --git a/classes/cluster/k8s_ha_calico/kubernetes/init.yml b/classes/cluster/k8s_ha_calico/kubernetes/init.yml
index 307ebd0..1c4dfda 100644
--- a/classes/cluster/k8s_ha_calico/kubernetes/init.yml
+++ b/classes/cluster/k8s_ha_calico/kubernetes/init.yml
@@ -21,13 +21,9 @@
     kubernetes_control_node01_hostname: ctl01
     kubernetes_control_node02_hostname: ctl02
     kubernetes_control_node03_hostname: ctl03
-    kubernetes_compute_node01_hostname: cmp01
-    kubernetes_compute_node02_hostname: cmp02
     kubernetes_control_node01_address: 172.16.10.101
     kubernetes_control_node02_address: 172.16.10.102
     kubernetes_control_node03_address: 172.16.10.103
-    kubernetes_compute_node01_address: 172.16.10.105
-    kubernetes_compute_node02_address: 172.16.10.106
     kubernetes_proxy_node01_hostname: prx01
     kubernetes_proxy_node01_address: 172.16.10.121
 
@@ -72,21 +68,21 @@
           names:
           - ${_param:kubernetes_control_node03_hostname}
           - ${_param:kubernetes_control_node03_hostname}.${_param:cluster_domain}
-        cmp01:
-          address: ${_param:kubernetes_compute_node01_address}
-          names:
-          - ${_param:kubernetes_compute_node01_hostname}
-          - ${_param:kubernetes_compute_node01_hostname}.${_param:cluster_domain}
-        cmp02:
-          address: ${_param:kubernetes_compute_node02_address}
-          names:
-          - ${_param:kubernetes_compute_node02_hostname}
-          - ${_param:kubernetes_compute_node02_hostname}.${_param:cluster_domain}
         prx01:
           address: ${_param:kubernetes_proxy_node01_address}
           names:
           - ${_param:kubernetes_proxy_node01_hostname}
           - ${_param:kubernetes_proxy_node01_hostname}.${_param:cluster_domain}
+    linux:
+      network:
+        interface:
+          primary_interface:
+            route:
+              # TODO: Remove comment.
+              # Will work once CI has this in linux formula (packaged): https://gerrit.mcp.mirantis.net/#/c/8952
+              kubernetes_internal:
+                address: 10.254.0.0
+                netmask: 255.255.0.0
     system:
       rc:
         local: |
@@ -99,5 +95,4 @@
           # Make sure that the script will "exit 0" on success or any other
           # value on error.
           #
-          ip r a 10.254.0.0/16 dev ens3
           exit 0
diff --git a/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml b/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml
index 2d0b775..6d06f59 100644
--- a/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml
+++ b/classes/cluster/k8s_ha_contrail/kubernetes/compute.yml
@@ -44,6 +44,8 @@
           image: ${_param:kubernetes_calicoctl_image}
         cni:
           image: ${_param:kubernetes_calico_cni_image}
+        contrail_cni:
+          image: ${_param:kubernetes_opencontrail_cni_image}
     common:
       hyperkube:
         image: ${_param:kubernetes_hyperkube_image}
diff --git a/classes/cluster/k8s_ha_contrail/kubernetes/init.yml b/classes/cluster/k8s_ha_contrail/kubernetes/init.yml
index d71de79..d865179 100644
--- a/classes/cluster/k8s_ha_contrail/kubernetes/init.yml
+++ b/classes/cluster/k8s_ha_contrail/kubernetes/init.yml
@@ -19,6 +19,7 @@
     kubernetes_calicoctl_image: docker-prod-virtual.docker.mirantis.net/mirantis/projectcalico/calico/ctl:latest
     kubernetes_calico_image: docker-prod-virtual.docker.mirantis.net/mirantis/projectcalico/calico/node:latest
     kubernetes_calico_cni_image: docker-prod-virtual.docker.mirantis.net/mirantis/projectcalico/calico/cni:latest
+    kubernetes_opencontrail_cni_image: docker-prod-virtual.docker.mirantis.net/mirantis/kubernetes/contrail-integration/contrail-cni:v1.0.0
     kubernetes_hyperkube_image: docker-prod-virtual.docker.mirantis.net/mirantis/kubernetes/hyperkube-amd64:v1.6.2-2
     kubernetes_netchecker_agent_image: quay.io/l23network/k8s-netchecker-agent:v1.0
     kubernetes_netchecker_server_image: quay.io/l23network/k8s-netchecker-server:v1.0
@@ -41,13 +42,13 @@
 
     # etcd stuff
     cluster_node01_hostname: ${_param:kubernetes_control_node01_hostname}
-    cluster_node01_address: ${_param:kubernetes_control_node01_address}
+    cluster_node01_address: ${_param:etcd_control_node01_address}
     cluster_node01_port: 4001
     cluster_node02_hostname: ${_param:kubernetes_control_node02_hostname}
-    cluster_node02_address: ${_param:kubernetes_control_node02_address}
+    cluster_node02_address: ${_param:etcd_control_node02_address}
     cluster_node02_port: 4001
     cluster_node03_hostname: ${_param:kubernetes_control_node03_hostname}
-    cluster_node03_address: ${_param:kubernetes_control_node03_address}
+    cluster_node03_address: ${_param:etcd_control_node03_address}
     cluster_node03_port: 4001
 
     # calico
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 b3a0672..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
 
@@ -96,43 +94,8 @@
   linux:
     network:
       host:
-        ctl:
-          address: ${_param:openstack_control_address}
-          names:
-          - ctl
-          - ctl.${_param:cluster_domain}
         ctl01:
           address: ${_param:openstack_control_node01_address}
           names:
           - ${_param:openstack_control_node01_hostname}
           - ${_param:openstack_control_node01_hostname}.${_param:cluster_domain}
-        msg:
-          address: ${_param:openstack_message_queue_address}
-          names:
-          - msg
-          - msg.${_param:cluster_domain}
-        msg01:
-          address: ${_param:openstack_message_queue_node01_address}
-          names:
-          - ${_param:openstack_message_queue_node01_hostname}
-          - ${_param:openstack_message_queue_node01_hostname}.${_param:cluster_domain}
-        dbs:
-          address: ${_param:openstack_database_address}
-          names:
-          - dbs
-          - dbs.${_param:cluster_domain}
-        dbs01:
-          address: ${_param:openstack_database_node01_address}
-          names:
-          - ${_param:openstack_database_node01_hostname}
-          - ${_param:openstack_database_node01_hostname}.${_param:cluster_domain}
-        cmp01:
-          address: ${_param:openstack_compute_node01_address}
-          names:
-          - ${_param:openstack_compute_node01_hostname}
-          - ${_param:openstack_compute_node01_hostname}.${_param:cluster_domain}
-        cmp02:
-          address: ${_param:openstack_compute_node02_address}
-          names:
-          - ${_param:openstack_compute_node02_hostname}
-          - ${_param:openstack_compute_node02_hostname}.${_param:cluster_domain}
diff --git a/classes/cluster/os_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_aio_ovs/openstack/init.yml b/classes/cluster/os_aio_ovs/openstack/init.yml
index bb66a89..eb5d243 100644
--- a/classes/cluster/os_aio_ovs/openstack/init.yml
+++ b/classes/cluster/os_aio_ovs/openstack/init.yml
@@ -41,6 +41,7 @@
     rabbitmq_openstack_password: workshop
     rabbitmq_cold_password: workshop
     glance_version: ${_param:openstack_version}
+    designate_service_host: ${_param:openstack_control_node01_address}
     glance_service_host: ${_param:openstack_control_node01_address}
     keystone_version: ${_param:openstack_version}
     keystone_service_host: ${_param:openstack_control_node01_address}
@@ -59,6 +60,8 @@
     neutron_version: ${_param:openstack_version}
     neutron_service_host: ${_param:openstack_control_node01_address}
     glusterfs_service_host: ${_param:openstack_control_node01_address}
+    aodh_service_host: ${_param:openstack_control_node01_address}
+    keystone_designate_password: workshop
     metadata_password: password
     mysql_admin_user: root
     mysql_admin_password: workshop
@@ -70,6 +73,7 @@
     mysql_neutron_password: workshop
     mysql_nova_password: workshop
     mysql_aodh_password: workshop
+    keystone_aodh_password: workshop
     keystone_service_token: workshop
     keystone_admin_password: workshop
     keystone_ceilometer_password: workshop
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_k8s_calico/kubernetes/control.yml b/classes/cluster/sl_k8s_calico/kubernetes/control.yml
index d743dea..3e1b435 100644
--- a/classes/cluster/sl_k8s_calico/kubernetes/control.yml
+++ b/classes/cluster/sl_k8s_calico/kubernetes/control.yml
@@ -5,6 +5,7 @@
 - system.salt.minion.cert.etcd_server
 - system.kubernetes.master.cluster
 - cluster.sl_k8s_calico.kubernetes.compute
+- cluster.sl_k8s_calico.infra
 - cluster.sl_k8s_calico
 parameters:
   _param:
diff --git a/classes/cluster/sl_k8s_calico/stacklight/server.yml b/classes/cluster/sl_k8s_calico/stacklight/server.yml
index bcc9e87..82e81ac 100644
--- a/classes/cluster/sl_k8s_calico/stacklight/server.yml
+++ b/classes/cluster/sl_k8s_calico/stacklight/server.yml
@@ -14,6 +14,10 @@
 - service.haproxy.proxy.single
 - system.glusterfs.client.cluster
 - system.glusterfs.client.volume.prometheus
+- system.glusterfs.client.volume.influxdb
+- system.glusterfs.server.cluster
+- system.glusterfs.server.volume.prometheus
+- system.glusterfs.server.volume.influxdb
 - system.galera.server.cluster
 - system.galera.server.database.grafana
 - system.influxdb.server.single
@@ -28,6 +32,9 @@
 - system.docker.swarm.stack.monitoring
 - system.docker.swarm.stack.dashboard
 - system.docker.swarm.stack.monitoring.remote_collector
+- system.heka.remote_collector.container
+- system.heka.remote_collector.output.elasticsearch
+- system.heka.remote_collector.output.telegraf
 - cluster.sl_k8s_calico
 parameters:
   _param:
@@ -40,6 +47,7 @@
     docker_image_remote_collector: docker-prod-virtual.docker.mirantis.net/openstack-docker/heka:latest
     docker_image_remote_storage_adapter: docker-prod-virtual.docker.mirantis.net/openstack-docker/remote_storage_adapter:latest
     docker_image_grafana: grafana/grafana:4.3.2
+    docker_influxdb_image: influxdb:1.2
     grafana_admin_password: admin
     keepalived_prometheus_vip_address: ${_param:cluster_vip_address}
     keepalived_prometheus_vip_password: password
@@ -62,11 +70,16 @@
     influxdb_port: 8086
     influxdb_admin_password: password
     influxdb_stacklight_password: lmapass
+    influxdb_client_host: ${_param:stacklight_monitor_address}
+    influxdb_client_port: ${_param:influxdb_port}
+    influxdb_client_password: ${_param:influxdb_admin_password}
     prometheus_influxdb_url: "http://${_param:stacklight_monitor_address}:${_param:influxdb_port}/"
     prometheus_influxdb_db: prometheus
     prometheus_influxdb_username: lma
     prometheus_influxdb_password: ${_param:influxdb_stacklight_password}
     remote_collector_telegraf_host: monitoring_remote_agent
+    rabbitmq_openstack_password: workshop
+    heka_amqp_host: ${_param:kubernetes_control_address}
   elasticsearch:
     server:
       heap:
diff --git a/classes/cluster/sl_k8s_contrail/opencontrail/control.yml b/classes/cluster/sl_k8s_contrail/opencontrail/control.yml
index 66052f3..bb4f6b7 100644
--- a/classes/cluster/sl_k8s_contrail/opencontrail/control.yml
+++ b/classes/cluster/sl_k8s_contrail/opencontrail/control.yml
@@ -29,6 +29,7 @@
     cluster_node03_address: ${_param:opencontrail_control_node03_address}
     rabbitmq_secret_key: password
     rabbitmq_admin_password: password
+    rabbitmq_openstack_password: workshop
     opencontrail_router01_hostname: vsrx01.${_param:cluster_domain}
     opencontrail_router01_address: 172.16.10.131
   linux:
diff --git a/classes/cluster/sl_k8s_contrail/stacklight/server.yml b/classes/cluster/sl_k8s_contrail/stacklight/server.yml
index f23432e..8ab8491 100644
--- a/classes/cluster/sl_k8s_contrail/stacklight/server.yml
+++ b/classes/cluster/sl_k8s_contrail/stacklight/server.yml
@@ -67,6 +67,8 @@
     prometheus_influxdb_username: lma
     prometheus_influxdb_password: ${_param:influxdb_stacklight_password}
     remote_collector_telegraf_host: monitoring_remote_agent
+    rabbitmq_openstack_password: workshop
+    heka_amqp_host: ${_param:kubernetes_control_address}
   elasticsearch:
     server:
       heap:
diff --git a/classes/cluster/sl_os_contrail/infra/config.yml b/classes/cluster/sl_os_contrail/infra/config.yml
index 8d5a4ae..e3c77d4 100755
--- a/classes/cluster/sl_os_contrail/infra/config.yml
+++ b/classes/cluster/sl_os_contrail/infra/config.yml
@@ -174,21 +174,7 @@
             single_address: ${_param:stacklight_monitor_node01_address}
             keepalived_vip_priority: 100
             mysql_cluster_role: master
-        openstack_control_node01:
-          name: ${_param:stacklight_monitor_node01_hostname}
-          domain: ${_param:cluster_domain}
-          classes:
-          - service.galera.master.cluster
-          - system.docker.swarm.master
-          - cluster.${_param:cluster_name}.stacklight.client
-          - cluster.${_param:cluster_name}.stacklight.server
-          params:
-            salt_master_host: ${_param:infra_config_deploy_address}
-            linux_system_codename: xenial
-            single_address: ${_param:stacklight_monitor_node01_address}
-            keepalived_vip_priority: 100
-            mysql_cluster_role: master
-        openstack_control_node02:
+        stacklight_monitor_node02:
           name: ${_param:stacklight_monitor_node02_hostname}
           domain: ${_param:cluster_domain}
           classes:
@@ -201,7 +187,7 @@
             single_address: ${_param:stacklight_monitor_node02_address}
             keepalived_vip_priority: 101
             mysql_cluster_role: slave
-        openstack_control_node03:
+        stacklight_monitor_node03:
           name: ${_param:stacklight_monitor_node03_hostname}
           domain: ${_param:cluster_domain}
           classes:
@@ -214,3 +200,12 @@
             single_address: ${_param:stacklight_monitor_node03_address}
             keepalived_vip_priority: 102
             mysql_cluster_role: slave
+        opencontrail_control_node01:
+          params:
+            rabbitmq_cluster_role: master
+        opencontrail_control_node02:
+          params:
+            rabbitmq_cluster_role: slave
+        opencontrail_control_node03:
+          params:
+            rabbitmq_cluster_role: slave
\ No newline at end of file
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_contrail/stacklight/server.yml b/classes/cluster/sl_os_contrail/stacklight/server.yml
index 29d0809..a4a90b2 100755
--- a/classes/cluster/sl_os_contrail/stacklight/server.yml
+++ b/classes/cluster/sl_os_contrail/stacklight/server.yml
@@ -67,6 +67,7 @@
     influxdb_stacklight_password: lmapass
     openstack_version: newton
     remote_collector_telegraf_host: monitoring_remote_agent
+    heka_amqp_host: ${_param:openstack_control_address}
   linux:
     network:
       interface:
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/sl_os_ovs/stacklight/client.yml b/classes/cluster/sl_os_ovs/stacklight/client.yml
index 3ca0f10..9d5bb82 100644
--- a/classes/cluster/sl_os_ovs/stacklight/client.yml
+++ b/classes/cluster/sl_os_ovs/stacklight/client.yml
@@ -17,3 +17,4 @@
     grafana_password: ${_param:grafana_admin_password}
     grafana_prometheus_address: ${_param:stacklight_monitor_address}
     grafana_prometheus_port: 15010
+    grafana_influxdb_host: ${_param:stacklight_monitor_node01_address}
diff --git a/classes/cluster/sl_os_ovs/stacklight/init.yml b/classes/cluster/sl_os_ovs/stacklight/init.yml
index 2293764..86b0dc3 100644
--- a/classes/cluster/sl_os_ovs/stacklight/init.yml
+++ b/classes/cluster/sl_os_ovs/stacklight/init.yml
@@ -11,7 +11,8 @@
     stacklight_monitor_node01_address: 172.16.10.107
     stacklight_monitor_node02_address: 172.16.10.108
     stacklight_monitor_node03_address: 172.16.10.109
-
+    salt_minion_ca_host: cfg01.${_param:cluster_domain}
+    salt_minion_ca_authority: salt_master_ca
     # Glusterfs
     glusterfs_service_host: ${_param:stacklight_monitor_address}
 
diff --git a/classes/cluster/sl_os_ovs/stacklight/server.yml b/classes/cluster/sl_os_ovs/stacklight/server.yml
index fd5a54b..e5e2cc6 100644
--- a/classes/cluster/sl_os_ovs/stacklight/server.yml
+++ b/classes/cluster/sl_os_ovs/stacklight/server.yml
@@ -21,11 +21,11 @@
 - system.telegraf.agent.remote
 - system.prometheus.server.remote_write.docker
 - system.prometheus.server.alertmanager.dns
-- system.prometheus.server.target.kubernetes
 - system.prometheus.server.target.dns
 - system.docker.swarm.stack.monitoring
 - system.docker.swarm.stack.dashboard
 - system.docker.swarm.stack.monitoring.remote_collector
+- cluster.sl_os_ovs.stacklight.client
 - cluster.sl_os_ovs
 parameters:
   _param:
diff --git a/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml b/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml
index aff7d8b..49e3cc2 100644
--- a/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml
+++ b/classes/cluster/virtual-mcp-ocata-cicd/infra/config.yml
@@ -55,9 +55,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 +194,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..3cda036 100644
--- a/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-cicd/openstack/init.yml
@@ -127,6 +127,7 @@
     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
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
 
   linux:
     network:
diff --git a/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml b/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml
index 20916d2..21e5949 100644
--- a/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp-ocata-dvr/infra/config.yml
@@ -56,8 +56,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 +163,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/init.yml b/classes/cluster/virtual-mcp-ocata-dvr/init.yml
index 9ea0fc7..bd4c2e4 100644
--- a/classes/cluster/virtual-mcp-ocata-dvr/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-dvr/init.yml
@@ -37,6 +37,7 @@
     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
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
     # stacklight service addresses
     stacklight_monitor_address: 172.16.10.253
     stacklight_monitor_node01_address: 172.16.10.107
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-ovs/infra/config.yml b/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml
index a1e70bb..8fb67fd 100644
--- a/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp-ocata-ovs/infra/config.yml
@@ -19,10 +19,10 @@
 - system.keystone.client.service.designate
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
+- system.reclass.storage.system.stacklight_server_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
 - cluster.virtual-mcp-ocata-ovs
@@ -55,8 +55,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,26 +162,9 @@
           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
           - system.influxdb.database.stacklight
+          params:
+            linux_system_codename: xenial
diff --git a/classes/cluster/virtual-mcp-ocata-ovs/init.yml b/classes/cluster/virtual-mcp-ocata-ovs/init.yml
index f91e13c..2370032 100644
--- a/classes/cluster/virtual-mcp-ocata-ovs/init.yml
+++ b/classes/cluster/virtual-mcp-ocata-ovs/init.yml
@@ -34,5 +34,6 @@
     stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
     stacklight_log_address: ${_param:stacklight_monitor_address}
     openstack_gateway_address: 172.16.10.110
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
 
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-mcp05-dvr/infra/config.yml b/classes/cluster/virtual-mcp05-dvr/infra/config.yml
index f752a2d..bd42fe8 100644
--- a/classes/cluster/virtual-mcp05-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp05-dvr/infra/config.yml
@@ -14,10 +14,10 @@
 - system.keystone.client.service.nova21
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
+- system.reclass.storage.system.stacklight_server_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
 - cluster.virtual-mcp05-dvr
@@ -50,39 +50,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..3e2f8cf 100644
--- a/classes/cluster/virtual-mcp05-dvr/init.yml
+++ b/classes/cluster/virtual-mcp05-dvr/init.yml
@@ -31,6 +31,7 @@
     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
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
     # 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..28a045d 100644
--- a/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
+++ b/classes/cluster/virtual-mcp05-dvr/openstack/init.yml
@@ -115,7 +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}
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..6c67937 100644
--- a/classes/cluster/virtual-mcp05-ovs/init.yml
+++ b/classes/cluster/virtual-mcp05-ovs/init.yml
@@ -27,6 +27,7 @@
     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
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
     # 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-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-mcp10-contrail/infra/config.yml b/classes/cluster/virtual-mcp10-contrail/infra/config.yml
index 9996261..1b7a1c4 100755
--- a/classes/cluster/virtual-mcp10-contrail/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-contrail/infra/config.yml
@@ -15,6 +15,7 @@
 - system.keystone.client.service.nova21
 - 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
@@ -49,27 +50,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..da3e7b1 100755
--- a/classes/cluster/virtual-mcp10-contrail/init.yml
+++ b/classes/cluster/virtual-mcp10-contrail/init.yml
@@ -54,4 +54,4 @@
 
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
     stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
-    stacklight_log_address: ${_param:stacklight_monitor_address}
+    stacklight_log_address: ${_param:stacklight_monitor_address}
\ No newline at end of file
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-dvr/infra/config.yml b/classes/cluster/virtual-mcp10-dvr/infra/config.yml
index 93dd07a..829635b 100644
--- a/classes/cluster/virtual-mcp10-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-dvr/infra/config.yml
@@ -14,10 +14,10 @@
 - 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
+- system.reclass.storage.system.openstack_compute_multi
+- system.reclass.storage.system.openstack_dashboard_single
+- system.reclass.storage.system.openstack_proxy_single
 - cluster.virtual-mcp10-dvr.openstack.proxy
 - cluster.virtual-mcp10-dvr.stacklight.proxy
 - cluster.virtual-mcp10-dvr
@@ -50,38 +50,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..ce47464 100644
--- a/classes/cluster/virtual-mcp10-dvr/init.yml
+++ b/classes/cluster/virtual-mcp10-dvr/init.yml
@@ -31,11 +31,11 @@
     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
+    openstack_gateway_node01_address: ${_param:openstack_gateway_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_log_address: ${_param:stacklight_monitor_address}
-
+    stacklight_log_address: ${_param:stacklight_monitor_address}
\ No newline at end of file
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-ovs/infra/config.yml b/classes/cluster/virtual-mcp10-ovs/infra/config.yml
index a4461c3..568e9e5 100644
--- a/classes/cluster/virtual-mcp10-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-ovs/infra/config.yml
@@ -14,10 +14,10 @@
 - 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
+- system.reclass.storage.system.openstack_compute_multi
+- system.reclass.storage.system.openstack_dashboard_single
+- system.reclass.storage.system.openstack_proxy_single
 - cluster.virtual-mcp10-ovs.openstack.proxy
 - cluster.virtual-mcp10-ovs.stacklight.proxy
 - cluster.virtual-mcp10-ovs
@@ -50,42 +50,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..01ccbbf 100644
--- a/classes/cluster/virtual-mcp10-ovs/init.yml
+++ b/classes/cluster/virtual-mcp10-ovs/init.yml
@@ -34,5 +34,5 @@
     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}
-
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
+    stacklight_telemetry_address: ${_param:stacklight_monitor_address}
\ No newline at end of file
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..b38bac6 100644
--- a/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
+++ b/classes/cluster/virtual-mcp10-ovs/openstack/init.yml
@@ -129,4 +129,4 @@
           address: 172.16.10.106
           names:
           - cmp02
-          - cmp02.${_param:cluster_domain}
+          - cmp02.${_param:cluster_domain}
\ No newline at end of file
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml b/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml
index 3af2439..ec1d55b 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/infra/config.yml
@@ -29,10 +29,10 @@
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.opencontrail_control_cluster
+- system.reclass.storage.system.stacklightv2_server_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
 - cluster.virtual-mcp11-contrail-nfv.openstack.proxy
 - cluster.virtual-mcp11-contrail-nfv.stacklight.proxy
 - cluster.virtual-mcp11-contrail-nfv
@@ -63,8 +63,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 +172,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..78298cb 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/init.yml
@@ -82,4 +82,4 @@
           address: ${_param:opencontrail_control_node03_address}
           names:
           - ntw03
-          - ntw03.${_param:cluster_domain}
+          - ntw03.${_param:cluster_domain}
\ No newline at end of file
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/infra/config.yml b/classes/cluster/virtual-mcp11-contrail/infra/config.yml
index ed6c8cc..ff26926 100755
--- a/classes/cluster/virtual-mcp11-contrail/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-contrail/infra/config.yml
@@ -29,10 +29,10 @@
 - system.mysql.client.single
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.opencontrail_control_cluster
+- system.reclass.storage.system.stacklightv2_server_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
 - cluster.virtual-mcp11-contrail
@@ -63,8 +63,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 +172,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..613edb9 100755
--- a/classes/cluster/virtual-mcp11-contrail/init.yml
+++ b/classes/cluster/virtual-mcp11-contrail/init.yml
@@ -85,4 +85,4 @@
           address: ${_param:opencontrail_control_node03_address}
           names:
           - ntw03
-          - ntw03.${_param:cluster_domain}
+          - ntw03.${_param:cluster_domain}
\ No newline at end of file
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-dvr/infra/config.yml b/classes/cluster/virtual-mcp11-dvr/infra/config.yml
index f2020dc..a890b81 100644
--- a/classes/cluster/virtual-mcp11-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-dvr/infra/config.yml
@@ -18,10 +18,10 @@
 - 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
+- system.reclass.storage.system.openstack_compute_multi
+- system.reclass.storage.system.openstack_dashboard_single
+- system.reclass.storage.system.openstack_proxy_single
 - cluster.virtual-mcp11-dvr.openstack.proxy
 - cluster.virtual-mcp11-dvr.stacklight.proxy
 - cluster.virtual-mcp11-dvr
@@ -54,8 +54,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 +161,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..02f4581 100644
--- a/classes/cluster/virtual-mcp11-dvr/init.yml
+++ b/classes/cluster/virtual-mcp11-dvr/init.yml
@@ -45,4 +45,4 @@
     stacklight_monitor_node03_address: 172.16.10.109
     stacklight_log_address: ${_param:stacklight_monitor_address}
     stacklight_telemetry_address: ${_param:stacklight_monitor_address}
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
+    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
\ No newline at end of file
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-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-k8s-contrail/kubernetes/compute.yml b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml
index 4282d49..499f290 100644
--- a/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml
+++ b/classes/cluster/virtual-mcp11-k8s-contrail/kubernetes/compute.yml
@@ -45,7 +45,7 @@
         cni:
           image: ${_param:kubernetes_calico_cni_image}
         contrail_cni:
-          image: ${_param:kubernetes_contrail_cni_image}
+          image: ${_param:kubernetes_opencontrail_cni_image}
     common:
       hyperkube:
         image: ${_param:kubernetes_hyperkube_image}
diff --git a/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml b/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml
index a111de2..6bda643 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/infra/config.yml
@@ -18,10 +18,10 @@
 - 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
+- system.reclass.storage.system.openstack_compute_multi
+- system.reclass.storage.system.openstack_dashboard_single
+- system.reclass.storage.system.openstack_proxy_single
 - cluster.virtual-mcp11-ovs-dpdk.openstack.proxy
 - cluster.virtual-mcp11-ovs-dpdk.stacklight.proxy
 - cluster.virtual-mcp11-ovs-dpdk
@@ -54,8 +54,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 +161,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..e97b1a5 100644
--- a/classes/cluster/virtual-mcp11-ovs-dpdk/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs-dpdk/init.yml
@@ -35,5 +35,5 @@
     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}
-
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
+    stacklight_telemetry_address: ${_param:stacklight_monitor_address}
\ No newline at end of file
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-ironic/infra/config.yml b/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml
index a456bd2..529527a 100644
--- a/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-ovs-ironic/infra/config.yml
@@ -56,8 +56,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 +137,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..540ccee 100644
--- a/classes/cluster/virtual-mcp11-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp11-ovs/infra/config.yml
@@ -17,10 +17,10 @@
 - 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
+- system.reclass.storage.system.openstack_compute_multi
+- system.reclass.storage.system.openstack_dashboard_single
+- system.reclass.storage.system.openstack_proxy_single
 - cluster.virtual-mcp11-ovs.openstack.proxy
 - cluster.virtual-mcp11-ovs.stacklight.proxy
 - cluster.virtual-mcp11-ovs
@@ -53,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:
@@ -74,25 +160,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..0516e5b 100644
--- a/classes/cluster/virtual-mcp11-ovs/init.yml
+++ b/classes/cluster/virtual-mcp11-ovs/init.yml
@@ -35,5 +35,5 @@
     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}
-
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
+    stacklight_telemetry_address: ${_param:stacklight_monitor_address}
\ No newline at end of file
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/system b/classes/system
index f21ffb9..c5df34a 160000
--- a/classes/system
+++ b/classes/system
@@ -1 +1 @@
-Subproject commit f21ffb9dae2880677f4f2bd251ce3752b9386075
+Subproject commit c5df34ae453d53274d570ab0a0e91ed7c43f22c5
diff --git a/nodes/placeholder b/nodes/placeholder
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nodes/placeholder