Skip to content

Commit 9e0e2a5

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 don't construct an empty slice if not needed. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent 2199a05 commit 9e0e2a5

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

opts/swarmopts/port.go

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
137134
func (p *PortOpt) String() string {
138-
ports := []string{}
135+
var ports []string
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)

0 commit comments

Comments
 (0)