From 50b994490013cf74a1083ca4e6483dd01cdc5b32 Mon Sep 17 00:00:00 2001 From: Mohamed Habib Date: Fri, 9 Feb 2024 16:41:20 +0000 Subject: [PATCH] handle an empty plan summary in the case of digger apply (#1140) * handle an empty plan summary --- cli/pkg/digger/digger.go | 11 ++++++--- libs/orchestrator/aws.go | 2 +- libs/orchestrator/json_models.go | 10 +++++++++ libs/orchestrator/json_models_test.go | 32 +++++++++++++++++++++++++++ libs/orchestrator/scheduler/models.go | 6 ++++- 5 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 libs/orchestrator/json_models_test.go diff --git a/cli/pkg/digger/digger.go b/cli/pkg/digger/digger.go index 43509c731..6a858d672 100644 --- a/cli/pkg/digger/digger.go +++ b/cli/pkg/digger/digger.go @@ -135,7 +135,12 @@ func RunJobs( currentJob := jobs[0] repoNameForBackendReporting := strings.ReplaceAll(currentJob.Namespace, "/", "-") projectNameForBackendReporting := currentJob.ProjectName - planSummary := exectorResults[0].PlanResult.PlanSummary + // TODO: handle the apply result summary as well to report it to backend. Possibly reporting changed resources as well + // Some kind of generic terraform operation summary might need to be introduced + planSummary := terraform.PlanSummary{} + if exectorResults[0].PlanResult != nil { + planSummary = exectorResults[0].PlanResult.PlanSummary + } prNumber := *currentJob.PullRequestNumber batchResult, err := backendApi.ReportProjectJobStatus(repoNameForBackendReporting, projectNameForBackendReporting, batchId, "succeeded", time.Now(), &planSummary) if err != nil { @@ -158,15 +163,15 @@ func UpdateStatusComment(jobs []scheduler.SerializedJob, prNumber int, prService message := ":construction_worker: Jobs status:\n\n" for _, job := range jobs { - var jobSpec orchestrator.JobJson err := json.Unmarshal(job.JobString, &jobSpec) if err != nil { log.Printf("Failed to convert unmarshall Serialized job") } + isPlan := jobSpec.IsPlan() message = message + fmt.Sprintf("\n", job.ProjectName) - message = message + fmt.Sprintf("%v **%v** %v%v\n", job.Status.ToEmoji(), jobSpec.ProjectName, *job.WorkflowRunUrl, job.Status.ToString(), job.ResourcesSummaryString()) + message = message + fmt.Sprintf("%v **%v** %v%v\n", job.Status.ToEmoji(), jobSpec.ProjectName, *job.WorkflowRunUrl, job.Status.ToString(), job.ResourcesSummaryString(isPlan)) message = message + fmt.Sprintf("\n", job.ProjectName) } diff --git a/libs/orchestrator/aws.go b/libs/orchestrator/aws.go index 6a3c69d6a..d81e8c9fa 100644 --- a/libs/orchestrator/aws.go +++ b/libs/orchestrator/aws.go @@ -42,7 +42,7 @@ func populateKeys(envs map[string]string, provider stscreds.WebIdentityRoleProvi func (job *Job) PopulateAwsCredentialsEnvVarsForJob() error { if job.StateEnvProvider != nil { - log.Printf("Project-level AWS role detected, Assuming role: %v for project run: %v", job.ProjectName) + log.Printf("Project-level AWS role detected, Assuming role for project: %v", job.ProjectName) var err error backendConfigArgs, err := populateretrieveBackendConfigArgs(*job.StateEnvProvider) if err != nil { diff --git a/libs/orchestrator/json_models.go b/libs/orchestrator/json_models.go index 919391584..f9ed6f2db 100644 --- a/libs/orchestrator/json_models.go +++ b/libs/orchestrator/json_models.go @@ -1,5 +1,7 @@ package orchestrator +import "slices" + type StepJson struct { Action string `json:"action"` ExtraArgs []string `json:"extraArgs"` @@ -25,6 +27,14 @@ type JobJson struct { CommandEnvVars map[string]string `json:"commandEnvVars"` } +func (j *JobJson) IsPlan() bool { + return slices.Contains(j.Commands, "digger plan") +} + +func (j *JobJson) IsApply() bool { + return slices.Contains(j.Commands, "digger apply") +} + func JobToJson(job Job) JobJson { return JobJson{ ProjectName: job.ProjectName, diff --git a/libs/orchestrator/json_models_test.go b/libs/orchestrator/json_models_test.go new file mode 100644 index 000000000..9d1f419be --- /dev/null +++ b/libs/orchestrator/json_models_test.go @@ -0,0 +1,32 @@ +package orchestrator + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestIsPlanForDiggerPlanJobCorrect(t *testing.T) { + j := JobJson{ + ProjectName: "project.Name", + ProjectDir: "project.Dir", + ProjectWorkspace: "workspace", + Terragrunt: false, + Commands: []string{"run echo 'hello", "digger plan"}, + EventName: "issue_comment", + } + assert.True(t, j.IsPlan()) + assert.False(t, j.IsApply()) +} + +func TestIsApplyForDiggerApplyJobCorrect(t *testing.T) { + j := JobJson{ + ProjectName: "project.Name", + ProjectDir: "project.Dir", + ProjectWorkspace: "workspace", + Terragrunt: false, + Commands: []string{"digger apply"}, + EventName: "issue_comment", + } + assert.True(t, j.IsApply()) + assert.False(t, j.IsPlan()) +} diff --git a/libs/orchestrator/scheduler/models.go b/libs/orchestrator/scheduler/models.go index 5305c9676..c39d163b1 100644 --- a/libs/orchestrator/scheduler/models.go +++ b/libs/orchestrator/scheduler/models.go @@ -86,7 +86,11 @@ type SerializedBatch struct { Jobs []SerializedJob `json:"jobs"` } -func (s *SerializedJob) ResourcesSummaryString() string { +func (s *SerializedJob) ResourcesSummaryString(isPlan bool) string { + if !isPlan { + return "" + } + if s.Status == DiggerJobSucceeded { return fmt.Sprintf(" [Resources: %v to create, %v to update, %v to delete]", s.ResourcesCreated, s.ResourcesUpdated, s.ResourcesDeleted) } else {