- Instance deployment: charts browser, deploy modal, instances list - Values Template version management (create/history/rollback) - Storage layered config (cluster > workspace > shared priority) - Cluster credential decryptIfNeeded for mixed encrypted/plaintext kubeconfig - YAML syntax validation (client-side + server-side warning) - Frontend: charts, instances, storage, templates, admin pages - Backend: storage service, instance service, cluster service, helm client - Multi-Tenant Kubeconfig.md: added by user
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package entity
|
||
|
||
import (
|
||
"encoding/json"
|
||
"time"
|
||
)
|
||
|
||
// StorageType 存储类型
|
||
type StorageType string
|
||
|
||
const (
|
||
StorageTypeNFS StorageType = "nfs"
|
||
StorageTypePV StorageType = "pv"
|
||
StorageTypeHostPath StorageType = "hostPath"
|
||
)
|
||
|
||
// StorageConfig 存储配置
|
||
type StorageConfig struct {
|
||
NFS *NFSConfig `json:"nfs,omitempty"`
|
||
PV *PVConfig `json:"pv,omitempty"`
|
||
HostPath *HostPathConfig `json:"hostPath,omitempty"`
|
||
}
|
||
|
||
// NFSConfig NFS 配置
|
||
type NFSConfig struct {
|
||
Server string `json:"server"`
|
||
Path string `json:"path"`
|
||
}
|
||
|
||
// PVConfig PV 配置
|
||
type PVConfig struct {
|
||
StorageClassName string `json:"storageClassName"`
|
||
Capacity string `json:"capacity"`
|
||
AccessModes []string `json:"accessModes"`
|
||
}
|
||
|
||
// HostPathConfig HostPath 配置
|
||
type HostPathConfig struct {
|
||
Path string `json:"path"`
|
||
}
|
||
|
||
// StorageBackend 存储后端实体
|
||
type StorageBackend struct {
|
||
ID string
|
||
WorkspaceID string
|
||
ClusterID string // 关联的 cluster,NULL 表示 workspace/shared 级别
|
||
OwnerID string
|
||
Name string
|
||
Type StorageType
|
||
Config StorageConfig
|
||
Description string
|
||
IsDefault bool
|
||
IsShared bool
|
||
CreatedAt time.Time
|
||
UpdatedAt time.Time
|
||
}
|
||
|
||
// NewStorageBackend 创建新存储后端
|
||
func NewStorageBackend(workspaceID, ownerID, name string, storageType StorageType, config StorageConfig) *StorageBackend {
|
||
now := time.Now()
|
||
return &StorageBackend{
|
||
WorkspaceID: workspaceID,
|
||
OwnerID: ownerID,
|
||
Name: name,
|
||
Type: storageType,
|
||
Config: config,
|
||
IsDefault: false,
|
||
IsShared: false,
|
||
CreatedAt: now,
|
||
UpdatedAt: now,
|
||
}
|
||
}
|
||
|
||
// NewClusterStorageBackend 创建 cluster 级别的存储后端
|
||
func NewClusterStorageBackend(workspaceID, clusterID, ownerID, name string, storageType StorageType, config StorageConfig) *StorageBackend {
|
||
storage := NewStorageBackend(workspaceID, ownerID, name, storageType, config)
|
||
storage.ClusterID = clusterID
|
||
return storage
|
||
}
|
||
|
||
// Validate 验证存储后端数据
|
||
func (s *StorageBackend) Validate() error {
|
||
if s.Name == "" {
|
||
return ErrInvalidStorageName
|
||
}
|
||
if s.Type == "" {
|
||
return ErrInvalidStorageName
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ConfigJSON 将配置转为 JSON 字符串
|
||
func (s *StorageBackend) ConfigJSON() (string, error) {
|
||
data, err := json.Marshal(s.Config)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return string(data), nil
|
||
}
|
||
|
||
// ParseConfigJSON 从 JSON 解析配置
|
||
func ParseConfigJSON(jsonStr string) (*StorageConfig, error) {
|
||
var config StorageConfig
|
||
err := json.Unmarshal([]byte(jsonStr), &config)
|
||
return &config, err
|
||
} |