From 51e795b5e365aa28be9d0d16c4736dbfa56a9346 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Thu, 26 May 2022 18:51:00 -0400 Subject: [PATCH 1/2] Added support for host-gateway in libpod createHosts and podman parser. Signed-off-by: Will Temple --- cmd/podman/parse/net.go | 3 +++ cmd/podman/parse/net_test.go | 1 + libpod/container_internal_linux.go | 23 +++++++++++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/cmd/podman/parse/net.go b/cmd/podman/parse/net.go index b616e10292..2e1e379849 100644 --- a/cmd/podman/parse/net.go +++ b/cmd/podman/parse/net.go @@ -54,6 +54,9 @@ func ValidateExtraHost(val string) (string, error) { // nolint if len(arr) != 2 || len(arr[0]) == 0 { return "", fmt.Errorf("bad format for add-host: %q", val) } + if (arr[1] == "host-gateway") { + return val, nil + } if _, err := validateIPAddress(arr[1]); err != nil { return "", fmt.Errorf("invalid IP address in add-host: %q", arr[1]) } diff --git a/cmd/podman/parse/net_test.go b/cmd/podman/parse/net_test.go index 51c8509df6..25c37ef413 100644 --- a/cmd/podman/parse/net_test.go +++ b/cmd/podman/parse/net_test.go @@ -54,6 +54,7 @@ func TestValidateExtraHost(t *testing.T) { {name: "bad-ipv6", args: args{val: "foobar:0db8:85a3:0000:0000:8a2e:0370:7334.0000.0000.000"}, want: "", wantErr: true}, {name: "noname-ipv6", args: args{val: "2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, {name: "noname-ipv6", args: args{val: ":2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, + {name: "host-gateway", args: args{val: "foobar:host-gateway"}, want: "foobar:host-gateway", wantErr: false} } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index e19d75debd..2a6d6df4f6 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -2562,6 +2562,17 @@ func (c *Container) getHostsEntries() (etchosts.HostEntries, error) { return entries, nil } +// replaces a host IP of "host-gateway" with a corresponding gatewayIP in a host entry +func mapHostGateway(host string, gatewayIP string) string { + arr := strings.SplitN(host, ":", 2) + + if len(arr) != 2 || arr[1] != "host-gateway" { + return host + } + + return arr[0] + ":" + gatewayIP +} + func (c *Container) createHosts() error { var containerIPsEntries etchosts.HostEntries var err error @@ -2579,12 +2590,20 @@ func (c *Container) createHosts() error { return err } + hostContainersInternalIP := etchosts.GetHostContainersInternalIP(c.runtime.config, c.state.NetworkStatus, c.runtime.network) + + extraHosts := make([]string, len(c.config.HostAdd)) + + for i, host := range c.config.HostAdd { + extraHosts[i] = mapHostGateway(host, hostContainersInternalIP) + } + targetFile := filepath.Join(c.state.RunDir, "hosts") err = etchosts.New(&etchosts.Params{ BaseFile: baseHostFile, - ExtraHosts: c.config.HostAdd, + ExtraHosts: extraHosts, ContainerIPs: containerIPsEntries, - HostContainersInternalIP: etchosts.GetHostContainersInternalIP(c.runtime.config, c.state.NetworkStatus, c.runtime.network), + HostContainersInternalIP: hostContainersInternalIP, TargetFile: targetFile, }) if err != nil { From 1290d00894a3c74d4230796b9c8b0f28a7f67497 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Thu, 26 May 2022 19:40:54 -0400 Subject: [PATCH 2/2] Added missing comma Signed-off-by: Will Temple --- cmd/podman/parse/net_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/podman/parse/net_test.go b/cmd/podman/parse/net_test.go index 25c37ef413..5b280ac51f 100644 --- a/cmd/podman/parse/net_test.go +++ b/cmd/podman/parse/net_test.go @@ -54,7 +54,7 @@ func TestValidateExtraHost(t *testing.T) { {name: "bad-ipv6", args: args{val: "foobar:0db8:85a3:0000:0000:8a2e:0370:7334.0000.0000.000"}, want: "", wantErr: true}, {name: "noname-ipv6", args: args{val: "2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, {name: "noname-ipv6", args: args{val: ":2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, - {name: "host-gateway", args: args{val: "foobar:host-gateway"}, want: "foobar:host-gateway", wantErr: false} + {name: "host-gateway", args: args{val: "foobar:host-gateway"}, want: "foobar:host-gateway", wantErr: false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {