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

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