Skip to content

Commit bde9dc6

Browse files
committed
Add notification upon trigger execution
1 parent 1d925ba commit bde9dc6

File tree

5 files changed

+124
-93
lines changed

5 files changed

+124
-93
lines changed

app/api/trigger.js

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const component = require('./component');
22
const registry = require('../registry');
3+
const log = require('../log').child({ component: 'trigger' });
34

45
/**
56
* Run a specific trigger on a specific container provided in the payload.
@@ -14,12 +15,14 @@ async function runTrigger(req, res) {
1415

1516
const triggerToRun = registry.getState().trigger[`trigger.${triggerType}.${triggerName}`];
1617
if (!triggerToRun) {
18+
log.warn(`No trigger found(type=${triggerType}, name=${triggerName})`);
1719
res.status(404).json({
1820
error: `Error when running trigger ${triggerType}.${triggerName} (trigger not found)`,
1921
});
2022
return;
2123
}
2224
if (!containerToTrigger) {
25+
log.warn(`Trigger cannot be executed without container (type=${triggerType}, name=${triggerName})`);
2326
res.status(400).json({
2427
error: `Error when running trigger ${triggerType}.${triggerName} (container is undefined)`,
2528
});
@@ -28,8 +31,10 @@ async function runTrigger(req, res) {
2831

2932
try {
3033
await triggerToRun.trigger(containerToTrigger);
34+
log.info(`Trigger executed with success (type=${triggerType}, name=${triggerName}, container=${JSON.stringify(containerToTrigger)})`);
3135
res.status(200).json({});
3236
} catch (e) {
37+
log.warn(`Trigger cannot be executed without container (type=${triggerType}, name=${triggerName})`);
3338
res.status(500).json({
3439
error: `Error when running trigger ${triggerType}.${triggerName} (${e.message})`,
3540
});

ui/src/components/ContainerFilter.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export default {
127127
this.isRefreshing = true;
128128
try {
129129
const body = await refreshAllContainers();
130-
this.$root.$emit("notify", `All containers refreshed`);
130+
this.$root.$emit("notify", "All containers refreshed");
131131
this.$emit("refresh-all-containers", body);
132132
} catch (e) {
133133
this.$root.$emit(

ui/src/components/SnackBar.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default {
2222
},
2323
timeout: {
2424
type: Number,
25-
default: 2000,
25+
default: 4000,
2626
},
2727
message: {
2828
type: String,

ui/src/components/TriggerDetail.vue

+112-90
Original file line numberDiff line numberDiff line change
@@ -10,85 +10,8 @@
1010
</v-app-bar>
1111
<v-expand-transition>
1212
<v-card-text v-show="showDetail">
13-
<v-navigation-drawer
14-
v-model="testForm"
15-
absolute
16-
right
17-
temporary
18-
width="512"
19-
>
20-
<v-container>
21-
<v-card-subtitle class="text-body-1">
22-
<v-icon>mdi-test-tube</v-icon>
23-
Test trigger</v-card-subtitle
24-
>
25-
<v-text-field
26-
label="Container ID"
27-
v-model="container.id"
28-
append-icon="mdi-identifier"
29-
outlined
30-
dense
31-
/>
32-
<v-text-field
33-
label="Container Name"
34-
v-model="container.name"
35-
append-icon="mdi-pencil"
36-
outlined
37-
dense
38-
/>
39-
<v-text-field
40-
label="Container Watcher"
41-
v-model="container.watcher"
42-
append-icon="mdi-update"
43-
outlined
44-
dense
45-
/>
46-
<v-select
47-
label="Update kind"
48-
v-model="container.updateKind.kind"
49-
:items="['digest', 'tag']"
50-
:append-icon="
51-
container.updateKind.kind === 'tag' ? 'mdi-tag' : 'mdi-pound'
52-
"
53-
outlined
54-
dense
55-
/>
56-
<v-select
57-
v-if="container.updateKind.kind === 'tag'"
58-
label="Update semver diff"
59-
v-model="container.updateKind.semverDiff"
60-
:items="['major', 'minor', 'patch']"
61-
:append-icon="
62-
container.updateKind.semverDiff === 'major'
63-
? 'mdi-alert'
64-
: container.updateKind.semverDiff === 'minor'
65-
? 'mdi-alert-decagram'
66-
: 'mdi-information'
67-
"
68-
outlined
69-
dense
70-
/>
71-
<v-text-field
72-
label="Container local value"
73-
v-model="container.updateKind.localValue"
74-
append-icon="mdi-tag"
75-
outlined
76-
dense
77-
/>
78-
<v-text-field
79-
label="Container remote value"
80-
v-model="container.updateKind.remoteValue"
81-
append-icon="mdi-tag-check"
82-
outlined
83-
dense
84-
/>
85-
<v-btn outlined small class="accent" block @click="runTrigger"
86-
>Run trigger</v-btn
87-
>
88-
</v-container>
89-
</v-navigation-drawer>
9013
<v-row>
91-
<v-col :lg="6" :md="6">
14+
<v-col cols="8">
9215
<v-list dense v-if="configurationItems.length > 0">
9316
<v-list-item
9417
v-for="configurationItem in configurationItems"
@@ -103,15 +26,101 @@
10326
</v-list-item-subtitle>
10427
</v-list-item-content>
10528
</v-list-item>
106-
<v-list-item>
107-
<v-btn outlined small class="accent" @click="testForm = true">
108-
Test
109-
<v-icon right>mdi-test-tube</v-icon>
110-
</v-btn>
111-
</v-list-item>
11229
</v-list>
11330
<span v-else>Default configuration</span>
11431
</v-col>
32+
<v-col cols="4" class="text-right">
33+
<v-btn outlined small class="accent" @click="showTestForm = true">
34+
Test
35+
<v-icon right>mdi-test-tube</v-icon>
36+
</v-btn>
37+
38+
<v-navigation-drawer
39+
v-model="showTestForm"
40+
absolute
41+
right
42+
temporary
43+
width="512"
44+
>
45+
<v-container class="text-left">
46+
<v-card-subtitle class="text-body-1">
47+
<v-icon>mdi-test-tube</v-icon>
48+
Test trigger</v-card-subtitle
49+
>
50+
<v-text-field
51+
label="Container ID"
52+
v-model="container.id"
53+
append-icon="mdi-identifier"
54+
outlined
55+
dense
56+
/>
57+
<v-text-field
58+
label="Container Name"
59+
v-model="container.name"
60+
append-icon="mdi-pencil"
61+
outlined
62+
dense
63+
/>
64+
<v-text-field
65+
label="Container Watcher"
66+
v-model="container.watcher"
67+
append-icon="mdi-update"
68+
outlined
69+
dense
70+
/>
71+
<v-select
72+
label="Update kind"
73+
v-model="container.updateKind.kind"
74+
:items="['digest', 'tag']"
75+
:append-icon="
76+
container.updateKind.kind === 'tag'
77+
? 'mdi-tag'
78+
: 'mdi-pound'
79+
"
80+
outlined
81+
dense
82+
/>
83+
<v-select
84+
v-if="container.updateKind.kind === 'tag'"
85+
label="Update semver diff"
86+
v-model="container.updateKind.semverDiff"
87+
:items="['major', 'minor', 'patch']"
88+
:append-icon="
89+
container.updateKind.semverDiff === 'major'
90+
? 'mdi-alert'
91+
: container.updateKind.semverDiff === 'minor'
92+
? 'mdi-alert-decagram'
93+
: 'mdi-information'
94+
"
95+
outlined
96+
dense
97+
/>
98+
<v-text-field
99+
label="Container local value"
100+
v-model="container.updateKind.localValue"
101+
append-icon="mdi-tag"
102+
outlined
103+
dense
104+
/>
105+
<v-text-field
106+
label="Container remote value"
107+
v-model="container.updateKind.remoteValue"
108+
append-icon="mdi-tag-check"
109+
outlined
110+
dense
111+
/>
112+
<v-btn
113+
outlined
114+
small
115+
class="accent"
116+
block
117+
@click="runTrigger"
118+
:loading="isTriggering"
119+
>Run trigger</v-btn
120+
>
121+
</v-container>
122+
</v-navigation-drawer>
123+
</v-col>
115124
</v-row>
116125
</v-card-text>
117126
</v-expand-transition>
@@ -132,7 +141,8 @@ export default {
132141
data() {
133142
return {
134143
showDetail: true,
135-
testForm: false,
144+
showTestForm: false,
145+
isTriggering: false,
136146
container: {
137147
id: "123456789",
138148
name: "container_test",
@@ -179,11 +189,23 @@ export default {
179189
this.showDetail = !this.showDetail;
180190
},
181191
async runTrigger() {
182-
await runTrigger({
183-
triggerType: this.trigger.type,
184-
triggerName: this.trigger.name,
185-
container: this.container,
186-
});
192+
this.isTriggering = true;
193+
try {
194+
await runTrigger({
195+
triggerType: this.trigger.type,
196+
triggerName: this.trigger.name,
197+
container: this.container,
198+
});
199+
this.$root.$emit("notify", "Trigger executed with success");
200+
} catch (err) {
201+
this.$root.$emit(
202+
"notify",
203+
`Trigger executed with error (${err.message}})`,
204+
"error",
205+
);
206+
} finally {
207+
this.isTriggering = false;
208+
}
187209
},
188210
},
189211
filters: {

ui/src/services/trigger.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ async function runTrigger({ triggerType, triggerName, container }) {
1313
headers: { "Content-Type": "application/json" },
1414
body: JSON.stringify(container),
1515
});
16-
return response.json();
16+
const json = await response.json();
17+
if (response.status !== 200) {
18+
throw new Error(json.error ? json.error : "Unknown error");
19+
}
20+
return json;
1721
}
1822

1923
export { getTriggerIcon, getAllTriggers, runTrigger };

0 commit comments

Comments
 (0)