Initial commit

Change-Id: I82738f63c49d10385183c6e626239cd15618d58b
diff --git "a/\173\043 roles \043\175/_linux_network_interface" "b/\173\043 roles \043\175/_linux_network_interface"
new file mode 100644
index 0000000..9ab7824
--- /dev/null
+++ "b/\173\043 roles \043\175/_linux_network_interface"
@@ -0,0 +1,23 @@
+{#- Collect interface roles and params into the following dict:
+ # interface_role:             # filename that will be included
+ #  interface_name:            # interface (eth0)
+ #    interface_param1: value  # optional parameters or empty dict
+ #    interface_param2: value
+ #    ...
+ #}
+{%- set interface_roles = {} %}
+{%- for interface_name, interface in node['interfaces'].items() %}
+  {%- if interface['role'] not in interface_roles %}
+    {%- set _ = interface_roles.update({interface['role']: {}}) %}
+  {%- endif %}
+  {%- set _ = interface_roles[interface['role']].update({interface_name: {}}) %}
+  {%- for param_name, param in interface.items() %}
+    {%- set _ = interface_roles[interface['role']][interface_name].update({param_name: param}) %}
+  {%- endfor %}
+{%- endfor %}
+{%- set _ = params.update({'linux_network_interfaces': "\n"}) %}
+{%- for interfaces_role, interfaces in interface_roles.items() %}
+  {%- import ("{# interfaces #}/" + interfaces_role) as interface with context %}
+  {%- set _ = params.update({'linux_network_interfaces': params['linux_network_interfaces'] + interface|string }) %}
+{%- endfor %}
+          - environment.{{ cookiecutter._env_name }}.linux_network_interface
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/_metadata_process" "b/\173\043 roles \043\175/_metadata_process"
new file mode 100644
index 0000000..5809398
--- /dev/null
+++ "b/\173\043 roles \043\175/_metadata_process"
@@ -0,0 +1,124 @@
+{#-
+1. Check if 'local_metadata' matches to something in 'global_metadata'.
+   If yes, fetch and process the data.
+   If no, initialize necessary data.
+   If partially intersects (keepalived roles for different clusters): add a fail-state warning to the YAML to avoid using the wrong config
+2. Set necessary 'params' using the 'local_metadata'
+3. Store the 'local_metadata' to the 'global_metadata' if required.
+4. Increment/decrement the 'global_metadata' objects if necessary (next IP address, next vrouter ID, master->slave, etc)
+
+global_metadata keep states across the nodes
+local_metadata keep states for the current node only
+
+Example of local_metadata and global_metadata runtime content:
+
+    local_metadata:
+      keepalived_vip_priority:
+       - openstack_control
+       - openstack_database
+       - openstack_message_queue
+      rabbitmq_cluster_role:
+       - openstack_message_queue
+
+    global_metadata:
+      keepalived_vip_priority:  # Separate counters
+        openstack_control|openstack_database|openstack_message_queue: 254
+        cicd_control|infra_kvm: 254
+      keepalived_vip_virtual_router_id: # Common counter
+        __latest: 11
+        openstack_control|openstack_database|openstack_message_queue: 10
+        cicd_control|infra_kvm: 11
+      mysql_cluster_role:
+        openstack_database: master
+#}
+
+{%- macro stateful_roles_check(counter_name) %}
+{#- ####################################### -#}
+
+  {#- 1. Check that there is no intersections between different groups of roles for the <counter_name> #}
+  {%- for names, counter in global_metadata.get(counter_name, {}).items() %}
+    {%- set global_roles = names.split('|') %}
+    {%- for local_counter_role_name in local_metadata.get(counter_name, []) %}
+      {%- if local_counter_role_name in global_roles %}
+        {%- set adding_names = local_metadata.get(counter_name, [])|sort|join('|') %}
+        {%- if names != adding_names %}
+          {#- Found unexpected combination of roles, cause the template rendering exception #}
+          {%- include("======> NODE ROLES MAPPING ERROR! Please check the roles for the node '" + inventory_node_name + "' , metaparam '" + counter_name + "':\n======> Existing roles: " + names + "\n======> Adding roles: " + adding_names) %}
+        {%- endif %}
+      {%- endif %}
+    {%- endfor %}
+  {%- endfor %}
+{%- endmacro %}
+
+{%- macro stateful_counter(counter_name, counter_start, counter_end, counter_step, uniq_per_node=True) %}
+{#- ############################################################################# -#}
+{%- if counter_name in local_metadata %}
+  {{- stateful_roles_check(counter_name) }}
+
+  {%- if counter_name not in global_metadata %}
+    {%- set _ = global_metadata.update({counter_name: {}}) %}
+  {%- endif %}
+  {%- set counter_roles_name = local_metadata[counter_name]|sort|join('|') %}
+
+  {%- if uniq_per_node == True %}
+
+    {%- if counter_roles_name not in global_metadata[counter_name] %}
+      {#- Set default value for <counter_roles_name> = <counter_start> #}
+      {%- set _ = global_metadata[counter_name].update({counter_roles_name: counter_start}) %}
+    {%- else %}
+      {#- Increment or decrement value <counter_roles_name> #}
+      {%- set _ = global_metadata[counter_name].update({counter_roles_name: global_metadata[counter_name][counter_roles_name] + counter_step}) %}
+      {%- if global_metadata[counter_name][counter_roles_name] == counter_end %}
+        {# Cause a jinja render exception and make visible the message with correct counter_name #}
+        {%- include("======> VALUE_ERROR: " + counter_name + "=" + counter_end + " is out of bounds!" ) %}
+      {%- endif %}
+    {%- endif %}
+
+  {%- else %}
+
+    {%- if '__latest' not in global_metadata[counter_name] %}
+      {#- Set the value for __latest = <counter_start> #}
+      {%- set _ = global_metadata[counter_name].update({'__latest': counter_start}) %}
+    {%- endif %}
+    {%- if counter_roles_name not in global_metadata[counter_name] %}
+      {%- set _ = global_metadata[counter_name].update({'__latest': global_metadata[counter_name]['__latest'] + counter_step}) %}
+      {%- if global_metadata[counter_name]['__latest'] == counter_end %}
+        {# Cause a jinja render exception and make visible the message with correct counter_name #}
+        {%- include("======> VALUE_ERROR: " + counter_name + "=" + counter_end + " is out of bounds!" ) %}
+      {%- endif %}
+      {%- set _ = global_metadata[counter_name].update({counter_roles_name: global_metadata[counter_name]['__latest']}) %}
+    {%- endif %}
+
+  {%- endif %}
+  {%- set _ = params.update({counter_name: global_metadata[counter_name][counter_roles_name]}) %}
+{%- endif %}
+{%- endmacro %}
+
+{%- macro stateful_masterslave(masterslave_name, master_name='master', slave_name='slave') %}
+{#- ##################################################################################### -#}
+{%- if masterslave_name in local_metadata %}
+  {{- stateful_roles_check(masterslave_name) }}
+
+  {%- if masterslave_name not in global_metadata %}
+    {%- set _ = global_metadata.update({masterslave_name: {}}) %}
+  {%- endif %}
+  {%- set masterslave_roles_name = local_metadata[masterslave_name]|sort|join('|') %}
+
+  {%- if masterslave_roles_name not in global_metadata[masterslave_name] %}
+    {#- Set first value <masterslave_roles_name> = <master_name> #}
+    {%- set _ = global_metadata[masterslave_name].update({masterslave_roles_name: master_name}) %}
+  {%- else %}
+    {#- Set value <masterslave_roles_name> = <slave_name> #}
+    {%- set _ = global_metadata[masterslave_name].update({masterslave_roles_name: slave_name}) %}
+  {%- endif %}
+  {%- set _ = params.update({masterslave_name: global_metadata[masterslave_name][masterslave_roles_name]}) %}
+{%- endif %}
+{%- endmacro %}
+
+{{- stateful_counter('cicd_database_id', counter_start=1, counter_end=255, counter_step=1) }}
+{{- stateful_counter('opencontrail_database_id', counter_start=1, counter_end=255, counter_step=1) }}
+{{- stateful_counter('keepalived_vip_priority', counter_start=254, counter_end=1, counter_step=-1) }}
+{{- stateful_counter('keepalived_vip_virtual_router_id', counter_start=159, counter_end=250, counter_step=1, uniq_per_node=False) }}
+{{- stateful_masterslave('rabbitmq_cluster_role') }}
+{{- stateful_masterslave('mysql_cluster_role') }}
+{{- stateful_masterslave('redis_cluster_role') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/_overrides" "b/\173\043 roles \043\175/_overrides"
new file mode 100644
index 0000000..ce3e4b1
--- /dev/null
+++ "b/\173\043 roles \043\175/_overrides"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - environment.{{ cookiecutter._env_name }}.overrides
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/ceph_mon" "b/\173\043 roles \043\175/ceph_mon"
new file mode 100644
index 0000000..b07032f
--- /dev/null
+++ "b/\173\043 roles \043\175/ceph_mon"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.ceph.mon
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'ceph_mon') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'ceph_mon') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/cicd_control_leader" "b/\173\043 roles \043\175/cicd_control_leader"
new file mode 100644
index 0000000..8f92bdd
--- /dev/null
+++ "b/\173\043 roles \043\175/cicd_control_leader"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.cicd.control.leader
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'cicd_control') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'cicd_control') }}
+{{- register_metaparam('cicd_database_id', 'cicd_control') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/cicd_control_manager" "b/\173\043 roles \043\175/cicd_control_manager"
new file mode 100644
index 0000000..9028ddd
--- /dev/null
+++ "b/\173\043 roles \043\175/cicd_control_manager"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.cicd.control.manager
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'cicd_control') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'cicd_control') }}
+{{- register_metaparam('cicd_database_id', 'cicd_control') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/features_designate" "b/\173\043 roles \043\175/features_designate"
new file mode 100644
index 0000000..e295f2b
--- /dev/null
+++ "b/\173\043 roles \043\175/features_designate"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - environment.{{ cookiecutter._env_name }}.features.designate.system
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/features_designate_database" "b/\173\043 roles \043\175/features_designate_database"
new file mode 100644
index 0000000..e541620
--- /dev/null
+++ "b/\173\043 roles \043\175/features_designate_database"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - environment.{{ cookiecutter._env_name }}.features.designate.database
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/features_designate_keystone" "b/\173\043 roles \043\175/features_designate_keystone"
new file mode 100644
index 0000000..3fdc6e7
--- /dev/null
+++ "b/\173\043 roles \043\175/features_designate_keystone"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - environment.{{ cookiecutter._env_name }}.features.designate.keystone
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/infra_config" "b/\173\043 roles \043\175/infra_config"
new file mode 100644
index 0000000..0bddd76
--- /dev/null
+++ "b/\173\043 roles \043\175/infra_config"
@@ -0,0 +1,11 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.infra.config
+          - environment.{{ cookiecutter._env_name }}.reclass_datasource_local
+          - environment.{{ cookiecutter._env_name }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/infra_idm" "b/\173\043 roles \043\175/infra_idm"
new file mode 100644
index 0000000..b9842d1
--- /dev/null
+++ "b/\173\043 roles \043\175/infra_idm"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.infra.idm
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/infra_kvm" "b/\173\043 roles \043\175/infra_kvm"
new file mode 100644
index 0000000..d0f8666
--- /dev/null
+++ "b/\173\043 roles \043\175/infra_kvm"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.infra.kvm
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'infra_kvm') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'infra_kvm') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/infra_maas" "b/\173\043 roles \043\175/infra_maas"
new file mode 100644
index 0000000..7c925d2
--- /dev/null
+++ "b/\173\043 roles \043\175/infra_maas"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.infra.maas
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/infra_proxy" "b/\173\043 roles \043\175/infra_proxy"
new file mode 100644
index 0000000..1bd8693
--- /dev/null
+++ "b/\173\043 roles \043\175/infra_proxy"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.proxy
+          - cluster.${_param:cluster_name}.stacklight.proxy
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'infra_proxy') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'infra_proxy') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/infra_rsyslog" "b/\173\043 roles \043\175/infra_rsyslog"
new file mode 100644
index 0000000..3fcffa6
--- /dev/null
+++ "b/\173\043 roles \043\175/infra_rsyslog"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.infra.rsyslog
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/kubernetes_control" "b/\173\043 roles \043\175/kubernetes_control"
new file mode 100644
index 0000000..0af2378
--- /dev/null
+++ "b/\173\043 roles \043\175/kubernetes_control"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.kubernetes.control
+{{- set_param('keepalived_vip_interface', 'ens3') }}
+{{- register_metaparam('keepalived_vip_priority', 'kubernetes_control') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'kubernetes_control') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/linux_system_codename_centos" "b/\173\043 roles \043\175/linux_system_codename_centos"
new file mode 100644
index 0000000..2f199df
--- /dev/null
+++ "b/\173\043 roles \043\175/linux_system_codename_centos"
@@ -0,0 +1 @@
+{{- set_param('linux_system_codename', 'centos') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/linux_system_codename_trusty" "b/\173\043 roles \043\175/linux_system_codename_trusty"
new file mode 100644
index 0000000..997e3f5
--- /dev/null
+++ "b/\173\043 roles \043\175/linux_system_codename_trusty"
@@ -0,0 +1 @@
+{{- set_param('linux_system_codename', 'trusty') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/linux_system_codename_xenial" "b/\173\043 roles \043\175/linux_system_codename_xenial"
new file mode 100644
index 0000000..a473f56
--- /dev/null
+++ "b/\173\043 roles \043\175/linux_system_codename_xenial"
@@ -0,0 +1 @@
+{{- set_param('linux_system_codename', 'xenial') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/monitoring_service" "b/\173\043 roles \043\175/monitoring_service"
new file mode 100644
index 0000000..ff7de21
--- /dev/null
+++ "b/\173\043 roles \043\175/monitoring_service"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.monitoring.server
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/opencontrail_analytics" "b/\173\043 roles \043\175/opencontrail_analytics"
new file mode 100644
index 0000000..c8a8921
--- /dev/null
+++ "b/\173\043 roles \043\175/opencontrail_analytics"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.opencontrail.analytics
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('opencontrail_database_id', 'opencontrail_analytics') }}
+{{- register_metaparam('keepalived_vip_priority', 'opencontrail_analytics') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'opencontrail_analytics') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/opencontrail_control" "b/\173\043 roles \043\175/opencontrail_control"
new file mode 100644
index 0000000..e74a9cf
--- /dev/null
+++ "b/\173\043 roles \043\175/opencontrail_control"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.opencontrail.control
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('opencontrail_database_id', 'opencontrail_control') }}
+{{- register_metaparam('keepalived_vip_priority', 'opencontrail_control') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'opencontrail_control') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/opencontrail_gateway" "b/\173\043 roles \043\175/opencontrail_gateway"
new file mode 100644
index 0000000..a75b537
--- /dev/null
+++ "b/\173\043 roles \043\175/opencontrail_gateway"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.opencontrail.gateway
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/opencontrail_tor" "b/\173\043 roles \043\175/opencontrail_tor"
new file mode 100644
index 0000000..d42a19a
--- /dev/null
+++ "b/\173\043 roles \043\175/opencontrail_tor"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.opencontrail.tor
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'opencontrail_tor') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'opencontrail_tor') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_baremetal" "b/\173\043 roles \043\175/openstack_baremetal"
new file mode 100644
index 0000000..f6739e4
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_baremetal"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.baremetal
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_baremetal') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_baremetal') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_benchmark" "b/\173\043 roles \043\175/openstack_benchmark"
new file mode 100644
index 0000000..93b92aa
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_benchmark"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.benchmark
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_billing" "b/\173\043 roles \043\175/openstack_billing"
new file mode 100644
index 0000000..a78fae9
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_billing"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.billing
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_catalog" "b/\173\043 roles \043\175/openstack_catalog"
new file mode 100644
index 0000000..e4612af
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_catalog"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.catalog
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_catalog') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_catalog') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_compute" "b/\173\043 roles \043\175/openstack_compute"
new file mode 100644
index 0000000..6665b76
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_compute"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.compute
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_compute_dpdk" "b/\173\043 roles \043\175/openstack_compute_dpdk"
new file mode 100644
index 0000000..1585758
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_compute_dpdk"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.compute.dpdk
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_compute_sriov" "b/\173\043 roles \043\175/openstack_compute_sriov"
new file mode 100644
index 0000000..2e512c4
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_compute_sriov"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.compute.sriov
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_control" "b/\173\043 roles \043\175/openstack_control"
new file mode 100644
index 0000000..00a8c57
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_control"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.control
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_control') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_control') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_control_leader" "b/\173\043 roles \043\175/openstack_control_leader"
new file mode 100644
index 0000000..3a49d2a
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_control_leader"
@@ -0,0 +1,10 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          {%- include ("{# roles #}/" + 'openstack_control') %}
+          - cluster.${_param:cluster_name}.openstack.control_init
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_control_upgrade" "b/\173\043 roles \043\175/openstack_control_upgrade"
new file mode 100644
index 0000000..24bbddc
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_control_upgrade"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.upgrade
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_dashboard" "b/\173\043 roles \043\175/openstack_dashboard"
new file mode 100644
index 0000000..65751e9
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_dashboard"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.dashboard
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_database" "b/\173\043 roles \043\175/openstack_database"
new file mode 100644
index 0000000..5bc6aee
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_database"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.database
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('mysql_cluster_role', 'openstack_database') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_database') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_database') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_database_leader" "b/\173\043 roles \043\175/openstack_database_leader"
new file mode 100644
index 0000000..1f855fe
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_database_leader"
@@ -0,0 +1,10 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          {%- include ("{# roles #}/" + 'openstack_database') %}
+          - cluster.${_param:cluster_name}.openstack.database_init
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_dns" "b/\173\043 roles \043\175/openstack_dns"
new file mode 100644
index 0000000..07ee063
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_dns"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.dns
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_dns') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_dns') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_gateway" "b/\173\043 roles \043\175/openstack_gateway"
new file mode 100644
index 0000000..9521c1d
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_gateway"
@@ -0,0 +1,9 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.gateway
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_gateway_octavia" "b/\173\043 roles \043\175/openstack_gateway_octavia"
new file mode 100644
index 0000000..35edfae
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_gateway_octavia"
@@ -0,0 +1,10 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.gateway
+          - cluster.${_param:cluster_name}.openstack.octavia_manager
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_message_queue" "b/\173\043 roles \043\175/openstack_message_queue"
new file mode 100644
index 0000000..d59d3f1
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_message_queue"
@@ -0,0 +1,13 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.message_queue
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('rabbitmq_cluster_role', 'openstack_message_queue') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_message_queue') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_message_queue') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_proxy" "b/\173\043 roles \043\175/openstack_proxy"
new file mode 100644
index 0000000..f342287
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_proxy"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.proxy
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_proxy') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_proxy') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/openstack_telemetry" "b/\173\043 roles \043\175/openstack_telemetry"
new file mode 100644
index 0000000..02f8e2b
--- /dev/null
+++ "b/\173\043 roles \043\175/openstack_telemetry"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.openstack.telemetry
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'openstack_telemetry') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'openstack_telemetry') }}
diff --git "a/\173\043 roles \043\175/stacklight_log" "b/\173\043 roles \043\175/stacklight_log"
new file mode 100644
index 0000000..293effe
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_log"
@@ -0,0 +1,14 @@
+{#- For StackLight v1 and v2 #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.stacklight.log
+          - cluster.${_param:cluster_name}.stacklight.log_curator
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'stacklight_log') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'stacklight_log') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklight_log_leader_v1" "b/\173\043 roles \043\175/stacklight_log_leader_v1"
new file mode 100644
index 0000000..da974b3
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_log_leader_v1"
@@ -0,0 +1,11 @@
+{#- For StackLight v1 only #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          {%- include ("{# roles #}/" + 'stacklight_log') %}
+          - system.elasticsearch.client.single
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklight_log_leader_v2" "b/\173\043 roles \043\175/stacklight_log_leader_v2"
new file mode 100644
index 0000000..efa482e
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_log_leader_v2"
@@ -0,0 +1,12 @@
+{#- For StackLight v2 only #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          {%- include ("{# roles #}/" + 'stacklight_log') %}
+          - system.elasticsearch.client.single
+          - system.kibana.client.single
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklight_monitor" "b/\173\043 roles \043\175/stacklight_monitor"
new file mode 100644
index 0000000..59361cd
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_monitor"
@@ -0,0 +1,14 @@
+{#- For StackLight v1 only #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.stacklight.monitor
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('redis_cluster_role', 'stacklight_monitor') }}
+{{- register_metaparam('keepalived_vip_priority', 'stacklight_monitor') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'stacklight_monitor') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklight_monitor_leader" "b/\173\043 roles \043\175/stacklight_monitor_leader"
new file mode 100644
index 0000000..8f7853d
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_monitor_leader"
@@ -0,0 +1,12 @@
+{#- For StackLight v1 only #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          {%- include ("{# roles #}/" + 'stacklight_monitor') %}
+          - system.grafana.client.single
+          - system.kibana.client.single
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklight_telemetry" "b/\173\043 roles \043\175/stacklight_telemetry"
new file mode 100644
index 0000000..b5b8344
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_telemetry"
@@ -0,0 +1,15 @@
+{#- For StackLight v1 and v2 #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.stacklight.telemetry
+          - service.galera.slave.cluster
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'stacklight_telemetry') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'stacklight_telemetry') }}
+{{- register_metaparam('mysql_cluster_role', 'stacklight_telemetry') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklight_telemetry_leader" "b/\173\043 roles \043\175/stacklight_telemetry_leader"
new file mode 100644
index 0000000..c439777
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklight_telemetry_leader"
@@ -0,0 +1,15 @@
+{#- For StackLight v1 and v2 #}
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - cluster.${_param:cluster_name}.stacklight.telemetry
+          - service.galera.master.cluster
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('keepalived_vip_priority', 'stacklight_telemetry') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'stacklight_telemetry') }}
+{{- register_metaparam('mysql_cluster_role', 'stacklight_telemetry') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklightv2_server" "b/\173\043 roles \043\175/stacklightv2_server"
new file mode 100644
index 0000000..c6032d3
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklightv2_server"
@@ -0,0 +1,14 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - system.docker.swarm.manager
+          - cluster.${_param:cluster_name}.stacklight.server
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('redis_cluster_role', 'stacklightv2_server') }}
+{{- register_metaparam('keepalived_vip_priority', 'stacklightv2_server') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'stacklightv2_server') }}
\ No newline at end of file
diff --git "a/\173\043 roles \043\175/stacklightv2_server_leader" "b/\173\043 roles \043\175/stacklightv2_server_leader"
new file mode 100644
index 0000000..a5acec2
--- /dev/null
+++ "b/\173\043 roles \043\175/stacklightv2_server_leader"
@@ -0,0 +1,15 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+#}
+          - system.docker.swarm.master
+          - cluster.${_param:cluster_name}.stacklight.server
+          - cluster.${_param:cluster_name}.stacklight.client
+{{- set_param('keepalived_vip_interface', 'br_ctl') }}
+{{- register_metaparam('redis_cluster_role', 'stacklightv2_server') }}
+{{- register_metaparam('keepalived_vip_priority', 'stacklightv2_server') }}
+{{- register_metaparam('keepalived_vip_virtual_router_id', 'stacklightv2_server') }}
\ No newline at end of file