blob: 9a35366b0139a382f7f16f9a3ea2225d1d8c5f21 [file] [log] [blame]
adminbae64d82013-08-01 10:50:15 -07001#!/usr/bin/env python
2'''
3Created on 31-May-2013
4
5@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
6
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with TestON. If not, see <http://www.gnu.org/licenses/>.
20
21
22ZookeeperCliDriver is the basic driver which will handle the Zookeeper functions
23'''
24
25import pexpect
26import struct
27import fcntl
28import os
29import signal
30import re
31import sys
32import core.teston
33import time
34
35sys.path.append("../")
36from drivers.common.clidriver import CLI
37
38class ZookeeperCliDriver(CLI):
39 '''
adminaeedddd2013-08-02 15:14:15 -070040 ZookeeperCliDriver is the basic driver which will handle the Zookeeper's functions
adminbae64d82013-08-01 10:50:15 -070041 '''
42 def __init__(self):
43 super(CLI, self).__init__()
44 self.handle = self
45 self.wrapped = sys.modules[__name__]
46
admin680b78c2014-08-08 11:46:45 -070047 def kill(self):
48 import re
49 try:
50 self.handle.sendline("ps -ef |grep 'zookeeper.log.dir' |awk 'NR==1 {print $2}' |xargs sudo kill -9")
51 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
52 self.handle.sendline("ps -ef |grep 'zookeeper.log.dir' |wc -l")
53 self.handle.expect(["wc -l",pexpect.EOF,pexpect.TIMEOUT])
54 response = self.handle.after
55 if re.search("1",response):
56 return "Zookeeper Killed!"
57 else:
58 return "ERROR!!! ZOOKEEPER MAY NOT HAVE BEEN KILLED PROPERLY!!!"
59 except pexpect.EOF:
60 main.log.error(self.name + ": EOF exception found")
61 main.log.error(self.hane + ": " + self.handle.before)
62 main.cleanup()
63 main.exit()
64 except:
65 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
66 main.log.error( traceback.print_exc() )
67 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
68 main.cleanup()
69 main.exit()
70
71
72
adminbae64d82013-08-01 10:50:15 -070073 def connect(self, **connectargs):
74 # Here the main is the TestON instance after creating all the log handles.
75 self.port = None
76 for key in connectargs:
77 vars(self)[key] = connectargs[key]
Jon Hall4a2b0482014-04-18 16:29:26 -070078 self.home = "~/ONOS"
admin803f05d2014-07-18 10:44:38 -070079 self.zkhome = "~/zookeeper-3.4.6"
80 self.clustername = "sanity-rc-onos"
Jon Hall4a2b0482014-04-18 16:29:26 -070081 #self.home = "~/zookeeper-3.4.5"
Jon Hallf89c8552014-04-02 13:14:06 -070082 for key in self.options:
83 if key == "home":
84 self.home = self.options['home']
85 break
adminbae64d82013-08-01 10:50:15 -070086
87 self.name = self.options['name']
Jon Hallf89c8552014-04-02 13:14:06 -070088 self.handle = super(ZookeeperCliDriver, self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd, home = self.home)
adminbae64d82013-08-01 10:50:15 -070089
90 self.ssh_handle = self.handle
91 if self.handle :
adminbae64d82013-08-01 10:50:15 -070092 return main.TRUE
93 else :
94 main.log.error("Connection failed to the host "+self.user_name+"@"+self.ip_address)
Jon Hallf89c8552014-04-02 13:14:06 -070095 main.log.error(self.name + ": Failed to connect to Zookeeper")
adminbae64d82013-08-01 10:50:15 -070096 return main.FALSE
97
98
99 def start(self):
adminaeedddd2013-08-02 15:14:15 -0700100 '''
101 This Function will start the Zookeeper
102 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700103 main.log.info(self.name + ": Starting Zookeeper" )
adminbae64d82013-08-01 10:50:15 -0700104 self.handle.sendline("")
105 self.handle.expect("\$")
Jon Hall4a2b0482014-04-18 16:29:26 -0700106 self.handle.sendline("cd "+self.home)
107 self.handle.sendline("./onos.sh zk start")
108 self.handle.expect("zk start")
adminbae64d82013-08-01 10:50:15 -0700109 self.handle.expect("\$")
110 response = self.handle.before + self.handle.after
111 if re.search("STARTED", response):
Jon Hallf89c8552014-04-02 13:14:06 -0700112 main.log.info(self.name + ": Zookeeper Started ")
adminbae64d82013-08-01 10:50:15 -0700113 return main.TRUE
114 elif re.search("running", response):
Jon Hallf89c8552014-04-02 13:14:06 -0700115 main.log.warn(self.name +": zookeeper ... already running")
116 return main.TRUE
adminbae64d82013-08-01 10:50:15 -0700117 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700118 main.log.error(self.name + ": Failed to start Zookeeper"+ response)
adminbae64d82013-08-01 10:50:15 -0700119 return main.FALSE
120
121 def status(self):
adminaeedddd2013-08-02 15:14:15 -0700122 '''
123 This Function will return the Status of the Zookeeper
124 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700125 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700126 self.handle.sendline("cd "+self.home)
127 response = self.execute(cmd="./onos.sh zk status ",prompt="JMX",timeout=10)
admin680b78c2014-08-08 11:46:45 -0700128 response=self.handle.after
Jon Hallf89c8552014-04-02 13:14:06 -0700129 self.execute(cmd="\n",prompt="\$",timeout=10)
admin680b78c2014-08-08 11:46:45 -0700130 return self.handle.before + self.handle.after
adminbae64d82013-08-01 10:50:15 -0700131
132 def stop(self):
adminaeedddd2013-08-02 15:14:15 -0700133 '''
134 This Function will stop the Zookeeper if it is Running
135 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700136 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hallbd795bf2014-06-18 09:46:32 -0700137 time.sleep(1)
Jon Hall4a2b0482014-04-18 16:29:26 -0700138 self.handle.sendline("cd "+self.home)
139 response = self.execute(cmd="./onos.sh zk stop ",prompt="$",timeout=10)
140 if re.search("stopping",response):
Jon Hallf89c8552014-04-02 13:14:06 -0700141 main.log.info(self.name + ": Zookeeper Stopped")
adminbae64d82013-08-01 10:50:15 -0700142 return main.TRUE
143 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700144 main.log.warn(self.name + ": No zookeeper to stop")
adminbae64d82013-08-01 10:50:15 -0700145 return main.FALSE
146
147 def disconnect(self):
adminaeedddd2013-08-02 15:14:15 -0700148 '''
149 Called at the end of the test to disconnect the ZK handle
150 '''
adminbae64d82013-08-01 10:50:15 -0700151 response = ''
152 if self.handle:
153 self.handle.sendline("exit")
154 self.handle.expect("closed")
155 else :
Jon Hallf89c8552014-04-02 13:14:06 -0700156 main.log.error(self.name + ": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700157 response = main.FALSE
158 return response
admin6903e462014-07-22 15:30:54 -0700159
160#**********************************************************************************************
161#**********************************************************************************************
162# findMaster is used to determine the master controller of a switch.
163# it uses the switchList which is a json dict, and finds the first controller of
164# each switch
165#**********************************************************************************************
166#**********************************************************************************************
167
168
admin5f900c02014-07-22 15:33:50 -0700169 def findMaster(self, switchDPID, switchList):
admin803f05d2014-07-18 10:44:38 -0700170 import json
admin6903e462014-07-22 15:30:54 -0700171 decoded = json.loads(switchList)
admin680b78c2014-08-08 11:46:45 -0700172 if switchList=="":
173 return "NO CONTROLLERS FOUND"
admin803f05d2014-07-18 10:44:38 -0700174 for k in decoded.iteritems():
175 k2 = json.dumps(k)
176 if re.search(switchDPID,k2):
177 k3 = k2.split(',')
178 k4 = k3[1].split()
179 k5 = k4[1].split('"')
admin803f05d2014-07-18 10:44:38 -0700180 return k5[1]
admin2580a0e2014-07-29 11:24:34 -0700181 return "NO CONTROLLERS FOUND"
adminbae64d82013-08-01 10:50:15 -0700182
183 def isup(self):
adminaeedddd2013-08-02 15:14:15 -0700184 '''
185 Calls the zookeeper status and returns TRUE if it has an assigned Mode to it.
186 '''
adminbae64d82013-08-01 10:50:15 -0700187 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Halle80ef8c2014-04-29 15:29:13 -0700188 response = self.execute(cmd=self.home + "/onos.sh zk status ",prompt="Mode",timeout=10)
adminbae64d82013-08-01 10:50:15 -0700189 pattern = '(.*)Mode(.*)'
Jon Hallf89c8552014-04-02 13:14:06 -0700190 if re.search(pattern, response):
191 main.log.info(self.name + ": Zookeeper is up.")
adminbae64d82013-08-01 10:50:15 -0700192 return main.TRUE
193 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700194 main.log.info(self.name + ": Zookeeper is down.")
adminbae64d82013-08-01 10:50:15 -0700195 return main.FALSE
196
197