github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v3/v3_restart_command.go (about)

     1  package v3
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/liamawhite/cli-with-i18n/actor/sharedaction"
     7  	"github.com/liamawhite/cli-with-i18n/actor/v3action"
     8  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccerror"
     9  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccversion"
    10  	"github.com/liamawhite/cli-with-i18n/command"
    11  	"github.com/liamawhite/cli-with-i18n/command/flag"
    12  	"github.com/liamawhite/cli-with-i18n/command/translatableerror"
    13  	"github.com/liamawhite/cli-with-i18n/command/v3/shared"
    14  )
    15  
    16  //go:generate counterfeiter . V3RestartActor
    17  
    18  type V3RestartActor interface {
    19  	CloudControllerAPIVersion() string
    20  	GetApplicationByNameAndSpace(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error)
    21  	StartApplication(appGUID string) (v3action.Application, v3action.Warnings, error)
    22  	StopApplication(appGUID string) (v3action.Warnings, error)
    23  }
    24  
    25  type V3RestartCommand struct {
    26  	RequiredArgs        flag.AppName `positional-args:"yes"`
    27  	usage               interface{}  `usage:"CF_NAME v3-restart APP_NAME"`
    28  	envCFStartupTimeout interface{}  `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"`
    29  
    30  	UI          command.UI
    31  	Config      command.Config
    32  	SharedActor command.SharedActor
    33  	Actor       V3RestartActor
    34  }
    35  
    36  func (cmd *V3RestartCommand) Setup(config command.Config, ui command.UI) error {
    37  	cmd.UI = ui
    38  	cmd.Config = config
    39  	cmd.SharedActor = sharedaction.NewActor(config)
    40  
    41  	ccClient, _, err := shared.NewClients(config, ui, true)
    42  	if err != nil {
    43  		if v3Err, ok := err.(ccerror.V3UnexpectedResponseError); ok && v3Err.ResponseCode == http.StatusNotFound {
    44  			return translatableerror.MinimumAPIVersionNotMetError{MinimumVersion: ccversion.MinVersionV3}
    45  		}
    46  
    47  		return err
    48  	}
    49  	cmd.Actor = v3action.NewActor(nil, ccClient, config)
    50  
    51  	return nil
    52  }
    53  
    54  func (cmd V3RestartCommand) Execute(args []string) error {
    55  	err := command.MinimumAPIVersionCheck(cmd.Actor.CloudControllerAPIVersion(), ccversion.MinVersionV3)
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	err = cmd.SharedActor.CheckTarget(cmd.Config, true, true)
    61  	if err != nil {
    62  		return shared.HandleError(err)
    63  	}
    64  
    65  	user, err := cmd.Config.CurrentUser()
    66  	if err != nil {
    67  		return shared.HandleError(err)
    68  	}
    69  
    70  	app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID)
    71  	cmd.UI.DisplayWarnings(warnings)
    72  	if err != nil {
    73  		return shared.HandleError(err)
    74  	}
    75  
    76  	if app.Started() {
    77  		cmd.UI.DisplayTextWithFlavor("Stopping app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    78  			"AppName":   cmd.RequiredArgs.AppName,
    79  			"OrgName":   cmd.Config.TargetedOrganization().Name,
    80  			"SpaceName": cmd.Config.TargetedSpace().Name,
    81  			"Username":  user.Name,
    82  		})
    83  
    84  		warnings, err = cmd.Actor.StopApplication(app.GUID)
    85  		cmd.UI.DisplayWarnings(warnings)
    86  		if err != nil {
    87  			return shared.HandleError(err)
    88  		}
    89  
    90  		cmd.UI.DisplayOK()
    91  	}
    92  
    93  	cmd.UI.DisplayTextWithFlavor("Starting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    94  		"AppName":   cmd.RequiredArgs.AppName,
    95  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    96  		"SpaceName": cmd.Config.TargetedSpace().Name,
    97  		"Username":  user.Name,
    98  	})
    99  
   100  	_, warnings, err = cmd.Actor.StartApplication(app.GUID)
   101  
   102  	cmd.UI.DisplayWarnings(warnings)
   103  	if err != nil {
   104  		return shared.HandleError(err)
   105  	}
   106  
   107  	cmd.UI.DisplayOK()
   108  
   109  	return nil
   110  }