1#!/usr/bin/env python 2r""" 3Generate an inventory variable file containing a list of properties 4fields from the YAML phosphor-dbus-interfaces repository. 5""" 6import sys 7import os 8import yaml 9import json 10 11lib_path = sys.path[0] + "/../lib" 12sys.path.insert(0, lib_path) 13from gen_print import * 14 15# This list will be longer when more development codes are available. 16inventory_items = ['fru', 'core', 'fan', 'gpu'] 17print_var(inventory_items) 18fru_inventory_file_path = 'inventory.py' 19print_var(fru_inventory_file_path) 20 21# Properties master list 22yaml_master_list = [] 23 24# Clone the phosphor-dbus-interfaces repository 25cmd_buf = 'git clone https://github.com/openbmc/phosphor-dbus-interfaces' 26os.system(cmd_buf) 27 28repo_subdir_path = '/phosphor-dbus-interfaces/xyz/openbmc_project/' 29base_dir_path = os.getcwd() + repo_subdir_path 30 31# yaml file paths for FRU 32yaml_fru_list = [ 'Inventory/Item.interface.yaml', 33 'Inventory/Decorator/Asset.interface.yaml', 34 'Inventory/Decorator/Revision.interface.yaml', 35 'Inventory/Decorator/Replaceable.interface.yaml', 36 'Inventory/Decorator/Cacheable.interface.yaml', 37 'State/Decorator/OperationalStatus.interface.yaml', 38 ] 39 40# yaml file paths for CORE 41yaml_core_list = [ 'Inventory/Item.interface.yaml', 42 'State/Decorator/OperationalStatus.interface.yaml', 43 ] 44 45# yaml file paths for fan. 46yaml_fan_list = [ 'Inventory/Item.interface.yaml', 47 'State/Decorator/OperationalStatus.interface.yaml', 48 ] 49# yaml file paths for GPU. 50yaml_gpu_list = [ 'Inventory/Item.interface.yaml', 51 'State/Decorator/OperationalStatus.interface.yaml', 52 ] 53# Append to master list 54yaml_master_list.append(yaml_fru_list) 55yaml_master_list.append(yaml_core_list) 56yaml_master_list.append(yaml_fan_list) 57yaml_master_list.append(yaml_gpu_list) 58 59print_var(yaml_master_list) 60 61# Populate Inventory data 62inventory_dict = {} 63 64for master_index in range(len(yaml_master_list)): 65 print_var(master_index) 66 inventory_dict[str(inventory_items[master_index])] = [] 67 for rel_yaml_file_path in yaml_master_list[master_index]: 68 yaml_file_path = base_dir_path + rel_yaml_file_path 69 70 # Get the yaml dictionary data 71 print_timen("Loading " + yaml_file_path) 72 f = open(yaml_file_path) 73 yaml_data = yaml.load(f) 74 f.close() 75 for item in range(0, len(yaml_data['properties'])): 76 tmp_data = yaml_data['properties'][item]['name'] 77 inventory_dict[str(inventory_items[master_index])].append(tmp_data) 78 79# Pretty print json formatter 80data = json.dumps(inventory_dict, 81 indent=4, 82 sort_keys=True, 83 default=str, 84 separators=(',', ':')) 85 86# Check if there is mismatch in data vs expect list 87if len(inventory_dict) != len(inventory_items): 88 print_error("The generated list doesn't match Master Inventory List.\n") 89 print data 90 print_var(inventory_items) 91 sys.exit() 92 93# Write dictionary data to inventory file 94print "\nGenerated Inventory item json format\n" 95print data 96out = open(fru_inventory_file_path, 'w') 97out.write('inventory_dict = ') 98out.write(data) 99 100out.close() 101print "\nGenerated Inventory File: ", fru_inventory_file_path 102