Skip to content

Commit a7a5e7e

Browse files
committed
helpers: validate with loadDeployments to avoid double eval
1 parent f0d0cbb commit a7a5e7e

2 files changed

Lines changed: 27 additions & 45 deletions

File tree

src/helpers.go

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -37,36 +37,9 @@ func loadDeployments(cfg string) (map[string]JobSpec, error) {
3737
if err := json.Unmarshal(data, &jobs); err != nil {
3838
return nil, fmt.Errorf("invalid JSON in %s: %w", cfg, err)
3939
}
40-
return jobs, nil
41-
}
42-
43-
func run(cmd string, args ...string) ([]byte, error) {
44-
c := exec.Command(cmd, args...)
45-
out, err := c.CombinedOutput()
46-
if err != nil {
47-
return out, fmt.Errorf("`%s %v` failed: %s", cmd, args, string(out))
48-
}
49-
return out, nil
50-
}
51-
52-
func runJSON(cmd string, args ...string) ([]byte, error) {
53-
c := exec.Command(cmd, args...)
54-
out, err := c.Output() // only capture stdout
55-
if err != nil {
56-
if ee, ok := err.(*exec.ExitError); ok {
57-
return nil, fmt.Errorf("`%s %v` failed: %s", cmd, args, string(ee.Stderr))
58-
}
59-
return nil, fmt.Errorf("`%s %v` failed: %v", cmd, args, err)
60-
}
61-
return out, nil
62-
}
63-
64-
func validateJobs(jobs map[string]JobSpec, flake string) (map[string]JobSpec, error) {
65-
validated := make(map[string]JobSpec)
6640

41+
// Perform validation and system inference
6742
for name, spec := range jobs {
68-
69-
// Infer Hostname if missing
7043
if spec.Hostname == "" {
7144
spec.Hostname = name
7245
}
@@ -79,19 +52,13 @@ func validateJobs(jobs map[string]JobSpec, flake string) (map[string]JobSpec, er
7952
return nil, fmt.Errorf("missing 'user' for job: %s", name)
8053
}
8154

82-
// Infer Type if missing
8355
if spec.Type == "" {
84-
expr := fmt.Sprintf("%s#nynxDeployments.%s.output.system", flake, name)
85-
data, err := run("nix", "eval", "--raw", expr)
86-
if err != nil {
87-
return nil, fmt.Errorf("failed to infer type for job '%s': %w", name, err)
88-
}
89-
system := strings.TrimSpace(string(data))
56+
system := strings.TrimSpace(spec.Output)
9057

9158
switch {
9259
case strings.Contains(system, "darwin"):
9360
spec.Type = "darwin"
94-
case strings.Contains(system, "linux"):
61+
case strings.Contains(system, "nixos"):
9562
spec.Type = "nixos"
9663
default:
9764
return nil, fmt.Errorf("could not infer system type for job '%s' from system '%s'", name, system)
@@ -102,10 +69,31 @@ func validateJobs(jobs map[string]JobSpec, flake string) (map[string]JobSpec, er
10269
return nil, fmt.Errorf("unsupported system type '%s' for job: %s", spec.Type, name)
10370
}
10471

105-
validated[name] = spec
72+
jobs[name] = spec
73+
}
74+
75+
return jobs, nil
76+
}
77+
78+
func run(cmd string, args ...string) ([]byte, error) {
79+
c := exec.Command(cmd, args...)
80+
out, err := c.CombinedOutput()
81+
if err != nil {
82+
return out, fmt.Errorf("`%s %v` failed: %s", cmd, args, string(out))
10683
}
84+
return out, nil
85+
}
10786

108-
return validated, nil
87+
func runJSON(cmd string, args ...string) ([]byte, error) {
88+
c := exec.Command(cmd, args...)
89+
out, err := c.Output() // only capture stdout
90+
if err != nil {
91+
if ee, ok := err.(*exec.ExitError); ok {
92+
return nil, fmt.Errorf("`%s %v` failed: %s", cmd, args, string(ee.Stderr))
93+
}
94+
return nil, fmt.Errorf("`%s %v` failed: %v", cmd, args, err)
95+
}
96+
return out, nil
10997
}
11098

11199
func validateOperations(jobs map[string]JobSpec, op string) ([]string, error) {

src/main.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,7 @@ func main() {
5252
fatal("Failed to load deployments: %v", err)
5353
}
5454

55-
validatedJobs, err := validateJobs(jobs, flake)
56-
if err != nil {
57-
fatal("Invalid deployments: %v", err)
58-
}
59-
60-
jobs = validatedJobs
61-
verboseInfo(verbose, "✔ Deployments validated.")
55+
verboseInfo(verbose, "✔ Deployments loaded.")
6256

6357
// Skip provided jobs
6458
if skipFilter != "" {

0 commit comments

Comments
 (0)