Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow passing only exposed port to --ports #15085

Merged
merged 1 commit into from Oct 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 36 additions & 12 deletions cmd/minikube/cmd/start.go
Expand Up @@ -1253,24 +1253,48 @@ func validateFlags(cmd *cobra.Command, drvName string) {

// validatePorts validates that the --ports are not below 1024 for the host and not outside range
func validatePorts(ports []string) error {
_, portBindingsMap, err := nat.ParsePortSpecs(ports)
var exposedPorts, hostPorts, portSpecs []string
for _, p := range ports {
if strings.Contains(p, ":") {
portSpecs = append(portSpecs, p)
} else {
exposedPorts = append(exposedPorts, p)
}
}
_, portBindingsMap, err := nat.ParsePortSpecs(portSpecs)
if err != nil {
return errors.Errorf("Sorry, one of the ports provided with --ports flag is not valid %s (%v)", ports, err)
}
for _, portBindings := range portBindingsMap {
for exposedPort, portBindings := range portBindingsMap {
exposedPorts = append(exposedPorts, exposedPort.Port())
for _, portBinding := range portBindings {
p, err := strconv.Atoi(portBinding.HostPort)
if err != nil {
return errors.Errorf("Sorry, one of the ports provided with --ports flag is not valid %s", ports)
}
if p > 65535 || p < 1 {
return errors.Errorf("Sorry, one of the ports provided with --ports flag is outside range %s", ports)
}
if detect.IsMicrosoftWSL() && p < 1024 {
return errors.Errorf("Sorry, you cannot use privileged ports on the host (below 1024) %s", ports)
}
hostPorts = append(hostPorts, portBinding.HostPort)
}
}
for _, p := range exposedPorts {
if err := validatePort(p, false); err != nil {
return err
}
}
for _, p := range hostPorts {
if err := validatePort(p, true); err != nil {
return err
}
}
return nil
}

func validatePort(port string, isHost bool) error {
p, err := strconv.Atoi(port)
if err != nil {
return errors.Errorf("Sorry, one of the ports provided with --ports flag is not valid: %s", port)
}
if p > 65535 || p < 1 {
return errors.Errorf("Sorry, one of the ports provided with --ports flag is outside range: %s", port)
}
if isHost && detect.IsMicrosoftWSL() && p < 1024 {
return errors.Errorf("Sorry, you cannot use privileged ports on the host (below 1024): %s", port)
}
return nil
}

Expand Down
71 changes: 58 additions & 13 deletions cmd/minikube/cmd/start_test.go
Expand Up @@ -489,12 +489,12 @@ func TestValidatePorts(t *testing.T) {
{
isTarget: true,
ports: []string{"0:80"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range [0:80]",
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 0",
},
{
isTarget: true,
ports: []string{"0:80/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range [0:80/tcp]",
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 0",
},
{
isTarget: true,
Expand All @@ -504,12 +504,12 @@ func TestValidatePorts(t *testing.T) {
{
isTarget: true,
ports: []string{"0-1:80-81/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range [0-1:80-81/tcp]",
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 0",
},
{
isTarget: true,
ports: []string{"0-1:80-81/udp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range [0-1:80-81/udp]",
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 0",
},
{
isTarget: !isMicrosoftWSL,
Expand All @@ -519,22 +519,22 @@ func TestValidatePorts(t *testing.T) {
{
isTarget: isMicrosoftWSL,
ports: []string{"80:80"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [80:80]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 80",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"1023-1025:8023-8025"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [1023-1025:8023-8025]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 1023",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"1023-1025:8023-8025/tcp"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [1023-1025:8023-8025/tcp]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 1023",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"1023-1025:8023-8025/udp"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [1023-1025:8023-8025/udp]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 1023",
},
{
isTarget: true,
Expand All @@ -554,27 +554,72 @@ func TestValidatePorts(t *testing.T) {
{
isTarget: isMicrosoftWSL,
ports: []string{"127.0.0.1:80:80"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [127.0.0.1:80:80]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 80",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"127.0.0.1:81:81/tcp"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [127.0.0.1:81:81/tcp]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 81",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"127.0.0.1:81:81/udp"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [127.0.0.1:81:81/udp]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 81",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"127.0.0.1:80-83:80-83/tcp"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [127.0.0.1:80-83:80-83/tcp]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 80",
},
{
isTarget: isMicrosoftWSL,
ports: []string{"127.0.0.1:80-83:80-83/udp"},
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [127.0.0.1:80-83:80-83/udp]",
errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024): 80",
},
{
isTarget: true,
ports: []string{"80"},
errorMsg: "",
},
{
isTarget: true,
ports: []string{"80", "65535", "65536"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 65536",
},
{
isTarget: true,
ports: []string{"0", "80", "65535"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 0",
},
{
isTarget: true,
ports: []string{"cats"},
errorMsg: "Sorry, one of the ports provided with --ports flag is not valid: cats",
},
{
isTarget: true,
ports: []string{"127.0.0.1:81:0/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is outside range: 0",
},
{
isTarget: true,
ports: []string{"127.0.0.1:81:65536/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is not valid [127.0.0.1:81:65536/tcp] (Invalid containerPort: 65536)",
},
{
isTarget: true,
ports: []string{"1-65536:80-81/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is not valid [1-65536:80-81/tcp] (Invalid hostPort: 1-65536)",
},
{
isTarget: true,
ports: []string{"1-80:0-81/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is not valid [1-80:0-81/tcp] (Invalid ranges specified for container and host Ports: 0-81 and 1-80)",
},
{
isTarget: true,
ports: []string{"1-80:1-65536/tcp"},
errorMsg: "Sorry, one of the ports provided with --ports flag is not valid [1-80:1-65536/tcp] (Invalid containerPort: 1-65536)",
},
}
for _, test := range tests {
Expand Down