Commit 0e6618fb authored by Stefan Raspl's avatar Stefan Raspl Committed by Paolo Bonzini

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: default avatarStefan Raspl <raspl@linux.ibm.com>
Message-Id: <20200306114250.57585-3-raspl@linux.ibm.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent eecda7a9
...@@ -25,7 +25,7 @@ import sys ...@@ -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): ...@@ -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: ...@@ -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='retrieve statistics from debugfs',
help='include all available data on past events for '
'debugfs',
) )
optparser.add_option('-l', '--log', argparser.add_argument('-f', '--fields',
action='store_true', default='',
default=False, help='''fields to display (regex)
dest='log', "-f help" for a list of available events''',
help='run in logging mode (like vmstat)', )
argparser.add_argument('-g', '--guest',
type=str,
help='restrict statistics to guest by name',
action=Guest_to_pid,
) )
optparser.add_option('-t', '--tracepoints', argparser.add_argument('-i', '--debugfs-include-past',
action='store_true', action='store_true',
default=False, default=False,
dest='tracepoints', help='include all available data on past events for'
help='retrieve statistics from tracepoints', ' debugfs',
) )
optparser.add_option('-d', '--debugfs', argparser.add_argument('-l', '--log',
action='store_true', action='store_true',
default=False, default=False,
dest='debugfs', help='run in logging mode (like vmstat)',
help='retrieve statistics from debugfs',
)
optparser.add_option('-f', '--fields',
action='store',
default='',
dest='fields',
help='''fields to display (regex)
"-f help" for a list of available events''',
) )
optparser.add_option('-p', '--pid', argparser.add_argument('-p', '--pid',
action='store', 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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment