1package exec 2 3import ( 4 "context" 5 6 "code.cloudfoundry.org/lager" 7 "code.cloudfoundry.org/lager/lagerctx" 8) 9 10const AbortedLogMessage = "interrupted" 11const TimeoutLogMessage = "timeout exceeded" 12 13type LogErrorStepDelegate interface { 14 Errored(lager.Logger, string) 15} 16 17type LogErrorStep struct { 18 Step 19 20 delegate LogErrorStepDelegate 21} 22 23func LogError(step Step, delegate LogErrorStepDelegate) Step { 24 return LogErrorStep{ 25 Step: step, 26 27 delegate: delegate, 28 } 29} 30 31func (step LogErrorStep) Run(ctx context.Context, state RunState) error { 32 logger := lagerctx.FromContext(ctx) 33 34 runErr := step.Step.Run(ctx, state) 35 36 var message string 37 switch runErr { 38 case nil: 39 return nil 40 case context.Canceled: 41 message = AbortedLogMessage 42 case context.DeadlineExceeded: 43 message = TimeoutLogMessage 44 default: 45 message = runErr.Error() 46 } 47 48 logger.Info("errored", lager.Data{"error": runErr.Error()}) 49 50 step.delegate.Errored(logger, message) 51 52 return runErr 53} 54