Skip to content

Commit fe694c1

Browse files
authored
Merge pull request #314 from diggerhq/fix-workflow-init
move workflow initialization to one place
2 parents 34d5c8f + 0196330 commit fe694c1

File tree

8 files changed

+77
-85
lines changed

8 files changed

+77
-85
lines changed

cmd/digger/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func gitHubCI(lock locking.Lock) {
4848

4949
walker := configuration.FileSystemDirWalker{}
5050

51-
diggerConfig, err := configuration.NewDiggerConfig("./", &walker)
51+
diggerConfig, err := configuration.LoadDiggerConfig("./", &walker)
5252
if err != nil {
5353
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to read Digger config. %s", err), 4)
5454
}
@@ -132,7 +132,7 @@ func gitLabCI(lock locking.Lock) {
132132
}
133133
fmt.Printf("main: working dir: %s \n", currentDir)
134134

135-
diggerConfig, err := configuration.NewDiggerConfig(currentDir, &walker)
135+
diggerConfig, err := configuration.LoadDiggerConfig(currentDir, &walker)
136136
if err != nil {
137137
reportErrorAndExit(projectNamespace, fmt.Sprintf("Failed to read Digger config. %s", err), 4)
138138
}
@@ -222,7 +222,7 @@ func azureCI(lock locking.Lock) {
222222
}
223223
fmt.Printf("main: working dir: %s \n", currentDir)
224224

225-
diggerConfig, err := configuration.NewDiggerConfig(currentDir, &walker)
225+
diggerConfig, err := configuration.LoadDiggerConfig(currentDir, &walker)
226226
if err != nil {
227227
reportErrorAndExit(parsedAzureContext.BaseUrl, fmt.Sprintf("Failed to read Digger config. %s", err), 4)
228228
}

pkg/azure/azure.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []con
347347
for _, project := range impactedProjects {
348348
workflow, ok := workflows[project.Workflow]
349349
if !ok {
350-
workflow = *configuration.DefaultWorkflow()
350+
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
351351
}
352352

353353
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
@@ -369,7 +369,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []con
369369
for _, project := range impactedProjects {
370370
workflow, ok := workflows[project.Workflow]
371371
if !ok {
372-
workflow = *configuration.DefaultWorkflow()
372+
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
373373
}
374374

375375
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
@@ -392,7 +392,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []con
392392
for _, project := range impactedProjects {
393393
workflow, ok := workflows[project.Workflow]
394394
if !ok {
395-
workflow = *configuration.DefaultWorkflow()
395+
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
396396
}
397397
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
398398

@@ -442,7 +442,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []con
442442
}
443443
workflow, ok := workflows[project.Workflow]
444444
if !ok {
445-
workflow = *configuration.DefaultWorkflow()
445+
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
446446
}
447447
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
448448

pkg/configuration/digger_config.go

Lines changed: 30 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ func (s *Step) extract(stepMap map[string]interface{}, action string) {
195195
}
196196
}
197197

198-
// duplicate copied from digger.go
199198
func defaultWorkflow() *Workflow {
200199
return &Workflow{
201200
Configuration: &WorkflowConfiguration{
@@ -228,18 +227,37 @@ func defaultWorkflow() *Workflow {
228227

229228
func ConvertDiggerYamlToConfig(diggerYaml *DiggerConfigYaml, workingDir string, walker DirWalker) (*DiggerConfig, error) {
230229
var diggerConfig DiggerConfig
230+
const defaultWorkflowName = "default"
231231

232232
diggerConfig.AutoMerge = diggerYaml.AutoMerge
233233

234+
// if workflow block is not specified in yaml we create a default one, and add it to every project
234235
if diggerYaml.Workflows != nil {
235236
diggerConfig.Workflows = diggerYaml.Workflows
236237
} else {
237238
workflow := *defaultWorkflow()
238239
diggerConfig.Workflows = make(map[string]Workflow)
239-
diggerConfig.Workflows["default"] = workflow
240+
diggerConfig.Workflows[defaultWorkflowName] = workflow
240241
}
241242

242243
diggerConfig.Projects = diggerYaml.Projects
244+
245+
// update project's workflow if needed
246+
for _, project := range diggerConfig.Projects {
247+
if project.Workflow == "" {
248+
project.Workflow = defaultWorkflowName
249+
}
250+
}
251+
252+
// check for project name duplicates
253+
projectNames := make(map[string]bool)
254+
for _, project := range diggerConfig.Projects {
255+
if projectNames[project.Name] {
256+
return nil, fmt.Errorf("project name '%s' is duplicated", project.Name)
257+
}
258+
projectNames[project.Name] = true
259+
}
260+
243261
diggerConfig.CollectUsageData = diggerYaml.CollectUsageData
244262

245263
if diggerYaml.GenerateProjectsConfig != nil {
@@ -261,25 +279,16 @@ func ConvertDiggerYamlToConfig(diggerYaml *DiggerConfigYaml, workingDir string,
261279
return nil, err
262280
}
263281
if includeMatch && !excludeMatch {
264-
project := Project{Name: filepath.Base(dir), Dir: filepath.Join(workingDir, dir)}
282+
// generate a new project using default workflow
283+
project := Project{Name: filepath.Base(dir), Dir: filepath.Join(workingDir, dir), Workflow: defaultWorkflowName}
265284
diggerConfig.Projects = append(diggerConfig.Projects, project)
266285
}
267286
}
268287
}
269-
270-
projectNames := make(map[string]bool)
271-
272-
for _, project := range diggerConfig.Projects {
273-
if projectNames[project.Name] {
274-
return nil, fmt.Errorf("project name '%s' is duplicated", project.Name)
275-
}
276-
projectNames[project.Name] = true
277-
}
278-
279288
return &diggerConfig, nil
280289
}
281290

282-
func NewDiggerConfig(workingDir string, walker DirWalker) (*DiggerConfig, error) {
291+
func LoadDiggerConfig(workingDir string, walker DirWalker) (*DiggerConfig, error) {
283292
config := &DiggerConfigYaml{}
284293
fileName, err := retrieveConfigFile(workingDir)
285294
if err != nil {
@@ -342,6 +351,13 @@ func NewDiggerConfig(workingDir string, walker DirWalker) (*DiggerConfig, error)
342351
if err != nil {
343352
return nil, err
344353
}
354+
355+
for _, p := range c.Projects {
356+
_, ok := c.Workflows[p.Workflow]
357+
if !ok {
358+
return nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", p.Workflow, p.Name)
359+
}
360+
}
345361
return c, nil
346362
}
347363

@@ -413,20 +429,6 @@ func (c *DiggerConfig) GetWorkflow(workflowName string) *Workflow {
413429

414430
}
415431

416-
func (c *DiggerConfig) GetWorkflowConfiguration(projectName string) WorkflowConfiguration {
417-
project := c.GetProject(projectName)
418-
workflows := c.Workflows
419-
if project == nil {
420-
return WorkflowConfiguration{}
421-
}
422-
workflow, ok := workflows[project.Workflow]
423-
424-
if !ok {
425-
return WorkflowConfiguration{}
426-
}
427-
return *workflow.Configuration
428-
}
429-
430432
type File struct {
431433
Filename string
432434
}
@@ -489,33 +491,3 @@ func CollectEnvVars(envs EnvVars) (map[string]string, map[string]string) {
489491
}
490492
return stateEnvVars, commandEnvVars
491493
}
492-
493-
func DefaultWorkflow() *Workflow {
494-
return &Workflow{
495-
Configuration: &WorkflowConfiguration{
496-
OnCommitToDefault: []string{"digger unlock"},
497-
OnPullRequestPushed: []string{"digger plan"},
498-
OnPullRequestClosed: []string{"digger unlock"},
499-
},
500-
Plan: &Stage{
501-
Steps: []Step{
502-
{
503-
Action: "init", ExtraArgs: []string{},
504-
},
505-
{
506-
Action: "plan", ExtraArgs: []string{},
507-
},
508-
},
509-
},
510-
Apply: &Stage{
511-
Steps: []Step{
512-
{
513-
Action: "init", ExtraArgs: []string{},
514-
},
515-
{
516-
Action: "apply", ExtraArgs: []string{},
517-
},
518-
},
519-
},
520-
}
521-
}

pkg/configuration/digger_config_test.go

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func setUp() (string, func()) {
2626
}
2727

2828
func TestDiggerConfigFileDoesNotExist(t *testing.T) {
29-
dg, err := NewDiggerConfig("", &FileSystemDirWalker{})
29+
dg, err := LoadDiggerConfig("", &FileSystemDirWalker{})
3030
assert.NoError(t, err, "expected error to be not nil")
3131
assert.Equal(t, dg.Projects[0].Name, "default", "expected default project to have name 'default'")
3232
assert.Equal(t, dg.Projects[0].Dir, ".", "expected default project dir to be '.'")
@@ -46,7 +46,7 @@ func TestDiggerConfigWhenMultipleConfigExist(t *testing.T) {
4646
t.Fatal(err)
4747
}
4848

49-
dg, err := NewDiggerConfig(tempDir, &FileSystemDirWalker{})
49+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
5050
assert.Error(t, err, "expected error to be returned")
5151
assert.ErrorContains(t, err, ErrDiggerConfigConflict.Error(), "expected error to match target error")
5252
assert.Nil(t, dg, "expected diggerConfig to be nil")
@@ -66,12 +66,33 @@ projects:
6666
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
6767
defer deleteFile()
6868

69-
dg, err := NewDiggerConfig(tempDir, &FileSystemDirWalker{})
69+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
7070
assert.NoError(t, err, "expected error to be nil")
7171
assert.NotNil(t, dg, "expected digger config to be not nil")
7272
assert.Equal(t, "path/to/module/test", dg.GetDirectory("prod"))
7373
}
7474

75+
func TestDiggerConfigDefaultWorkflow(t *testing.T) {
76+
tempDir, teardown := setUp()
77+
defer teardown()
78+
79+
diggerCfg := `
80+
projects:
81+
- name: prod
82+
branch: /main/
83+
dir: path/to/module/test
84+
`
85+
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
86+
defer deleteFile()
87+
88+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
89+
assert.NoError(t, err, "expected error to be nil")
90+
assert.NotNil(t, dg, "expected digger config to be not nil")
91+
assert.Equal(t, "default", dg.Projects[0].Workflow)
92+
_, ok := dg.Workflows["default"]
93+
assert.True(t, ok)
94+
}
95+
7596
func TestDiggerConfigWhenOnlyYmlExists(t *testing.T) {
7697
tempDir, teardown := setUp()
7798
defer teardown()
@@ -86,7 +107,7 @@ projects:
86107
deleteFile := createFile(path.Join(tempDir, "digger.yml"), diggerCfg)
87108
defer deleteFile()
88109

89-
dg, err := NewDiggerConfig(tempDir, &FileSystemDirWalker{})
110+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
90111
assert.NoError(t, err, "expected error to be nil")
91112
assert.NotNil(t, dg, "expected digger config to be not nil")
92113
assert.Equal(t, "path/to/module", dg.GetDirectory("dev"))
@@ -111,7 +132,7 @@ workflows:
111132
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
112133
defer deleteFile()
113134

114-
dg, err := NewDiggerConfig(tempDir, &FileSystemDirWalker{})
135+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
115136
assert.NoError(t, err, "expected error to be nil")
116137
assert.Equal(t, Step{Action: "run", Value: "echo \"hello\"", Shell: ""}, dg.Workflows["myworkflow"].Plan.Steps[0], "parsed struct does not match expected struct")
117138
}
@@ -156,7 +177,7 @@ workflows:
156177
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
157178
defer deleteFile()
158179

159-
dg, err := NewDiggerConfig(tempDir, &FileSystemDirWalker{})
180+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
160181
assert.NoError(t, err, "expected error to be nil")
161182
assert.Equal(t, []EnvVarConfig{
162183
{Name: "TF_VAR_state", Value: "s3://mybucket/terraform.tfstate"},
@@ -186,7 +207,7 @@ workflows:
186207
deleteFile := createFile(path.Join(tempDir, "digger.yaml"), diggerCfg)
187208
defer deleteFile()
188209

189-
dg, err := NewDiggerConfig(tempDir, &FileSystemDirWalker{})
210+
dg, err := LoadDiggerConfig(tempDir, &FileSystemDirWalker{})
190211
assert.NoError(t, err, "expected error to be nil")
191212
assert.Equal(t, Step{Action: "init", ExtraArgs: nil, Shell: ""}, dg.Workflows["default"].Plan.Steps[0], "parsed struct does not match expected struct")
192213
assert.Equal(t, Step{Action: "plan", ExtraArgs: []string{"-var-file=terraform.tfvars"}, Shell: ""}, dg.Workflows["default"].Plan.Steps[1], "parsed struct does not match expected struct")
@@ -212,7 +233,7 @@ generate_projects:
212233
walker.Files = append(walker.Files, "dev/project")
213234
walker.Files = append(walker.Files, "testtt")
214235

215-
dg, err := NewDiggerConfig(tempDir, walker)
236+
dg, err := LoadDiggerConfig(tempDir, walker)
216237
assert.NoError(t, err, "expected error to be nil")
217238
assert.NotNil(t, dg, "expected digger config to be not nil")
218239
assert.Equal(t, "test1", dg.Projects[0].Name)
@@ -242,7 +263,7 @@ generate_projects:
242263
walker.Files = append(walker.Files, "dev/project")
243264
walker.Files = append(walker.Files, "testtt")
244265

245-
dg, err := NewDiggerConfig(tempDir, walker)
266+
dg, err := LoadDiggerConfig(tempDir, walker)
246267
assert.NoError(t, err, "expected error to be nil")
247268
assert.NotNil(t, dg, "expected digger config to be not nil")
248269
assert.Equal(t, "test1", dg.Projects[0].Name)
@@ -271,7 +292,7 @@ generate_projects:
271292
walker.Files = append(walker.Files, "dev/project")
272293
walker.Files = append(walker.Files, "testtt")
273294

274-
dg, err := NewDiggerConfig(tempDir, walker)
295+
dg, err := LoadDiggerConfig(tempDir, walker)
275296
assert.NoError(t, err, "expected error to be nil")
276297
assert.NotNil(t, dg, "expected digger config to be not nil")
277298
assert.Equal(t, "dev", dg.Projects[0].Name)
@@ -288,7 +309,7 @@ func TestMissingProjectsReturnsError(t *testing.T) {
288309
defer deleteFile()
289310
walker := &MockDirWalker{}
290311

291-
_, err := NewDiggerConfig(tempDir, walker)
312+
_, err := LoadDiggerConfig(tempDir, walker)
292313
assert.ErrorContains(t, err, "no projects configuration found")
293314
}
294315

pkg/github/github.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []configu
141141
for _, project := range impactedProjects {
142142
workflow, ok := workflows[project.Workflow]
143143
if !ok {
144-
workflow = *configuration.DefaultWorkflow()
144+
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
145145
}
146146

147147
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
@@ -207,7 +207,7 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []configu
207207
for _, project := range runForProjects {
208208
workflow, ok := workflows[project.Workflow]
209209
if !ok {
210-
workflow = *configuration.DefaultWorkflow()
210+
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
211211
}
212212

213213
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)

pkg/gitlab/gitlab.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,8 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex
250250
case MergeRequestOpened, MergeRequestReopened, MergeRequestUpdated:
251251
for _, project := range impactedProjects {
252252
workflow, ok := workflows[project.Workflow]
253-
254253
if !ok {
255-
workflow = workflows["default"]
254+
return nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
256255
}
257256

258257
commandsPerProject = append(commandsPerProject, models.ProjectCommand{
@@ -270,7 +269,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex
270269
for _, project := range impactedProjects {
271270
workflow, ok := workflows[project.Workflow]
272271
if !ok {
273-
workflow = workflows["default"]
272+
return nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
274273
}
275274
commandsPerProject = append(commandsPerProject, models.ProjectCommand{
276275
ProjectName: project.Name,

pkg/integration/integration_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ func TestHappyPath(t *testing.T) {
352352
terraform.CreateValidTerraformTestFile(dir)
353353
terraform.CreateSingleEnvDiggerYmlFile(dir)
354354

355-
diggerConfig, err := configuration.NewDiggerConfig(dir, &configuration.FileSystemDirWalker{})
355+
diggerConfig, err := configuration.LoadDiggerConfig(dir, &configuration.FileSystemDirWalker{})
356356
assert.NoError(t, err)
357357

358358
lock, err := locking.GetLock()
@@ -496,7 +496,7 @@ func TestMultiEnvHappyPath(t *testing.T) {
496496
terraform.CreateValidTerraformTestFile(dir)
497497
terraform.CreateMultiEnvDiggerYmlFile(dir)
498498

499-
diggerConfig, err := configuration.NewDiggerConfig(dir, &configuration.FileSystemDirWalker{})
499+
diggerConfig, err := configuration.LoadDiggerConfig(dir, &configuration.FileSystemDirWalker{})
500500
assert.NoError(t, err)
501501

502502
sess, err := session.NewSessionWithOptions(session.Options{
@@ -713,7 +713,7 @@ workflows:
713713
terraform.CreateValidTerraformTestFile(dir)
714714
terraform.CreateCustomDiggerYmlFile(dir, diggerCfg)
715715

716-
diggerConfig, err := configuration.NewDiggerConfig(dir, &configuration.FileSystemDirWalker{})
716+
diggerConfig, err := configuration.LoadDiggerConfig(dir, &configuration.FileSystemDirWalker{})
717717
assert.NoError(t, err)
718718

719719
assert.NotNil(t, diggerConfig.Workflows)

0 commit comments

Comments
 (0)