X-Git-Url: http://git.ipfire.org/?p=nitsi.git;a=blobdiff_plain;f=src%2Fnitsi%2Ftest.py;h=1b880d251b7c19587ceb5891a51f5750f7d48886;hp=f67ceb5e29b1d7da1cea9fc2437d13591a78dfac;hb=7940bc86b04f421ecc5b0e25602af15a829c9c73;hpb=d7036f7be6c18710e7aa39efae7b366c98d11665 diff --git a/src/nitsi/test.py b/src/nitsi/test.py index f67ceb5..1b880d2 100755 --- a/src/nitsi/test.py +++ b/src/nitsi/test.py @@ -1,18 +1,20 @@ #!/usr/bin/python3 - +import configparser import libvirt - +import logging import os +import time -import configparser +from . import recipe +from . import virtual_environ -from nitsi.virtual_environ import virtual_environ -from nitsi.recipe import recipe +logger = logging.getLogger("nitsi.test") -import logging -logger = logging.getLogger("nitsi.test") +class TestException(Exception): + def __init__(self, message): + self.message = message class test(): def __init__(self, path, log_path): @@ -21,9 +23,12 @@ class test(): self.log = logger.getChild(os.path.basename(self.path)) except BaseException as e: logger.error("Could not get absolute path") + raise e self.log.debug("Path of this test is: {}".format(self.path)) + self.log_path = log_path + self.settings_file = "{}/settings".format(self.path) if not os.path.isfile(self.settings_file): self.log.error("No such file: {}".format(self.settings_file)) @@ -35,26 +40,37 @@ class test(): def read_settings(self): self.config = configparser.ConfigParser() self.config.read(self.settings_file) - self.name = self.config["DEFAULT"]["Name"] - self.description = self.config["DEFAULT"]["Description"] - self.copy_to = self.config["DEFAULT"]["Copy_to"] - self.copy_from = self.config["DEFAULT"]["Copy_from"] + self.name = self.config["DEFAULT"]["name"] + self.description = self.config["DEFAULT"]["description"] + self.copy_to = self.config["DEFAULT"]["copy_to"] + self.copy_from = self.config["DEFAULT"]["copy_from"] self.copy_from = self.copy_from.split(",") tmp = [] for file in self.copy_from: file = file.strip() - file = os.path.normpath(self.path + "/" + file) - tmp.append(file) + # If file is empty we do not want to add it to the list + if not file == "": + # If we get an absolut path we do nothing + # If not we add self.path to get an absolut path + if not os.path.isabs(file): + file = os.path.normpath(self.path + "/" + file) + + # We need to check if file is a valid file or dir + if not (os.path.isdir(file) or os.path.isfile(file)): + raise TestException("'{}' is not a valid file nor a valid directory".format(file)) + + self.log.debug("'{}' will be copied into all images".format(file)) + tmp.append(file) self.copy_from = tmp - self.virtual_environ_name = self.config["VIRTUAL_ENVIRONMENT"]["Name"] - self.virtual_environ_path = self.config["VIRTUAL_ENVIRONMENT"]["Path"] + self.virtual_environ_name = self.config["VIRTUAL_ENVIRONMENT"]["name"] + self.virtual_environ_path = self.config["VIRTUAL_ENVIRONMENT"]["path"] self.virtual_environ_path = os.path.normpath(self.path + "/" + self.virtual_environ_path) def virtual_environ_setup(self): - self.virtual_environ = virtual_environ(self.virtual_environ_path) + self.virtual_environ = virtual_environ.virtual_environ(self.virtual_environ_path) self.virtual_networks = self.virtual_environ.get_networks() @@ -71,15 +87,23 @@ class test(): self.virtual_machines[name].copy_in(self.copy_from, self.copy_to) self.virtual_machines[name].start() - self.log.debug("Try to login on all machines") + # Time to which all serial output log entries are relativ + log_start_time = time.time() + + # Number of chars of the longest machine name + longest_machine_name = self.virtual_environ.longest_machine_name + + self.log.info("Try to login on all machines") for name in self.virtual_environ.machine_names: - self.log.debug("Try to login on {}".format(name)) - self.virtual_machines[name].login() + self.log.info("Try to login on {}".format(name)) + self.virtual_machines[name].login("{}/test.log".format(self.log_path), + log_start_time=log_start_time, + longest_machine_name=longest_machine_name) def load_recipe(self): self.log.info("Going to load the recipe") try: - self.recipe = recipe(self.recipe_file) + self.recipe = recipe.recipe(self.recipe_file, machines=self.virtual_environ.machine_names) for line in self.recipe.recipe: self.log.debug(line) @@ -93,22 +117,26 @@ class test(): return_value = self.virtual_machines[line[0]].cmd(line[2]) self.log.debug("Return value is: {}".format(return_value)) if return_value != "0" and line[1] == "": - self.log.error("Failed to execute command '{}' on {}, return code: {}".format(line[2],line[0], return_value)) - return False + raise TestException("Failed to execute command '{}' on {}, return code: {}".format(line[2],line[0], return_value)) elif return_value == "0" and line[1] == "!": - self.log.error("Succeded to execute command '{}' on {}, return code: {}".format(line[2],line[0],return_value)) - return False + raise TestException("Succeded to execute command '{}' on {}, return code: {}".format(line[2],line[0],return_value)) else: self.log.debug("Command '{}' on {} returned with: {}".format(line[2],line[0],return_value)) def virtual_environ_stop(self): for name in self.virtual_environ.machine_names: - self.virtual_machines[name].shutdown() - self.virtual_machines[name].revert_snapshot() - self.virtual_machines[name].undefine() + # We just catch exception here to avoid + # that we stop the cleanup process if only one command fails + try: + self.virtual_machines[name].shutdown() + self.virtual_machines[name].revert_snapshot() + self.virtual_machines[name].undefine() + except BaseException as e: + self.log.exception(e) for name in self.virtual_environ.network_names: - self.virtual_networks[name].undefine() - - + try: + self.virtual_networks[name].undefine() + except BaseException as e: + self.log.exception(e)