mirror of
https://github.com/containers/podman.git
synced 2025-05-21 00:56:36 +08:00
Merge pull request #12168 from mtrmac/socket-collision
Avoid RemoteSocket collisions in e2e tests
This commit is contained in:
@ -274,14 +274,32 @@ func PodmanTestCreateUtil(tempDir string, remote bool) *PodmanTestIntegration {
|
||||
}
|
||||
|
||||
if remote {
|
||||
uuid := stringid.GenerateNonCryptoID()
|
||||
var pathPrefix string
|
||||
if !rootless.IsRootless() {
|
||||
p.RemoteSocket = fmt.Sprintf("unix:/run/podman/podman-%s.sock", uuid)
|
||||
pathPrefix = "/run/podman/podman"
|
||||
} else {
|
||||
runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
|
||||
socket := fmt.Sprintf("podman-%s.sock", uuid)
|
||||
fqpath := filepath.Join(runtimeDir, socket)
|
||||
p.RemoteSocket = fmt.Sprintf("unix:%s", fqpath)
|
||||
pathPrefix = filepath.Join(runtimeDir, "podman")
|
||||
}
|
||||
// We want to avoid collisions in socket paths, but using the
|
||||
// socket directly for a collision check doesn’t work; bind(2) on AF_UNIX
|
||||
// creates the file, and we need to pass a unique path now before the bind(2)
|
||||
// happens. So, use a podman-%s.sock-lock empty file as a marker.
|
||||
tries := 0
|
||||
for {
|
||||
uuid := stringid.GenerateNonCryptoID()
|
||||
lockPath := fmt.Sprintf("%s-%s.sock-lock", pathPrefix, uuid)
|
||||
lockFile, err := os.OpenFile(lockPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0700)
|
||||
if err == nil {
|
||||
lockFile.Close()
|
||||
p.RemoteSocketLock = lockPath
|
||||
p.RemoteSocket = fmt.Sprintf("unix:%s-%s.sock", pathPrefix, uuid)
|
||||
break
|
||||
}
|
||||
tries++
|
||||
if tries >= 1000 {
|
||||
panic("Too many RemoteSocket collisions")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
//go:build remote
|
||||
// +build remote
|
||||
|
||||
package integration
|
||||
@ -143,6 +144,11 @@ func (p *PodmanTestIntegration) StopRemoteService() {
|
||||
if err := os.Remove(socket); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
if p.RemoteSocketLock != "" {
|
||||
if err := os.Remove(p.RemoteSocketLock); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//MakeOptions assembles all the podman main options
|
||||
|
@ -41,6 +41,7 @@ type PodmanTest struct {
|
||||
RemotePodmanBinary string
|
||||
RemoteSession *os.Process
|
||||
RemoteSocket string
|
||||
RemoteSocketLock string // If not "", should be removed _after_ RemoteSocket is removed
|
||||
RemoteCommand *exec.Cmd
|
||||
ImageCacheDir string
|
||||
ImageCacheFS string
|
||||
@ -469,10 +470,6 @@ func Containerized() bool {
|
||||
return strings.Contains(string(b), "docker")
|
||||
}
|
||||
|
||||
func init() {
|
||||
rand.Seed(GinkgoRandomSeed())
|
||||
}
|
||||
|
||||
var randomLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||
|
||||
// RandomString returns a string of given length composed of random characters
|
||||
|
Reference in New Issue
Block a user