214 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			7.5 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 -*-
 | |
| 
 | |
| from fabric import Connection
 | |
| import random
 | |
| import time
 | |
| import logging
 | |
| 
 | |
| class Node:
 | |
|     def __init__(self, index, username, hostIP, hostName, password, homeDir):
 | |
|         self.index = index        
 | |
|         self.username = username
 | |
|         self.hostIP = hostIP
 | |
|         self.hostName = hostName
 | |
|         self.homeDir = homeDir
 | |
|         self.corePath = '/coredump'
 | |
|         self.conn = Connection("{}@{}".format(username, hostName), connect_kwargs={"password": "{}".format(password)})        
 | |
|     
 | |
|     def buildTaosd(self):
 | |
|         try:
 | |
|             self.conn.cd("/root/TDinternal/community")
 | |
|             self.conn.run("git checkout develop")
 | |
|             self.conn.run("git pull")
 | |
|             self.conn.cd("/root/TDinternal")
 | |
|             self.conn.run("git checkout develop")
 | |
|             self.conn.run("git pull")
 | |
|             self.conn.cd("/root/TDinternal/debug")
 | |
|             self.conn.run("cmake ..")
 | |
|             self.conn.run("make")
 | |
|             self.conn.run("make install")
 | |
|         except Exception as e:
 | |
