cleanup after automatic split

This commit is contained in:
Tomas Kopecek 2017-06-06 15:51:28 +02:00
parent 81b2b36d07
commit 37bcef025c
3 changed files with 162 additions and 135 deletions

View file

@ -27,96 +27,18 @@
from __future__ import absolute_import
from __future__ import division
import sys
from six.moves import range
from six.moves import zip
import six
from six.moves import filter
from six.moves import map
try:
import krbV
except ImportError: # pragma: no cover
krbV = None
try:
import ast
except ImportError: # pragma: no cover
ast = None
try:
import json
except ImportError: # pragma: no cover
try:
import simplejson as json
except ImportError:
json = None
import six.moves.configparser
import base64
import dateutil.parser
import errno
import koji
import koji.util
import fnmatch
from koji.util import md5_constructor
import logging
import os
import re
import pprint
import pycurl
import random
import socket
import stat
import string
import time
import traceback
import six.moves.xmlrpc_client
try:
import libcomps
except ImportError: # pragma: no cover
libcomps = None
try:
import yum.comps as yumcomps
except ImportError:
yumcomps = None
import optparse
# fix OptionParser for python 2.3 (optparse verion 1.4.1+)
# code taken from optparse version 1.5a2
OptionParser = optparse.OptionParser
if optparse.__version__ == "1.4.1+": # pragma: no cover
def _op_error(self, msg):
self.print_usage(sys.stderr)
msg = "%s: error: %s\n" % (self._get_prog_name(), msg)
if msg:
sys.stderr.write(msg)
sys.exit(2)
OptionParser.error = _op_error
greetings = ('hello', 'hi', 'yo', "what's up", "g'day", 'back to work',
'bonjour',
'hallo',
'ciao',
'hola',
u'olá',
u'dobrý den',
u'zdravstvuite',
u'góðan daginn',
'hej',
'tervehdys',
u'grüezi',
u'céad míle fáilte',
u'hylô',
u'bună ziua',
u'jó napot',
'dobre dan',
u'你好',
u'こんにちは',
u'नमस्कार',
u'안녕하세요')
ARGMAP = {'None': None,
'True': True,
'False': False}
from koji_cli.lib import _, OptionParser, get_epilog_str, greetings, \
warn, categories
def get_options():
@ -240,18 +162,6 @@ def get_options():
return options, cmd, args[1:]
def handle_help(options, session, args):
"[info] List available commands"
usage = _("usage: %prog help <category> ...")

View file

