github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/exec/log_error_step.go (about)

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