X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Ftopo_installation.py;h=3e3fda864ee7aafd1954934472f69ce93351750e;hp=7fb60aca1507636a52cd0e24bada96e419c664df;hb=4bda4f8b55b0d431b514663e8e90fccd97ad31d4;hpb=4ae37074a3e74bd6fdcd606d1553b99131372c84 diff --git a/resources/tools/topo_installation.py b/resources/tools/topo_installation.py index 7fb60aca15..3e3fda864e 100755 --- a/resources/tools/topo_installation.py +++ b/resources/tools/topo_installation.py @@ -22,36 +22,125 @@ from yaml import load from resources.libraries.python.ssh import SSH +def ssh_no_error(ssh, cmd, sudo=False): + """Execute a command over ssh channel, and log and exit if the command + fails. + + :param ssh: SSH() object connected to a node. + :param cmd: Command line to execute on remote node. + :type ssh: SSH() object + :type cmd: str + :return: stdout from the SSH command. + :rtype: str + """ + + if sudo: + ret, stdo, stde = ssh.exec_command_sudo(cmd) + else: + ret, stdo, stde = ssh.exec_command(cmd) + + if ret != 0: + print 'Command execution failed: "{}"'.format(cmd) + print 'stdout: {0}'.format(stdo) + print 'stderr: {0}'.format(stde) + raise RuntimeError('Unexpected ssh command failure') + + return stdo + +def ssh_ignore_error(ssh, cmd, sudo=False): + """Execute a command over ssh channel, ignore errors. + + :param ssh: SSH() object connected to a node. + :param cmd: Command line to execute on remote node. + :type ssh: SSH() object + :type cmd: str + :return: stdout from the SSH command. + :rtype: str + """ + + if sudo: + ret, stdo, stde = ssh.exec_command_sudo(cmd) + else: + ret, stdo, stde = ssh.exec_command(cmd) + + if ret != 0: + print 'Command execution failed: "{}"'.format(cmd) + print 'stdout: {0}'.format(stdo) + print 'stderr: {0}'.format(stde) + + return stdo + def main(): + """Copy and installation of VPP packages.""" + parser = argparse.ArgumentParser() parser.add_argument("-t", "--topo", required=True, help="Topology file") parser.add_argument("-d", "--directory", required=True, help="Installation directory") - parser.add_argument("-p", "--packages", required=True, nargs='+', + parser.add_argument("-p", "--packages", required=False, nargs='+', help="Packages paths to copy") + parser.add_argument("-c", "--cancel", help="Cancel installation", + action="store_true") args = parser.parse_args() topology_file = args.topo packages = args.packages install_dir = args.directory + cancel_installation = args.cancel work_file = open(topology_file) topology = load(work_file.read())['nodes'] + ssh = SSH() for node in topology: if topology[node]['type'] == "DUT": - ssh = SSH() + print "###TI host: {}".format(topology[node]['host']) ssh.connect(topology[node]) - # Copy packages from local path to installation dir - for deb in packages: - ssh.scp(local_path=deb,remote_path=install_dir) + if cancel_installation: + # Remove installation directory on DUT + cmd = "rm -r {}".format(install_dir) + stdout = ssh_ignore_error(ssh, cmd) + print "###TI {}".format(stdout) + + cmd = "dpkg -l | grep vpp" + ret, _, _ = ssh.exec_command(cmd) + if ret == 0: + # Try to fix interrupted installations + cmd = 'dpkg --configure -a' + stdout = ssh_no_error(ssh, cmd, sudo=True) + print "###TI {}".format(stdout) + # Try to remove installed vpp.* packages + cmd = 'apt-get purge -y "vpp.*"' + stdout = ssh_no_error(ssh, cmd, sudo=True) + print "###TI {}".format(stdout) + else: + # Create installation directory on DUT + cmd = "mkdir {}".format(install_dir) + stdout = ssh_no_error(ssh, cmd) + print "###TI {}".format(stdout) + + # Copy packages from local path to installation dir + for deb in packages: + print "###TI scp: {}".format(deb) + ssh.scp(local_path=deb, remote_path=install_dir) + + cmd = "dpkg -l | grep vpp" + ret, _, _ = ssh.exec_command(cmd) + if ret == 0: + # Try to fix interrupted installations + cmd = 'dpkg --configure -a' + stdout = ssh_no_error(ssh, cmd, sudo=True) + print "###TI {}".format(stdout) + # Try to remove installed vpp.* packages + cmd = 'apt-get purge -y "vpp.*"' + stdout = ssh_no_error(ssh, cmd, sudo=True) + print "###TI {}".format(stdout) - # Installation of VPP deb packages - ret, _, err = ssh.exec_command("dpkg -i {}*.deb".format(install_dir)) - if ret != 0: - print("Installation unsuccessful:\n{}".format(err)) - return ret + # Installation of VPP deb packages + cmd = "dpkg -i --force-all {}/*.deb".format(install_dir) + stdout = ssh_no_error(ssh, cmd, sudo=True) + print "###TI {}".format(stdout) if __name__ == "__main__": sys.exit(main())