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.

datamap.go 14 kB

7 months ago
10 months ago
7 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
7 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
10 months ago
10 months ago
7 months ago
7 months ago
10 months ago
10 months ago
10 months ago
7 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
7 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
10 months ago
7 months ago
10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. package datamap
  2. import (
  3. "fmt"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/types"
  6. "gitlink.org.cn/cloudream/common/utils/serder"
  7. clitypes "gitlink.org.cn/cloudream/storage2/client/types"
  8. cortypes "gitlink.org.cn/cloudream/storage2/coordinator/types"
  9. )
  10. // 系统事件
  11. type SysEvent struct {
  12. Timestamp time.Time `json:"timestamp"`
  13. Source SysEventSource `json:"source"`
  14. Body SysEventBody `json:"body"`
  15. }
  16. func (e *SysEvent) String() string {
  17. return fmt.Sprintf("%v [%v] %+v", e.Timestamp.Format("2006-01-02 15:04:05"), e.Source, e.Body)
  18. }
  19. // 事件源
  20. type SysEventSource interface {
  21. GetSourceType() string
  22. }
  23. var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[SysEventSource](
  24. (*SourceCoordinator)(nil),
  25. (*SourceScanner)(nil),
  26. (*SourceHub)(nil),
  27. )), "type")
  28. type SourceCoordinator struct {
  29. serder.Metadata `union:"Coordinator"`
  30. Type string `json:"type"`
  31. }
  32. func (s *SourceCoordinator) GetSourceType() string {
  33. return "Coordinator"
  34. }
  35. func (s *SourceCoordinator) OnUnionSerializing() {
  36. s.Type = s.GetSourceType()
  37. }
  38. func (s *SourceCoordinator) String() string {
  39. return "Coordinator"
  40. }
  41. type SourceScanner struct {
  42. serder.Metadata `union:"Scanner"`
  43. Type string `json:"type"`
  44. }
  45. func (s *SourceScanner) GetSourceType() string {
  46. return "Scanner"
  47. }
  48. func (s *SourceScanner) OnUnionSerializing() {
  49. s.Type = s.GetSourceType()
  50. }
  51. func (s *SourceScanner) String() string {
  52. return "Scanner"
  53. }
  54. type SourceHub struct {
  55. serder.Metadata `union:"Hub"`
  56. Type string `json:"type"`
  57. HubID cortypes.HubID `json:"hubID"`
  58. HubName string `json:"hubName"`
  59. }
  60. func (s *SourceHub) GetSourceType() string {
  61. return "Hub"
  62. }
  63. func (s *SourceHub) OnUnionSerializing() {
  64. s.Type = s.GetSourceType()
  65. }
  66. func (s *SourceHub) String() string {
  67. return fmt.Sprintf("Hub(%d, %s)", s.HubID, s.HubName)
  68. }
  69. // 事件体
  70. type SysEventBody interface {
  71. GetBodyType() string
  72. }
  73. var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[SysEventBody](
  74. (*BodyNewHub)(nil),
  75. (*BodyHubUpdated)(nil),
  76. (*BodyHubDeleted)(nil),
  77. (*BodyNewStorage)(nil),
  78. (*BodyStorageUpdated)(nil),
  79. (*BodyStorageDeleted)(nil),
  80. (*BodyStorageStats)(nil),
  81. (*BodyHubTransferStats)(nil),
  82. (*BodyHubStorageTransferStats)(nil),
  83. (*BodyBlockTransfer)(nil),
  84. (*BodyBlockDistribution)(nil),
  85. (*BodyNewOrUpdateObject)(nil),
  86. (*BodyObjectInfoUpdated)(nil),
  87. (*BodyObjectDeleted)(nil),
  88. (*BodyNewPackage)(nil),
  89. (*BodyPackageCloned)(nil),
  90. (*BodyPackageDeleted)(nil),
  91. (*BodyNewBucket)(nil),
  92. (*BodyBucketDeleted)(nil),
  93. )), "type")
  94. // 新增Hub的事件
  95. type BodyNewHub struct {
  96. serder.Metadata `union:"NewHub"`
  97. Type string `json:"type"`
  98. Info cortypes.Hub `json:"info"`
  99. }
  100. func (b *BodyNewHub) GetBodyType() string {
  101. return "NewHub"
  102. }
  103. func (b *BodyNewHub) OnUnionSerializing() {
  104. b.Type = b.GetBodyType()
  105. }
  106. // Hub信息更新的事件
  107. type BodyHubUpdated struct {
  108. serder.Metadata `union:"HubUpdated"`
  109. Type string `json:"type"`
  110. Info cortypes.Hub `json:"info"`
  111. }
  112. func (b *BodyHubUpdated) GetBodyType() string {
  113. return "HubUpdated"
  114. }
  115. func (b *BodyHubUpdated) OnUnionSerializing() {
  116. b.Type = b.GetBodyType()
  117. }
  118. // Hub删除的事件
  119. type BodyHubDeleted struct {
  120. serder.Metadata `union:"HubDeleted"`
  121. Type string `json:"type"`
  122. HubID cortypes.HubID `json:"hubID"`
  123. }
  124. func (b *BodyHubDeleted) GetBodyType() string {
  125. return "HubDeleted"
  126. }
  127. func (b *BodyHubDeleted) OnUnionSerializing() {
  128. b.Type = b.GetBodyType()
  129. }
  130. // 新增Storage的事件
  131. type BodyNewStorage struct {
  132. serder.Metadata `union:"NewStorage"`
  133. Info clitypes.Storage `json:"info"`
  134. Type string `json:"type"`
  135. }
  136. func (b *BodyNewStorage) GetBodyType() string {
  137. return "NewStorage"
  138. }
  139. func (b *BodyNewStorage) OnUnionSerializing() {
  140. b.Type = b.GetBodyType()
  141. }
  142. // Storage信息更新的事件
  143. type BodyStorageUpdated struct {
  144. serder.Metadata `union:"StorageUpdated"`
  145. Type string `json:"type"`
  146. Info clitypes.Storage `json:"info"`
  147. }
  148. func (b *BodyStorageUpdated) GetBodyType() string {
  149. return "StorageUpdated"
  150. }
  151. func (b *BodyStorageUpdated) OnUnionSerializing() {
  152. b.Type = b.GetBodyType()
  153. }
  154. // Storage删除的事件
  155. type BodyStorageDeleted struct {
  156. serder.Metadata `union:"StorageDeleted"`
  157. Type string `json:"type"`
  158. StorageID clitypes.StorageID `json:"storageID"`
  159. }
  160. func (b *BodyStorageDeleted) GetBodyType() string {
  161. return "StorageDeleted"
  162. }
  163. func (b *BodyStorageDeleted) OnUnionSerializing() {
  164. b.Type = b.GetBodyType()
  165. }
  166. // Storage统计信息的事件
  167. type BodyStorageStats struct {
  168. serder.Metadata `union:"StorageStats"`
  169. Type string `json:"type"`
  170. StorageID clitypes.StorageID `json:"storageID"`
  171. DataCount int64 `json:"dataCount"`
  172. }
  173. func (b *BodyStorageStats) GetBodyType() string {
  174. return "StorageStats"
  175. }
  176. func (b *BodyStorageStats) OnUnionSerializing() {
  177. b.Type = b.GetBodyType()
  178. }
  179. // Hub数据传输统计信息的事件
  180. type BodyHubTransferStats struct {
  181. serder.Metadata `union:"HubTransferStats"`
  182. Type string `json:"type"`
  183. SourceHubID cortypes.HubID `json:"sourceHubID"`
  184. TargetHubID cortypes.HubID `json:"targetHubID"`
  185. Send DataTrans `json:"send"`
  186. StartTimestamp time.Time `json:"startTimestamp"`
  187. EndTimestamp time.Time `json:"endTimestamp"`
  188. }
  189. func (b *BodyHubTransferStats) GetBodyType() string {
  190. return "HubTransferStats"
  191. }
  192. func (b *BodyHubTransferStats) OnUnionSerializing() {
  193. b.Type = b.GetBodyType()
  194. }
  195. type DataTrans struct {
  196. TotalTransfer int64 `json:"totalTransfer"`
  197. RequestCount int64 `json:"requestCount"`
  198. FailedRequestCount int64 `json:"failedRequestCount"`
  199. AvgTransfer int64 `json:"avgTransfer"`
  200. MaxTransfer int64 `json:"maxTransfer"`
  201. MinTransfer int64 `json:"minTransfer"`
  202. }
  203. // Hub和Storage数据传输统计信息的事件
  204. type BodyHubStorageTransferStats struct {
  205. serder.Metadata `union:"HubStorageTransferStats"`
  206. Type string `json:"type"`
  207. HubID cortypes.HubID `json:"hubID"`
  208. StorageID clitypes.StorageID `json:"storageID"`
  209. Send DataTrans `json:"send"`
  210. Receive DataTrans `json:"receive"`
  211. StartTimestamp time.Time `json:"startTimestamp"`
  212. EndTimestamp time.Time `json:"endTimestamp"`
  213. }
  214. func (b *BodyHubStorageTransferStats) GetBodyType() string {
  215. return "HubStorageTransferStats"
  216. }
  217. func (b *BodyHubStorageTransferStats) OnUnionSerializing() {
  218. b.Type = b.GetBodyType()
  219. }
  220. // 块传输的事件
  221. type BodyBlockTransfer struct {
  222. serder.Metadata `union:"BlockTransfer"`
  223. Type string `json:"type"`
  224. ObjectID clitypes.ObjectID `json:"objectID"`
  225. PackageID clitypes.PackageID `json:"packageID"`
  226. BlockChanges []BlockChange `json:"blockChanges"`
  227. }
  228. func (b *BodyBlockTransfer) GetBodyType() string {
  229. return "BlockTransfer"
  230. }
  231. func (b *BodyBlockTransfer) OnUnionSerializing() {
  232. b.Type = b.GetBodyType()
  233. }
  234. // 块变化类型
  235. type BlockChange interface {
  236. GetBlockChangeType() string
  237. }
  238. var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[BlockChange](
  239. (*BlockChangeClone)(nil),
  240. (*BlockChangeDeleted)(nil),
  241. (*BlockChangeEnDecode)(nil),
  242. )), "type")
  243. const (
  244. BlockTypeRaw = "Raw"
  245. BlockTypeEC = "EC"
  246. BlockTypeSegment = "Segment"
  247. )
  248. type Block struct {
  249. BlockType string `json:"blockType"`
  250. Index int `json:"index"`
  251. StorageID clitypes.StorageID `json:"storageID"`
  252. }
  253. type DataTransfer struct {
  254. SourceStorageID clitypes.StorageID `json:"sourceStorageID"`
  255. TargetStorageID clitypes.StorageID `json:"targetStorageID"`
  256. TransferBytes int64 `json:"transferBytes"`
  257. }
  258. type BlockChangeClone struct {
  259. serder.Metadata `union:"Clone"`
  260. Type string `json:"type"`
  261. BlockType string `json:"blockType"`
  262. Index int `json:"index"`
  263. SourceStorageID clitypes.StorageID `json:"sourceStorageID"`
  264. TargetStorageID clitypes.StorageID `json:"targetStorageID"`
  265. TransferBytes int64 `json:"transferBytes"`
  266. }
  267. func (b *BlockChangeClone) GetBlockChangeType() string {
  268. return "Clone"
  269. }
  270. func (b *BlockChangeClone) OnUnionSerializing() {
  271. b.Type = b.GetBlockChangeType()
  272. }
  273. type BlockChangeDeleted struct {
  274. serder.Metadata `union:"Deleted"`
  275. Type string `json:"type"`
  276. Index int `json:"index"`
  277. StorageID clitypes.StorageID `json:"storageID"`
  278. }
  279. func (b *BlockChangeDeleted) GetBlockChangeType() string {
  280. return "Deleted"
  281. }
  282. func (b *BlockChangeDeleted) OnUnionSerializing() {
  283. b.Type = b.GetBlockChangeType()
  284. }
  285. type BlockChangeEnDecode struct {
  286. serder.Metadata `union:"EnDecode"`
  287. Type string `json:"type"`
  288. SourceBlocks []Block `json:"sourceBlocks,omitempty"`
  289. TargetBlocks []Block `json:"targetBlocks,omitempty"`
  290. DataTransfers []DataTransfer `json:"dataTransfers,omitempty"`
  291. }
  292. func (b *BlockChangeEnDecode) GetBlockChangeType() string {
  293. return "EnDecode"
  294. }
  295. func (b *BlockChangeEnDecode) OnUnionSerializing() {
  296. b.Type = b.GetBlockChangeType()
  297. }
  298. // 块分布的事件
  299. type BodyBlockDistribution struct {
  300. serder.Metadata `union:"BlockDistribution"`
  301. Type string `json:"type"`
  302. ObjectID clitypes.ObjectID `json:"objectID"`
  303. PackageID clitypes.PackageID `json:"packageID"`
  304. Path string `json:"path"`
  305. Size int64 `json:"size"`
  306. FileHash clitypes.FileHash `json:"fileHash"`
  307. FaultTolerance float64 `json:"faultTolerance"`
  308. Redundancy float64 `json:"redundancy"`
  309. AvgAccessCost float64 `json:"avgAccessCost"`
  310. BlockDistribution []BlockDistributionObjectInfo `json:"blockDistribution"`
  311. DataTransfers []DataTransfer `json:"dataTransfers"`
  312. }
  313. func (b *BodyBlockDistribution) GetBodyType() string {
  314. return "BlockDistribution"
  315. }
  316. func (b *BodyBlockDistribution) OnUnionSerializing() {
  317. b.Type = b.GetBodyType()
  318. }
  319. type BlockDistributionObjectInfo struct {
  320. BlockType string `json:"type"`
  321. Index int `json:"index"`
  322. StorageID clitypes.StorageID `json:"storageID"`
  323. }
  324. // 新增或者重新上传Object的事件
  325. type BodyNewOrUpdateObject struct {
  326. serder.Metadata `union:"NewOrUpdateObject"`
  327. Type string `json:"type"`
  328. Info clitypes.Object `json:"info"`
  329. BlockDistribution []BlockDistributionObjectInfo `json:"blockDistribution"`
  330. }
  331. func (b *BodyNewOrUpdateObject) GetBodyType() string {
  332. return "NewOrUpdateObject"
  333. }
  334. func (b *BodyNewOrUpdateObject) OnUnionSerializing() {
  335. b.Type = b.GetBodyType()
  336. }
  337. // Object的基本信息更新的事件
  338. type BodyObjectInfoUpdated struct {
  339. serder.Metadata `union:"ObjectInfoUpdated"`
  340. Type string `json:"type"`
  341. Object clitypes.Object `json:"object"`
  342. }
  343. func (b *BodyObjectInfoUpdated) GetBodyType() string {
  344. return "ObjectInfoUpdated"
  345. }
  346. func (b *BodyObjectInfoUpdated) OnUnionSerializing() {
  347. b.Type = b.GetBodyType()
  348. }
  349. // Object删除的事件
  350. type BodyObjectDeleted struct {
  351. serder.Metadata `union:"ObjectDeleted"`
  352. Type string `json:"type"`
  353. ObjectID clitypes.ObjectID `json:"objectID"`
  354. }
  355. func (b *BodyObjectDeleted) GetBodyType() string {
  356. return "ObjectDeleted"
  357. }
  358. func (b *BodyObjectDeleted) OnUnionSerializing() {
  359. b.Type = b.GetBodyType()
  360. }
  361. // 新增Package的事件
  362. type BodyNewPackage struct {
  363. serder.Metadata `union:"NewPackage"`
  364. Type string `json:"type"`
  365. Info clitypes.Package `json:"info"`
  366. }
  367. func (b *BodyNewPackage) GetBodyType() string {
  368. return "NewPackage"
  369. }
  370. func (b *BodyNewPackage) OnUnionSerializing() {
  371. b.Type = b.GetBodyType()
  372. }
  373. // Package克隆的事件
  374. type BodyPackageCloned struct {
  375. serder.Metadata `union:"PackageCloned"`
  376. Type string `json:"type"`
  377. SourcePackageID clitypes.PackageID `json:"sourcePackageID"`
  378. NewPackage clitypes.Package `json:"newPackage"`
  379. SourceObjectIDs []clitypes.ObjectID `json:"sourceObjectIDs"` // 原本的ObjectID
  380. NewObjectIDs []clitypes.ObjectID `json:"newObjectIDs"` // 复制后的新ObjectID,与SourceObjectIDs一一对应
  381. }
  382. func (b *BodyPackageCloned) GetBodyType() string {
  383. return "PackageCloned"
  384. }
  385. func (b *BodyPackageCloned) OnUnionSerializing() {
  386. b.Type = b.GetBodyType()
  387. }
  388. // Package删除的事件
  389. type BodyPackageDeleted struct {
  390. serder.Metadata `union:"PackageDeleted"`
  391. Type string `json:"type"`
  392. PackageID clitypes.PackageID `json:"packageID"`
  393. }
  394. func (b *BodyPackageDeleted) GetBodyType() string {
  395. return "PackageDeleted"
  396. }
  397. func (b *BodyPackageDeleted) OnUnionSerializing() {
  398. b.Type = b.GetBodyType()
  399. }
  400. // 新增Bucket的事件
  401. type BodyNewBucket struct {
  402. serder.Metadata `union:"NewBucket"`
  403. Type string `json:"type"`
  404. Info clitypes.Bucket `json:"info"`
  405. }
  406. func (b *BodyNewBucket) GetBodyType() string {
  407. return "NewBucket"
  408. }
  409. func (b *BodyNewBucket) OnUnionSerializing() {
  410. b.Type = b.GetBodyType()
  411. }
  412. // Bucket删除的事件
  413. type BodyBucketDeleted struct {
  414. serder.Metadata `union:"BucketDeleted"`
  415. Type string `json:"type"`
  416. BucketID clitypes.BucketID `json:"bucketID"`
  417. }
  418. func (b *BodyBucketDeleted) GetBodyType() string {
  419. return "BucketDeleted"
  420. }
  421. func (b *BodyBucketDeleted) OnUnionSerializing() {
  422. b.Type = b.GetBodyType()
  423. }

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