215 lines
4.9 KiB
Go
215 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)
|
||
|
}
|