make a function to create containers in taskcontroller

This commit is contained in:
Firmlyzhu 2018-11-21 16:44:23 +08:00
parent 883814f0da
commit f789ac68c0
1 changed files with 50 additions and 41 deletions

View File

@ -181,6 +181,52 @@ class TaskController(rpc_pb2_grpc.WorkerServicer):
logger.error(traceback.format_exc()) logger.error(traceback.format_exc())
return [False,""] return [False,""]
def create_container(self,instanceid,username,image,lxcname,quota):
# acquire ip
[status, ip] = self.acquire_ip()
if not status:
return [False, ip]
# prepare image and filesystem
status = self.imgmgr.prepareFS(username,image,lxcname,str(quota.disk))
if not status:
self.release_ip(ip)
return [False, "Create container for batch failed when preparing filesystem"]
rootfs = "/var/lib/lxc/%s/rootfs" % lxcname
if not os.path.isdir("%s/global/users/%s" % (self.fspath,username)):
path = env.getenv('DOCKLET_LIB')
subprocess.call([path+"/master/userinit.sh", username])
logger.info("user %s directory not found, create it" % username)
sys_run("mkdir -p /var/lib/lxc/%s" % lxcname)
logger.info("generate config file for %s" % lxcname)
def config_prepare(content):
content = content.replace("%ROOTFS%",rootfs)
content = content.replace("%HOSTNAME%","batch-%s" % str(instanceid))
content = content.replace("%CONTAINER_MEMORY%",str(quota.memory))
content = content.replace("%CONTAINER_CPU%",str(quota.cpu*100000))
content = content.replace("%FS_PREFIX%",self.fspath)
content = content.replace("%LXCSCRIPT%",env.getenv("LXC_SCRIPT"))
content = content.replace("%USERNAME%",username)
content = content.replace("%LXCNAME%",lxcname)
content = content.replace("%IP%",ip)
content = content.replace("%GATEWAY%",self.cons_gateway)
return content
logger.info(self.confpath)
conffile = open(self.confpath+"/container.batch.conf", 'r')
conftext = conffile.read()
conffile.close()
conftext = config_prepare(conftext)
conffile = open("/var/lib/lxc/%s/config" % lxcname, 'w')
conffile.write(conftext)
conffile.close()
return [True, ip]
def process_task(self, request, context): def process_task(self, request, context):
logger.info('excute task with parameter: ' + str(request)) logger.info('excute task with parameter: ' + str(request))
taskid = request.id taskid = request.id
@ -211,51 +257,14 @@ class TaskController(rpc_pb2_grpc.WorkerServicer):
timeout = request.timeout timeout = request.timeout
gpu_need = int(request.cluster.instance.gpu) gpu_need = int(request.cluster.instance.gpu)
# acquire ip #create container
[status, ip] = self.acquire_ip() [success, ip] = self.create_container(instanceid, username, image, lxcname, instance_type)
if not status: if not success:
return rpc_pb2.Reply(status=rpc_pb2.Reply.REFUSED, message=ip) return rpc_pb2.Reply(status=rpc_pb2.Reply.REFUSED, message=ip)
# prepare image and filesystem
status = self.imgmgr.prepareFS(username,image,lxcname,str(instance_type.disk))
if not status:
self.release_ip(ip)
return rpc_pb2.Reply(status=rpc_pb2.Reply.REFUSED, message="Create container for batch failed when preparing filesystem")
rootfs = "/var/lib/lxc/%s/rootfs" % lxcname
if not os.path.isdir("%s/global/users/%s" % (self.fspath,username)):
path = env.getenv('DOCKLET_LIB')
subprocess.call([path+"/master/userinit.sh", username])
logger.info("user %s directory not found, create it" % username)
sys_run("mkdir -p /var/lib/lxc/%s" % lxcname)
logger.info("generate config file for %s" % lxcname)
def config_prepare(content):
content = content.replace("%ROOTFS%",rootfs)
content = content.replace("%HOSTNAME%","batch-%s" % str(instanceid))
content = content.replace("%CONTAINER_MEMORY%",str(instance_type.memory))
content = content.replace("%CONTAINER_CPU%",str(instance_type.cpu*100000))
content = content.replace("%FS_PREFIX%",self.fspath)
content = content.replace("%LXCSCRIPT%",env.getenv("LXC_SCRIPT"))
content = content.replace("%USERNAME%",username)
content = content.replace("%LXCNAME%",lxcname)
content = content.replace("%IP%",ip)
content = content.replace("%GATEWAY%",self.cons_gateway)
return content
logger.info(self.confpath)
conffile = open(self.confpath+"/container.batch.conf", 'r')
conftext = conffile.read()
conffile.close()
conftext = config_prepare(conftext)
conffile = open("/var/lib/lxc/%s/config" % lxcname, 'w')
conffile.write(conftext)
#mount oss #mount oss
self.mount_oss("%s/global/users/%s/oss" % (self.fspath,username), mount_list) self.mount_oss("%s/global/users/%s/oss" % (self.fspath,username), mount_list)
conffile = open("/var/lib/lxc/%s/config" % lxcname, 'a+')
mount_str = "lxc.mount.entry = %s/global/users/%s/oss/%s %s/root/oss/%s none bind,rw,create=dir 0 0" mount_str = "lxc.mount.entry = %s/global/users/%s/oss/%s %s/root/oss/%s none bind,rw,create=dir 0 0"
for mount in mount_list: for mount in mount_list:
conffile.write("\n"+ mount_str % (self.fspath, username, mount.remotePath, rootfs, mount.remotePath)) conffile.write("\n"+ mount_str % (self.fspath, username, mount.remotePath, rootfs, mount.remotePath))