in internal/commandProcessor/commandProcessor.go [66:113]
func ProcessHandlerCommandWithDetails(ctx *log.Context, cmd types.Cmd, hEnv types.HandlerEnvironment, extensionName string, seqNum int, downloadFolder string) error {
ctx.Log("message", fmt.Sprintf("processing command for extensionName: %v and seqNum: %v", extensionName, seqNum))
instView := types.RunCommandInstanceView{
ExecutionState: types.Running,
ExecutionMessage: "Execution in progress",
ExitCode: 0,
Output: "",
Error: "",
StartTime: time.Now().UTC().Format(time.RFC3339),
EndTime: "",
}
metadata := types.NewRCMetadata(extensionName, seqNum, downloadFolder, constants.DataDir)
instanceview.ReportInstanceView(ctx, hEnv, metadata, types.StatusTransitioning, cmd, &instView)
// execute the subcommand
stdout, stderr, cmdInvokeError, exitCode := cmd.Functions.Invoke(ctx, hEnv, &instView, metadata, cmd)
instView.Output = stdout
instView.Error = stderr
if cmdInvokeError != nil {
ctx.Log("event", "failed to handle", "error", cmdInvokeError)
instView.ExecutionMessage = "Execution failed: " + cmdInvokeError.Error()
instView.ExecutionState = types.Failed
instView.EndTime = time.Now().UTC().Format(time.RFC3339)
instView.ExitCode = exitCode
statusToReport := types.StatusSuccess
// If TreatFailureAsDeploymentFailure is set to true and the exit code is non-zero, set extension status to error
cfg, err := handlersettings.GetHandlerSettings(hEnv.HandlerEnvironment.ConfigFolder, extensionName, seqNum, ctx)
if err == nil && cfg.PublicSettings.TreatFailureAsDeploymentFailure && cmd.FailExitCode != 0 {
statusToReport = types.StatusError
}
instanceview.ReportInstanceView(ctx, hEnv, metadata, statusToReport, cmd, &instView)
return errors.Wrapf(err, "command execution failed")
} else { // No error. Succeeded
instView.ExecutionMessage = "Execution completed"
instView.ExecutionState = types.Succeeded
instView.EndTime = time.Now().UTC().Format(time.RFC3339)
instView.ExitCode = constants.ExitCode_Okay
}
instanceview.ReportInstanceView(ctx, hEnv, metadata, types.StatusSuccess, cmd, &instView)
ctx.Log("event", "end")
return nil
}