"""
name_worker_lock.acquire()
try:
- if name not in name_worker: name_worker[name] = Worker(name)
+ if name not in name_worker:
+ name_worker[name] = Worker(name)
return name_worker[name]
- finally: name_worker_lock.release()
+ finally:
+ name_worker_lock.release()
class Account:
Write <rec['keys']> to my authorized_keys file.
"""
new_keys = rec['keys']
- logger.verbose('account: configuring {} with {} keys'.format(self.name, len(new_keys)))
+ nb_keys = len(new_keys) if isinstance(new_keys, list) else 1
+ logger.verbose('account: configuring {} with {} keys'.format(self.name, nb_keys))
if new_keys != self.keys:
# get the unix account info
gid = grp.getgrnam("slices")[2]
tools.write_file(auth_keys, lambda f: f.write(new_keys))
# set access permissions and ownership properly
- os.chmod(dot_ssh, 0700)
+ os.chmod(dot_ssh, 0o700)
os.chown(dot_ssh, uid, gid)
- os.chmod(auth_keys, 0600)
+ os.chmod(auth_keys, 0o600)
os.chown(auth_keys, uid, gid)
# set self.keys to new_keys only when all of the above ops succeed
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
# needs to be done before sliver starts (checked with vs and lxc)
@staticmethod
- def mount_ssh_dir (slicename): return Account._manage_ssh_dir (slicename, do_mount=True)
+ def mount_ssh_dir (slicename):
+ return Account._manage_ssh_dir (slicename, do_mount=True)
@staticmethod
- def umount_ssh_dir (slicename): return Account._manage_ssh_dir (slicename, do_mount=False)
+ def umount_ssh_dir (slicename):
+ return Account._manage_ssh_dir (slicename, do_mount=False)
# 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
msg = "OK" if umounted else "WARNING: FAILED"
logger.log("_manage_ssh_dir: umounted {} - {}"
.format(sliver_ssh, msg))
- except:
- logger.log_exc("_manage_ssh_dir failed", name=slicename)
+ except Exception as e:
+ logger.log_exc("_manage_ssh_dir failed : {}".format(e), name=slicename)
class Worker:
# this sliver has the lease, it is safe to start it
if not self.is_running():
self.start(rec)
- else: self.configure(rec)
+ else:
+ self.configure(rec)
else:
# not having the lease, do not start it
self.configure(rec)
# 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:
destroy_sem.acquire()
- try: curr_class.destroy(self.name)
- finally: destroy_sem.release()
+ try:
+ logger.verbose("account._destroy is callling destroy from {}"
+ .format(curr_class.__name__))
+ curr_class.destroy(self.name)
+ finally:
+ destroy_sem.release()
def _get_class(self):
- try: shell = pwd.getpwnam(self.name)[6]
- except KeyError: return None
+ try:
+ shell = pwd.getpwnam(self.name)[6]
+ except KeyError:
+ return None
return shell_acct_class[shell]