github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/command/v2/logs_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"github.com/cloudfoundry/noaa/consumer"
     5  
     6  	"code.cloudfoundry.org/cli/actor/sharedaction"
     7  	"code.cloudfoundry.org/cli/actor/v2action"
     8  	"code.cloudfoundry.org/cli/command"
     9  	"code.cloudfoundry.org/cli/command/flag"
    10  	"code.cloudfoundry.org/cli/command/v2/shared"
    11  )
    12  
    13  //go:generate counterfeiter . LogsActor
    14  
    15  type LogsActor interface {
    16  	GetRecentLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client v2action.NOAAClient) ([]v2action.LogMessage, v2action.Warnings, error)
    17  	GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client v2action.NOAAClient) (<-chan *v2action.LogMessage, <-chan error, v2action.Warnings, error)
    18  }
    19  
    20  type LogsCommand struct {
    21  	RequiredArgs    flag.AppName `positional-args:"yes"`
    22  	Recent          bool         `long:"recent" description:"Dump recent logs instead of tailing"`
    23  	usage           interface{}  `usage:"CF_NAME logs APP_NAME"`
    24  	relatedCommands interface{}  `related_commands:"app, apps, ssh"`
    25  
    26  	UI          command.UI
    27  	Config      command.Config
    28  	SharedActor command.SharedActor
    29  	Actor       LogsActor
    30  	NOAAClient  *consumer.Consumer
    31  }
    32  
    33  func (cmd *LogsCommand) Setup(config command.Config, ui command.UI) error {
    34  	cmd.UI = ui
    35  	cmd.Config = config
    36  	cmd.SharedActor = sharedaction.NewActor(config)
    37  
    38  	ccClient, uaaClient, err := shared.NewClients(config, ui, true)
    39  	if err != nil {
    40  		return err
    41  	}
    42  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    43  
    44  	cmd.NOAAClient = shared.NewNOAAClient(ccClient.DopplerEndpoint(), config, uaaClient, ui)
    45  
    46  	return nil
    47  }
    48  
    49  func (cmd LogsCommand) Execute(args []string) error {
    50  	err := cmd.SharedActor.CheckTarget(true, true)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	user, err := cmd.Config.CurrentUser()
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	cmd.UI.DisplayTextWithFlavor("Retrieving logs for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...",
    61  		map[string]interface{}{
    62  			"AppName":   cmd.RequiredArgs.AppName,
    63  			"OrgName":   cmd.Config.TargetedOrganization().Name,
    64  			"SpaceName": cmd.Config.TargetedSpace().Name,
    65  			"Username":  user.Name,
    66  		})
    67  	cmd.UI.DisplayNewline()
    68  
    69  	if cmd.Recent {
    70  		return cmd.displayRecentLogs()
    71  	}
    72  
    73  	return cmd.streamLogs()
    74  }
    75  
    76  func (cmd LogsCommand) displayRecentLogs() error {
    77  	messages, warnings, err := cmd.Actor.GetRecentLogsForApplicationByNameAndSpace(
    78  		cmd.RequiredArgs.AppName,
    79  		cmd.Config.TargetedSpace().GUID,
    80  		cmd.NOAAClient,
    81  	)
    82  
    83  	for _, message := range messages {
    84  		cmd.UI.DisplayLogMessage(message, true)
    85  	}
    86  
    87  	cmd.UI.DisplayWarnings(warnings)
    88  	return err
    89  }
    90  
    91  func (cmd LogsCommand) streamLogs() error {
    92  	messages, logErrs, warnings, err := cmd.Actor.GetStreamingLogsForApplicationByNameAndSpace(
    93  		cmd.RequiredArgs.AppName,
    94  		cmd.Config.TargetedSpace().GUID,
    95  		cmd.NOAAClient,
    96  	)
    97  
    98  	cmd.UI.DisplayWarnings(warnings)
    99  	if err != nil {
   100  		return err
   101  	}
   102  
   103  	var messagesClosed, errLogsClosed bool
   104  	for {
   105  		select {
   106  		case message, ok := <-messages:
   107  			if !ok {
   108  				messagesClosed = true
   109  				break
   110  			}
   111  
   112  			cmd.UI.DisplayLogMessage(message, true)
   113  		case logErr, ok := <-logErrs:
   114  			if !ok {
   115  				errLogsClosed = true
   116  				break
   117  			}
   118  
   119  			cmd.NOAAClient.Close()
   120  			return logErr
   121  		}
   122  
   123  		if messagesClosed && errLogsClosed {
   124  			break
   125  		}
   126  	}
   127  
   128  	return nil
   129  }