github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/shared/poll_start.go (about)

     1  package shared
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/actor/v2action"
     6  	"code.cloudfoundry.org/cli/command"
     7  	"code.cloudfoundry.org/cli/command/translatableerror"
     8  )
     9  
    10  func PollStart(ui command.UI, config command.Config, messages <-chan *v2action.LogMessage, logErrs <-chan error, appState <-chan v2action.ApplicationStateChange, apiWarnings <-chan string, apiErrs <-chan error) (apiError error) {
    11  	for appState != nil || apiWarnings != nil || apiErrs != nil {
    12  		select {
    13  		case message, ok := <-messages:
    14  			if !ok {
    15  				messages = nil
    16  				continue
    17  			}
    18  
    19  			if message.Staging() {
    20  				ui.DisplayLogMessage(message, false)
    21  			}
    22  
    23  		case state, ok := <-appState:
    24  			if !ok {
    25  				appState = nil
    26  				continue
    27  			}
    28  
    29  			switch state {
    30  			case v2action.ApplicationStateStopping:
    31  				ui.DisplayNewline()
    32  				ui.DisplayText("Stopping app...")
    33  
    34  			case v2action.ApplicationStateStaging:
    35  				ui.DisplayNewline()
    36  				ui.DisplayText("Staging app and tracing logs...")
    37  
    38  			case v2action.ApplicationStateStarting:
    39  				ui.DisplayNewline()
    40  				ui.DisplayText("Waiting for app to start...")
    41  			}
    42  
    43  		case warning, ok := <-apiWarnings:
    44  			if !ok {
    45  				apiWarnings = nil
    46  				continue
    47  			}
    48  
    49  			ui.DisplayWarning(warning)
    50  
    51  		case logErr, ok := <-logErrs:
    52  			if !ok {
    53  				logErrs = nil
    54  				continue
    55  			}
    56  
    57  			switch logErr.(type) {
    58  			case actionerror.NOAATimeoutError:
    59  				ui.DisplayWarning("timeout connecting to log server, no log will be shown")
    60  			default:
    61  				ui.DisplayWarning(logErr.Error())
    62  			}
    63  
    64  		case e, ok := <-apiErrs:
    65  			if !ok {
    66  				apiErrs = nil
    67  				continue
    68  			}
    69  			switch err := e.(type) {
    70  			case actionerror.StagingFailedError:
    71  				apiError = translatableerror.StagingFailedError{Message: err.Error()}
    72  			case actionerror.StagingFailedNoAppDetectedError:
    73  				apiError = translatableerror.StagingFailedNoAppDetectedError{BinaryName: config.BinaryName(), Message: err.Error()}
    74  			case actionerror.StagingTimeoutError:
    75  				apiError = translatableerror.StagingTimeoutError{AppName: err.AppName, Timeout: err.Timeout}
    76  			case actionerror.ApplicationInstanceCrashedError:
    77  				apiError = translatableerror.ApplicationUnableToStartError{AppName: err.Name, BinaryName: config.BinaryName()}
    78  			case actionerror.ApplicationInstanceFlappingError:
    79  				apiError = translatableerror.ApplicationUnableToStartError{AppName: err.Name, BinaryName: config.BinaryName()}
    80  			case actionerror.StartupTimeoutError:
    81  				apiError = translatableerror.StartupTimeoutError{AppName: err.Name, BinaryName: config.BinaryName()}
    82  			default:
    83  				apiError = err
    84  			}
    85  			// if an api error occurred, exit immediately
    86  			return apiError
    87  		}
    88  	}
    89  	return nil
    90  }