config/utils: YAML: Use C bindings if available 51/52951/3
authorAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Thu, 1 Mar 2018 18:57:34 +0000 (19:57 +0100)
committerAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Thu, 1 Mar 2018 19:12:47 +0000 (20:12 +0100)
Time diff before/after this change for the same template via
generate_config expansion:
-user    0m0.144s
+user    0m0.096s

Change-Id: Id574afcd8a74a530d791ebed8b72ccae53703611
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
config/utils/generate_config.py
config/utils/validate_schema.py

index f1c395a..f5721c8 100755 (executable)
@@ -22,6 +22,7 @@ PARSER = argparse.ArgumentParser()
 PARSER.add_argument("--yaml", "-y", type=str, required=True)
 PARSER.add_argument("--jinja2", "-j", type=str, required=True)
 ARGS = PARSER.parse_args()
+LOADER = yaml.CSafeLoader if yaml.__with_libyaml__ else yaml.SafeLoader
 
 ENV = Environment(loader=FileSystemLoader(os.path.dirname(ARGS.jinja2)))
 gen_config_lib.load_custom_filters(ENV)
@@ -30,8 +31,8 @@ gen_config_lib.load_custom_filters(ENV)
 # Note: eyaml return code is 0 even if keys are not available
 try:
     if os.path.isfile(ARGS.yaml) and 'ENC[PKCS7' in open(ARGS.yaml).read():
-        DICT = yaml.safe_load(check_output(['eyaml', 'decrypt',
-                                            '-f', ARGS.yaml]))
+        DICT = yaml.load(check_output(['eyaml', 'decrypt',
+                                       '-f', ARGS.yaml]), Loader=LOADER)
 except CalledProcessError as ex:
     logging.error('eyaml decryption failed! Fallback to raw data.')
 except OSError as ex:
@@ -40,13 +41,13 @@ try:
     DICT['details']
 except (NameError, TypeError) as ex:
     with open(ARGS.yaml) as _:
-        DICT = yaml.safe_load(_)
+        DICT = yaml.load(_, Loader=LOADER)
 
 # If an installer descriptor file (IDF) exists, include it (temporary)
 IDF_PATH = '/idf-'.join(os.path.split(ARGS.yaml))
 if os.path.exists(IDF_PATH):
     with open(IDF_PATH) as _:
-        IDF = yaml.safe_load(_)
+        IDF = yaml.load(_, Loader=LOADER)
         DICT['idf'] = IDF['idf']
 
 # Print dictionary generated from yaml (uncomment for debug)
index 42f475d..1676e15 100755 (executable)
@@ -11,21 +11,20 @@ import argparse
 import jsonschema
 import yaml
 
+
 PARSER = argparse.ArgumentParser()
 PARSER.add_argument("--yaml", "-y", type=str, required=True)
 PARSER.add_argument("--schema", "-s", type=str, required=True)
 ARGS = PARSER.parse_args()
+LOADER = yaml.CSafeLoader if yaml.__with_libyaml__ else yaml.SafeLoader
 
 with open(ARGS.yaml) as _:
-    _DICT = yaml.safe_load(_)
+    _DICT = yaml.load(_, Loader=LOADER)
 
 with open(ARGS.schema) as _:
-    _SCHEMA = yaml.safe_load(_)
+    _SCHEMA = yaml.load(_, Loader=LOADER)
+
 
-# Draft 4 (latest supported by py-jsonschema) does not support value-based
-# decisions properly, see related github issue:
-# https://github.com/json-schema-org/json-schema-spec/issues/64
-# Workaround: build 'version_x.y: true' on the fly based on 'version: x.y'
 def schema_version_workaround(node):
     """Traverse nested dictionaries and handle 'version' key where found."""
     if 'version' in node:
@@ -33,9 +32,14 @@ def schema_version_workaround(node):
     for item in node.items():
         if type(item) is dict:
             schema_version_workaround(item)
+
+# Draft 4 (latest supported by py-jsonschema) does not support value-based
+# decisions properly, see related github issue:
+# https://github.com/json-schema-org/json-schema-spec/issues/64
+# Workaround: build 'version_x.y: true' on the fly based on 'version: x.y'
 schema_version_workaround(_DICT)
 if 'idf' in _DICT:
-  schema_version_workaround(_DICT['idf'])
+    schema_version_workaround(_DICT['idf'])
 
 _VALIDATOR = jsonschema.Draft4Validator(_SCHEMA)
 for error in _VALIDATOR.iter_errors(_DICT):