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
# 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)
# 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)
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: