From 36daae231cab18ead581750de11ae21043253e95 Mon Sep 17 00:00:00 2001 From: Stefan Majer Date: Fri, 4 Oct 2024 08:20:19 +0200 Subject: [PATCH 1/3] Add powersupply failures to machine issues --- cmd/metal-api/internal/issues/issues_test.go | 33 +++++++++++++++ .../internal/issues/powersupply-failure.go | 41 +++++++++++++++++++ cmd/metal-api/internal/issues/types.go | 3 ++ 3 files changed, 77 insertions(+) create mode 100644 cmd/metal-api/internal/issues/powersupply-failure.go diff --git a/cmd/metal-api/internal/issues/issues_test.go b/cmd/metal-api/internal/issues/issues_test.go index 934f26add..c47786f36 100644 --- a/cmd/metal-api/internal/issues/issues_test.go +++ b/cmd/metal-api/internal/issues/issues_test.go @@ -85,6 +85,39 @@ func TestFindIssues(t *testing.T) { } }, }, + { + name: "powersupply failure", + only: []Type{TypePowerSupplyFailure}, + machines: func() metal.Machines { + noPartitionMachine := machineTemplate("power-supply-failure") + noPartitionMachine.IPMI = metal.IPMI{ + PowerSupplies: metal.PowerSupplies{ + {Status: metal.PowerSupplyStatus{Health: "NO-OK", State: "Absent"}}, + }, + } + + return metal.Machines{ + noPartitionMachine, + machineTemplate("good"), + } + }, + eventContainers: func() metal.ProvisioningEventContainers { + return metal.ProvisioningEventContainers{ + eventContainerTemplate("power-supply-failure"), + eventContainerTemplate("good"), + } + }, + want: func(machines metal.Machines) MachineIssues { + return MachineIssues{ + { + Machine: &machines[0], + Issues: Issues{ + toIssue(&issuePowerSupplyFailure{details: "Health:NO-OK State:Absent"}), + }, + }, + } + }, + }, { name: "liveliness dead", only: []Type{TypeLivelinessDead}, diff --git a/cmd/metal-api/internal/issues/powersupply-failure.go b/cmd/metal-api/internal/issues/powersupply-failure.go new file mode 100644 index 000000000..e9c49a3b1 --- /dev/null +++ b/cmd/metal-api/internal/issues/powersupply-failure.go @@ -0,0 +1,41 @@ +package issues + +import ( + "fmt" + "strings" + + "github.com/metal-stack/metal-api/cmd/metal-api/internal/metal" +) + +const ( + TypePowerSupplyFailure Type = "powersupply-failure" +) + +type ( + issuePowerSupplyFailure struct { + details string + } +) + +func (i *issuePowerSupplyFailure) Spec() *spec { + return &spec{ + Type: TypePowerSupplyFailure, + Severity: SeverityMajor, + Description: "machine has power supply failures", + RefURL: "https://docs.metal-stack.io/stable/installation/troubleshoot/#power-supply-failure", + } +} + +func (i *issuePowerSupplyFailure) Evaluate(m metal.Machine, ec metal.ProvisioningEventContainer, c *Config) bool { + for _, ps := range m.IPMI.PowerSupplies { + if strings.ToLower(ps.Status.Health) != "ok" || strings.ToLower(ps.Status.State) != "enabled" { + i.details = fmt.Sprintf("Health:%s State:%s", ps.Status.Health, ps.Status.State) + return true + } + } + return false +} + +func (i *issuePowerSupplyFailure) Details() string { + return i.details +} diff --git a/cmd/metal-api/internal/issues/types.go b/cmd/metal-api/internal/issues/types.go index 2ff13ad0e..c38536a08 100644 --- a/cmd/metal-api/internal/issues/types.go +++ b/cmd/metal-api/internal/issues/types.go @@ -21,6 +21,7 @@ func AllIssueTypes() []Type { TypeASNUniqueness, TypeNonDistinctBMCIP, TypeNoEventContainer, + TypePowerSupplyFailure, } } @@ -52,6 +53,8 @@ func NewIssueFromType(t Type) (issue, error) { return &issueNonDistinctBMCIP{}, nil case TypeNoEventContainer: return &issueNoEventContainer{}, nil + case TypePowerSupplyFailure: + return &issuePowerSupplyFailure{}, nil default: return nil, fmt.Errorf("unknown issue type: %s", t) } From 0da890ec0a32f283c6f4c2942e15818be88ced6b Mon Sep 17 00:00:00 2001 From: Stefan Majer Date: Fri, 8 Nov 2024 07:18:20 +0100 Subject: [PATCH 2/3] Update cmd/metal-api/internal/issues/issues_test.go Co-authored-by: Gerrit --- cmd/metal-api/internal/issues/issues_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/metal-api/internal/issues/issues_test.go b/cmd/metal-api/internal/issues/issues_test.go index c47786f36..734be8ad2 100644 --- a/cmd/metal-api/internal/issues/issues_test.go +++ b/cmd/metal-api/internal/issues/issues_test.go @@ -89,7 +89,7 @@ func TestFindIssues(t *testing.T) { name: "powersupply failure", only: []Type{TypePowerSupplyFailure}, machines: func() metal.Machines { - noPartitionMachine := machineTemplate("power-supply-failure") + defectPowerSupplyMachine := machineTemplate("power-supply-failure") noPartitionMachine.IPMI = metal.IPMI{ PowerSupplies: metal.PowerSupplies{ {Status: metal.PowerSupplyStatus{Health: "NO-OK", State: "Absent"}}, From 30abd5c8034d95824cf43af6fbb568871b8a7632 Mon Sep 17 00:00:00 2001 From: Stefan Majer Date: Fri, 8 Nov 2024 10:02:28 +0100 Subject: [PATCH 3/3] Fix test --- cmd/metal-api/internal/issues/issues_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/metal-api/internal/issues/issues_test.go b/cmd/metal-api/internal/issues/issues_test.go index 734be8ad2..5d5ef0945 100644 --- a/cmd/metal-api/internal/issues/issues_test.go +++ b/cmd/metal-api/internal/issues/issues_test.go @@ -90,14 +90,14 @@ func TestFindIssues(t *testing.T) { only: []Type{TypePowerSupplyFailure}, machines: func() metal.Machines { defectPowerSupplyMachine := machineTemplate("power-supply-failure") - noPartitionMachine.IPMI = metal.IPMI{ + defectPowerSupplyMachine.IPMI = metal.IPMI{ PowerSupplies: metal.PowerSupplies{ {Status: metal.PowerSupplyStatus{Health: "NO-OK", State: "Absent"}}, }, } return metal.Machines{ - noPartitionMachine, + defectPowerSupplyMachine, machineTemplate("good"), } },