in deployers/servicedeployer.go [887:955]
func (deployer *ServiceDeployer) createFeedAction(trigger *whisk.Trigger, feedName string) error {
displayPreprocessingInfo(wski18n.TRIGGER_FEED, trigger.Name, true)
// to hold and modify trigger parameters, not passed by ref?
params := make(map[string]interface{})
// check for strings that are JSON
for _, keyVal := range trigger.Parameters {
params[keyVal.Key] = keyVal.Value
}
// TODO() define keys and lifecycle operation names as const
params["authKey"] = deployer.ClientConfig.AuthToken
params["lifecycleEvent"] = "CREATE"
params["triggerName"] = "/" + deployer.Client.Namespace + "/" + trigger.Name
pub := true
t := &whisk.Trigger{
Name: trigger.Name,
Annotations: trigger.Annotations,
Publish: &pub,
}
// triggers created using any of the feeds including cloudant, alarm, message hub etc
// does not honor UPDATE or overwrite=true with CREATE
// wskdeploy is designed such that, it updates trigger feeds if they exists
// or creates new in case they are missing
// To address trigger feed UPDATE issue, we are checking here if trigger feed
// exists, if so, delete it and recreate it
_, r, _ := deployer.Client.Triggers.Get(trigger.Name)
if r.StatusCode == 200 {
// trigger feed already exists so first lets delete it and then recreate it
deployer.deleteFeedAction(trigger, feedName)
}
var err error
var response *http.Response
if err = deployer.createTrigger(t); err != nil {
return err
}
qName, err := utils.ParseQualifiedName(feedName, deployer.ClientConfig.Namespace)
if err != nil {
return err
}
namespace := deployer.Client.Namespace
deployer.Client.Namespace = qName.Namespace
err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
_, response, err = deployer.Client.Actions.Invoke(qName.EntityName, params, true, false)
return err
})
deployer.Client.Namespace = namespace
if err != nil {
// Remove the created trigger
deployer.Client.Triggers.Delete(trigger.Name)
retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
_, _, err := deployer.Client.Triggers.Delete(trigger.Name)
return err
})
return createWhiskClientError(err.(*whisk.WskError), response, wski18n.TRIGGER_FEED, false)
}
displayPostprocessingInfo(wski18n.TRIGGER_FEED, trigger.Name, true)
return nil
}