safing-portbase/modules/export.go

117 lines
2.7 KiB
Go

package modules
import "sync/atomic"
// Status holds an exported status summary of the modules system.
type Status struct {
Modules map[string]*ModuleStatus
Total struct {
Workers int
Tasks int
MicroTasks int
CtrlFuncRunning int
}
Config struct {
MicroTasksThreshhold int
MediumPriorityDelay string
LowPriorityDelay string
}
}
// ModuleStatus holds an exported status summary of one module.
type ModuleStatus struct { //nolint:maligned
Enabled bool
Status string
FailureType string
FailureID string
FailureMsg string
Workers int
Tasks int
MicroTasks int
CtrlFuncRunning bool
}
// GetStatus exports status data from the module system.
func GetStatus() *Status {
// Check if modules have been initialized.
if modulesLocked.IsNotSet() {
return nil
}
// Create new status.
status := &Status{
Modules: make(map[string]*ModuleStatus, len(modules)),
}
// Add config.
status.Config.MicroTasksThreshhold = int(atomic.LoadInt32(microTasksThreshhold))
status.Config.MediumPriorityDelay = defaultMediumPriorityMaxDelay.String()
status.Config.LowPriorityDelay = defaultLowPriorityMaxDelay.String()
// Gather status data.
for name, module := range modules {
moduleStatus := &ModuleStatus{
Enabled: module.Enabled(),
Status: getStatusName(module.Status()),
Workers: int(atomic.LoadInt32(module.workerCnt)),
Tasks: int(atomic.LoadInt32(module.taskCnt)),
MicroTasks: int(atomic.LoadInt32(module.microTaskCnt)),
CtrlFuncRunning: module.ctrlFuncRunning.IsSet(),
}
// Add failure status.
failureStatus, failureID, failureMsg := module.FailureStatus()
moduleStatus.FailureType = getFailureStatusName(failureStatus)
moduleStatus.FailureID = failureID
moduleStatus.FailureMsg = failureMsg
// Add to total counts.
status.Total.Workers += moduleStatus.Workers
status.Total.Tasks += moduleStatus.Tasks
status.Total.MicroTasks += moduleStatus.MicroTasks
if moduleStatus.CtrlFuncRunning {
status.Total.CtrlFuncRunning++
}
// Add to export.
status.Modules[name] = moduleStatus
}
return status
}
func getStatusName(status uint8) string {
switch status {
case StatusDead:
return "dead"
case StatusPreparing:
return "preparing"
case StatusOffline:
return "offline"
case StatusStopping:
return "stopping"
case StatusStarting:
return "starting"
case StatusOnline:
return "online"
default:
return "unknown"
}
}
func getFailureStatusName(status uint8) string {
switch status {
case FailureNone:
return ""
case FailureHint:
return "hint"
case FailureWarning:
return "warning"
case FailureError:
return "error"
default:
return "unknown"
}
}