Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 38 additions & 13 deletions backend/services/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func GetRunNameFromJob(job models.DiggerJob) (*string, error) {
return &runName, nil
}

func getVariablesSpecFromEnvMap(envVars map[string]string) []spec.VariableSpec {
func getVariablesSpecFromEnvMap(envVars map[string]string, stage string) []spec.VariableSpec {
variablesSpec := make([]spec.VariableSpec, 0)
for k, v := range envVars {
if strings.HasPrefix(v, "$DIGGER_") {
Expand All @@ -70,20 +70,43 @@ func getVariablesSpecFromEnvMap(envVars map[string]string) []spec.VariableSpec {
Value: val,
IsSecret: false,
IsInterpolated: true,
Stage: stage,
})
} else {
variablesSpec = append(variablesSpec, spec.VariableSpec{
Name: k,
Value: v,
IsSecret: false,
IsInterpolated: false,
Stage: stage,
})

}
}
return variablesSpec
}

func findDuplicatesInStage(variablesSpec []spec.VariableSpec, stage string) (error) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you please add a few quick tests to this function ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

syntax: Remove extra parentheses in function signature

Suggested change
func findDuplicatesInStage(variablesSpec []spec.VariableSpec, stage string) (error) {
func findDuplicatesInStage(variablesSpec []spec.VariableSpec, stage string) error {

// Extract the names from VariableSpec
justNames := lo.Map(variablesSpec, func(item spec.VariableSpec, i int) string {
return item.Name
})

// Group names by their occurrence
nameCounts := lo.CountValues(justNames)

// Filter names that occur more than once
duplicates := lo.Keys(lo.PickBy(nameCounts, func(name string, count int) bool {
return count > 1
}))

if len(duplicates) > 0 {
return fmt.Errorf("duplicate variable names found in '%s' stage: %v", stage, strings.Join(duplicates, ", "))
}

return nil // No duplicates found
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The findDuplicatesInStage function in backend/services/spec.go returns an error if duplicate variable names are found, but it doesn't include the job ID in the error message. This makes debugging more difficult because when an error occurs, it's not immediately clear which job caused the problem.

The fix modifies the function signature to accept a jobId parameter and includes this ID in the error message. This change will make it easier to trace and debug issues related to duplicate variables in specific jobs.

The corresponding calls to this function in GetSpecFromJob will also need to be updated to pass the job ID.

Suggested change
func findDuplicatesInStage(variablesSpec []spec.VariableSpec, stage string) (error) {
// Extract the names from VariableSpec
justNames := lo.Map(variablesSpec, func(item spec.VariableSpec, i int) string {
return item.Name
})
// Group names by their occurrence
nameCounts := lo.CountValues(justNames)
// Filter names that occur more than once
duplicates := lo.Keys(lo.PickBy(nameCounts, func(name string, count int) bool {
return count > 1
}))
if len(duplicates) > 0 {
return fmt.Errorf("duplicate variable names found in '%s' stage: %v", stage, strings.Join(duplicates, ", "))
}
return nil // No duplicates found
}
func findDuplicatesInStage(variablesSpec []spec.VariableSpec, stage string, jobId string) (error) {
// Extract the names from VariableSpec
justNames := lo.Map(variablesSpec, func(item spec.VariableSpec, i int) string {
return item.Name
})
// Group names by their occurrence
nameCounts := lo.CountValues(justNames)
// Filter names that occur more than once
duplicates := lo.Keys(lo.PickBy(nameCounts, func(name string, count int) bool {
return count > 1
}))
if len(duplicates) > 0 {
return fmt.Errorf("duplicate variable names found in '%s' stage for job %s: %v", stage, jobId, strings.Join(duplicates, ", "))
}
return nil // No duplicates found
}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @motatoes I have added the new spec_test.go file for tests requested for the function also modified provider file to filter 3 new variables.


func GetSpecFromJob(job models.DiggerJob) (*spec.Spec, error) {
var jobSpec scheduler.JobJson
err := json.Unmarshal([]byte(job.SerializedJobSpec), &jobSpec)
Expand All @@ -92,23 +115,25 @@ func GetSpecFromJob(job models.DiggerJob) (*spec.Spec, error) {
return nil, fmt.Errorf("could not marshal json string: %v", err)
}

stateVariables := getVariablesSpecFromEnvMap(jobSpec.StateEnvVars, "state")
commandVariables := getVariablesSpecFromEnvMap(jobSpec.CommandEnvVars, "commands")
runVariables := getVariablesSpecFromEnvMap(jobSpec.RunEnvVars, "run")

if err := findDuplicatesInStage(stateVariables, "state"); err != nil {
return nil, err
}
if err := findDuplicatesInStage(commandVariables, "commands"); err != nil {
return nil, err
}
if err := findDuplicatesInStage(runVariables, "run"); err != nil {
return nil, err
}

variablesSpec := make([]spec.VariableSpec, 0)
stateVariables := getVariablesSpecFromEnvMap(jobSpec.StateEnvVars)
commandVariables := getVariablesSpecFromEnvMap(jobSpec.CommandEnvVars)
runVariables := getVariablesSpecFromEnvMap(jobSpec.RunEnvVars)
variablesSpec = append(variablesSpec, stateVariables...)
variablesSpec = append(variablesSpec, commandVariables...)
variablesSpec = append(variablesSpec, runVariables...)

// check for duplicates in list of variablesSpec
justNames := lo.Map(variablesSpec, func(item spec.VariableSpec, i int) string {
return item.Name
})
hasDuplicates := len(justNames) != len(lo.Uniq(justNames))
if hasDuplicates {
return nil, fmt.Errorf("could not load variables due to duplicates")
}

batch := job.Batch

spec := spec.Spec{
Expand Down
1 change: 1 addition & 0 deletions libs/spec/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ type VariableSpec struct {
Value string `json:"value"`
IsSecret bool `json:"is_secret"`
IsInterpolated bool `json:"is_interpolated"`
Stage string `json:"stage"`
}

type SpecType string
Expand Down
Loading