mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-28 03:53:33 +00:00
feat(dns): allow to specify http(s) ports without hostname to default to cluster domain
This commit is contained in:
@@ -53,8 +53,10 @@ func NewRunCommand() *cobra.Command {
|
|||||||
cmd.Flags().StringSliceVarP(&opts.publish, "publish", "p", nil,
|
cmd.Flags().StringSliceVarP(&opts.publish, "publish", "p", nil,
|
||||||
"Publish a service port to make it accessible outside the cluster. Can be specified multiple times.\n"+
|
"Publish a service port to make it accessible outside the cluster. Can be specified multiple times.\n"+
|
||||||
"Format: [hostname:][load_balancer_port:]container_port[/protocol] or [host_ip:]:host_port:container_port[/protocol]@host\n"+
|
"Format: [hostname:][load_balancer_port:]container_port[/protocol] or [host_ip:]:host_port:container_port[/protocol]@host\n"+
|
||||||
"Supported protocols: tcp, udp, http, https (default is tcp). If a hostname for http(s) port is not specified, a random hostname is generated.\n"+
|
"Supported protocols: tcp, udp, http, https (default is tcp). If a hostname for http(s) port is not specified,\n"+
|
||||||
|
"service-name.cluster-domain will be used as the hostname.\n"+
|
||||||
"Examples:\n"+
|
"Examples:\n"+
|
||||||
|
" -p 8080/https Publish port 8080 as HTTPS via load balancer with default service-name.cluster-domain hostname\n"+
|
||||||
" -p app.example.com:8080/https Publish port 8080 as HTTPS via load balancer with custom hostname\n"+
|
" -p app.example.com:8080/https Publish port 8080 as HTTPS via load balancer with custom hostname\n"+
|
||||||
" -p 9000:8080 Publish port 8080 as TCP port 9000 via load balancer\n"+
|
" -p 9000:8080 Publish port 8080 as TCP port 9000 via load balancer\n"+
|
||||||
" -p 53:5353/udp@host Bind UDP port 5353 to host port 53")
|
" -p 53:5353/udp@host Bind UDP port 5353 to host port 53")
|
||||||
|
|||||||
@@ -62,9 +62,6 @@ func (p *PortSpec) Validate() error {
|
|||||||
return fmt.Errorf("invalid hostname '%s': %w", p.Hostname, err)
|
return fmt.Errorf("invalid hostname '%s': %w", p.Hostname, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p.Hostname == "" && (p.Protocol == ProtocolHTTP || p.Protocol == ProtocolHTTPS) {
|
|
||||||
return fmt.Errorf("hostname is required with '%s' or '%s' protocols", ProtocolHTTP, ProtocolHTTPS)
|
|
||||||
}
|
|
||||||
case PortModeHost:
|
case PortModeHost:
|
||||||
if p.PublishedPort == 0 {
|
if p.PublishedPort == 0 {
|
||||||
return fmt.Errorf("published port is required in %s mode", PortModeHost)
|
return fmt.Errorf("published port is required in %s mode", PortModeHost)
|
||||||
@@ -216,9 +213,7 @@ func ParsePortSpec(port string) (PortSpec, error) {
|
|||||||
return spec, fmt.Errorf("invalid host IP '%s': %w", parts[0], err)
|
return spec, fmt.Errorf("invalid host IP '%s': %w", parts[0], err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if parts[0] == "" {
|
// Hostname may be empty.
|
||||||
return spec, fmt.Errorf("hostname must not be empty")
|
|
||||||
}
|
|
||||||
spec.Hostname = parts[0]
|
spec.Hostname = parts[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+25
-33
@@ -50,6 +50,22 @@ func TestPortSpec_Validate(t *testing.T) {
|
|||||||
Mode: PortModeIngress,
|
Mode: PortModeIngress,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "ingress mode without hostname http",
|
||||||
|
spec: PortSpec{
|
||||||
|
ContainerPort: 8080,
|
||||||
|
Protocol: ProtocolHTTP,
|
||||||
|
Mode: PortModeIngress,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ingress mode without hostname https",
|
||||||
|
spec: PortSpec{
|
||||||
|
ContainerPort: 8080,
|
||||||
|
Protocol: ProtocolHTTPS,
|
||||||
|
Mode: PortModeIngress,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "ingress mode with hostname and http",
|
name: "ingress mode with hostname and http",
|
||||||
spec: PortSpec{
|
spec: PortSpec{
|
||||||
@@ -164,24 +180,6 @@ func TestPortSpec_Validate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
wantErr: "invalid hostname 'app': must be a valid domain name containing at least one dot",
|
wantErr: "invalid hostname 'app': must be a valid domain name containing at least one dot",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "missing hostname with http",
|
|
||||||
spec: PortSpec{
|
|
||||||
ContainerPort: 8080,
|
|
||||||
Protocol: ProtocolHTTP,
|
|
||||||
Mode: PortModeIngress,
|
|
||||||
},
|
|
||||||
wantErr: "hostname is required with 'http' or 'https' protocols",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "missing hostname with https",
|
|
||||||
spec: PortSpec{
|
|
||||||
ContainerPort: 8080,
|
|
||||||
Protocol: ProtocolHTTPS,
|
|
||||||
Mode: PortModeIngress,
|
|
||||||
},
|
|
||||||
wantErr: "hostname is required with 'http' or 'https' protocols",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "host IP in ingress mode",
|
name: "host IP in ingress mode",
|
||||||
spec: PortSpec{
|
spec: PortSpec{
|
||||||
@@ -468,6 +466,15 @@ func TestParsePortSpec(t *testing.T) {
|
|||||||
Mode: PortModeIngress,
|
Mode: PortModeIngress,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "container port http without hostname",
|
||||||
|
port: "8080/http",
|
||||||
|
expected: PortSpec{
|
||||||
|
ContainerPort: 8080,
|
||||||
|
Protocol: ProtocolHTTP,
|
||||||
|
Mode: PortModeIngress,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "hostname and container port http",
|
name: "hostname and container port http",
|
||||||
port: "app.example.com:8080/http",
|
port: "app.example.com:8080/http",
|
||||||
@@ -602,21 +609,6 @@ func TestParsePortSpec(t *testing.T) {
|
|||||||
port: "app.example.com:invalid:8080",
|
port: "app.example.com:invalid:8080",
|
||||||
wantErr: "invalid published port",
|
wantErr: "invalid published port",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "missing hostname with http",
|
|
||||||
port: "8080/http",
|
|
||||||
wantErr: "hostname is required",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "missing hostname with http",
|
|
||||||
port: "8080/https",
|
|
||||||
wantErr: "hostname is required",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "missing hostname with published https port",
|
|
||||||
port: "8000:8080/https",
|
|
||||||
wantErr: "hostname is required",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "invalid hostname",
|
name: "invalid hostname",
|
||||||
port: "app:8080/http",
|
port: "app:8080/http",
|
||||||
|
|||||||
Reference in New Issue
Block a user