mirror of
https://github.com/replicatedhq/troubleshoot.git
synced 2026-04-15 07:16:34 +00:00
* feat(host_sysctl): add host sysctl collector * chore: add examples * Update pkg/collect/host_sysctl.go Co-authored-by: Evans Mungai <evans@replicated.com> * chore: use sysctl package vs exec calls * chore: make linter happy * chore: make schemas * chore: go back to sysctl exec * chore: make linter happy --------- Co-authored-by: Evans Mungai <evans@replicated.com>
174 lines
4.1 KiB
Go
174 lines
4.1 KiB
Go
package collect
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os/exec"
|
|
"testing"
|
|
|
|
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
|
"github.com/replicatedhq/troubleshoot/pkg/multitype"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type execStub struct {
|
|
cmd *exec.Cmd
|
|
name string
|
|
args []string
|
|
}
|
|
|
|
func (s *execStub) testExecCommand(name string, args ...string) *exec.Cmd {
|
|
s.name = name
|
|
s.args = args
|
|
return s.cmd
|
|
}
|
|
|
|
func setExecStub(c *exec.Cmd) {
|
|
e := &execStub{
|
|
cmd: c,
|
|
}
|
|
execCommand = e.testExecCommand
|
|
}
|
|
|
|
func TestCollectHostSysctl_Error(t *testing.T) {
|
|
req := require.New(t)
|
|
setExecStub(exec.Command("sh", "-c", "exit 1"))
|
|
|
|
tmpDir := t.TempDir()
|
|
c := &CollectHostSysctl{
|
|
BundlePath: tmpDir,
|
|
}
|
|
|
|
_, err := c.Collect(nil)
|
|
req.ErrorContains(err, "failed to run sysctl exit-code=1")
|
|
}
|
|
|
|
func TestCollectHostSysctl_(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
cmdOut string
|
|
expected map[string]string
|
|
}{
|
|
{
|
|
name: "linux",
|
|
cmdOut: `
|
|
net.ipv4.conf.all.arp_evict_nocarrier = 1
|
|
net.ipv4.conf.all.arp_filter = 0
|
|
net.ipv4.conf.all.arp_ignore = 0
|
|
`,
|
|
expected: map[string]string{
|
|
"net.ipv4.conf.all.arp_evict_nocarrier": "1",
|
|
"net.ipv4.conf.all.arp_filter": "0",
|
|
"net.ipv4.conf.all.arp_ignore": "0",
|
|
},
|
|
},
|
|
{
|
|
name: "darwin",
|
|
cmdOut: `
|
|
kern.prng.pool_31.max_sample_count: 16420665
|
|
kern.crypto.sha1: SHA1_VNG_ARM
|
|
kern.crypto.sha512: SHA512_VNG_ARM_HW
|
|
kern.crypto.aes.ecb.encrypt: AES_ECB_ARM
|
|
kern.monotonicclock: 4726514
|
|
kern.monotonicclock_usecs: 4726514658233 13321990885027
|
|
`,
|
|
expected: map[string]string{
|
|
"kern.prng.pool_31.max_sample_count": "16420665",
|
|
"kern.crypto.sha1": "SHA1_VNG_ARM",
|
|
"kern.crypto.sha512": "SHA512_VNG_ARM_HW",
|
|
"kern.crypto.aes.ecb.encrypt": "AES_ECB_ARM",
|
|
"kern.monotonicclock": "4726514",
|
|
"kern.monotonicclock_usecs": "4726514658233 13321990885027",
|
|
},
|
|
},
|
|
{
|
|
name: "skip non valid entries and keep empty values",
|
|
cmdOut: `
|
|
net.ipv4.conf.all.arp_ignore =
|
|
kern.prng.pool_31.max_sample_count:
|
|
not-valid
|
|
net.ipv4.conf.all.arp_filter = 0
|
|
`,
|
|
expected: map[string]string{
|
|
"net.ipv4.conf.all.arp_ignore": "",
|
|
"kern.prng.pool_31.max_sample_count": "",
|
|
"net.ipv4.conf.all.arp_filter": "0",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
req := require.New(t)
|
|
|
|
setExecStub(exec.Command("echo", "-n", test.cmdOut)) // #nosec G204
|
|
|
|
tmpDir := t.TempDir()
|
|
c := &CollectHostSysctl{
|
|
BundlePath: tmpDir,
|
|
}
|
|
|
|
out, err := c.Collect(nil)
|
|
req.NoError(err)
|
|
res := CollectorResult(out)
|
|
reader, err := res.GetReader(tmpDir, HostSysctlPath)
|
|
req.NoError(err)
|
|
|
|
parameters := map[string]string{}
|
|
err = json.NewDecoder(reader).Decode(¶meters)
|
|
req.NoError(err)
|
|
|
|
req.Equal(test.expected, parameters)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCollectHostSysctl_Title(t *testing.T) {
|
|
req := require.New(t)
|
|
|
|
// Default title is set
|
|
c := &CollectHostSysctl{
|
|
hostCollector: &troubleshootv1beta2.HostSysctl{
|
|
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{},
|
|
},
|
|
}
|
|
req.Equal("Sysctl", c.Title())
|
|
|
|
// Configured title is set
|
|
c = &CollectHostSysctl{
|
|
hostCollector: &troubleshootv1beta2.HostSysctl{
|
|
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{
|
|
CollectorName: "foobar",
|
|
},
|
|
},
|
|
}
|
|
req.Equal("foobar", c.Title())
|
|
}
|
|
|
|
func TestCollectHostSysctl_IsExcluded(t *testing.T) {
|
|
req := require.New(t)
|
|
|
|
// Exclude is true
|
|
c := &CollectHostSysctl{
|
|
hostCollector: &troubleshootv1beta2.HostSysctl{
|
|
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{
|
|
Exclude: multitype.FromBool(true),
|
|
},
|
|
},
|
|
}
|
|
isExcluded, err := c.IsExcluded()
|
|
req.NoError(err)
|
|
req.Equal(true, isExcluded)
|
|
|
|
// Exclude is false
|
|
c = &CollectHostSysctl{
|
|
hostCollector: &troubleshootv1beta2.HostSysctl{
|
|
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{
|
|
Exclude: multitype.FromBool(false),
|
|
},
|
|
},
|
|
}
|
|
isExcluded, err = c.IsExcluded()
|
|
req.NoError(err)
|
|
req.Equal(false, isExcluded)
|
|
}
|