Thcipriani has uploaded a new change for review. https://gerrit.wikimedia.org/r/243009
Change subject: Make deployment rev represent config state ...................................................................... Make deployment rev represent config state Deployments of the same codebase with different configs will now checkout to different rev directories. This makes config deployment rollback without code deployment possible. Change-Id: I62ffdaf2b98527ff69480556bef2a03578a80f5c --- M scap/main.py 1 file changed, 32 insertions(+), 4 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/tools/scap refs/changes/09/243009/1 diff --git a/scap/main.py b/scap/main.py index 8eb2c26..7d8e6d0 100644 --- a/scap/main.py +++ b/scap/main.py @@ -7,6 +7,7 @@ """ import argparse import errno +import hashlib import multiprocessing import netifaces import os @@ -610,8 +611,16 @@ self.cache_dir = deploy_dir('cache') self.revs_dir = deploy_dir('revs') self.tmp_dir = deploy_dir('tmp') + self.cfg_digest = os.path.join(self.tmp_dir, '.config-digest') - self.rev_dir = os.path.join(self.revs_dir, self.rev) + rev_dir = self.rev + try: + with open(self.cfg_digest, 'r') as f: + rev_dir = '{}-{}'.format(f.read(), self.rev) + except IOError: + pass + + self.rev_dir = os.path.join(self.revs_dir, rev_dir) self.cur_link = deploy_dir('current') self.progress_flag = deploy_dir('.in-progress') @@ -654,6 +663,7 @@ source_basepath = os.path.join(self.tmp_dir, self.rev, 'config-files') logger.debug('Source basepath: {}'.format(source_basepath)) utils.mkdir_p(source_basepath) + config_file_tree = {} for config_file in config_files['files']: name = config_file['name'] @@ -675,7 +685,17 @@ logger.debug('Rendering config_file: {}'.format(source)) with open(source, 'w') as f: - f.write(tmpl.render()) + output_file = tmpl.render() + s = hashlib.sha1() + s.update('blob {}\0'.format(len(output_file))) + s.update(output_file) + config_file_tree[source] = s.hexdigest() + f.write(output_file) + + with open(self.cfg_digest, 'w') as f: + s = hashlib.sha1() + s.update(repr(config_file_tree)) + f.write(s.hexdigest()) def fetch(self): """Fetch the specified revision of the remote repo. @@ -744,7 +764,7 @@ # move .done flag and remove the .in-progress flag self._link_rev_dir(self.done_flag) - self._remove_progress_link() + self._cleanup() def rollback(self): """Performs a rollback to the last deployed revision. @@ -784,7 +804,7 @@ # Config re-evaluation no longer necessary or desirable at this point self.config['config_deploy'] = False self.promote() - self._remove_progress_link() + self._cleanup() def _link_final_to_current(self): """Link the current checkout to final location at [repo] @@ -828,9 +848,17 @@ def _link_rev_dir(self, symlink_path): tasks.move_symlink(self.rev_dir, symlink_path, user=self.user) + def _cleanup(self): + self._remove_progress_link() + self._remove_config_digest() + def _remove_progress_link(self): tasks.remove_symlink(self.progress_flag, user=self.user) + def _remove_config_digest(self): + if os.path.exists(self.cfg_digest): + os.unlink(self.cfg_digest) + class Deploy(cli.Application): """Sync new service code across cluster -- To view, visit https://gerrit.wikimedia.org/r/243009 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I62ffdaf2b98527ff69480556bef2a03578a80f5c Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/tools/scap Gerrit-Branch: master Gerrit-Owner: Thcipriani <tcipri...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits