165 lines
5.7 KiB
Python
165 lines
5.7 KiB
Python
###################################################################
|
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
|
# All rights reserved.
|
|
#
|
|
# This file is proprietary and confidential to TAOS Technologies.
|
|
# No part of this file may be reproduced, stored, transmitted,
|
|
# disclosed or used in any form or by any means other than as
|
|
# expressly provided by the written permission from Jianhui Tao
|
|
#
|
|
###################################################################
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
import taos
|
|
|
|
class BuildDockerCluser:
|
|
|
|
def init(self, numOfNodes, dockerDir):
|
|
self.numOfNodes = numOfNodes
|
|
self.dockerDir = dockerDir
|
|
|
|
self.hostName = "tdnode1"
|
|
self.user = "root"
|
|
self.password = "taosdata"
|
|
self.configDir = "/etc/taos"
|
|
self.dirs = ["data", "cfg", "log", "core"]
|
|
self.cfgDict = {
|
|
"numOfLogLines":"100000000",
|
|
"mnodeEqualVnodeNum":"0",
|
|
"walLevel":"1",
|
|
"numOfThreadsPerCore":"2.0",
|
|
"monitor":"0",
|
|
"vnodeBak":"1",
|
|
"dDebugFlag":"135",
|
|
"mDebugFlag":"135",
|
|
"sdbDebugFlag":"135",
|
|
"rpcDebugFlag":"135",
|
|
"tmrDebugFlag":"131",
|
|
"cDebugFlag":"135",
|
|
"httpDebugFlag":"135",
|
|
"monitorDebugFlag":"135",
|
|
"udebugFlag":"135",
|
|
"jnidebugFlag":"135",
|
|
"qdebugFlag":"135",
|
|
"maxSQLLength":"1048576"
|
|
}
|
|
cmd = "mkdir -p %s" % self.dockerDir
|
|
self.execCmd(cmd)
|
|
|
|
cmd = "cp *.yml %s" % self.dockerDir
|
|
self.execCmd(cmd)
|
|
|
|
cmd = "cp Dockerfile %s" % self.dockerDir
|
|
self.execCmd(cmd)
|
|
|
|
|
|
# execute command, and return the output
|
|
# ref: https://blog.csdn.net/wowocpp/article/details/80775650
|
|
def execCmdAndGetOutput(self, cmd):
|
|
r = os.popen(cmd)
|
|
text = r.read()
|
|
r.close()
|
|
return text
|
|
|
|
def execCmd(self, cmd):
|
|
if os.system(cmd) != 0:
|
|
quit()
|
|
|
|
def getTaosdVersion(self):
|
|
cmd = "taosd -V |grep version|awk '{print $3}'"
|
|
taosdVersion = self.execCmdAndGetOutput(cmd)
|
|
cmd = "find %s -name '*server*.tar.gz' | awk -F- '{print $(NF-2)}'|sort|awk 'END {print}'" % self.dockerDir
|
|
packageVersion = self.execCmdAndGetOutput(cmd)
|
|
|
|
if (taosdVersion is None or taosdVersion.isspace()) and (packageVersion is None or packageVersion.isspace()):
|
|
print("Please install taosd or have a install package ready")
|
|
quit()
|
|
else:
|
|
self.version = taosdVersion if taosdVersion >= packageVersion else packageVersion
|
|
return self.version.strip()
|
|
|
|
def getConnection(self):
|
|
self.conn = taos.connect(
|
|
host = self.hostName,
|
|
user = self.user,
|
|
password = self.password,
|
|
config = self.configDir)
|
|
|
|
def removeFile(self, rootDir, index, dir):
|
|
cmd = "rm -rf %s/node%d/%s/*" % (rootDir, index, dir)
|
|
self.execCmd(cmd)
|
|
|
|
def clearEnv(self):
|
|
cmd = "cd %s && docker-compose down --remove-orphans" % self.dockerDir
|
|
self.execCmd(cmd)
|
|
for i in range(1, self.numOfNodes + 1):
|
|
self.removeFile(self.dockerDir, i, self.dirs[0])
|
|
self.removeFile(self.dockerDir, i, self.dirs[1])
|
|
self.removeFile(self.dockerDir, i, self.dirs[2])
|
|
|
|
def createDir(self, rootDir, index, dir):
|
|
cmd = "mkdir -p %s/node%d/%s" % (rootDir, index, dir)
|
|
self.execCmd(cmd)
|
|
|
|
def createDirs(self):
|
|
for i in range(1, self.numOfNodes + 1):
|
|
for j in range(len(self.dirs)):
|
|
self.createDir(self.dockerDir, i, self.dirs[j])
|
|
|
|
def addExtraCfg(self, option, value):
|
|
self.cfgDict.update({option: value})
|
|
|
|
def cfg(self, option, value, nodeIndex):
|
|
cfgPath = "%s/node%d/cfg/taos.cfg" % (self.dockerDir, nodeIndex)
|
|
cmd = "echo %s %s >> %s" % (option, value, cfgPath)
|
|
self.execCmd(cmd)
|
|
|
|
def updateLocalhosts(self):
|
|
cmd = "grep '172.27.0.7 *tdnode1' /etc/hosts | sed 's: ::g'"
|
|
result = self.execCmdAndGetOutput(cmd)
|
|
print(result)
|
|
if result is None or result.isspace():
|
|
print("==========")
|
|
cmd = "echo 172.27.0.7 tdnode1 >> /etc/hosts"
|
|
display = "echo %s" % cmd
|
|
self.execCmd(display)
|
|
self.execCmd(cmd)
|
|
|
|
def deploy(self):
|
|
self.clearEnv()
|
|
self.createDirs()
|
|
for i in range(1, self.numOfNodes + 1):
|
|
self.cfg("firstEp", "tdnode1:6030", i)
|
|
|
|
for key, value in self.cfgDict.items():
|
|
self.cfg(key, value, i)
|
|
|
|
def createDondes(self):
|
|
self.cursor = self.conn.cursor()
|
|
for i in range(2, self.numOfNodes + 1):
|
|
self.cursor.execute("create dnode tdnode%d" % i)
|
|
|
|
def startArbitrator(self):
|
|
for i in range(1, self.numOfNodes + 1):
|
|
self.cfg("arbitrator", "tdnode1:6042", i)
|
|
cmd = "docker exec -d $(docker ps|grep tdnode1|awk '{print $1}') tarbitrator"
|
|
self.execCmd(cmd)
|
|
|
|
def prepardBuild(self):
|
|
if self.numOfNodes < 2 or self.numOfNodes > 10:
|
|
print("the number of nodes must be between 2 and 10")
|
|
exit(0)
|
|
self.updateLocalhosts()
|
|
self.deploy()
|
|
|
|
def run(self):
|
|
cmd = "./buildClusterEnv.sh -n %d -v %s -d %s" % (self.numOfNodes, self.getTaosdVersion(), self.dockerDir)
|
|
display = "echo %s" % cmd
|
|
self.execCmd(display)
|
|
self.execCmd(cmd)
|
|
self.getConnection()
|
|
self.createDondes()
|
|
|
|
cluster = BuildDockerCluser() |