Merge lp:~matsubara/lp-devops-dashboard/devops-css into lp:lp-devops-dashboard

Proposed by Diogo Matsubara
Status: Merged
Approved by: Diogo Matsubara
Approved revision: 60
Merged at revision: 47
Proposed branch: lp:~matsubara/lp-devops-dashboard/devops-css
Merge into: lp:lp-devops-dashboard
Diff against target: 981 lines (+598/-347)
4 files modified
.bzrignore (+8/-0)
src/devops/deploymentreports.py (+1/-0)
src/devops/templates/devops-index.html (+366/-347)
src/devops/templates/devops.css (+223/-0)
To merge this branch: bzr merge lp:~matsubara/lp-devops-dashboard/devops-css
Reviewer Review Type Date Requested Status
Huw Wilkins (community) Approve
Review via email: mp+69119@code.launchpad.net

Commit message

implements new dashboard design.

Description of the change

Implements the new design for the LP devops dashboard based on the mock up done by Huw.

To post a comment you must log in.
Revision history for this message
Huw Wilkins (huwshimi) wrote :

Hi Diogo,

This is looking really good. Some general things would be good to fix up, but none of this is super important. I'm also very happy to push a branch of these changes if you'd like to see how I'd fix them.

Markup:
Generally this is really good. It would be good to replace a bunch of the tables with divs (with float left on them, you might have some clearing trouble, in which case let me know). The "Critical Bugs" is fine as a table as it is tabular data and the "Page Performance Reports" lists should be unordered lists. A helpful thing to think about is "what kind of information is this?" if it's a list of info then you can use a list, if it's a table of data then use a table etc.

It also would be good to use classes instead of div names if you can get away with it (removing the tables might help you with this), also classes are easier to reuse.

Presentation:
For the body declaration of "font-family" it would be good to just rip of exactly what we define in the Launchpad stylesheet (this is defined by the Canonical guide so it would be good to be consistent).

The <hr>s would be nicer if they were styled with a 1px height like in the mockup.

It might be nice to have a bit more space around the edge of the page, as it feels a little cramped at the edges at the moment.

The content is also fairly static (at least in the types of content) and I would consider making this a fixed width page, or at least not as fluid as it is currently. The fluid design makes it hard to see the connection between some of the data.

As I said previously I can have a go at some of these changes if you like. Sorry to give you a huge lump of feedback like that, but very nice progress so far.

review: Needs Fixing
50. By Diogo Matsubara

fix hr styling to be like in the mock up

51. By Diogo Matsubara

fix font-family declaration according to Canonical's guide

52. By Diogo Matsubara

add margin

53. By Diogo Matsubara

change performance reports section to use divs instead of a table

54. By Diogo Matsubara

update instance-status table to use divs instead of table

55. By Diogo Matsubara

remove table from incident report section

56. By Diogo Matsubara

change staging updates to use divs instead of a table

57. By Diogo Matsubara

change deployment qa status section to use divs instead of a table

58. By Diogo Matsubara

clean up instance status section to not use an unordered list

Revision history for this message
Diogo Matsubara (matsubara) wrote :

> Hi Diogo,

Hi Huw,

>
> This is looking really good. Some general things would be good to fix up, but
> none of this is super important. I'm also very happy to push a branch of these
> changes if you'd like to see how I'd fix them.
>
> Markup:
> Generally this is really good. It would be good to replace a bunch of the
> tables with divs (with float left on them, you might have some clearing
> trouble, in which case let me know). The "Critical Bugs" is fine as a table as
> it is tabular data and the "Page Performance Reports" lists should be
> unordered lists. A helpful thing to think about is "what kind of information
> is this?" if it's a list of info then you can use a list, if it's a table of
> data then use a table etc.

Thanks for the advice, I removed all the tables but the critical bugs one and changed the PPR list to be an unordered list.

>
> It also would be good to use classes instead of div names if you can get away
> with it (removing the tables might help you with this), also classes are
> easier to reuse.

Done as much as I could.

>
> Presentation:
> For the body declaration of "font-family" it would be good to just rip of
> exactly what we define in the Launchpad stylesheet (this is defined by the
> Canonical guide so it would be good to be consistent).
>

Done.

> The <hr>s would be nicer if they were styled with a 1px height like in the
> mockup.

To be closer to the mockup I styled them with 2px height instead.

>
> It might be nice to have a bit more space around the edge of the page, as it
> feels a little cramped at the edges at the moment.

Done.

>
> The content is also fairly static (at least in the types of content) and I
> would consider making this a fixed width page, or at least not as fluid as it
> is currently. The fluid design makes it hard to see the connection between
> some of the data.
>

I don't understand what you mean. Could you elaborate further?

>
> As I said previously I can have a go at some of these changes if you like.
> Sorry to give you a huge lump of feedback like that, but very nice progress so
> far.

No worries, I appreciate the feedback and this was a really good exercise to develop my CSS skills.
Let me know what do you think about the changes I did based on your review.

Cheers,

Diogo

Revision history for this message
Huw Wilkins (huwshimi) wrote :

Hi Diogo,

This is all great. I had a bit of a look today and decided to try out a few things. I wanted to experiment with a few things for the redesign. I've changed some of the styles and colours to match the Canonical guidlines and had a play with the font sizes etc. This will be a chance to see how some of these changes go before we try them out on Launchpad.

Sorry to hijack you work a little bit. I've pushed my changes here:

https://code.launchpad.net/~huwshimi/lp-devops-dashboard/devops-css

I'm not sure what the best way to make this work. Maybe you can merge my changes into your branch?

