From f2daae238f488de9e4f5acd5d946d17811fcca30 Mon Sep 17 00:00:00 2001 From: xavileon Date: Mon, 24 Oct 2011 16:13:19 -0400 Subject: [PATCH] lxc skeleton. create, is_runnng works. Need clean up. --- sliver_lxc.py | 88 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 15 deletions(-) diff --git a/sliver_lxc.py b/sliver_lxc.py index 91f1b06..4b7c956 100644 --- a/sliver_lxc.py +++ b/sliver_lxc.py @@ -4,41 +4,99 @@ import accounts import logger +import subprocess +import os class Sliver_LXC(accounts.Account): """This class wraps LXC commands""" - SHELL = '/bin/bash' + SHELL = '/bin/sh' + # Using /bin/bash triggers destroy root/site_admin destr TYPE = 'sliver.LXC' # Need to add a tag at myplc to actually use this account # type = 'sliver.LXC' def __init__(self, rec): - print "TODO WIP __init__" - name=rec['name'] - logger.verbose ('sliver_lxc: %s init'%name) + self.name = rec['name'] + print "LXC __init__ %s"%(self.name) + logger.verbose ('sliver_lxc: %s init'%self.name) + self.dir = '/vservers/lxc_%s'%(self.name) + if not (os.path.isdir(self.dir) and + os.access(self.dir, os.R_OK | os.W_OK | os.X_OK)): + raise NoSuchVServer, "no such vserver: " + self.name + self.config = '/%s/config'%(self.dir) + self.fstab = '/%s/fstab'%(self.dir) + self.lxc_log = '/%s/lxc.log'%(self.dir) + self.keys = '' + self.rspec = {} + self.slice_id = rec['slice_id'] + self.disk_usage_initialized = False + self.initscript = '' + self.enabled = True + self.configure(rec) + @staticmethod def create(name, rec = None): - print "TODO create" + ''' Create dirs, copy fs image, lxc_create ''' + print "LXC create %s"%(name) + logger.verbose ('sliver_lxc: %s create'%name) + dir = '/vservers/%s'%(name) + config = '%s/config'%(dir) + lxc_log = '%s/lxc.log'%(dir) + + if not (os.path.isdir(dir) and + os.access(dir, os.R_OK | os.W_OK | os.X_OK)): + print 'lxc_create: directory %s does not exist or wrong perms'%(dir) + return + # Assume for now that the directory is there and with a FS + command=[] + # be verbose + command += ['/bin/bash','-x',] + command += ['/usr/bin/lxc-create', '-n', name, '-f', config, '&'] + print command + print subprocess.call(command, stdin=open('/dev/null', 'r'), stdout=open(lxc_log, 'a+'), stderr=subprocess.STDOUT, shell=False) @staticmethod def destroy(name): - print "TODO destroy" + ''' lxc_destroy ''' + print "LXC destroy %s"%(name) + dir = '/vservers/lxc_%s'%(name) + lxc_log = '%s/lxc.log'%(dir) + command=[] + # be verbose + command += ['/bin/bash','-x',] + command += ['/usr/bin/lxc-destroy', '-n', name] + + subprocess.call(command, stdin=open('/dev/null', 'r'), stdout=open(lxc_log, 'a+'), stderr=subprocess.STDOUT, shell=False) + print "LXC destroy DONE" def configure(self, rec): - ''' Called by accounts.ensure_created -> start -> _acct.configure ''' - print "TODO configure" - name=rec['name'] + print "LXC configure %s"%(self.name) def start(self, delay=0): - print "TODO start" - + ''' Check existence? lxc_start ''' + print "LXC start %s"%(self.name) + command=[] + # be verbose + command += ['/bin/bash','-x',] + command += ['/usr/bin/lxc-start', '-n', self.name, '-d'] + print command + subprocess.call(command, stdin=open('/dev/null', 'r'), stdout=open(self.lxc_log, 'w+'), stderr=subprocess.STDOUT, shell=False) + def stop(self): - print "TODO stop" + ''' lxc_stop ''' + print "LXC stop %s"%(self.name) def is_running(self): - print "TODO is_running" - return True + print "LXC is_running %s"%(self.name) + command = [] + command += ['/usr/bin/lxc-info -n %s'%(self.name)] + print command + p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + state = p.communicate()[0].split(' ')[2] + print state + if state == 'RUNNING': return True + else: return False - + -- 2.43.0