Synchronize upstream version of 0.9
[parser.git] / tosca2heat / heat-translator / translator / hot / tosca_translator.py
index 14ef8a1..a637a8c 100644 (file)
@@ -12,6 +12,7 @@
 # under the License.
 
 import logging
+import six
 from toscaparser.utils.gettextutils import _
 from translator.hot.syntax.hot_template import HotTemplate
 from translator.hot.translate_inputs import TranslateInputs
@@ -24,24 +25,65 @@ log = logging.getLogger('heat-translator')
 class TOSCATranslator(object):
     '''Invokes translation methods.'''
 
-    def __init__(self, tosca, parsed_params, deploy=None):
+    def __init__(self, tosca, parsed_params, deploy=None, csar_dir=None):
         super(TOSCATranslator, self).__init__()
         self.tosca = tosca
         self.hot_template = HotTemplate()
         self.parsed_params = parsed_params
         self.deploy = deploy
+        self.csar_dir = csar_dir
         self.node_translator = None
         log.info(_('Initialized parmaters for translation.'))
 
-    def translate(self):
+    def _translate_to_hot_yaml(self):
         self._resolve_input()
         self.hot_template.description = self.tosca.description
         self.hot_template.parameters = self._translate_inputs()
         self.node_translator = TranslateNodeTemplates(self.tosca,
-                                                      self.hot_template)
-        self.hot_template.resources = self.node_translator.translate()
+                                                      self.hot_template,
+                                                      csar_dir=self.csar_dir)
+        self.hot_template.resources = \
+            self.node_translator.translate()
         self.hot_template.outputs = self._translate_outputs()
-        return self.hot_template.output_to_yaml()
+        if self.node_translator.hot_template_version is None:
+            self.node_translator.hot_template_version = HotTemplate.LATEST
+
+    def translate(self):
+        """Translate to HOT YAML
+
+        This method produces a translated output for main template.
+        The nested template, if any referenced by main, will be created
+        as a separate file.
+        """
+        self._translate_to_hot_yaml()
+
+        # TODO(mvelten) go back to calling hot_template.output_to_yaml instead
+        # for stdout once embed_substack_templates is correctly implemented
+        # return self.hot_template.output_to_yaml(
+        #     self.node_translator.hot_template_version)
+        yaml_files = self.hot_template.output_to_yaml_files_dict(
+            "output.yaml",
+            self.node_translator.hot_template_version)
+        for name, content in six.iteritems(yaml_files):
+            if name != "output.yaml":
+                with open(name, 'w+') as f:
+                    f.write(content)
+
+        return yaml_files["output.yaml"]
+
+    def translate_to_yaml_files_dict(self, base_filename,
+                                     nested_resources=False):
+        """Translate to HOT YAML
+
+        This method produces a translated output containing main and
+        any nested templates referenced by main. This output can be
+        programmatically stored into different files by using key as
+        template name and value as template content.
+        """
+        self._translate_to_hot_yaml()
+        return self.hot_template.output_to_yaml_files_dict(
+            base_filename,
+            self.node_translator.hot_template_version, nested_resources)
 
     def _translate_inputs(self):
         translator = TranslateInputs(self.tosca.inputs, self.parsed_params,