1
0
Fork 0
telegraf/plugins/inputs/redfish/redfish_test.go

1215 lines
33 KiB
Go
Raw Permalink Normal View History

package redfish
import (
"net"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/testutil"
)
func TestDellApis(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "test", "test") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/System.Embedded.1/Thermal":
http.ServeFile(w, r, "testdata/dell_thermal.json")
case "/redfish/v1/Chassis/System.Embedded.1/Power":
http.ServeFile(w, r, "testdata/dell_power.json")
case "/redfish/v1/Chassis/System.Embedded.1":
http.ServeFile(w, r, "testdata/dell_chassis.json")
case "/redfish/v1/Systems/System.Embedded.1":
http.ServeFile(w, r, "testdata/dell_systems.json")
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
u, err := url.Parse(ts.URL)
require.NoError(t, err)
address, _, err := net.SplitHostPort(u.Host)
require.NoError(t, err)
expectedMetrics := []telegraf.Metric{
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "CPU1 Temp",
"member_id": "iDRAC.Embedded.1#CPU1Temp",
"source": "tpa-hostname",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 3.0,
"lower_threshold_fatal": 3.0,
"reading_celsius": 40.0,
"upper_threshold_critical": 93.0,
"upper_threshold_fatal": 93.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan1A",
"member_id": "0x17||Fan.Embedded.1A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_rpm": 17760,
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan1B",
"member_id": "0x17||Fan.Embedded.1B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15360,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan2A",
"member_id": "0x17||Fan.Embedded.2A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 17880,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan2B",
"member_id": "0x17||Fan.Embedded.2B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15120,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan3A",
"member_id": "0x17||Fan.Embedded.3A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 18000,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan3B",
"member_id": "0x17||Fan.Embedded.3B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15600,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan4A",
"member_id": "0x17||Fan.Embedded.4A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 17280,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan4B",
"member_id": "0x17||Fan.Embedded.4B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15360,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan5A",
"member_id": "0x17||Fan.Embedded.5A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 17640,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan5B",
"member_id": "0x17||Fan.Embedded.5B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15600,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan6A",
"member_id": "0x17||Fan.Embedded.6A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 17760,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan6B",
"member_id": "0x17||Fan.Embedded.6B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15600,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan7A",
"member_id": "0x17||Fan.Embedded.7A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 17400,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan7B",
"member_id": "0x17||Fan.Embedded.7B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15720,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan8A",
"member_id": "0x17||Fan.Embedded.8A",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 18000,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "System Board Fan8B",
"member_id": "0x17||Fan.Embedded.8B",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"lower_threshold_critical": 600,
"lower_threshold_fatal": 600,
"reading_rpm": 15840,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powercontrol",
map[string]string{
"source": "tpa-hostname",
"name": "System Power Control",
"member_id": "PowerControl",
"address": address,
},
map[string]interface{}{
"average_consumed_watts": 426.0,
"interval_in_min": int64(1),
"max_consumed_watts": 436.0,
"min_consumed_watts": 425.0,
"power_allocated_watts": 1628.0,
"power_available_watts": 0.0,
"power_capacity_watts": 1628.0,
"power_consumed_watts": 429.0,
"power_requested_watts": 704.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powersupplies",
map[string]string{
"source": "tpa-hostname",
"name": "PS1 Status",
"member_id": "PSU.Slot.1",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"power_capacity_watts": 750.00,
"power_input_watts": 900.0,
"power_output_watts": 203.0,
"line_input_voltage": 206.00,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_voltages",
map[string]string{
"source": "tpa-hostname",
"name": "System Board DIMM PG",
"member_id": "iDRAC.Embedded.1#SystemBoardDIMMPG",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_volts": 1.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_voltages",
map[string]string{
"source": "tpa-hostname",
"name": "System Board NDC PG",
"member_id": "iDRAC.Embedded.1#SystemBoardNDCPG",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_volts": 1.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_voltages",
map[string]string{
"source": "tpa-hostname",
"name": "System Board PS1 PG FAIL",
"member_id": "iDRAC.Embedded.1#SystemBoardPS1PGFAIL",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_volts": 1.0,
},
time.Unix(0, 0),
),
}
plugin := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "System.Embedded.1",
IncludeMetrics: []string{"thermal", "power"},
}
require.NoError(t, plugin.Init())
var acc testutil.Accumulator
err = plugin.Gather(&acc)
require.NoError(t, err)
require.True(t, acc.HasMeasurement("redfish_thermal_temperatures"))
testutil.RequireMetricsEqual(t, expectedMetrics, acc.GetTelegrafMetrics(),
testutil.IgnoreTime())
}
func TestHPApis(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "test", "test") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/1/Thermal":
http.ServeFile(w, r, "testdata/hp_thermal.json")
case "/redfish/v1/Chassis/1/Power":
http.ServeFile(w, r, "testdata/hp_power.json")
case "/redfish/v1/Systems/1":
http.ServeFile(w, r, "testdata/hp_systems.json")
case "/redfish/v1/Chassis/1/":
http.ServeFile(w, r, "testdata/hp_chassis.json")
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
u, err := url.Parse(ts.URL)
require.NoError(t, err)
address, _, err := net.SplitHostPort(u.Host)
require.NoError(t, err)
expectedMetricsHp := []telegraf.Metric{
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "01-Inlet Ambient",
"member_id": "0",
"source": "tpa-hostname",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_celsius": 19.0,
"upper_threshold_critical": 42.0,
"upper_threshold_fatal": 47.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "44-P/S 2 Zone",
"source": "tpa-hostname",
"member_id": "42",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_celsius": 34.0,
"upper_threshold_critical": 75.0,
"upper_threshold_fatal": 80.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "Fan 1",
"member_id": "0",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_percent": 23,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "Fan 2",
"member_id": "1",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_percent": 23,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "Fan 3",
"member_id": "2",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_percent": 23,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powercontrol",
map[string]string{
"source": "tpa-hostname",
"name": "",
"member_id": "0",
"address": address,
},
map[string]interface{}{
"average_consumed_watts": 221.0,
"interval_in_min": int64(20),
"max_consumed_watts": 252.0,
"min_consumed_watts": 220.0,
"power_capacity_watts": 1600.0,
"power_consumed_watts": 221.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powersupplies",
map[string]string{
"source": "tpa-hostname",
"name": "HpeServerPowerSupply",
"member_id": "0",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"power_capacity_watts": 800.0,
"line_input_voltage": 205.0,
"last_power_output_watts": 0.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powersupplies",
map[string]string{
"source": "tpa-hostname",
"name": "HpeServerPowerSupply",
"member_id": "1",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"power_capacity_watts": 800.0,
"line_input_voltage": 205.0,
"last_power_output_watts": 90.0,
},
time.Unix(0, 0),
),
}
hpPlugin := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "1",
IncludeMetrics: []string{"thermal", "power"},
}
require.NoError(t, hpPlugin.Init())
var hpAcc testutil.Accumulator
err = hpPlugin.Gather(&hpAcc)
require.NoError(t, err)
require.True(t, hpAcc.HasMeasurement("redfish_thermal_temperatures"))
testutil.RequireMetricsEqual(t, expectedMetricsHp, hpAcc.GetTelegrafMetrics(),
testutil.IgnoreTime())
}
func TestHPilo4Apis(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "test", "test") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/1/Thermal":
http.ServeFile(w, r, "testdata/hp_thermal_ilo4.json")
case "/redfish/v1/Chassis/1/Power":
http.ServeFile(w, r, "testdata/hp_power.json")
case "/redfish/v1/Systems/1":
http.ServeFile(w, r, "testdata/hp_systems.json")
case "/redfish/v1/Chassis/1/":
http.ServeFile(w, r, "testdata/hp_chassis.json")
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
u, err := url.Parse(ts.URL)
require.NoError(t, err)
address, _, err := net.SplitHostPort(u.Host)
require.NoError(t, err)
expectedMetricsHp := []telegraf.Metric{
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "01-Inlet Ambient",
"member_id": "0",
"source": "tpa-hostname",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_celsius": 19.0,
"upper_threshold_critical": 42.0,
"upper_threshold_fatal": 47.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "44-P/S 2 Zone",
"member_id": "42",
"source": "tpa-hostname",
"address": address,
"health": "OK",
"state": "Enabled",
},
map[string]interface{}{
"reading_celsius": 34.0,
"upper_threshold_critical": 75.0,
"upper_threshold_fatal": 80.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"address": address,
"health": "OK",
"member_id": "",
"name": "Fan 1",
"source": "tpa-hostname",
"state": "Enabled",
},
map[string]interface{}{
"reading_percent": 17,
},
time.Unix(0, 0),
),
}
hpPlugin := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "1",
IncludeMetrics: []string{"thermal"},
}
require.NoError(t, hpPlugin.Init())
var hpAcc testutil.Accumulator
err = hpPlugin.Gather(&hpAcc)
require.NoError(t, err)
require.True(t, hpAcc.HasMeasurement("redfish_thermal_temperatures"))
testutil.RequireMetricsEqual(t, expectedMetricsHp, hpAcc.GetTelegrafMetrics(),
testutil.IgnoreTime())
}
func checkAuth(r *http.Request, username, password string) bool {
user, pass, ok := r.BasicAuth()
if !ok {
return false
}
return user == username && pass == password
}
func TestInvalidUsernameorPassword(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "testing", "testing") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/System.Embedded.1/Thermal":
http.ServeFile(w, r, "testdata/dell_thermal.json")
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
r := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "System.Embedded.1",
IncludeMetrics: []string{"thermal", "power"},
}
var acc testutil.Accumulator
require.NoError(t, r.Init())
u, err := url.Parse(ts.URL)
require.NoError(t, err)
err = r.Gather(&acc)
require.EqualError(t, err, "received status code 401 (Unauthorized) for address http://"+u.Host+", expected 200")
}
func TestNoUsernameorPasswordConfiguration(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "testing", "testing") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/System.Embedded.1/Thermal":
http.ServeFile(w, r, "testdata/dell_thermal.json")
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
r := &Redfish{
Address: ts.URL,
ComputerSystemID: "System.Embedded.1",
IncludeMetrics: []string{"thermal", "power"},
}
err := r.Init()
require.Error(t, err)
require.EqualError(t, err, "did not provide username and password")
}
func TestInvalidDellJSON(t *testing.T) {
tests := []struct {
name string
thermalfilename string
powerfilename string
chassisfilename string
hostnamefilename string
}{
{
name: "check Thermal",
thermalfilename: "testdata/dell_thermalinvalid.json",
powerfilename: "testdata/dell_power.json",
chassisfilename: "testdata/dell_chassis.json",
hostnamefilename: "testdata/dell_systems.json",
},
{
name: "check Power",
thermalfilename: "testdata/dell_thermal.json",
powerfilename: "testdata/dell_powerinvalid.json",
chassisfilename: "testdata/dell_chassis.json",
hostnamefilename: "testdata/dell_systems.json",
},
{
name: "check Location",
thermalfilename: "testdata/dell_thermal.json",
powerfilename: "testdata/dell_power.json",
chassisfilename: "testdata/dell_chassisinvalid.json",
hostnamefilename: "testdata/dell_systems.json",
},
{
name: "check Hostname",
thermalfilename: "testdata/dell_thermal.json",
powerfilename: "testdata/dell_power.json",
chassisfilename: "testdata/dell_chassis.json",
hostnamefilename: "testdata/dell_systemsinvalid.json",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "test", "test") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/System.Embedded.1/Thermal":
http.ServeFile(w, r, tt.thermalfilename)
case "/redfish/v1/Chassis/System.Embedded.1/Power":
http.ServeFile(w, r, tt.powerfilename)
case "/redfish/v1/Chassis/System.Embedded.1":
http.ServeFile(w, r, tt.chassisfilename)
case "/redfish/v1/Systems/System.Embedded.1":
http.ServeFile(w, r, tt.hostnamefilename)
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
plugin := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "System.Embedded.1",
IncludeMetrics: []string{"thermal", "power"},
}
require.NoError(t, plugin.Init())
var acc testutil.Accumulator
err := plugin.Gather(&acc)
require.Error(t, err)
require.Contains(t, err.Error(), "error parsing input:")
})
}
}
func TestInvalidHPJSON(t *testing.T) {
tests := []struct {
name string
thermalfilename string
powerfilename string
hostnamefilename string
chassisfilename string
}{
{
name: "check Thermal",
thermalfilename: "testdata/hp_thermalinvalid.json",
powerfilename: "testdata/hp_power.json",
hostnamefilename: "testdata/hp_systems.json",
chassisfilename: "testdata/hp_chassis.json",
},
{
name: "check Power",
thermalfilename: "testdata/hp_thermal.json",
powerfilename: "testdata/hp_powerinvalid.json",
hostnamefilename: "testdata/hp_systems.json",
chassisfilename: "testdata/hp_chassis.json",
},
{
name: "check Hostname",
thermalfilename: "testdata/hp_thermal.json",
powerfilename: "testdata/hp_power.json",
hostnamefilename: "testdata/hp_systemsinvalid.json",
chassisfilename: "testdata/hp_chassis.json",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "test", "test") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/1/Thermal":
http.ServeFile(w, r, tt.thermalfilename)
case "/redfish/v1/Chassis/1/Power":
http.ServeFile(w, r, tt.powerfilename)
case "/redfish/v1/Chassis/1/":
http.ServeFile(w, r, tt.chassisfilename)
case "/redfish/v1/Systems/System.Embedded.2":
http.ServeFile(w, r, tt.hostnamefilename)
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
plugin := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "System.Embedded.2",
IncludeMetrics: []string{"thermal", "power"},
}
require.NoError(t, plugin.Init())
var acc testutil.Accumulator
err := plugin.Gather(&acc)
require.Error(t, err)
require.Contains(t, err.Error(), "error parsing input:")
})
}
}
func TestIncludeTagSetsConfiguration(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !checkAuth(r, "test", "test") {
http.Error(w, "Unauthorized.", http.StatusUnauthorized)
return
}
switch r.URL.Path {
case "/redfish/v1/Chassis/1/Thermal":
http.ServeFile(w, r, "testdata/hp_thermal.json")
case "/redfish/v1/Chassis/1/Power":
http.ServeFile(w, r, "testdata/hp_power.json")
case "/redfish/v1/Systems/1":
http.ServeFile(w, r, "testdata/hp_systems.json")
case "/redfish/v1/Chassis/1/":
http.ServeFile(w, r, "testdata/hp_chassis.json")
default:
w.WriteHeader(http.StatusNotFound)
}
}))
defer ts.Close()
u, err := url.Parse(ts.URL)
require.NoError(t, err)
address, _, err := net.SplitHostPort(u.Host)
require.NoError(t, err)
expectedMetricsHp := []telegraf.Metric{
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "01-Inlet Ambient",
"member_id": "0",
"source": "tpa-hostname",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"reading_celsius": 19.0,
"upper_threshold_critical": 42.0,
"upper_threshold_fatal": 47.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_temperatures",
map[string]string{
"name": "44-P/S 2 Zone",
"source": "tpa-hostname",
"member_id": "42",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"reading_celsius": 34.0,
"upper_threshold_critical": 75.0,
"upper_threshold_fatal": 80.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "Fan 1",
"member_id": "0",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"reading_percent": 23,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "Fan 2",
"member_id": "1",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"reading_percent": 23,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_thermal_fans",
map[string]string{
"source": "tpa-hostname",
"name": "Fan 3",
"member_id": "2",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"reading_percent": 23,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powercontrol",
map[string]string{
"source": "tpa-hostname",
"name": "",
"member_id": "0",
"address": address,
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"average_consumed_watts": 221.0,
"interval_in_min": int64(20),
"max_consumed_watts": 252.0,
"min_consumed_watts": 220.0,
"power_capacity_watts": 1600.0,
"power_consumed_watts": 221.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powersupplies",
map[string]string{
"source": "tpa-hostname",
"name": "HpeServerPowerSupply",
"member_id": "0",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"power_capacity_watts": 800.0,
"line_input_voltage": 205.0,
"last_power_output_watts": 0.0,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"redfish_power_powersupplies",
map[string]string{
"source": "tpa-hostname",
"name": "HpeServerPowerSupply",
"member_id": "1",
"address": address,
"health": "OK",
"state": "Enabled",
"rack": "",
"room": "",
"row": "",
"datacenter": "",
"chassis_chassistype": "RackMount",
"chassis_manufacturer": "HP",
"chassis_model": "Proliant Gen10",
"chassis_partnumber": "CT6NWPYZ",
"chassis_powerstate": "On",
"chassis_sku": "CLFYTTWP",
"chassis_serialnumber": "QWEVC007C99803",
"chassis_state": "Enabled",
"chassis_health": "OK",
},
map[string]interface{}{
"power_capacity_watts": 800.0,
"line_input_voltage": 205.0,
"last_power_output_watts": 90.0,
},
time.Unix(0, 0),
),
}
hpPlugin := &Redfish{
Address: ts.URL,
Username: config.NewSecret([]byte("test")),
Password: config.NewSecret([]byte("test")),
ComputerSystemID: "1",
IncludeTagSets: []string{"chassis", "chassis.location"},
IncludeMetrics: []string{"thermal", "power"},
}
require.NoError(t, hpPlugin.Init())
var hpAcc testutil.Accumulator
err = hpPlugin.Gather(&hpAcc)
require.NoError(t, err)
require.True(t, hpAcc.HasMeasurement("redfish_thermal_temperatures"))
testutil.RequireMetricsEqual(t, expectedMetricsHp, hpAcc.GetTelegrafMetrics(),
testutil.IgnoreTime())
}