PR#3090: Add option for UTC time in list-history

Merges #3090
https://pagure.io/koji/pull-request/3090

Fixes: #1136
https://pagure.io/koji/issue/1136
Show koji list-history information in UTC time
This commit is contained in:
Yu Ming Zhu 2021-11-11 07:49:13 +00:00
commit ab87d70d55
2 changed files with 56 additions and 6 deletions

View file

@ -13,6 +13,8 @@ import sys
import textwrap
import time
import traceback
from datetime import datetime
from dateutil.tz import tzutc
from collections import OrderedDict, defaultdict
from optparse import SUPPRESS_HELP, OptionParser
@ -4618,7 +4620,11 @@ def _print_histline(entry, **kwargs):
fmt = "%s entry created" % table
else:
fmt = "%s entry revoked" % table
time_str = time.asctime(time.localtime(ts))
if options.utc:
time_str = time.asctime(datetime.fromtimestamp(ts, tzutc()).timetuple())
else:
time_str = time.asctime(time.localtime(ts))
parts = [time_str, fmt % x]
if options.events or options.verbose:
parts.insert(1, "(eid %i)" % event_id)
@ -4736,6 +4742,8 @@ def anon_handle_list_history(goptions, session, args):
parser.add_option("-e", "--events", action="store_true", help="Show event ids")
parser.add_option("--all", action="store_true",
help="Allows listing the entire global history")
parser.add_option("--utc", action="store_true",
help="Shows time in UTC timezone")
(options, args) = parser.parse_args(args)
if len(args) != 0:
parser.error("This command takes no arguments")
@ -4762,6 +4770,8 @@ def anon_handle_list_history(goptions, session, args):
channelinfo = session.getChannel(options.channel)
if not channelinfo:
error("No such channel: %s" % options.channel)
if options.utc:
kwargs['utc'] = options.utc
tables = None
if options.show:
tables = []

View file

@ -2,6 +2,8 @@ from __future__ import absolute_import
import time
from datetime import datetime
from dateutil.tz import tzutc
import unittest
from six.moves import StringIO
@ -17,23 +19,30 @@ class TestListHistory(utils.CliTestCase):
self.options = mock.MagicMock()
self.options.debug = False
self.session = mock.MagicMock()
self.maxDiff = None
@staticmethod
def get_expected_date_active_action(item, act='add'):
def get_expected_date_active_action(item, act='add', utc=False):
if act == 'add':
dt = datetime.fromtimestamp(item['create_ts'])
if utc:
dt = datetime.fromtimestamp(item['create_ts'], tzutc())
else:
dt = datetime.fromtimestamp(item['create_ts'])
if item['active']:
active = ' [still active]'
else:
active = ''
else:
dt = datetime.fromtimestamp(item['revoke_ts'])
if utc:
dt = datetime.fromtimestamp(item['create_ts'], tzutc())
else:
dt = datetime.fromtimestamp(item['revoke_ts'])
active = ''
expected_date = time.asctime(dt.timetuple())
return expected_date, active
def get_expected_channel(self, item):
def get_expected_channel(self, item, utc=False):
if item['active']:
list_active = ['add']
else:
@ -41,7 +50,7 @@ class TestListHistory(utils.CliTestCase):
expected = ''
for act in list_active:
expected_date, active = self.get_expected_date_active_action(
item, act)
item, act, utc)
if act == 'add':
action = 'added to'
else:
@ -218,6 +227,36 @@ class TestListHistory(utils.CliTestCase):
self.assertExitCode(ex, 2)
self.assert_console_message(stderr, expected)
@mock.patch('sys.stderr', new_callable=StringIO)
@mock.patch('sys.stdout', new_callable=StringIO)
@mock.patch('koji_cli.commands.ensure_connection')
def test_list_history_channel_utc(self, ensure_connection_mock, stdout, stderr):
# test case when channel is still active
channel_name = 'default'
# when channel name is created
dict_history = {
'host_channels': [
{'active': True,
'channel_id': 1,
'channels.name': 'default',
'create_event': 3,
'create_ts': 1612355089.887727,
'creator_id': 1,
'creator_name': 'kojiadmin',
'host.name': 'kojibuilder',
'host_id': 1,
'revoke_event': None,
'revoke_ts': None,
'revoker_id': None,
'revoker_name': None}]
}
self.session.queryHistory.return_value = dict_history
expected = self.get_expected_channel(dict_history['host_channels'][0], utc=True)
anon_handle_list_history(self.options, self.session,
['--channel', channel_name])
self.assert_console_message(stdout, expected)
@mock.patch('sys.stderr', new_callable=StringIO)
@mock.patch('sys.stdout', new_callable=StringIO)
@mock.patch('koji_cli.commands.ensure_connection')
@ -1145,6 +1184,7 @@ Options:
-v, --verbose Show more detail
-e, --events Show event ids
--all Allows listing the entire global history
--utc Shows time in UTC timezone
""" % self.progname)