Skip to content

Commit 567d04f

Browse files
authored
fix panic when digger is misconfigured (#1975)
* fix panic when digger is misconfigured * add test * handle shell error and add tests
1 parent 41932ae commit 567d04f

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

libs/digger_config/digger_config_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,84 @@ workflows:
319319
assert.Equal(t, Step{Action: "plan", ExtraArgs: []string{"-var-file=vars/dev.tfvars"}, Shell: ""}, dg.Workflows["default"].Plan.Steps[2], "parsed struct does not match expected struct")
320320
}
321321

322+
func TestProjectWithMisconfiguredRunStepThrowsError(t *testing.T) {
323+
tempDir, teardown := setUp()
324+
defer teardown()
325+
326+
diggerCfg := `
327+
projects:
328+
- name: "dev"
329+
dir: "dev"
330+
- name: "staging"
331+
dir: "staging"
332+
- name: "prod"
333+
dir: "prod"
334+
workflows:
335+
default:
336+
workflow_configuration:
337+
on_pull_request_pushed: ["digger plan"]
338+
on_pull_request_closed: ["digger unlock"]
339+
on_commit_to_default: ["digger unlock"]
340+
plan:
341+
steps:
342+
- init:
343+
extra_args: ["-backend-config=tf_backend.tfbackend" ]
344+
- run:
345+
command: terragrunt plan -input=false -out=$PLANFILE
346+
apply:
347+
steps:
348+
- init:
349+
extra_args: ["-backend-config=tf_backend.tfbackend" ]
350+
- apply:
351+
`
352+
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
353+
defer deleteFile()
354+
355+
_, _, _, err := LoadDiggerConfig(tempDir, true, nil)
356+
assert.Error(t, err, "expected error to be raised")
357+
assert.Contains(t, err.Error(), "step.run must be a string")
358+
}
359+
360+
func TestProjectWithMisconfiguredRunShellMisconfiguredThrowsError(t *testing.T) {
361+
tempDir, teardown := setUp()
362+
defer teardown()
363+
364+
diggerCfg := `
365+
projects:
366+
- name: "dev"
367+
dir: "dev"
368+
- name: "staging"
369+
dir: "staging"
370+
- name: "prod"
371+
dir: "prod"
372+
workflows:
373+
default:
374+
workflow_configuration:
375+
on_pull_request_pushed: ["digger plan"]
376+
on_pull_request_closed: ["digger unlock"]
377+
on_commit_to_default: ["digger unlock"]
378+
plan:
379+
steps:
380+
- init:
381+
extra_args: ["-backend-config=tf_backend.tfbackend" ]
382+
- run: terragrunt plan -input=false -out=$PLANFILE
383+
shell:
384+
- incorrect
385+
- "bash"
386+
apply:
387+
steps:
388+
- init:
389+
extra_args: ["-backend-config=tf_backend.tfbackend" ]
390+
- apply:
391+
`
392+
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
393+
defer deleteFile()
394+
395+
_, _, _, err := LoadDiggerConfig(tempDir, true, nil)
396+
assert.Error(t, err, "expected error to be raised")
397+
assert.Contains(t, err.Error(), "step.run.shell must be a string")
398+
}
399+
322400
func TestDiggerGenerateProjects(t *testing.T) {
323401
tempDir, teardown := setUp()
324402
defer teardown()

libs/digger_config/yaml.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package digger_config
22

33
import (
44
"errors"
5+
"fmt"
56

67
"gopkg.in/yaml.v3"
78
)
@@ -260,9 +261,17 @@ func (s *StepYaml) UnmarshalYAML(value *yaml.Node) error {
260261

261262
if _, ok := stepMap["run"]; ok {
262263
s.Action = "run"
263-
s.Value = stepMap["run"].(string)
264+
v, ok := stepMap["run"].(string)
265+
if !ok {
266+
return fmt.Errorf("step.run must be a string, but got %T", stepMap["run"])
267+
}
268+
s.Value = v
264269
if _, ok := stepMap["shell"]; ok {
265-
s.Shell = stepMap["shell"].(string)
270+
shell, ok := stepMap["shell"].(string)
271+
if !ok {
272+
return fmt.Errorf("step.run.shell must be a string, but got %T", stepMap["shell"])
273+
}
274+
s.Shell = shell
266275
}
267276
return nil
268277
}

0 commit comments

Comments
 (0)