feat(frontend): add Helm chart browser, monitoring, chart-references and values templates pages
Add new frontend pages for the multi-tenant OCDP platform: - Charts page (/charts): Browse Harbor OCI registries to list Helm chart repositories and versions, with deploy modal to launch charts on selected clusters - Monitoring page (/monitoring): Display cluster metrics (CPU/Memory/GPU usage) and per-node details with resource utilization bars - Chart References page (/chart-references): CRUD for chart metadata references - Values Templates page (/templates): CRUD for Helm values templates with version history and rollback support - Sidebar: Add Charts navigation, update Storage and Templates links - api.ts: Add all API client functions (clusterApi, registryApi, instanceApi, monitoringApi, storageApi, chartReferenceApi, valuesTemplateApi, workspaceApi, userApi) with full TypeScript types Note: deploy flow and values template rollback not yet end-to-end tested.
This commit is contained in:
@ -127,6 +127,69 @@ func (f *AdapterFactory) CreateEntryClient() repository.InstanceEntryClient {
|
||||
return k8s.NewEntryClient()
|
||||
}
|
||||
|
||||
// CreateWorkspaceRepository 创建 Workspace 仓储
|
||||
func (f *AdapterFactory) CreateWorkspaceRepository() (repository.WorkspaceRepository, error) {
|
||||
if f.mode == ModeMock {
|
||||
return nil, fmt.Errorf("workspace repository mock not implemented")
|
||||
}
|
||||
|
||||
// 默认:真实实现(PostgreSQL)
|
||||
if err := f.ensureDBConnection(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return postgres.NewWorkspaceRepository(f.db), nil
|
||||
}
|
||||
|
||||
// CreateQuotaRepository 创建 Quota 仓储
|
||||
// CreateStorageRepository 创建存储后端仓储
|
||||
func (f *AdapterFactory) CreateStorageRepository() (repository.StorageRepository, error) {
|
||||
if f.mode == ModeMock {
|
||||
return mock.NewStorageRepositoryMock(), nil
|
||||
}
|
||||
|
||||
if err := f.ensureDBConnection(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return postgres.NewStorageRepository(f.db), nil
|
||||
}
|
||||
|
||||
// CreateQuotaRepository 创建配额仓储
|
||||
func (f *AdapterFactory) CreateQuotaRepository() (repository.QuotaRepository, error) {
|
||||
if f.mode == ModeMock {
|
||||
return nil, fmt.Errorf("quota repository mock not implemented")
|
||||
}
|
||||
|
||||
// 默认:真实实现(PostgreSQL)
|
||||
if err := f.ensureDBConnection(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return postgres.NewQuotaRepository(f.db), nil
|
||||
}
|
||||
|
||||
// CreateChartReferenceRepository 创建 Chart 引用仓储
|
||||
func (f *AdapterFactory) CreateChartReferenceRepository() (repository.ChartReferenceRepository, error) {
|
||||
if f.mode == ModeMock {
|
||||
return nil, fmt.Errorf("chart reference repository mock not implemented")
|
||||
}
|
||||
|
||||
if err := f.ensureDBConnection(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return postgres.NewChartReferenceRepository(f.db), nil
|
||||
}
|
||||
|
||||
// CreateValuesTemplateRepository 创建 Values 模板仓储
|
||||
func (f *AdapterFactory) CreateValuesTemplateRepository() (repository.ValuesTemplateRepository, error) {
|
||||
if f.mode == ModeMock {
|
||||
return nil, fmt.Errorf("values template repository mock not implemented")
|
||||
}
|
||||
|
||||
if err := f.ensureDBConnection(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return postgres.NewValuesTemplateRepository(f.db), nil
|
||||
}
|
||||
|
||||
// CreateAllRepositories 一次性创建所有 Repositories
|
||||
func (f *AdapterFactory) CreateAllRepositories() (*Repositories, error) {
|
||||
userRepo, err := f.CreateUserRepository()
|
||||
@ -149,6 +212,21 @@ func (f *AdapterFactory) CreateAllRepositories() (*Repositories, error) {
|
||||
return nil, fmt.Errorf("failed to create instance repository: %w", err)
|
||||
}
|
||||
|
||||
workspaceRepo, err := f.CreateWorkspaceRepository()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create workspace repository: %w", err)
|
||||
}
|
||||
|
||||
storageRepo, err := f.CreateStorageRepository()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create storage repository: %w", err)
|
||||
}
|
||||
|
||||
quotaRepo, err := f.CreateQuotaRepository()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create quota repository: %w", err)
|
||||
}
|
||||
|
||||
ociClient, err := f.CreateOCIClient()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create OCI client: %w", err)
|
||||
@ -163,28 +241,48 @@ func (f *AdapterFactory) CreateAllRepositories() (*Repositories, error) {
|
||||
metricsClient := f.CreateMetricsClient(clusterRepo)
|
||||
entryClient := f.CreateEntryClient()
|
||||
|
||||
chartRefRepo, err := f.CreateChartReferenceRepository()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create chart reference repository: %w", err)
|
||||
}
|
||||
|
||||
valuesTemplateRepo, err := f.CreateValuesTemplateRepository()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create values template repository: %w", err)
|
||||
}
|
||||
|
||||
return &Repositories{
|
||||
UserRepo: userRepo,
|
||||
ClusterRepo: clusterRepo,
|
||||
RegistryRepo: registryRepo,
|
||||
InstanceRepo: instanceRepo,
|
||||
OCIClient: ociClient,
|
||||
HelmClient: helmClient,
|
||||
MetricsClient: metricsClient,
|
||||
EntryClient: entryClient,
|
||||
UserRepo: userRepo,
|
||||
ClusterRepo: clusterRepo,
|
||||
RegistryRepo: registryRepo,
|
||||
InstanceRepo: instanceRepo,
|
||||
WorkspaceRepo: workspaceRepo,
|
||||
StorageRepo: storageRepo,
|
||||
ChartRefRepo: chartRefRepo,
|
||||
ValuesTemplateRepo: valuesTemplateRepo,
|
||||
QuotaRepo: quotaRepo,
|
||||
OCIClient: ociClient,
|
||||
HelmClient: helmClient,
|
||||
MetricsClient: metricsClient,
|
||||
EntryClient: entryClient,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Repositories 所有仓储的集合
|
||||
type Repositories struct {
|
||||
UserRepo repository.UserRepository
|
||||
ClusterRepo repository.ClusterRepository
|
||||
RegistryRepo repository.RegistryRepository
|
||||
InstanceRepo repository.InstanceRepository
|
||||
OCIClient repository.OCIClient
|
||||
HelmClient repository.HelmClient
|
||||
MetricsClient repository.MetricsClient
|
||||
EntryClient repository.InstanceEntryClient
|
||||
UserRepo repository.UserRepository
|
||||
ClusterRepo repository.ClusterRepository
|
||||
RegistryRepo repository.RegistryRepository
|
||||
InstanceRepo repository.InstanceRepository
|
||||
WorkspaceRepo repository.WorkspaceRepository
|
||||
StorageRepo repository.StorageRepository
|
||||
ChartRefRepo repository.ChartReferenceRepository
|
||||
ValuesTemplateRepo repository.ValuesTemplateRepository
|
||||
QuotaRepo repository.QuotaRepository
|
||||
OCIClient repository.OCIClient
|
||||
HelmClient repository.HelmClient
|
||||
MetricsClient repository.MetricsClient
|
||||
EntryClient repository.InstanceEntryClient
|
||||
}
|
||||
|
||||
// ensureDBConnection 确保数据库连接已建立
|
||||
|
||||
Reference in New Issue
Block a user