X-Git-Url: http://git.ipfire.org/?p=nitsi.git;a=blobdiff_plain;f=src%2Fnitsi%2Fmachine.py;h=3e97ecff1bce985fd96a930a81984b34a870d1ab;hp=0d790ae0eab5be5c4f5ba059daee6aeab47dca0c;hb=5499746ce7c6eed129053b7b3799de93b8419966;hpb=61bf2ba3cacd8f1a46f7550e5ba070d7e643f338 diff --git a/src/nitsi/machine.py b/src/nitsi/machine.py index 0d790ae..3e97ecf 100644 --- a/src/nitsi/machine.py +++ b/src/nitsi/machine.py @@ -1,15 +1,12 @@ #!/usr/bin/python3 -import xml.etree.ElementTree as ET - -from nitsi.disk import disk - -from nitsi.serial_connection import serial_connection - -import os import libvirt - import logging +import os +import xml.etree.ElementTree as ET + +from . import disk +from . import serial_connection logger = logging.getLogger("nitsi.machine") @@ -17,6 +14,12 @@ class machine(): def __init__(self, libvirt_con, vm_xml_file, snapshot_xml_file, image, root_uid, username, password): self.log = logger.getChild(os.path.basename(vm_xml_file)) self.con = libvirt_con + # self.dom should be always defined + self.dom = None + # self.snapshot should be also at least None + self.snapshot = None + + try: with open(vm_xml_file) as fobj: self.vm_xml = fobj.read() @@ -44,46 +47,62 @@ class machine(): self.log.error("No such file: {}".format(self.image)) self.root_uid = root_uid - self.disk = disk(image) + self.disk = disk.disk(image) self.username = username self.password = password def define(self): + self.log.info("Defining virtual machine") self.dom = self.con.defineXML(self.vm_xml) if self.dom == None: self.log.error("Could not define VM") raise BaseException def start(self): + self.log.info("Starting virtual machine") if self.dom.create() < 0: self.log.error("Could not start VM") raise BaseException def shutdown(self): if self.is_running(): + self.log.info("Shutting down virtual machine") if self.dom.shutdown() < 0: self.log.error("Could not shutdown VM") raise BaseException else: - self.log.error("Domain is not running") + self.log.warn("Cannot shutdown a not running domain") def undefine(self): - self.dom.undefine() + # We cannot undefine a not defined dom object + if self.dom != None: + self.log.info("Undefining virtual machine") + self.dom.undefine() + else: + self.log.warn("Cannot undefine a not defined domain") def create_snapshot(self): - + self.log.info("Creating snapshot of virtual machine") self.snapshot = self.dom.snapshotCreateXML(self.snapshot_xml) - if not self.snapshot: + if self.snapshot == None: self.log.error("Could not create snapshot") raise BaseException def revert_snapshot(self): - self.dom.revertToSnapshot(self.snapshot) - self.snapshot.delete() + if self.snapshot != None: + self.log.info("Reverting snapshot") + self.dom.revertToSnapshot(self.snapshot) + self.log.info("Deleting snapshot") + self.snapshot.delete() + else: + self.log.warn("No active snapshot. Cannot revert and delete snapshot") def is_running(self): + # Only if we have a valid dom object we can check the dom state + if self.dom == None: + return False state, reason = self.dom.state() @@ -109,7 +128,7 @@ class machine(): return elem.text def check_is_booted_up(self): - serial_con = serial_connection(self.get_serial_device()) + serial_con = serial_connection.serial_connection(self.get_serial_device()) serial_con.write("\n") # This will block till the domain is booted up @@ -117,9 +136,14 @@ class machine(): #serial_con.close() - def login(self): + def login(self, log_file, log_start_time=None, longest_machine_name=10): try: - self.serial_con = serial_connection(self.get_serial_device(), username=self.username) + self.serial_con = serial_connection.serial_connection(self.get_serial_device(), + username=self.username, + log_file=log_file, + log_start_time=log_start_time, + name=self.name, + longest_machine_name=longest_machine_name) self.serial_con.login(self.password) except BaseException as e: self.log.error("Could not connect to the domain via serial console") @@ -137,4 +161,4 @@ class machine(): self.log.error(e) finally: self.disk.umount("/") - self.disk.close() \ No newline at end of file + self.disk.close()