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
}