package models
import (
"errors"
"time"
"github.com/weibaohui/k8m/internal/dao"
"github.com/weibaohui/k8m/pkg/comm/utils"
"gorm.io/gorm"
)
// K8sEvent 中文函数注释:事件转发插件使用的K8s事件模型。
type K8sEvent struct {
ID int64 `gorm:"primaryKey;autoIncrement" json:"id"`
EvtKey string `gorm:"uniqueIndex;" json:"evt_key"`
Cluster string `gorm:"type:varchar(128);" json:"cluster"`
Namespace string `gorm:"type:varchar(64);index" json:"namespace"`
Name string `gorm:"type:varchar(128);" json:"name"`
Type string `gorm:"type:varchar(16);" json:"type"`
Reason string `gorm:"type:varchar(128);" json:"reason"`
Level string `gorm:"type:varchar(16);" json:"level"`
Message string `gorm:"type:text;" json:"message"`
Timestamp time.Time `gorm:"index" json:"timestamp"`
Processed bool `gorm:"default:false;index" json:"processed"`
Attempts int `gorm:"default:0" json:"-"`
CreatedAt time.Time `json:"created_at,omitempty" gorm:"<-:create"`
UpdatedAt time.Time `json:"-"`
}
// TableName 中文函数注释:设置表名。
func (e *K8sEvent) TableName() string {
return "k8s_events"
}
// IsWarning 中文函数注释:判断是否为警告类型事件。
func (e *K8sEvent) IsWarning() bool {
return e.Type == "Warning"
}
// IsNormal 中文函数注释:判断是否为正常类型事件。
func (e *K8sEvent) IsNormal() bool {
return e.Type == "Normal"
}
// ShouldProcess 中文函数注释:判断事件是否应该被处理。
func (e *K8sEvent) ShouldProcess() bool {
return !e.Processed && e.IsWarning()
}
// List 中文函数注释:列出事件记录。
func (e *K8sEvent) List(params *dao.Params, queryFuncs ...func(*gorm.DB) *gorm.DB) ([]*K8sEvent, int64, error) {
return dao.GenericQuery(params, e, queryFuncs...)
}
// Save 中文函数注释:保存事件记录。
func (e *K8sEvent) Save(params *dao.Params, queryFuncs ...func(*gorm.DB) *gorm.DB) error {
return dao.GenericSave(params, e, queryFuncs...)
}
// Delete 中文函数注释:根据ID删除事件记录。
func (e *K8sEvent) Delete(params *dao.Params, ids string, queryFuncs ...func(*gorm.DB) *gorm.DB) error {
return dao.GenericDelete(params, e, utils.ToInt64Slice(ids), queryFuncs...)
}
// GetOne 中文函数注释:获取单条事件记录。
func (e *K8sEvent) GetOne(params *dao.Params, queryFuncs ...func(*gorm.DB) *gorm.DB) (*K8sEvent, error) {
return dao.GenericGetOne(params, e, queryFuncs...)
}
// GetByEvtKey 中文函数注释:根据事件键获取事件。
func (e *K8sEvent) GetByEvtKey(evtKey string) (*K8sEvent, error) {
var item K8sEvent
err := dao.DB().Where("evt_key = ?", evtKey).First(&item).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &item, nil
}
// MarkProcessedByID 中文函数注释:根据ID更新处理状态。
func (e *K8sEvent) MarkProcessedByID(id int64, processed bool) error {
return dao.DB().Model(&K8sEvent{}).Where("id = ?", id).Update("processed", processed).Error
}
// IncrementAttemptsByID 中文函数注释:根据ID增加重试次数。
func (e *K8sEvent) IncrementAttemptsByID(id int64) error {
return dao.DB().Model(&K8sEvent{}).Where("id = ?", id).UpdateColumn("attempts", gorm.Expr("attempts + ?", 1)).Error
}
// ListUnprocessed 中文函数注释:列出未处理的事件,按时间升序,限制条数。
func (e *K8sEvent) ListUnprocessed(limit int) ([]*K8sEvent, error) {
var list []*K8sEvent
err := dao.DB().Where("processed = ?", false).Order("timestamp ASC").Limit(limit).Find(&list).Error
return list, err
}
// SaveEvent 中文函数注释:以默认参数保存事件记录。
func (e *K8sEvent) SaveEvent() error {
return e.Save(dao.BuildDefaultParams())
}