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.

models.go 6.0 kB

1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package cdssdk
  2. import (
  3. "database/sql/driver"
  4. "fmt"
  5. "time"
  6. "gitlink.org.cn/cloudream/common/pkgs/types"
  7. "gitlink.org.cn/cloudream/common/utils/serder"
  8. )
  9. const (
  10. ObjectPathSeparator = "/"
  11. )
  12. type NodeID int64
  13. type PackageID int64
  14. type ObjectID int64
  15. type UserID int64
  16. type BucketID int64
  17. type StorageID int64
  18. type LocationID int64
  19. /// TODO 将分散在各处的公共结构体定义集中到这里来
  20. type Redundancy interface {
  21. driver.Valuer
  22. }
  23. var RedundancyUnion = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[Redundancy](
  24. (*NoneRedundancy)(nil),
  25. (*RepRedundancy)(nil),
  26. (*ECRedundancy)(nil),
  27. (*LRCRedundancy)(nil),
  28. )), "type")
  29. type NoneRedundancy struct {
  30. serder.Metadata `union:"none"`
  31. Type string `json:"type"`
  32. }
  33. func NewNoneRedundancy() *NoneRedundancy {
  34. return &NoneRedundancy{
  35. Type: "none",
  36. }
  37. }
  38. func (b *NoneRedundancy) Value() (driver.Value, error) {
  39. return serder.ObjectToJSONEx[Redundancy](b)
  40. }
  41. var DefaultRepRedundancy = *NewRepRedundancy(2)
  42. type RepRedundancy struct {
  43. serder.Metadata `union:"rep"`
  44. Type string `json:"type"`
  45. RepCount int `json:"repCount"`
  46. }
  47. func NewRepRedundancy(repCount int) *RepRedundancy {
  48. return &RepRedundancy{
  49. Type: "rep",
  50. RepCount: repCount,
  51. }
  52. }
  53. func (b *RepRedundancy) Value() (driver.Value, error) {
  54. return serder.ObjectToJSONEx[Redundancy](b)
  55. }
  56. var DefaultECRedundancy = *NewECRedundancy(2, 3, 1024*1024*5)
  57. type ECRedundancy struct {
  58. serder.Metadata `union:"ec"`
  59. Type string `json:"type"`
  60. K int `json:"k"`
  61. N int `json:"n"`
  62. ChunkSize int `json:"chunkSize"`
  63. }
  64. func NewECRedundancy(k int, n int, chunkSize int) *ECRedundancy {
  65. return &ECRedundancy{
  66. Type: "ec",
  67. K: k,
  68. N: n,
  69. ChunkSize: chunkSize,
  70. }
  71. }
  72. func (b *ECRedundancy) Value() (driver.Value, error) {
  73. return serder.ObjectToJSONEx[Redundancy](b)
  74. }
  75. var DefaultLRCRedundancy = *NewLRCRedundancy(3, 2, []int{2}, 1024*1024*5)
  76. type LRCRedundancy struct {
  77. serder.Metadata `union:"lrc"`
  78. Type string `json:"type"`
  79. K int `json:"k"`
  80. N int `json:"n"`
  81. Groups []int `json:"groups"`
  82. ChunkSize int `json:"chunkSize"`
  83. }
  84. func NewLRCRedundancy(k int, n int, groups []int, chunkSize int) *LRCRedundancy {
  85. return &LRCRedundancy{
  86. Type: "lrc",
  87. K: k,
  88. N: n,
  89. Groups: groups,
  90. ChunkSize: chunkSize,
  91. }
  92. }
  93. func (b *LRCRedundancy) Value() (driver.Value, error) {
  94. return serder.ObjectToJSONEx[Redundancy](b)
  95. }
  96. // 判断指定块属于哪个组。如果都不属于,则返回-1。
  97. func (b *LRCRedundancy) FindGroup(idx int) int {
  98. for i, group := range b.Groups {
  99. if idx < group {
  100. return i
  101. }
  102. idx -= group
  103. }
  104. return -1
  105. }
  106. const (
  107. PackageStateNormal = "Normal"
  108. PackageStateDeleted = "Deleted"
  109. )
  110. type Package struct {
  111. PackageID PackageID `db:"PackageID" json:"packageID"`
  112. Name string `db:"Name" json:"name"`
  113. BucketID BucketID `db:"BucketID" json:"bucketID"`
  114. State string `db:"State" json:"state"`
  115. }
  116. type Object struct {
  117. ObjectID ObjectID `db:"ObjectID" json:"objectID"`
  118. PackageID PackageID `db:"PackageID" json:"packageID"`
  119. Path string `db:"Path" json:"path"`
  120. Size int64 `db:"Size" json:"size,string"`
  121. FileHash string `db:"FileHash" json:"fileHash"`
  122. Redundancy Redundancy `db:"Redundancy" json:"redundancy"`
  123. CreateTime time.Time `db:"CreateTime" json:"createTime"`
  124. UpdateTime time.Time `db:"UpdateTime" json:"updateTime"`
  125. }
  126. type Node struct {
  127. NodeID NodeID `db:"NodeID" json:"nodeID"`
  128. Name string `db:"Name" json:"name"`
  129. LocalIP string `db:"LocalIP" json:"localIP"`
  130. ExternalIP string `db:"ExternalIP" json:"externalIP"`
  131. LocalGRPCPort int `db:"LocalGRPCPort" json:"localGRPCPort"`
  132. ExternalGRPCPort int `db:"ExternalGRPCPort" json:"externalGRPCPort"`
  133. LocationID LocationID `db:"LocationID" json:"locationID"`
  134. State string `db:"State" json:"state"`
  135. LastReportTime *time.Time `db:"LastReportTime" json:"lastReportTime"`
  136. }
  137. func (n Node) String() string {
  138. return fmt.Sprintf("%v(%v)", n.Name, n.NodeID)
  139. }
  140. type PinnedObject struct {
  141. ObjectID ObjectID `db:"ObjectID" json:"objectID"`
  142. NodeID NodeID `db:"NodeID" json:"nodeID"`
  143. CreateTime time.Time `db:"CreateTime" json:"createTime"`
  144. }
  145. type Bucket struct {
  146. BucketID BucketID `db:"BucketID" json:"bucketID"`
  147. Name string `db:"Name" json:"name"`
  148. CreatorID UserID `db:"CreatorID" json:"creatorID"`
  149. }
  150. type NodeConnectivity struct {
  151. FromNodeID NodeID `db:"FromNodeID" json:"fromNodeID"`
  152. ToNodeID NodeID `db:"ToNodeID" json:"ToNodeID"`
  153. Delay *float32 `db:"Delay" json:"delay"`
  154. TestTime time.Time `db:"TestTime" json:"testTime"`
  155. }
  156. type Storage struct {
  157. StorageID StorageID `db:"StorageID" json:"storageID"`
  158. Name string `db:"Name" json:"name"`
  159. NodeID NodeID `db:"NodeID" json:"nodeID"`
  160. LocalBase string `db:"LocalBase" json:"localBase"` // 存储服务挂载在代理节点的目录
  161. RemoteBase string `db:"RemoteBase" json:"remoteBase"` // 挂载在本地的目录对应存储服务的哪个路径
  162. State string `db:"State" json:"state"`
  163. }
  164. type NodePackageCachingInfo struct {
  165. NodeID NodeID `json:"nodeID"`
  166. FileSize int64 `json:"fileSize"`
  167. ObjectCount int64 `json:"objectCount"`
  168. }
  169. type PackageCachingInfo struct {
  170. NodeInfos []NodePackageCachingInfo `json:"nodeInfos"`
  171. PackageSize int64 `json:"packageSize"`
  172. }
  173. func NewPackageCachingInfo(nodeInfos []NodePackageCachingInfo, packageSize int64) PackageCachingInfo {
  174. return PackageCachingInfo{
  175. NodeInfos: nodeInfos,
  176. PackageSize: packageSize,
  177. }
  178. }
  179. type CodeError struct {
  180. Code string `json:"code"`
  181. Message string `json:"message"`
  182. }
  183. func (e *CodeError) Error() string {
  184. return fmt.Sprintf("code: %s, message: %s", e.Code, e.Message)
  185. }