Fix the bug of "openstack console log show"

The behaviors are inconsistent while different
negative line numbers specified.

Change-Id: I2573f3e789f5603c896758971830ffc0b94c5e2b
Closes-Bug: #1512263
This commit is contained in:
xiexs 2015-11-09 04:22:00 -05:00
parent 6dfa304617
commit ea63553925
3 changed files with 72 additions and 0 deletions

View File

@ -65,3 +65,18 @@ class RangeAction(argparse.Action):
# Too many values # Too many values
msg = "Invalid range, too many values" msg = "Invalid range, too many values"
raise argparse.ArgumentError(self, msg) raise argparse.ArgumentError(self, msg)
class NonNegativeAction(argparse.Action):
"""A custom action to check whether the value is non-negative or not
Ensures the value is >= 0.
"""
def __call__(self, parser, namespace, values, option_string=None):
try:
assert(int(values) >= 0)
setattr(namespace, self.dest, values)
except Exception:
msg = "%s expected a non-negative integer" % (str(option_string))
raise argparse.ArgumentTypeError(self, msg)

View File

@ -22,6 +22,7 @@ import sys
from cliff import command from cliff import command
from cliff import show from cliff import show
from openstackclient.common import parseractions
from openstackclient.common import utils from openstackclient.common import utils
@ -42,6 +43,7 @@ class ShowConsoleLog(command.Command):
metavar='<num-lines>', metavar='<num-lines>',
type=int, type=int,
default=None, default=None,
action=parseractions.NonNegativeAction,
help='Number of lines to display from the end of the log ' help='Number of lines to display from the end of the log '
'(default=all)', '(default=all)',
) )

View File

@ -102,3 +102,58 @@ class TestKeyValueAction(utils.TestCase):
expect = {'green': '100%'} expect = {'green': '100%'}
self.assertDictEqual(expect, actual) self.assertDictEqual(expect, actual)
self.assertEqual(None, failhere) self.assertEqual(None, failhere)
class TestNonNegativeAction(utils.TestCase):
def test_negative_values(self):
parser = argparse.ArgumentParser()
# Set up our typical usage
parser.add_argument(
'--foo',
metavar='<foo>',
type=int,
action=parseractions.NonNegativeAction,
)
self.assertRaises(
argparse.ArgumentTypeError,
parser.parse_args,
"--foo -1".split()
)
def test_zero_values(self):
parser = argparse.ArgumentParser()
# Set up our typical usage
parser.add_argument(
'--foo',
metavar='<foo>',
type=int,
action=parseractions.NonNegativeAction,
)
results = parser.parse_args(
'--foo 0'.split()
)
actual = getattr(results, 'foo', None)
self.assertEqual(actual, 0)
def test_positive_values(self):
parser = argparse.ArgumentParser()
# Set up our typical usage
parser.add_argument(
'--foo',
metavar='<foo>',
type=int,
action=parseractions.NonNegativeAction,
)
results = parser.parse_args(
'--foo 1'.split()
)
actual = getattr(results, 'foo', None)
self.assertEqual(actual, 1)