Archive overcloud deploy artifacts

This also refactors archiving method to utils.

Change-Id: I1e8fc089de503cf96ea3812972e574add43ff631
This commit is contained in:
ramishra 2021-01-27 08:58:49 +05:30
parent 0c669f61ec
commit 2bd39e61dc
4 changed files with 53 additions and 49 deletions

View File

@ -891,8 +891,8 @@ class TestDeployUndercloud(TestPluginV1):
@mock.patch('six.moves.builtins.open') @mock.patch('six.moves.builtins.open')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_populate_templates_dir') '_populate_templates_dir')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.utils.archive_deploy_artifacts',
'_create_install_artifact', return_value='/tmp/foo.tar.bzip2') return_value='/tmp/foo.tar.bzip2')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_cleanup_working_dirs') '_cleanup_working_dirs')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
@ -989,8 +989,8 @@ class TestDeployUndercloud(TestPluginV1):
@mock.patch('six.moves.builtins.open') @mock.patch('six.moves.builtins.open')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_populate_templates_dir') '_populate_templates_dir')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.utils.archive_deploy_artifacts',
'_create_install_artifact', return_value='/tmp/foo.tar.bzip2') return_value='/tmp/foo.tar.bzip2')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_cleanup_working_dirs') '_cleanup_working_dirs')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
@ -1077,8 +1077,8 @@ class TestDeployUndercloud(TestPluginV1):
@mock.patch('six.moves.builtins.open') @mock.patch('six.moves.builtins.open')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_populate_templates_dir') '_populate_templates_dir')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.utils.archive_deploy_artifacts',
'_create_install_artifact', return_value='/tmp/foo.tar.bzip2') return_value='/tmp/foo.tar.bzip2')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_cleanup_working_dirs') '_cleanup_working_dirs')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
@ -1236,8 +1236,8 @@ class TestDeployUndercloud(TestPluginV1):
@mock.patch('six.moves.builtins.open') @mock.patch('six.moves.builtins.open')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_populate_templates_dir') '_populate_templates_dir')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.utils.archive_deploy_artifacts',
'_create_install_artifact', return_value='/tmp/foo.tar.bzip2') return_value='/tmp/foo.tar.bzip2')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_cleanup_working_dirs') '_cleanup_working_dirs')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
@ -1298,8 +1298,8 @@ class TestDeployUndercloud(TestPluginV1):
@mock.patch('six.moves.builtins.open') @mock.patch('six.moves.builtins.open')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_populate_templates_dir') '_populate_templates_dir')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.utils.archive_deploy_artifacts',
'_create_install_artifact', return_value='/tmp/foo.tar.bzip2') return_value='/tmp/foo.tar.bzip2')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'
'_cleanup_working_dirs') '_cleanup_working_dirs')
@mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.' @mock.patch('tripleoclient.v1.tripleo_deploy.Deploy.'

View File

