Add type-aware backup job forms

This commit is contained in:
Mikei386
2026-06-14 12:46:11 +02:00
parent 92564a1620
commit 800cb60f83
13 changed files with 153 additions and 17 deletions
+49
View File
@@ -16,6 +16,12 @@ import (
type WorkloadManager struct{ RuntimeDir string }
type Workload struct {
ID string `json:"id"`
Name string `json:"name"`
Status string `json:"status"`
}
type Prepared struct {
Sources []string
Stopped []model.Source
@@ -23,6 +29,49 @@ type Prepared struct {
Kind model.JobType
}
func (w *WorkloadManager) Discover(ctx context.Context, kind model.JobType) ([]Workload, error) {
switch kind {
case model.JobDocker:
output, err := exec.CommandContext(ctx, "docker", "ps", "-a", "--format", "{{json .}}").Output()
if err != nil {
return nil, fmt.Errorf("environment: list Docker containers: %w", err)
}
var result []Workload
for _, line := range strings.Split(strings.TrimSpace(string(output)), "\n") {
if strings.TrimSpace(line) == "" {
continue
}
var item struct {
ID string `json:"ID"`
Names string `json:"Names"`
Status string `json:"Status"`
}
if err := json.Unmarshal([]byte(line), &item); err != nil {
return nil, fmt.Errorf("environment: decode Docker container list: %w", err)
}
result = append(result, Workload{ID: item.Names, Name: item.Names, Status: item.Status})
}
return result, nil
case model.JobVM:
output, err := exec.CommandContext(ctx, "virsh", "list", "--all", "--name").Output()
if err != nil {
return nil, fmt.Errorf("environment: list virtual machines: %w", err)
}
var result []Workload
for _, name := range strings.Split(strings.TrimSpace(string(output)), "\n") {
name = strings.TrimSpace(name)
if name == "" {
continue
}
state, _ := exec.CommandContext(ctx, "virsh", "domstate", name).Output()
result = append(result, Workload{ID: name, Name: name, Status: strings.TrimSpace(string(state))})
}
return result, nil
default:
return nil, fmt.Errorf("validation: unsupported workload type %q", kind)
}
}
func (w *WorkloadManager) Prepare(ctx context.Context, job model.Job) (Prepared, error) {
prepared := Prepared{Kind: job.Type}
for _, source := range job.Sources {