Revision history for this message
Huw Wilkins (huwshimi) wrote :

Oh I forgot to mention that I added another image so you will need to symlink that to your tmp directory if you want to try out the changes.

Also, here's a screenshot of my changes:

http://people.canonical.com/~huwshimi/devops_dashboard.png

Revision history for this message
Huw Wilkins (huwshimi) wrote :

Hmmm... and I just saw a screenshot of it and realised something strange is going on with the vertical width. I'll take a look at that tomorrow.

59. By Diogo Matsubara

merge Huw's changes to adequate the design to the canonical style

Revision history for this message
Diogo Matsubara (matsubara) wrote :

> Hmmm... and I just saw a screenshot of it and realised something strange is
> going on with the vertical width. I'll take a look at that tomorrow.

I don't see what's wrong with the vertical width. In any case, I merged in your changes and am ready to deploy this. Let me know when you have your branch with the vertical changes ready and I'll merge them in and deploys the code.

Thanks a lot!

Revision history for this message
Huw Wilkins (huwshimi) wrote :

I've just pushed a fix for the width issues to my branch (https://code.launchpad.net/~huwshimi/lp-devops-dashboard/devops-css). If you merge that change I'm happy to approve all this.

review: Approve
60. By Diogo Matsubara

merge Huw's changes to fix width in from incident counts

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file '.bzrignore'
2--- .bzrignore 1970-01-01 00:00:00 +0000
3+++ .bzrignore 2011-08-09 17:22:36 +0000
4@@ -0,0 +1,8 @@
5+.installed.cfg
6+bin/
7+develop-eggs/
8+devops.conf
9+download-cache/
10+eggs/
11+parts/
12+src/devops.egg-info/
13
14=== modified file 'src/devops/deploymentreports.py'
15--- src/devops/deploymentreports.py 2011-06-17 21:35:56 +0000
16+++ src/devops/deploymentreports.py 2011-08-09 17:22:36 +0000
17@@ -77,6 +77,7 @@
18
19 def __init__(self, reports_folder, report_name):
20 self.report_name = report_name
21+ self.short_name = report_name.strip('.html').replace('deployment-', '')
22 self.report_path = join(reports_folder, report_name)
23 if not exists(self.report_path):
24 raise ReportFilesNotFound(
25
26=== added file 'src/devops/templates/bg_pattern.png'
27Binary files src/devops/templates/bg_pattern.png 1970-01-01 00:00:00 +0000 and src/devops/templates/bg_pattern.png 2011-08-09 17:22:36 +0000 differ
28=== modified file 'src/devops/templates/devops-index.html'
29--- src/devops/templates/devops-index.html 2011-06-17 21:43:53 +0000
30+++ src/devops/templates/devops-index.html 2011-08-09 17:22:36 +0000
31@@ -1,351 +1,370 @@
32 <!DOCTYPE html>
33 <html xmlns="http://www.w3.org/1999/xhtml"
34 xmlns:py="http://genshi.edgewall.org/">
35-<head>
36-<meta http-equiv="refresh" content="300"/>
37-<title>DevOps Dashboard</title>
38-<style>
39- #report_meta {
40- text-align: right;
41- font-size: small;
42- color: #999;
43- float: right;
44- }
45- #report_meta p {
46- margin: 0;
47- }
48-
49- .buglinks ul,
50- .buglinks ul li,
51- #deployments .buglinks ul,
52- #deployments .buglinks ul li {
53- display: inline;
54- margin: 0;
55- padding: 0;
56- }
57-
58-</style>
59-
60-<py:def function="buglinks(fixed_bugs)">
61- <div py:if="fixed_bugs" class="buglinks">Fixes bug<py:if test="len(fixed_bugs) > 1">s</py:if>:
62- <ul>
63- <li py:for="bug in fixed_bugs">
64- <a href="http://launchpad.net/bugs/${bug}">Bug:${bug}</a>
65- </li>
66- </ul>
67- </div>
68-</py:def>
69-
70-<py:def function="buglink(bugnumber)">
71- <a href="http://launchpad.net/bugs/${bugnumber}">Bug:${bugnumber}</a>
72-</py:def>
73-
74-</head>
75-<body>
76-
77-<div id="report_meta">
78- <p>Generated on ${date_generated}</p>
79-</div>
80-
81-<h1>QA</h1>
82-<div>
83-<ul>
84- <div id="critical_bugs">
85- <li><strong>Critical Bugs</strong></li>
86- <ul>
87- <li>Today</li>
88- <ul>
89- <li>New: ${len(critical_bugs_info.critical_bugs_filed_today)}</li>
90- <li>Closed: ${len(critical_bugs_info.critical_bugs_closed_today)}</li>
91- <li>Balance:
92- <py:if test="critical_bugs_info.critical_today_balance">
93- <py:if test="critical_bugs_info.critical_today_balance >= 0">
94- <font color="red"><strong>+ ${critical_bugs_info.critical_today_balance}</strong></font>
95- </py:if>
96- <py:if test="not critical_bugs_info.critical_today_balance >= 0 and critical_bugs_info.critical_today_balance != 0">
97- <font color="green"><strong>- ${critical_bugs_info.critical_today_balance * -1}</strong></font>
98- </py:if>
99- <py:if test="critical_bugs_info.critical_today_balance == 0">
100- <strong>${critical_bugs_info.critical_today_balance}</strong>
101- </py:if>
102- </py:if>
103- </li>
104-
105- <li>Total (ignoring not-pie-criticals): ${len(critical_bugs_info.critical_bugs_total)}</li>
106- <ul>
107- <li>Fix Committed: ${len(critical_bugs_info.critical_fix_committed)}</li>
108- <li>Triaged: ${len(critical_bugs_info.critical_triaged)}</li>
109- </ul>
110-
111- <li>OOPS: ${len(critical_bugs_info.critical_oopses)}</li>
112- <li>Timeouts: ${len(critical_bugs_info.critical_timeouts)}</li>
113- <li>Regressions: ${len(critical_bugs_info.critical_regressions)}</li>
114- </ul>
115- <li>Last week</li>
116- <ul>
117- <li>New: ${len(critical_bugs_info.critical_bugs_filed_last_days)}</li>
118- <li>Closed: ${len(critical_bugs_info.critical_bugs_closed_last_days)}</li>
119- <li>Balance:
120- <py:if test="critical_bugs_info.critical_last_days_balance is not None">
121- <py:if test="critical_bugs_info.critical_last_days_balance > 0">
122- <font color="red"><strong>+ ${critical_bugs_info.critical_last_days_balance}</strong></font>
123- </py:if>
124- <py:if test="not critical_bugs_info.critical_last_days_balance >= 0 and critical_bugs_info.critical_last_days_balance != 0">
125- <font color="green"><strong>- ${critical_bugs_info.critical_last_days_balance * -1}</strong></font>
126- </py:if>
127- <py:if test="critical_bugs_info.critical_last_days_balance == 0">
128- <strong>${critical_bugs_info.critical_last_days_balance}</strong>
129- </py:if>
130- </py:if>
131- </li>
132-
133- </ul>
134- </ul>
135- </div>
136- <li><strong>Deployment QA status</strong></li>
137- <ul>
138- <py:if test="use_jenkins">
139- <li><a href="https://lpci.wedontsleep.org/job/devel">devel</a></li>
140- <ul>
141- <li>Last revno: <strong>r${last_deployed_devel}</strong> (build #<a href="https://lpci.wedontsleep.org/job/devel/lastSuccessfulBuild/">${last_successful_buildno})</a></li>
142- <li>Current devel build: <a href="https://lpci.wedontsleep.org/job/devel/lastBuild/">#${current_buildno}</a> (${elapsed_time})</li>
143- </ul>
144- </py:if>
145- <li><a href="https://devpad.canonical.com/~lpqateam/qa_reports/deployment-stable.html">stable</a></li>
146- <ul>
147- Deployability:
148- <ul>
149- <li>Last deployed revision (production): <strong>r${dr_stable.current_deployed_revno}</strong></li>
150- <py:if test="dr_stable.current_ready_to_deploy">
151- <py:if test="dr_stable.current_ready_to_deploy >= 5"><font color="green">There are enough revisions to request a nodowntime deployment!</font></py:if>
152- <li>Current deployable revision: <strong>r${dr_stable.current_deployable_revno}</strong></li>
153- <li>There
154- <py:if test="dr_stable.current_ready_to_deploy == 1"> is <strong>${dr_stable.current_ready_to_deploy}</strong> revision</py:if>
155- <py:if test="dr_stable.current_ready_to_deploy > 1"> are <strong>${dr_stable.current_ready_to_deploy}</strong> revisions</py:if>
156- ready to deploy.
157- </li>
158- ${buglinks(dr_stable.deployable_bugs)}
159- </py:if>
160- <py:if test="not dr_stable.current_ready_to_deploy">
161- <li>There are no revisions ready to deploy.</li>
162- </py:if>
163- </ul>
164- QA:
165- <ul>
166- <py:if test="dr_stable.current_blocking_revno">
167- <li>There
168- <py:if test="dr_stable.blocked_revnos_count == 1"> is <strong>${dr_stable.blocked_revnos_count}</strong> revision</py:if>
169- <py:if test="dr_stable.blocked_revnos_count > 1"> are <strong>${dr_stable.blocked_revnos_count}</strong> revisions</py:if>
170- waiting in the queue.</li>
171- <li>Current blocking revision is <strong>r${dr_stable.current_blocking_revno}</strong>: ${buglink(dr_stable.current_blocker_details['bug'])} is marked as ${dr_stable.current_blocker_details['reason']}.</li>
172- </py:if>
173- <py:if test="not dr_stable.current_blocking_revno">
174- <li>There are no revisions waiting in QA queue.</li>
175- </py:if>
176- </ul>
177- </ul>
178-
179- <li><a href="https://devpad.canonical.com/~lpqateam/qa_reports/deployment-db-stable.html">db-stable</a></li>
180- <ul>
181- Deployability:
182- <ul>
183- <li>Last deployed revision (production): <strong>r${dr_dbstable.current_deployed_revno}</strong></li>
184- <py:if test="dr_dbstable.current_ready_to_deploy">
185- <li>Current deployable revision: <strong>r${dr_dbstable.current_deployable_revno}</strong></li>
186- <li>There
187- <py:if test="dr_dbstable.current_ready_to_deploy == 1"> is <strong>${dr_dbstable.current_ready_to_deploy}</strong> revision</py:if>
188- <py:if test="dr_dbstable.current_ready_to_deploy > 1"> are <strong>${dr_dbstable.current_ready_to_deploy}</strong> revisions</py:if>
189- ready to deploy.
190- </li>
191- ${buglinks(dr_dbstable.deployable_bugs)}
192- </py:if>
193- <py:if test="not dr_dbstable.current_ready_to_deploy">
194- <li>There are no revisions ready to deploy.</li>
195- </py:if>
196- </ul>
197- QA:
198- <ul>
199- <py:if test="dr_dbstable.current_blocking_revno">
200- <li>There
201- <py:if test="dr_dbstable.blocked_revnos_count == 1"> is <strong>${dr_dbstable.blocked_revnos_count}</strong> revision</py:if>
202- <py:if test="dr_dbstable.blocked_revnos_count > 1"> are <strong>${dr_dbstable.blocked_revnos_count}</strong> revisions</py:if>
203- waiting in the queue.</li>
204- <li>Current blocking revision is <strong>r${dr_dbstable.current_blocking_revno}</strong>: ${buglink(dr_dbstable.current_blocker_details['bug'])} is marked as ${dr_dbstable.current_blocker_details['reason']}.</li>
205- </py:if>
206- <py:if test="not dr_dbstable.current_blocking_revno">
207- <li>There are no revisions waiting in QA queue.</li>
208- </py:if>
209- </ul>
210- </ul>
211-
212- </ul>
213-
214- <li><a href="https://devpad.canonical.com/~lpqateam/oops-summaries/">OOPS summaries</a></li>
215- <ul>
216- <li>
217- <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/production-${current_summaries_date}.html">
218- Production errors for ${current_summaries_date}
219- </a>
220- </li>
221- <li>
222- <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/qastaging-${current_summaries_date}.html">
223- QA Staging errors for ${current_summaries_date}
224- </a>
225- </li>
226- <li>
227- <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/staging-${current_summaries_date}.html">
228- Staging errors for ${current_summaries_date}
229- </a>
230- </li>
231- <li>
232- <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/soyuz-${current_summaries_date}.html">
233- Soyuz errors for ${current_summaries_date}
234- </a>
235- </li>
236- </ul>
237-</ul>
238-</div>
239-<h1>Deployment and LOSA information</h1>
240-<div>
241-<ul>
242- <li><a href="https://wiki.canonical.com/IncidentReports">Incident Reports</a></li>
243- <ul>
244- <li>Last reported incident: <a href="https://wiki.canonical.com/IncidentReports/${incident_reports.last_report}">${incident_reports.last_report}</a>, on ${incident_reports.last_date} (${incident_reports._days_ago})</li>
245- <li>We are ${incident_reports.days_without_incidents} day(s) without incidents, ${incident_reports.total_incidents} incident(s) since ${incident_reports.since}.</li>
246- <li>Our record without incidents is ${incident_reports.most_days_with_no_incidents} day(s).</li>
247- </ul>
248- <li>Status</li>
249- <ul>
250- <li><a href="https://launchpad.net">Production</a></li>
251- <ul>
252- <li>Status:
253- <py:if test="prod_instance.is_ready">
254- <font color="green"><strong>UP</strong></font>
255- </py:if>
256- <py:if test="not prod_instance.is_ready">
257- <font color="red"><strong>DOWN</strong></font>
258- <py:if test="prod_instance.is_responding">
259- Not ready (maybe code/db update in progress?)
260- </py:if>
261- <py:if test="not prod_instance.is_responding">
262- (not responding!)
263- </py:if>
264- </py:if>
265- </li>
266- <li>Current revision: <strong>
267- <py:if test="not prod_instance.last_deployed_revno">
268- N/A
269- </py:if>
270- <py:if test="prod_instance.last_deployed_revno">
271- r${prod_instance.last_deployed_revno}
272- </py:if>
273- </strong></li>
274- </ul>
275-
276- <li><a href="https://qastaging.launchpad.net">QA Staging</a></li>
277- <ul>
278- <li>Status:
279- <py:if test="qastaging_instance.is_ready">
280- <font color="green"><strong>UP</strong></font>
281- </py:if>
282- <py:if test="not qastaging_instance.is_ready">
283- <font color="red"><strong>DOWN</strong></font> -
284- <py:if test="qastaging_instance.is_responding">
285- Not ready (maybe code/db update in progress?)
286- </py:if>
287- <py:if test="not qastaging_instance.is_responding">
288- (not responding!)
289- </py:if>
290- </py:if>
291- </li>
292- <li>Current revision: <strong>
293- <py:if test="not qastaging_instance.last_deployed_revno">
294- N/A
295- </py:if>
296- <py:if test="qastaging_instance.last_deployed_revno">
297- r${qastaging_instance.last_deployed_revno}
298- </py:if>
299- </strong></li>
300- </ul>
301-
302-
303- <li><a href="https://staging.launchpad.net">Staging</a></li>
304- <ul>
305- <li>Status:
306- <py:if test="staging_instance.is_ready">
307- <font color="green"><strong>UP</strong></font>
308- </py:if>
309- <py:if test="not staging_instance.is_ready">
310- <font color="red"><strong>DOWN</strong></font>
311- <py:if test="staging_instance.is_responding">
312- Not ready (maybe code/db update in progress?)
313- </py:if>
314- <py:if test="not staging_instance.is_responding">
315- (not responding!)
316- </py:if>
317- </py:if>
318- </li>
319- <li>Current revision: <strong>
320- <py:if test="not staging_instance.last_deployed_revno">
321- N/A
322- </py:if>
323- <py:if test="staging_instance.last_deployed_revno">
324- r${staging_instance.last_deployed_revno}
325- </py:if>
326- </strong></li>
327- <li><a href="https://staging.launchpad.net/successful-updates.txt">Staging updates</a></li>
328- <ul>
329- <li>Last code update was ${staging_instance.last_code_update['date']} ${staging_instance.last_code_update['time']} (${staging_instance.last_code_update['time_ago']}), to <strong>r${staging_instance.last_code_update['revno']}</strong></li>
330- <li>Last DB update was ${staging_instance.last_db_update['date']} ${staging_instance.last_db_update['time']} (${staging_instance.last_db_update['time_ago']}), to <strong>r${staging_instance.last_db_update['revno']}</strong></li>
331- </ul>
332- </ul>
333-<!-- <li>Are we on testfix? <b>NO</b></li> -->
334- </ul>
335- <li><a href="https://wiki.canonical.com/InformationInfrastructure/OSA/LaunchpadProductionStatus">Launchpad Production Status</a></li>
336- <li><a href="https://wiki.canonical.com/InformationInfrastructure/OSA/LPIncidentLog">LOSAs Incident Log</a></li>
337- <li><a href="https://lpbuildbot.canonical.com/">Buildbot</a></li>
338-</ul>
339-</div>
340-<div>
341-<h1>Performance and Stats</h1>
342-<ul>
343- <li><a href="https://lpstats.canonical.com/graphs/">All Launchpad Graphs</a></li>
344- <li>Critical bugs broken down by project and type</li>
345- <ul>
346- <li><a
347- href="https://lpstats.canonical.com/graphs/LPProjectCriticalBurndown/">Burndown
348- chart (remaining open bugs)</a></li>
349- <li><a
350- href="https://lpstats.canonical.com/graphs/LPProjectCriticalClosed/">Bugs closed in the last 7 days</a></li>
351- </ul>
352- <li>Page Performance Reports</li>
353- <ul>
354- <li>Daily:</li>
355- <ul>
356- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-categories.html">Categories</a></li>
357- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-combined.html">Combined</a></li>
358- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-pageids.html">Page IDs</a></li>
359- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-timeout-candidates.html">Timeout candidates</a></li>
360- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-top200.html">Top 200</a></li>
361- </ul>
362- <li>Weekly:</li>
363- <ul>
364- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-categories.html">Categories</a></li>
365- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-combined.html">Combined</a></li>
366- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-pageids.html">Page IDs</a></li>
367- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-timeout-candidates.html">Timeout candidates</a></li>
368- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-top200.html">Top 200</a></li>
369- </ul>
370- <li>Monthly:</li>
371- <ul>
372- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-categories.html">Categories</a></li>
373- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-combined.html">Combined</a></li>
374- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-pageids.html">Page IDs</a></li>
375- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-timeout-candidates.html">Timeout candidates</a></li>
376- <li><a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-top200.html">Top 200</a></li>
377- </ul>
378- </ul>
379-</ul>
380-</div>
381-</body>
382+ <head>
383+ <meta http-equiv="refresh" content="300"/>
384+ <title>Launchpad DevOps Dashboard</title>
385+ <style type="text/css" media="screen">
386+ @import url("devops.css");
387+ </style>
388+
389+ <py:def function="buglinks(fixed_bugs)">
390+ <div py:if="fixed_bugs" class="buglinks">Fixes bug<py:if test="len(fixed_bugs) > 1">s</py:if>:
391+ <ul>
392+ <li py:for="bug in fixed_bugs">
393+ <a href="http://launchpad.net/bugs/${bug}">Bug:${bug}</a>
394+ </li>
395+ </ul>
396+ </div>
397+ </py:def>
398+
399+ <py:def function="buglink(bugnumber)">
400+ <a href="http://launchpad.net/bugs/${bugnumber}">Bug:${bugnumber}</a>
401+ </py:def>
402+
403+ <py:def function="deployment(deployment_report)">
404+ <div class="deployment">
405+ <a href="https://devpad.canonical.com/~lpqateam/qa_reports/${deployment_report.report_name}">${deployment_report.short_name}</a>
406+ <br />
407+ <py:if test="deployment_report.current_blocking_revno">
408+ <div class="left">
409+ <span class="revdata">r${deployment_report.current_deployed_revno}</span>
410+ <br />
411+ <span class="description">last <strong>deployed</strong> revision</span>
412+ </div>
413+ <div class="left">
414+ <span class="revdata">${deployment_report.blocked_revnos_count}</span>
415+ <br />
416+ <span class="description">revisions <strong>blocked</strong> for deployment</span>
417+ </div>
418+ <div class="left">
419+ <span class="revdata">r${deployment_report.current_blocking_revno}</span>
420+ <br />
421+ <span class="description">
422+ currently <strong>blocking</strong> deployment.
423+ ${buglink(deployment_report.current_blocker_details['bug'])} is marked
424+ as ${deployment_report.current_blocker_details['reason']}.
425+ </span>
426+ </div>
427+ </py:if>
428+ <py:if test="not deployment_report.current_blocking_revno">
429+ There are no revisions waiting in QA queue.
430+ </py:if>
431+ </div>
432+ </py:def>
433+
434+ <py:def function="instance_status(lp_instance)">
435+ <div class="left">
436+ <a href="${lp_instance.url}">${lp_instance.name}</a>
437+ <br />
438+ <py:if test="lp_instance.is_ready">
439+ <span class="up"><strong>UP</strong></span>
440+ </py:if>
441+ <py:if test="not lp_instance.is_ready">
442+ <span class="down"><strong>DOWN</strong></span>
443+ </py:if>
444+ <br />
445+ <span class="description">
446+ <py:if test="not lp_instance.is_ready">
447+ <py:if test="lp_instance.is_responding">
448+ Not ready (maybe code/db update in progress?)
449+ </py:if>
450+ <py:if test="not lp_instance.is_responding">
451+ (not responding!)
452+ </py:if>
453+ </py:if>
454+ <py:if test="lp_instance.last_deployed_revno">
455+ r${lp_instance.last_deployed_revno}
456+ </py:if>
457+ <py:if test="not lp_instance.last_deployed_revno">
458+ N/A
459+ </py:if>
460+ </span>
461+ </div>
462+ </py:def>
463+
464+ <py:def function="critical_balance(balance)">
465+ <py:if test="balance is not None">
466+ <py:if test="balance > 0">
467+ <strong class="red">+ ${balance}</strong>
468+ </py:if>
469+ <py:if test="not balance >= 0 and balance != 0">
470+ <strong class="green">- ${balance * -1}</strong>
471+ </py:if>
472+ <py:if test="balance == 0">
473+ <strong>${balance}</strong>
474+ </py:if>
475+ </py:if>
476+ </py:def>
477+ </head>
478+ <body>
479+ <div class="page-center-wrap">
480+ <div class="page-center">
481+ <div class="page-center-content">
482+ <div id="header">
483+ <div id="report_meta">
484+ <p>Generated on ${date_generated}</p>
485+ </div>
486+ <h1>Launchpad DevOps Dashboard</h1>
487+ </div>
488+
489+ <h2>QA</h2>
490+ <div class="section">
491+ <div id="critical-bugs" class="info-block">
492+ <h3>Critical Bugs</h3>
493+ <hr />
494+ <table id="bugs-table">
495+ <tbody>
496+ <tr>
497+ <td class="legend"></td>
498+ <td class="legend">Last Week</td>
499+ <td class="legend">Today</td>
500+ <td class="legend"></td>
501+ <td class="legend"></td>
502+ <td class="legend"></td>
503+ <td class="legend"></td>
504+ </tr>
505+ <tr>
506+ <td class="legend">New</td>
507+ <td>${len(critical_bugs_info.critical_bugs_filed_last_days)}</td>
508+ <td>${len(critical_bugs_info.critical_bugs_filed_today)}</td>
509+ <td class="legend">Total*</td>
510+ <td>${len(critical_bugs_info.critical_bugs_total)}</td>
511+ <td class="legend">Oops</td>
512+ <td>${len(critical_bugs_info.critical_oopses)}</td>
513+ </tr>
514+ <tr>
515+ <td class="legend">Closed</td>
516+ <td>${len(critical_bugs_info.critical_bugs_closed_last_days)}</td>
517+ <td>${len(critical_bugs_info.critical_bugs_closed_today)}</td>
518+ <td class="legend">Fix committed</td>
519+ <td>${len(critical_bugs_info.critical_fix_committed)}</td>
520+ <td class="legend">Timeouts</td>
521+ <td>${len(critical_bugs_info.critical_timeouts)}</td>
522+ </tr>
523+ <tr>
524+ <td class="legend">Balance</td>
525+ <td>
526+ ${critical_balance(critical_bugs_info.critical_last_days_balance)}
527+ </td>
528+ <td>
529+ ${critical_balance(critical_bugs_info.critical_today_balance)}
530+ </td>
531+ <td class="legend">Triaged</td>
532+ <td>${len(critical_bugs_info.critical_triaged)}</td>
533+ <td class="legend">Regressions</td>
534+ <td>${len(critical_bugs_info.critical_regressions)}</td>
535+ </tr>
536+ </tbody>
537+ </table>
538+ <p class="description">* ignoring not-pie-critical</p>
539+ </div>
540+ <div id="qa-status" class="info-block">
541+ <h3>Deployment QA status</h3>
542+ <hr />
543+ <div class="left">
544+ ${deployment(dr_stable)}
545+ </div>
546+ <div class="right">
547+ ${deployment(dr_dbstable)}
548+ </div>
549+ <div class="clear"></div>
550+ </div>
551+ <div class="quicklinks info-block">
552+ <h3>Quicklinks</h3>
553+ <hr />
554+ <div class="left">
555+ <ul>
556+ <li><a href="https://launchpad.net/launchpad/+bugs?field.tag=qa-needstesting+qa-bad&amp;field.tags_combinator=ANY">Bugs: qa-needstesting and qa-bad</a></li>
557+ <li><a href="https://code.launchpad.net/launchpad/+activereviews">Branches that need review</a></li>
558+ <li><a href="https://code.launchpad.net/launchpad/+merges?field.status=CODE_APPROVED&amp;field.status-empty-marker=1">Branches that need landing</a></li>
559+ </ul>
560+ </div>
561+ <div class="right">
562+ <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/">OOPS summaries</a>
563+ <ul>
564+ <li>
565+ <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/production-${current_summaries_date}.html">
566+ Production errors for ${current_summaries_date}
567+ </a>
568+ </li>
569+ <li>
570+ <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/qastaging-${current_summaries_date}.html">
571+ QA Staging errors for ${current_summaries_date}
572+ </a>
573+ </li>
574+ <li>
575+ <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/staging-${current_summaries_date}.html">
576+ Staging errors for ${current_summaries_date}
577+ </a>
578+ </li>
579+ <li>
580+ <a href="https://devpad.canonical.com/~lpqateam/oops-summaries/soyuz-${current_summaries_date}.html">
581+ Soyuz errors for ${current_summaries_date}
582+ </a>
583+ </li>
584+ </ul>
585+ </div>
586+ </div>
587+ </div>
588+ <h2>Deployment and LOSA information</h2>
589+ <div class="section">
590+ <div id="staging-updates" class="left info-block">
591+ <h3><a href="https://staging.launchpad.net/successful-updates.txt">Staging updates</a></h3>
592+ <hr />
593+ <div class="staging-updates">
594+ Code
595+ <br />
596+ <span class="revdata" title="${staging_instance.last_code_update['date']} ${staging_instance.last_code_update['time']}">
597+ ${staging_instance.last_code_update['time_ago']} /
598+ r${staging_instance.last_code_update['revno']}
599+ </span>
600+ <br />
601+ <span class="description">Last successful <strong>update</strong> </span>
602+ </div>
603+ <div class="staging-updates">
604+ DB
605+ <br />
606+ <span class="revdata" title="${staging_instance.last_db_update['date']} ${staging_instance.last_db_update['time']}">
607+ ${staging_instance.last_db_update['time_ago']} /
608+ r${staging_instance.last_db_update['revno']}
609+ </span>
610+ <br />
611+ <span class="description">Last successful full <strong>update</strong></span>
612+ </div>
613+ <div class="staging-updates">
614+ Revno
615+ <br />
616+ <span class="revdata">
617+ <py:if test="not staging_instance.last_deployed_revno">
618+ N/A
619+ </py:if>
620+ <py:if test="staging_instance.last_deployed_revno">
621+ r${staging_instance.last_deployed_revno}
622+ </py:if>
623+ </span>
624+ <br />
625+ <span class="description">Current <strong>revno</strong> on staging</span>
626+ </div>
627+ </div>
628+ <div id="incident-reports" class="right info-block">
629+ <h3><a href="https://wiki.canonical.com/IncidentReports">Incident Reports</a></h3>
630+ <hr />
631+ <div class="safety">
632+ <img src="safety_sign.png" alt="" />
633+ <span id="incidents">${incident_reports.total_incidents}</span>
634+ <span id="record">${incident_reports.most_days_with_no_incidents}</span>
635+ </div>
636+ Last reported incident:
637+ <br />
638+ <a href="https://wiki.canonical.com/IncidentReports/${incident_reports.last_report}">${incident_reports.last_report}</a>
639+ <br />
640+ <span title="${incident_reports.last_date}" class="description">${incident_reports._days_ago}</span>
641+ <hr />
642+ </div>
643+ <div id="status" class="quicklinks info-block">
644+ <h3>Status</h3>
645+ <hr />
646+ ${instance_status(prod_instance)}
647+ ${instance_status(qastaging_instance)}
648+ ${instance_status(staging_instance)}
649+ </div>
650+ <div class="quicklinks info-block">
651+ <h3>Quicklinks</h3>
652+ <hr />
653+ <div class="left">
654+ <ul>
655+ <li><a href="https://wiki.canonical.com/InformationInfrastructure/OSA/LaunchpadProductionStatus">Launchpad Production Status</a></li>
656+ <li><a href="https://wiki.canonical.com/InformationInfrastructure/OSA/LPIncidentLog">LOSAs Incident Log</a></li>
657+ <li><a href="https://lpbuildbot.canonical.com/">Buildbot</a></li>
658+ </ul>
659+ </div>
660+ </div>
661+ </div>
662+
663+ <h2>Performance &amp; Stats</h2>
664+ <div class="section">
665+ <div id="graphs" class="info-block">
666+ <h3>Graphs</h3>
667+ <hr />
668+ <a href="https://lpstats.canonical.com/graphs/">All Launchpad Graphs</a>
669+ <br />
670+ Critical bugs broken down by project and type
671+ <ul>
672+ <li><a
673+ href="https://lpstats.canonical.com/graphs/LPProjectCriticalBurndown/">Burndown
674+ chart (remaining open bugs)</a></li>
675+ <li><a
676+ href="https://lpstats.canonical.com/graphs/LPProjectCriticalClosed/">Bugs closed in the last 7 days</a></li>
677+ </ul>
678+ </div>
679+ <div class="quicklinks info-block">
680+ <h3>Page Performance Reports</h3>
681+ <hr />
682+ <div class="left third">
683+ <h4>Daily</h4>
684+ <ul>
685+ <li>
686+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-categories.html">Categories</a>
687+ </li>
688+ <li>
689+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-combined.html">Combined</a>
690+ </li>
691+ <li>
692+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-pageids.html">Page IDs</a>
693+ </li>
694+ <li>
695+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-timeout-candidates.html">Timeout candidates</a>
696+ </li>
697+ <li>
698+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-daily-top200.html">Top 200</a>
699+ </li>
700+ </ul>
701+ </div>
702+ <div class="left third">
703+ <h4>Weekly</h4>
704+ <ul>
705+ <li>
706+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-categories.html">Categories</a>
707+ </li>
708+ <li>
709+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-combined.html">Combined</a>
710+ </li>
711+ <li>
712+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-pageids.html">Page IDs</a>
713+ </li>
714+ <li>
715+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-timeout-candidates.html">Timeout candidates</a>
716+ </li>
717+ <li>
718+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-weekly-top200.html">Top 200</a>
719+ </li>
720+ </ul>
721+ </div>
722+ <div class="left third">
723+ <h4>Monthly</h4>
724+ <ul>
725+ <li>
726+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-categories.html">Categories</a>
727+ </li>
728+ <li>
729+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-combined.html">Combined</a>
730+ </li>
731+ <li>
732+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-pageids.html">Page IDs</a>
733+ </li>
734+ <li>
735+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-timeout-candidates.html">Timeout candidates</a>
736+ </li>
737+ <li>
738+ <a href="https://devpad.canonical.com/~lpqateam/ppr/lpnet/latest-monthly-top200.html">Top 200</a>
739+ </li>
740+ </ul>
741+ </div>
742+ </div>
743+ </div>
744+ </div>
745+ </div>
746+ </div>
747+ </body>
748 </html>
749
750=== added file 'src/devops/templates/devops.css'
751--- src/devops/templates/devops.css 1970-01-01 00:00:00 +0000
752+++ src/devops/templates/devops.css 2011-08-09 17:22:36 +0000
753@@ -0,0 +1,223 @@
754+/****
755+
756+Font sizes to be used.
757+Base is set to 0.75em or 12px (if browser default is 16px).
758+ 0.8em 10px -- smallest text
759+ 1em (12px) -- body
760+ ?em 14px -- navigation
761+ 1.3em 16px -- h3
762+ 1.8em (22px) -- h2
763+ em 30px -- h1
764+
765+****/
766+
767+html {
768+ background: #eceae8 url('bg_pattern.png') repeat top left;
769+ margin: 0;
770+ padding: 0;
771+}
772+
773+body {
774+ font-family: 'UbuntuBeta Regular', Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif;
775+ font-size: 0.75em;
776+ line-height: 1.5em;
777+ color: #000;
778+ margin: 0 0 40px 0;
779+}
780+
781+a {
782+ color: #5e2750;
783+ text-decoration: none;
784+}
785+
786+h1,
787+h2,
788+h3,
789+h4 {
790+ font-weight: normal;
791+}
792+
793+h2 {
794+ margin: 1.3em 0 1em 15px;
795+ font-size: 1.8em;
796+ line-height: 26px;
797+ }
798+
799+h3, h4{
800+ margin: 0;
801+}
802+
803+hr {
804+ border: 0;
805+ height: 1px;
806+ background-color: #ddd;
807+}
808+
809+.clear {
810+ clear: both;
811+}
812+
813+.page-center-wrap {
814+ text-align: left;
815+}
816+.page-center {
817+ text-align: center;
818+ margin: 0px;
819+ margin: auto;
820+ width: 960px;
821+}
822+.page-center-content {
823+ text-align: left;
824+}
825+
826+#header {
827+ background-color: #2c001e;
828+ color: #fff;
829+ padding: 15px 30px;
830+ border-radius: 0 0 6px 6px;
831+ box-shadow: 0 0 3px rgba(0,0,0,0.5);
832+}
833+
834+#header h1 {
835+ margin: 0;
836+ font-size: 1.5em;
837+}
838+
839+.description {
840+ font-size: 0.8em;
841+ color: #787878;
842+}
843+
844+.safety {
845+ position: relative;
846+}
847+
848+#incidents,
849+#record {
850+ font-size: 1.3em;
851+ position: absolute;
852+ color: white;
853+ font-weight: bold;
854+}
855+
856+#incidents {
857+ top: 13px;
858+ left: 128px;
859+}
860+
861+#record {
862+ top: 71px;
863+ left: 215px;
864+}
865+
866+.section {
867+ border-radius: 6px;
868+ box-shadow: 0 1px 3px rgba(0,0,0,0.3);
869+ background: white;
870+ padding: 20px;
871+ margin-bottom: 20px;
872+}
873+
874+.info-block {
875+ margin-bottom: 30px;
876+}
877+
878+.quicklinks {
879+ overflow:auto;
880+ width: 100%;
881+}
882+
883+.left, .right {
884+ width: 45%;
885+}
886+
887+.left.third {
888+ width: 33%;
889+}
890+
891+.left {
892+ float: left;
893+}
894+
895+.left ul {
896+ list-style: none;
897+ padding: 0;
898+}
899+
900+.right {
901+ float:right;
902+}
903+
904+.deployment .left {
905+ width: 28%;
906+ line-height: 1.1em;
907+}
908+
909+#status .left {
910+ width: 15%;
911+}
912+
913+.up,
914+.down {
915+ font-size: 1.8em;
916+}
917+.up {
918+ color: green;
919+}
920+
921+.down{
922+ color: red;
923+}
924+
925+.staging-updates {
926+ float:left
927+}
928+
929+.staging-updates .revdata {
930+ font-size: 1.2em;
931+}
932+
933+.revdata {
934+ font-size: 1.8em;
935+ line-height: 1.3em;
936+ font-weight: bold;
937+ padding-right: 20px;
938+}
939+
940+table {
941+ border-collapse: collapse;
942+ border-spacing:0;
943+}
944+
945+td {
946+ padding: 2px 4px;
947+}
948+
949+#bugs-table tr td.legend {
950+ padding-right: 15px;
951+ background: #e9e7e5;
952+ text-align: left;
953+ font-size: 0.8em;
954+}
955+
956+#bugs-table tr td {
957+ text-align: center;
958+ border: 1px solid #e9e7e5;
959+}
960+
961+#bugs-table strong.green {
962+ color: green;
963+}
964+
965+#bugs-table strong.red {
966+ color: red;
967+}
968+
969+#report_meta {
970+ text-align: right;
971+ font-size: 0.8em;
972+ float: right;
973+}
974+#report_meta p {
975+ margin: 0;
976+}
977
978=== added file 'src/devops/templates/safety_sign.png'
979Binary files src/devops/templates/safety_sign.png 1970-01-01 00:00:00 +0000 and src/devops/templates/safety_sign.png 2011-08-09 17:22:36 +0000 differ
980=== added file 'src/devops/templates/safety_sign.xcf'
981Binary files src/devops/templates/safety_sign.xcf 1970-01-01 00:00:00 +0000 and src/devops/templates/safety_sign.xcf 2011-08-09 17:22:36 +0000 differ

Subscribers

People subscribed via source and target branches

to all changes: