示例#1
0
文件: container.py 项目: wgzhao/dbaas
class Container(object):
    """容器类,用于创建,销毁,停止,暂停,恢复容器等操作"""

    def __init__(self):
        #initial base config
        self.cli = Client(base_url=DOCKER_BASE_URL, version='auto')
        self.logger = MyLogger()
        self.db = Database()

    def generate_string(self, size=8):
        """生成指定长度的随机字符串"""
        return ''.join(
            random.choice(string.ascii_lowercase + string.ascii_uppercase +
                          string.digits) for _ in range(size))

    def create_container(self, tid, mem_limit, hostname, image_name):
        """  create a container and update status """
        #create random mysql_password
        mysql_password = self.generate_string(8)
        self.logger.writelog('create mysql password %s' % mysql_password)
        self.logger.writelog(
            "create container with image name %s and hostname %s " %
            (image_name, hostname))
        try:
            c = self.cli.create_container(image=image_name,environment={'MYSQL_PASSWORD':mysql_password},\
                        name=hostname,hostname=hostname, detach=False,tty=False,ports=[22,3306,80],\
                        host_config = self.cli.create_host_config(publish_all_ports=True,mem_limit = mem_limit))
            docker_id = c.get('Id')
            self.logger.writelog('container id: %s' % docker_id)
            self.start_container(docker_id, tid)
            #get IP address
            ip = self.cli.inspect_container(
                docker_id)['NetworkSettings']['IPAddress']
            #get port mapping
            ssh_port = self.cli.port(docker_id, '22')[0]['HostPort']
            db_port = self.cli.port(docker_id, '3306')[0]['HostPort']
            web_port = self.cli.port(docker_id, '80')[0]['HostPort']
            sql = """insert into instances(tid,did,ip,hostname,dbport,webport,sshport,dbpwd) values('%s','%s','%s','%s','%s','%s','%s','%s');""" % (
                tid, docker_id, ip, hostname, db_port, web_port, ssh_port,
                mysql_password)
            self.logger.writelog("insert record in instances table")
            self.db.execute(sql)
            self.logger.writelog("update task status:%d" % ST_RUNNING)
            self.db.update_status(tid, ST_RUNNING)
            return docker_id
        except Exception, err:
            #create failed
            self.logger.writelog('create failed: %s ' % err, self.logger.error)
            self.db.update_status(tid, ST_UNKNOWN)
            return False