From 9398d9969ec73e79d854db1c89c20a25eb3cf847 Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Thu, 14 Apr 2016 17:22:45 -0700 Subject: [PATCH] add tooltips with failed test links for failed images Oh man I love this so much! Huge thanks to Robery Mayr for help with the HTML/CSS here. You can now hover over the link for any image with test fails to show a tooltip with links to each of the failed tests in openQA, or the Autocloud test output page. Super cool. Woohoo. All in pure HTML/CSS, no stinky JS here. --- fedora_nightlies.py | 66 +++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/fedora_nightlies.py b/fedora_nightlies.py index 4492605..2335bd9 100755 --- a/fedora_nightlies.py +++ b/fedora_nightlies.py @@ -35,7 +35,10 @@ th {background-color: lightgrey;} .relheader {background-color: black; color: white;} .groupheader {background-color: lightskyblue;} .failedlink {color: red;} -.failedcell {line-height: 90%;} +.failcell {position: relative; display: inline-block;} +.faillinks {display: none; border: 1px solid #c8c8c8; left: 100px; position: absolute; z-index: 1; white-space: nowrap; background-color: #f9f9f9; padding: 10px;} +.faillinks a {display: block;} +.failcell:hover .faillinks {display: block;} .passedlink {color: green;} .key {font-size: 0.9em; color: dimgrey;} @@ -99,6 +102,41 @@ def datagrepper_query(topics, days): nxt = False return messages +def get_cell(image): + """Build a results table cell for an image. This is a bit complex + and looks pretty messy in-line in add_group, so it's split out + here.""" + # YAY partial, we all love partial. We want a link to the image + # whatever, but its class differs depending on test status. + lnpart = functools.partial(Element, 'a', image['compose'], href=image['url']) + # simple cases first: pass or none. Just add the link. + if image.testspass is True: + content = lnpart(cssclass='passedlink') + elif image.testspass is None: + content = lnpart(cssclass='passedlink') + else: + # fail. this case is more complex. we need the contents of the + # cell to include the failed test links popups. + # First build the links div: + faillinks = ['Failed tests:'] + if image['openqa']: + fails = [(str(job['id']), job['test']) for job in image['openqa'] + if job['result'] not in ('passed', 'softfail')] + if fails: + faillinks.extend( + [Element('a', "openQA: {0} ({1})".format(jobid, jobtest), + href='https://openqa.fedoraproject.org/tests/{0}'.format(jobid)) + for (jobid, jobtest) in fails]) + elif image['autocloud']: + job = str(image['autocloud']['job_id']) + url = 'https://apps.fedoraproject.org/autocloud/jobs/{0}/output'.format(job) + faillinks.append(Element('a', "Autocloud: " + job, href=url)) + faillinksdiv = Element('div', faillinks, cssclass='faillinks') + # now wrap it and the image link in the cell div: + imglink = lnpart(cssclass='failedlink') + content = Element('div', [imglink, faillinksdiv], cssclass='failcell') + return Element('td', content) + ## ERROR CLASSES @@ -194,31 +232,7 @@ class ReleaseTable(Element): # first cell: arch name cells = [Element('td', arch)] for image in group[arch]: - # YAY partial, we all love partial - lnpart = functools.partial(Element, 'a', image['compose'], href=image['url']) - # add a cell for each image in the list, with - # appropriate class for its test results - if image.testspass is True: - links = [lnpart(cssclass='passedlink')] - elif image.testspass is False: - links = [lnpart(cssclass='failedlink')] - if image['openqa']: - fails = [str(job['id']) for job in image['openqa'] - if job['result'] not in ('passed', 'softfail')] - if fails: - links.extend((Element('br'), 'Fails: ')) - links.extend( - [Element('a', job, - href='https://openqa.fedoraproject.org/tests/{0}'.format(job)) - for job in fails]) - elif image['autocloud']: - job = str(image['autocloud']['job_id']) - links.extend((Element('br'), 'Fails: ')) - url = 'https://apps.fedoraproject.org/autocloud/jobs/{0}'.format(job) - links.append(Element('a', job, href=url)) - else: - links = [lnpart()] - cells.append(Element('td', links)) + cells.append(get_cell(image)) # pad the row with empty cells (this is when we don't # have a 'last known good' as no image passed tests) while len(cells) < 3: