Add ability to pass hardware metadata

Related-Prod: PRODX-00000
Change-Id: I4c377558ffe13e28f8ac5ced45262ff67556f46c
diff --git a/de/heat-templates/fragments/SrvInstancesBM.yaml b/de/heat-templates/fragments/SrvInstancesBM.yaml
index 46f8e68..cf247db 100644
--- a/de/heat-templates/fragments/SrvInstancesBM.yaml
+++ b/de/heat-templates/fragments/SrvInstancesBM.yaml
@@ -46,6 +46,10 @@
     type: string
   docker_ee_url:
     type: string
+  hardware_metadata:
+    description: The content of lab metadata.
+    default: ''
+    type: string
 
 resources:
 
@@ -70,6 +74,27 @@
             $private_floating_interface_ip: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
             $functions_override: { get_param: functions_override }
 
+  inject_files:
+    type: "OS::Heat::CloudConfig"
+    properties:
+      cloud_config:
+        write_files:
+          - path: /usr/sbin/prepare-metadata.py
+            owner: "root:root"
+            permissions: "0755"
+            content: {get_file: ../scripts/prepare-metadata.py}
+          - path: /usr/share/metadata/lab-metadata.yaml
+            owner: "root:root"
+            permissions: "0644"
+            content: { get_param: hardware_metadata}
+
+  install_config_agent:
+    type: "OS::Heat::MultipartMime"
+    properties:
+      parts:
+      - config: {get_resource: software_config}
+      - config: {get_resource: inject_files}
+
   server:
     type: OS::Nova::Server
     properties:
@@ -81,8 +106,8 @@
         - network: { get_param: accessible_network }
         # NOTE(ohryhorov): connect to accessible network only as ironic doesn't
         # support multitenancy use-case. Use private_floating_network for IPAM only.
-      user_data_format: RAW
-      user_data: { get_resource: software_config }
+      user_data_format: SOFTWARE_CONFIG
+      user_data: { get_resource:  install_config_agent}
       metadata: { get_param: metadata }
 
   private_floating_server_port:
@@ -112,3 +137,6 @@
   server_public_ip:
     description: Floating IP address of server in public network
     value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  wc_data:
+    description: Metadata from instance
+    value: { get_attr: [wait_condition, data]}
diff --git a/de/heat-templates/fragments/SrvInstancesBMCeph.yaml b/de/heat-templates/fragments/SrvInstancesBMCeph.yaml
index 95a8b97..3bd4369 100644
--- a/de/heat-templates/fragments/SrvInstancesBMCeph.yaml
+++ b/de/heat-templates/fragments/SrvInstancesBMCeph.yaml
@@ -54,6 +54,9 @@
     type: string
   docker_ee_url:
     type: string
+  hardware_metadata:
+    description: The content of lab metadata.
+    type: string
 
 resources:
 
@@ -81,6 +84,27 @@
             $storage_frontend_network_interface_ip: { get_attr: [storage_frontend_server_port, fixed_ips, 0, ip_address] }
             $storage_frontend_network_cidr: { get_param: storage_frontend_network_cidr }
 
+  inject_files:
+    type: "OS::Heat::CloudConfig"
+    properties:
+      cloud_config:
+        write_files:
+          - path: /usr/sbin/prepare-metadata.py
+            owner: "root:root"
+            permissions: "0755"
+            content: {get_file: ../scripts/prepare-metadata.py}
+          - path: /usr/share/metadata/lab-metadata.yaml
+            owner: "root:root"
+            permissions: "0644"
+            content: { get_param: hardware_metadata}
+
+  install_config_agent:
+    type: "OS::Heat::MultipartMime"
+    properties:
+      parts:
+      - config: {get_resource: software_config}
+      - config: {get_resource: inject_files}
+
   server:
     type: OS::Nova::Server
     properties:
@@ -92,8 +116,8 @@
         - network: { get_param: accessible_network }
         # NOTE(ohryhorov): connect to accessible network only as ironic doesn't
         # support multitenancy use-case. Use private_floating_network for IPAM only.
-      user_data_format: RAW
-      user_data: { get_resource: software_config }
+      user_data_format: SOFTWARE_CONFIG
+      user_data: { get_resource:  install_config_agent}
       metadata: { get_param: metadata }
 
   private_floating_server_port:
@@ -131,3 +155,6 @@
   server_public_ip:
     description: Floating IP address of server in public network
     value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  wc_data:
+    description: Metadata from instance
+    value: { get_attr: [wait_condition, data]}
diff --git a/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml b/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml
index 0991319..92fa9c5 100644
--- a/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml
+++ b/de/heat-templates/fragments/SrvInstancesBMCephOSD.yaml
@@ -62,6 +62,9 @@
     type: string
   docker_ee_url:
     type: string
+  hardware_metadata:
+    description: The content of lab metadata.
+    type: string
 
 resources:
 
@@ -92,6 +95,27 @@
             $storage_backend_network_interface_ip: { get_attr: [storage_backend_server_port, fixed_ips, 0, ip_address] }
             $storage_backend_network_cidr: { get_param: storage_backend_network_cidr }
 
