@@ -41,7 +41,10 @@ func (p *PortOpt) Set(value string) error {
4141 return err
4242 }
4343
44- pConfig := swarm.PortConfig {}
44+ pConfig := swarm.PortConfig {
45+ Protocol : swarm .PortConfigProtocolTCP ,
46+ PublishMode : swarm .PortConfigPublishModeIngress ,
47+ }
4548 for _ , field := range fields {
4649 // TODO(thaJeztah): these options should not be case-insensitive.
4750 key , val , ok := strings .Cut (strings .ToLower (field ), "=" )
@@ -50,17 +53,19 @@ func (p *PortOpt) Set(value string) error {
5053 }
5154 switch key {
5255 case portOptProtocol :
53- if val != string (swarm .PortConfigProtocolTCP ) && val != string (swarm .PortConfigProtocolUDP ) && val != string (swarm .PortConfigProtocolSCTP ) {
56+ switch swarm .PortConfigProtocol (val ) {
57+ case swarm .PortConfigProtocolTCP , swarm .PortConfigProtocolUDP , swarm .PortConfigProtocolSCTP :
58+ pConfig .Protocol = swarm .PortConfigProtocol (val )
59+ default :
5460 return fmt .Errorf ("invalid protocol value '%s'" , val )
5561 }
56-
57- pConfig .Protocol = swarm .PortConfigProtocol (val )
5862 case portOptMode :
59- if val != string (swarm .PortConfigPublishModeIngress ) && val != string (swarm .PortConfigPublishModeHost ) {
63+ switch swarm .PortConfigPublishMode (val ) {
64+ case swarm .PortConfigPublishModeIngress , swarm .PortConfigPublishModeHost :
65+ pConfig .PublishMode = swarm .PortConfigPublishMode (val )
66+ default :
6067 return fmt .Errorf ("invalid publish mode value (%s): must be either '%s' or '%s'" , val , swarm .PortConfigPublishModeIngress , swarm .PortConfigPublishModeHost )
6168 }
62-
63- pConfig .PublishMode = swarm .PortConfigPublishMode (val )
6469 case portOptTargetPort :
6570 tPort , err := strconv .ParseUint (val , 10 , 16 )
6671 if err != nil {
@@ -92,18 +97,9 @@ func (p *PortOpt) Set(value string) error {
9297 return fmt .Errorf ("missing mandatory field '%s'" , portOptTargetPort )
9398 }
9499
95- if pConfig .PublishMode == "" {
96- pConfig .PublishMode = swarm .PortConfigPublishModeIngress
97- }
98-
99- if pConfig .Protocol == "" {
100- pConfig .Protocol = swarm .PortConfigProtocolTCP
101- }
102-
103100 p .ports = append (p .ports , pConfig )
104101 } else {
105102 // short syntax
106- portConfigs := []swarm.PortConfig {}
107103 ports , portBindingMap , err := nat .ParsePortSpecs ([]string {value })
108104 if err != nil {
109105 return err
@@ -116,6 +112,7 @@ func (p *PortOpt) Set(value string) error {
116112 }
117113 }
118114
115+ var portConfigs []swarm.PortConfig
119116 for port := range ports {
120117 portConfig , err := ConvertPortToPortConfig (port , portBindingMap )
121118 if err != nil {
@@ -135,7 +132,7 @@ func (*PortOpt) Type() string {
135132
136133// String returns a string repr of this option
137134func (p * PortOpt ) String () string {
138- ports := []string {}
135+ ports := make ( []string , 0 , len ( p . ports ))
139136 for _ , port := range p .ports {
140137 repr := fmt .Sprintf ("%v:%v/%s/%s" , port .PublishedPort , port .TargetPort , port .Protocol , port .PublishMode )
141138 ports = append (ports , repr )
@@ -153,8 +150,7 @@ func ConvertPortToPortConfig(
153150 port nat.Port ,
154151 portBindings map [nat.Port ][]nat.PortBinding ,
155152) ([]swarm.PortConfig , error ) {
156- ports := []swarm.PortConfig {}
157-
153+ ports := make ([]swarm.PortConfig , 0 , len (portBindings ))
158154 for _ , binding := range portBindings [port ] {
159155 if p := net .ParseIP (binding .HostIP ); p != nil && ! p .IsUnspecified () {
160156 // TODO(thaJeztah): use context-logger, so that this output can be suppressed (in tests).
0 commit comments