From 98138f4706bf133ad30133a163b5c810bd60c62e Mon Sep 17 00:00:00 2001
From: Mathieu Bultel <mbultel@redhat.com>
Date: Thu, 29 Sep 2016 17:25:38 +0200
Subject: [PATCH] Download templates from swift before processing with heatclient

Currently we hit an issue in update and upgrade, when heatclieant
try to process the templates and failed because there was some
missing unrendered template files, ie : post.j2.yaml

Change-Id: If95825e7df5d2c0e6cbe3575d06d57db1e8182da
Closes-Bug: #1624727
---

diff --git a/tripleoclient/tests/v1/overcloud_deploy/fakes.py b/tripleoclient/tests/v1/overcloud_deploy/fakes.py
index f5d3f89..d2d5942 100644
--- a/tripleoclient/tests/v1/overcloud_deploy/fakes.py
+++ b/tripleoclient/tests/v1/overcloud_deploy/fakes.py
@@ -107,12 +107,22 @@
 
     def __init__(self):
         self._instance = mock.Mock()
-        self.object_store = mock.Mock()
+        self.object_store = FakeObjectClient()
 
     def messaging_websocket(self, queue_name):
         return fakes.FakeWebSocket()
 
 
+class FakeObjectClient(object):
+
+    def __init__(self):
+        self._instance = mock.Mock()
+        self.put_object = mock.Mock()
+
+    def get_object(self, *args):
+        return
+
+
 class TestDeployOvercloud(utils.TestCommand):
 
     def setUp(self):
diff --git a/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py b/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py
index cb13687..402e3f8 100644
--- a/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py
+++ b/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py
@@ -94,7 +94,8 @@
     @mock.patch('tripleoclient.utils.create_keystone_credential',
                 autospec=True)
     @mock.patch('time.time', autospec=True)
