""" 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 pexpect import pxssh import re import os import sys import time from connection import Connection import functest.utils.functest_logger as ft_logger class Environment(Connection): logger = ft_logger.Logger("environment").getLogger() 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 """ self.logger.info("Now loading test codes! Please wait in patient...") originalfolder = sys.path[0] self.logger.info(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 """ self.logger.info("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 """ self.logger.info("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() self.logger.info("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 """ self.logger.info("Now Setting test environment") for host in self.hosts: self.logger.info("try to connect " + str(host)) result = self.CheckSshNoPasswd(host) if not result: self.logger.info( "ssh login 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 """ self.logger.info("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 self.logger.info("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 """ self.logger.info("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() self.logger.info("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) self.logger.info("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/wuwenbin2/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)