Add new node attribute 'classes:'

'classes:' allow to attach additional classes from 'system'
and 'service' models; or from 'cluster' model in the following
format:
          - cluster.${_param:cluster_name}....

Change-Id: I357c5ed3f06d666a4c5f9e7318d651c404eca139
diff --git a/README.md b/README.md
index 70b50c1..d22da9b 100644
--- a/README.md
+++ b/README.md
@@ -152,6 +152,21 @@
           role: bond1_ab_ovs_floating
 ```
 
+Extra classes example:
+```
+nodes:
+    cfg01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: infra_config_node01
+      classes:
+      - cluster.${_param:cluster_name}.infra.config
+      - system.openssh.client.lab
+
+    ctl01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_control_node01
+      classes:
+      - system.openssh.server.team.lab
+```
+
 TODO
 ----
 * Address plan: ability to specify L3 network pools and generate address metadata for nodes from specified pools
diff --git a/inventory_examples/reduced_footprint_with_cfg01.yaml b/inventory_examples/reduced_footprint_with_cfg01.yaml
new file mode 100644
index 0000000..290e515
--- /dev/null
+++ b/inventory_examples/reduced_footprint_with_cfg01.yaml
@@ -0,0 +1,167 @@
+nodes:
+    cfg01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: infra_config_node01
+      roles:
+      - infra_config
+      - linux_system_codename_xenial
+      classes:
+      - system.openssh.client.lab
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    ctl01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_control_node01
+      roles:
+      - infra_kvm
+      - openstack_control_leader
+      - openstack_database_leader
+      - openstack_message_queue
+      - features_designate_pool_manager_database
+      - features_designate_pool_manager
+      - features_designate_pool_manager_keystone
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    ctl02.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_control_node02
+      roles:
+      - infra_kvm
+      - openstack_control
+      - openstack_database
+      - openstack_message_queue
+      - features_designate_pool_manager_database
+      - features_designate_pool_manager
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    ctl03.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_control_node03
+      roles:
+      - infra_kvm
+      - openstack_control
+      - openstack_database
+      - openstack_message_queue
+      - features_designate_pool_manager_database
+      - features_designate_pool_manager
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    prx01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_proxy_node01
+      roles:
+      - openstack_proxy
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    mon01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: stacklight_server_node01
+      roles:
+      - stacklightv2_server_leader
+      - stacklight_telemetry_leader
+      - stacklight_log_leader_v2
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    mon02.mcp11-ovs-dpdk.local:
+      reclass_storage_name: stacklight_server_node02
+      roles:
+      - stacklightv2_server
+      - stacklight_telemetry
+      - stacklight_log
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    mon03.mcp11-ovs-dpdk.local:
+      reclass_storage_name: stacklight_server_node03
+      roles:
+      - stacklightv2_server
+      - stacklight_telemetry
+      - stacklight_log
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    # Generator-based computes. For compatibility only
+    cmp<<count>>.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_compute_rack01
+      roles:
+      - openstack_compute
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+        ens5:
+          role: bond0_ab_ovs_vxlan_mesh
+        ens6:
+          role: bond1_ab_ovs_floating
+
+    gtw01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_gateway_node01
+      roles:
+      - openstack_gateway
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+        ens5:
+          role: bond0_ab_ovs_vxlan_mesh
+        ens6:
+          role: bond1_ab_ovs_floating
+
+    dns01.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_dns_node01
+      roles:
+      - features_designate_pool_manager_dns
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+          single_address: ${_param:openstack_dns_node01_address}
+
+    dns02.mcp11-ovs-dpdk.local:
+      reclass_storage_name: openstack_dns_node02
+      roles:
+      - features_designate_pool_manager_dns
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+          single_address: ${_param:openstack_dns_node02_address}
diff --git "a/\173\043 roles \043\175/_classes" "b/\173\043 roles \043\175/_classes"
new file mode 100644
index 0000000..34a02f5
--- /dev/null
+++ "b/\173\043 roles \043\175/_classes"
@@ -0,0 +1,12 @@
+{#-
+parameters:
+  reclass:
+    storage:
+      node:
+        <reclass_storage_node_name>:
+          classes:
+           # list of extra classes provided from the context file
+#}
+          {%- for class in node.get('classes', []) %}
+          - {{ class }}
+          {%- endfor %}
\ No newline at end of file
diff --git "a/\173\173 cookiecutter._env_name \175\175/init.yml" "b/\173\173 cookiecutter._env_name \175\175/init.yml"
index b2d4978..948c765 100644
--- "a/\173\173 cookiecutter._env_name \175\175/init.yml"
+++ "b/\173\173 cookiecutter._env_name \175\175/init.yml"
@@ -2,7 +2,7 @@
 {%- set infra_config_classes = [] %}
 {#- 'global_metadata' is a global collection of objects shared between nodes #}
 {%- set global_metadata = {} %}
-{%- set common_roles = ['_linux_network_interface', '_metadata_process', '_overrides'] %}
+{%- set common_roles = ['_linux_network_interface', '_metadata_process', '_classes', '_overrides'] %}
 parameters:
   _param:
     _esc: $
@@ -31,7 +31,7 @@
           {%- endmacro %}
           {#-#}
           classes:
-          {#- Default roles are added to each node #}
+          {#- Common dynamic roles are added to each node #}
           {#- 'overrides' must be the very last role for each node #}
           {%- for role in node.get('roles', []) + common_roles %}
             {%- include ("{# roles #}/" + role) %}