105 lines
2.0 KiB
Go
105 lines
2.0 KiB
Go
// SPDX-License-Identifier: Apache-2.0
|
|
// Copyright Authors of K9s
|
|
|
|
package config
|
|
|
|
const (
|
|
// SeverityLow tracks low severity.
|
|
SeverityLow SeverityLevel = iota
|
|
|
|
// SeverityMedium tracks medium severity level.
|
|
SeverityMedium
|
|
|
|
// SeverityHigh tracks high severity level.
|
|
SeverityHigh
|
|
)
|
|
|
|
// SeverityLevel tracks severity levels.
|
|
type SeverityLevel int
|
|
|
|
// Severity tracks a resource severity levels.
|
|
type Severity struct {
|
|
Critical int `yaml:"critical"`
|
|
Warn int `yaml:"warn"`
|
|
}
|
|
|
|
// NewSeverity returns a new instance.
|
|
func NewSeverity() *Severity {
|
|
return &Severity{
|
|
Critical: 90,
|
|
Warn: 70,
|
|
}
|
|
}
|
|
|
|
// Validate checks all thresholds and make sure we're cool. If not use defaults.
|
|
func (s *Severity) Validate() {
|
|
norm := NewSeverity()
|
|
if !validateRange(s.Warn) {
|
|
s.Warn = norm.Warn
|
|
}
|
|
if !validateRange(s.Critical) {
|
|
s.Critical = norm.Critical
|
|
}
|
|
}
|
|
|
|
func validateRange(v int) bool {
|
|
if v <= 0 || v > 100 {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Threshold tracks threshold to alert user when exceeded.
|
|
type Threshold map[string]*Severity
|
|
|
|
// NewThreshold returns a new threshold.
|
|
func NewThreshold() Threshold {
|
|
return Threshold{
|
|
"cpu": NewSeverity(),
|
|
"memory": NewSeverity(),
|
|
}
|
|
}
|
|
|
|
// Validate a namespace is setup correctly.
|
|
func (t Threshold) Validate() Threshold {
|
|
for _, k := range []string{"cpu", "memory"} {
|
|
v, ok := t[k]
|
|
if !ok {
|
|
t[k] = NewSeverity()
|
|
} else {
|
|
v.Validate()
|
|
}
|
|
}
|
|
|
|
return t
|
|
}
|
|
|
|
// LevelFor returns a defcon level for the current state.
|
|
func (t Threshold) LevelFor(k string, v int) SeverityLevel {
|
|
s, ok := t[k]
|
|
if !ok || v < 0 || v > 100 {
|
|
return SeverityLow
|
|
}
|
|
if v >= s.Critical {
|
|
return SeverityHigh
|
|
}
|
|
if v >= s.Warn {
|
|
return SeverityMedium
|
|
}
|
|
|
|
return SeverityLow
|
|
}
|
|
|
|
// SeverityColor returns a defcon level associated level.
|
|
func (t *Threshold) SeverityColor(k string, v int) string {
|
|
// nolint:exhaustive
|
|
switch t.LevelFor(k, v) {
|
|
case SeverityHigh:
|
|
return "red"
|
|
case SeverityMedium:
|
|
return "orangered"
|
|
default:
|
|
return "green"
|
|
}
|
|
}
|