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

Reply via email to