@@ -30,6 +30,7 @@ import (
3030
3131const (
3232 extDescriptorsOpt = "e"
33+ timeoutOpt = "t"
3334 versionRuleOpt = "version-rule"
3435 noStartOpt = "no-start"
3536 deleteServiceKeysOpt = "delete-service-keys"
@@ -45,7 +46,7 @@ const (
4546 startTimeoutOpt = "apps-start-timeout"
4647 stageTimeoutOpt = "apps-stage-timeout"
4748 uploadTimeoutOpt = "apps-upload-timeout"
48- taskExecutionTimeoutOpt = "task-execution-timeout"
49+ taskExecutionTimeoutOpt = "apps- task-execution-timeout"
4950)
5051
5152type listFlag struct {
@@ -97,17 +98,17 @@ func (c *DeployCommand) GetPluginCommand() plugin.Command {
9798 HelpText : "Deploy a new multi-target app or sync changes to an existing one" ,
9899 UsageDetails : plugin.Usage {
99100 Usage : `Deploy a multi-target app archive
100- cf deploy MTA [-e EXT_DESCRIPTOR[,...]] [-- version-rule VERSION_RULE] [-u URL] [-f] [--retries RETRIES] [--no-start] [--namespace NAMESPACE] [--delete-services] [--delete-service-keys] [--delete-service-brokers] [--keep-files] [--no-restart-subscribed-apps] [--do-not-fail-on-missing-permissions] [--abort-on-error] [--strategy STRATEGY] [--skip-testing-phase] [--skip-idle-start] [--apps-start-timeout TIMEOUT] [--apps-stage-timeout TIMEOUT] [--apps-upload-timeout TIMEOUT] [--task-execution-timeout TIMEOUT]
101+ cf deploy MTA [-e EXT_DESCRIPTOR[,...]] [-t TIMEOUT] [-- version-rule VERSION_RULE] [-u URL] [-f] [--retries RETRIES] [--no-start] [--namespace NAMESPACE] [--delete-services] [--delete-service-keys] [--delete-service-brokers] [--keep-files] [--no-restart-subscribed-apps] [--do-not-fail-on-missing-permissions] [--abort-on-error] [--strategy STRATEGY] [--skip-testing-phase] [--skip-idle-start] [--apps-start-timeout TIMEOUT] [--apps-stage-timeout TIMEOUT] [--apps-upload-timeout TIMEOUT] [--apps -task-execution-timeout TIMEOUT]
101102
102103 Perform action on an active deploy operation
103104 cf deploy -i OPERATION_ID -a ACTION [-u URL]
104105
105106 (EXPERIMENTAL) Deploy a multi-target app archive referenced by a remote URL
106- <write MTA archive URL to STDOUT> | cf deploy [-e EXT_DESCRIPTOR[,...]] [-- version-rule VERSION_RULE] [-u MTA_CONTROLLER_URL] [--retries RETRIES] [--no-start] [--namespace NAMESPACE] [--delete-services] [--delete-service-keys] [--delete-service-brokers] [--keep-files] [--no-restart-subscribed-apps] [--do-not-fail-on-missing-permissions] [--abort-on-error] [--strategy STRATEGY] [--skip-testing-phase] [--skip-idle-start] [--apps-start-timeout TIMEOUT] [--apps-stage-timeout TIMEOUT] [--apps-upload-timeout TIMEOUT] [--task-execution-timeout TIMEOUT]` ,
107+ <write MTA archive URL to STDOUT> | cf deploy [-e EXT_DESCRIPTOR[,...]] [-t TIMEOUT] [-- version-rule VERSION_RULE] [-u MTA_CONTROLLER_URL] [--retries RETRIES] [--no-start] [--namespace NAMESPACE] [--delete-services] [--delete-service-keys] [--delete-service-brokers] [--keep-files] [--no-restart-subscribed-apps] [--do-not-fail-on-missing-permissions] [--abort-on-error] [--strategy STRATEGY] [--skip-testing-phase] [--skip-idle-start] [--apps-start-timeout TIMEOUT] [--apps-stage-timeout TIMEOUT] [--apps-upload-timeout TIMEOUT] [--apps -task-execution-timeout TIMEOUT]` ,
107108 Options : map [string ]string {
108109 extDescriptorsOpt : "Extension descriptors" ,
110+ timeoutOpt : "Start apps timeout in seconds" ,
109111 deployServiceURLOpt : "Deploy service URL, by default 'deploy-service.<system-domain>'" ,
110-
111112 versionRuleOpt : "Version rule (HIGHER, SAME_HIGHER, ALL)" ,
112113 operationIDOpt : "Active deploy operation ID" ,
113114 actionOpt : "Action to perform on active deploy operation (abort, retry, resume, monitor)" ,
@@ -158,11 +159,26 @@ func deployProcessParametersSetter() ProcessParametersSetter {
158159 processBuilder .Parameter ("noFailOnMissingPermissions" , strconv .FormatBool (GetBoolOpt (noFailOnMissingPermissionsOpt , flags )))
159160 processBuilder .Parameter ("abortOnError" , strconv .FormatBool (GetBoolOpt (abortOnErrorOpt , flags )))
160161 processBuilder .Parameter ("skipOwnershipValidation" , strconv .FormatBool (GetBoolOpt (skipOwnershipValidationOpt , flags )))
161- processBuilder .Parameter ("appsStartTimeout" , GetStringOpt (startTimeoutOpt , flags ))
162162 processBuilder .Parameter ("appsStageTimeout" , GetStringOpt (stageTimeoutOpt , flags ))
163163 processBuilder .Parameter ("appsUploadTimeout" , GetStringOpt (uploadTimeoutOpt , flags ))
164- processBuilder .Parameter ("taskExecutionTimeout" , GetStringOpt (taskExecutionTimeoutOpt , flags ))
165-
164+ processBuilder .Parameter ("appsTaskExecutionTimeout" , GetStringOpt (taskExecutionTimeoutOpt , flags ))
165+
166+ var lastSetValue string = ""
167+ for i := 0 ; i < len (os .Args ); i ++ {
168+ arg := os .Args [i ]
169+ if arg == "-t" {
170+ if i + 1 < len (os .Args ) {
171+ lastSetValue = os .Args [i + 1 ]
172+ i ++
173+ }
174+ } else if arg == "--apps-start-timeout" {
175+ if i + 1 < len (os .Args ) {
176+ lastSetValue = os .Args [i + 1 ]
177+ i ++
178+ }
179+ }
180+ }
181+ processBuilder .Parameter ("appsStartTimeout" , lastSetValue )
166182 }
167183}
168184
@@ -190,6 +206,7 @@ func (c *DeployCommand) defineCommandOptions(flags *flag.FlagSet) {
190206 flags .Bool (skipIdleStart , false , "" )
191207 flags .Var (& modulesList , moduleOpt , "" )
192208 flags .Var (& resourcesList , resourceOpt , "" )
209+ flags .String (timeoutOpt , "" , "" )
193210 flags .String (startTimeoutOpt , "" , "" )
194211 flags .String (stageTimeoutOpt , "" , "" )
195212 flags .String (uploadTimeoutOpt , "" , "" )
@@ -624,18 +641,57 @@ func (deployCommandLineArgumentsParser) determinePositionalArgumentsToValidate(p
624641type deployCommandFlagsValidator struct {}
625642
626643func (deployCommandFlagsValidator ) ValidateParsedFlags (flags * flag.FlagSet ) error {
627- var err error
628- flags .Visit (func (f * flag.Flag ) {
629- if f .Name == strategyOpt {
630- if f .Value .String () == "" {
631- err = errors .New ("strategy flag defined but no argument specified" )
632- } else if ! util .Contains (AvailableStrategies (), f .Value .String ()) {
633- err = fmt .Errorf ("%s is not a valid deployment strategy, available strategies: %v" , f .Value .String (), AvailableStrategies ())
634- }
635- }
636- })
637- if err != nil {
638- return err
639- }
640- return NewDefaultCommandFlagsValidator (nil ).ValidateParsedFlags (flags )
644+ var err error
645+
646+ flags .Visit (func (f * flag.Flag ) {
647+ switch f .Name {
648+ case strategyOpt :
649+ if f .Value .String () == "" {
650+ err = errors .New ("strategy flag defined but no argument specified" )
651+ return
652+ } else if ! util .Contains (AvailableStrategies (), f .Value .String ()) {
653+ err = fmt .Errorf ("%s is not a valid deployment strategy, available strategies: %v" , f .Value .String (), AvailableStrategies ())
654+ return
655+ }
656+ case timeoutOpt :
657+ if e := ValidateTimeoutOption (f .Name , flags , 259200 ); e != nil {
658+ err = e
659+ return
660+ }
661+ case startTimeoutOpt :
662+ if e := ValidateTimeoutOption (f .Name , flags , 259200 ); e != nil {
663+ err = e
664+ return
665+ }
666+ case stageTimeoutOpt :
667+ if e := ValidateTimeoutOption (f .Name , flags , 259200 ); e != nil {
668+ err = e
669+ return
670+ }
671+ case uploadTimeoutOpt :
672+ if e := ValidateTimeoutOption (f .Name , flags , 259200 ); e != nil {
673+ err = e
674+ return
675+ }
676+ case taskExecutionTimeoutOpt :
677+ if e := ValidateTimeoutOption (f .Name , flags , 259200 ); e != nil {
678+ err = e
679+ return
680+ }
681+ }
682+ })
683+ if err != nil {
684+ return err
685+ }
686+ return NewDefaultCommandFlagsValidator (nil ).ValidateParsedFlags (flags )
687+ }
688+
689+ func ValidateTimeoutOption (optionName string , flags * flag.FlagSet , maxAllowedValue int ) error {
690+ optionValueStr := flags .Lookup (optionName ).Value .String ()
691+
692+ optionValue , err := strconv .Atoi (optionValueStr )
693+ if err != nil || optionValue < 0 || optionValue > maxAllowedValue {
694+ return fmt .Errorf ("Invalid value for %s: %s. Value must be in the range 0 to %d." , optionName , optionValueStr , maxAllowedValue )
695+ }
696+ return nil
641697}
0 commit comments