X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FVatExecutor.py;h=bbce83d1add0896e0170146243c67599da19d9cc;hp=f0e28a1ae1efae4677a4c6d316c54868db3a57d2;hb=cf561a6e3d4c4fbd78ab6c9d0a9aa817bb3300fc;hpb=8c12ff59f1a5e750151f5eb0e806dcc80e91c3c2 diff --git a/resources/libraries/python/VatExecutor.py b/resources/libraries/python/VatExecutor.py index f0e28a1ae1..bbce83d1ad 100644 --- a/resources/libraries/python/VatExecutor.py +++ b/resources/libraries/python/VatExecutor.py @@ -11,6 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""VAT executor library.""" + import json from robot.api import logger @@ -28,7 +30,7 @@ def cleanup_vat_json_output(json_output): Clean up VAT JSON output from clutter like vat# prompts and such. :param json_output: Cluttered JSON output. - :return: Cleaned up output JSON string. + :returns: Cleaned up output JSON string. """ retval = json_output @@ -39,6 +41,7 @@ def cleanup_vat_json_output(json_output): class VatExecutor(object): + """Contains methods for executing VAT commands on DUTs.""" def __init__(self): self._stdout = None self._stderr = None @@ -62,7 +65,7 @@ class VatExecutor(object): Constants.RESOURCES_TPL_VAT, vat_name) # TODO this overwrites the output if the vat script has been used twice - remote_file_out = remote_file_path + ".out" + # remote_file_out = remote_file_path + ".out" cmd = "sudo -S {vat} {json} < {input}".format( vat=Constants.VAT_BIN_NAME, @@ -81,17 +84,29 @@ class VatExecutor(object): # self._delete_files(node, remote_file_path, remote_file_out) def execute_script_json_out(self, vat_name, node, timeout=10): + """Pass all arguments to 'execute_script' method, then cleanup returned + json output.""" self.execute_script(vat_name, node, timeout, json_out=True) self._stdout = cleanup_vat_json_output(self._stdout) @staticmethod def _delete_files(node, *files): + """Use SSH to delete the specified files on node. + + :param node: Node in topology. + :param files: Files to delete. + :type node: dict + :type files: iterable + """ + ssh = SSH() ssh.connect(node) files = " ".join([str(x) for x in files]) ssh.exec_command("rm {0}".format(files)) def script_should_have_failed(self): + """Read return code from last executed script and raise exception if the + script didn't fail.""" if self._ret_code is None: raise Exception("First execute the script!") if self._ret_code == 0: @@ -99,6 +114,8 @@ class VatExecutor(object): "Script execution passed, but failure was expected") def script_should_have_passed(self): + """Read return code from last executed script and raise exception if the + script failed.""" if self._ret_code is None: raise Exception("First execute the script!") if self._ret_code != 0: @@ -106,9 +123,11 @@ class VatExecutor(object): "Script execution failed, but success was expected") def get_script_stdout(self): + """Returns value of stdout from last executed script.""" return self._stdout def get_script_stderr(self): + """Returns value of stderr from last executed script.""" return self._stderr @staticmethod @@ -150,6 +169,7 @@ class VatTerminal(object): self._tty, 'sudo -S {}{}'.format(Constants.VAT_BIN_NAME, json_text), self.__VAT_PROMPT) + self._exec_failure = False def __enter__(self): return self @@ -166,9 +186,13 @@ class VatTerminal(object): None if not in JSON mode. """ logger.debug("Executing command in VAT terminal: {}".format(cmd)) - out = self._ssh.interactive_terminal_exec_command(self._tty, - cmd, - self.__VAT_PROMPT) + try: + out = self._ssh.interactive_terminal_exec_command(self._tty, cmd, + self.__VAT_PROMPT) + except: + self._exec_failure = True + raise + logger.debug("VAT output: {}".format(out)) if self.json: obj_start = out.find('{') @@ -176,10 +200,10 @@ class VatTerminal(object): array_start = out.find('[') array_end = out.rfind(']') - if -1 == obj_start and -1 == array_start: - raise RuntimeError("No JSON data.") + if obj_start == -1 and array_start == -1: + raise RuntimeError("VAT: no JSON data.") - if obj_start < array_start or -1 == array_start: + if obj_start < array_start or array_start == -1: start = obj_start end = obj_end + 1 else: @@ -193,9 +217,11 @@ class VatTerminal(object): def vat_terminal_close(self): """Close VAT terminal.""" - self._ssh.interactive_terminal_exec_command(self._tty, - 'quit', - self.__LINUX_PROMPT) + #interactive terminal is dead, we only need to close session + if not self._exec_failure: + self._ssh.interactive_terminal_exec_command(self._tty, + 'quit', + self.__LINUX_PROMPT) self._ssh.interactive_terminal_close(self._tty) def vat_terminal_exec_cmd_from_template(self, vat_template_file, **args):