@ -40,6 +40,7 @@ import six
import socket import socket
import subprocess import subprocess
import sys import sys
import tarfile
import tempfile import tempfile
import time import time
import yaml import yaml
@ -1651,6 +1652,39 @@ def build_stack_data(clients, stack_name, template,
return stack_data return stack_data
def archive_deploy_artifacts(log, stack_name, tht_dir,
ansible_dir=None, output_dir=None):
"""Create a tarball of the temporary folders used"""
log.debug(_("Preserving deployment artifacts"))
if not output_dir:
output_dir = tht_dir
def get_tar_filename():
return '%s/%s-install-%s.tar.bzip2' % \
(constants.CLOUD_HOME_DIR, stack_name,
datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S'))
def remove_leading_path(info):
"""Tar filter to remove output dir from path"""
leading_path = output_dir[1:] + '/'
info.name = info.name.replace(leading_path, '')
return info
tar_filename = get_tar_filename()
try:
tf = tarfile.open(tar_filename, 'w:bz2')
tf.add(tht_dir, recursive=True, filter=remove_leading_path)
if ansible_dir:
tf.add(ansible_dir, recursive=True,
filter=remove_leading_path)
tf.close()
except Exception as ex:
msg = _("Unable to create artifact tarball, %s") % str(ex)
log.warning(msg)
return tar_filename
def jinja_render_files(log, templates, working_dir, def jinja_render_files(log, templates, working_dir,
roles_file=None, networks_file=None, roles_file=None, networks_file=None,
base_path=None, output_dir=None): base_path=None, output_dir=None):

View File

@ -301,6 +301,8 @@ class DeployOvercloud(command.Command):
self._deploy_tripleo_heat_templates(stack, parsed_args, self._deploy_tripleo_heat_templates(stack, parsed_args,
new_tht_root, tht_root) new_tht_root, tht_root)
finally: finally:
utils.archive_deploy_artifacts(self.log, parsed_args.stack,
new_tht_root)
if parsed_args.no_cleanup: if parsed_args.no_cleanup:
self.log.warning("Not cleaning temporary directory %s" self.log.warning("Not cleaning temporary directory %s"
% tht_tmp) % tht_tmp)

View File

@ -24,14 +24,12 @@ import shutil
import six import six
import subprocess import subprocess
import sys import sys
import tarfile
import tempfile import tempfile
import time import time
import traceback import traceback
import yaml import yaml
from cliff import command from cliff import command
from datetime import datetime
from heatclient.common import template_utils from heatclient.common import template_utils
from osc_lib.i18n import _ from osc_lib.i18n import _
from six.moves import configparser from six.moves import configparser
@ -218,41 +216,6 @@ class Deploy(command.Command):
'first defined role') 'first defined role')
return roles_data[0]['name'] return roles_data[0]['name']
def _get_tar_filename(self, stack_name='undercloud'):
"""Return tarball name for the install artifacts"""
return '%s/%s-install-%s.tar.bzip2' % \
(self.output_dir, stack_name,
datetime.utcnow().strftime('%Y%m%d%H%M%S'))
def _create_install_artifact(self, user, stack_name='undercloud'):
"""Create a tarball of the temporary folders used"""
self.log.debug(_("Preserving deployment artifacts"))
def remove_output_dir(info):
"""Tar filter to remove output dir from path"""
# leading path to tar is home/stack/ rather than /home/stack
leading_path = self.output_dir[1:] + '/'
info.name = info.name.replace(leading_path, '')
return info
# tar up working data and put in
# output_dir/undercloud-install-TS.tar.bzip2
# if the stack name is "undercloud".
tar_filename = self._get_tar_filename(stack_name)
try:
tf = tarfile.open(tar_filename, 'w:bz2')
tf.add(self.tht_render, recursive=True, filter=remove_output_dir)
tf.add(self.tmp_ansible_dir, recursive=True,
filter=remove_output_dir)
tf.close()
except Exception as ex:
msg = _("Unable to create artifact tarball, %s") % ex.message
self.log.error(msg)
raise exceptions.DeploymentError(msg)
# TODO(cjeanner) drop that once using oslo.privsep
self._set_data_rights(tar_filename, user=user)
return tar_filename
def _create_persistent_dirs(self): def _create_persistent_dirs(self):
"""Creates temporary working directories""" """Creates temporary working directories"""
utils.makedirs(constants.STANDALONE_EPHEMERAL_STACK_VSTATE) utils.makedirs(constants.STANDALONE_EPHEMERAL_STACK_VSTATE)
@ -1389,8 +1352,13 @@ class Deploy(command.Command):
if not parsed_args.keep_running: if not parsed_args.keep_running:
self._kill_heat(parsed_args) self._kill_heat(parsed_args)
tar_filename = \ tar_filename = \
self._create_install_artifact(parsed_args.deployment_user, utils.archive_deploy_artifacts(
parsed_args.stack.lower()) self.log,
parsed_args.stack.lower(),
self.tht_render,
self.tmp_ansible_dir,
self.output_dir)
if self.ansible_dir: if self.ansible_dir:
self._dump_ansible_errors( self._dump_ansible_errors(
os.path.join(self.ansible_dir, os.path.join(self.ansible_dir,