from vserverimpl import DLIMIT_INF
from vserverimpl import VC_LIM_KEEP
+from vserverimpl import VC_LIM_INFINITY
from vserverimpl import VLIMIT_NSOCK
from vserverimpl import VLIMIT_OPENFD
from vserverimpl import VLIMIT_ANON
class VServer:
- INITSCRIPTS = [('/etc/rc.vinit', 'start'),
- ('/etc/rc.d/rc', '%(runlevel)d')]
-
def __init__(self, name, vm_id = None, vm_running = None, logfile=None):
self.name = name
self.logfile = logfile
# inspired from nodemanager's logger
+ def log_in_file (self, fd, msg):
+ if not msg: msg="\n"
+ if not msg.endswith('\n'): msg += '\n'
+ os.write(fd, '%s: %s' % (time.asctime(time.gmtime()), msg))
+
def log(self,msg):
if self.logfile:
try:
fd = os.open(self.logfile,os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0600)
- if not msg.endswith('\n'): msg += '\n'
- os.write(fd, '%s: %s' % (time.asctime(time.gmtime()), msg))
+ self.log_in_file(fd,msg)
os.close(fd)
except:
print '%s: (%s failed to open) %s'%(time.asctime(time.gmtime()),self.logfile,msg)
def set_ipaddresses(self, addresses):
vserverimpl.netremove(self.ctx, "all")
- for a in addresses.split(","):
- vserverimpl.netadd(self.ctx, a)
+ for ip in addresses:
+ vserverimpl.netadd(self.ctx, ip)
def set_ipaddresses_config(self, addresses):
- return # acb
+ ip_addresses = addresses.split(",")
+
+ # add looopback interface
+ if not ip_addresses.__contains__("127.0.0.1"):
+ ip_addresses.append("127.0.0.1")
+
i = 0
- for a in addresses.split(","):
- self.config.update("interfaces/%d/ip" % i, a)
+ for ip in ip_addresses:
+ self.config.update("interfaces/%d/ip" % i, ip)
i += 1
while self.config.unset("interfaces/%d/ip" % i):
i += 1
- self.set_ipaddresses(addresses)
+ self.set_ipaddresses(ip_addresses)
def get_ipaddresses_config(self):
i = 0
os.chroot(self.dir)
os.chdir("/")
- def chroot_call(self, fn, *args):
+ def chroot_call(self, fn, *args, **kwargs):
cwd_fd = os.open(".", os.O_RDONLY)
try:
root_fd = os.open("/", os.O_RDONLY)
try:
self.__do_chroot()
- result = fn(*args)
+ result = fn(*args, **kwargs)
finally:
os.fchdir(root_fd)
os.chroot(".")
def set_sched_config(self, cpu_min, cpu_share):
""" Write current CPU scheduler parameters to the vserver
configuration file. Currently, 'cpu_min' is not supported. """
- self.config.update('cgroup/cpu.shares', cpu_share * CPU_SHARE_MULT)
+ self.config.update('cgroup/cpu.shares', int(cpu_share) * CPU_SHARE_MULT)
if self.is_running():
self.set_sched(cpu_min, cpu_share)
""" Update kernel CPU scheduling parameters for this context.
Currently, 'cpu_min' is not supported. """
try:
- cgroup = open('/dev/cgroup/%s/cpu.shares' % name, 'w')
- cgroup.write('%s' % (cpu_share * CPU_SHARE_MULT))
+ cgroup = open('/dev/cgroup/%s/cpu.shares' % self.name, 'w')
+ cgroup.write('%s' % (int(cpu_share) * CPU_SHARE_MULT))
cgroup.close()
except:
pass
def enter(self):
subprocess.call("/usr/sbin/vserver %s enter" % self.name, shell=True)
+ # 2010 June 21 - Thierry
+ # the slice initscript now gets invoked through rc - see sliver_vs.py in nodemanager
+ # and, rc is triggered as part of vserver .. start
+ # so we don't have to worry about initscripts at all anymore here
def start(self, runlevel = 3):
- if (os.fork() != 0):
+ if os.fork() != 0:
# Parent should just return.
self.vm_running = True
return
else:
- # child process
+ os.setsid()
+ # first child process: fork again
+ if os.fork() != 0:
+ os._exit(0) # Exit parent (the first child) of the second child.
+ # the grandson is the working one
+ os.chdir('/')
+ os.umask(0022)
try:
- subprocess.call("/usr/sbin/vserver %s start" % self.name,
- shell=True)
- # we get here due to an exception in the top-level child process
+ # start the vserver
+ subprocess.call(["/usr/sbin/vserver",self.name,"start"])
+
+ # we get here due to an exception in the grandson process
except Exception, ex:
self.log(traceback.format_exc())
os._exit(0)