Add utility to convert VMFile to URL for UNIX sockets

This adds generic utility to convert file system path into URL structure.
Instead of string manipulation it uses URL parsing and building routines.
Appending absolute path to `unix:///` URL out of the box correctly
handles URL format on Windows platform, where filepath should be prepended
by additional `/` before drive letter.

Signed-off-by: Arthur Sengileyev <arthur.sengileyev@gmail.com>
This commit is contained in:
Arthur Sengileyev
2024-07-23 16:24:48 +03:00
parent b005b13274
commit 71d6e2fbaf
2 changed files with 20 additions and 2 deletions

View File

@@ -9,7 +9,6 @@ import (
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@@ -319,11 +318,15 @@ func (q *QEMUStubber) StartNetworking(mc *vmconfigs.MachineConfig, cmd *gvproxy.
if err != nil { if err != nil {
return err return err
} }
socketURL, err := sockets.ToUnixURL(gvProxySock)
if err != nil {
return err
}
// make sure it does not exist before gvproxy is called // make sure it does not exist before gvproxy is called
if err := gvProxySock.Delete(); err != nil { if err := gvProxySock.Delete(); err != nil {
logrus.Error(err) logrus.Error(err)
} }
cmd.AddQemuSocket(fmt.Sprintf("unix://%s", filepath.ToSlash(gvProxySock.GetPath()))) cmd.AddQemuSocket(socketURL.String())
return nil return nil
} }

View File

@@ -5,6 +5,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"net" "net"
"net/url"
"path/filepath" "path/filepath"
"time" "time"
@@ -110,3 +111,17 @@ func WaitForSocketWithBackoffs(maxBackoffs int, backoff time.Duration, socketPat
} }
return fmt.Errorf("unable to connect to %q socket at %q", name, socketPath) return fmt.Errorf("unable to connect to %q socket at %q", name, socketPath)
} }
// ToUnixURL converts `socketLoc` into URL representation
func ToUnixURL(socketLoc *define.VMFile) (*url.URL, error) {
p := socketLoc.GetPath()
if !filepath.IsAbs(p) {
return nil, fmt.Errorf("socket path must be absolute %q", p)
}
s, err := url.Parse("unix:///")
if err != nil {
return nil, err
}
s = s.JoinPath(filepath.ToSlash(p))
return s, nil
}