]>
git.ipfire.org Git - nitsi.git/blob - src/nitsi/machine.py
6 import xml
.etree
.ElementTree
as ET
9 from .serial_connection
import serial_connection
11 logger
= logging
.getLogger("nitsi.machine")
14 def __init__(self
, libvirt_con
, vm_xml_file
, snapshot_xml_file
, image
, root_uid
, username
, password
):
15 self
.log
= logger
.getChild(os
.path
.basename(vm_xml_file
))
16 self
.con
= libvirt_con
18 with
open(vm_xml_file
) as fobj
:
19 self
.vm_xml
= fobj
.read()
20 except FileNotFoundError
as error
:
21 logger
.error("No such file: {}".format(vm_xml_file
))
24 self
.name
= self
.get_name()
25 except BaseException
as error
:
26 logger
.error("Could not get name of the machine: {}".format(vm_xml_file
))
29 self
.log
= logger
.getChild(self
.name
)
30 self
.log
.debug("Name of this machine is {}".format(self
.name
))
33 with
open(snapshot_xml_file
) as fobj
:
34 self
.snapshot_xml
= fobj
.read()
35 except FileNotFoundError
as error
:
36 self
.log
.error("No such file: {}".format(snapshot_xml_file
))
40 if not os
.path
.isfile(self
.image
):
41 self
.log
.error("No such file: {}".format(self
.image
))
43 self
.root_uid
= root_uid
44 self
.disk
= disk(image
)
46 self
.username
= username
47 self
.password
= password
50 self
.dom
= self
.con
.defineXML(self
.vm_xml
)
52 self
.log
.error("Could not define VM")
56 if self
.dom
.create() < 0:
57 self
.log
.error("Could not start VM")
62 if self
.dom
.shutdown() < 0:
63 self
.log
.error("Could not shutdown VM")
66 self
.log
.error("Domain is not running")
71 def create_snapshot(self
):
73 self
.snapshot
= self
.dom
.snapshotCreateXML(self
.snapshot_xml
)
76 self
.log
.error("Could not create snapshot")
79 def revert_snapshot(self
):
80 self
.dom
.revertToSnapshot(self
.snapshot
)
81 self
.snapshot
.delete()
85 state
, reason
= self
.dom
.state()
87 if state
== libvirt
.VIR_DOMAIN_RUNNING
:
92 def get_serial_device(self
):
94 if not self
.is_running():
97 xml_root
= ET
.fromstring(self
.dom
.XMLDesc(0))
99 elem
= xml_root
.find("./devices/serial/source")
100 return elem
.get("path")
103 xml_root
= ET
.fromstring(self
.vm_xml
)
105 elem
= xml_root
.find("./name")
108 def check_is_booted_up(self
):
109 serial_con
= serial_connection(self
.get_serial_device())
111 serial_con
.write("\n")
112 # This will block till the domain is booted up
117 def login(self
, log_file
, log_start_time
=None, longest_machine_name
=10):
119 self
.serial_con
= serial_connection(self
.get_serial_device(),
120 username
=self
.username
,
122 log_start_time
=log_start_time
,
124 longest_machine_name
=longest_machine_name
)
125 self
.serial_con
.login(self
.password
)
126 except BaseException
as e
:
127 self
.log
.error("Could not connect to the domain via serial console")
128 self
.log
.exception(e
)
132 return self
.serial_con
.command(cmd
)
134 def copy_in(self
, fr
, to
):
136 self
.disk
.mount(self
.root_uid
, "/")
137 self
.disk
.copy_in(fr
, to
)
138 except BaseException
as e
:
141 self
.disk
.umount("/")