Merge "Change AutoConnectSSH to return error code by default"
[yardstick.git] / yardstick / common / template_format.py
index 881b7e4..bd5d837 100644 (file)
 
 # yardstick: this file is copied from python-heatclient and slightly modified
 
 
 # yardstick: this file is copied from python-heatclient and slightly modified
 
-import json
+from __future__ import absolute_import
+
 import yaml
 import yaml
+from oslo_serialization import jsonutils
 
 if hasattr(yaml, 'CSafeLoader'):
 
 if hasattr(yaml, 'CSafeLoader'):
-    yaml_loader = yaml.CSafeLoader
+    # make a dynamic subclass so we don't override global yaml Loader
+    yaml_loader = type('HeatYamlLoader', (yaml.CSafeLoader,), {})
 else:
 else:
-    yaml_loader = yaml.SafeLoader
+    yaml_loader = type('HeatYamlLoader', (yaml.SafeLoader,), {})
 
 if hasattr(yaml, 'CSafeDumper'):
     yaml_dumper = yaml.CSafeDumper
 
 if hasattr(yaml, 'CSafeDumper'):
     yaml_dumper = yaml.CSafeDumper
@@ -26,10 +29,13 @@ else:
     yaml_dumper = yaml.SafeDumper
 
 
     yaml_dumper = yaml.SafeDumper
 
 
+# This breaks NetworkServiceTestCase yaml loading, because we need to conversion to
+# native Python str() objects because we use use Trex and Trex is has broken unicode handling
 def _construct_yaml_str(self, node):
     # Override the default string handling function
     # to always return unicode objects
     return self.construct_scalar(node)
 def _construct_yaml_str(self, node):
     # Override the default string handling function
     # to always return unicode objects
     return self.construct_scalar(node)
+
 yaml_loader.add_constructor(u'tag:yaml.org,2002:str', _construct_yaml_str)
 # Unquoted dates like 2013-05-23 in yaml files get loaded as objects of type
 # datetime.data which causes problems in API layer when being processed by
 yaml_loader.add_constructor(u'tag:yaml.org,2002:str', _construct_yaml_str)
 # Unquoted dates like 2013-05-23 in yaml files get loaded as objects of type
 # datetime.data which causes problems in API layer when being processed by
@@ -40,15 +46,16 @@ yaml_loader.add_constructor(u'tag:yaml.org,2002:timestamp',
 
 
 def parse(tmpl_str):
 
 
 def parse(tmpl_str):
-    '''Takes a string and returns a dict containing the parsed structure.
+    """Takes a string and returns a dict containing the parsed structure.
 
     This includes determination of whether the string is using the
     JSON or YAML format.
 
     This includes determination of whether the string is using the
     JSON or YAML format.
-    '''
+    """
     if tmpl_str.startswith('{'):
     if tmpl_str.startswith('{'):
-        tpl = json.loads(tmpl_str)
+        tpl = jsonutils.loads(tmpl_str)
     else:
         try:
     else:
         try:
+            # we already use SafeLoader when constructing special Heat YAML loader class
             tpl = yaml.load(tmpl_str, Loader=yaml_loader)
         except yaml.YAMLError as yea:
             raise ValueError(yea)
             tpl = yaml.load(tmpl_str, Loader=yaml_loader)
         except yaml.YAMLError as yea:
             raise ValueError(yea)
@@ -56,8 +63,8 @@ def parse(tmpl_str):
             if tpl is None:
                 tpl = {}
     # Looking for supported version keys in the loaded template
             if tpl is None:
                 tpl = {}
     # Looking for supported version keys in the loaded template
-    if not ('HeatTemplateFormatVersion' in tpl
-            or 'heat_template_version' in tpl
-            or 'AWSTemplateFormatVersion' in tpl):
+    if not ('HeatTemplateFormatVersion' in tpl or
+            'heat_template_version' in tpl or
+            'AWSTemplateFormatVersion' in tpl):
         raise ValueError("Template format version not found.")
     return tpl
         raise ValueError("Template format version not found.")
     return tpl