@ -1,3 +1,46 @@
from __future__ import absolute_import
from __future__ import division
import ast
import base64
import dateutil.parser
import fnmatch
import json
import logging
import optparse
import os
import pprint
import pycurl
import random
import re
import six
import stat
import sys
import time
import traceback
import six.moves.xmlrpc_client
from six.moves import filter
from six.moves import map
from six.moves import zip
try:
import libcomps
except ImportError: # pragma: no cover
libcomps = None
try:
import yum.comps as yumcomps
except ImportError:
yumcomps = None
import koji
from koji.util import md5_constructor
from koji_cli.lib import _, OptionParser, activate_session, parse_arches, \
_unique_path, _running_in_bg, _progress_callback, watch_tasks, \
arg_filter, linked_upload, list_task_output_all_volumes, \
print_task_headers, print_task_recurse, _format_size, watch_logs, \
error, greetings
def _printable_unicode(s):
if six.PY2:
return s.encode('utf-8')
@ -410,7 +453,8 @@ def handle_build(options, session, args):
print("Task info: %s/taskinfo?taskID=%s" % (options.weburl, task_id))
if build_opts.wait or (build_opts.wait is None and not _running_in_bg()):
session.logout()
return watch_tasks(session, [task_id], quiet=build_opts.quiet)
return watch_tasks(session, [task_id], quiet=build_opts.quiet,
poll_interval=options.poll_interval)
else:
return
@ -487,7 +531,8 @@ def handle_chain_build(options, session, args):
return
else:
session.logout()
return watch_tasks(session, [task_id], quiet=build_opts.quiet)
return watch_tasks(session, [task_id], quiet=build_opts.quiet,
poll_interval=options.poll_interval)
def handle_maven_build(options, session, args):
"[build] Build a Maven package from source"
@ -585,7 +630,8 @@ def handle_maven_build(options, session, args):
return
else:
session.logout()
return watch_tasks(session, [task_id], quiet=build_opts.quiet)
return watch_tasks(session, [task_id], quiet=build_opts.quiet,
poll_interval=options.poll_interval)
def handle_wrapper_rpm(options, session, args):
"""[build] Build wrapper rpms for any archives associated with a build."""
@ -651,7 +697,8 @@ def handle_wrapper_rpm(options, session, args):
return
else:
session.logout()
return watch_tasks(session,[task_id],quiet=options.quiet)
return watch_tasks(session, [task_id], quiet=options.quiet,
poll_interval=options.poll_interval)
def handle_maven_chain(options, session, args):
"[build] Run a set of Maven builds in dependency order"
@ -703,9 +750,10 @@ def handle_maven_chain(options, session, args):
return
else:
session.logout()
return watch_tasks(session, [task_id], quiet=options.quiet)
return watch_tasks(session, [task_id], quiet=options.quiet,
poll_interval=options.poll_interval)
def handle_resubmit(options, session, args):
def handle_resubmit(global_options, session, args):
"""[build] Retry a canceled or failed task, using the same parameter as the original task."""
usage = _("usage: %prog resubmit [options] taskID")
usage += _("\n(Specify the --help global option for a list of other help options)")
@ -722,7 +770,7 @@ def handle_resubmit(options, session, args):
taskID = int(args[0])
if not options.quiet:
print("Resubmitting the following task:")
_printTaskInfo(session, taskID, 0, False, True)
_printTaskInfo(session, taskID, 0, global_options.topdir, False, True)
newID = session.resubmitTask(taskID)
if not options.quiet:
print("Resubmitted task %s as new task %s" % (taskID, newID))
@ -730,7 +778,8 @@ def handle_resubmit(options, session, args):
return
else:
session.logout()
return watch_tasks(session, [newID], quiet=options.quiet)
return watch_tasks(session, [newID], quiet=options.quiet,
poll_interval=options.poll_interval)
def handle_call(options, session, args):
"Execute an arbitrary XML-RPC call"
@ -963,7 +1012,8 @@ def handle_restart_hosts(options, session, args):
task_id = session.restartHosts()
if my_opts.wait or (my_opts.wait is None and not _running_in_bg()):
session.logout()
return watch_tasks(session, [task_id], quiet=my_opts.quiet)
return watch_tasks(session, [task_id], quiet=my_opts.quiet,
poll_interval=options.poll_interval)
else:
return
def handle_import(options, session, args):
@ -2551,14 +2601,14 @@ def handle_unblock_group_req(options, session, args):
activate_session(session)
session.groupReqListUnblock(tag, group, req)
def anon_handle_list_channels(options, session, args):
def anon_handle_list_channels(goptions, session, args):
"[info] Print channels listing"
usage = _("usage: %prog list-channels")
usage += _("\n(Specify the --help global option for a list of other help options)")
parser = OptionParser(usage=usage)
parser.add_option("--quiet", action="store_true", help=_("Do not print header information"), default=options.quiet)
parser.add_option("--quiet", action="store_true", help=_("Do not print header information"), default=goptions.quiet)
(options, args) = parser.parse_args(args)
activate_session(session)
activate_session(session, goptions)
channels = session.listChannels()
session.multicall = True
for channel in channels:
@ -3993,17 +4043,18 @@ def _handleOpts(lines, opts, prefix=''):
_handleMap(lines, opts, prefix)
def _parseTaskParams(session, method, task_id):
def _parseTaskParams(session, method, task_id, topdir):
try:
return _do_parseTaskParams(session, method, task_id)
return _do_parseTaskParams(session, method, task_id, topdir)
except Exception:
logger = logging.getLogger("koji")
if logger.isEnabledFor(logging.DEBUG):
tb_str = ''.join(traceback.format_exception(*sys.exc_info()))
logger.debug(tb_str)
return ['Unable to parse task parameters']
def _do_parseTaskParams(session, method, task_id):
def _do_parseTaskParams(session, method, task_id, topdir):
"""Parse the return of getTaskRequest()"""
params = session.getTaskRequest(task_id)
@ -4014,7 +4065,7 @@ def _do_parseTaskParams(session, method, task_id):
elif method == 'buildSRPMFromSCM':
lines.append("SCM URL: %s" % params[0])
elif method == 'buildArch':
lines.append("SRPM: %s/work/%s" % (options.topdir, params[0]))
lines.append("SRPM: %s/work/%s" % (topdir, params[0]))
lines.append("Build Tag: %s" % session.getTag(params[1])['name'])
lines.append("Build Arch: %s" % params[2])
lines.append("SRPM Kept: %r" % params[3])
@ -4151,7 +4202,7 @@ def _do_parseTaskParams(session, method, task_id):
return lines
def _printTaskInfo(session, task_id, level=0, recurse=True, verbose=True):
def _printTaskInfo(session, task_id, topdir, level=0, recurse=True, verbose=True):
"""Recursive function to print information about a task
and its children."""
@ -4189,7 +4240,7 @@ def _printTaskInfo(session, task_id, level=0, recurse=True, verbose=True):
print("%sType: %s" % (indent, info['method']))
if verbose:
print("%sRequest Parameters:" % indent)
for line in _parseTaskParams(session, info['method'], task_id):
for line in _parseTaskParams(session, info['method'], task_id, topdir):
print("%s %s" % (indent, line))
print("%sOwner: %s" % (indent, owner))
print("%sState: %s" % (indent, koji.TASK_STATES[info['state']].lower()))
@ -4223,9 +4274,9 @@ def _printTaskInfo(session, task_id, level=0, recurse=True, verbose=True):
children = session.getTaskChildren(task_id, request=True)
children.sort(cmp=lambda a, b: cmp(a['id'], b['id']))
for child in children:
_printTaskInfo(session, child['id'], level, verbose=verbose)
_printTaskInfo(session, child['id'], topdir, level, verbose=verbose)
def anon_handle_taskinfo(options, session, args):
def anon_handle_taskinfo(global_options, session, args):
"""[info] Show information about a task"""
usage = _("usage: %prog taskinfo [options] taskID [taskID...]")
usage += _("\n(Specify the --help global option for a list of other help options)")
@ -4241,7 +4292,7 @@ def anon_handle_taskinfo(options, session, args):
for arg in args:
task_id = int(arg)
_printTaskInfo(session, task_id, 0, options.recurse, options.verbose)
_printTaskInfo(session, task_id, options.topdir, 0, options.recurse, options.verbose)
def anon_handle_taginfo(options, session, args):
"[info] Print basic information about a tag"
@ -5444,7 +5495,8 @@ def _build_image(options, task_opts, session, args, img_type):
print("Task info: %s/taskinfo?taskID=%s" % (options.weburl, task_id))
if task_opts.wait or (task_opts.wait is None and not _running_in_bg()):
session.logout()
return watch_tasks(session, [task_id], quiet=options.quiet)
return watch_tasks(session, [task_id], quiet=options.quiet,
poll_interval=options.poll_interval)
else:
return
@ -5513,7 +5565,8 @@ def _build_image_oz(options, task_opts, session, args):
print("Task info: %s/taskinfo?taskID=%s" % (options.weburl, task_id))
if task_opts.wait or (task_opts.wait is None and not _running_in_bg()):
session.logout()
return watch_tasks(session, [task_id], quiet=options.quiet)
return watch_tasks(session, [task_id], quiet=options.quiet,
poll_interval=options.poll_interval)
else:
return
@ -5590,7 +5643,8 @@ def handle_win_build(options, session, args):
print("Task info: %s/taskinfo?taskID=%s" % (options.weburl, task_id))
if build_opts.wait or (build_opts.wait is None and not _running_in_bg()):
session.logout()
return watch_tasks(session, [task_id], quiet=build_opts.quiet)
return watch_tasks(session, [task_id], quiet=build_opts.quiet,
poll_interval=options.poll_interval)
else:
return
@ -5851,7 +5905,7 @@ def handle_set_pkg_owner_global(options, session, args):
% (entry['package_name'], entry['tag_name'], entry['owner_name'], user['name']))
session.packageListSetOwner(entry['tag_id'], entry['package_name'], user['id'])
def anon_handle_watch_task(options, session, args):
def anon_handle_watch_task(global_options, session, args):
"[monitor] Track progress of particular tasks"
usage = _("usage: %prog watch-task [options] <task id> [<task id>...]")
usage += _("\n(Specify the --help global option for a list of other help options)")
@ -5890,9 +5944,10 @@ def anon_handle_watch_task(options, session, args):
if not tasks:
parser.error(_("at least one task id must be specified"))
return watch_tasks(session, tasks, quiet=options.quiet)
return watch_tasks(session, tasks, quiet=options.quiet,
poll_interval=global_options.poll_interval)
def anon_handle_watch_logs(options, session, args):
def anon_handle_watch_logs(global_options, session, args):
"[monitor] Watch logs in realtime"
usage = _("usage: %prog watch-logs [options] <task id> [<task id>...]")
usage += _("\n(Specify the --help global option for a list of other help options)")
@ -5910,7 +5965,7 @@ def anon_handle_watch_logs(options, session, args):
if not tasks:
parser.error(_("at least one task id must be specified"))
watch_logs(session, tasks, options)
watch_logs(session, tasks, options, global_options.poll_interval)
def handle_make_task(opts, session, args):
"[admin] Create an arbitrary task"
@ -5937,7 +5992,8 @@ def handle_make_task(opts, session, args):
return
else:
session.logout()
return watch_tasks(session, [task_id], quiet=opts.quiet)
return watch_tasks(session, [task_id], quiet=opts.quiet,
poll_interval=opts.poll_interval)
def handle_tag_build(opts, session, args):
"[bind] Apply a tag to one or more builds"
@ -5961,7 +6017,8 @@ def handle_tag_build(opts, session, args):
return
else:
session.logout()
return watch_tasks(session,tasks,quiet=opts.quiet)
return watch_tasks(session, tasks, quiet=opts.quiet,
poll_interval=opts.poll_interval)
def handle_move_build(opts, session, args):
"[bind] 'Move' one or more builds between tags"
@ -6007,7 +6064,8 @@ def handle_move_build(opts, session, args):
return
else:
session.logout()
return watch_tasks(session, tasks, quiet=opts.quiet)
return watch_tasks(session, tasks, quiet=opts.quiet,
poll_interval=opts.poll_interval)
def handle_untag_build(options, session, args):
"[bind] Remove a tag from one or more builds"
@ -6275,7 +6333,7 @@ def anon_handle_download_logs(options, session, args):
# with current code, failed task results should always be faults,
# but that could change in the future
content = pprint.pformat(result)
except (xmlrpclib.Fault, koji.GenericError):
except (six.moves.xmlrpc_client.Fault, koji.GenericError):
etype, e = sys.exc_info()[:2]
content = ''.join(traceback.format_exception_only(etype, e))
full_filename = os.path.normpath(os.path.join(task_log_dir, FAIL_LOG))
@ -6582,7 +6640,8 @@ def handle_regen_repo(options, session, args):
return
else:
session.logout()
return watch_tasks(session, [task_id], quiet=options.quiet)
return watch_tasks(session, [task_id], quiet=options.quiet,
poll_interval=options.poll_interval)
def handle_dist_repo(options, session, args):
"""Create a yum repo with distribution options"""
@ -6700,7 +6759,8 @@ def handle_dist_repo(options, session, args):
return
else:
session.logout()
return watch_tasks(session, [task_id], quiet=options.quiet)
return watch_tasks(session, [task_id], quiet=options.quiet,
poll_interval=options.poll_interval)
def anon_handle_search(options, session, args):

