Blame cmd/osbuild-image-tests/helpers.go
|
Packit |
63bb0d |
// +build integration
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
package main
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"log"
|
|
Packit |
63bb0d |
"os"
|
|
Packit |
63bb0d |
"syscall"
|
|
Packit |
63bb0d |
"time"
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
"github.com/google/uuid"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// durationMin returns the smaller of two given durations
|
|
Packit |
63bb0d |
func durationMin(a, b time.Duration) time.Duration {
|
|
Packit |
63bb0d |
if a < b {
|
|
Packit |
63bb0d |
return a
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return b
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// killProcessCleanly firstly sends SIGTERM to the process. If it still exists
|
|
Packit |
63bb0d |
// after the specified timeout, it sends SIGKILL
|
|
Packit |
63bb0d |
func killProcessCleanly(process *os.Process, timeout time.Duration) error {
|
|
Packit |
63bb0d |
err := process.Signal(syscall.SIGTERM)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
log.Printf("cannot send SIGTERM to process, sending SIGKILL instead: %#v", err)
|
|
Packit |
63bb0d |
return process.Kill()
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
const pollInterval = 10 * time.Millisecond
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
for {
|
|
Packit |
63bb0d |
p, err := os.FindProcess(process.Pid)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
err = p.Signal(syscall.Signal(0))
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
sleep := durationMin(pollInterval, timeout)
|
|
Packit |
63bb0d |
if sleep == 0 {
|
|
Packit |
63bb0d |
break
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
timeout -= sleep
|
|
Packit |
63bb0d |
time.Sleep(sleep)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
return process.Kill()
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// generateRandomString generates a new random string with specified prefix.
|
|
Packit |
63bb0d |
// The random part is based on UUID.
|
|
Packit |
63bb0d |
func generateRandomString(prefix string) (string, error) {
|
|
Packit |
63bb0d |
id, err := uuid.NewRandom()
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return "", err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
return prefix + id.String(), nil
|
|
Packit |
63bb0d |
}
|