X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sliver_lxc.py;h=5892eed9fe6c5d9245ca550aa6fc38e1c0bb8a54;hb=ccc7b9c4b76a89faad66867b00d16ac45333b6de;hp=44194ed7d7cba61acd18326738e68026667f2715;hpb=9fbee5e89fe13eb431318b07e4438d4d5e368cfc;p=nodemanager.git diff --git a/sliver_lxc.py b/sliver_lxc.py index 44194ed..5892eed 100644 --- a/sliver_lxc.py +++ b/sliver_lxc.py @@ -25,7 +25,7 @@ from initscript import Initscript from account import Account from sliver_libvirt import Sliver_Libvirt -BTRFS_TIMEOUT=15*60 +BTRFS_TIMEOUT = 15*60 class Sliver_LXC(Sliver_Libvirt, Initscript): """This class wraps LXC commands""" @@ -38,20 +38,25 @@ class Sliver_LXC(Sliver_Libvirt, Initscript): REF_IMG_BASE_DIR = '/vservers/.lvref' CON_BASE_DIR = '/vservers' - def __init__ (self, rec): + def __init__(self, rec): name=rec['name'] - Sliver_Libvirt.__init__ (self,rec) - Initscript.__init__ (self,name) + Sliver_Libvirt.__init__(self,rec) + Initscript.__init__(self,name) - def configure (self, rec): - Sliver_Libvirt.configure (self,rec) + def configure(self, rec): + logger.log('========== sliver_lxc.configure {}'.format(self.name)) + Sliver_Libvirt.configure(self, rec) # in case we update nodemanager.. self.install_and_enable_vinit() # do the configure part from Initscript - Initscript.configure(self,rec) + Initscript.configure(self, rec) + # remember configure() always gets called *before* start() + # in particular the slice initscript + # is expected to be in place already at this point def start(self, delay=0): + logger.log('==================== sliver_lxc.start {}'.format(self.name)) if 'enabled' in self.rspec and self.rspec['enabled'] <= 0: logger.log('sliver_lxc: not starting %s, is not enabled'%self.name) return @@ -60,22 +65,29 @@ class Sliver_LXC(Sliver_Libvirt, Initscript): # expose .ssh for omf_friendly slivers if 'tags' in self.rspec and 'omf_control' in self.rspec['tags']: Account.mount_ssh_dir(self.name) - Sliver_Libvirt.start (self, delay) + Sliver_Libvirt.start(self, delay) # if a change has occured in the slice initscript, reflect this in /etc/init.d/vinit.slice self.refresh_slice_vinit() - def rerun_slice_vinit (self): - """This is called whenever the initscript code changes""" - # xxx - todo - not sure exactly how to: - # (.) invoke something in the guest - # (.) which options of systemctl should be used to trigger a restart - # should not prevent the first run from going fine hopefully - logger.log("WARNING: sliver_lxc.rerun_slice_vinit not implemented yet") - + def rerun_slice_vinit(self): + """This is called at startup, and whenever the initscript code changes""" + logger.log("sliver_lxc.rerun_slice_vinit {}".format(self.name)) + plain = "virsh -c lxc:/// lxc-enter-namespace --noseclabel -- {} /usr/bin/systemctl --system daemon-reload"\ + .format(self.name) + command = plain.split() + logger.log_call(command, timeout=3) + plain = "virsh -c lxc:/// lxc-enter-namespace --noseclabel -- {} /usr/bin/systemctl restart vinit.service"\ + .format(self.name) + command = plain.split() + logger.log_call(command, timeout=3) + + @staticmethod def create(name, rec=None): - ''' Create dirs, copy fs image, lxc_create ''' - logger.verbose ('sliver_lxc: %s create'%(name)) + ''' + Create dirs, copy fs image, lxc_create + ''' + logger.verbose('sliver_lxc: %s create' % name) conn = Sliver_Libvirt.getConnection(Sliver_LXC.TYPE) vref = rec['vref'] @@ -86,10 +98,10 @@ class Sliver_LXC(Sliver_Libvirt, Initscript): # compute guest arch from vref # essentially we want x86_64 (default) or i686 here for libvirt try: - (x,y,arch)=vref.split('-') + (x, y, arch) = vref.split('-') arch = "x86_64" if arch.find("64")>=0 else "i686" except: - arch='x86_64' + arch = 'x86_64' # Get the type of image from vref myplc tags specified as: # pldistro = lxc @@ -132,8 +144,8 @@ class Sliver_LXC(Sliver_Libvirt, Initscript): # logger.log('sliver_lxc: %s: ERROR Could not create sliver - could not clean up empty %s'%(name,containerDir)) # return - # Snapshot the reference image fs (assume the reference image is in its own - # subvolume) + # Snapshot the reference image fs + # this assumes the reference image is in its own subvolume command = ['btrfs', 'subvolume', 'snapshot', refImgDir, containerDir] if not logger.log_call(command, timeout=BTRFS_TIMEOUT): logger.log('sliver_lxc: ERROR Could not create BTRFS snapshot at', containerDir) @@ -339,6 +351,19 @@ unset pathmunge command = ['/usr/sbin/userdel', '-f', '-r', name] logger.log_call(command) + # Remove rootfs of destroyed domain + command = ['/usr/bin/rm', '-rf', containerDir] + logger.log_call(command, timeout=BTRFS_TIMEOUT) + + # ??? + logger.log("-TMP-ls-l %s"%name) + command = ['ls', '-lR', containerDir] + logger.log_call(command) + logger.log("-TMP-vsys-status") + command = ['/usr/bin/systemctl', 'status', 'vsys'] + logger.log_call(command) + # ??? + # Remove rootfs of destroyed domain command = ['btrfs', 'subvolume', 'delete', containerDir] logger.log_call(command, timeout=BTRFS_TIMEOUT) @@ -365,9 +390,13 @@ unset pathmunge #command=['lsof'] #logger.log_call(command) logger.log("-TMP-ls-l %s"%name) - command = ['ls', '-l', containerDir] + command = ['ls', '-lR', containerDir] + logger.log_call(command) + logger.log("-TMP-lsof") + command = ['lsof'] logger.log_call(command) if os.path.exists(containerDir): logger.log('sliver_lxc.destroy: ERROR could not cleanly destroy %s - giving up'%name) - if vsys_stopped: vsysStartService() + if vsys_stopped: + vsysStartService()