Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.

Commit bb1a633

Browse files
committed
properly support feed creation and deletion
Fixes #448
1 parent b2eb8df commit bb1a633

File tree

2 files changed

+102
-5
lines changed

2 files changed

+102
-5
lines changed

app/plugins/ui/commands/openwhisk-core.js

Lines changed: 101 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,11 +1177,18 @@ module.exports = (commandTree, prequire) => {
11771177
commandTree.listen(`/wsk/${syn}/fire`, doFire, { usage: usage.triggers.available.find(({command}) => command === 'fire') })
11781178
})
11791179

1180+
/**
1181+
* A request to delete a trigger. If this trigger has an
1182+
* associated feed, we are responsible for invoking the DELETE
1183+
* lifecycle event on the feed.
1184+
*
1185+
*/
11801186
const removeTrigger = (block, nextBlock, argv, modules) => {
11811187
const name = argv[argv.length - 1]
11821188
return ow.triggers.delete(owOpts({ name: name }))
11831189
.then(trigger => {
11841190
const feedAnnotation = trigger.annotations && trigger.annotations.find(kv => kv.key === 'feed')
1191+
debug('trigger delete success', trigger, feedAnnotation)
11851192
if (feedAnnotation) {
11861193
// special case of feed
11871194
debug('delete feed', trigger)
@@ -1193,10 +1200,100 @@ module.exports = (commandTree, prequire) => {
11931200
}
11941201
}).then(() => true)
11951202
}
1196-
synonyms.verbs.delete.forEach(rm => {
1197-
synonyms.entities.triggers.forEach(syn => {
1198-
commandTree.listen(`/wsk/${syn}/${rm}`, removeTrigger, { docs: 'Remove an OpenWhisk trigger' })
1199-
})
1203+
synonyms.entities.triggers.forEach(syn => {
1204+
commandTree.listen(`/wsk/${syn}/delete`,
1205+
removeTrigger,
1206+
{ usage: usage.triggers.available.find(({command}) => command === 'delete') })
1207+
})
1208+
1209+
/**
1210+
* As per the delete trigger comment for removeTrigger, we
1211+
* similarly must invoke the CREATE lifecycle event for feed
1212+
* creation
1213+
*
1214+
*/
1215+
const createTrigger = (_1, _2, _3, _4, _5, _6, argv, options) => {
1216+
const name = argv[argv.length - 1],
1217+
triggerSpec = owOpts({ name }),
1218+
paramsArray = [],
1219+
params = {}
1220+
1221+
if (options.param) {
1222+
for (let idx = 0; idx < options.param.length; idx += 2) {
1223+
const key = options.param[idx]
1224+
let value = options.param[idx + 1]
1225+
1226+
try {
1227+
value = JSON.parse(options.param[idx + 1])
1228+
} catch (err) {
1229+
}
1230+
1231+
params[key] = value
1232+
paramsArray.push({ key, value })
1233+
}
1234+
}
1235+
1236+
if (options.feed) {
1237+
// add the feed annotation
1238+
1239+
const annotation = { key: 'feed', value: options.feed }
1240+
debug('adding feed annotation', annotation)
1241+
1242+
if (!triggerSpec.trigger) {
1243+
triggerSpec.trigger = {}
1244+
}
1245+
if (!triggerSpec.trigger.annotations) {
1246+
triggerSpec.trigger.annotations = []
1247+
}
1248+
1249+
triggerSpec.trigger.annotations.push(annotation)
1250+
} else {
1251+
if (!triggerSpec.trigger) {
1252+
triggerSpec.trigger = {}
1253+
}
1254+
if (!triggerSpec.trigger.parameters) {
1255+
triggerSpec.trigger.parameters = paramsArray
1256+
} else {
1257+
triggerSpec.trigger.parameters = triggerSpec.trigger.parameters.concat(paramsArray)
1258+
}
1259+
}
1260+
1261+
debug('creating trigger', triggerSpec)
1262+
return ow.triggers.create(triggerSpec)
1263+
.then(trigger => {
1264+
/** remove trigger if something bad happened instantiating the feed */
1265+
const removeTrigger = err => {
1266+
console.error(err)
1267+
ow.triggers.delete(owOpts({ name }))
1268+
throw new Error('Internal Error')
1269+
}
1270+
1271+
if (options.feed) {
1272+
try {
1273+
// special case of feed: invoke CREATE lifecycle
1274+
const feedName = options.feed
1275+
1276+
debug('create feed', feedName, name, params)
1277+
return ow.feeds.create(owOpts({ feedName, trigger: name, params }))
1278+
.then(() => trigger) // return the trigger, not the result of invoking the feed lifecycle
1279+
.catch(removeTrigger) // catastrophe, clean up after ourselves
1280+
1281+
} catch (err) {
1282+
// make sure to clean up after ourselves in case of catastrophe
1283+
return removeTrigger(err)
1284+
}
1285+
1286+
} else {
1287+
// otherwise, this is a normal trigger, not a feed
1288+
return trigger
1289+
}
1290+
})
1291+
.then(addPrettyType('triggers', 'create', name))
1292+
}
1293+
synonyms.entities.triggers.forEach(syn => {
1294+
commandTree.listen(`/wsk/${syn}/create`,
1295+
createTrigger,
1296+
{ usage: usage.triggers.available.find(({command}) => command === 'create') })
12001297
})
12011298

12021299
// namespace.current

app/plugins/ui/commands/openwhisk-usage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ const paramsAndAnnotations = params.concat(annotations)
6868
const shared = [{ name: '--shared', docs: 'package visibility', allowed: ['yes', 'no' ] }]
6969

7070
/** feed annotation for triggers */
71-
const feed = [{ name: '--feed', alias: '-f', docs: 'create a feed', entity: 'action' }]
71+
const feed = [{ name: '--feed', alias: '-f', docs: 'create a feed from a given provider', entity: 'action' }]
7272

7373
/** timeout parameter */
7474
const timeout = [{ name: '--timeout', alias: '-t', docs: 'max milliseconds to wait for blocking invoke', defaultValue: 60000 }]

0 commit comments

Comments
 (0)