1
0
Fork 0
telegraf/plugins/inputs/lvm/lvm_test.go
Daniel Baumann 4978089aab
Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-24 07:26:29 +02:00

214 lines
4.9 KiB
Go

package lvm
import (
"fmt"
"os"
"os/exec"
"testing"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf/testutil"
)
func TestGather(t *testing.T) {
var acc testutil.Accumulator
lvm := LVM{
PVSBinary: "/usr/sbin/pvs",
VGSBinary: "/usr/sbin/vgs",
LVSBinary: "/usr/sbin/lvs",
}
// overwriting exec commands with mock commands
execCommand = fakeExecCommand
err := lvm.Gather(&acc)
require.NoError(t, err)
pvsTags := map[string]string{
"path": "/dev/sdb",
"vol_group": "docker",
}
pvsFields := map[string]interface{}{
"size": uint64(128316342272),
"free": uint64(3858759680),
"used": uint64(124457582592),
"used_percent": 96.99277612525741,
}
acc.AssertContainsTaggedFields(t, "lvm_physical_vol", pvsFields, pvsTags)
vgsTags := map[string]string{
"name": "docker",
}
vgsFields := map[string]interface{}{
"size": uint64(128316342272),
"free": uint64(3858759680),
"used_percent": 96.99277612525741,
"physical_volume_count": uint64(1),
"logical_volume_count": uint64(1),
"snapshot_count": uint64(0),
}
acc.AssertContainsTaggedFields(t, "lvm_vol_group", vgsFields, vgsTags)
lvsTags := map[string]string{
"name": "thinpool",
"vol_group": "docker",
}
lvsFields := map[string]interface{}{
"size": uint64(121899057152),
"data_percent": 0.36000001430511475,
"metadata_percent": 1.3300000429153442,
}
acc.AssertContainsTaggedFields(t, "lvm_logical_vol", lvsFields, lvsTags)
}
// Used as a helper function that mock the exec.Command call
func fakeExecCommand(command string, args ...string) *exec.Cmd {
cs := []string{"-test.run=TestHelperProcess", "--", command}
cs = append(cs, args...)
cmd := exec.Command(os.Args[0], cs...)
cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
return cmd
}
// Used to mock exec.Command output
func TestHelperProcess(_ *testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
mockPVSData := `{
"report": [
{
"pv": [
{"pv_name":"/dev/sdb", "vg_name":"docker", "pv_size":"128316342272", "pv_free":"3858759680", "pv_used":"124457582592"}
]
}
]
}
`
mockVGSData := `{
"report": [
{
"vg": [
{"vg_name":"docker", "pv_count":"1", "lv_count":"1", "snap_count":"0", "vg_size":"128316342272", "vg_free":"3858759680"}
]
}
]
}
`
mockLVSData := `{
"report": [
{
"lv": [
{"lv_name":"thinpool", "vg_name":"docker", "lv_size":"121899057152", "data_percent":"0.36", "metadata_percent":"1.33"}
]
}
]
}
`
// Previous arguments are tests stuff, that looks like :
// /tmp/go-build970079519/…/_test/integration.test -test.run=TestHelperProcess --
args := os.Args
cmd := args[3]
if cmd == "/usr/sbin/pvs" {
fmt.Fprint(os.Stdout, mockPVSData)
} else if cmd == "/usr/sbin/vgs" {
fmt.Fprint(os.Stdout, mockVGSData)
} else if cmd == "/usr/sbin/lvs" {
fmt.Fprint(os.Stdout, mockLVSData)
} else {
fmt.Fprint(os.Stdout, "command not found")
//nolint:revive // error code is important for this "test"
os.Exit(1)
}
//nolint:revive // error code is important for this "test"
os.Exit(0)
}
// test when no lvm devices exist
func TestGatherNoLVM(t *testing.T) {
var acc testutil.Accumulator
noLVM := LVM{
PVSBinary: "/usr/sbin/pvs",
VGSBinary: "/usr/sbin/vgs",
LVSBinary: "/usr/sbin/lvs",
}
// overwriting exec commands with mock commands
execCommand = fakeExecCommandNoLVM
err := noLVM.Gather(&acc)
require.NoError(t, err)
acc.AssertDoesNotContainMeasurement(t, "lvm_physical_vol")
acc.AssertDoesNotContainMeasurement(t, "lvm_vol_group")
acc.AssertDoesNotContainMeasurement(t, "lvm_logical_vol")
}
// Used as a helper function that mock the exec.Command call
func fakeExecCommandNoLVM(command string, args ...string) *exec.Cmd {
cs := []string{"-test.run=TestHelperProcessNoLVM", "--", command}
cs = append(cs, args...)
cmd := exec.Command(os.Args[0], cs...)
cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
return cmd
}
// Used to mock exec.Command output
func TestHelperProcessNoLVM(_ *testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
mockPVSData := `{
"report": [
{
"pv": [
]
}
]
}
`
mockVGSData := `{
"report": [
{
"vg": [
]
}
]
}
`
mockLVSData := `{
"report": [
{
"lv": [
]
}
]
}
`
// Previous arguments are tests stuff, that looks like :
// /tmp/go-build970079519/…/_test/integration.test -test.run=TestHelperProcess --
args := os.Args
cmd := args[3]
if cmd == "/usr/sbin/pvs" {
fmt.Fprint(os.Stdout, mockPVSData)
} else if cmd == "/usr/sbin/vgs" {
fmt.Fprint(os.Stdout, mockVGSData)
} else if cmd == "/usr/sbin/lvs" {
fmt.Fprint(os.Stdout, mockLVSData)
} else {
fmt.Fprint(os.Stdout, "command not found")
//nolint:revive // error code is important for this "test"
os.Exit(1)
}
//nolint:revive // error code is important for this "test"
os.Exit(0)
}