diff --git a/sdks/storage/models.go b/sdks/storage/models.go index 3090d9f..0b071ba 100644 --- a/sdks/storage/models.go +++ b/sdks/storage/models.go @@ -227,9 +227,9 @@ func (n Node) String() string { } type PinnedObject struct { - ObjectID ObjectID `db:"ObjectID" json:"objectID"` - NodeID NodeID `db:"NodeID" json:"nodeID"` - CreateTime time.Time `db:"CreateTime" json:"createTime"` + ObjectID ObjectID `gorm:"column:ObjectID; primaryKey" json:"objectID"` + StorageID StorageID `gorm:"column:StorageID; primaryKey" json:"storageID"` + CreateTime time.Time `gorm:"column:CreateTime" json:"createTime"` } type Bucket struct { @@ -271,44 +271,3 @@ type CodeError struct { func (e *CodeError) Error() string { return fmt.Sprintf("code: %s, message: %s", e.Code, e.Message) } - -type StorageAddress interface { - GetType() string - // 输出调试用的字符串,不要包含敏感信息 - String() string -} - -type Feature interface { - GetType() string -} - -type Storage struct { - StorageID StorageID `json:"storageID" gorm:"column:StorageID; primaryKey; autoIncrement;"` - Name string `json:"name" gorm:"column:Name; not null"` - // 存储服务的地址,包含鉴权所需数据 - Address StorageAddress `json:"address" gorm:"column:Address; type:json; not null; serializer:union"` - // 存储服务拥有的特别功能 - Features []Feature `json:"features" gorm:"column:Features; type:json; serializer:union"` -} - -type ShardStoreConfig interface { - GetType() string -} - -type ShardStorage struct { - StorageID StorageID `json:"storageID" gorm:"column:StorageID; primaryKey"` - // 完全管理此存储服务的Hub的ID - MasterHub NodeID `json:"masterHub" gorm:"column:MasterHub; not null"` - // Shard存储空间在存储服务的目录 - Root string `json:"root" gorm:"column:Root; not null"` - // ShardStore配置数据 - Config ShardStoreConfig `json:"config" gorm:"column:Config; type:json; not null; serializer:union"` -} - -type SharedStorage struct { - StorageID StorageID `json:"storageID" gorm:"column:StorageID; primaryKey"` - // 调度文件时保存文件的根路径 - LoadBase string `json:"loadBase" gorm:"column:LoadBase; not null"` - // 回源数据时数据存放位置的根路径 - DataReturnBase string `json:"dataReturnBase" gorm:"column:DataReturnBase; not null"` -} diff --git a/sdks/storage/shard_storage.go b/sdks/storage/shard_storage.go new file mode 100644 index 0000000..e2327de --- /dev/null +++ b/sdks/storage/shard_storage.go @@ -0,0 +1,43 @@ +package cdssdk + +import ( + "fmt" + + "gitlink.org.cn/cloudream/common/pkgs/types" + "gitlink.org.cn/cloudream/common/utils/serder" +) + +// 分片存储服务的配置数据 +type ShardStoreConfig interface { + GetType() string + // 输出调试用的字符串,不要包含敏感信息 + String() string +} + +var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[ShardStoreConfig]( + (*LocalShardStorage)(nil), +)), "type") + +type ShardStorage struct { + StorageID StorageID `json:"storageID" gorm:"column:StorageID; primaryKey"` + // 完全管理此存储服务的Hub的ID + MasterHub NodeID `json:"masterHub" gorm:"column:MasterHub; not null"` + // Shard存储空间在存储服务的目录 + Root string `json:"root" gorm:"column:Root; not null"` + // ShardStore配置数据 + Config ShardStoreConfig `json:"config" gorm:"column:Config; type:json; not null; serializer:union"` +} + +type LocalShardStorage struct { + serder.Metadata `union:"Local"` + Root string `json:"root"` + MaxSize int64 `json:"maxSize"` +} + +func (s *LocalShardStorage) GetType() string { + return "Local" +} + +func (s *LocalShardStorage) String() string { + return fmt.Sprintf("Local[root=%s, maxSize=%d]", s.Root, s.MaxSize) +} diff --git a/sdks/storage/storage.go b/sdks/storage/storage.go new file mode 100644 index 0000000..8a29944 --- /dev/null +++ b/sdks/storage/storage.go @@ -0,0 +1,47 @@ +package cdssdk + +import ( + "gitlink.org.cn/cloudream/common/pkgs/types" + "gitlink.org.cn/cloudream/common/utils/serder" +) + +// 存储服务地址 +type StorageAddress interface { + GetType() string + // 输出调试用的字符串,不要包含敏感信息 + String() string +} + +var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[StorageAddress]( + (*LocalStorageAddress)(nil), +)), "type") + +type LocalStorageAddress struct { + serder.Metadata `union:"Local"` +} + +func (a *LocalStorageAddress) GetType() string { + return "Local" +} + +func (a *LocalStorageAddress) String() string { + return "Local" +} + +type Storage struct { + StorageID StorageID `json:"storageID" gorm:"column:StorageID; primaryKey; autoIncrement;"` + Name string `json:"name" gorm:"column:Name; not null"` + // 存储服务的地址,包含鉴权所需数据 + Address StorageAddress `json:"address" gorm:"column:Address; type:json; not null; serializer:union"` + // 存储服务拥有的特别功能 + Features []StorageFeature `json:"features" gorm:"column:Features; type:json; serializer:union"` +} + +// 共享存储服务的配置数据 +type SharedStorage struct { + StorageID StorageID `json:"storageID" gorm:"column:StorageID; primaryKey"` + // 调度文件时保存文件的根路径 + LoadBase string `json:"loadBase" gorm:"column:LoadBase; not null"` + // 回源数据时数据存放位置的根路径 + DataReturnBase string `json:"dataReturnBase" gorm:"column:DataReturnBase; not null"` +} diff --git a/sdks/storage/storage_feature.go b/sdks/storage/storage_feature.go new file mode 100644 index 0000000..b5787df --- /dev/null +++ b/sdks/storage/storage_feature.go @@ -0,0 +1,46 @@ +package cdssdk + +import ( + "gitlink.org.cn/cloudream/common/pkgs/types" + "gitlink.org.cn/cloudream/common/utils/serder" +) + +// 存储服务特性 +type StorageFeature interface { + GetType() string + // 输出调试用的字符串,不要包含敏感信息 + String() string +} + +var _ = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTypeUnion[StorageFeature]( + (*BypassUploadFeature)(nil), + (*MultipartUploadFeature)(nil), +)), "type") + +// 存储服务支持被非MasterHub直接上传文件 +type BypassUploadFeature struct { + serder.Metadata `union:"BypassUpload"` + // 存放上传文件的临时目录 + TempRoot string `json:"tempRoot"` +} + +func (f *BypassUploadFeature) GetType() string { + return "BypassUpload" +} + +func (f *BypassUploadFeature) String() string { + return "BypassUpload" +} + +// 存储服务支持分段上传 +type MultipartUploadFeature struct { + serder.Metadata `union:"MultipartUpload"` +} + +func (f *MultipartUploadFeature) GetType() string { + return "MultipartUpload" +} + +func (f *MultipartUploadFeature) String() string { + return "MultipartUpload" +}