X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=account.py;h=52ebb97fe3ab1b6b5faed588a4c98f13e415783f;hb=02a7d8bdb42d55b11881a141989c32bfc73f983b;hp=3631d4d4d0bbb5b05d7d611849dde7497f2d3af5;hpb=9e596e6eb3c871ab25837903b0ed30f165d9d688;p=nodemanager.git diff --git a/account.py b/account.py index 3631d4d..52ebb97 100644 --- a/account.py +++ b/account.py @@ -138,6 +138,16 @@ class Account: pass def is_running(self): pass + def needs_reimage(self, target_slicefamily): + stampname = "/vservers/{}/etc/slicefamily".format(self.name) + try: + with open(stampname) as f: + current_slicefamily = f.read().strip() + return current_slicefamily != target_slicefamily + except IOError as e: + logger.verbose("Account.needs_reimage: missing slicefamily {} - left as-is" + .format(self.name)) + return False ### this used to be a plain method but because it needs to be invoked by destroy # which is a static method, they need to become static as well @@ -150,14 +160,15 @@ class Account: # bind mount / umount root side dir to sliver side @staticmethod def _manage_ssh_dir (slicename, do_mount): - logger.log ("_manage_ssh_dir, requested to "+("mount" if do_mount else "umount")+" ssh dir for "+ slicename) + logger.log("_manage_ssh_dir, requested to "+("mount" if do_mount else "umount")+" ssh dir for "+ slicename) try: root_ssh = "/home/{}/.ssh".format(slicename) sliver_ssh = "/vservers/{}/home/{}/.ssh".format(slicename, slicename) def is_mounted (root_ssh): - for mount_line in file('/proc/mounts').readlines(): - if mount_line.find (root_ssh) >= 0: - return True + with open('/proc/mounts') as mountsfile: + for mount_line in mountsfile.readlines(): + if mount_line.find (root_ssh) >= 0: + return True return False if do_mount: # any of both might not exist yet @@ -222,7 +233,7 @@ class Worker: # xxx it's not clear what to do when a sliver changes type/class # in a reservable node else: - if not self.is_running() or next_class != curr_class: + if not self.is_running() or self.needs_reimage(rec['vref']) or next_class != curr_class: self.start(rec) else: self.configure(rec) @@ -242,13 +253,24 @@ class Worker: self._acct.stop() def is_running(self): - if (self._acct != None) and self._acct.is_running(): - status = True + if self._acct and self._acct.is_running(): + return True else: - status = False - logger.verbose("account: Worker({}): is not running".format(self.name)) - return status + logger.verbose("Worker.is_running ({}) - no account or not running".format(self.name)) + return False + def needs_reimage(self, target_slicefamily): + if not self._acct: + logger.verbose("Worker.needs_reimage ({}) - no account -> True".format(self.name)) + return True + else: + account_needs_reimage = self._acct.needs_reimage(target_slicefamily) + if account_needs_reimage: + logger.log("Worker.needs_reimage ({}) - account needs reimage (tmp: DRY RUN)".format(self.name)) + else: + logger.verbose("Worker.needs_reimage ({}) - everything fine".format(self.name)) + return account_needs_reimage + def _destroy(self, curr_class): self._acct = None if curr_class: