1#!/usr/bin/python3 2import requests 3import zipfile 4from io import BytesIO 5import os 6from collections import defaultdict 7from collections import OrderedDict 8from distutils.version import StrictVersion 9import shutil 10import json 11import glob 12import subprocess 13 14import xml.etree.ElementTree as ET 15 16REGISTRY_HEADER = '''/* 17// Copyright (c) 2020 Intel Corporation 18// 19// Licensed under the Apache License, Version 2.0 (the "License"); 20// you may not use this file except in compliance with the License. 21// You may obtain a copy of the License at 22// 23// http://www.apache.org/licenses/LICENSE-2.0 24// 25// Unless required by applicable law or agreed to in writing, software 26// distributed under the License is distributed on an "AS IS" BASIS, 27// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 28// See the License for the specific language governing permissions and 29// limitations under the License. 30*/ 31/**************************************************************** 32 * This is an auto-generated header which contains definitions 33 * for Redfish DMTF defined messages. 34 ***************************************************************/ 35#pragma once 36#include <registries.hpp> 37 38namespace redfish::message_registries::{} 39{{ 40''' 41 42SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) 43 44include_path = os.path.realpath( 45 os.path.join( 46 SCRIPT_DIR, 47 "..", 48 "redfish-core", 49 "include", 50 "registries")) 51 52proxies = { 53 'https': os.environ.get("https_proxy", None) 54} 55 56 57def make_getter(dmtf_name, header_name, type_name): 58 url = 'https://redfish.dmtf.org/registries/{}'.format(dmtf_name) 59 dmtf = requests.get(url, proxies=proxies) 60 dmtf.raise_for_status() 61 json_file = json.loads(dmtf.text) 62 path = os.path.join(include_path, header_name) 63 return (path, json_file, type_name, url) 64 65 66files = [] 67files.append(make_getter('Base.1.8.1.json', 68 'base_message_registry.hpp', 'base')) 69files.append(make_getter('TaskEvent.1.0.2.json', 70 'task_event_message_registry.hpp', 'task_event')) 71files.append(make_getter('ResourceEvent.1.0.3.json', 72 'resource_event_message_registry.hpp', 'resource_event')) 73 74# Remove the old files 75for file, json, namespace, url in files: 76 try: 77 os.remove(file) 78 except BaseException: 79 print("{} not found".format(file)) 80 81 with open(file, 'w') as registry: 82 registry.write(REGISTRY_HEADER.format(namespace)) 83 # Parse the Registry header info 84 registry.write("const Header header = {") 85 registry.write("\"{}\",".format(json["@Redfish.Copyright"])) 86 registry.write("\"{}\",".format(json["@odata.type"])) 87 registry.write("\"{}\",".format(json["Id"])) 88 registry.write("\"{}\",".format(json["Name"])) 89 registry.write("\"{}\",".format(json["Language"])) 90 registry.write("\"{}\",".format(json["Description"])) 91 registry.write("\"{}\",".format(json["RegistryPrefix"])) 92 registry.write("\"{}\",".format(json["RegistryVersion"])) 93 registry.write("\"{}\",".format(json["OwningEntity"])) 94 registry.write("};") 95 96 registry.write('constexpr const char * url = "{}";\n\n'.format(url)) 97 # Parse each Message entry 98 registry.write("constexpr std::array<MessageEntry, {}> registry = {{".format( 99 len(json["Messages"]))) 100 for messageId, message in sorted(json["Messages"].items()): 101 registry.write("MessageEntry{") 102 registry.write("\"{}\",".format(messageId)) 103 registry.write("{") 104 registry.write("\"{}\",".format(message["Description"])) 105 registry.write("\"{}\",".format(message["Message"])) 106 registry.write("\"{}\",".format(message["Severity"])) 107 registry.write("\"{}\",".format(message["MessageSeverity"])) 108 registry.write("{},".format(message["NumberOfArgs"])) 109 registry.write("{") 110 paramTypes = message.get("ParamTypes") 111 if paramTypes: 112 for paramType in paramTypes: 113 registry.write("\"{}\",".format(paramType)) 114 registry.write("},") 115 registry.write("\"{}\",".format(message["Resolution"])) 116 registry.write("}},") 117 registry.write("};}\n") 118 subprocess.check_call(["clang-format-10", "-i", file]) 119