conmon/runner/conmon_test/runtime_test.go

101 lines
2.6 KiB
Go

package conmon_test
import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/containers/conmon/runner/conmon"
"github.com/containers/storage/pkg/stringid"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/opencontainers/runtime-tools/generate"
)
var _ = Describe("runc", func() {
var (
tmpDir string
tmpLogPath string
tmpPidFile string
tmpRootfs string
)
BeforeEach(func() {
// save busy box binary if we don't have it
Expect(cacheBusyBox()).To(BeNil())
// create tmpDir
tmpDir = GinkgoT().TempDir()
// generate logging path
tmpLogPath = filepath.Join(tmpDir, "log")
// generate container ID
ctrID = stringid.GenerateNonCryptoID()
// create the rootfs of the "container"
tmpRootfs = filepath.Join(tmpDir, "rootfs")
Expect(os.MkdirAll(tmpRootfs, 0o755)).To(BeNil())
tmpPidFile = filepath.Join(tmpDir, "pidfile")
busyboxPath := filepath.Join(tmpRootfs, "busybox")
Expect(os.Link(busyboxDest, busyboxPath)).To(BeNil())
Expect(os.Chmod(busyboxPath, 0o777)).To(BeNil())
// finally, create config.json
_, err := generateRuntimeConfig(tmpDir, tmpRootfs)
Expect(err).To(BeNil())
})
AfterEach(func() {
Expect(runRuntimeCommand("delete", "-f", ctrID)).To(BeNil())
})
It("simple runtime test", func() {
stdout, stderr := getConmonOutputGivenOptions(
conmon.WithPath(conmonPath),
conmon.WithContainerID(ctrID),
conmon.WithContainerUUID(ctrID),
conmon.WithRuntimePath(runtimePath),
conmon.WithLogDriver("k8s-file", tmpLogPath),
conmon.WithBundlePath(tmpDir),
conmon.WithSocketPath(tmpDir),
conmon.WithSyslog(),
conmon.WithLogLevel("trace"),
conmon.WithContainerPidFile(tmpPidFile),
conmon.WithConmonPidFile(fmt.Sprintf("%s/conmon-pidfile", tmpDir)),
conmon.WithSyncPipe(),
)
Expect(stdout).To(BeEmpty())
Expect(stderr).To(BeEmpty())
Expect(runRuntimeCommand("start", ctrID)).To(BeNil())
// Make sure we write the file before checking if it was written
time.Sleep(100 * time.Millisecond)
Expect(getFileContents(tmpLogPath)).To(ContainSubstring("busybox"))
Expect(getFileContents(tmpPidFile)).To(Not(BeEmpty()))
})
})
func getFileContents(filename string) string {
b, err := os.ReadFile(filename)
Expect(err).To(BeNil())
return string(b)
}
func generateRuntimeConfig(bundlePath, rootfs string) (string, error) {
configPath := filepath.Join(bundlePath, "config.json")
g, err := generate.New("linux")
if err != nil {
return "", err
}
g.SetProcessCwd("/")
g.SetProcessArgs([]string{"/busybox", "echo", "busybox"})
g.SetRootPath(rootfs)
if err := g.SaveToFile(configPath, generate.ExportOptions{}); err != nil {
return "", err
}
return configPath, nil
}