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

     1  package v7
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/sharedaction"
     5  	"code.cloudfoundry.org/cli/actor/v7action"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     7  	"code.cloudfoundry.org/cli/command"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  	"code.cloudfoundry.org/cli/command/v7/shared"
    10  	"code.cloudfoundry.org/clock"
    11  )
    12  
    13  //go:generate counterfeiter . RestartActor
    14  
    15  type RestartActor interface {
    16  	GetApplicationByNameAndSpace(appName string, spaceGUID string) (v7action.Application, v7action.Warnings, error)
    17  	GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error)
    18  	PollStart(appGUID string, noWait bool) (v7action.Warnings, error)
    19  	StartApplication(appGUID string) (v7action.Warnings, error)
    20  	StopApplication(appGUID string) (v7action.Warnings, error)
    21  	CreateDeployment(appGUID string, dropletGUID string) (string, v7action.Warnings, error)
    22  	PollStartForRolling(appGUID string, deploymentGUID string, noWait bool) (v7action.Warnings, error)
    23  }
    24  
    25  type RestartCommand struct {
    26  	RequiredArgs        flag.AppName            `positional-args:"yes"`
    27  	Strategy            flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."`
    28  	NoWait              bool                    `long:"no-wait" description:"Do not wait for the long-running operation to complete; push exits when one instance of the web process is healthy"`
    29  	usage               interface{}             `usage:"CF_NAME restart APP_NAME"`
    30  	relatedCommands     interface{}             `related_commands:"restage, restart-app-instance"`
    31  	envCFStagingTimeout interface{}             `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"`
    32  	envCFStartupTimeout interface{}             `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"`
    33  
    34  	UI          command.UI
    35  	Config      command.Config
    36  	SharedActor command.SharedActor
    37  	Actor       RestartActor
    38  }
    39  
    40  func (cmd *RestartCommand) Setup(config command.Config, ui command.UI) error {
    41  	cmd.UI = ui
    42  	cmd.Config = config
    43  	cmd.SharedActor = sharedaction.NewActor(config)
    44  
    45  	ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "")
    46  	if err != nil {
    47  		return err
    48  	}
    49  
    50  	cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock())
    51  
    52  	return nil
    53  }
    54  
    55  func (cmd RestartCommand) Execute(args []string) error {
    56  	err := cmd.SharedActor.CheckTarget(true, true)
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	user, err := cmd.Config.CurrentUser()
    62  	if err != nil {
    63  		return err
    64  	}
    65  
    66  	app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID)
    67  	cmd.UI.DisplayWarnings(warnings)
    68  	if err != nil {
    69  		return err
    70  	}
    71  	cmd.UI.DisplayTextWithFlavor("Restarting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...\n", map[string]interface{}{
    72  		"AppName":   cmd.RequiredArgs.AppName,
    73  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    74  		"SpaceName": cmd.Config.TargetedSpace().Name,
    75  		"Username":  user.Name,
    76  	})
    77  	switch cmd.Strategy.Name {
    78  	case constant.DeploymentStrategyRolling:
    79  		err = cmd.zeroDowntimeRestart(app)
    80  	default:
    81  		err = cmd.downtimeRestart(app)
    82  	}
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	appSummaryDisplayer := shared.NewAppSummaryDisplayer(cmd.UI)
    88  	summary, warnings, err := cmd.Actor.GetDetailedAppSummary(
    89  		cmd.RequiredArgs.AppName,
    90  		cmd.Config.TargetedSpace().GUID,
    91  		false,
    92  	)
    93  	cmd.UI.DisplayWarnings(warnings)
    94  	if err != nil {
    95  		return err
    96  	}
    97  	appSummaryDisplayer.AppDisplay(summary, false)
    98  
    99  	return nil
   100  }
   101  
   102  func (cmd RestartCommand) downtimeRestart(app v7action.Application) error {
   103  	var warnings v7action.Warnings
   104  	var err error
   105  	if app.Started() {
   106  		cmd.UI.DisplayText("Stopping app...\n")
   107  
   108  		warnings, err = cmd.Actor.StopApplication(app.GUID)
   109  		cmd.UI.DisplayWarnings(warnings)
   110  		if err != nil {
   111  			return err
   112  		}
   113  	}
   114  
   115  	warnings, err = cmd.Actor.StartApplication(app.GUID)
   116  	cmd.UI.DisplayWarnings(warnings)
   117  	if err != nil {
   118  		return err
   119  	}
   120  
   121  	cmd.UI.DisplayText("Waiting for app to start...\n")
   122  	warnings, err = cmd.Actor.PollStart(app.GUID, cmd.NoWait)
   123  	cmd.UI.DisplayWarnings(warnings)
   124  	return err
   125  }
   126  
   127  func (cmd RestartCommand) zeroDowntimeRestart(app v7action.Application) error {
   128  	cmd.UI.DisplayText("Creating deployment for app {{.AppName}}...\n",
   129  		map[string]interface{}{
   130  			"AppName": cmd.RequiredArgs.AppName,
   131  		},
   132  	)
   133  
   134  	deploymentGUID, warnings, err := cmd.Actor.CreateDeployment(app.GUID, "")
   135  	cmd.UI.DisplayWarnings(warnings)
   136  	if err != nil {
   137  		return err
   138  	}
   139  
   140  	cmd.UI.DisplayText("Waiting for app to deploy...\n")
   141  	warnings, err = cmd.Actor.PollStartForRolling(app.GUID, deploymentGUID, cmd.NoWait)
   142  	cmd.UI.DisplayWarnings(warnings)
   143  	if err != nil {
   144  		return err
   145  	}
   146  	return err
   147  }