b04a1b2fb4
If there is no section, section will default to DEFAULT. Change-Id: I4d42d0ceac54e923cdb7d62b801336e1f07d258c
133 lines
5.4 KiB
Python
133 lines
5.4 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import json
|
|
import sys
|
|
import os
|
|
import argparse
|
|
|
|
|
|
class Metadata(object):
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
def load_file(self, filename):
|
|
json_str = None
|
|
try:
|
|
with open(filename) as data:
|
|
json_str = data.read()
|
|
except IOError:
|
|
print("Machine facts json is missing")
|
|
exit(1)
|
|
sys_data = {}
|
|
sys_data['system_data'] = json.loads(json_str)
|
|
return sys_data
|
|
|
|
def get_hardware_metadata(self, sys_data):
|
|
hard_dict = {}
|
|
for item in sys_data['system_data']:
|
|
if 'hardware_details' not in hard_dict:
|
|
hard_dict['hardware_details'] = []
|
|
hardware_dict = {}
|
|
hardware_dict['label'] = item['inventory_hostname']
|
|
hardware_dict['kernel'] = item['ansible_kernel']
|
|
hardware_dict['total_mem'] = item[
|
|
'ansible_memory_mb']['real']['total']
|
|
hardware_dict['total_logical_cores'] = item[
|
|
'facter_processorcount']
|
|
hardware_dict['os_name'] = item['ansible_distribution'] + \
|
|
item['ansible_distribution_version']
|
|
hardware_dict['ip'] = item['ansible_default_ipv4']['address']
|
|
hardware_dict['num_interface'] = len(item['ansible_interfaces'])
|
|
hardware_dict['machine_make'] = item['ansible_product_name']
|
|
hardware_dict['processor_type'] = ' '.join(item['facter_processor0'].split())
|
|
hard_dict['hardware_details'].append(hardware_dict)
|
|
return hard_dict
|
|
|
|
def get_environment_metadata(self, sys_data):
|
|
env_dict = {}
|
|
for item in sys_data['system_data']:
|
|
if 'environment_setup' not in env_dict:
|
|
env_dict['environment_setup'] = {}
|
|
for key, value in item.items():
|
|
if 'osp' in key:
|
|
env_dict['environment_setup'][key] = value
|
|
return env_dict
|
|
|
|
def get_software_metadata(self, sys_data):
|
|
soft_all_dict = []
|
|
for item in sys_data['system_data']:
|
|
nodes = ['controller', 'undercloud', 'compute']
|
|
if any(node in item['inventory_hostname'] for node in nodes):
|
|
software_dict = {}
|
|
for soft in item:
|
|
if 'openstack' in soft:
|
|
"""
|
|
Why _S_? Because Ansible doesn't allow for
|
|
many seperators. The _S_ was used to mimic
|
|
a seperator.
|
|
"""
|
|
service = soft.split('_S_')
|
|
if len(service) < 2 :
|
|
service = soft.split('_')
|
|
key = service[2]
|
|
section = "DEFAULT"
|
|
service_name = service[1]
|
|
else :
|
|
key = service[3]
|
|
section = service[2]
|
|
service_name = service[1]
|
|
|
|
node = item['inventory_hostname']
|
|
|
|
if service_name in software_dict :
|
|
if section in software_dict[service_name] :
|
|
software_dict[service_name][section][key] = item[soft]
|
|
else :
|
|
software_dict[service_name][section] = {}
|
|
software_dict[service_name][section][key] = item[soft]
|
|
else:
|
|
software_dict[service_name] = {}
|
|
software_dict[service_name]['node_name'] = node
|
|
software_dict[service_name][section] = {}
|
|
software_dict[service_name][section][key] = item[soft]
|
|
|
|
soft_all_dict.append(software_dict)
|
|
return soft_all_dict
|
|
|
|
def write_metadata_file(self, data, filename):
|
|
with open(filename, 'w') as json_file:
|
|
json.dump(data, json_file, indent=4, sort_keys=True)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Metadata Generation')
|
|
parser.add_argument(dest='path', help='Location of machine-facts')
|
|
args = parser.parse_args()
|
|
_filename = os.path.join(args.path, 'machine_facts.json')
|
|
metadata = Metadata()
|
|
sysdata = metadata.load_file(_filename)
|
|
env_data = metadata.get_environment_metadata(sysdata)
|
|
|
|
metadata.write_metadata_file(
|
|
env_data, os.path.join(args.path, 'environment-metadata.json'))
|
|
hardware_data = metadata.get_hardware_metadata(sysdata)
|
|
metadata.write_metadata_file(
|
|
hardware_data, os.path.join(args.path, 'hardware-metadata.json'))
|
|
software_data = metadata.get_software_metadata(sysdata)
|
|
metadata.write_metadata_file(
|
|
software_data, os.path.join(args.path, 'software-metadata.json'))
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|