diff options
author | Philipp Hahn <hahn@univention.de> | 2020-07-28 07:05:19 +0200 |
---|---|---|
committer | Philipp Hahn <pmhahn+github@pmhahn.de> | 2020-08-05 07:43:02 +0000 |
commit | 06aba185a8c6354776776f3e665317f5c763af5c (patch) | |
tree | 3a944c876d39b6f8525817280ebfd2c00f29037d /examples | |
parent | 9cf539a2a8c0055ba2a42d26677ec392e0e4f7c1 (diff) | |
download | libvirt-python-06aba185a8c6354776776f3e665317f5c763af5c.tar.gz |
examples: Convert to ArgumentParser
Replace getopt() and hand-rolled-parser with argparse.ArgumentParser.
Fix wrong header comments copy-pasted from domstart.py
Signed-off-by: Philipp Hahn <hahn@univention.de>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/consolecallback.py | 18 | ||||
-rwxr-xr-x | examples/dhcpleases.py | 30 | ||||
-rwxr-xr-x | examples/dominfo.py | 22 | ||||
-rwxr-xr-x | examples/domipaddrs.py | 28 | ||||
-rwxr-xr-x | examples/domrestore.py | 22 | ||||
-rwxr-xr-x | examples/domsave.py | 20 | ||||
-rwxr-xr-x | examples/domstart.py | 20 | ||||
-rwxr-xr-x | examples/esxlist.py | 25 | ||||
-rwxr-xr-x | examples/event-test.py | 53 | ||||
-rwxr-xr-x | examples/guest-vcpus/guest-vcpu-daemon.py | 37 | ||||
-rwxr-xr-x | examples/guest-vcpus/guest-vcpu.py | 73 | ||||
-rwxr-xr-x | examples/sparsestream.py | 31 |
12 files changed, 143 insertions, 236 deletions
diff --git a/examples/consolecallback.py b/examples/consolecallback.py index e8820f7..9947f75 100644 --- a/examples/consolecallback.py +++ b/examples/consolecallback.py @@ -2,6 +2,7 @@ # consolecallback - provide a persistent console that survives guest reboots import sys, os, logging, libvirt, tty, termios, atexit +from argparse import ArgumentParser from typing import Optional # noqa F401 def reset_term() -> None: @@ -64,18 +65,15 @@ def lifecycle_callback(connection: libvirt.virConnect, domain: libvirt.virDomain console.uuid, console.state[0], console.state[1]) # main -if len(sys.argv) != 3: - print("Usage:", sys.argv[0], "URI UUID") - print("for example:", sys.argv[0], "'qemu:///system' '32ad945f-7e78-c33a-e96d-39f25e025d81'") - sys.exit(1) - -uri = sys.argv[1] -uuid = sys.argv[2] +parser = ArgumentParser(epilog="Example: %(prog)s 'qemu:///system' '32ad945f-7e78-c33a-e96d-39f25e025d81'") +parser.add_argument("uri") +parser.add_argument("uuid") +args = parser.parse_args() print("Escape character is ^]") logging.basicConfig(filename='msg.log', level=logging.DEBUG) -logging.info("URI: %s", uri) -logging.info("UUID: %s", uuid) +logging.info("URI: %s", args.uri) +logging.info("UUID: %s", args.uuid) libvirt.virEventRegisterDefaultImpl() libvirt.registerErrorHandler(error_handler, None) @@ -84,7 +82,7 @@ atexit.register(reset_term) attrs = termios.tcgetattr(0) tty.setraw(0) -console = Console(uri, uuid) +console = Console(args.uri, args.uuid) console.stdin_watch = libvirt.virEventAddHandle(0, libvirt.VIR_EVENT_HANDLE_READABLE, stdin_callback, console) while check_console(console): diff --git a/examples/dhcpleases.py b/examples/dhcpleases.py index 82ba002..d023e4d 100755 --- a/examples/dhcpleases.py +++ b/examples/dhcpleases.py @@ -1,37 +1,29 @@ #!/usr/bin/env python3 -# netdhcpleases - print leases info for given virtual network +""" +Print leases info for a given virtual network +""" import libvirt import sys import time +from argparse import ArgumentParser -def usage() -> None: - print("Usage: %s [URI] NETWORK" % sys.argv[0]) - print(" Print leases info for a given virtual network") -uri = None -network = None -args = len(sys.argv) - -if args == 2: - network = sys.argv[1] -elif args == 3: - uri = sys.argv[1] - network = sys.argv[2] -else: - usage() - sys.exit(2) +parser = ArgumentParser(description=__doc__) +parser.add_argument("uri", nargs="?", default=None) +parser.add_argument("network") +args = parser.parse_args() try: - conn = libvirt.open(uri) + conn = libvirt.open(args.uri) except libvirt.libvirtError: print("Unable to open connection to libvirt") sys.exit(1) try: - net = conn.networkLookupByName(network) + net = conn.networkLookupByName(args.network) except libvirt.libvirtError: - print("Network %s not found" % network) + print("Network %s not found" % args.network) sys.exit(0) leases = net.DHCPLeases() diff --git a/examples/dominfo.py b/examples/dominfo.py index 7e8a9a1..bb00b59 100755 --- a/examples/dominfo.py +++ b/examples/dominfo.py @@ -1,16 +1,21 @@ #!/usr/bin/env python3 -# dominfo - print some information about a domain +""" +Print information about the domain DOMAIN +""" import libvirt import sys import os import libxml2 import pdb +from argparse import ArgumentParser from typing import Any -def usage() -> None: - print('Usage: %s DOMAIN' % sys.argv[0]) - print(' Print information about the domain DOMAIN') + +parser = ArgumentParser(description=__doc__) +parser.add_argument("domain") +args = parser.parse_args() + def print_section(title: str) -> None: print("\n%s" % title) @@ -28,11 +33,6 @@ def print_xml(key: str, ctx, path: str) -> str: print_entry(key, value) return value -if len(sys.argv) != 2: - usage() - sys.exit(2) - -name = sys.argv[1] # Connect to libvirt try: @@ -42,10 +42,10 @@ except libvirt.libvirtError: sys.exit(1) try: - dom = conn.lookupByName(name) + dom = conn.lookupByName(args.domain) # Annoyiingly, libvirt prints its own error message here except libvirt.libvirtError: - print("Domain %s is not running" % name) + print("Domain %s is not running" % args.domain) sys.exit(0) info = dom.info() diff --git a/examples/domipaddrs.py b/examples/domipaddrs.py index 611916f..2b9f276 100755 --- a/examples/domipaddrs.py +++ b/examples/domipaddrs.py @@ -1,8 +1,11 @@ #!/usr/bin/env python3 -# domipaddrs - print domain interfaces along with their MAC and IP addresses +""" +Print domain interfaces along with their MAC and IP addresses +""" import libvirt import sys +from argparse import ArgumentParser IPTYPE = { libvirt.VIR_IP_ADDR_TYPE_IPV4: "ipv4", @@ -33,29 +36,20 @@ def print_dom_ifaces(dom: libvirt.virDomain) -> None: if __name__ == "__main__": - uri = None - name = None - args = len(sys.argv) - - if args == 2: - name = sys.argv[1] - elif args == 3: - uri = sys.argv[1] - name = sys.argv[2] - else: - print("Usage: %s [URI] DOMAIN" % sys.argv[0]) - print(" Print domain interfaces along with their MAC and IP addresses") - sys.exit(2) + parser = ArgumentParser(description=__doc__) + parser.add_argument("uri", nargs="?", default=None) + parser.add_argument("domain") + args = parser.parse_args() try: - conn = libvirt.open(uri) + conn = libvirt.open(args.uri) except libvirt.libvirtError: raise SystemExit("Unable to open connection to libvirt") try: - dom = conn.lookupByName(name) + dom = conn.lookupByName(args.domain) except libvirt.libvirtError: - print("Domain %s not found" % name) + print("Domain %s not found" % args.domain) sys.exit(0) print_dom_ifaces(dom) diff --git a/examples/domrestore.py b/examples/domrestore.py index 3c6b410..c89405d 100755 --- a/examples/domrestore.py +++ b/examples/domrestore.py @@ -1,24 +1,22 @@ #!/usr/bin/env python3 -# domstart - make sure a given domU is running, if not start it +""" +Restore all the domains contained in DIR. +It is assumed that all files in DIR are images of domU's previously created with save. +""" import libvirt import sys import os import libxml2 import pdb +from argparse import ArgumentParser -def usage() -> None: - print('Usage: %s DIR' % sys.argv[0]) - print(' Restore all the domains contained in DIR') - print(' It is assumed that all files in DIR are') - print(' images of domU\'s previously created with save') -if len(sys.argv) != 2: - usage() - sys.exit(2) +parser = ArgumentParser(description=__doc__) +parser.add_argument("dir") +args = parser.parse_args() -dir = sys.argv[1] -imgs = os.listdir(dir) +imgs = os.listdir(args.dir) try: conn = libvirt.open(None) @@ -27,7 +25,7 @@ except libvirt.libvirtError: sys.exit(1) for img in imgs: - file = os.path.join(dir, img) + file = os.path.join(args.dir, img) print("Restoring %s ... " % img) ret = conn.restore(file) if ret == 0: diff --git a/examples/domsave.py b/examples/domsave.py index 2a85554..2f140a2 100755 --- a/examples/domsave.py +++ b/examples/domsave.py @@ -1,22 +1,20 @@ #!/usr/bin/env python3 -# domstart - make sure a given domU is running, if not start it +""" +Save all currently running domU's into DIR. +DIR must exist and be writable by this process. +""" import libvirt import sys import os import libxml2 import pdb +from argparse import ArgumentParser -def usage() -> None: - print('Usage: %s DIR' % sys.argv[0]) - print(' Save all currently running domU\'s into DIR') - print(' DIR must exist and be writable by this process') -if len(sys.argv) != 2: - usage() - sys.exit(2) - -dir = sys.argv[1] +parser = ArgumentParser(description=__doc__) +parser.add_argument("dir") +args = parser.parse_args() try: conn = libvirt.open(None) @@ -30,7 +28,7 @@ for id in doms: continue dom = conn.lookupByID(id) print("Saving %s[%d] ... " % (dom.name(), id)) - path = os.path.join(dir, dom.name()) + path = os.path.join(args.dir, dom.name()) ret = dom.save(path) if ret == 0: print("done") diff --git a/examples/domstart.py b/examples/domstart.py index cd6de59..446a793 100755 --- a/examples/domstart.py +++ b/examples/domstart.py @@ -1,11 +1,15 @@ #!/usr/bin/env python3 -# domstart - make sure a given domU is running, if not start it +""" +Check that the domain described by DOMAIN.XML is running. +If the domain is not running, create it. +""" import libvirt import sys import os import libxml2 import pdb +from argparse import ArgumentParser from typing import Tuple # Parse the XML description of domU from FNAME @@ -20,18 +24,12 @@ def read_domain(fname: str) -> Tuple[str, str]: name = doc.xpathNewContext().xpathEval("/domain/name")[0].content return (name, xmldesc) -def usage() -> None: - print('Usage: %s domain.xml' % sys.argv[0]) - print(' Check that the domain described by DOMAIN.XML is running') - print(' If the domain is not running, create it') - print(' DOMAIN.XML must be a XML description of the domain') - print(' in libvirt\'s XML format') -if len(sys.argv) != 2: - usage() - sys.exit(2) +parser = ArgumentParser(description=__doc__) +parser.add_argument("file", metavar="DOMAIN.XML", help="XML configuration of the domain in libvirt's XML format") +args = parser.parse_args() -(name, xmldesc) = read_domain(sys.argv[1]) +(name, xmldesc) = read_domain(args.file) try: conn = libvirt.open(None) diff --git a/examples/esxlist.py b/examples/esxlist.py index 0d49f32..59c8210 100755 --- a/examples/esxlist.py +++ b/examples/esxlist.py @@ -1,20 +1,18 @@ #!/usr/bin/env python3 -# esxlist - list active domains of an ESX host and print some info. -# also demonstrates how to use the libvirt.openAuth() method +""" +List active domains of an ESX host and print some info. +""" +# also demonstrates how to use the libvirt.openAuth() method import libvirt import sys import os import libxml2 import getpass +from argparse import ArgumentParser from typing import Any, List -def usage() -> None: - print("Usage: %s HOSTNAME" % sys.argv[0]) - print(" List active domains of HOSTNAME and print some info") - - # This is the callback method passed to libvirt.openAuth() (see below). # # The credentials argument is a list of credentials that libvirt (actually @@ -73,15 +71,12 @@ def print_xml(key: str, ctx, path: str) -> str: return value -if len(sys.argv) != 2: - usage() - sys.exit(2) - - -hostname = sys.argv[1] +parser = ArgumentParser(description=__doc__) +parser.add_argument("hostname") +args = parser.parse_args() # Connect to libvirt -uri = "esx://%s/?no_verify=1" % hostname +uri = "esx://%s/?no_verify=1" % args.hostname # The auth argument is a list that contains 3 items: # - a list of supported credential types @@ -101,7 +96,7 @@ auth = [[libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_NOECHOPROMPT], try: conn = libvirt.openAuth(uri, auth, 0) except libvirt.libvirtError: - print("Failed to open connection to %s" % hostname) + print("Failed to open connection to %s" % args.hostname) sys.exit(1) state_names = { libvirt.VIR_DOMAIN_RUNNING : "running", diff --git a/examples/event-test.py b/examples/event-test.py index eb464d1..18f657a 100755 --- a/examples/event-test.py +++ b/examples/event-test.py @@ -7,14 +7,13 @@ ############################################################################## import atexit -import sys -import getopt import os import libvirt import select import errno import time import threading +from argparse import ArgumentParser from typing import Any, Callable, Dict, List, Optional, TypeVar # noqa F401 _T = TypeVar("_T") _EventCallback = Callable[[int, int, int, _T], None] @@ -725,53 +724,29 @@ def myConnectionCloseCallback(conn: libvirt.virConnect, reason: int, opaque: _T) run = False -def usage() -> None: - print("usage: %s [-hdl] [uri]" % (os.path.basename(__file__),)) - print(" uri will default to qemu:///system") - print(" --help, -h Print this help message") - print(" --debug, -d Print debug output") - print(" --loop=TYPE, -l Choose event-loop-implementation (native, poll, asyncio)") - print(" --timeout=SECS Quit after SECS seconds running") - - def main() -> None: - try: - opts, args = getopt.getopt(sys.argv[1:], "hdl:", ["help", "debug", "loop=", "timeout="]) - except getopt.GetoptError as err: - # print help information and exit: - print(str(err)) # will print something like "option -a not recognized" - usage() - sys.exit(2) - timeout = None - for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - if o in ("-d", "--debug"): + parser = ArgumentParser() + parser.add_argument("--debug", "-d", action="store_true", help="Print debug output") + parser.add_argument("--loop", "-l", choices=("native", "poll", "asyncio"), default=event_impl, help="Choose event-loop-implementation") + parser.add_argument("--timeout", type=int, default=None, help="Quit after SECS seconds running") + parser.add_argument("uri", nargs="?", default="qemu:///system") + args = parser.parse_args() + + if args.debug: global do_debug do_debug = True - if o in ("-l", "--loop"): - global event_impl - event_impl = a - if o in ("--timeout"): - timeout = int(a) - - if len(args) >= 1: - uri = args[0] - else: - uri = "qemu:///system" - print("Using uri '%s' and event loop '%s'" % (uri, event_impl)) + print("Using uri '%s' and event loop '%s'" % (args.uri, args.loop)) # Run a background thread with the event loop - if event_impl == "poll": + if args.loop == "poll": virEventLoopPollStart() - elif event_impl == "asyncio": + elif args.loop == "asyncio": virEventLoopAIOStart() else: virEventLoopNativeStart() - vc = libvirt.openReadOnly(uri) + vc = libvirt.openReadOnly(args.uri) # Close connection on exit (to test cleanup paths) def exit() -> None: @@ -839,7 +814,7 @@ def main() -> None: # run the event loop in your main thread if your app is # totally event based. count = 0 - while run and (timeout is None or count < timeout): + while run and (args.timeout is None or count < args.timeout): count = count + 1 time.sleep(1) diff --git a/examples/guest-vcpus/guest-vcpu-daemon.py b/examples/guest-vcpus/guest-vcpu-daemon.py index 30fcb9c..b2507fe 100755 --- a/examples/guest-vcpus/guest-vcpu-daemon.py +++ b/examples/guest-vcpus/guest-vcpu-daemon.py @@ -1,26 +1,22 @@ #!/usr/bin/env python3 +""" +This service waits for the guest agent lifecycle event and reissues +guest agent calls to modify the cpu count according to the metadata +set by guest-vcpu.py example +""" import libvirt import threading from xml.dom import minidom import time import sys -import getopt import os +from argparse import ArgumentParser uri = "qemu:///system" customXMLuri = "guest-cpu.python.libvirt.org" connectRetryTimeout = 5 -def usage(): - print("usage: "+os.path.basename(sys.argv[0])+" [-h] [uri]") - print(" uri will default to qemu:///system") - print(" --help, -h Print(this help message") - print("") - print("This service waits for the guest agent lifecycle event and reissues " + - "guest agent calls to modify the cpu count according to the metadata " + - "set by guest-vcpu.py example") - class workerData: def __init__(self): self.doms = list() @@ -140,21 +136,10 @@ def main(): time.sleep(1) if __name__ == "__main__": - try: - opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) - except getopt.GetoptError as err: - print(str(err)) - usage() - sys.exit(2) - for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - - if len(args) > 1: - usage() - sys.exit(1) - elif len(args) == 1: - uri = args[0] + parser = ArgumentParser(description=__doc__) + parser.add_argument("uri", nargs="?", default=uri) + args = parser.parse_args() + + uri = args.uri main() diff --git a/examples/guest-vcpus/guest-vcpu.py b/examples/guest-vcpus/guest-vcpu.py index 786ef0c..68bb5bf 100755 --- a/examples/guest-vcpus/guest-vcpu.py +++ b/examples/guest-vcpus/guest-vcpu.py @@ -1,74 +1,45 @@ #!/usr/bin/env python3 +""" +Sets the vCPU count via the guest agent and sets the metadata element +used by guest-vcpu-daemon.py example +""" import libvirt import sys -import getopt -import os +from argparse import ArgumentParser customXMLuri = "guest-cpu.python.libvirt.org" -def usage(): - print("usage: "+os.path.basename(sys.argv[0])+" [-hcl] domain count [uri]") - print(" uri will default to qemu:///system") - print(" --help, -h Print(this help message") - print(" --config, -c Modify persistent domain configuration") - print(" --live, -l Modify live domain configuration") - print("") - print("Sets the vCPU count via the guest agent and sets the metadata element " + - "used by guest-vcpu-daemon.py example") +parser = ArgumentParser(description=__doc__) +parser.add_argument("--config", "-c", action="store_true", help="Modify persistent domain configuration") +parser.add_argument("--live", "-l", action="store_true", help="Modify live domain configuration") +parser.add_argument("domain") +parser.add_argument("count", type=int) +parser.add_argument("uri", nargs="?", default="qemu:///system") +args = parser.parse_args() -uri = "qemu:///system" -flags = 0 -live = False -config = False +flags = (libvirt.VIR_DOMAIN_AFFECT_CONFIG if args.config else 0) | (libvirt.VIR_DOMAIN_AFFECT_LIVE if args.live else 0) -try: - opts, args = getopt.getopt(sys.argv[1:], "hcl", ["help", "config", "live"]) -except getopt.GetoptError as err: - # print help information and exit: - print(str(err)) # will print something like "option -a not recognized" - usage() - sys.exit(2) -for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - if o in ("-c", "--config"): - config = True - flags |= libvirt.VIR_DOMAIN_AFFECT_CONFIG - if o in ("-l", "--live"): - live = True - flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE +conn = libvirt.open(args.uri) +dom = conn.lookupByName(args.domain) -if len(args) < 2: - usage() - sys.exit(1) -elif len(args) >= 3: - uri = args[2] - -domain = args[0] -count = int(args[1]) - -conn = libvirt.open(uri) -dom = conn.lookupByName(domain) - -if flags == 0 or config: +if flags == 0 or args.config: confvcpus = dom.vcpusFlags(libvirt.VIR_DOMAIN_AFFECT_CONFIG) - if confvcpus < count: + if confvcpus < args.count: print("Persistent domain configuration has only " + str(confvcpus) + " vcpus configured") sys.exit(1) -if flags == 0 or live: +if flags == 0 or args.live: livevcpus = dom.vcpusFlags(libvirt.VIR_DOMAIN_AFFECT_LIVE) - if livevcpus < count: + if livevcpus < args.count: print("Live domain configuration has only " + str(livevcpus) + " vcpus configured") sys.exit(1) -if flags == 0 or live: - dom.setVcpusFlags(count, libvirt.VIR_DOMAIN_AFFECT_LIVE | libvirt.VIR_DOMAIN_VCPU_GUEST) +if flags == 0 or args.live: + dom.setVcpusFlags(args.count, libvirt.VIR_DOMAIN_AFFECT_LIVE | libvirt.VIR_DOMAIN_VCPU_GUEST) -meta = "<ncpus count='" + str(count) + "'/>" +meta = "<ncpus count='" + str(args.count) + "'/>" dom.setMetadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT, meta, "guestvcpudaemon", customXMLuri, flags) diff --git a/examples/sparsestream.py b/examples/sparsestream.py index 618c291..80ce0c5 100755 --- a/examples/sparsestream.py +++ b/examples/sparsestream.py @@ -1,10 +1,15 @@ #!/usr/bin/env python3 +""" +Either uploads local FILE to libvirt VOLUME, or downloads libvirt +VOLUME into local FILE while preserving FILE/VOLUME sparseness +""" # Example of sparse streams usage # # Authors: # Michal Privoznik <mprivozn@redhat.com> import libvirt, sys, os +from argparse import ArgumentParser def bytesWriteHandler(stream: libvirt.virStream, buf: bytes, opaque: int) -> int: fd = opaque @@ -94,24 +99,22 @@ def upload(vol: libvirt.virStorageVol, st: libvirt.virStream, filename: str) -> os.close(fd) # main -if len(sys.argv) != 5: - print("Usage: ", sys.argv[0], " URI --upload/--download VOLUME FILE") - print("Either uploads local FILE to libvirt VOLUME, or downloads libvirt ") - print("VOLUME into local FILE while preserving FILE/VOLUME sparseness") - sys.exit(1) +parser = ArgumentParser(description=__doc__) +parser.add_argument("uri") +group = parser.add_mutually_exclusive_group(required=True) +group.add_argument("--upload", action="store_const", const=upload, dest="operation") +group.add_argument("--download", action="store_const", const=download, dest="operation") +parser.add_argument("volume") +parser.add_argument("file") +args = parser.parse_args() -conn = libvirt.open(sys.argv[1]) -vol = conn.storageVolLookupByKey(sys.argv[3]) + +conn = libvirt.open(args.uri) +vol = conn.storageVolLookupByKey(args.volume) st = conn.newStream() -if sys.argv[2] == "--download": - download(vol, st, sys.argv[4]) -elif sys.argv[2] == "--upload": - upload(vol, st, sys.argv[4]) -else: - print("Unknown operation: %s " % sys.argv[1]) - sys.exit(1) +args.operation(vol, st, args.file) st.finish() conn.close() |