Inventory collecting robot file
File will use lshw commands to gather inventory information from the OS.
It will generate a JSON file using the JSON output of lshw. The lshw
output will be edited to ensure it can be grouped into one large
inventory JSON key-array pair. Once it finishes collecting the
information, it will convert the generated JSON to a YAML file using a
python package (json2yaml). It will aim to group the information into:
processors, memory, and I/O. The I/O can be given as a list of I/O
devices to be targeted, specified by class of device. The end result
will be a YAML and JSON version of the inventory.
Change-Id: Ife185bf589f964efb8c7bd079e636ca6dc36316e
Signed-off-by: Alanny Lopez <alanny.lopez@ibm.com>
diff --git a/systest/Generate_OS_Inventory.robot b/systest/Generate_OS_Inventory.robot
new file mode 100644
index 0000000..ced7b75
--- /dev/null
+++ b/systest/Generate_OS_Inventory.robot
@@ -0,0 +1,118 @@
+***Settings***
+Documentation This module is for generating an inventory file using lshw
+... commands. It will create a JSON file and a YAML file. it
+... will get the processor, memory and specified I/O devices.
+... Requires access to lshw, and json2yaml OS commands. This
+... robot file should be run as root or sudo for lshw.
+
+Library String
+Library Collections
+Library OperatingSystem
+
+***Variables***
+# List of I/O Devices to Collect
+@{I/O} communication disk display generic input multimedia
+... network printer tape
+
+# Paths of the JSON and YAML files
+${json_file_path} inventory.json
+${yaml_file_path} inventory.yaml
+
+***Test Case***
+
+Create YAML Inventory File
+ [Documentation] Create a JSON inventory file, and make a YAML copy.
+ [Tags] Create_YAML_Inventory_File
+ Compile Inventory JSON
+ RUN json2yaml ${json_file_path} ${yaml_file_path}
+
+***Keywords***
+
+Compile Inventory JSON
+ [Documentation] Compile the Inventory into a JSON file.
+ Create File ${json_file_path}
+ Write New JSON List ${json_file_path} Inventory
+ Retrieve HW Info And Write processor ${json_file_path}
+ Retrieve HW Info And Write memory ${json_file_path}
+ Retrieve HW Info And Write List ${I/O} ${json_file_path} I/O last
+ Close New JSON List ${json_file_path}
+
+Write New JSON List
+ [Documentation] Start a new JSON list element in file.
+ [Arguments] ${json_file_path} ${json_field_name}
+ # Description of argument(s):
+ # json_file_path Name of file to write to.
+ # json_field_name Name to give json list element.
+ Append to File ${json_file_path} { "${json_field_name}" : [
+
+Close New JSON List
+ [Documentation] Close JSON list element in file.
+ [Arguments] ${json_file_path}
+ # Description of argument(s):
+ # json_file_path Path of file to write to.
+ Append to File ${json_file_path} ]}
+
+Retrieve HW Info And Write
+ [Documentation] Retrieve and write info, add a comma if not last item.
+ [Arguments] ${class} ${json_file_path} ${last}=false
+ # Description of argument(s):
+ # class Device class to retrieve with lshw.
+ # json_file_path Path of file to write to.
+ # last Is this the last element in the parent JSON?
+ Write New JSON List ${json_file_path} ${class}
+ ${output} = Retrieve Hardware Info ${class}
+ ${output} = Clean Up String ${output}
+ Run Keyword if ${output.__class__ is not type(None)}
+ ... Append To File ${json_file_path} ${output}
+ Close New JSON List ${json_file_path}
+ Run Keyword if '${last}' == 'false'
+ ... Append to File ${json_file_path} ,
+
+Retrieve HW Info And Write List
+ [Documentation] Does a Retrieve/Write with a list of classes and
+ ... encapsulates them into one large JSON element.
+ [Arguments] ${list} ${json_file_path} ${json_field_name} ${last}=false
+ # Description of argument(s):
+ # list The list of devices classes to retrieve with lshw.
+ # json_file_path Path of file to write to.
+ # json_field_name Name of the JSON element to encapsulate this list.
+ # last Is this the last element in the parent JSON?
+ Write New JSON List ${json_file_path} ${json_field_name}
+ : FOR ${class} IN @{list}
+ \ ${tail} Get From List ${list} -1
+ \ Run Keyword if '${tail}' == '${class}'
+ \ ... Retrieve HW Info And Write ${class} ${json_file_path} true
+ \ ... ELSE Retrieve HW Info And Write ${class} ${json_file_path}
+ Close New JSON List ${json_file_path}
+ Run Keyword if '${last}' == 'false'
+ ... Append to File ${json_file_path} ,
+
+Retrieve Hardware Info
+ [Documentation] Retrieves the lshw output of the device class as JSON.
+ [Arguments] ${class}
+ # Description of argument(s):
+ # class Device class to retrieve with lshw.
+ ${output} = Run lshw -c ${class} -json
+ ${output} = Verify JSON string ${output}
+ [Return] ${output}
+
+Verify JSON String
+ [Documentation] Ensure the JSON string content is seperated by commas.
+ [Arguments] ${unver_string}
+ # Description of argument(s):
+ # unver_string JSON String we will be checking for lshw comma errors.
+ ${unver_string} = Convert to String ${unver_string}
+ ${ver_string} = Replace String Using Regexp ${unver_string} }\\s*{ },{
+ [Return] ${ver_string}
+
+Clean Up String
+ [Documentation] Remove extra whitespace and trailing commas.
+ [Arguments] ${dirty_string}
+ # Description of argument(s):
+ # dirty_string String that will be space stripped and have comma removed.
+ ${clean_string} = Strip String ${dirty_string}
+ ${last_char} = Get Substring ${clean_string} -1
+ ${trimmed_string} = Get Substring ${clean_string} 0 -1
+ ${clean_string} = Set Variable If '${last_char}' == ','
+ ... ${trimmed_string} ${clean_string}
+ [Return] ${clean_string}
\ No newline at end of file