Skip to content

Commit 50a3f34

Browse files
Add a quick way to visualize a job environment (#4644)
With templates, it can sometimes be a bit difficult to know which environment a given job has. This is a QoL changedisplaying the merged environment: ![Screenshot from 2025-01-27 19-01-35](https://github.com/user-attachments/assets/3907d22e-203f-4af8-ba97-c6cccf35b276)
1 parent 184fe74 commit 50a3f34

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

src/appengine/handlers/jobs.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,22 @@ def post(self):
298298
"""Get and render the jobs in JSON."""
299299
result, _ = get_results()
300300
return self.render_json(result)
301+
302+
303+
class GetEnvironmentHandler(base_handler.Handler):
304+
"""Handler that gets the computed environment for a job."""
305+
306+
@handler.get(handler.JSON)
307+
@handler.check_user_access(need_privileged_access=True)
308+
def get(self):
309+
"""Get and render the computed environment in JSON."""
310+
name = request.args.get('name')
311+
if not name:
312+
raise helpers.EarlyExitError('No job name provided.', 400)
313+
314+
job = data_types.Job.query(data_types.Job.name == name).get()
315+
if not job:
316+
raise helpers.EarlyExitError('Job not found.', 404)
317+
318+
environment = job.get_environment()
319+
return self.render_json({'environment': environment})

src/appengine/private/components/jobs/jobs.html

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
<link rel="import" href="../../bower_components/iron-icon/iron-icon.html">
1919
<link rel="import" href="../../bower_components/paper-button/paper-button.html">
2020
<link rel="import" href="../../bower_components/paper-checkbox/paper-checkbox.html">
21+
<link rel="import" href="../../bower_components/paper-dialog/paper-dialog.html">
22+
<link rel="import" href="../../bower_components/paper-dialog-scrollable/paper-dialog-scrollable.html">
2123
<link rel="import" href="../../bower_components/paper-dropdown-menu/paper-dropdown-menu.html">
2224
<link rel="import" href="../../bower_components/paper-input/paper-input.html">
2325
<link rel="import" href="../../bower_components/paper-input/paper-textarea.html">
@@ -100,9 +102,30 @@
100102
on-response="handleResponse"
101103
debounce-duration="500"></iron-ajax>
102104

105+
<iron-ajax
106+
id="environmentAjax"
107+
url="/jobs/environment"
108+
method="GET"
109+
content-type="application/json"
110+
loading="{{envLoading}}"
111+
last-error="{{envError}}"
112+
last-response="{{envResponse}}"
113+
on-error="handleEnvError"
114+
on-response="handleEnvResponse"></iron-ajax>
115+
103116
<delete-job-dialog id="deleteJobDialog" field-values="[[fieldValues]]" job="[[toDelete]]">
104117
</delete-job-dialog>
105118

119+
<paper-dialog id="envDialog" with-backdrop>
120+
<h2>Computed Environment</h2>
121+
<paper-dialog-scrollable>
122+
<pre id="envContent"></pre>
123+
</paper-dialog-scrollable>
124+
<div class="buttons">
125+
<paper-button dialog-dismiss>Close</paper-button>
126+
</div>
127+
</paper-dialog>
128+
106129
<h2>Templates</h2>
107130

108131
<div class="section">
@@ -334,6 +357,7 @@ <h2>Jobs</h2>
334357

335358
<paper-button raised on-tap="submitForm" data-index$="[[index]]">Save</paper-button>
336359
<paper-button class="info" job="[[item]]" raised on-tap="deleteJobTapped">Delete</paper-button>
360+
<paper-button raised on-tap="viewEnvironment" data-job-name$="[[item.name]]">View inherited environment</paper-button>
337361
</div>
338362

339363
<div class="right">
@@ -368,6 +392,10 @@ <h2>Jobs</h2>
368392
type: Boolean,
369393
value: false
370394
},
395+
envLoading: {
396+
type: Boolean,
397+
value: false
398+
},
371399
submitId: {
372400
type: Number,
373401
value: 0
@@ -539,6 +567,30 @@ <h2>Jobs</h2>
539567
stopEventPropagation(ev) {
540568
ev.stopPropagation();
541569
}
570+
571+
handleEnvError(event) {
572+
var response = event.detail.request.xhr.response;
573+
if (response.error) {
574+
this.$.envContent.textContent = 'Error: ' + response.error.message;
575+
} else {
576+
this.$.envContent.textContent = 'Error fetching environment';
577+
}
578+
this.$.envDialog.open();
579+
}
580+
581+
handleEnvResponse(event) {
582+
var response = event.detail.response;
583+
this.$.envContent.textContent = Object.entries(response.environment)
584+
.map(([key, value]) => `${key} = ${value}`)
585+
.join('\n');
586+
this.$.envDialog.open();
587+
}
588+
589+
viewEnvironment(event) {
590+
var jobName = event.target.dataset.jobName;
591+
this.$.environmentAjax.params = {name: jobName};
592+
this.$.environmentAjax.generateRequest();
593+
}
542594
}
543595

544596
customElements.define(JobsPage.is, JobsPage);

src/appengine/server.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ def register_routes(flask_app, routes):
162162
('/jobs', jobs.Handler),
163163
('/jobs/load', jobs.JsonHandler),
164164
('/jobs/delete-job', jobs.DeleteJobHandler),
165+
('/jobs/environment', jobs.GetEnvironmentHandler),
165166
('/login', login.Handler),
166167
('/logout', login.LogoutHandler),
167168
('/report-bug', help_redirector.ReportBugHandler),

0 commit comments

Comments
 (0)