tools/kvm_stat: switch to argparse

optparse is deprecated for a while, hence switching over to argparse
(which also works with python2).
As a consequence, help output has some subtle changes, the most
significant one being that the options are all listed explicitly
instead of a universal '[options]' indicator. Also, some of the error
messages are phrased slightly different.
While at it, squashed a number of minor PEP8 issues.

Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
Message-Id: <20200306114250.57585-3-raspl@linux.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Stefan Raspl 2020-03-06 12:42:45 +01:00 committed by Paolo Bonzini
parent eecda7a956
commit 0e6618fba8

View file

@ -25,7 +25,7 @@ import sys
import locale import locale
import os import os
import time import time
import optparse import argparse
import ctypes import ctypes
import fcntl import fcntl
import resource import resource
@ -873,7 +873,7 @@ class Stats(object):
if options.debugfs: if options.debugfs:
providers.append(DebugfsProvider(options.pid, options.fields, providers.append(DebugfsProvider(options.pid, options.fields,
options.dbgfs_include_past)) options.debugfs_include_past))
if options.tracepoints or not providers: if options.tracepoints or not providers:
providers.append(TracepointProvider(options.pid, options.fields)) providers.append(TracepointProvider(options.pid, options.fields))
@ -1550,84 +1550,66 @@ Interactive Commands:
Press any other key to refresh statistics immediately. Press any other key to refresh statistics immediately.
""" % (PATH_DEBUGFS_KVM, PATH_DEBUGFS_TRACING) """ % (PATH_DEBUGFS_KVM, PATH_DEBUGFS_TRACING)
class PlainHelpFormatter(optparse.IndentedHelpFormatter): class Guest_to_pid(argparse.Action):
def format_description(self, description): def __call__(self, parser, namespace, values, option_string=None):
if description:
return description + "\n"
else:
return ""
def cb_guest_to_pid(option, opt, val, parser):
try: try:
pids = Tui.get_pid_from_gname(val) pids = Tui.get_pid_from_gname(values)
except: except:
sys.exit('Error while searching for guest "{}". Use "-p" to ' sys.exit('Error while searching for guest "{}". Use "-p" to '
'specify a pid instead?'.format(val)) 'specify a pid instead?'.format(values))
if len(pids) == 0: if len(pids) == 0:
sys.exit('Error: No guest by the name "{}" found'.format(val)) sys.exit('Error: No guest by the name "{}" found'
.format(values))
if len(pids) > 1: if len(pids) > 1:
sys.exit('Error: Multiple processes found (pids: {}). Use "-p"' sys.exit('Error: Multiple processes found (pids: {}). Use "-p"'
' to specify the desired pid'.format(" ".join(pids))) ' to specify the desired pid'.format(" ".join(pids)))
parser.values.pid = pids[0] namespace.pid = pids[0]
optparser = optparse.OptionParser(description=description_text, argparser = argparse.ArgumentParser(description=description_text,
formatter=PlainHelpFormatter()) formatter_class=argparse
optparser.add_option('-1', '--once', '--batch', .RawTextHelpFormatter)
argparser.add_argument('-1', '--once', '--batch',
action='store_true', action='store_true',
default=False, default=False,
dest='once',
help='run in batch mode for one second', help='run in batch mode for one second',
) )
optparser.add_option('-i', '--debugfs-include-past', argparser.add_argument('-d', '--debugfs',
action='store_true', action='store_true',
default=False, default=False,
dest='dbgfs_include_past',
help='include all available data on past events for '
'debugfs',
)
optparser.add_option('-l', '--log',
action='store_true',
default=False,
dest='log',
help='run in logging mode (like vmstat)',
)
optparser.add_option('-t', '--tracepoints',
action='store_true',
default=False,
dest='tracepoints',
help='retrieve statistics from tracepoints',
)
optparser.add_option('-d', '--debugfs',
action='store_true',
default=False,
dest='debugfs',
help='retrieve statistics from debugfs', help='retrieve statistics from debugfs',
) )
optparser.add_option('-f', '--fields', argparser.add_argument('-f', '--fields',
action='store',
default='', default='',
dest='fields',
help='''fields to display (regex) help='''fields to display (regex)
"-f help" for a list of available events''', "-f help" for a list of available events''',
) )
optparser.add_option('-p', '--pid', argparser.add_argument('-g', '--guest',
action='store', type=str,
help='restrict statistics to guest by name',
action=Guest_to_pid,
)
argparser.add_argument('-i', '--debugfs-include-past',
action='store_true',
default=False,
help='include all available data on past events for'
' debugfs',
)
argparser.add_argument('-l', '--log',
action='store_true',
default=False,
help='run in logging mode (like vmstat)',
)
argparser.add_argument('-p', '--pid',
type=int,
default=0, default=0,
type='int',
dest='pid',
help='restrict statistics to pid', help='restrict statistics to pid',
) )
optparser.add_option('-g', '--guest', argparser.add_argument('-t', '--tracepoints',
action='callback', action='store_true',
type='string', default=False,
dest='pid', help='retrieve statistics from tracepoints',
metavar='GUEST',
help='restrict statistics to guest by name',
callback=cb_guest_to_pid,
) )
options, unkn = optparser.parse_args(sys.argv) options = argparser.parse_args()
if len(unkn) != 1:
sys.exit('Error: Extra argument(s): ' + ' '.join(unkn[1:]))
try: try:
# verify that we were passed a valid regex up front # verify that we were passed a valid regex up front
re.compile(options.fields) re.compile(options.fields)