+  inject_files:
+    type: "OS::Heat::CloudConfig"
+    properties:
+      cloud_config:
+        write_files:
+          - path: /usr/sbin/prepare-metadata.py
+            owner: "root:root"
+            permissions: "0755"
+            content: {get_file: ../scripts/prepare-metadata.py}
+          - path: /usr/share/metadata/lab-metadata.yaml
+            owner: "root:root"
+            permissions: "0644"
+            content: { get_param: hardware_metadata}
+
+  install_config_agent:
+    type: "OS::Heat::MultipartMime"
+    properties:
+      parts:
+      - config: {get_resource: software_config}
+      - config: {get_resource: inject_files}
+
   server:
     type: OS::Nova::Server
     properties:
@@ -103,8 +127,8 @@
         - network: { get_param: accessible_network }
         # NOTE(ohryhorov): connect to accessible network only as ironic doesn't
         # support multitenancy use-case. Use private_floating_network for IPAM only.
-      user_data_format: RAW
-      user_data: { get_resource: software_config }
+      user_data_format: SOFTWARE_CONFIG
+      user_data: { get_resource:  install_config_agent}
       metadata: { get_param: metadata }
 
   private_floating_server_port:
@@ -150,3 +174,6 @@
   server_public_ip:
     description: Floating IP address of server in public network
     value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  wc_data:
+    description: Metadata from instance
+    value: { get_attr: [wait_condition, data]}
diff --git a/de/heat-templates/fragments/SrvInstancesVM.yaml b/de/heat-templates/fragments/SrvInstancesVM.yaml
index 5b1a681..fbedc71 100644
--- a/de/heat-templates/fragments/SrvInstancesVM.yaml
+++ b/de/heat-templates/fragments/SrvInstancesVM.yaml
@@ -45,6 +45,10 @@
     type: string
   docker_ee_url:
     type: string
+  hardware_metadata:
+    description: The content of lab metadata.
+    default: ''
+    type: string
 
 resources:
 
@@ -69,6 +73,27 @@
             $private_floating_network_cidr: { get_param: private_floating_network_cidr }
             $functions_override: { get_param: functions_override }
 
+  inject_files:
+    type: "OS::Heat::CloudConfig"
+    properties:
+      cloud_config:
+        write_files:
+          - path: /usr/sbin/prepare-metadata.py
+            owner: "root:root"
+            permissions: "0755"
+            content: {get_file: ../scripts/prepare-metadata.py}
+          - path: /usr/share/metadata/lab-metadata.yaml
+            owner: "root:root"
+            permissions: "0644"
+            content: { get_param: hardware_metadata}
+
+  install_config_agent:
+    type: "OS::Heat::MultipartMime"
+    properties:
+      parts:
+      - config: {get_resource: software_config}
+      - config: {get_resource: inject_files}
+
   server:
     type: OS::Nova::Server
     properties:
@@ -79,8 +104,8 @@
       networks:
         - port: { get_resource: accessible_server_port }
         - port: { get_resource: private_floating_server_port }
-      user_data_format: RAW
-      user_data: { get_resource: software_config }
+      user_data_format: SOFTWARE_CONFIG
+      user_data: { get_resource:  install_config_agent}
       metadata: { get_param: metadata }
 
   accessible_server_port:
@@ -123,3 +148,6 @@
   server_public_ip:
     description: Floating IP address of server in public network
     value: { get_attr: [ server_floating_ip, floating_ip_address ] }
+  wc_data:
+    description: Metadata from instance
+    value: { get_attr: [wait_condition, data]}
diff --git a/de/heat-templates/fragments/SrvInstancesVMCeph.yaml b/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
index 68f937b..7d4b249 100644
--- a/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
+++ b/de/heat-templates/fragments/SrvInstancesVMCeph.yaml
@@ -53,6 +53,9 @@
     type: string
   docker_ee_url:
     type: string
+  hardware_metadata:
+    description: The content of lab metadata.
+    type: string
 
 resources:
 
@@ -143,3 +146,6 @@
   server_public_ip:
     description: Floating IP address of server in public network
     value: { get_attr: [ server_floating_ip, floating_ip_address ] }
+  wc_data:
+    description: Metadata from instance
+    value: { get_attr: [wait_condition, data]}
diff --git a/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml b/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
index 0522672..cc6b89c 100644
--- a/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
+++ b/de/heat-templates/fragments/SrvInstancesVMCephOSD.yaml
@@ -61,6 +61,9 @@
     type: string
   docker_ee_url:
     type: string
+  hardware_metadata:
+    description: The content of lab metadata.
+    type: string
 
 resources:
 
@@ -163,3 +166,6 @@
   server_public_ip:
     description: Floating IP address of server in public network
     value: { get_attr: [ server_floating_ip, floating_ip_address ] }
+  wc_data:
+    description: Metadata from instance
+    value: { get_attr: [wait_condition, data]}