@@ -133,8 +133,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
133133 return & errors.ProjectIdError {}
134134 }
135135
136+ current , err := apiClient .DefaultAPI .GetApplication (ctx , model .ProjectId , model .EnvironmentID , model .ApplicationID ).Execute ()
137+ if err != nil {
138+ params .Printer .Debug (print .ErrorLevel , "get current application: %v" , err )
139+ return err
140+ }
141+
136142 // Call API
137- req , err := buildRequest (ctx , model , apiClient )
143+ req , err := buildRequest (ctx , model , apiClient , current )
138144 if err != nil {
139145 return err
140146 }
@@ -238,12 +244,7 @@ func networkFromInput(model *inputModel) *sca.Network {
238244 return network
239245}
240246
241- func buildRequest (ctx context.Context , model * inputModel , apiClient * sca.APIClient ) (* sca.ApiUpdateApplicationRequest , error ) {
242- current , err := apiClient .DefaultAPI .GetApplication (ctx , model .ProjectId , model .EnvironmentID , model .ApplicationID ).Execute ()
243- if err != nil {
244- return nil , fmt .Errorf ("failed to get current application instance: %w" , err )
245- }
246-
247+ func buildRequest (ctx context.Context , model * inputModel , apiClient * sca.APIClient , current * sca.Application ) (* sca.ApiUpdateApplicationRequest , error ) {
247248 // scaling
248249 updatedScaling , err := buildScalingConfig (model , current )
249250 if err != nil {
@@ -263,6 +264,14 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sca.APIClie
263264}
264265
265266func buildScalingConfig (model * inputModel , current * sca.Application ) (* sca.Scaling , error ) {
267+ if model .ScalingType == nil &&
268+ model .Instances == nil &&
269+ model .MinInstances == nil &&
270+ model .MaxInstances == nil &&
271+ model .RPS == nil &&
272+ model .Concurrency == nil {
273+ return nil , nil
274+ }
266275 // input's scaling type is different from current
267276 if model .ScalingType != nil && * model .ScalingType != scautils .HumanReadableScalingType (current .GetScaling ().Type ) {
268277 switch * model .ScalingType {
@@ -280,6 +289,21 @@ func buildScalingConfig(model *inputModel, current *sca.Application) (*sca.Scali
280289 },
281290 }, nil
282291 case scalingTypeAuto :
292+ if model .MinInstances == nil {
293+ return nil , & errors.FlagValidationError {
294+ Flag : instancesFlag ,
295+ Details : "required flag if replacing scaling type to auto" ,
296+ }
297+ }
298+ if model .MaxInstances == nil {
299+ model .MaxInstances = model .MinInstances
300+ }
301+ if model .RPS == nil && model .Concurrency == nil {
302+ return nil , & errors.OneOfFlagsIsMissing {
303+ MissingFlags : []string {rpsFlag , concurrencyFlag },
304+ SetFlag : fmt .Sprintf ("--%s=%s" , scalingTypeFlag .Name (), scalingTypeAuto ),
305+ }
306+ }
283307 autoScaling , err := buildAutoscalingConfig (model , nil )
284308 if err != nil {
285309 return nil , err
@@ -438,25 +462,61 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu
438462 envVars = * env
439463 }
440464
465+ instances := flags .FlagToInt32Pointer (p , cmd , instancesFlag )
466+ if instances != nil {
467+ if err := scautils .ValidateInstances (* instances , instancesFlag ); err != nil {
468+ return nil , err
469+ }
470+ }
471+
472+ minInstances := flags .FlagToInt32Pointer (p , cmd , minInstancesFlag )
473+ if minInstances != nil {
474+ if err := scautils .ValidateInstances (* minInstances , minInstancesFlag ); err != nil {
475+ return nil , err
476+ }
477+ }
478+
479+ maxInstances := flags .FlagToInt32Pointer (p , cmd , maxInstancesFlag )
480+ if maxInstances != nil {
481+ if err := scautils .ValidateInstances (* maxInstances , maxInstancesFlag ); err != nil {
482+ return nil , err
483+ }
484+ }
485+
486+ extertalPort := flags .FlagToInt32Pointer (p , cmd , externalPortFlag )
487+ if extertalPort != nil {
488+ if err := scautils .ValidatePort (* extertalPort , externalPortFlag ); err != nil {
489+ return nil , err
490+ }
491+ }
492+
493+ cpu := flags .FlagToInt32Pointer (p , cmd , cpuFlag )
494+ if cpu != nil {
495+ if err := scautils .ValidateCPU (* cpu , cpuFlag ); err != nil {
496+ return nil , err
497+ }
498+ }
499+
441500 model := inputModel {
442501 GlobalFlagModel : globalFlags ,
443502 EnvironmentID : environmentID ,
444503 ApplicationID : applicationID ,
445504 Stopped : flags .FlagToBoolPointer (p , cmd , stoppedFlag ),
446505 Memory : flags .FlagToInt32Pointer (p , cmd , memoryFlag ),
447- CPU : flags .FlagToInt32Pointer (p , cmd , cpuFlag ),
506+ CPU : cpu ,
507+ Image : flags .FlagWithDefaultToStringValue (p , cmd , imageFlag ),
448508 EnvironmentVariables : envVars ,
449509 Commands : flags .FlagToStringSliceValue (p , cmd , commandsFlag ),
450510 Args : flags .FlagToStringSliceValue (p , cmd , argsFlag ),
451511 ScalingType : scalingTypeFlag .Ptr (),
452- Instances : flags . FlagToInt32Pointer ( p , cmd , instancesFlag ) ,
453- MinInstances : flags . FlagToInt32Pointer ( p , cmd , minInstancesFlag ) ,
454- MaxInstances : flags . FlagToInt32Pointer ( p , cmd , maxInstancesFlag ) ,
512+ Instances : instances ,
513+ MinInstances : minInstances ,
514+ MaxInstances : maxInstances ,
455515 ScaleToZero : flags .FlagToBoolPointer (p , cmd , scaleToZeroFlag ),
456516 Concurrency : flags .FlagToInt32Pointer (p , cmd , concurrencyFlag ),
457517 RPS : flags .FlagToInt32Pointer (p , cmd , rpsFlag ),
458518 Public : flags .FlagToBoolPointer (p , cmd , publicFlag ),
459- ContainerExternalPort : flags . FlagToInt32Pointer ( p , cmd , externalPortFlag ) ,
519+ ContainerExternalPort : extertalPort ,
460520 }
461521
462522 p .DebugInputModel (model )
0 commit comments