path:
root/
testcases/
Controllers/
ONOS/
Teston/
277
278
279
280
281
"""
Description:
This file is used to setup the running environment
Include Download code,setup environment variable
Set onos running config
Set user name/password
Onos-push-keys and so on
lanqinglong@huawei.com
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
#
"""
import os
import time
import pexpect
import re
import sys
import pxssh
from connection import connection
class environment(connection):
def __init__(self):
connection.__init__(self)
self.loginfo = connection()
self.masterhandle = ''
self.home = ''
def DownLoadCode(self, handle, codeurl):
"""
Download Code use 'git clone'
parameters:
handle: current working handle
codeurl: clone code url
"""
print "Now loading test codes! Please wait in patient..."
originalfolder = sys.path[0]
print originalfolder
gitclone = handle
gitclone.sendline("git clone " + codeurl)
index = 0
# increment = 0
while index != 1 or index != 4:
index = gitclone.expect(['already exists',
'esolving deltas: 100%',
'eceiving objects',
'Already up-to-date',
'npacking objects: 100%', pexpect.EOF])
filefolder = self.home + '/' + codeurl.split('/')[-1].split('.')[0]
if index == 0:
os.chdir(filefolder)
os.system('git pull')
os.chdir(originalfolder)
self.loginfo.log('Download code success!')
break
elif index == 1 or index == 4:
self.loginfo.log('Download code success!')
gitclone.sendline("mkdir onos")
gitclone.prompt()
gitclone.sendline("cp -rf " + filefolder + "/tools onos/")
gitclone.prompt()
break
elif index == 2:
os.write(1, gitclone.before)
sys.stdout.flush()
else:
self.loginfo.log('Download code failed!')
self.loginfo.log('Information before' + gitclone.before)
break
gitclone.prompt()
def InstallDefaultSoftware(self, handle):
"""
Install default software
parameters:
handle(input): current working handle
"""
print "Now Cleaning test environment"
handle.sendline("sudo apt-get install -y mininet")
handle.prompt()
handle.sendline("sudo pip install configobj")
handle.prompt()
handle.sendline("sudo apt-get install -y sshpass")
handle.prompt()
handle.sendline("OnosSystemTest/TestON/bin/cleanup.sh")
handle.prompt()
time.sleep(5)
self.loginfo.log('Clean environment success!')
def OnosPushKeys(self, handle, cmd, password):
"""
Using onos-push-keys to make ssh device without password
parameters:
handle(input): working handle
cmd(input): onos-push-keys xxx(xxx is device)
password(input): login in password
"""
print "Now Pushing Onos Keys:" + cmd
Pushkeys = handle
Pushkeys.sendline(cmd)
Result = 0
while Result != 2:
Result = Pushkeys.expect(["(yes/no)", "assword:", "PEXPECT]#",
pexpect.EOF, pexpect.TIMEOUT])
if(Result == 0):
Pushkeys.sendline("yes")
if(Result == 1):
Pushkeys.sendline(password)
if(Result == 2):
self.loginfo.log("ONOS Push keys Success!")
break
if(Result == 3):
self.loginfo.log("ONOS Push keys Error!")
break
time.sleep(2)
Pushkeys.prompt()
print "Done!"
def SetOnosEnvVar(self, handle, masterpass, agentpass):
"""
Setup onos pushkeys to all devices(3+2)
parameters:
handle(input): current working handle
masterpass: scripts running server's password
agentpass: onos cluster&compute node password
"""
print "Now Setting test environment"
for host in self.hosts:
print "try to connect " + str(host)
result = self.CheckSshNoPasswd(host)
if not result:
print ("ssh lgin failed,try to copy master publickey" +
"to agent " + str(host))
self.CopyPublicKey(host)
self.OnosPushKeys(handle, "onos-push-keys " + self.OCT, masterpass)
self.OnosPushKeys(handle, "onos-push-keys " + self.OC1, agentpass)
self.OnosPushKeys(handle, "onos-push-keys " + self.OC2, agentpass)
self.OnosPushKeys(handle, "onos-push-keys " + self.OC3, agentpass)
self.OnosPushKeys(handle, "onos-push-keys " + self.OCN, agentpass)
self.OnosPushKeys(handle, "onos-push-keys " + self.OCN2, agentpass)
def CheckSshNoPasswd(self, host):
"""
Check master can connect agent with no password
"""
login = pexpect.spawn("ssh " + str(host))
index = 4
while index == 4:
index = login.expect(['(yes/no)', '>|#|\$',
pexpect.EOF, pexpect.TIMEOUT])
if index == 0:
login.sendline("yes")
index = 4
if index == 1:
self.loginfo.log("ssh connect to " + str(host) +
" success,no need to copy ssh public key")
return True
login.interact()
return False
def ChangeOnosName(self, user, password):
"""
Change onos name in envDefault file
Because some command depend on this
parameters:
user: onos&compute node user
password: onos&compute node password
"""
print "Now Changing ONOS name&password"
filepath = self.home + '/onos/tools/build/envDefaults'
line = open(filepath, 'r').readlines()
lenall = len(line) - 1
for i in range(lenall):
if "ONOS_USER=" in line[i]:
line[i] = line[i].replace("sdn", user)
if "ONOS_GROUP" in line[i]:
line[i] = line[i].replace("sdn", user)
if "ONOS_PWD" in line[i]:
line[i] = line[i].replace("rocks", password)
NewFile = open(filepath, 'w')
NewFile.writelines(line)
NewFile.close
print "Done!"
def ChangeTestCasePara(self, testcase, user, password):
"""
When running test script, there's something need \
to change in every test folder's *.param & *.topo files
user: onos&compute node user
password: onos&compute node password
"""
print "Now Changing " + testcase + " name&password"
if self.masterusername == 'root':
filepath = '/root/'
else:
filepath = '/home/' + self.masterusername + '/'
filepath = (filepath + "OnosSystemTest/TestON/tests/" +
testcase + "/" + testcase + ".topo")
line = open(filepath, 'r').readlines()
lenall = len(line) - 1
for i in range(lenall - 2):
if("localhost" in line[i]) or ("OCT" in line[i]):
line[i + 1] = re.sub(">\w+", ">" + user, line[i + 1])
line[i + 2] = re.sub(">\w+", ">" + password, line[i + 2])
if ("OC1" in line[i] or "OC2" in line[i] or "OC3" in line[i] or
"OCN" in line[i] or "OCN2" in line[i]):
line[i + 1] = re.sub(">\w+", ">root", line[i + 1])
line[i + 2] = re.sub(">\w+", ">root", line[i + 2])
NewFile = open(filepath, 'w')
NewFile.writelines(line)
NewFile.close
def SSHlogin(self, ipaddr, username, password):
"""
SSH login provide a connection to destination.
parameters:
ipaddr: ip address
username: login user name
password: login password
return: handle
"""
login = pxssh.pxssh()
login.login(ipaddr, username, password, original_prompt='[$#>]')
# send command ls -l
login.sendline('ls -l')
# match prompt
login.prompt()
print("SSH login " + ipaddr + " success!")
return login
def SSHRelease(self, handle):
# Release ssh
handle.logout()
def CopyOnostoTestbin(self):
sourcefile = self.cipath + '/dependencies/onos'
destifile = self.home + '/onos/tools/test/bin/'
os.system('pwd')
runcommand = 'cp ' + sourcefile + ' ' + destifile
os.system(runcommand)
def CopyPublicKey(self, host):
output = os.popen('cat /root/.ssh/id_rsa.pub')
publickey = output.read().strip('\n')
tmphandle = self.SSHlogin(self.installer_master,
self.installer_master_username,
self.installer_master_password)
tmphandle.sendline("ssh " + host + " -T \'echo " +
str(publickey) + ">>/root/.ssh/authorized_keys\'")
tmphandle.prompt()
self.SSHRelease(tmphandle)
print "Add OCT PublicKey to " + host + " success"
def OnosEnvSetup(self, handle):
"""
Onos Environment Setup function
"""
self.Gensshkey(handle)
self.home = self.GetEnvValue(handle, 'HOME')
self.AddKnownHost(handle, self.OC1, "karaf", "karaf")
self.AddKnownHost(handle, self.OC2, "karaf", "karaf")
self.AddKnownHost(handle, self.OC3, "karaf", "karaf")
self.DownLoadCode(handle,
'https://github.com/sunyulin/OnosSystemTest.git')
# self.DownLoadCode(handle, 'https://gerrit.onosproject.org/onos')
if self.masterusername == 'root':
filepath = '/root/'
else:
filepath = '/home/' + self.masterusername + '/'
self.OnosRootPathChange(filepath)
self.CopyOnostoTestbin()
self.ChangeOnosName(self.agentusername, self.agentpassword)
self.InstallDefaultSoftware(handle)
self.SetOnosEnvVar(handle, self.masterpassword, self.agentpassword)
|