blob: d1c93bc70b01c84887077083657c3ae2d0388318 [file] [log] [blame]
Nan Zhou313c1b72022-03-25 11:47:55 -07001#!/usr/bin/env python3
Ed Tanous683f7272018-07-26 12:47:19 -07002import requests
3import zipfile
4from io import BytesIO
5import os
Ed Tanous683f7272018-07-26 12:47:19 -07006from collections import OrderedDict
Ed Tanous683f7272018-07-26 12:47:19 -07007import shutil
8import json
9
Ed Tanous118b1c72018-09-13 13:45:51 -070010import xml.etree.ElementTree as ET
11
Sui Chen141d9432022-02-03 22:01:27 -080012VERSION = "DSP8010_2021.4"
Ed Tanouscb103132019-10-08 11:34:22 -070013
Ed Tanous81d523a2022-05-25 12:00:51 -070014WARNING = '''/****************************************************************
15 * READ THIS WARNING FIRST
16 * This is an auto-generated header which contains definitions
17 * for Redfish DMTF defined schemas.
18 * DO NOT modify this registry outside of running the
19 * update_schemas.py script. The definitions contained within
20 * this file are owned by DMTF. Any modifications to these files
21 * should be first pushed to the relevant registry in the DMTF
22 * github organization.
23 ***************************************************************/'''
24
Gunnar Mills349a2ac2021-01-20 22:29:16 -060025# To use a new schema, add to list and rerun tool
26include_list = [
27 'AccountService',
28 'ActionInfo',
29 'Assembly',
30 'AttributeRegistry',
31 'Bios',
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060032 'Cable',
33 'CableCollection',
Gunnar Mills349a2ac2021-01-20 22:29:16 -060034 'Certificate',
35 'CertificateCollection',
36 'CertificateLocations',
37 'CertificateService',
38 'Chassis',
39 'ChassisCollection',
40 'ComputerSystem',
41 'ComputerSystemCollection',
42 'Drive',
43 'DriveCollection',
44 'EthernetInterface',
45 'EthernetInterfaceCollection',
46 'Event',
47 'EventDestination',
48 'EventDestinationCollection',
49 'EventService',
50 'IPAddresses',
51 'JsonSchemaFile',
Ed Tanousf395daa2021-08-02 08:56:24 -070052 'JsonSchemaFileCollection', # redfish/v1/JsonSchemas
Gunnar Mills349a2ac2021-01-20 22:29:16 -060053 'LogEntry',
54 'LogEntryCollection',
55 'LogService',
56 'LogServiceCollection',
57 'Manager',
58 'ManagerAccount',
59 'ManagerAccountCollection',
60 'ManagerCollection',
Sui Chen23952512022-02-08 13:49:36 -080061 'ManagerDiagnosticData',
Gunnar Mills349a2ac2021-01-20 22:29:16 -060062 'ManagerNetworkProtocol',
63 'Memory',
64 'MemoryCollection',
65 'Message',
66 'MessageRegistry',
67 'MessageRegistryCollection',
68 'MessageRegistryFile',
69 'MessageRegistryFileCollection',
70 'MetricDefinition',
71 'MetricDefinitionCollection',
72 'MetricReport',
73 'MetricReportCollection',
74 'MetricReportDefinition',
75 'MetricReportDefinitionCollection',
76 'OperatingConfig',
77 'OperatingConfigCollection',
78 'PCIeDevice',
79 'PCIeDeviceCollection',
80 'PCIeFunction',
81 'PCIeFunctionCollection',
sunitakx71b861b2022-01-18 11:05:05 +000082 'PhysicalContext',
Ed Tanous08eca732022-06-09 14:32:18 -070083 'PCIeSlots',
Gunnar Mills349a2ac2021-01-20 22:29:16 -060084 'Power',
Ed Tanousf395daa2021-08-02 08:56:24 -070085 'Privileges', # Used in Role
Gunnar Mills349a2ac2021-01-20 22:29:16 -060086 'Processor',
87 'ProcessorCollection',
88 'RedfishError',
89 'RedfishExtensions',
90 'Redundancy',
91 'Resource',
92 'Role',
93 'RoleCollection',
94 'Sensor',
95 'SensorCollection',
96 'ServiceRoot',
97 'Session',
98 'SessionCollection',
99 'SessionService',
100 'Settings',
101 'SoftwareInventory',
102 'SoftwareInventoryCollection',
103 'Storage',
104 'StorageCollection',
105 'StorageController',
106 'StorageControllerCollection',
107 'Task',
108 'TaskCollection',
109 'TaskService',
110 'TelemetryService',
111 'Thermal',
Xiaochao Ma1ec18992022-06-29 09:52:24 +0800112 'ThermalSubsystem',
Lukasz Kazmierczak1b7e6962021-08-02 13:40:27 +0200113 'Triggers',
Lukasz Kazmierczak07148cf2021-08-02 11:08:53 +0200114 'TriggersCollection',
Gunnar Mills349a2ac2021-01-20 22:29:16 -0600115 'UpdateService',
116 'VLanNetworkInterfaceCollection',
117 'VLanNetworkInterface',
118 'VirtualMedia',
119 'VirtualMediaCollection',
120 'odata',
121 'odata-v4',
122 'redfish-error',
123 'redfish-payload-annotations',
124 'redfish-schema',
125 'redfish-schema-v1',
126]
127
Ed Tanous683f7272018-07-26 12:47:19 -0700128SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
129
130proxies = {
131 'https': os.environ.get("https_proxy", None)
132}
133
Ed Tanouscb103132019-10-08 11:34:22 -0700134r = requests.get(
135 'https://www.dmtf.org/sites/default/files/standards/documents/' +
136 VERSION +
137 '.zip',
138 proxies=proxies)
Ed Tanous683f7272018-07-26 12:47:19 -0700139
140r.raise_for_status()
141
Ed Tanous81d523a2022-05-25 12:00:51 -0700142
Ed Tanous683f7272018-07-26 12:47:19 -0700143static_path = os.path.realpath(os.path.join(SCRIPT_DIR, "..", "static",
144 "redfish", "v1"))
145
Ed Tanous81d523a2022-05-25 12:00:51 -0700146
147cpp_path = os.path.realpath(os.path.join(SCRIPT_DIR, "..", "redfish-core",
148 "include"))
149
150
Ed Tanous683f7272018-07-26 12:47:19 -0700151schema_path = os.path.join(static_path, "schema")
152json_schema_path = os.path.join(static_path, "JsonSchemas")
Ed Tanous118b1c72018-09-13 13:45:51 -0700153metadata_index_path = os.path.join(static_path, "$metadata", "index.xml")
Ed Tanous683f7272018-07-26 12:47:19 -0700154
155zipBytesIO = BytesIO(r.content)
156zip_ref = zipfile.ZipFile(zipBytesIO)
157
158# Remove the old files
Szymon Dompked699cf92021-08-11 19:46:31 +0200159skip_prefixes = ('Oem')
Ed Tanous683f7272018-07-26 12:47:19 -0700160if os.path.exists(schema_path):
Szymon Dompked699cf92021-08-11 19:46:31 +0200161 files = [os.path.join(schema_path, f) for f in os.listdir(schema_path)
162 if not f.startswith(skip_prefixes)]
James Feistaee8d842018-09-10 16:07:40 -0700163 for f in files:
164 os.remove(f)
Ed Tanous683f7272018-07-26 12:47:19 -0700165if os.path.exists(json_schema_path):
Szymon Dompked699cf92021-08-11 19:46:31 +0200166 files = [os.path.join(json_schema_path, f) for f in
167 os.listdir(json_schema_path) if not f.startswith(skip_prefixes)]
Ed Tanous118b1c72018-09-13 13:45:51 -0700168 for f in files:
169 if (os.path.isfile(f)):
170 os.remove(f)
171 else:
172 shutil.rmtree(f)
173os.remove(metadata_index_path)
Ed Tanous683f7272018-07-26 12:47:19 -0700174
Ed Tanous118b1c72018-09-13 13:45:51 -0700175if not os.path.exists(schema_path):
176 os.makedirs(schema_path)
177if not os.path.exists(json_schema_path):
178 os.makedirs(json_schema_path)
Ed Tanous683f7272018-07-26 12:47:19 -0700179
Ed Tanous118b1c72018-09-13 13:45:51 -0700180with open(metadata_index_path, 'w') as metadata_index:
181
182 metadata_index.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
183 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700184 "<edmx:Edmx xmlns:edmx="
185 "\"http://docs.oasis-open.org/odata/ns/edmx\""
186 " Version=\"4.0\">\n")
Ed Tanous118b1c72018-09-13 13:45:51 -0700187
188 for zip_filepath in zip_ref.namelist():
Gunnar Mills60c922d2021-12-01 09:28:53 -0600189 if zip_filepath.startswith('csdl/') and \
Ed Tanousf395daa2021-08-02 08:56:24 -0700190 (zip_filepath != VERSION + "/csdl/") and \
Gunnar Mills60c922d2021-12-01 09:28:53 -0600191 (zip_filepath != "csdl/"):
Ed Tanous118b1c72018-09-13 13:45:51 -0700192 filename = os.path.basename(zip_filepath)
Gunnar Mills349a2ac2021-01-20 22:29:16 -0600193
194 # filename looks like Zone_v1.xml
195 filenamesplit = filename.split("_")
196 if filenamesplit[0] not in include_list:
197 print("excluding schema: " + filename)
198 continue
199
Ed Tanousf395daa2021-08-02 08:56:24 -0700200 with open(os.path.join(schema_path, filename), 'wb') as schema_out:
Ed Tanous118b1c72018-09-13 13:45:51 -0700201
202 metadata_index.write(
Ed Tanouscb103132019-10-08 11:34:22 -0700203 " <edmx:Reference Uri=\"/redfish/v1/schema/" +
204 filename +
205 "\">\n")
Ed Tanous118b1c72018-09-13 13:45:51 -0700206
207 content = zip_ref.read(zip_filepath)
Ed Tanouscb103132019-10-08 11:34:22 -0700208 content = content.replace(b'\r\n', b'\n')
Ed Tanous118b1c72018-09-13 13:45:51 -0700209 xml_root = ET.fromstring(content)
Ed Tanousf395daa2021-08-02 08:56:24 -0700210 edmx = "{http://docs.oasis-open.org/odata/ns/edmx}"
Szymon Dompked699cf92021-08-11 19:46:31 +0200211 edm = "{http://docs.oasis-open.org/odata/ns/edm}"
Ed Tanous118b1c72018-09-13 13:45:51 -0700212 for edmx_child in xml_root:
Ed Tanousf395daa2021-08-02 08:56:24 -0700213 if edmx_child.tag == edmx + "DataServices":
Ed Tanous118b1c72018-09-13 13:45:51 -0700214 for data_child in edmx_child:
Szymon Dompked699cf92021-08-11 19:46:31 +0200215 if data_child.tag == edm + "Schema":
Ed Tanous118b1c72018-09-13 13:45:51 -0700216 namespace = data_child.attrib["Namespace"]
217 if namespace.startswith("RedfishExtensions"):
218 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700219 " "
220 "<edmx:Include Namespace=\"" +
221 namespace +
222 "\" Alias=\"Redfish\"/>\n"
223 )
Ed Tanous118b1c72018-09-13 13:45:51 -0700224
225 else:
226 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700227 " "
228 "<edmx:Include Namespace=\""
229 + namespace + "\"/>\n"
230 )
231 schema_out.write(content)
Ed Tanous118b1c72018-09-13 13:45:51 -0700232 metadata_index.write(" </edmx:Reference>\n")
233
Ed Tanousf395daa2021-08-02 08:56:24 -0700234 metadata_index.write(" <edmx:DataServices>\n"
235 " <Schema "
236 "xmlns=\"http://docs.oasis-open.org/odata/ns/edm\" "
237 "Namespace=\"Service\">\n"
238 " <EntityContainer Name=\"Service\" "
239 "Extends=\"ServiceRoot.v1_0_0.ServiceContainer\"/>\n"
240 " </Schema>\n"
241 " </edmx:DataServices>\n"
242 )
Ed Tanouscb103132019-10-08 11:34:22 -0700243 # TODO:Issue#32 There's a bug in the script that currently deletes this
Asmitha Karunanithid337bb72020-09-21 10:34:02 -0500244 # schema (because it's an OEM schema). Because it's the only six, and we
Ed Tanouscb103132019-10-08 11:34:22 -0700245 # don't update schemas very often, we just manually fix it. Need a
246 # permanent fix to the script.
247 metadata_index.write(
248 " <edmx:Reference Uri=\"/redfish/v1/schema/OemManager_v1.xml\">\n")
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600249 metadata_index.write(" <edmx:Include Namespace=\"OemManager\"/>\n")
250 metadata_index.write(" </edmx:Reference>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600251
252 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700253 " <edmx:Reference Uri=\""
254 "/redfish/v1/schema/OemComputerSystem_v1.xml\">\n")
255 metadata_index.write(
256 " <edmx:Include Namespace=\"OemComputerSystem\"/>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600257 metadata_index.write(" </edmx:Reference>\n")
258
259 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700260 " <edmx:Reference Uri=\""
261 "/redfish/v1/schema/OemVirtualMedia_v1.xml\">\n")
262 metadata_index.write(
263 " <edmx:Include Namespace=\"OemVirtualMedia\"/>\n")
264 metadata_index.write(
265 " <edmx:Include Namespace=\"OemVirtualMedia.v1_0_0\"/>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600266 metadata_index.write(" </edmx:Reference>\n")
267
268 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700269 " <edmx:Reference Uri=\""
270 "/redfish/v1/schema/OemAccountService_v1.xml\">\n")
271 metadata_index.write(
272 " <edmx:Include Namespace=\"OemAccountService\"/>\n")
273 metadata_index.write(
274 " <edmx:Include Namespace=\"OemAccountService.v1_0_0\"/>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600275 metadata_index.write(" </edmx:Reference>\n")
276
Ravi Tejae7d68c32020-03-15 13:30:41 -0500277 metadata_index.write(
Sunitha Harish9dc50742020-05-11 00:10:20 -0500278 " <edmx:Reference Uri=\"/redfish/v1/schema/OemSession_v1.xml\">\n")
279 metadata_index.write(" <edmx:Include Namespace=\"OemSession\"/>\n")
Ed Tanousf395daa2021-08-02 08:56:24 -0700280 metadata_index.write(
281 " <edmx:Include Namespace=\"OemSession.v1_0_0\"/>\n")
Sunitha Harish9dc50742020-05-11 00:10:20 -0500282 metadata_index.write(" </edmx:Reference>\n")
283
Ed Tanous118b1c72018-09-13 13:45:51 -0700284 metadata_index.write("</edmx:Edmx>\n")
Ed Tanous683f7272018-07-26 12:47:19 -0700285
286schema_files = {}
287for zip_filepath in zip_ref.namelist():
Gunnar Mills60c922d2021-12-01 09:28:53 -0600288 if zip_filepath.startswith(os.path.join('json-schema/')):
Ed Tanous683f7272018-07-26 12:47:19 -0700289 filename = os.path.basename(zip_filepath)
290 filenamesplit = filename.split(".")
Gunnar Mills349a2ac2021-01-20 22:29:16 -0600291
292 # exclude schemas again to save flash space
293 if filenamesplit[0] not in include_list:
294 continue
295
Ed Tanous683f7272018-07-26 12:47:19 -0700296 if len(filenamesplit) == 3:
297 thisSchemaVersion = schema_files.get(filenamesplit[0], None)
Ed Tanouscb103132019-10-08 11:34:22 -0700298 if thisSchemaVersion is None:
Ed Tanous683f7272018-07-26 12:47:19 -0700299 schema_files[filenamesplit[0]] = filenamesplit[1]
300 else:
301 # need to see if we're a newer version.
302 if list(map(int, filenamesplit[1][1:].split("_"))) > list(map(
303 int, thisSchemaVersion[1:].split("_"))):
304 schema_files[filenamesplit[0]] = filenamesplit[1]
Ed Tanous852432a2022-07-07 14:32:37 -0700305 else:
306 # Unversioned schema include directly. Invent a version so it can
307 # still be sorted against
308 schema_files[filenamesplit[0]] = "v0_0_0"
Ed Tanous683f7272018-07-26 12:47:19 -0700309
310for schema, version in schema_files.items():
Ed Tanous852432a2022-07-07 14:32:37 -0700311 basename = schema
312 if version != "v0_0_0":
313 basename += "." + version
314 basename += ".json"
315
Gunnar Mills60c922d2021-12-01 09:28:53 -0600316 zip_filepath = os.path.join("json-schema", basename)
Ed Tanous683f7272018-07-26 12:47:19 -0700317 schemadir = os.path.join(json_schema_path, schema)
318 os.makedirs(schemadir)
Ed Tanous118b1c72018-09-13 13:45:51 -0700319
Ed Tanous118b1c72018-09-13 13:45:51 -0700320 with open(os.path.join(schemadir, schema + ".json"), 'wb') as schema_file:
Ed Tanouscb103132019-10-08 11:34:22 -0700321 schema_file.write(zip_ref.read(zip_filepath).replace(b'\r\n', b'\n'))
Ed Tanous683f7272018-07-26 12:47:19 -0700322
Ed Tanous81d523a2022-05-25 12:00:51 -0700323with open(os.path.join(cpp_path, "schemas.hpp"), 'w') as hpp_file:
324 hpp_file.write(
325 "#pragma once\n"
326 "{WARNING}\n"
327 "// clang-format off\n"
328 "\n"
329 "namespace redfish\n"
330 "{{\n"
331 " constexpr std::array schemas {{\n"
332 .format(
333 WARNING=WARNING))
334 for schema_file in schema_files:
335 hpp_file.write(" \"{}\",\n".format(schema_file))
Ed Tanous683f7272018-07-26 12:47:19 -0700336
Ed Tanous81d523a2022-05-25 12:00:51 -0700337 hpp_file.write(
338 " };\n"
339 "}\n"
340 )
Ed Tanous683f7272018-07-26 12:47:19 -0700341
342zip_ref.close()