github.com/niteshexa/cloudfoundry_cli@v7.1.0+incompatible/command/v7/restage_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     6  	"code.cloudfoundry.org/cli/command"
     7  	"code.cloudfoundry.org/cli/command/flag"
     8  	"code.cloudfoundry.org/cli/command/translatableerror"
     9  	"code.cloudfoundry.org/cli/command/v7/shared"
    10  )
    11  
    12  type RestageCommand struct {
    13  	BaseCommand
    14  
    15  	RequiredArgs        flag.AppName            `positional-args:"yes"`
    16  	Strategy            flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."`
    17  	NoWait              bool                    `long:"no-wait" description:"Exit when the first instance of the web process is healthy"`
    18  	usage               interface{}             `usage:"CF_NAME restage APP_NAME\n\n   This command will cause downtime unless you use '--strategy rolling'.\n\nEXAMPLES:\n   CF_NAME restage APP_NAME\n   CF_NAME restage APP_NAME --strategy rolling\n   CF_NAME restage APP_NAME --strategy rolling --no-wait"`
    19  	relatedCommands     interface{}             `related_commands:"restart"`
    20  	envCFStagingTimeout interface{}             `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"`
    21  	envCFStartupTimeout interface{}             `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"`
    22  
    23  	Stager shared.AppStager
    24  }
    25  
    26  func (cmd *RestageCommand) Setup(config command.Config, ui command.UI) error {
    27  	err := cmd.BaseCommand.Setup(config, ui)
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	logCacheEndpoint, _, err := cmd.Actor.GetLogCacheEndpoint()
    33  	if err != nil {
    34  		return err
    35  	}
    36  	logCacheClient := command.NewLogCacheClient(logCacheEndpoint, config, ui)
    37  	cmd.Stager = shared.NewAppStager(cmd.Actor, cmd.UI, cmd.Config, logCacheClient)
    38  
    39  	return nil
    40  }
    41  
    42  func (cmd RestageCommand) Execute(args []string) error {
    43  	err := cmd.SharedActor.CheckTarget(true, true)
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	user, err := cmd.Config.CurrentUser()
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	if cmd.Strategy.Name != constant.DeploymentStrategyRolling {
    54  		cmd.UI.DisplayWarning("This action will cause app downtime.")
    55  	}
    56  
    57  	cmd.UI.DisplayNewline()
    58  	cmd.UI.DisplayTextWithFlavor("Restaging app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    59  		"AppName":   cmd.RequiredArgs.AppName,
    60  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    61  		"SpaceName": cmd.Config.TargetedSpace().Name,
    62  		"Username":  user.Name,
    63  	})
    64  	cmd.UI.DisplayNewline()
    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  
    72  	pkg, warnings, err := cmd.Actor.GetNewestReadyPackageForApplication(app)
    73  	cmd.UI.DisplayWarnings(warnings)
    74  	if err != nil {
    75  		return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err)
    76  	}
    77  
    78  	err = cmd.Stager.StageAndStart(
    79  		app,
    80  		cmd.Config.TargetedSpace(),
    81  		cmd.Config.TargetedOrganization(),
    82  		pkg.GUID,
    83  		cmd.Strategy.Name,
    84  		cmd.NoWait,
    85  		constant.ApplicationRestarting,
    86  	)
    87  	if err != nil {
    88  		return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err)
    89  	}
    90  
    91  	return nil
    92  }
    93  
    94  func mapErr(config command.Config, appName string, err error) error {
    95  	switch err.(type) {
    96  	case actionerror.AllInstancesCrashedError:
    97  		return translatableerror.ApplicationUnableToStartError{
    98  			AppName:    appName,
    99  			BinaryName: config.BinaryName(),
   100  		}
   101  	case actionerror.StartupTimeoutError:
   102  		return translatableerror.StartupTimeoutError{
   103  			AppName:    appName,
   104  			BinaryName: config.BinaryName(),
   105  		}
   106  	case actionerror.StagingFailedNoAppDetectedError:
   107  		return translatableerror.StagingFailedNoAppDetectedError{
   108  			Message:    err.Error(),
   109  			BinaryName: config.BinaryName(),
   110  		}
   111  	case actionerror.NoEligiblePackagesError:
   112  		return translatableerror.NoEligiblePackagesError{
   113  			AppName:    appName,
   114  			BinaryName: config.BinaryName(),
   115  		}
   116  	}
   117  	return err
   118  }