"""
import errno
-import os
+import os, os.path
import time
import vserver
def __init__(self, rec):
logger.verbose ('initing Sliver_VS with name=%s'%rec['name'])
try:
- vserver.VServer.__init__(self, rec['name'])
+ vserver.VServer.__init__(self, rec['name'],logfile='/var/log/nm')
except Exception, err:
if not isinstance(err, vserver.NoSuchVServer):
# Probably a bad vserver or vserver configuration file
logger.log('%s: recreating bad vserver' % rec['name'])
self.destroy(rec['name'])
self.create(rec['name'], rec['vref'])
- vserver.VServer.__init__(self, rec['name'])
+ vserver.VServer.__init__(self, rec['name'],logfile='/var/log/nm')
self.keys = ''
self.rspec = {}
@staticmethod
def create(name, vref = None):
logger.verbose('Sliver_VS:create - name=%s'%name)
- if vref is not None:
- logger.log_call('/usr/sbin/vuseradd', '-t', vref, name)
- else:
- logger.log_call('/usr/sbin/vuseradd', name)
+ if vref is None:
+ vref='default'
+ try:
+ ### locating the right slicefamily
+ # this is a first draft, and more a proof of concept thing
+ # the idea is to parse vref for dash-separated wishes,
+ # and to project these against the defaults
+ # however for cases like when vref is 'planetflow', if we do not understand
+ # any of the wishes we take vref as is
+ # this could be improved by having the vserver-reference init script be a bit smarter
+ # so we could take planetflow as the pldistro part here
+ as_is=None
+ # defaults
+ default=file("/etc/planetlab/defaultvref").read().strip()
+ (pldistro,fcdistro,arch) = default.split("-")
+ # from the slice attribute: cut dashes and try to figure the meaning
+ slice_wishes = vref.split("-")
+ for wish in slice_wishes:
+ if wish == "i386" or wish == "x86_64":
+ arch=wish
+ elif wish == "planetlab" or wish == "onelab" or wish == "vini":
+ pldistro=wish
+ elif wish == "f8" or wish == "centos5" :
+ fcdistro=wish
+ else:
+ # if we find something like e.g. planetflow, use it as-is
+ as_is=vref
+ break
+ if as_is:
+ refname=as_is
+ else:
+ refname="-".join( (pldistro,fcdistro,arch) )
+ # check the templates exists -- there's probably a better way..
+ if not os.path.isdir ("/vservers/.vref/%s"%refname):
+ logger.verbose("%s (%s) : vref %s not found, using default %s"%(
+ name,vref,refname,default))
+ refname=default
+ except IOError:
+ # have not found defaultvref
+ logger.verbose("%s (%s): legacy node - using fallback vrefname 'default'"%(name,vref))
+ # for legacy nodes
+ refname="default"
+ except:
+ import traceback
+ logger.log("%s (%s) : unexpected error follows - using 'default'"%(
+ name,vref))
+ logger.log(traceback.format_exc())
+ refname="default"
+
+ logger.log_call('/usr/sbin/vuseradd', '-t', refname, name)
open('/vservers/%s/etc/slicename' % name, 'w').write(name)
@staticmethod
minimum = self.rspec['%s_min'%type]
soft = self.rspec['%s_soft'%type]
hard = self.rspec['%s_hard'%type]
- self.set_rlimit_config(limit, hard, soft, minimum)
+ update = self.set_rlimit(limit, hard, soft, minimum)
+ if update:
+ logger.log('%s: setting rlimit %s to (%d, %d, %d)'
+ % (self.name, type, hard, soft, minimum))
self.set_capabilities_config(self.rspec['capabilities'])
if self.rspec['capabilities']:
logger.log('%s: setting net share to %d' % (self.name, net_limits[-1]))
self.set_bwlimit(*net_limits)
- cpu_min = self.rspec['cpu_min']
+ cpu_pct = self.rspec['cpu_pct']
cpu_share = self.rspec['cpu_share']
if self.rspec['enabled'] > 0:
- if cpu_min >= 50: # at least 5%: keep people from shooting themselves in the foot
- logger.log('%s: setting cpu share to %d%% guaranteed' % (self.name, cpu_min/10.0))
- self.set_sched_config(cpu_min, vserver.SCHED_CPU_GUARANTEED)
+ if cpu_pct > 0:
+ logger.log('%s: setting cpu reservation to %d%%' % (self.name, cpu_pct))
else:
+ cpu_pct = 0
+
+ if cpu_share > 0:
logger.log('%s: setting cpu share to %d' % (self.name, cpu_share))
- self.set_sched_config(cpu_share, 0)
+ else:
+ cpu_share = 0
+ self.set_sched_config(cpu_pct, cpu_share)
+ # if IP address isn't set (even to 0.0.0.0), sliver won't be able to use network
if self.rspec['ip_addresses'] != '0.0.0.0':
logger.log('%s: setting IP address(es) to %s' % (self.name, self.rspec['ip_addresses']))
- self.set_ipaddresses_config(self.rspec['ip_addresses'])
+ self.set_ipaddresses_config(self.rspec['ip_addresses'])
if False: # Does not work properly yet.
if self.have_limits_changed():