blob: 5d9396ee6ebb642455901b19846e22cc8cef0346 [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
admin803f05d2014-07-18 10:44:38 -0700134
135 def findMaster(self, switchDPID, ip="localhost"):
136 import json
137 time.sleep(1)
138 command = "curl "+ip+":8080/wm/onos/registry/switches/json > master.txt"
139 response = self.execute(cmd=command,prompt="\$",timeout=10)
140 self.handle.sendline("cat master.txt")
141 response = self.execute(cmd=command,prompt="\$",timeout=10)
142 self.handle.expect(["cat master.txt",pexpect.EOF,pexpect.TIMEOUT])
143 self.handle.expect(["admin",pexpect.EOF,pexpect.TIMEOUT])
144 response = self.handle.before
145 decoded = json.loads(response)
146 for k in decoded.iteritems():
147 k2 = json.dumps(k)
148 if re.search(switchDPID,k2):
149 k3 = k2.split(',')
150 k4 = k3[1].split()
151 k5 = k4[1].split('"')
152 print k5[1]
153 return k5[1]
154 else:
155 return "NO SWITCH WITH THIS DPID!"
adminbae64d82013-08-01 10:50:15 -0700156
157 def isup(self):
adminaeedddd2013-08-02 15:14:15 -0700158 '''
159 Calls the zookeeper status and returns TRUE if it has an assigned Mode to it.
160 '''
adminbae64d82013-08-01 10:50:15 -0700161 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Halle80ef8c2014-04-29 15:29:13 -0700162 response = self.execute(cmd=self.home + "/onos.sh zk status ",prompt="Mode",timeout=10)
adminbae64d82013-08-01 10:50:15 -0700163 pattern = '(.*)Mode(.*)'
Jon Hallf89c8552014-04-02 13:14:06 -0700164 if re.search(pattern, response):
165 main.log.info(self.name + ": Zookeeper is up.")
adminbae64d82013-08-01 10:50:15 -0700166 return main.TRUE
167 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700168 main.log.info(self.name + ": Zookeeper is down.")
adminbae64d82013-08-01 10:50:15 -0700169 return main.FALSE
170
171