blob: 3bca686c598176dfc679cc35a16dd68f8239f301 [file] [log] [blame]
Ed Tanous683f7272018-07-26 12:47:19 -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
James Feistaee8d842018-09-10 16:07:40 -070011import glob
Ed Tanous683f7272018-07-26 12:47:19 -070012
Ed Tanous118b1c72018-09-13 13:45:51 -070013import xml.etree.ElementTree as ET
14
Gunnar Millsa778c022020-05-12 12:20:36 -050015VERSION = "DSP8010_2020.1"
Ed Tanouscb103132019-10-08 11:34:22 -070016
Ed Tanous683f7272018-07-26 12:47:19 -070017SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
18
19proxies = {
20 'https': os.environ.get("https_proxy", None)
21}
22
Ed Tanouscb103132019-10-08 11:34:22 -070023r = requests.get(
24 'https://www.dmtf.org/sites/default/files/standards/documents/' +
25 VERSION +
26 '.zip',
27 proxies=proxies)
Ed Tanous683f7272018-07-26 12:47:19 -070028
29r.raise_for_status()
30
31static_path = os.path.realpath(os.path.join(SCRIPT_DIR, "..", "static",
32 "redfish", "v1"))
33
34schema_path = os.path.join(static_path, "schema")
35json_schema_path = os.path.join(static_path, "JsonSchemas")
Ed Tanous118b1c72018-09-13 13:45:51 -070036metadata_index_path = os.path.join(static_path, "$metadata", "index.xml")
Ed Tanous683f7272018-07-26 12:47:19 -070037
38zipBytesIO = BytesIO(r.content)
39zip_ref = zipfile.ZipFile(zipBytesIO)
40
41# Remove the old files
42if os.path.exists(schema_path):
James Feistaee8d842018-09-10 16:07:40 -070043 files = glob.glob(os.path.join(schema_path, '[!Oem]*'))
44 for f in files:
45 os.remove(f)
Ed Tanous683f7272018-07-26 12:47:19 -070046if os.path.exists(json_schema_path):
Ed Tanous118b1c72018-09-13 13:45:51 -070047 files = glob.glob(os.path.join(json_schema_path, '[!Oem]*'))
48 for f in files:
49 if (os.path.isfile(f)):
50 os.remove(f)
51 else:
52 shutil.rmtree(f)
53os.remove(metadata_index_path)
Ed Tanous683f7272018-07-26 12:47:19 -070054
Ed Tanous118b1c72018-09-13 13:45:51 -070055if not os.path.exists(schema_path):
56 os.makedirs(schema_path)
57if not os.path.exists(json_schema_path):
58 os.makedirs(json_schema_path)
Ed Tanous683f7272018-07-26 12:47:19 -070059
Ed Tanous118b1c72018-09-13 13:45:51 -070060with open(metadata_index_path, 'w') as metadata_index:
61
62 metadata_index.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
63 metadata_index.write(
64 "<edmx:Edmx xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\" Version=\"4.0\">\n")
65
66 for zip_filepath in zip_ref.namelist():
Ed Tanouscb103132019-10-08 11:34:22 -070067 if zip_filepath.startswith(VERSION +
Ed Tanouscb103132019-10-08 11:34:22 -070068 '/csdl/') & (zip_filepath != VERSION +
69 "/csdl/") & (zip_filepath != VERSION +
Ed Tanouscb103132019-10-08 11:34:22 -070070 "/csdl/"):
Ed Tanous118b1c72018-09-13 13:45:51 -070071 filename = os.path.basename(zip_filepath)
72 with open(os.path.join(schema_path, filename), 'wb') as schema_file:
73
74 metadata_index.write(
Ed Tanouscb103132019-10-08 11:34:22 -070075 " <edmx:Reference Uri=\"/redfish/v1/schema/" +
76 filename +
77 "\">\n")
Ed Tanous118b1c72018-09-13 13:45:51 -070078
79 content = zip_ref.read(zip_filepath)
Ed Tanouscb103132019-10-08 11:34:22 -070080 content = content.replace(b'\r\n', b'\n')
Ed Tanous118b1c72018-09-13 13:45:51 -070081 xml_root = ET.fromstring(content)
82
83 for edmx_child in xml_root:
84
85 if edmx_child.tag == "{http://docs.oasis-open.org/odata/ns/edmx}DataServices":
86 for data_child in edmx_child:
87 if data_child.tag == "{http://docs.oasis-open.org/odata/ns/edm}Schema":
88 namespace = data_child.attrib["Namespace"]
89 if namespace.startswith("RedfishExtensions"):
90 metadata_index.write(
91 " <edmx:Include Namespace=\"" + namespace + "\" Alias=\"Redfish\"/>\n")
92
93 else:
94 metadata_index.write(
95 " <edmx:Include Namespace=\"" + namespace + "\"/>\n")
96 schema_file.write(content)
97 metadata_index.write(" </edmx:Reference>\n")
98
99 metadata_index.write(""" <edmx:DataServices>
100 <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Service">
101 <EntityContainer Name="Service" Extends="ServiceRoot.v1_0_0.ServiceContainer"/>
102 </Schema>
103 </edmx:DataServices>
104""")
Ed Tanouscb103132019-10-08 11:34:22 -0700105 # TODO:Issue#32 There's a bug in the script that currently deletes this
Gunnar Mills20778992020-02-06 16:36:47 -0600106 # schema (because it's an OEM schema). Because it's the only five, and we
Ed Tanouscb103132019-10-08 11:34:22 -0700107 # don't update schemas very often, we just manually fix it. Need a
108 # permanent fix to the script.
109 metadata_index.write(
110 " <edmx:Reference Uri=\"/redfish/v1/schema/OemManager_v1.xml\">\n")
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600111 metadata_index.write(" <edmx:Include Namespace=\"OemManager\"/>\n")
112 metadata_index.write(" </edmx:Reference>\n")
Gunnar Mills20778992020-02-06 16:36:47 -0600113
114 metadata_index.write(
115 " <edmx:Reference Uri=\"/redfish/v1/schema/OemCrashdump_v1.xml\">\n")
116 metadata_index.write(" <edmx:Include Namespace=\"OemCrashdump.v1_0_0\"/>\n")
117 metadata_index.write(" </edmx:Reference>\n")
118
119 metadata_index.write(
120 " <edmx:Reference Uri=\"/redfish/v1/schema/OemComputerSystem_v1.xml\">\n")
121 metadata_index.write(" <edmx:Include Namespace=\"OemComputerSystem\"/>\n")
122 metadata_index.write(" </edmx:Reference>\n")
123
124 metadata_index.write(
125 " <edmx:Reference Uri=\"/redfish/v1/schema/OemVirtualMedia_v1.xml\">\n")
126 metadata_index.write(" <edmx:Include Namespace=\"OemVirtualMedia\"/>\n")
127 metadata_index.write(" <edmx:Include Namespace=\"OemVirtualMedia.v1_0_0\"/>\n")
128 metadata_index.write(" </edmx:Reference>\n")
129
130 metadata_index.write(
131 " <edmx:Reference Uri=\"/redfish/v1/schema/OemAccountService_v1.xml\">\n")
132 metadata_index.write(" <edmx:Include Namespace=\"OemAccountService\"/>\n")
133 metadata_index.write(" <edmx:Include Namespace=\"OemAccountService.v1_0_0\"/>\n")
134 metadata_index.write(" </edmx:Reference>\n")
135
Ravi Tejae7d68c32020-03-15 13:30:41 -0500136 metadata_index.write(
137 " <edmx:Reference Uri=\"/redfish/v1/schema/OemLogService_v1.xml\">\n")
138 metadata_index.write(" <edmx:Include Namespace=\"OemLogService\"/>\n")
139 metadata_index.write(" <edmx:Include Namespace=\"OemLogService.v1_0_0\"/>\n")
140 metadata_index.write(" </edmx:Reference>\n")
141
142 metadata_index.write(
143 " <edmx:Reference Uri=\"/redfish/v1/schema/OemLogEntry_v1.xml\">\n")
144 metadata_index.write(" <edmx:Include Namespace=\"OemLogEntry\"/>\n")
145 metadata_index.write(" <edmx:Include Namespace=\"OemLogEntry.v1_0_0\"/>\n")
146 metadata_index.write(" </edmx:Reference>\n")
147
Ed Tanous118b1c72018-09-13 13:45:51 -0700148 metadata_index.write("</edmx:Edmx>\n")
Ed Tanous683f7272018-07-26 12:47:19 -0700149
150schema_files = {}
151for zip_filepath in zip_ref.namelist():
Gunnar Millsa778c022020-05-12 12:20:36 -0500152 if zip_filepath.startswith(os.path.join(VERSION, 'json-schema/')):
Ed Tanous683f7272018-07-26 12:47:19 -0700153 filename = os.path.basename(zip_filepath)
154 filenamesplit = filename.split(".")
155 if len(filenamesplit) == 3:
156 thisSchemaVersion = schema_files.get(filenamesplit[0], None)
Ed Tanouscb103132019-10-08 11:34:22 -0700157 if thisSchemaVersion is None:
Ed Tanous683f7272018-07-26 12:47:19 -0700158 schema_files[filenamesplit[0]] = filenamesplit[1]
159 else:
160 # need to see if we're a newer version.
161 if list(map(int, filenamesplit[1][1:].split("_"))) > list(map(
162 int, thisSchemaVersion[1:].split("_"))):
163 schema_files[filenamesplit[0]] = filenamesplit[1]
164
165
166for schema, version in schema_files.items():
167 basename = schema + "." + version + ".json"
Gunnar Millsa778c022020-05-12 12:20:36 -0500168 zip_filepath = os.path.join(VERSION, "json-schema", basename)
Ed Tanous683f7272018-07-26 12:47:19 -0700169 schemadir = os.path.join(json_schema_path, schema)
170 os.makedirs(schemadir)
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600171 location_json = OrderedDict()
172 location_json["Language"] = "en"
173 location_json["PublicationUri"] = (
174 "http://redfish.dmtf.org/schemas/v1/" + schema + ".json")
175 location_json["Uri"] = (
Ed Tanous63faafa2019-01-03 14:09:56 -0800176 "/redfish/v1/JsonSchemas/" + schema + "/" + schema + ".json")
Ed Tanous118b1c72018-09-13 13:45:51 -0700177
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600178 index_json = OrderedDict()
179 index_json["@odata.context"] = "/redfish/v1/$metadata#JsonSchemaFile.JsonSchemaFile"
Ed Tanous63faafa2019-01-03 14:09:56 -0800180 index_json["@odata.id"] = "/redfish/v1/JsonSchemas/" + schema
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600181 index_json["@odata.type"] = "#JsonSchemaFile.v1_0_2.JsonSchemaFile"
182 index_json["Name"] = schema + " Schema File"
183 index_json["Schema"] = "#" + schema + "." + schema
Ed Tanouscb103132019-10-08 11:34:22 -0700184 index_json["Description"] = schema + " Schema File Location"
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600185 index_json["Id"] = schema
Ed Tanouscb103132019-10-08 11:34:22 -0700186 index_json["Languages"] = ["en"]
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600187 index_json["Languages@odata.count"] = 1
Ed Tanouscb103132019-10-08 11:34:22 -0700188 index_json["Location"] = [location_json]
Marri Devender Raod45d2d02019-01-21 10:11:34 -0600189 index_json["Location@odata.count"] = 1
Ed Tanous118b1c72018-09-13 13:45:51 -0700190
191 with open(os.path.join(schemadir, "index.json"), 'w') as schema_file:
192 json.dump(index_json, schema_file, indent=4)
193 with open(os.path.join(schemadir, schema + ".json"), 'wb') as schema_file:
Ed Tanouscb103132019-10-08 11:34:22 -0700194 schema_file.write(zip_ref.read(zip_filepath).replace(b'\r\n', b'\n'))
Ed Tanous683f7272018-07-26 12:47:19 -0700195
196with open(os.path.join(json_schema_path, "index.json"), 'w') as index_file:
Ed Tanous6f56d0c2019-05-03 17:15:41 -0700197 members = [{"@odata.id": "/redfish/v1/JsonSchemas/" + schema}
Ed Tanous683f7272018-07-26 12:47:19 -0700198 for schema in schema_files]
199
200 members.sort(key=lambda x: x["@odata.id"])
201
202 indexData = OrderedDict()
203
204 indexData["@odata.id"] = "/redfish/v1/JsonSchemas"
205 indexData["@odata.context"] = ("/redfish/v1/$metadata"
206 "#JsonSchemaFileCollection."
207 "JsonSchemaFileCollection")
208 indexData["@odata.type"] = ("#JsonSchemaFileCollection."
209 "JsonSchemaFileCollection")
210 indexData["Name"] = "JsonSchemaFile Collection"
211 indexData["Description"] = "Collection of JsonSchemaFiles"
212 indexData["Members@odata.count"] = len(schema_files)
213 indexData["Members"] = members
214
215 json.dump(indexData, index_file, indent=2)
216
217zip_ref.close()