in core/controller/src/main/scala/org/apache/openwhisk/core/controller/Triggers.scala [323:384]
private def activateRules(user: Identity,
args: JsObject,
rulesToActivate: Map[FullyQualifiedEntityName, ReducedRule])(
implicit transid: TransactionId): Future[Iterable[RuleActivationResult]] = {
val ruleResults = rulesToActivate.map {
case (ruleName, rule) if (rule.status != Status.ACTIVE) =>
Future.successful {
RuleActivationResult(
ActivationResponse.ApplicationError,
ruleName,
rule.action,
Left(Messages.triggerWithInactiveRule(ruleName.asString, rule.action.asString)))
}
case (ruleName, rule) =>
// Invoke the action. Retain action results for inclusion in the trigger activation record
postActivation(user, rule, args)
.flatMap { response =>
response.status match {
case OK | Accepted =>
Unmarshal(response.entity).to[JsObject].map { activationResponse =>
val activationId = activationResponse.fields("activationId").convertTo[ActivationId]
logging.debug(this, s"trigger-fired action '${rule.action}' invoked with activation $activationId")
RuleActivationResult(ActivationResponse.Success, ruleName, rule.action, Right(activationId))
}
case code =>
Unmarshal(response.entity).to[String].map { error =>
val failureType = code match {
case _: ServerError => ActivationResponse.WhiskError // all 500s are to be considered whisk errors
case _ => ActivationResponse.ApplicationError
}
val errorMessage: String = Try(error.parseJson.convertTo[ErrorResponse])
.map { e =>
def logMsg = s"trigger-fired action '${rule.action}' failed to invoke with ${e.error}, ${e.code}"
if (failureType == ActivationResponse.ApplicationError) logging.debug(this, logMsg)
else logging.error(this, logMsg)
e.error
}
.getOrElse {
logging
.error(this, s"trigger-fired action '${rule.action}' failed to invoke with status code $code")
InternalServerError.defaultMessage
}
RuleActivationResult(failureType, ruleName, rule.action, Left(errorMessage))
}
}
}
.recover {
case t =>
logging.error(this, s"trigger-fired action '${rule.action}' failed to invoke with $t")
RuleActivationResult(
ActivationResponse.WhiskError,
ruleName,
rule.action,
Left(InternalServerError.defaultMessage))
}
}
Future.sequence(ruleResults)
}