From: Xavi Leon Date: Tue, 8 Nov 2011 19:41:54 +0000 (-0500) Subject: Some code refactor X-Git-Tag: lxcbuild~9 X-Git-Url: http://git.onelab.eu/?p=nodemanager.git;a=commitdiff_plain;h=ffd0695eb1c979e4dcee9eae29dd3578801971f3 Some code refactor --- diff --git a/sliver_libvirt.py b/sliver_libvirt.py index de7fedc..ba60677 100644 --- a/sliver_libvirt.py +++ b/sliver_libvirt.py @@ -9,6 +9,8 @@ import os import libvirt import sys +from string import Template + states = { libvirt.VIR_DOMAIN_NOSTATE: 'no state', libvirt.VIR_DOMAIN_RUNNING: 'running', @@ -19,38 +21,24 @@ states = { libvirt.VIR_DOMAIN_CRASHED: 'crashed', } +def randomMAC(): + mac = [ random.randint(0x00, 0xff), + random.randint(0x00, 0xff), + random.randint(0x00, 0xff), + random.randint(0x00, 0xff), + random.randint(0x00, 0xff), + random.randint(0x00, 0xff) ] + return ':'.join(map(lambda x: "%02x" % x, mac)) + class Sliver_LV(accounts.Account): """This class wraps LibVirt commands""" SHELL = '/bin/sh' - # Using /bin/bash triggers destroy root/site_admin (?!?) - TYPE = 'sliver.LIBVIRT' + # Need to add a tag at myplc to actually use this account # type = 'sliver.LIBVIRT' - - def __init__(self, rec): - self.name = rec['name'] - print "LIBVIRT %s __init__"%(self.name) - logger.verbose ('sliver_libvirt: %s init'%(self.name)) - - self.dir = '/vservers/%s'%(self.name) - - # Assume the directory with the image and config files - # are in place - - self.config = '%s/config.xml'%(self.dir) - self.lxc_log = '%s/log'%(self.dir) - self.keys = '' - self.rspec = {} - self.slice_id = rec['slice_id'] - self.disk_usage_initialized = False - self.initscript = '' - self.enabled = True - conn = Sliver_LV.getConnection() - try: - self.container = conn.lookupByName(self.name) - except: - print "Unexpected error:", sys.exc_info()[0] + TYPE = 'sliver.LIBVIRT' + @staticmethod def create(name, rec = None): @@ -58,13 +46,23 @@ class Sliver_LV(accounts.Account): print "LIBVIRT %s create"%(name) logger.verbose ('sliver_libvirt: %s create'%(name)) dir = '/vservers/%s'%(name) - config = '%s/config.xml'%(dir) - lxc_log = '%s/log'%(dir) + # Template for sliver configuration + template = Template(open('/vservers/config_template.xml').read()) + config = template.substitute(name=name) + + lxc_log = '%s/log'%(dir) + + # TODO: copy the sliver FS to the correct path if sliver does not + # exist. Update MAC addresses and insert an entry on the libvirt DHCP + # server to get an actual known IP. Some sort of pool? if not (os.path.isdir(dir) and os.access(dir, os.R_OK | os.W_OK | os.X_OK)): logger.verbose('lxc_create: directory %s does not exist or wrong perms'%(dir)) return + + # TODO: set hostname + file('/vservers/%s/rootfs/etc/hostname' % name, 'w').write(name) # Get a connection and lookup for the sliver before actually # defining it, just in case it was already defined. @@ -72,8 +70,7 @@ class Sliver_LV(accounts.Account): try: dom = conn.lookupByName(name) except: - xml = open(config).read() - dom = conn.defineXML(xml) + dom = conn.defineXML(config) print Sliver_LV.info(dom) @staticmethod @@ -97,6 +94,27 @@ class Sliver_LV(accounts.Account): logger.verbose('sliver_libvirt: %s domain does not exists'%(name)) print "Unexpected error:", sys.exc_info()[0] + def __init__(self, rec): + self.name = rec['name'] + print "LIBVIRT %s __init__"%(self.name) + logger.verbose ('sliver_libvirt: %s init'%(self.name)) + + self.dir = '/vservers/%s'%(self.name) + + # Assume the directory with the image and config files + # are in place + + self.keys = '' + self.rspec = {} + self.slice_id = rec['slice_id'] + self.disk_usage_initialized = False + self.initscript = '' + self.enabled = True + conn = Sliver_LV.getConnection() + try: + self.container = conn.lookupByName(self.name) + except: + print "Unexpected error:", sys.exc_info()[0] def configure(self, rec): ''' Allocate resources and fancy configuration stuff ''' @@ -106,11 +124,6 @@ class Sliver_LV(accounts.Account): def start(self, delay=0): ''' Just start the sliver ''' print "LIBVIRT %s start"%(self.name) - if self.rspec['enabled'] <= 0: - logger.log('sliver_libvirt: not starting %s, is not enabled'%(self.name)) - return - else: - logger.log('sliver_libvirt: %s starting...' % (self.name)) # Check if it's running to avoid throwing an exception if the # domain was already running, create actually means start diff --git a/sliver_lxc.py b/sliver_lxc.py index 81af037..aef00ad 100644 --- a/sliver_lxc.py +++ b/sliver_lxc.py @@ -6,10 +6,64 @@ import accounts import logger import subprocess import os +import libvirt +import sys + +def test_template(): + + xml_template = """ + + test_1 + 32768 + + exe + /bin/sh + + 1 + + destroy + restart + destroy + + /usr/libexec/libvirt_lxc + + + + + + + + + + """ + + return xml_template + +def createConnection(): + conn = libvirt.open('lxc:///') + if conn == None: + print 'Failed to open connection to LXC hypervisor' + sys.exit(1) + else: return conn + + +states = { + libvirt.VIR_DOMAIN_NOSTATE: 'no state', + libvirt.VIR_DOMAIN_RUNNING: 'running', + libvirt.VIR_DOMAIN_BLOCKED: 'blocked on resource', + libvirt.VIR_DOMAIN_PAUSED: 'paused by user', + libvirt.VIR_DOMAIN_SHUTDOWN: 'being shut down', + libvirt.VIR_DOMAIN_SHUTOFF: 'shut off', + libvirt.VIR_DOMAIN_CRASHED: 'crashed', +} + +def info(dom): + [state, maxmem, mem, ncpu, cputime] = dom.info() + return '%s is %s,\nmaxmem = %s, mem = %s, ncpu = %s, cputime = %s' % (dom.name(), states.get(state, state), maxmem, mem, ncpu, cputime) class Sliver_LXC(accounts.Account): """This class wraps LXC commands""" - + SHELL = '/bin/sh' # Using /bin/bash triggers destroy root/site_admin (?!?) TYPE = 'sliver.LXC' @@ -20,7 +74,7 @@ class Sliver_LXC(accounts.Account): self.name = rec['name'] print "LXC __init__ %s"%(self.name) logger.verbose ('sliver_lxc: %s init'%self.name) - + self.dir = '/vservers/%s'%(self.name) # Assume the directory with the image and config files @@ -35,7 +89,7 @@ class Sliver_LXC(accounts.Account): self.disk_usage_initialized = False self.initscript = '' self.enabled = True - self.configure(rec) + self.connection = createConnection() @staticmethod def create(name, rec = None): @@ -56,8 +110,14 @@ class Sliver_LXC(accounts.Account): command += ['/bin/bash','-x',] command += ['/usr/bin/lxc-create', '-n', name, '-f', config, '&'] print command - subprocess.call(command, stdin=open('/dev/null', 'r'), stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT, shell=False) - + #subprocess.call(command, stdin=open('/dev/null', 'r'), stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT, shell=False) + conn = createConnection() + try: + dom0 = conn.lookupByName(name) + except: + dom0 = conn.defineXML(test_template()) + print info(dom0) + @staticmethod def destroy(name): ''' lxc_destroy ''' @@ -96,4 +156,4 @@ class Sliver_LXC(accounts.Account): if state == 'RUNNING': return True else: return False - + diff --git a/sliver_vs.py b/sliver_vs.py index 8382c6d..2febb37 100644 --- a/sliver_vs.py +++ b/sliver_vs.py @@ -67,7 +67,6 @@ class Sliver_VS(accounts.Account, vserver.VServer): self.create(name, rec) logger.log("sliver_vs: %s: second chance..."%name) vserver.VServer.__init__(self, name,logfile='/var/log/nodemanager') - self.keys = '' self.rspec = {} self.slice_id = rec['slice_id'] @@ -187,7 +186,7 @@ class Sliver_VS(accounts.Account, vserver.VServer): if code: logger.log("vsliver_vs: %s: Installed new initscript in %s"%(self.name,sliver_initscript)) if self.is_running(): - # Only need to rerun the initscript if the vserver is + # Only need to rerun the initscript if the vserver is # already running. If the vserver isn't running, then the # initscript will automatically be started by # /etc/rc.d/vinit when the vserver is started.