View file

@ -1,3 +1,61 @@
# coding=utf-8
from __future__ import absolute_import
from __future__ import division
import optparse
import os
import random
import six
import socket
import string
import sys
import time
from six.moves import range
try:
import krbV
except ImportError: # pragma: no cover
krbV = None
import koji
# fix OptionParser for python 2.3 (optparse verion 1.4.1+)
# code taken from optparse version 1.5a2
OptionParser = optparse.OptionParser
if optparse.__version__ == "1.4.1+": # pragma: no cover
def _op_error(self, msg):
self.print_usage(sys.stderr)
msg = "%s: error: %s\n" % (self._get_prog_name(), msg)
if msg:
sys.stderr.write(msg)
sys.exit(2)
OptionParser.error = _op_error
greetings = ('hello', 'hi', 'yo', "what's up", "g'day", 'back to work',
'bonjour',
'hallo',
'ciao',
'hola',
u'olá',
u'dobrý den',
u'zdravstvuite',
u'góðan daginn',
'hej',
'tervehdys',
u'grüezi',
u'céad míle fáilte',
u'hylô',
u'bună ziua',
u'jó napot',
'dobre dan',
u'你好',
u'こんにちは',
u'नमस्कार',
u'안녕하세요')
ARGMAP = {'None': None,
'True': True,
'False': False}
def _(args):
"""Stub function for translation"""
return args
@ -104,7 +162,7 @@ class TaskWatcher(object):
return ''
error = None
try:
result = self.session.getTaskResult(self.id)
self.session.getTaskResult(self.id)
except (six.moves.xmlrpc_client.Fault,koji.GenericError) as e:
error = e
if error is None:
@ -200,7 +258,7 @@ def display_task_results(tasks):
# shouldn't happen
print('%s has not completed' % task_label)
def watch_tasks(session,tasklist,quiet=False):
def watch_tasks(session, tasklist, quiet=False, poll_interval=60):
global options
if not tasklist:
return
@ -240,7 +298,7 @@ def watch_tasks(session,tasklist,quiet=False):
break
sys.stdout.flush()
time.sleep(options.poll_interval)
time.sleep(poll_interval)
except KeyboardInterrupt:
if tasks and not quiet:
progname = os.path.basename(sys.argv[0]) or 'koji'
@ -253,8 +311,7 @@ Running Tasks:
raise
return rv
def watch_logs(session, tasklist, opts):
global options
def watch_logs(session, tasklist, opts, poll_interval):
print("Watching logs (this may be safely interrupted)...")
def _isDone(session, taskId):
info = session.getTaskInfo(taskId)
@ -306,7 +363,7 @@ def watch_logs(session, tasklist, opts):
if not tasklist:
break
time.sleep(options.poll_interval)
time.sleep(poll_interval)
def list_task_output_all_volumes(session, task_id):
@ -369,7 +426,7 @@ def _progress_callback(uploaded, total, piece, time, total_time):
def _running_in_bg():
try:
return (not os.isatty(0)) or (os.getpgrp() != os.tcgetpgrp(0))
except OSError as e:
except OSError:
return True
def linked_upload(localfile, path, name=None):
"""Link a file into the (locally writable) workdir, bypassing upload"""
@ -403,12 +460,12 @@ def has_krb_creds():
try:
ctx = krbV.default_context()
ccache = ctx.default_ccache()
princ = ccache.principal()
ccache.principal()
return True
except krbV.Krb5Error:
return False
def activate_session(session):
def activate_session(session, options):
"""Test and login the session is applicable"""
global options
if options.authtype == "noauth" or options.noauth: