blob: 79f06ee877224e1311524e9dd9ea576ce306edd6 [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
47 def connect(self, **connectargs):
48 # Here the main is the TestON instance after creating all the log handles.
49 self.port = None
50 for key in connectargs:
51 vars(self)[key] = connectargs[key]
Jon Hall4a2b0482014-04-18 16:29:26 -070052 self.home = "~/ONOS"
admin803f05d2014-07-18 10:44:38 -070053 self.zkhome = "~/zookeeper-3.4.6"
54 self.clustername = "sanity-rc-onos"
Jon Hall4a2b0482014-04-18 16:29:26 -070055 #self.home = "~/zookeeper-3.4.5"
Jon Hallf89c8552014-04-02 13:14:06 -070056 for key in self.options:
57 if key == "home":
58 self.home = self.options['home']
59 break
adminbae64d82013-08-01 10:50:15 -070060
61 self.name = self.options['name']
Jon Hallf89c8552014-04-02 13:14:06 -070062 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 -070063
64 self.ssh_handle = self.handle
65 if self.handle :
adminbae64d82013-08-01 10:50:15 -070066 return main.TRUE
67 else :
68 main.log.error("Connection failed to the host "+self.user_name+"@"+self.ip_address)
Jon Hallf89c8552014-04-02 13:14:06 -070069 main.log.error(self.name + ": Failed to connect to Zookeeper")
adminbae64d82013-08-01 10:50:15 -070070 return main.FALSE
71
72
73 def start(self):
adminaeedddd2013-08-02 15:14:15 -070074 '''
75 This Function will start the Zookeeper
76 '''
Jon Hallf89c8552014-04-02 13:14:06 -070077 main.log.info(self.name + ": Starting Zookeeper" )
adminbae64d82013-08-01 10:50:15 -070078 self.handle.sendline("")
79 self.handle.expect("\$")
Jon Hall4a2b0482014-04-18 16:29:26 -070080 self.handle.sendline("cd "+self.home)
81 self.handle.sendline("./onos.sh zk start")
82 self.handle.expect("zk start")
adminbae64d82013-08-01 10:50:15 -070083 self.handle.expect("\$")
84 response = self.handle.before + self.handle.after
85 if re.search("STARTED", response):
Jon Hallf89c8552014-04-02 13:14:06 -070086 main.log.info(self.name + ": Zookeeper Started ")
adminbae64d82013-08-01 10:50:15 -070087 return main.TRUE
88 elif re.search("running", response):
Jon Hallf89c8552014-04-02 13:14:06 -070089 main.log.warn(self.name +": zookeeper ... already running")
90 return main.TRUE
adminbae64d82013-08-01 10:50:15 -070091 else:
Jon Hallf89c8552014-04-02 13:14:06 -070092 main.log.error(self.name + ": Failed to start Zookeeper"+ response)
adminbae64d82013-08-01 10:50:15 -070093 return main.FALSE
94
95 def status(self):
adminaeedddd2013-08-02 15:14:15 -070096 '''
97 This Function will return the Status of the Zookeeper
98 '''
adminbae64d82013-08-01 10:50:15 -070099 time.sleep(5)
Jon Hallf89c8552014-04-02 13:14:06 -0700100 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700101 self.handle.sendline("cd "+self.home)
102 response = self.execute(cmd="./onos.sh zk status ",prompt="JMX",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700103
104 self.execute(cmd="\n",prompt="\$",timeout=10)
adminbae64d82013-08-01 10:50:15 -0700105 return response
106
107 def stop(self):
adminaeedddd2013-08-02 15:14:15 -0700108 '''
109 This Function will stop the Zookeeper if it is Running
110 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700111 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hallbd795bf2014-06-18 09:46:32 -0700112 time.sleep(1)
Jon Hall4a2b0482014-04-18 16:29:26 -0700113 self.handle.sendline("cd "+self.home)
114 response = self.execute(cmd="./onos.sh zk stop ",prompt="$",timeout=10)
115 if re.search("stopping",response):
Jon Hallf89c8552014-04-02 13:14:06 -0700116 main.log.info(self.name + ": Zookeeper Stopped")
adminbae64d82013-08-01 10:50:15 -0700117 return main.TRUE
118 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700119 main.log.warn(self.name + ": No zookeeper to stop")
adminbae64d82013-08-01 10:50:15 -0700120 return main.FALSE
121
122 def disconnect(self):
adminaeedddd2013-08-02 15:14:15 -0700123 '''
124 Called at the end of the test to disconnect the ZK handle
125 '''
adminbae64d82013-08-01 10:50:15 -0700126 response = ''
127 if self.handle:
128 self.handle.sendline("exit")
129 self.handle.expect("closed")
130 else :
Jon Hallf89c8552014-04-02 13:14:06 -0700131 main.log.error(self.name + ": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700132 response = main.FALSE
133 return response
admin6903e462014-07-22 15:30:54 -0700134
135#**********************************************************************************************
136#**********************************************************************************************
137# findMaster is used to determine the master controller of a switch.
138# it uses the switchList which is a json dict, and finds the first controller of
139# each switch
140#**********************************************************************************************
141#**********************************************************************************************
142
143
admin5f900c02014-07-22 15:33:50 -0700144 def findMaster(self, switchDPID, switchList):
admin803f05d2014-07-18 10:44:38 -0700145 import json
admin6903e462014-07-22 15:30:54 -0700146 decoded = json.loads(switchList)
admin803f05d2014-07-18 10:44:38 -0700147 for k in decoded.iteritems():
148 k2 = json.dumps(k)
149 if re.search(switchDPID,k2):
150 k3 = k2.split(',')
151 k4 = k3[1].split()
152 k5 = k4[1].split('"')
admin803f05d2014-07-18 10:44:38 -0700153 return k5[1]
admin6903e462014-07-22 15:30:54 -0700154 return "NO SWITCH FOUND"
adminbae64d82013-08-01 10:50:15 -0700155
156 def isup(self):
adminaeedddd2013-08-02 15:14:15 -0700157 '''
158 Calls the zookeeper status and returns TRUE if it has an assigned Mode to it.
159 '''
adminbae64d82013-08-01 10:50:15 -0700160 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Halle80ef8c2014-04-29 15:29:13 -0700161 response = self.execute(cmd=self.home + "/onos.sh zk status ",prompt="Mode",timeout=10)
adminbae64d82013-08-01 10:50:15 -0700162 pattern = '(.*)Mode(.*)'
Jon Hallf89c8552014-04-02 13:14:06 -0700163 if re.search(pattern, response):
164 main.log.info(self.name + ": Zookeeper is up.")
adminbae64d82013-08-01 10:50:15 -0700165 return main.TRUE
166 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700167 main.log.info(self.name + ": Zookeeper is down.")
adminbae64d82013-08-01 10:50:15 -0700168 return main.FALSE
169
170