package models import ( "fmt" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" stgmod "gitlink.org.cn/cloudream/storage/common/models" "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" "gorm.io/gorm" "log" "time" ) type HubRequest struct { //todo source和target类型的区分 RequestID int64 `gorm:"column:RequestID; primaryKey; type:bigint; autoIncrement" json:"RequestID"` SourceType string `gorm:"column:SourceType; type:varchar(255); not null" json:"sourceType"` SourceID cdssdk.HubID `gorm:"column:SourceID; type:bigint; not null" json:"sourceID"` TargetType string `gorm:"column:TargetType; type:varchar(255); not null" json:"targetType"` TargetID cdssdk.HubID `gorm:"column:TargetID; type:bigint; not null" json:"targetID"` DataTransferCount int64 `gorm:"column:DataTransferCount; type:bigint; not null" json:"dataTransferCount"` RequestCount int64 `gorm:"column:RequestCount; type:bigint; not null" json:"requestCount"` FailedRequestCount int64 `gorm:"column:FailedRequestCount; type:bigint; not null" json:"failedRequestCount"` AvgTransferCount int64 `gorm:"column:AvgTransferCount; type:bigint; not null" json:"avgTransferCount"` MaxTransferCount int64 `gorm:"column:MaxTransferCount; type:bigint; not null" json:"maxTransferCount"` MinTransferCount int64 `gorm:"column:MinTransferCount; type:bigint; not null" json:"minTransferCount"` StartTimestamp time.Time `gorm:"column:StartTimestamp; type:datatime; not null" json:"startTimestamp"` EndTimestamp time.Time `gorm:"column:EndTimestamp; type:datatime; not null" json:"endTimestamp"` } func (HubRequest) TableName() string { return "hubrequest" } type HubRequestRepository struct { repo *GormRepository } func NewHubRequestRepository(db *gorm.DB) *HubRequestRepository { return &HubRequestRepository{repo: NewGormRepository(db)} } func (r *HubRequestRepository) CreateHubRequest(request *HubRequest) error { return r.repo.Create(request) } func (r *HubRequestRepository) GetHubRequestByHubID(hubId int64) ([]HubRequest, error) { var hubRequests []HubRequest query := "SELECT * FROM hubrequest WHERE SourceHubID = ?" err := r.repo.db.Raw(query, hubId).Scan(&hubRequests).Error if err != nil { return nil, err } return hubRequests, nil } func (r *HubRequestRepository) GetAllHubRequests() ([]HubRequest, error) { var hubRequests []HubRequest err := r.repo.GetAll(&hubRequests) if err != nil { return nil, err } return hubRequests, nil } type HubTransferStatsWatcher struct { Name string } func (w *HubTransferStatsWatcher) OnEvent(event sysevent.SysEvent) { repo := NewHubRequestRepository(DB) if event.Category == "hubTransferStats" { if hubTransferStats, ok := event.Body.(*stgmod.BodyHubTransferStats); ok { hubRequest := &HubRequest{ SourceType: "hub", SourceID: hubTransferStats.SourceHubID, TargetType: "hub", TargetID: hubTransferStats.TargetHubID, DataTransferCount: hubTransferStats.Send.TotalTransfer, RequestCount: hubTransferStats.Send.RequestCount, FailedRequestCount: hubTransferStats.Send.FailedRequestCount, AvgTransferCount: hubTransferStats.Send.AvgTransfer, MaxTransferCount: hubTransferStats.Send.MaxTransfer, MinTransferCount: hubTransferStats.Send.MinTransfer, StartTimestamp: hubTransferStats.StartTimestamp, EndTimestamp: hubTransferStats.EndTimestamp, } err := repo.CreateHubRequest(hubRequest) if err != nil { log.Printf("Error update hubrequest: %v", err) } } else { fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body) } } else { fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category) } } type HubStorageTransferStatsWatcher struct { Name string } func (w *HubStorageTransferStatsWatcher) OnEvent(event sysevent.SysEvent) { repo := NewHubRequestRepository(DB) if event.Category == "hubStorageTransferStats" { if hubStorageTransferStats, ok := event.Body.(*stgmod.BodyHubStorageTransferStats); ok { hubRequestSend := &HubRequest{ SourceType: "hub", SourceID: hubStorageTransferStats.HubID, TargetType: "storage", TargetID: cdssdk.HubID(hubStorageTransferStats.StorageID), DataTransferCount: hubStorageTransferStats.Send.TotalTransfer, RequestCount: hubStorageTransferStats.Send.RequestCount, FailedRequestCount: hubStorageTransferStats.Send.FailedRequestCount, AvgTransferCount: hubStorageTransferStats.Send.AvgTransfer, MaxTransferCount: hubStorageTransferStats.Send.MaxTransfer, MinTransferCount: hubStorageTransferStats.Send.MinTransfer, StartTimestamp: hubStorageTransferStats.StartTimestamp, EndTimestamp: hubStorageTransferStats.EndTimestamp, } err := repo.CreateHubRequest(hubRequestSend) if err != nil { log.Printf("Error update hubrequest: %v", err) } hubRequestReceive := &HubRequest{ SourceType: "storage", SourceID: cdssdk.HubID(hubStorageTransferStats.StorageID), TargetType: "hub", TargetID: hubStorageTransferStats.HubID, DataTransferCount: hubStorageTransferStats.Receive.TotalTransfer, RequestCount: hubStorageTransferStats.Receive.RequestCount, FailedRequestCount: hubStorageTransferStats.Receive.FailedRequestCount, AvgTransferCount: hubStorageTransferStats.Receive.AvgTransfer, MaxTransferCount: hubStorageTransferStats.Receive.MaxTransfer, MinTransferCount: hubStorageTransferStats.Receive.MinTransfer, StartTimestamp: hubStorageTransferStats.StartTimestamp, EndTimestamp: hubStorageTransferStats.EndTimestamp, } err = repo.CreateHubRequest(hubRequestReceive) if err != nil { log.Printf("Error update hubrequest: %v", err) } } else { fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body) } } else { fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category) } }