-    def test_tht_scale(self, mock_time, mock_creds, mock_uuid1,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_tht_scale(self, mock_copy, mock_time, mock_creds, mock_uuid1,
                        mock_check_hypervisor_stats, mock_get_key,
                        mock_create_env, generate_certs_mock,
                        mock_get_template_contents, mock_process_multiple_env,
@@ -264,7 +265,10 @@
     @mock.patch('tripleoclient.utils.create_keystone_credential',
                 autospec=True)
     @mock.patch('time.time', autospec=True)
-    def test_tht_deploy(self, mock_time, mock_creds, mock_uuid1,
+    @mock.patch('shutil.copytree', autospec=True)
+    @mock.patch('tempfile.mkdtemp', autospec=True)
+    def test_tht_deploy(self, mock_tmp, mock_copy, mock_time, mock_creds,
+                        mock_uuid1,
                         mock_check_hypervisor_stats, mock_get_key,
                         mock_create_env, generate_certs_mock,
                         mock_get_template_contents, mock_process_multiple_env,
@@ -288,6 +292,7 @@
         mock_uuid1.return_value = "uuid"
         mock_creds.return_value = "key"
         mock_time.return_value = 123456789
+        mock_tmp.return_value = "/tmp/abc"
 
         mock_generate_overcloud_passwords.return_value = self._get_passwords()
 
@@ -401,7 +406,7 @@
         mock_validate_args.assert_called_once_with(parsed_args)
 
         mock_tarball.create_tarball.assert_called_with(
-            '/usr/share/openstack-tripleo-heat-templates', mock.ANY)
+            '/tmp/abc/tripleo-heat-templates/', mock.ANY)
         mock_tarball.tarball_extract_to_swift_container.assert_called_with(
             clients.tripleoclient.object_store, mock.ANY, 'overcloud')
 
@@ -434,7 +439,9 @@
     @mock.patch('tripleoclient.utils.get_config_value', autospec=True)
     @mock.patch('tripleoclient.utils.check_hypervisor_stats',
                 autospec=True)
-    def test_deploy_custom_templates(self, mock_check_hypervisor_stats,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_deploy_custom_templates(self, mock_copy,
+                                     mock_check_hypervisor_stats,
                                      mock_get_key,
                                      mock_create_env, generate_certs_mock,
                                      mock_get_template_contents,
@@ -539,7 +546,8 @@
                 '_update_parameters', autospec=True)
     @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
                 '_heat_deploy', autospec=True)
-    def test_environment_dirs(self, mock_deploy_heat,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_environment_dirs(self, mock_copy, mock_deploy_heat,
                               mock_update_parameters, mock_post_config,
                               mock_utils_check_nodes, mock_utils_endpoint,
                               mock_utils_createrc, mock_utils_tempest,
@@ -591,7 +599,8 @@
                 '_update_parameters', autospec=True)
     @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
                 '_heat_deploy', autospec=True)
-    def test_environment_dirs_env(self, mock_deploy_heat,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_environment_dirs_env(self, mock_copy, mock_deploy_heat,
                                   mock_update_parameters, mock_post_config,
                                   mock_utils_check_nodes, mock_utils_endpoint,
                                   mock_utils_createrc, mock_utils_tempest,
@@ -692,7 +701,8 @@
     @mock.patch('tripleoclient.utils.get_config_value', autospec=True)
     @mock.patch('tripleoclient.utils.check_hypervisor_stats',
                 autospec=True)
-    def test_deploy_rhel_reg(self, mock_check_hypervisor_stats,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_deploy_rhel_reg(self, mock_copy, mock_check_hypervisor_stats,
                              mock_get_key,
                              mock_create_env, generate_certs_mock,
                              mock_get_template_contents,
@@ -792,7 +802,9 @@
                           self.cmd._validate_args,
                           parsed_args)
 
-    def test_validate_args_missing_environment_files(self):
+    @mock.patch('tripleoclient.tests.v1.overcloud_deploy.fakes.'
+                'FakeObjectClient.get_object', autospec=True)
+    def test_validate_args_missing_environment_files(self, mock_obj):
         arglist = ['--templates',
                    '-e', 'nonexistent.yaml']
         verifylist = [
@@ -800,12 +812,29 @@
             ('environment_files', ['nonexistent.yaml']),
         ]
 
+        mock_obj.side_effect = ObjectClientException(mock.Mock(
+                                                     '/fake/path not found'))
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
         self.assertRaises(oscexc.CommandError,
                           self.cmd._validate_args,
                           parsed_args)
 
+    @mock.patch('tripleoclient.tests.v1.overcloud_deploy.fakes.'
+                'FakeObjectClient.get_object', autospec=True)
+    def test_validate_args_missing_files_present_in_container(self, mock_obj):
+        arglist = ['--templates',
+                   '-e', 'nonexistent.yaml']
+        verifylist = [
+            ('templates', '/usr/share/openstack-tripleo-heat-templates/'),
+            ('environment_files', ['nonexistent.yaml']),
+        ]
+
+        mock_obj.side_effect = ('fake', 'tuple')
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        self.cmd._validate_args(parsed_args)
+
     def test_validate_args_no_tunnel_type(self):
         arglist = ['--templates',
                    '--neutron-network-type', 'nettype']
@@ -953,7 +982,9 @@
                 '_heat_deploy', autospec=True)
     @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
                 'set_overcloud_passwords', autospec=True)
-    def test_answers_file(self,
+    @mock.patch('shutil.copytree', autospec=True)
+    @mock.patch('tempfile.mkdtemp', autospec=True)
+    def test_answers_file(self, mock_tmp, mock_copy,
                           mock_set_overcloud_passwords,
                           mock_heat_deploy,
                           mock_oc_endpoint,
@@ -966,6 +997,7 @@
         workflow_client.action_executions.create.return_value = mock.MagicMock(
             output='{"result":[]}')
 
+        mock_tmp.return_value = "/dev/null"
         network_client = clients.network
         network_client.stacks.get.return_value = None
         net = network_client.api.find_attr('networks', 'ctlplane')
@@ -1000,7 +1032,8 @@
 
         # Check that Heat was called with correct parameters:
         call_args = mock_heat_deploy.call_args[0]
-        self.assertEqual(call_args[3], '/dev/null/overcloud.yaml')
+        self.assertEqual(call_args[3],
+                         '/dev/null/tripleo-heat-templates/overcloud.yaml')
         self.assertIn('/tmp/foo3.yaml', call_args[5])
         self.assertIn('/tmp/environment.yaml', call_args[5])
         foo_index = call_args[5].index('/tmp/foo3.yaml')
@@ -1107,7 +1140,9 @@
     @mock.patch('tripleoclient.utils.create_environment_file',
                 autospec=True)
     @mock.patch('tripleoclient.utils.get_config_value', autospec=True)
-    def test_ntp_server_mandatory(self, mock_get_key,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_ntp_server_mandatory(self, mock_copy,
+                                  mock_get_key,
                                   mock_create_env,
                                   mock_get_template_contents,
                                   mock_process_multiple_env,
@@ -1188,7 +1223,9 @@
     @mock.patch('tripleoclient.utils.create_keystone_credential',
                 autospec=True)
     @mock.patch('time.time', autospec=True)
-    def test_tht_deploy_with_ntp(self, mock_time, mock_creds, mock_uuid1,
+    @mock.patch('shutil.copytree', autospec=True)
+    def test_tht_deploy_with_ntp(self, mock_copy, mock_time, mock_creds,
+                                 mock_uuid1,
                                  mock_check_hypervisor_stats,
                                  mock_get_key, mock_create_env,
                                  generate_certs_mock,
diff --git a/tripleoclient/v1/overcloud_deploy.py b/tripleoclient/v1/overcloud_deploy.py
index 3cc7e30..108389f 100644
--- a/tripleoclient/v1/overcloud_deploy.py
+++ b/tripleoclient/v1/overcloud_deploy.py
@@ -21,7 +21,9 @@
 import os
 import os.path
 import re
+import shutil
 import six
+import tempfile
 import time
 import uuid
 import yaml
@@ -394,19 +396,55 @@
 
         plans = plan_management.list_deployment_plans(workflow_client)
 
+        # copy tht_root to temporary directory
+        tht_tmp = '%s/tripleo-heat-templates/' % tempfile.mkdtemp()
+        shutil.copytree(tht_root, tht_tmp)
+        # get tht_root file
+        tpl_root_files = []
+        for (dirpath, dirnames, files) in os.walk(tht_root):
+            for file in files:
+                if dirpath == tht_root:
+                    tpl_root_files.append('%s' % file)
+                else:
+                    tpl_root_files.append('%s/%s' % (dirpath.
+                                                     replace('%s/' %
+                                                             tht_root.
+                                                             rstrip('/'), ''),
+                                                     file))
+        # get and download missing files into tmp directory
+        objectclient = clients.tripleoclient.object_store
+        obj = objectclient.get_object(parsed_args.stack, '')
+        missing = []
+        if isinstance(obj, tuple):
+            missing = [f for f in obj[1].splitlines()
+                       if f not in tpl_root_files]
+            for file in missing:
+                self.log.debug("Missing into templates directory, downloading \
+                                %s from swift into %s." % (file, tht_tmp))
+                file_path = '%s/%s' % (tht_tmp, file)
+                if not os.path.exists(os.path.dirname(file_path)):
+                    os.makedirs(os.path.dirname(file_path))
+                with open('%s/%s' % (tht_tmp, file), 'w') as f:
+                    f.write(objectclient.get_object(parsed_args.stack,
+                                                    file)[1])
+        # we need to make sure that the env files is now using the new tht dir
+        if parsed_args.environment_files:
+            parsed_args.environment_files = [
+                re.sub('(.*)%s' % parsed_args.templates, tht_tmp, env)
+                for env in parsed_args.environment_files]
         # TODO(d0ugal): We need to put a more robust strategy in place here to
         #               handle updating plans.
         if parsed_args.stack in plans:
             # Upload the new plan templates to swift to replace the existing
             # templates.
             plan_management.update_plan_from_templates(
-                clients, parsed_args.stack, tht_root)
+                clients, parsed_args.stack, tht_tmp)
         else:
             plan_management.create_plan_from_templates(
-                clients, parsed_args.stack, tht_root)
+                clients, parsed_args.stack, tht_tmp)
 
         print("Deploying templates in the directory {0}".format(
-            os.path.abspath(tht_root)))
+            os.path.abspath(tht_tmp)))
 
         self.log.debug("Creating Environment file")
         # TODO(jprovazn): env file generated by create_environment_file()
@@ -434,7 +472,7 @@
             created_env_files.extend(parsed_args.environment_files)
 
         self._try_overcloud_deploy_with_compat_yaml(
-            tht_root, stack, parsed_args.stack, parameters, created_env_files,
+            tht_tmp, stack, parsed_args.stack, parameters, created_env_files,
             parsed_args.timeout, env)
 
     def _try_overcloud_deploy_with_compat_yaml(self, tht_root, stack,
@@ -627,15 +665,30 @@
             raise oscexc.CommandError(
                 "You must specify either --templates or --answers-file")
 
+        clients = self.app.client_manager
+        objectclient = clients.tripleoclient.object_store
+
         if parsed_args.environment_files:
             nonexisting_envs = []
             for env_file in parsed_args.environment_files:
                 if not os.path.isfile(env_file):
                     nonexisting_envs.append(env_file)
             if nonexisting_envs:
-                raise oscexc.CommandError(
-                    "Error: The following files were not found: {0}".format(
-                        ", ".join(nonexisting_envs)))
+                try:
+                    for nonexisting in nonexisting_envs:
+                        # if nonexisting env file exist in swift then don't
+                        # raise exception
+                        objectclient.get_object(parsed_args.stack,
+                                                re.sub('(.*)%s/' %
+                                                       parsed_args.templates.
+                                                       rstrip('/'), '',
+                                                       nonexisting))
+                        self.log.debug("Missing %s, but already present in \
+                                       swift. Skipping." % nonexisting)
+                except ClientException:
+                    raise oscexc.CommandError(
+                        "Error: The following files were not found:\
+                         {0}".format(", ".join(nonexisting_envs)))
 
         network_type = parsed_args.neutron_network_type
         tunnel_types = parsed_args.neutron_tunnel_types
