github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/restage_command.go (about)

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