]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/python3 | |
2 | ||
3 | ||
4 | import libvirt | |
5 | ||
6 | import os | |
7 | ||
8 | import configparser | |
9 | ||
10 | import time | |
11 | ||
12 | from nitsi.virtual_environ import virtual_environ | |
13 | from nitsi.recipe import recipe | |
14 | ||
15 | import logging | |
16 | ||
17 | logger = logging.getLogger("nitsi.test") | |
18 | ||
19 | ||
20 | class TestException(Exception): | |
21 | def __init__(self, message): | |
22 | self.message = message | |
23 | ||
24 | class test(): | |
25 | def __init__(self, path, log_path): | |
26 | try: | |
27 | self.path = os.path.abspath(path) | |
28 | self.log = logger.getChild(os.path.basename(self.path)) | |
29 | except BaseException as e: | |
30 | logger.error("Could not get absolute path") | |
31 | ||
32 | self.log.debug("Path of this test is: {}".format(self.path)) | |
33 | ||
34 | self.log_path = log_path | |
35 | ||
36 | self.settings_file = "{}/settings".format(self.path) | |
37 | if not os.path.isfile(self.settings_file): | |
38 | self.log.error("No such file: {}".format(self.settings_file)) | |
39 | ||
40 | self.recipe_file = "{}/recipe".format(self.path) | |
41 | if not os.path.isfile(self.recipe_file): | |
42 | self.log.error("No such file: {}".format(self.recipe_file)) | |
43 | ||
44 | def read_settings(self): | |
45 | self.config = configparser.ConfigParser() | |
46 | self.config.read(self.settings_file) | |
47 | self.name = self.config["DEFAULT"]["Name"] | |
48 | self.description = self.config["DEFAULT"]["Description"] | |
49 | self.copy_to = self.config["DEFAULT"]["Copy_to"] | |
50 | self.copy_from = self.config["DEFAULT"]["Copy_from"] | |
51 | self.copy_from = self.copy_from.split(",") | |
52 | ||
53 | tmp = [] | |
54 | for file in self.copy_from: | |
55 | file = file.strip() | |
56 | file = os.path.normpath(self.path + "/" + file) | |
57 | tmp.append(file) | |
58 | ||
59 | self.copy_from = tmp | |
60 | ||
61 | self.virtual_environ_name = self.config["VIRTUAL_ENVIRONMENT"]["Name"] | |
62 | self.virtual_environ_path = self.config["VIRTUAL_ENVIRONMENT"]["Path"] | |
63 | self.virtual_environ_path = os.path.normpath(self.path + "/" + self.virtual_environ_path) | |
64 | ||
65 | def virtual_environ_setup(self): | |
66 | self.virtual_environ = virtual_environ(self.virtual_environ_path) | |
67 | ||
68 | self.virtual_networks = self.virtual_environ.get_networks() | |
69 | ||
70 | self.virtual_machines = self.virtual_environ.get_machines() | |
71 | ||
72 | def virtual_environ_start(self): | |
73 | for name in self.virtual_environ.network_names: | |
74 | self.virtual_networks[name].define() | |
75 | self.virtual_networks[name].start() | |
76 | ||
77 | for name in self.virtual_environ.machine_names: | |
78 | self.virtual_machines[name].define() | |
79 | self.virtual_machines[name].create_snapshot() | |
80 | self.virtual_machines[name].copy_in(self.copy_from, self.copy_to) | |
81 | self.virtual_machines[name].start() | |
82 | ||
83 | # Time to which all serial output log entries are relativ | |
84 | log_start_time = time.time() | |
85 | ||
86 | # Number of chars of the longest machine name | |
87 | longest_machine_name = self.virtual_environ.longest_machine_name | |
88 | ||
89 | self.log.debug("Try to login on all machines") | |
90 | for name in self.virtual_environ.machine_names: | |
91 | self.log.debug("Try to login on {}".format(name)) | |
92 | self.virtual_machines[name].login("{}/test.log".format(self.log_path), | |
93 | log_start_time=log_start_time, | |
94 | longest_machine_name=longest_machine_name) | |
95 | ||
96 | def load_recipe(self): | |
97 | self.log.info("Going to load the recipe") | |
98 | try: | |
99 | self.recipe = recipe(self.recipe_file) | |
100 | for line in self.recipe.recipe: | |
101 | self.log.debug(line) | |
102 | ||
103 | self.log.debug("This was the recipe") | |
104 | except BaseException as e: | |
105 | self.log.error("Failed to load recipe") | |
106 | raise e | |
107 | ||
108 | def run_recipe(self): | |
109 | for line in self.recipe.recipe: | |
110 | return_value = self.virtual_machines[line[0]].cmd(line[2]) | |
111 | self.log.debug("Return value is: {}".format(return_value)) | |
112 | if return_value != "0" and line[1] == "": | |
113 | raise TestException("Failed to execute command '{}' on {}, return code: {}".format(line[2],line[0], return_value)) | |
114 | elif return_value == "0" and line[1] == "!": | |
115 | raise TestException("Succeded to execute command '{}' on {}, return code: {}".format(line[2],line[0],return_value)) | |
116 | else: | |
117 | self.log.debug("Command '{}' on {} returned with: {}".format(line[2],line[0],return_value)) | |
118 | ||
119 | def virtual_environ_stop(self): | |
120 | for name in self.virtual_environ.machine_names: | |
121 | self.virtual_machines[name].shutdown() | |
122 | self.virtual_machines[name].revert_snapshot() | |
123 | self.virtual_machines[name].undefine() | |
124 | ||
125 | for name in self.virtual_environ.network_names: | |
126 | self.virtual_networks[name].undefine() | |
127 | ||
128 | ||
129 |