From a1c85902f6823768be97b0f3894a97c5c7a10d18 Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Mon, 28 Jan 2019 14:56:23 -0600 Subject: [PATCH] virtcontainers: add method to get hypervisor PID hypervisor PID can be used to move the whole process and its threads into a new cgroup. Signed-off-by: Julio Montes --- virtcontainers/fc.go | 4 ++++ virtcontainers/hypervisor.go | 1 + virtcontainers/mock_hypervisor.go | 5 +++++ virtcontainers/qemu.go | 24 ++++++++++++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/virtcontainers/fc.go b/virtcontainers/fc.go index 9111fff653..d8bcad9e4f 100644 --- a/virtcontainers/fc.go +++ b/virtcontainers/fc.go @@ -702,3 +702,7 @@ func (fc *firecracker) getThreadIDs() (*threadIDs, error) { func (fc *firecracker) cleanup() error { return nil } + +func (fc *firecracker) pid() int { + return fc.info.PID +} diff --git a/virtcontainers/hypervisor.go b/virtcontainers/hypervisor.go index dd37f8706d..6966b9e782 100644 --- a/virtcontainers/hypervisor.go +++ b/virtcontainers/hypervisor.go @@ -609,4 +609,5 @@ type hypervisor interface { hypervisorConfig() HypervisorConfig getThreadIDs() (*threadIDs, error) cleanup() error + pid() int } diff --git a/virtcontainers/mock_hypervisor.go b/virtcontainers/mock_hypervisor.go index 37dccaf901..fbf1c379bc 100644 --- a/virtcontainers/mock_hypervisor.go +++ b/virtcontainers/mock_hypervisor.go @@ -14,6 +14,7 @@ import ( ) type mockHypervisor struct { + mockPid int } func (m *mockHypervisor) capabilities() types.Capabilities { @@ -100,3 +101,7 @@ func (m *mockHypervisor) getThreadIDs() (*threadIDs, error) { func (m *mockHypervisor) cleanup() error { return nil } + +func (m *mockHypervisor) pid() int { + return m.mockPid +} diff --git a/virtcontainers/qemu.go b/virtcontainers/qemu.go index 2220108385..d8e0ec27a5 100644 --- a/virtcontainers/qemu.go +++ b/virtcontainers/qemu.go @@ -8,6 +8,7 @@ package virtcontainers import ( "context" "fmt" + "io/ioutil" "math" "os" "path/filepath" @@ -500,6 +501,8 @@ func (q *qemu) createSandbox(ctx context.Context, id string, hypervisorConfig *H return err } + pidFile := q.pidFile() + qemuConfig := govmmQemu.Config{ Name: fmt.Sprintf("sandbox-%s", q.id), UUID: q.state.UUID, @@ -518,6 +521,7 @@ func (q *qemu) createSandbox(ctx context.Context, id string, hypervisorConfig *H VGA: "none", GlobalParam: "kvm-pit.lost_tick_policy=discard", Bios: firmwarePath, + PidFile: pidFile, } if ioThread != nil { @@ -1567,3 +1571,23 @@ func (q *qemu) cleanup() error { return nil } + +func (q *qemu) pidFile() string { + return filepath.Join(store.RunVMStoragePath, q.id, "pid") +} + +func (q *qemu) pid() int { + data, err := ioutil.ReadFile(q.pidFile()) + if err != nil { + q.Logger().WithError(err).Error("Could not read qemu pid file") + return 0 + } + + pid, err := strconv.Atoi(strings.Trim(string(data), "\n\t ")) + if err != nil { + q.Logger().WithError(err).Error("Could not convert string to int") + return 0 + } + + return pid +}