mirror of
https://github.com/containers/podman.git
synced 2025-05-22 01:27:07 +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 {
|
if remote {
|
||||||
uuid := stringid.GenerateNonCryptoID()
|
var pathPrefix string
|
||||||
if !rootless.IsRootless() {
|
if !rootless.IsRootless() {
|
||||||
p.RemoteSocket = fmt.Sprintf("unix:/run/podman/podman-%s.sock", uuid)
|
pathPrefix = "/run/podman/podman"
|
||||||
} else {
|
} else {
|
||||||
runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
|
runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
|
||||||
socket := fmt.Sprintf("podman-%s.sock", uuid)
|
pathPrefix = filepath.Join(runtimeDir, "podman")
|
||||||
fqpath := filepath.Join(runtimeDir, socket)
|
}
|
||||||
p.RemoteSocket = fmt.Sprintf("unix:%s", fqpath)
|
// 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
|
// +build remote
|
||||||
|
|
||||||
package integration
|
package integration
|
||||||
@ -143,6 +144,11 @@ func (p *PodmanTestIntegration) StopRemoteService() {
|
|||||||
if err := os.Remove(socket); err != nil {
|
if err := os.Remove(socket); err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
if p.RemoteSocketLock != "" {
|
||||||
|
if err := os.Remove(p.RemoteSocketLock); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//MakeOptions assembles all the podman main options
|
//MakeOptions assembles all the podman main options
|
||||||
|
@ -41,6 +41,7 @@ type PodmanTest struct {
|
|||||||
RemotePodmanBinary string
|
RemotePodmanBinary string
|
||||||
RemoteSession *os.Process
|
RemoteSession *os.Process
|
||||||
RemoteSocket string
|
RemoteSocket string
|
||||||
|
RemoteSocketLock string // If not "", should be removed _after_ RemoteSocket is removed
|
||||||
RemoteCommand *exec.Cmd
|
RemoteCommand *exec.Cmd
|
||||||
ImageCacheDir string
|
ImageCacheDir string
|
||||||
ImageCacheFS string
|
ImageCacheFS string
|
||||||
@ -469,10 +470,6 @@ func Containerized() bool {
|
|||||||
return strings.Contains(string(b), "docker")
|
return strings.Contains(string(b), "docker")
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
rand.Seed(GinkgoRandomSeed())
|
|
||||||
}
|
|
||||||
|
|
||||||
var randomLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
var randomLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||||
|
|
||||||
// RandomString returns a string of given length composed of random characters
|
// RandomString returns a string of given length composed of random characters
|
||||||
|
Reference in New Issue
Block a user