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
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
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
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
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
10 months ago
10 months ago
10 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
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
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/jcs-pub/client/types"
  8. cortypes "gitlink.org.cn/cloudream/jcs-pub/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. }

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