Skip to content

Commit b607b94

Browse files
authored
conditional reporting of terraform output based on render mode (#1502)
1 parent de040e7 commit b607b94

File tree

15 files changed

+75
-69
lines changed

15 files changed

+75
-69
lines changed

backend/controllers/projects.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,12 @@ func RunHistoryForProject(c *gin.Context) {
311311
}
312312

313313
type SetJobStatusRequest struct {
314-
Status string `json:"status"`
315-
Timestamp time.Time `json:"timestamp"`
316-
JobSummary *terraform_utils.PlanSummary `json:"job_summary"`
317-
Footprint *terraform_utils.TerraformPlanFootprint `json:"job_plan_footprint"`
318-
PrCommentUrl string `json:"pr_comment_url"`
314+
Status string `json:"status"`
315+
Timestamp time.Time `json:"timestamp"`
316+
JobSummary *terraform_utils.PlanSummary `json:"job_summary"`
317+
Footprint *terraform_utils.TerraformPlanFootprint `json:"job_plan_footprint"`
318+
PrCommentUrl string `json:"pr_comment_url"`
319+
TerraformOutput string `json:"terraform_output""`
319320
}
320321

321322
func SetJobStatusForProject(c *gin.Context) {
@@ -373,6 +374,7 @@ func SetJobStatusForProject(c *gin.Context) {
373374
}
374375
case "succeeded":
375376
job.Status = orchestrator_scheduler.DiggerJobSucceeded
377+
job.TerraformOutput = request.TerraformOutput
376378
if request.Footprint != nil {
377379
job.PlanFootprint, err = json.Marshal(request.Footprint)
378380
if err != nil {
@@ -441,6 +443,14 @@ func SetJobStatusForProject(c *gin.Context) {
441443

442444
case "failed":
443445
job.Status = orchestrator_scheduler.DiggerJobFailed
446+
job.TerraformOutput = request.TerraformOutput
447+
err := models.DB.UpdateDiggerJob(job)
448+
if err != nil {
449+
log.Printf("Error updating job status: %v", request.Status)
450+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error saving job"})
451+
return
452+
}
453+
444454
default:
445455
log.Printf("Unexpected status %v", request.Status)
446456
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error saving job"})

backend/migrations/20240524110010.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- Modify "digger_jobs" table
2+
ALTER TABLE "public"."digger_jobs" ADD COLUMN "terraform_output" text NULL;

backend/migrations/atlas.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
h1:twh+xriKbq+sSGNo0DpJTPFSuQiImJoxGVyxq+CgJVA=
1+
h1:L2cuCxn8dP4DzLC23qqPzZValJLDtJgr944X8PuA6bQ=
22
20231227132525.sql h1:43xn7XC0GoJsCnXIMczGXWis9d504FAWi4F1gViTIcw=
33
20240115170600.sql h1:IW8fF/8vc40+eWqP/xDK+R4K9jHJ9QBSGO6rN9LtfSA=
44
20240116123649.sql h1:R1JlUIgxxF6Cyob9HdtMqiKmx/BfnsctTl5rvOqssQw=
@@ -20,3 +20,4 @@ h1:twh+xriKbq+sSGNo0DpJTPFSuQiImJoxGVyxq+CgJVA=
2020
20240409161739.sql h1:x0dZOsILJhmeQ6w8JKkllXZb2oz+QqV/PGLo+8R2pWI=
2121
20240510162721.sql h1:X2iIVRSrJU/Qjk176u9MAYL8kcOy/meS/YwPwrRF/Ok=
2222
20240518182629.sql h1:TZWESUb/S12o6IoP8JOUnLpA6UF9sPlSFlNSyeA3aX0=
23+
20240524110010.sql h1:tJ4SceBrjNekJtKXzY6IDHM6HZhTLYY0SHWci2znAfE=

backend/models/scheduler.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type DiggerJob struct {
4141
DiggerJobSummary DiggerJobSummary
4242
DiggerJobSummaryID uint
4343
SerializedJobSpec []byte
44+
TerraformOutput string
4445
// represents a footprint of terraform plan json for similarity checks
4546
PlanFootprint []byte
4647
WorkflowFile string

cli/cmd/digger/main.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
141141
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to parse jobs json. %s", err), 4)
142142
}
143143

144-
serializedBatch, err := backendApi.ReportProjectJobStatus(repoName, jobSpec.ProjectName, inputs.Id, "started", time.Now(), nil, "")
144+
serializedBatch, err := backendApi.ReportProjectJobStatus(repoName, jobSpec.ProjectName, inputs.Id, "started", time.Now(), nil, "", "")
145145
if err != nil {
146146
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to report jobSpec status to backend. Exiting. %s", err), 4)
147147
}
@@ -152,11 +152,13 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
152152
}
153153
log.Printf("Digger digger_config read successfully\n")
154154

155+
reportTerraformOutput := false
155156
var commentUpdater comment_updater.CommentUpdater
156157
if diggerConfig.CommentRenderMode == digger_config.CommentRenderModeBasic {
157158
commentUpdater = comment_updater.BasicCommentUpdater{}
158159
} else if diggerConfig.CommentRenderMode == digger_config.CommentRenderModeGroupByModule {
159160
commentUpdater = comment_updater.ModuleGroupingCommentUpdater{}
161+
reportTerraformOutput = true
160162
} else {
161163
reportErrorAndExit(githubActor, fmt.Sprintf("Unknown comment render mode found: %v", diggerConfig.CommentRenderMode), 8)
162164
}
@@ -182,7 +184,7 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
182184
reporter := reporting.NewCiReporterLazy(*cireporter)
183185

184186
if err != nil {
185-
serializedBatch, reportingError := backendApi.ReportProjectJobStatus(repoName, jobSpec.ProjectName, inputs.Id, "failed", time.Now(), nil, "")
187+
serializedBatch, reportingError := backendApi.ReportProjectJobStatus(repoName, jobSpec.ProjectName, inputs.Id, "failed", time.Now(), nil, "", "")
186188
if reportingError != nil {
187189
log.Printf("Failed to report jobSpec status to backend. %v", reportingError)
188190
reportErrorAndExit(githubActor, fmt.Sprintf("Failed run commands. %s", err), 5)
@@ -201,9 +203,9 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
201203

202204
jobs := []orchestrator.Job{orchestrator.JsonToJob(jobSpec)}
203205

204-
allAppliesSuccess, _, err := digger.RunJobs(jobs, &githubPrService, &githubPrService, lock, reporter, planStorage, policyChecker, commentUpdater, backendApi, inputs.Id, true, commentId64, currentDir)
206+
allAppliesSuccess, _, err := digger.RunJobs(jobs, &githubPrService, &githubPrService, lock, reporter, planStorage, policyChecker, commentUpdater, backendApi, inputs.Id, true, reportTerraformOutput, commentId64, currentDir)
205207
if !allAppliesSuccess || err != nil {
206-
serializedBatch, reportingError := backendApi.ReportProjectJobStatus(repoName, jobSpec.ProjectName, inputs.Id, "failed", time.Now(), nil, "")
208+
serializedBatch, reportingError := backendApi.ReportProjectJobStatus(repoName, jobSpec.ProjectName, inputs.Id, "failed", time.Now(), nil, "", "")
207209
if reportingError != nil {
208210
reportErrorAndExit(githubActor, fmt.Sprintf("Failed run commands. %s", err), 5)
209211
}
@@ -392,7 +394,7 @@ func gitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
392394

393395
jobs = digger.SortedCommandsByDependency(jobs, &dependencyGraph)
394396

395-
allAppliesSuccessful, atLeastOneApply, err := digger.RunJobs(jobs, &githubPrService, &githubPrService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, 0, currentDir)
397+
allAppliesSuccessful, atLeastOneApply, err := digger.RunJobs(jobs, &githubPrService, &githubPrService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, false, 0, currentDir)
396398
if err != nil {
397399
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to run commands. %s", err), 8)
398400
// aggregate status checks: failure
@@ -509,7 +511,7 @@ func gitLabCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
509511
ReportStrategy: reportingStrategy,
510512
}
511513
jobs = digger.SortedCommandsByDependency(jobs, &dependencyGraph)
512-
allAppliesSuccess, atLeastOneApply, err := digger.RunJobs(jobs, gitlabService, gitlabService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, 0, currentDir)
514+
allAppliesSuccess, atLeastOneApply, err := digger.RunJobs(jobs, gitlabService, gitlabService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, false, 0, currentDir)
513515

514516
if err != nil {
515517
log.Printf("failed to execute command, %v", err)
@@ -597,7 +599,7 @@ func azureCI(lock core_locking.Lock, policyChecker core_policy.Checker, backendA
597599
ReportStrategy: reportingStrategy,
598600
}
599601
jobs = digger.SortedCommandsByDependency(jobs, &dependencyGraph)
600-
allAppliesSuccess, atLeastOneApply, err := digger.RunJobs(jobs, azureService, azureService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, 0, currentDir)
602+
allAppliesSuccess, atLeastOneApply, err := digger.RunJobs(jobs, azureService, azureService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, false, 0, currentDir)
601603
if err != nil {
602604
reportErrorAndExit(parsedAzureContext.BaseUrl, fmt.Sprintf("Failed to run commands. %s", err), 8)
603605
}
@@ -847,7 +849,7 @@ func bitbucketCI(lock core_locking.Lock, policyChecker core_policy.Checker, back
847849

848850
jobs = digger.SortedCommandsByDependency(jobs, &dependencyGraph)
849851

850-
_, _, err = digger.RunJobs(jobs, &bitbucketService, &bitbucketService, lock, &reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, 0, currentDir)
852+
_, _, err = digger.RunJobs(jobs, &bitbucketService, &bitbucketService, lock, &reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, false, 0, currentDir)
851853
if err != nil {
852854
reportErrorAndExit(actor, fmt.Sprintf("Failed to run commands. %s", err), 8)
853855
}
@@ -884,7 +886,7 @@ func exec(actor string, projectName string, repoNamespace string, command string
884886
}
885887

886888
jobs = digger.SortedCommandsByDependency(jobs, &dependencyGraph)
887-
_, _, err = digger.RunJobs(jobs, prService, orgService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, 123, currentDir)
889+
_, _, err = digger.RunJobs(jobs, prService, orgService, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "", false, false, 123, currentDir)
888890
}
889891

890892
/*

cli/cmd/digger/main_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ func TestGitHubNewPullRequestContext(t *testing.T) {
896896

897897
event := context.Event.(github.PullRequestEvent)
898898
jobs, _, err := dggithub.ConvertGithubPullRequestEventToJobs(&event, impactedProjects, requestedProject, map[string]configuration.Workflow{})
899-
_, _, err = digger.RunJobs(jobs, prManager, prManager, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "123", false, 1, "dir")
899+
_, _, err = digger.RunJobs(jobs, prManager, prManager, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "123", false, false, 1, "dir")
900900

901901
assert.NoError(t, err)
902902
if err != nil {
@@ -927,7 +927,7 @@ func TestGitHubNewCommentContext(t *testing.T) {
927927

928928
event := context.Event.(github.IssueCommentEvent)
929929
jobs, _, err := dggithub.ConvertGithubIssueCommentEventToJobs(&event, impactedProjects, requestedProject, map[string]configuration.Workflow{}, "prbranch")
930-
_, _, err = digger.RunJobs(jobs, prManager, prManager, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "123", false, 1, "")
930+
_, _, err = digger.RunJobs(jobs, prManager, prManager, lock, reporter, planStorage, policyChecker, comment_updater.NoopCommentUpdater{}, backendApi, "123", false, false, 1, "")
931931
assert.NoError(t, err)
932932
if err != nil {
933933
log.Println(err)

cli/pkg/backend/diggerapi.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func (n NoopApi) ReportProjectRun(namespace string, projectName string, startedA
2626
return nil
2727
}
2828

29-
func (n NoopApi) ReportProjectJobStatus(repo string, projectName string, jobId string, status string, timestamp time.Time, planResult *execution.DiggerExecutorPlanResult, PrCommentUrl string) (*scheduler.SerializedBatch, error) {
29+
func (n NoopApi) ReportProjectJobStatus(repo string, projectName string, jobId string, status string, timestamp time.Time, summary *execution.DiggerExecutorPlanResult, PrCommentUrl string, terraformOutput string) (*scheduler.SerializedBatch, error) {
3030
return nil, nil
3131
}
3232

@@ -118,7 +118,7 @@ func (d DiggerApi) ReportProjectRun(namespace string, projectName string, starte
118118
return nil
119119
}
120120

121-
func (d DiggerApi) ReportProjectJobStatus(repo string, projectName string, jobId string, status string, timestamp time.Time, planResult *execution.DiggerExecutorPlanResult, PrCommentUrl string) (*scheduler.SerializedBatch, error) {
121+
func (d DiggerApi) ReportProjectJobStatus(repo string, projectName string, jobId string, status string, timestamp time.Time, planResult *execution.DiggerExecutorPlanResult, PrCommentUrl string, terraformOutput string) (*scheduler.SerializedBatch, error) {
122122
u, err := url.Parse(d.DiggerHost)
123123
if err != nil {
124124
log.Fatalf("Not able to parse digger cloud url: %v", err)
@@ -148,6 +148,7 @@ func (d DiggerApi) ReportProjectJobStatus(repo string, projectName string, jobId
148148
"job_summary": planSummaryJson,
149149
"job_plan_footprint": planFootprint.ToJson(),
150150
"pr_comment_url": PrCommentUrl,
151+
"terraform_output": terraformOutput,
151152
}
152153

153154
jsonData, err := json.Marshal(request)

cli/pkg/core/backend/backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ import (
99
type Api interface {
1010
ReportProject(repo string, projectName string, configuration string) error
1111
ReportProjectRun(repo string, projectName string, startedAt time.Time, endedAt time.Time, status string, command string, output string) error
12-
ReportProjectJobStatus(repo string, projectName string, jobId string, status string, timestamp time.Time, summary *execution.DiggerExecutorPlanResult, PrCommentUrl string) (*scheduler.SerializedBatch, error)
12+
ReportProjectJobStatus(repo string, projectName string, jobId string, status string, timestamp time.Time, summary *execution.DiggerExecutorPlanResult, PrCommentUrl string, terraformOutput string) (*scheduler.SerializedBatch, error)
1313
}

cli/pkg/core/execution/execution.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,9 @@ type DiggerExecutor struct {
106106
}
107107

108108
type DiggerExecutorResult struct {
109-
PlanResult *DiggerExecutorPlanResult
110-
ApplyResult *DiggerExecutorApplyResult
109+
TerraformOutput string
110+
PlanResult *DiggerExecutorPlanResult
111+
ApplyResult *DiggerExecutorApplyResult
111112
}
112113

113114
type DiggerExecutorApplyResult struct {

cli/pkg/digger/digger.go

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,7 @@ func DetectCI() CIName {
6868

6969
}
7070

71-
func RunJobs(
72-
jobs []orchestrator.Job,
73-
prService orchestrator.PullRequestService,
74-
orgService orchestrator.OrgService,
75-
lock core_locking.Lock,
76-
reporter core_reporting.Reporter,
77-
planStorage storage.PlanStorage,
78-
policyChecker policy.Checker,
79-
commentUpdater comment_updater.CommentUpdater,
80-
backendApi backend.Api,
81-
batchId string,
82-
reportFinalStatusToBackend bool,
83-
prCommentId int64,
84-
workingDir string,
85-
) (bool, bool, error) {
71+
func RunJobs(jobs []orchestrator.Job, prService orchestrator.PullRequestService, orgService orchestrator.OrgService, lock core_locking.Lock, reporter core_reporting.Reporter, planStorage storage.PlanStorage, policyChecker policy.Checker, commentUpdater comment_updater.CommentUpdater, backendApi backend.Api, batchId string, reportFinalStatusToBackend bool, reportTerraformOutput bool, prCommentId int64, workingDir string) (bool, bool, error) {
8672
defer reporter.Flush()
8773

8874
runStartedAt := time.Now()
@@ -155,8 +141,12 @@ func RunJobs(
155141
if exectorResults[0].PlanResult != nil {
156142
planResult = exectorResults[0].PlanResult
157143
}
144+
terraformOutput := ""
145+
if reportTerraformOutput {
146+
terraformOutput = exectorResults[0].TerraformOutput
147+
}
158148
prNumber := *currentJob.PullRequestNumber
159-
batchResult, err := backendApi.ReportProjectJobStatus(repoNameForBackendReporting, projectNameForBackendReporting, batchId, "succeeded", time.Now(), planResult, jobPrCommentUrl)
149+
batchResult, err := backendApi.ReportProjectJobStatus(repoNameForBackendReporting, projectNameForBackendReporting, batchId, "succeeded", time.Now(), planResult, jobPrCommentUrl, terraformOutput)
160150
if err != nil {
161151
log.Printf("error reporting Job status: %v.\n", err)
162152
return false, false, fmt.Errorf("error while running command: %v", err)
@@ -343,6 +333,7 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
343333
return nil, msg, fmt.Errorf(msg)
344334
}
345335
result := execution.DiggerExecutorResult{
336+
TerraformOutput: plan,
346337
PlanResult: &execution.DiggerExecutorPlanResult{
347338
PlanSummary: *planSummary,
348339
TerraformJson: planJsonOutput,
@@ -438,7 +429,8 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
438429
appliesPerProject[job.ProjectName] = true
439430
}
440431
result := execution.DiggerExecutorResult{
441-
ApplyResult: &execution.DiggerExecutorApplyResult{},
432+
TerraformOutput: output,
433+
ApplyResult: &execution.DiggerExecutorApplyResult{},
442434
}
443435
return &result, output, nil
444436
}

0 commit comments

Comments
 (0)