aios/tools/hape/hape_libs/appmaster/docker/docker_util.py (106 lines of code) (raw):
import time
from hape_libs.utils.shell import SSHShell
from hape_libs.utils.logger import Logger
class DockerContainerUtil():
@staticmethod
def check_container(ip, name):
shell = SSHShell(ip)
check_command = "docker ps --format {{{{.Names}}}} | grep ^{}$".format(name)
out = shell.execute_command(check_command)
if len(out.strip()) != 0:
Logger.info("Container {} is started in {}".format(name, ip))
return True
else:
Logger.info("Container {} is not exists in {}".format(name, ip))
return False
@staticmethod
def create_container(ip, name, workdir, homedir, user, cpu, mem, image):
Logger.info("Begin to create container {} in {}".format(name, ip))
if DockerContainerUtil.check_container(ip, name):
Logger.warning("Container {} already exists in {}, will stop it".format(name, ip))
DockerContainerUtil.stop_container(ip, name)
shell = SSHShell(ip)
check_command = "ls {}".format(workdir)
_, notexists = shell.execute_command(check_command, grep_text="No such")
if notexists:
command = "mkdir -p {}".format(workdir)
shell.execute_command(command)
_, notexists = shell.execute_command(check_command, grep_text="No such")
if notexists:
Logger.error("Failed to create directory {}".format(workdir))
return False
command = "docker run --workdir {} --volume=\"/etc/group:/home/.group:ro\" --volume=\"/etc/passwd:/home/.passwd:ro\" --volume=\"/etc/hosts:/etc/hosts:ro\"\
--ulimit nofile=655350:655350 --ulimit memlock=-1 --cpu-quota={} --cpu-period=100000 --memory={}m -v {}:{} -d --network=host --privileged --name {} {} /sbin/init".format(
workdir, int(cpu) * 1000, mem, homedir, homedir, name, image)
shell.execute_command(command)
workdir = workdir + "/" + name
command = "docker exec -t {} bash -c \"cp /home/.passwd /etc/passwd && cp /home/.group /etc/group\"".format(name)
shell.execute_command(command)
if isinstance(user, tuple):
user = user[0]
command = "docker exec -t --user {} {} bash -c \"mkdir -p {}\"".format(user, name, workdir)
shell.execute_command(command)
if not DockerContainerUtil.check_container(ip, name):
Logger.error("Failed to create container {} in ip:{}".format(name, ip))
return False
else:
Logger.info("Succeed to create container {} in ip:{}".format(name, ip))
return True
@staticmethod
def check_process_pid(ip, name, command):
shell = SSHShell(ip)
check_command = "docker exec -t {} bash -c \"ps -ef | grep {} | grep -v grep\"".format(name, command)
out = shell.execute_command(check_command)
for line in out.strip().split("\n"):
splits = line.split()
if len(splits) > 1 and splits[1].isdigit():
Logger.info("Found process in ip {}, pid {}".format(ip, splits[1]))
return splits[1]
return None
@staticmethod
def start_process(ip, name, user, workdir, envs, args, command):
Logger.info("Begin to start process {} in {}".format(command, ip))
full_process_command = ""
if len(envs)!=0:
full_process_command += " ".join(envs) + " "
full_process_command += command
if len(args)!=0:
full_process_command += " " + " ".join(args)
full_process_command += " 1> stdout.log 2>stderr.log"
shell = SSHShell(ip)
docker_command = "docker exec --user {} -t {} bash -c \"cd {} && echo \\\"{}\\\" > process_starter.sh\"".format(user, name, workdir, full_process_command)
shell.execute_command(docker_command)
sshme = "docker exec -it --user {} {} bash".format(user, name)
docker_command = "docker exec --user {} -t {} bash -c \"cd {} && echo \\\"{}\\\" > sshme\"".format(user, name, workdir, sshme)
shell.execute_command(docker_command)
docker_command = "docker exec --user {} -dt {} bash -c \"cd {} && sh process_starter.sh\"".format(user, name, workdir)
shell.execute_command(docker_command)
count = 10
Logger.info("Wait util process is started")
while count:
if DockerContainerUtil.check_process_pid(ip, name, command) == None:
Logger.warning("Processor not found, wait {} times".format(count))
count -= 1
time.sleep(5)
else:
Logger.info("Succeed to start process {}".format(command))
return True
Logger.error("Failed to start process {}".format(command))
return False
@staticmethod
def execute_command(ip, name, workdir, user, envs, args, command, grep_text = None):
full_process_command = ""
if len(envs)!=0:
full_process_command += " ".join(envs) + " "
full_process_command += command
if len(args)!=0:
full_process_command += " " + " ".join(args)
shell = SSHShell(ip)
workdir = workdir + "/" + name
command = "docker exec --user {} -t {} bash -c \"cd {} &&{}\"".format(user, name, workdir, full_process_command)
return shell.execute_command(command, grep_text=grep_text)
@staticmethod
def stop_container(ip, name):
Logger.info("Stop container {} in {}".format(name, ip))
shell = SSHShell(ip)
shell.execute_command("docker ps --all --format {{{{.Names}}}} | grep ^{}$ | xargs docker rm -f".format(name))