|             print("Build Taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|             pass
 | |
| 
 | |
|     def startTaosd(self):
 | |
|         try:
 | |
|             self.conn.run("sudo systemctl start taosd")
 | |
|         except Exception as e:
 | |
|             print("Start Taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|         
 | |
|     def stopTaosd(self):
 | |
|         try:
 | |
|             self.conn.run("sudo systemctl stop taosd")
 | |
|         except Exception as e:
 | |
|             print("Stop Taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|     
 | |
|     def restartTaosd(self):
 | |
|         try:
 | |
|             self.conn.run("sudo systemctl restart taosd")
 | |
|         except Exception as e:
 | |
|             print("Stop Taosd error for node %d " % self.index)
 | |
|             logging.exception(e)    
 | |
| 
 | |
|     def removeTaosd(self):
 | |
|         try:
 | |
|             self.conn.run("rmtaos")
 | |
|         except Exception as e:
 | |
|             print("remove taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|     
 | |
|     def forceStopOneTaosd(self):
 | |
|         try:
 | |
|             self.conn.run("kill -9 $(ps -ax|grep taosd|awk '{print $1}')")
 | |
|         except Exception as e:
 | |
|             print("kill taosd error on node%d " % self.index)            
 | |
|     
 | |
|     def startOneTaosd(self):
 | |
|         try:
 | |
|             self.conn.run("nohup taosd -c /etc/taos/ > /dev/null 2>&1 &")
 | |
|         except Exception as e:
 | |
|             print("start taosd error on node%d " % self.index)
 | |
|             logging.exception(e)    
 | |
|     
 | |
|     def installTaosd(self, packagePath):
 | |
|         self.conn.put(packagePath, self.homeDir)
 | |
|         self.conn.cd(self.homeDir)
 | |
|         self.conn.run("tar -zxf $(basename '%s')" % packagePath)
 | |
|         with self.conn.cd("TDengine-enterprise-server"):
 | |
|             self.conn.run("yes|./install.sh")
 | |
| 
 | |
|     def configTaosd(self, taosConfigKey, taosConfigValue):
 | |
|         self.conn.run("sudo echo '%s %s' >> %s" % (taosConfigKey, taosConfigValue, "/etc/taos/taos.cfg"))
 | |
| 
 | |
|     def removeTaosConfig(self, taosConfigKey, taosConfigValue): 
 | |
|         self.conn.run("sudo sed -in-place -e '/%s %s/d' %s" % (taosConfigKey, taosConfigValue, "/etc/taos/taos.cfg"))
 | |
|     
 | |
|     def configHosts(self, ip, name):
 | |
|         self.conn.run("echo '%s %s' >> %s" % (ip, name, '/etc/hosts'))
 | |
| 
 | |
|     def removeData(self):
 | |
|         try:
 | |
|             self.conn.run("sudo rm -rf /var/lib/taos/*")
 | |
|         except Exception as e:
 | |
|             print("remove taosd data error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|     
 | |
|     def removeLog(self):
 | |
|         try:
 | |
|             self.conn.run("sudo rm -rf /var/log/taos/*")
 | |
|         except Exception as e:
 | |
|             print("remove taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
| 
 | |
|     def removeDataForMnode(self):
 | |
|         try:
 | |
|             self.conn.run("sudo rm -rf /var/lib/taos/*")
 | |
|         except Exception as e:
 | |
|             print("remove taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
| 
 | |
|     def removeDataForVnode(self, id):
 | |
|         try:
 | |
|             self.conn.run("sudo rm -rf /var/lib/taos/vnode%d/*.data" % id)
 | |
|         except Exception as e:
 | |
|             print("remove taosd error for node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|     
 | |
| 
 | |
|     def detectCoredumpFile(self):
 | |
|         try:
 | |
|             result = self.conn.run("find /coredump -name 'core_*' ", hide=True)
 | |
|             output = result.stdout
 | |
|             print("output: %s" % output)
 | |
|             return output
 | |
|         except Exception as e:
 | |
|             print("find coredump file error on node %d " % self.index)
 | |
|             logging.exception(e)
 | |
|         
 | |
| 
 | |
| class Nodes:
 | |
|     def __init__(self):
 | |
|         self.tdnodes = []
 | |
|         self.tdnodes.append(Node(0, 'root', '192.168.17.194', 'taosdata', 'r', '/root/'))
 | |
|         # self.tdnodes.append(Node(1, 'root', '52.250.48.222', 'node2', 'a', '/root/'))
 | |
|         # self.tdnodes.append(Node(2, 'root', '51.141.167.23', 'node3', 'a', '/root/'))
 | |
|         # self.tdnodes.append(Node(3, 'root', '52.247.207.173', 'node4', 'a', '/root/'))
 | |
|         # self.tdnodes.append(Node(4, 'root', '51.141.166.100', 'node5', 'a', '/root/'))
 | |
| 
 | |
|     def stopOneNode(self, index):
 | |
|         self.tdnodes[index].stopTaosd()
 | |
|         self.tdnodes[index].forceStopOneTaosd()
 | |
|     
 | |
|     def startOneNode(self, index):
 | |
|         self.tdnodes[index].startOneTaosd()
 | |
|     
 | |
|     def detectCoredumpFile(self, index):
 | |
|         return self.tdnodes[index].detectCoredumpFile()
 | |
| 
 | |
|     def stopAllTaosd(self):
 | |
|         for i in range(len(self.tdnodes)):
 | |
|             self.tdnodes[i].stopTaosd()
 | |
| 
 | |
|     def startAllTaosd(self):
 | |
|         for i in range(len(self.tdnodes)):
 | |
|             self.tdnodes[i].startTaosd()                    
 | |
|     
 | |
|     def restartAllTaosd(self):
 | |
|         for i in range(len(self.tdnodes)):
 | |
|             self.tdnodes[i].restartTaosd()       
 | |
|     
 | |
|     def addConfigs(self, configKey, configValue):          
 | |
|         for i in range(len(self.tdnodes)):
 | |
|             self.tdnodes[i].configTaosd(configKey, configValue)        
 | |
|     
 | |
|     def removeConfigs(self, configKey, configValue): 
 | |
|         for i in range(len(self.tdnodes)):
 | |
|             self.tdnodes[i].removeTaosConfig(configKey, configValue)  
 | |
|     
 | |
|     def removeAllDataFiles(self):
 | |
|         for i in range(len(self.tdnodes)):
 | |
|             self.tdnodes[i].removeData()
 | |
| 
 | |
| class Test:
 | |
|     def __init__(self):
 | |
|         self.nodes = Nodes()
 | |
| 
 | |
|     # kill taosd randomly every 10 mins
 | |
|     def randomlyKillDnode(self):        
 | |
|         loop = 0
 | |
|         while True:                
 | |
|             index = random.randint(0, 4)
 | |
|             print("loop: %d, kill taosd on node%d" %(loop, index))
 | |
|             self.nodes.stopOneNode(index)
 | |
|             time.sleep(60)
 | |
|             self.nodes.startOneNode(index)
 | |
|             time.sleep(600)
 | |
|             loop = loop + 1
 | |
|     
 | |
|     def detectCoredump(self):
 | |
|         loop = 0
 | |
|         while True:
 | |
|             for i in range(len(self.nodes.tdnodes)):
 | |
|                 result = self.nodes.detectCoredumpFile(i)
 | |
|                 print("core file path is %s" % result)
 | |
|                 if result and not result.isspace():
 | |
|                     self.nodes.stopAllTaosd()                    
 | |
|             print("sleep for 10 mins")
 | |
|             time.sleep(600)
 | |
| 
 | |
| test = Test()
 | |
| test.detectCoredump() |