blob: 01531c8caed5ad0605f434b873064bbc509efb34 [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
Gunnar Mills349a2ac2021-01-20 22:29:16 -060014# To use a new schema, add to list and rerun tool
15include_list = [
16 'AccountService',
17 'ActionInfo',
18 'Assembly',
19 'AttributeRegistry',
20 'Bios',
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060021 'Cable',
22 'CableCollection',
Gunnar Mills349a2ac2021-01-20 22:29:16 -060023 'Certificate',
24 'CertificateCollection',
25 'CertificateLocations',
26 'CertificateService',
27 'Chassis',
28 'ChassisCollection',
29 'ComputerSystem',
30 'ComputerSystemCollection',
31 'Drive',
32 'DriveCollection',
33 'EthernetInterface',
34 'EthernetInterfaceCollection',
35 'Event',
36 'EventDestination',
37 'EventDestinationCollection',
38 'EventService',
39 'IPAddresses',
40 'JsonSchemaFile',
Ed Tanousf395daa2021-08-02 08:56:24 -070041 'JsonSchemaFileCollection', # redfish/v1/JsonSchemas
Gunnar Mills349a2ac2021-01-20 22:29:16 -060042 'LogEntry',
43 'LogEntryCollection',
44 'LogService',
45 'LogServiceCollection',
46 'Manager',
47 'ManagerAccount',
48 'ManagerAccountCollection',
49 'ManagerCollection',
Sui Chen23952512022-02-08 13:49:36 -080050 'ManagerDiagnosticData',
Gunnar Mills349a2ac2021-01-20 22:29:16 -060051 'ManagerNetworkProtocol',
52 'Memory',
53 'MemoryCollection',
54 'Message',
55 'MessageRegistry',
56 'MessageRegistryCollection',
57 'MessageRegistryFile',
58 'MessageRegistryFileCollection',
59 'MetricDefinition',
60 'MetricDefinitionCollection',
61 'MetricReport',
62 'MetricReportCollection',
63 'MetricReportDefinition',
64 'MetricReportDefinitionCollection',
65 'OperatingConfig',
66 'OperatingConfigCollection',
67 'PCIeDevice',
68 'PCIeDeviceCollection',
69 'PCIeFunction',
70 'PCIeFunctionCollection',
sunitakx71b861b2022-01-18 11:05:05 +000071 'PhysicalContext',
Gunnar Mills349a2ac2021-01-20 22:29:16 -060072 'Power',
Ed Tanousf395daa2021-08-02 08:56:24 -070073 'Privileges', # Used in Role
Gunnar Mills349a2ac2021-01-20 22:29:16 -060074 'Processor',
75 'ProcessorCollection',
76 'RedfishError',
77 'RedfishExtensions',
78 'Redundancy',
79 'Resource',
80 'Role',
81 'RoleCollection',
82 'Sensor',
83 'SensorCollection',
84 'ServiceRoot',
85 'Session',
86 'SessionCollection',
87 'SessionService',
88 'Settings',
89 'SoftwareInventory',
90 'SoftwareInventoryCollection',
91 'Storage',
92 'StorageCollection',
93 'StorageController',
94 'StorageControllerCollection',
95 'Task',
96 'TaskCollection',
97 'TaskService',
98 'TelemetryService',
99 'Thermal',
Lukasz Kazmierczak1b7e6962021-08-02 13:40:27 +0200100 'Triggers',
Lukasz Kazmierczak07148cf2021-08-02 11:08:53 +0200101 'TriggersCollection',
Gunnar Mills349a2ac2021-01-20 22:29:16 -0600102 'UpdateService',
103 'VLanNetworkInterfaceCollection',
104 'VLanNetworkInterface',
105 'VirtualMedia',
106 'VirtualMediaCollection',
107 'odata',
108 'odata-v4',
109 'redfish-error',
110 'redfish-payload-annotations',
111 'redfish-schema',
112 'redfish-schema-v1',
113]
114
Ed Tanous683f7272018-07-26 12:47:19 -0700115SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
116
117proxies = {
118 'https': os.environ.get("https_proxy", None)
119}
120
Ed Tanouscb103132019-10-08 11:34:22 -0700121r = requests.get(
122 'https://www.dmtf.org/sites/default/files/standards/documents/' +
123 VERSION +
124 '.zip',
125 proxies=proxies)
Ed Tanous683f7272018-07-26 12:47:19 -0700126
127r.raise_for_status()
128
129static_path = os.path.realpath(os.path.join(SCRIPT_DIR, "..", "static",
130 "redfish", "v1"))
131
132schema_path = os.path.join(static_path, "schema")
133json_schema_path = os.path.join(static_path, "JsonSchemas")
Ed Tanous118b1c72018-09-13 13:45:51 -0700134metadata_index_path = os.path.join(static_path, "$metadata", "index.xml")
Ed Tanous683f7272018-07-26 12:47:19 -0700135
136zipBytesIO = BytesIO(r.content)
137zip_ref = zipfile.ZipFile(zipBytesIO)
138
139# Remove the old files
Szymon Dompked699cf92021-08-11 19:46:31 +0200140skip_prefixes = ('Oem')
Ed Tanous683f7272018-07-26 12:47:19 -0700141if os.path.exists(schema_path):
Szymon Dompked699cf92021-08-11 19:46:31 +0200142 files = [os.path.join(schema_path, f) for f in os.listdir(schema_path)
143 if not f.startswith(skip_prefixes)]
James Feistaee8d842018-09-10 16:07:40 -0700144 for f in files:
145 os.remove(f)
Ed Tanous683f7272018-07-26 12:47:19 -0700146if os.path.exists(json_schema_path):
Szymon Dompked699cf92021-08-11 19:46:31 +0200147 files = [os.path.join(json_schema_path, f) for f in
148 os.listdir(json_schema_path) if not f.startswith(skip_prefixes)]
Ed Tanous118b1c72018-09-13 13:45:51 -0700149 for f in files:
150 if (os.path.isfile(f)):
151 os.remove(f)
152 else:
153 shutil.rmtree(f)
154os.remove(metadata_index_path)
Ed Tanous683f7272018-07-26 12:47:19 -0700155
Ed Tanous118b1c72018-09-13 13:45:51 -0700156if not os.path.exists(schema_path):
157 os.makedirs(schema_path)
158if not os.path.exists(json_schema_path):
159 os.makedirs(json_schema_path)
Ed Tanous683f7272018-07-26 12:47:19 -0700160
Ed Tanous118b1c72018-09-13 13:45:51 -0700161with open(metadata_index_path, 'w') as metadata_index:
162
163 metadata_index.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
164 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700165 "<edmx:Edmx xmlns:edmx="
166 "\"http://docs.oasis-open.org/odata/ns/edmx\""
167 " Version=\"4.0\">\n")
Ed Tanous118b1c72018-09-13 13:45:51 -0700168
169 for zip_filepath in zip_ref.namelist():
Gunnar Mills60c922d2021-12-01 09:28:53 -0600170 if zip_filepath.startswith('csdl/') and \
Ed Tanousf395daa2021-08-02 08:56:24 -0700171 (zip_filepath != VERSION + "/csdl/") and \
Gunnar Mills60c922d2021-12-01 09:28:53 -0600172 (zip_filepath != "csdl/"):
Ed Tanous118b1c72018-09-13 13:45:51 -0700173 filename = os.path.basename(zip_filepath)
Gunnar Mills349a2ac2021-01-20 22:29:16 -0600174
175 # filename looks like Zone_v1.xml
176 filenamesplit = filename.split("_")
177 if filenamesplit[0] not in include_list:
178 print("excluding schema: " + filename)
179 continue
180
Ed Tanousf395daa2021-08-02 08:56:24 -0700181 with open(os.path.join(schema_path, filename), 'wb') as schema_out:
Ed Tanous118b1c72018-09-13 13:45:51 -0700182
183 metadata_index.write(
Ed Tanouscb103132019-10-08 11:34:22 -0700184 " <edmx:Reference Uri=\"/redfish/v1/schema/" +
185 filename +
186 "\">\n")
Ed Tanous118b1c72018-09-13 13:45:51 -0700187
188 content = zip_ref.read(zip_filepath)
Ed Tanouscb103132019-10-08 11:34:22 -0700189 content = content.replace(b'\r\n', b'\n')
Ed Tanous118b1c72018-09-13 13:45:51 -0700190 xml_root = ET.fromstring(content)
Ed Tanousf395daa2021-08-02 08:56:24 -0700191 edmx = "{http://docs.oasis-open.org/odata/ns/edmx}"
Szymon Dompked699cf92021-08-11 19:46:31 +0200192 edm = "{http://docs.oasis-open.org/odata/ns/edm}"
Ed Tanous118b1c72018-09-13 13:45:51 -0700193 for edmx_child in xml_root:
Ed Tanousf395daa2021-08-02 08:56:24 -0700194 if edmx_child.tag == edmx + "DataServices":
Ed Tanous118b1c72018-09-13 13:45:51 -0700195 for data_child in edmx_child:
Szymon Dompked699cf92021-08-11 19:46:31 +0200196 if data_child.tag == edm + "Schema":
Ed Tanous118b1c72018-09-13 13:45:51 -0700197 namespace = data_child.attrib["Namespace"]
198 if namespace.startswith("RedfishExtensions"):
199 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700200 " "
201 "<edmx:Include Namespace=\"" +
202 namespace +
203 "\" Alias=\"Redfish\"/>\n"
204 )
Ed Tanous118b1c72018-09-13 13:45:51 -0700205
206 else:
207 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700208 " "
209 "<edmx:Include Namespace=\""
210 + namespace + "\"/>\n"
211 )
212 schema_out.write(content)
Ed Tanous118b1c72018-09-13 13:45:51 -0700213 metadata_index.write(" </edmx:Reference>\n")
214
Ed Tanousf395daa2021-08-02 08:56:24 -0700215 metadata_index.write(" <edmx:DataServices>\n"
216 " <Schema "
217 "xmlns=\"http://docs.oasis-open.org/odata/ns/edm\" "
218 "Namespace=\"Service\">\n"
219 " <EntityContainer Name=\"Service\" "
220 "Extends=\"ServiceRoot.v1_0_0.ServiceContainer\"/>\n"
221 " </Schema>\n"
222 " </edmx:DataServices>\n"
223 )
Ed Tanouscb103132019-10-08 11:34:22 -0700224 # TODO:Issue#32 There's a bug in the script that currently deletes this
Asmitha Karunanithid337bb72020-09-21 10:34:02 -0500225 # schema (because it's an OEM schema). Because it's the only six, and we
Ed Tanouscb103132019-10-08 11:34:22 -0700226 # don't update schemas very often, we just manually fix it. Need a
227 # permanent fix to the script.
228 metadata_index.write(
229 " <edmx:Reference Uri=\"/redfish/v1/schema/OemManager_v1.xml\">\n")
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600230 metadata_index.write(" <edmx:Include Namespace=\"OemManager\"/>\n")
231 metadata_index.write(" </edmx:Reference>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600232
233 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700234 " <edmx:Reference Uri=\""
235 "/redfish/v1/schema/OemComputerSystem_v1.xml\">\n")
236 metadata_index.write(
237 " <edmx:Include Namespace=\"OemComputerSystem\"/>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600238 metadata_index.write(" </edmx:Reference>\n")
239
240 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700241 " <edmx:Reference Uri=\""
242 "/redfish/v1/schema/OemVirtualMedia_v1.xml\">\n")
243 metadata_index.write(
244 " <edmx:Include Namespace=\"OemVirtualMedia\"/>\n")
245 metadata_index.write(
246 " <edmx:Include Namespace=\"OemVirtualMedia.v1_0_0\"/>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600247 metadata_index.write(" </edmx:Reference>\n")
248
249 metadata_index.write(
Ed Tanousf395daa2021-08-02 08:56:24 -0700250 " <edmx:Reference Uri=\""
251 "/redfish/v1/schema/OemAccountService_v1.xml\">\n")
252 metadata_index.write(
253 " <edmx:Include Namespace=\"OemAccountService\"/>\n")
254 metadata_index.write(
255 " <edmx:Include Namespace=\"OemAccountService.v1_0_0\"/>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600256 metadata_index.write(" </edmx:Reference>\n")
257
Ravi Tejae7d68c32020-03-15 13:30:41 -0500258 metadata_index.write(
Sunitha Harish9dc50742020-05-11 00:10:20 -0500259 " <edmx:Reference Uri=\"/redfish/v1/schema/OemSession_v1.xml\">\n")
260 metadata_index.write(" <edmx:Include Namespace=\"OemSession\"/>\n")
Ed Tanousf395daa2021-08-02 08:56:24 -0700261 metadata_index.write(
262 " <edmx:Include Namespace=\"OemSession.v1_0_0\"/>\n")
Sunitha Harish9dc50742020-05-11 00:10:20 -0500263 metadata_index.write(" </edmx:Reference>\n")
264
Ed Tanous118b1c72018-09-13 13:45:51 -0700265 metadata_index.write("</edmx:Edmx>\n")
Ed Tanous683f7272018-07-26 12:47:19 -0700266
267schema_files = {}
268for zip_filepath in zip_ref.namelist():
Gunnar Mills60c922d2021-12-01 09:28:53 -0600269 if zip_filepath.startswith(os.path.join('json-schema/')):
Ed Tanous683f7272018-07-26 12:47:19 -0700270 filename = os.path.basename(zip_filepath)
271 filenamesplit = filename.split(".")
Gunnar Mills349a2ac2021-01-20 22:29:16 -0600272
273 # exclude schemas again to save flash space
274 if filenamesplit[0] not in include_list:
275 continue
276
Ed Tanous683f7272018-07-26 12:47:19 -0700277 if len(filenamesplit) == 3:
278 thisSchemaVersion = schema_files.get(filenamesplit[0], None)
Ed Tanouscb103132019-10-08 11:34:22 -0700279 if thisSchemaVersion is None:
Ed Tanous683f7272018-07-26 12:47:19 -0700280 schema_files[filenamesplit[0]] = filenamesplit[1]
281 else:
282 # need to see if we're a newer version.
283 if list(map(int, filenamesplit[1][1:].split("_"))) > list(map(
284 int, thisSchemaVersion[1:].split("_"))):
285 schema_files[filenamesplit[0]] = filenamesplit[1]
286
287
288for schema, version in schema_files.items():
289 basename = schema + "." + version + ".json"
Gunnar Mills60c922d2021-12-01 09:28:53 -0600290 zip_filepath = os.path.join("json-schema", basename)
Ed Tanous683f7272018-07-26 12:47:19 -0700291 schemadir = os.path.join(json_schema_path, schema)
292 os.makedirs(schemadir)
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600293 location_json = OrderedDict()
294 location_json["Language"] = "en"
295 location_json["PublicationUri"] = (
296 "http://redfish.dmtf.org/schemas/v1/" + schema + ".json")
297 location_json["Uri"] = (
Ed Tanous63faafa2019-01-03 14:09:56 -0800298 "/redfish/v1/JsonSchemas/" + schema + "/" + schema + ".json")
Ed Tanous118b1c72018-09-13 13:45:51 -0700299
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600300 index_json = OrderedDict()
Ed Tanousf395daa2021-08-02 08:56:24 -0700301 index_json["@odata.context"] = \
302 "/redfish/v1/$metadata#JsonSchemaFile.JsonSchemaFile"
Ed Tanous63faafa2019-01-03 14:09:56 -0800303 index_json["@odata.id"] = "/redfish/v1/JsonSchemas/" + schema
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600304 index_json["@odata.type"] = "#JsonSchemaFile.v1_0_2.JsonSchemaFile"
305 index_json["Name"] = schema + " Schema File"
306 index_json["Schema"] = "#" + schema + "." + schema
Ed Tanouscb103132019-10-08 11:34:22 -0700307 index_json["Description"] = schema + " Schema File Location"
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600308 index_json["Id"] = schema
Ed Tanouscb103132019-10-08 11:34:22 -0700309 index_json["Languages"] = ["en"]
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600310 index_json["Languages@odata.count"] = 1
Ed Tanouscb103132019-10-08 11:34:22 -0700311 index_json["Location"] = [location_json]
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600312 index_json["Location@odata.count"] = 1
Ed Tanous118b1c72018-09-13 13:45:51 -0700313
314 with open(os.path.join(schemadir, "index.json"), 'w') as schema_file:
315 json.dump(index_json, schema_file, indent=4)
316 with open(os.path.join(schemadir, schema + ".json"), 'wb') as schema_file:
Ed Tanouscb103132019-10-08 11:34:22 -0700317 schema_file.write(zip_ref.read(zip_filepath).replace(b'\r\n', b'\n'))
Ed Tanous683f7272018-07-26 12:47:19 -0700318
319with open(os.path.join(json_schema_path, "index.json"), 'w') as index_file:
Ed Tanous6f56d0c2019-05-03 17:15:41 -0700320 members = [{"@odata.id": "/redfish/v1/JsonSchemas/" + schema}
Ed Tanous683f7272018-07-26 12:47:19 -0700321 for schema in schema_files]
322
323 members.sort(key=lambda x: x["@odata.id"])
324
325 indexData = OrderedDict()
326
327 indexData["@odata.id"] = "/redfish/v1/JsonSchemas"
328 indexData["@odata.context"] = ("/redfish/v1/$metadata"
329 "#JsonSchemaFileCollection."
330 "JsonSchemaFileCollection")
331 indexData["@odata.type"] = ("#JsonSchemaFileCollection."
332 "JsonSchemaFileCollection")
333 indexData["Name"] = "JsonSchemaFile Collection"
334 indexData["Description"] = "Collection of JsonSchemaFiles"
335 indexData["Members@odata.count"] = len(schema_files)
336 indexData["Members"] = members
337
338 json.dump(indexData, index_file, indent=2)
339
340zip_ref.close()