You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

hubrequest.go 6.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package models
  2. import (
  3. "fmt"
  4. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  5. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  6. "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent"
  7. "gorm.io/gorm"
  8. "log"
  9. "time"
  10. )
  11. type HubRequest struct {
  12. //todo source和target类型的区分
  13. RequestID int64 `gorm:"column:RequestID; primaryKey; type:bigint; autoIncrement" json:"RequestID"`
  14. SourceType string `gorm:"column:SourceType; type:varchar(255); not null" json:"sourceType"`
  15. SourceID cdssdk.HubID `gorm:"column:SourceID; type:bigint; not null" json:"sourceID"`
  16. TargetType string `gorm:"column:TargetType; type:varchar(255); not null" json:"targetType"`
  17. TargetID cdssdk.HubID `gorm:"column:TargetID; type:bigint; not null" json:"targetID"`
  18. DataTransferCount int64 `gorm:"column:DataTransferCount; type:bigint; not null" json:"dataTransferCount"`
  19. RequestCount int64 `gorm:"column:RequestCount; type:bigint; not null" json:"requestCount"`
  20. FailedRequestCount int64 `gorm:"column:FailedRequestCount; type:bigint; not null" json:"failedRequestCount"`
  21. AvgTransferCount int64 `gorm:"column:AvgTransferCount; type:bigint; not null" json:"avgTransferCount"`
  22. MaxTransferCount int64 `gorm:"column:MaxTransferCount; type:bigint; not null" json:"maxTransferCount"`
  23. MinTransferCount int64 `gorm:"column:MinTransferCount; type:bigint; not null" json:"minTransferCount"`
  24. StartTimestamp time.Time `gorm:"column:StartTimestamp; type:datatime; not null" json:"startTimestamp"`
  25. EndTimestamp time.Time `gorm:"column:EndTimestamp; type:datatime; not null" json:"endTimestamp"`
  26. }
  27. func (HubRequest) TableName() string { return "hubrequest" }
  28. type HubRequestRepository struct {
  29. repo *GormRepository
  30. }
  31. func NewHubRequestRepository(db *gorm.DB) *HubRequestRepository {
  32. return &HubRequestRepository{repo: NewGormRepository(db)}
  33. }
  34. func (r *HubRequestRepository) CreateHubRequest(request *HubRequest) error {
  35. return r.repo.Create(request)
  36. }
  37. func (r *HubRequestRepository) GetHubRequestByHubID(hubId int64) ([]HubRequest, error) {
  38. var hubRequests []HubRequest
  39. query := "SELECT * FROM hubrequest WHERE SourceHubID = ?"
  40. err := r.repo.db.Raw(query, hubId).Scan(&hubRequests).Error
  41. if err != nil {
  42. return nil, err
  43. }
  44. return hubRequests, nil
  45. }
  46. func (r *HubRequestRepository) GetAllHubRequests() ([]HubRequest, error) {
  47. var hubRequests []HubRequest
  48. err := r.repo.GetAll(&hubRequests)
  49. if err != nil {
  50. return nil, err
  51. }
  52. return hubRequests, nil
  53. }
  54. type HubTransferStatsWatcher struct {
  55. Name string
  56. }
  57. func (w *HubTransferStatsWatcher) OnEvent(event sysevent.SysEvent) {
  58. repo := NewHubRequestRepository(DB)
  59. if event.Category == "hubTransferStats" {
  60. if hubTransferStats, ok := event.Body.(*stgmod.BodyHubTransferStats); ok {
  61. hubRequest := &HubRequest{
  62. SourceType: "hub",
  63. SourceID: hubTransferStats.SourceHubID,
  64. TargetType: "hub",
  65. TargetID: hubTransferStats.TargetHubID,
  66. DataTransferCount: hubTransferStats.Send.TotalTransfer,
  67. RequestCount: hubTransferStats.Send.RequestCount,
  68. FailedRequestCount: hubTransferStats.Send.FailedRequestCount,
  69. AvgTransferCount: hubTransferStats.Send.AvgTransfer,
  70. MaxTransferCount: hubTransferStats.Send.MaxTransfer,
  71. MinTransferCount: hubTransferStats.Send.MinTransfer,
  72. StartTimestamp: hubTransferStats.StartTimestamp,
  73. EndTimestamp: hubTransferStats.EndTimestamp,
  74. }
  75. err := repo.CreateHubRequest(hubRequest)
  76. if err != nil {
  77. log.Printf("Error update hubrequest: %v", err)
  78. }
  79. } else {
  80. fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body)
  81. }
  82. } else {
  83. fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category)
  84. }
  85. }
  86. type HubStorageTransferStatsWatcher struct {
  87. Name string
  88. }
  89. func (w *HubStorageTransferStatsWatcher) OnEvent(event sysevent.SysEvent) {
  90. repo := NewHubRequestRepository(DB)
  91. if event.Category == "hubStorageTransferStats" {
  92. if hubStorageTransferStats, ok := event.Body.(*stgmod.BodyHubStorageTransferStats); ok {
  93. hubRequestSend := &HubRequest{
  94. SourceType: "hub",
  95. SourceID: hubStorageTransferStats.HubID,
  96. TargetType: "storage",
  97. TargetID: cdssdk.HubID(hubStorageTransferStats.StorageID),
  98. DataTransferCount: hubStorageTransferStats.Send.TotalTransfer,
  99. RequestCount: hubStorageTransferStats.Send.RequestCount,
  100. FailedRequestCount: hubStorageTransferStats.Send.FailedRequestCount,
  101. AvgTransferCount: hubStorageTransferStats.Send.AvgTransfer,
  102. MaxTransferCount: hubStorageTransferStats.Send.MaxTransfer,
  103. MinTransferCount: hubStorageTransferStats.Send.MinTransfer,
  104. StartTimestamp: hubStorageTransferStats.StartTimestamp,
  105. EndTimestamp: hubStorageTransferStats.EndTimestamp,
  106. }
  107. err := repo.CreateHubRequest(hubRequestSend)
  108. if err != nil {
  109. log.Printf("Error update hubrequest: %v", err)
  110. }
  111. hubRequestReceive := &HubRequest{
  112. SourceType: "storage",
  113. SourceID: cdssdk.HubID(hubStorageTransferStats.StorageID),
  114. TargetType: "hub",
  115. TargetID: hubStorageTransferStats.HubID,
  116. DataTransferCount: hubStorageTransferStats.Receive.TotalTransfer,
  117. RequestCount: hubStorageTransferStats.Receive.RequestCount,
  118. FailedRequestCount: hubStorageTransferStats.Receive.FailedRequestCount,
  119. AvgTransferCount: hubStorageTransferStats.Receive.AvgTransfer,
  120. MaxTransferCount: hubStorageTransferStats.Receive.MaxTransfer,
  121. MinTransferCount: hubStorageTransferStats.Receive.MinTransfer,
  122. StartTimestamp: hubStorageTransferStats.StartTimestamp,
  123. EndTimestamp: hubStorageTransferStats.EndTimestamp,
  124. }
  125. err = repo.CreateHubRequest(hubRequestReceive)
  126. if err != nil {
  127. log.Printf("Error update hubrequest: %v", err)
  128. }
  129. } else {
  130. fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body)
  131. }
  132. } else {
  133. fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category)
  134. }
  135. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。