From 45df3940720918d1393462e3dcaaf06fb14789ab Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Mon, 7 Oct 2024 12:00:35 +0200 Subject: [PATCH] server: fix url parsing in info When we are activated by systemd the code assumed that we had a valid URL which was not the case so it failed to parse the URL which causes the info call to fail all the time. This fixes two problems first add the schema to the systemd activated listener URL so it can be parsed correctly but second simply do not parse it as url as all we care about in the info call is if it is unix and the file path exists. Fixes #24152 Signed-off-by: Paul Holzinger --- cmd/podman/system/service_abi.go | 2 +- pkg/domain/infra/abi/system.go | 14 ++++++-------- test/e2e/systemd_activate_test.go | 5 +++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/cmd/podman/system/service_abi.go b/cmd/podman/system/service_abi.go index 3dd86130f3..43f4c5472f 100644 --- a/cmd/podman/system/service_abi.go +++ b/cmd/podman/system/service_abi.go @@ -48,7 +48,7 @@ func restService(flags *pflag.FlagSet, cfg *entities.PodmanConfig, opts entities if listener == nil { return errors.New("unexpected fd received from systemd: cannot listen on it") } - libpodRuntime.SetRemoteURI(listeners[0].Addr().String()) + libpodRuntime.SetRemoteURI(listeners[0].Addr().Network() + "://" + listeners[0].Addr().String()) } else { uri, err := url.Parse(opts.URI) if err != nil { diff --git a/pkg/domain/infra/abi/system.go b/pkg/domain/infra/abi/system.go index 440d81e48b..88a6cf01a8 100644 --- a/pkg/domain/infra/abi/system.go +++ b/pkg/domain/infra/abi/system.go @@ -10,6 +10,7 @@ import ( "os" "os/exec" "path/filepath" + "strings" "github.com/containers/podman/v5/libpod/define" "github.com/containers/podman/v5/pkg/domain/entities" @@ -48,19 +49,16 @@ func (ic *ContainerEngine) Info(ctx context.Context) (*define.Info, error) { info.Host.RemoteSocket.Path = uri.Path } - uri, err := url.Parse(ic.Libpod.RemoteURI()) - if err != nil { - return nil, err - } - - if uri.Scheme == "unix" { - err := fileutils.Exists(uri.Path) + // check if the unix path exits, if not unix socket we always we assume it exists, i.e. tcp socket + path, found := strings.CutPrefix(info.Host.RemoteSocket.Path, "unix://") + if found { + err := fileutils.Exists(path) info.Host.RemoteSocket.Exists = err == nil } else { info.Host.RemoteSocket.Exists = true } - return info, err + return info, nil } // SystemPrune removes unused data from the system. Pruning pods, containers, networks, volumes and images. diff --git a/test/e2e/systemd_activate_test.go b/test/e2e/systemd_activate_test.go index 72f539a3ed..d95b173e32 100644 --- a/test/e2e/systemd_activate_test.go +++ b/test/e2e/systemd_activate_test.go @@ -82,6 +82,11 @@ var _ = Describe("Systemd activate", func() { return testUtils.SystemExec(podmanTest.PodmanBinary, args) } + // regression check for https://github.com/containers/podman/issues/24152 + session := podmanRemote("info", "--format", "{{.Host.RemoteSocket.Path}}--{{.Host.RemoteSocket.Exists}}") + Expect(session).Should(testUtils.ExitCleanly()) + Expect(session.OutputToString()).To(Equal("tcp://" + addr + "--true")) + containerName := "top_" + testUtils.RandomString(8) apiSession := podmanRemote( "create", "--tty", "--name", containerName, "--entrypoint", "top",