Skip to content

Commit 066710b

Browse files
committed
opts/swarmopts: minor cleanup and refactor
- Use strong-typed switches for validating options - Initialize defaults instead of setting them after parsing the ports. Each option should be validated as part of the parsing, so no invalid (or empty) values should be set. - Put variables closer to where they're used, and pre-allocate slices. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent 66aca29 commit 066710b

File tree

1 file changed

+15
-18
lines changed

1 file changed

+15
-18
lines changed

opts/swarmopts/port.go

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ func (p *PortOpt) Set(value string) error {
4242
return err
4343
}
4444

45-
pConfig := swarm.PortConfig{}
45+
pConfig := swarm.PortConfig{
46+
Protocol: swarm.PortConfigProtocolTCP,
47+
PublishMode: swarm.PortConfigPublishModeIngress,
48+
}
4649
for _, field := range fields {
4750
// TODO(thaJeztah): these options should not be case-insensitive.
4851
key, val, ok := strings.Cut(strings.ToLower(field), "=")
@@ -51,17 +54,19 @@ func (p *PortOpt) Set(value string) error {
5154
}
5255
switch key {
5356
case portOptProtocol:
54-
if val != string(swarm.PortConfigProtocolTCP) && val != string(swarm.PortConfigProtocolUDP) && val != string(swarm.PortConfigProtocolSCTP) {
57+
switch swarm.PortConfigProtocol(val) {
58+
case swarm.PortConfigProtocolTCP, swarm.PortConfigProtocolUDP, swarm.PortConfigProtocolSCTP:
59+
pConfig.Protocol = swarm.PortConfigProtocol(val)
60+
default:
5561
return fmt.Errorf("invalid protocol value '%s'", val)
5662
}
57-
58-
pConfig.Protocol = swarm.PortConfigProtocol(val)
5963
case portOptMode:
60-
if val != string(swarm.PortConfigPublishModeIngress) && val != string(swarm.PortConfigPublishModeHost) {
64+
switch swarm.PortConfigPublishMode(val) {
65+
case swarm.PortConfigPublishModeIngress, swarm.PortConfigPublishModeHost:
66+
pConfig.PublishMode = swarm.PortConfigPublishMode(val)
67+
default:
6168
return fmt.Errorf("invalid publish mode value (%s): must be either '%s' or '%s'", val, swarm.PortConfigPublishModeIngress, swarm.PortConfigPublishModeHost)
6269
}
63-
64-
pConfig.PublishMode = swarm.PortConfigPublishMode(val)
6570
case portOptTargetPort:
6671
tPort, err := strconv.ParseUint(val, 10, 16)
6772
if err != nil {
@@ -93,18 +98,9 @@ func (p *PortOpt) Set(value string) error {
9398
return fmt.Errorf("missing mandatory field '%s'", portOptTargetPort)
9499
}
95100

96-
if pConfig.PublishMode == "" {
97-
pConfig.PublishMode = swarm.PortConfigPublishModeIngress
98-
}
99-
100-
if pConfig.Protocol == "" {
101-
pConfig.Protocol = swarm.PortConfigProtocolTCP
102-
}
103-
104101
p.ports = append(p.ports, pConfig)
105102
} else {
106103
// short syntax
107-
portConfigs := []swarm.PortConfig{}
108104
ports, portBindingMap, err := nat.ParsePortSpecs([]string{value})
109105
if err != nil {
110106
return err
@@ -117,6 +113,7 @@ func (p *PortOpt) Set(value string) error {
117113
}
118114
}
119115

116+
var portConfigs []swarm.PortConfig
120117
for port := range ports {
121118
portConfig, err := ConvertPortToPortConfig(port, portBindingMap)
122119
if err != nil {
@@ -136,7 +133,7 @@ func (*PortOpt) Type() string {
136133

137134
// String returns a string repr of this option
138135
func (p *PortOpt) String() string {
139-
ports := []string{}
136+
ports := make([]string, 0, len(p.ports))
140137
for _, port := range p.ports {
141138
repr := fmt.Sprintf("%v:%v/%s/%s", port.PublishedPort, port.TargetPort, port.Protocol, port.PublishMode)
142139
ports = append(ports, repr)
@@ -158,7 +155,7 @@ func ConvertPortToPortConfig(
158155
portInt, _ := strconv.ParseUint(port, 10, 16)
159156
proto = strings.ToLower(proto)
160157

161-
var ports []swarm.PortConfig
158+
ports := make([]swarm.PortConfig, 0, len(portBindings))
162159
for _, binding := range portBindings[portRangeProto] {
163160
if p := net.ParseIP(binding.HostIP); p != nil && !p.IsUnspecified() {
164161
// TODO(thaJeztah): use context-logger, so that this output can be suppressed (in tests).

0 commit comments

Comments
 (0)