Compare commits
3 commits
ceee1908a4
...
9d383e3fd9
Author | SHA1 | Date | |
---|---|---|---|
Théophile Bastian | 9d383e3fd9 | ||
Théophile Bastian | abe5fc6972 | ||
Théophile Bastian | 4e39260232 |
|
@ -201,6 +201,17 @@ class Container(util.LibvirtObject):
|
||||||
|
|
||||||
self.lxc_container = self.conn.createXML(xml)
|
self.lxc_container = self.conn.createXML(xml)
|
||||||
|
|
||||||
|
def notify_cleanup(self):
|
||||||
|
""" This method can be called before `cleanup` to notify the host that a
|
||||||
|
cleanup will be performed soon, speeding the process up. """
|
||||||
|
if self.lxc_container:
|
||||||
|
try:
|
||||||
|
self.lxc_container.shutdown()
|
||||||
|
except libvirt.libvirtError as exn:
|
||||||
|
if not str(exn).startswith("Domain not found:"):
|
||||||
|
raise exn
|
||||||
|
# Else, the machine was already stopped: everything is fine
|
||||||
|
|
||||||
def cleanup(self):
|
def cleanup(self):
|
||||||
if self.lxc_container:
|
if self.lxc_container:
|
||||||
try:
|
try:
|
||||||
|
@ -210,6 +221,10 @@ class Container(util.LibvirtObject):
|
||||||
raise exn
|
raise exn
|
||||||
# Else, the machine was already stopped: everything is fine
|
# Else, the machine was already stopped: everything is fine
|
||||||
self.lxc_container = None
|
self.lxc_container = None
|
||||||
|
if self.overlay_root:
|
||||||
|
self.overlay_root.cleanup_mount()
|
||||||
|
self.overlay_root.overlay_temp_dir.cleanup()
|
||||||
|
self.overlay_root = None
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.create()
|
self.create()
|
||||||
|
|
|
@ -52,8 +52,8 @@ class Topology:
|
||||||
self.conn = conn
|
self.conn = conn
|
||||||
self.parsed = False
|
self.parsed = False
|
||||||
|
|
||||||
self.domains = None
|
self.domains = []
|
||||||
self.links = None
|
self.links = []
|
||||||
|
|
||||||
@requires_parsed
|
@requires_parsed
|
||||||
@requires_id_in_link_range
|
@requires_id_in_link_range
|
||||||
|
@ -159,6 +159,10 @@ class Topology:
|
||||||
print("{} domains: ".format("Starting" if state else "Stopping"), end="\t")
|
print("{} domains: ".format("Starting" if state else "Stopping"), end="\t")
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
if state is False:
|
||||||
|
for dom in self.domains:
|
||||||
|
dom.notify_cleanup()
|
||||||
|
|
||||||
for dom_id in range(len(self.domains)):
|
for dom_id in range(len(self.domains)):
|
||||||
self.dom_setstate_single(dom_id, state, verbose, verbose_inline=True)
|
self.dom_setstate_single(dom_id, state, verbose, verbose_inline=True)
|
||||||
|
|
||||||
|
|
|
@ -149,3 +149,14 @@ def run_in_executor(f):
|
||||||
return loop.run_in_executor(None, functools.partial(f, *args, **kwargs))
|
return loop.run_in_executor(None, functools.partial(f, *args, **kwargs))
|
||||||
|
|
||||||
return inner
|
return inner
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_sudo_rights():
|
||||||
|
""" Updates sudo credentials to ensure that the user is logged in afterwards,
|
||||||
|
without typing in a password """
|
||||||
|
run_cmd_retry(["sudo", "-v"])
|
||||||
|
|
||||||
|
|
||||||
|
def drop_sudo_rights():
|
||||||
|
""" Drop sudo credentials """
|
||||||
|
run_cmd_retry(["sudo", "-k"])
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from lxc_net import parse_network, libvirt_error
|
from lxc_net import parse_network, libvirt_error, util
|
||||||
import signal
|
import signal
|
||||||
import libvirt
|
import libvirt
|
||||||
import argparse
|
import argparse
|
||||||
|
@ -16,7 +16,7 @@ def parse_args():
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
|
||||||
def handle_dom(topology, cmd):
|
def handle_dom(topology, cmd, sudo_drop=True):
|
||||||
if not cmd:
|
if not cmd:
|
||||||
print("Missing argument.")
|
print("Missing argument.")
|
||||||
return
|
return
|
||||||
|
@ -30,13 +30,17 @@ def handle_dom(topology, cmd):
|
||||||
print("Bad id: {}".format(cmd[1]))
|
print("Bad id: {}".format(cmd[1]))
|
||||||
return
|
return
|
||||||
state = cmd[0] == "up"
|
state = cmd[0] == "up"
|
||||||
|
|
||||||
|
util.ensure_sudo_rights()
|
||||||
if dom_id:
|
if dom_id:
|
||||||
for dom in dom_id:
|
for dom in dom_id:
|
||||||
topology.dom_setstate_single(dom, state, verbose=True)
|
topology.dom_setstate_single(dom, state, verbose=True)
|
||||||
else:
|
else:
|
||||||
topology.dom_setstate(state, verbose=True)
|
topology.dom_setstate(state, verbose=True)
|
||||||
|
if sudo_drop:
|
||||||
|
util.drop_sudo_rights()
|
||||||
elif cmd[0] == "restart":
|
elif cmd[0] == "restart":
|
||||||
handle_dom(topology, ["down"] + cmd[1:])
|
handle_dom(topology, ["down"] + cmd[1:], sudo_drop=False)
|
||||||
handle_dom(topology, ["up"] + cmd[1:])
|
handle_dom(topology, ["up"] + cmd[1:])
|
||||||
elif cmd[0] == "help":
|
elif cmd[0] == "help":
|
||||||
print("Available commands: up, down, restart, help")
|
print("Available commands: up, down, restart, help")
|
||||||
|
@ -97,15 +101,19 @@ def main():
|
||||||
|
|
||||||
topology = parse_network.YamlTopology(args.topology, conn)
|
topology = parse_network.YamlTopology(args.topology, conn)
|
||||||
|
|
||||||
|
util.ensure_sudo_rights()
|
||||||
topology.net_start(verbose=True)
|
topology.net_start(verbose=True)
|
||||||
topology.dom_start(verbose=True)
|
topology.dom_start(verbose=True)
|
||||||
|
util.drop_sudo_rights()
|
||||||
|
|
||||||
print("Network running. Press ^C to terminate.")
|
print("Network running. Press ^C to terminate.")
|
||||||
|
|
||||||
main_loop(topology)
|
main_loop(topology)
|
||||||
|
|
||||||
|
util.ensure_sudo_rights()
|
||||||
topology.dom_stop(verbose=True)
|
topology.dom_stop(verbose=True)
|
||||||
topology.net_stop(verbose=True)
|
topology.net_stop(verbose=True)
|
||||||
|
util.drop_sudo_rights()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Reference in a new issue