From f5a1d81c2f3c532543b6cd6a457942dbf610f5f3 Mon Sep 17 00:00:00 2001 From: sharath Date: Fri, 26 Oct 2018 11:51:45 +0530 Subject: [PATCH] Adding DMM build artifacts Change-Id: Ia5153d8e716d506c85ec8b723331438efd66ab6a Signed-off-by: sharath --- bootstrap-DMM.sh | 15 ++++++++++ resources/libraries/python/DMM/SingleCliSer.py | 41 ++++++++++++++++++++++++++ resources/libraries/python/ssh.py | 11 +++++-- tests/dmm/func/__init__.robot | 2 ++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/bootstrap-DMM.sh b/bootstrap-DMM.sh index 4828868d84..7117205f10 100755 --- a/bootstrap-DMM.sh +++ b/bootstrap-DMM.sh @@ -17,6 +17,12 @@ set -x cat /etc/hostname cat /etc/hosts +JOB_ARCHIVE_ARTIFACTS=(log.html output.xml report.html *.log) +LOG_ARCHIVE_ARTIFACTS=(log.html output.xml report.html *.log) +JOB_ARCHIVE_DIR="archive" +LOG_ARCHIVE_DIR="$WORKSPACE/archives" +mkdir -p ${JOB_ARCHIVE_DIR} +mkdir -p ${LOG_ARCHIVE_DIR} SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" export PYTHONPATH=${SCRIPT_DIR} @@ -427,6 +433,15 @@ rebot --noncritical EXPECTED_FAILING \ # Remove unnecessary log files rm -f ${partial_logs} +# Archive JOB artifacts in jenkins +for i in ${JOB_ARCHIVE_ARTIFACTS[@]}; do + cp $( readlink -f ${i} | tr '\n' ' ' ) ${JOB_ARCHIVE_DIR}/ +done +# Archive JOB artifacts to logs.fd.io +for i in ${LOG_ARCHIVE_ARTIFACTS[@]}; do + cp $( readlink -f ${i} | tr '\n' ' ' ) ${LOG_ARCHIVE_DIR}/ +done + echo Post-processing finished. if [ ${RC} -eq 0 ]; then diff --git a/resources/libraries/python/DMM/SingleCliSer.py b/resources/libraries/python/DMM/SingleCliSer.py index 89ac10f923..8d7b648ea4 100644 --- a/resources/libraries/python/DMM/SingleCliSer.py +++ b/resources/libraries/python/DMM/SingleCliSer.py @@ -20,6 +20,7 @@ import time import os import glob +from resources.libraries.python.ssh import SSH from resources.libraries.python.ssh import exec_cmd, exec_cmd_no_error from resources.libraries.python.DMM.DMMConstants import DMMConstants as con from resources.libraries.python.topology import Topology @@ -167,6 +168,12 @@ class SingleCliSer(object): cmd = 'cd {0}/{1} && ./{2} log 1'\ .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name) exec_cmd(dut2_node, cmd) + cmd = 'mv /var/log/nStack/running.log /var/log/nStack/{0}_ser.log'\ + .format(script_name) + exec_cmd(dut1_node, cmd, sudo=True) + cmd = 'mv /var/log/nStack/running.log /var/log/nStack/{0}_cli.log'\ + .format(script_name) + exec_cmd(dut2_node, cmd, sudo=True) @staticmethod def cleanup_dmm_dut(dut1_node, dut2_node, script_name): @@ -255,3 +262,37 @@ class SingleCliSer(object): (stdout, _) = exec_cmd_no_error(dut_node, cmd) interface_name = stdout.split(' ', 1)[0] return interface_name + + @staticmethod + def get_logs_from_node(dut_node): + """ + Get logs from node to the test executor machine. + + :param dut_node: Node to artifact the logs of. + :type dut_node: dict + """ + ssh = SSH() + ssh.connect(dut_node) + ssh.scp(".", '/var/log/nStack/*.log', + get=True, timeout=60, wildcard=True) + + (ret, _, _) = exec_cmd(dut_node, 'ls -l /var/log/app*.log') + if ret == 0: + ssh.scp(".", '/var/log/app*.log', + get=True, timeout=60, wildcard=True) + + exec_cmd(dut_node, 'rm -rf /var/log/nStack/*.log', sudo=True) + exec_cmd(dut_node, 'rm -rf /var/log/app*.log', sudo=True) + + @staticmethod + def archive_dmm_logs(dut1_node, dut2_node): + """ + Get logs from both DUT's to the test executor machine. + + :param dut1_node: DUT1 node. + :param dut2_node: DUT2 node. + :type dut1_node: dict + :type dut2_node: dict + """ + SingleCliSer.get_logs_from_node(dut1_node) + SingleCliSer.get_logs_from_node(dut2_node) diff --git a/resources/libraries/python/ssh.py b/resources/libraries/python/ssh.py index 4bcfe6591f..108c1e4e1e 100644 --- a/resources/libraries/python/ssh.py +++ b/resources/libraries/python/ssh.py @@ -324,7 +324,8 @@ class SSH(object): """ chan.close() - def scp(self, local_path, remote_path, get=False, timeout=30): + def scp(self, local_path, remote_path, get=False, timeout=30, + wildcard=False): """Copy files from local_path to remote_path or vice versa. connect() method has to be called first! @@ -335,10 +336,12 @@ class SSH(object): path to remote file which should be downloaded. :param get: scp operation to perform. Default is put. :param timeout: Timeout value in seconds. + :param wildcard: If path has wildcard characters. Default is false. :type local_path: str :type remote_path: str :type get: bool :type timeout: int + :type wildcard: bool """ if not get: logger.trace('SCP {0} to {1}:{2}'.format( @@ -349,7 +352,11 @@ class SSH(object): self._ssh.get_transport().getpeername(), remote_path, local_path)) # SCPCLient takes a paramiko transport as its only argument - scp = SCPClient(self._ssh.get_transport(), socket_timeout=timeout) + if not wildcard: + scp = SCPClient(self._ssh.get_transport(), socket_timeout=timeout) + else: + scp = SCPClient(self._ssh.get_transport(), sanitize=lambda x: x, + socket_timeout=timeout) start = time() if not get: scp.put(local_path, remote_path) diff --git a/tests/dmm/func/__init__.robot b/tests/dmm/func/__init__.robot index 3215dc87f9..65e2879d16 100644 --- a/tests/dmm/func/__init__.robot +++ b/tests/dmm/func/__init__.robot @@ -15,4 +15,6 @@ | Resource | resources/libraries/robot/shared/default.robot | Resource | resources/libraries/robot/shared/interfaces.robot | Library | resources.libraries.python.DMM.SetupDMMTest +| Library | resources.libraries.python.DMM.SingleCliSer | Suite Setup | Setup DMM Test | ${nodes} +| Suite Teardown | Archive DMM logs | ${nodes['DUT1']} | ${nodes['DUT2']} \ No newline at end of file -- 2.16.6