github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/cmd/swarmctl/service/flagparser/restart.go (about)

     1  package flagparser
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/docker/swarmkit/api"
     8  	gogotypes "github.com/gogo/protobuf/types"
     9  	"github.com/spf13/pflag"
    10  )
    11  
    12  func parseRestart(flags *pflag.FlagSet, spec *api.ServiceSpec) error {
    13  	if spec.Task.Restart == nil {
    14  		// set new service's restart policy as RestartOnAny
    15  		spec.Task.Restart = &api.RestartPolicy{
    16  			Condition: api.RestartOnAny,
    17  		}
    18  	}
    19  
    20  	if flags.Changed("restart-condition") {
    21  		condition, err := flags.GetString("restart-condition")
    22  		if err != nil {
    23  			return err
    24  		}
    25  
    26  		switch condition {
    27  		case "none":
    28  			spec.Task.Restart.Condition = api.RestartOnNone
    29  		case "failure":
    30  			spec.Task.Restart.Condition = api.RestartOnFailure
    31  		case "any":
    32  			spec.Task.Restart.Condition = api.RestartOnAny
    33  		default:
    34  			return fmt.Errorf("invalid restart condition: %s", condition)
    35  		}
    36  	}
    37  
    38  	if flags.Changed("restart-delay") {
    39  		delay, err := flags.GetString("restart-delay")
    40  		if err != nil {
    41  			return err
    42  		}
    43  
    44  		delayDuration, err := time.ParseDuration(delay)
    45  		if err != nil {
    46  			return err
    47  		}
    48  
    49  		spec.Task.Restart.Delay = gogotypes.DurationProto(delayDuration)
    50  	}
    51  
    52  	if flags.Changed("restart-max-attempts") {
    53  		attempts, err := flags.GetUint64("restart-max-attempts")
    54  		if err != nil {
    55  			return err
    56  		}
    57  
    58  		spec.Task.Restart.MaxAttempts = attempts
    59  	}
    60  
    61  	if flags.Changed("restart-window") {
    62  		window, err := flags.GetString("restart-window")
    63  		if err != nil {
    64  			return err
    65  		}
    66  
    67  		windowDelay, err := time.ParseDuration(window)
    68  		if err != nil {
    69  			return err
    70  		}
    71  
    72  		spec.Task.Restart.Window = gogotypes.DurationProto(windowDelay)
    73  	}
    74  
    75  	return nil
    76  }