blob: a94fc04b539834fd1b4f1cd12bdeeab9afa0aa5c [file] [log] [blame]
Jason M. Bills70304cb2019-03-27 12:03:59 -07001#!/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 = '''/*
James Feiste51c7102020-03-17 10:38:18 -070017// Copyright (c) 2020 Intel Corporation
Jason M. Bills70304cb2019-03-27 12:03:59 -070018//
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{{
Jason M. Bills70304cb2019-03-27 12:03:59 -070040'''
41
42SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
43
Jason M. Billsac706372020-02-18 11:36:47 -080044include_path = os.path.realpath(
45 os.path.join(
46 SCRIPT_DIR,
47 "..",
48 "redfish-core",
49 "include",
50 "registries"))
Jason M. Bills70304cb2019-03-27 12:03:59 -070051
52proxies = {
53 'https': os.environ.get("https_proxy", None)
54}
55
Jason M. Bills70304cb2019-03-27 12:03:59 -070056
James Feiste51c7102020-03-17 10:38:18 -070057def 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
Ed Tanoused398212021-06-09 17:05:54 -070066def clang_format(filename):
67 subprocess.check_call(["clang-format-11", "-i", filename])
68
69
James Feiste51c7102020-03-17 10:38:18 -070070files = []
Ed Tanousfc8a2b82021-06-09 16:29:31 -070071files.append(make_getter('Base.1.10.0.json',
James Feiste51c7102020-03-17 10:38:18 -070072 'base_message_registry.hpp', 'base'))
Ed Tanousfc8a2b82021-06-09 16:29:31 -070073files.append(make_getter('TaskEvent.1.0.3.json',
James Feiste51c7102020-03-17 10:38:18 -070074 'task_event_message_registry.hpp', 'task_event'))
Sunitha Harish74eec262020-06-25 10:00:01 -050075files.append(make_getter('ResourceEvent.1.0.3.json',
76 'resource_event_message_registry.hpp', 'resource_event'))
Jason M. Bills70304cb2019-03-27 12:03:59 -070077
78# Remove the old files
Ed Tanous413d8762021-06-09 16:24:19 -070079for file, json_dict, namespace, url in files:
Jason M. Bills70304cb2019-03-27 12:03:59 -070080 try:
81 os.remove(file)
Jason M. Billsac706372020-02-18 11:36:47 -080082 except BaseException:
Jason M. Bills70304cb2019-03-27 12:03:59 -070083 print("{} not found".format(file))
84
85 with open(file, 'w') as registry:
86 registry.write(REGISTRY_HEADER.format(namespace))
Jason M. Bills351d3062019-03-27 12:58:21 -070087 # Parse the Registry header info
88 registry.write("const Header header = {")
Ed Tanous413d8762021-06-09 16:24:19 -070089 registry.write("\"{}\",".format(json_dict["@Redfish.Copyright"]))
90 registry.write("\"{}\",".format(json_dict["@odata.type"]))
91 registry.write("\"{}\",".format(json_dict["Id"]))
92 registry.write("\"{}\",".format(json_dict["Name"]))
93 registry.write("\"{}\",".format(json_dict["Language"]))
94 registry.write("\"{}\",".format(json_dict["Description"]))
95 registry.write("\"{}\",".format(json_dict["RegistryPrefix"]))
96 registry.write("\"{}\",".format(json_dict["RegistryVersion"]))
97 registry.write("\"{}\",".format(json_dict["OwningEntity"]))
Jason M. Bills351d3062019-03-27 12:58:21 -070098 registry.write("};")
99
James Feiste51c7102020-03-17 10:38:18 -0700100 registry.write('constexpr const char * url = "{}";\n\n'.format(url))
Jason M. Bills351d3062019-03-27 12:58:21 -0700101 # Parse each Message entry
Jason M. Billsac706372020-02-18 11:36:47 -0800102 registry.write("constexpr std::array<MessageEntry, {}> registry = {{".format(
Ed Tanous413d8762021-06-09 16:24:19 -0700103 len(json_dict["Messages"])))
104 for messageId, message in sorted(json_dict["Messages"].items()):
Jason M. Bills70304cb2019-03-27 12:03:59 -0700105 registry.write("MessageEntry{")
106 registry.write("\"{}\",".format(messageId))
107 registry.write("{")
Ed Tanous271584a2019-07-09 16:24:22 -0700108 registry.write("\"{}\",".format(message["Description"]))
109 registry.write("\"{}\",".format(message["Message"]))
110 registry.write("\"{}\",".format(message["Severity"]))
Gunnar Millse7808c92020-07-08 21:17:44 -0500111 registry.write("\"{}\",".format(message["MessageSeverity"]))
Ed Tanous271584a2019-07-09 16:24:22 -0700112 registry.write("{},".format(message["NumberOfArgs"]))
113 registry.write("{")
Jason M. Bills70304cb2019-03-27 12:03:59 -0700114 paramTypes = message.get("ParamTypes")
115 if paramTypes:
116 for paramType in paramTypes:
117 registry.write("\"{}\",".format(paramType))
118 registry.write("},")
Ed Tanous271584a2019-07-09 16:24:22 -0700119 registry.write("\"{}\",".format(message["Resolution"]))
Jason M. Bills70304cb2019-03-27 12:03:59 -0700120 registry.write("}},")
121 registry.write("};}\n")
Ed Tanoused398212021-06-09 17:05:54 -0700122 clang_format(file)
123
124
125def get_privilege_string_from_list(privilege_list):
126 privilege_string = "{{\n"
127 for privilege_json in privilege_list:
128 privileges = privilege_json["Privilege"]
129 privilege_string += " {"
130 for privilege in privileges:
131 if privilege == "NoAuth":
132 continue
133 privilege_string += "\""
134 privilege_string += privilege
135 privilege_string += "\",\n"
136 if privilege != "NoAuth":
137 privilege_string = privilege_string[:-2]
138 privilege_string += "}"
139 privilege_string += ",\n"
140 privilege_string = privilege_string[:-2]
141 privilege_string += "\n}}"
142 return privilege_string
143
144def get_variable_name_for_privilege_set(privilege_list):
145 names = []
146 for privilege_json in privilege_list:
147 privileges = privilege_json["Privilege"]
148 names.append("And".join(privileges))
149 return "Or".join(names)
150
151def make_privilege_registry():
152 path, json_file, type_name, url = make_getter('Redfish_1.1.0_PrivilegeRegistry.json',
153 'privilege_registry.hpp', 'privilege')
154 with open(path, 'w') as registry:
155 registry.write("#pragma once\n")
156 registry.write("//{} is generated. Do not edit directly\n".format(os.path.basename(path)))
157
158 registry.write("#include <privileges.hpp>\n\n")
159 registry.write("namespace redfish::privileges{\n")
160
161 privilege_dict = {}
162 for mapping in json_file["Mappings"]:
163 # first pass, identify all the unique privilege sets
164 for operation, privilege_list in mapping["OperationMap"].items():
165 privilege_dict[get_privilege_string_from_list(
166 privilege_list)] = (privilege_list, )
167 registry.write("// clang-format off\n")
168 for index, key in enumerate(privilege_dict):
169 (privilege_list, ) = privilege_dict[key]
170 name = get_variable_name_for_privilege_set(privilege_list)
171 registry.write("const std::array<Privileges, {}> privilegeSet{} = {};\n".format(
172 len(privilege_list), name, key))
173 privilege_dict[key] = (privilege_list, name)
174 registry.write("// clang-format on\n\n")
175
176 for mapping in json_file["Mappings"]:
177 entity = mapping["Entity"]
178 registry.write("//{}\n".format(entity))
179 for operation, privilege_list in mapping["OperationMap"].items():
180 privilege_string = get_privilege_string_from_list(
181 privilege_list)
182 operation = operation.lower()
183
184 registry.write("const auto& {}{} = privilegeSet{};\n".format(
185 operation, entity , privilege_dict[privilege_string][1]))
186 registry.write("\n")
187 registry.write("} // namespace redfish::privileges\n")
188 clang_format(path)
189
190
191make_privilege_registry()