1214 lines
33 KiB
Go
1214 lines
33 KiB
Go
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())
|
|
}
|