Prior this commit the ami images were tested locally using qemu. This does not reflect at all how they're used in practice. This commit introduces the support for running them in the actual AWS. Yay! The structure of code reflects that we want to switch to osbuild-composer to build the images soon.
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
// +build integration
|
|
|
|
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// durationMin returns the smaller of two given durations
|
|
func durationMin(a, b time.Duration) time.Duration {
|
|
if a < b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|
|
|
|
// killProcessCleanly firstly sends SIGTERM to the process. If it still exists
|
|
// after the specified timeout, it sends SIGKILL
|
|
func killProcessCleanly(process *os.Process, timeout time.Duration) error {
|
|
err := process.Signal(syscall.SIGTERM)
|
|
if err != nil {
|
|
log.Printf("cannot send SIGTERM to process, sending SIGKILL instead: %#v", err)
|
|
return process.Kill()
|
|
}
|
|
|
|
const pollInterval = 10 * time.Millisecond
|
|
|
|
for {
|
|
p, err := os.FindProcess(process.Pid)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
err = p.Signal(syscall.Signal(0))
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
sleep := durationMin(pollInterval, timeout)
|
|
if sleep == 0 {
|
|
break
|
|
}
|
|
|
|
timeout -= sleep
|
|
time.Sleep(sleep)
|
|
}
|
|
|
|
return process.Kill()
|
|
}
|
|
|
|
// generateRandomString generates a new random string with specified prefix.
|
|
// The random part is based on UUID.
|
|
func generateRandomString(prefix string) (string, error) {
|
|
id, err := uuid.NewRandom()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return prefix + id.String(), nil
|
|
}
|