Skip to content

Commit 41cba4a

Browse files
authored
Merge pull request #139 from trickest/fix/nil-completed-date-panic
Handle nil completed date for failed runs, add run duration function
2 parents 51cbb1c + 3463f89 commit 41cba4a

File tree

5 files changed

+34
-29
lines changed

5 files changed

+34
-29
lines changed

cmd/get/json_output.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,7 @@ func NewJSONRun(run *trickest.Run, subjobs []trickest.SubJob, taskGroupStatsMap
8181
RunInsights: run.RunInsights,
8282
Machines: run.Machines,
8383
Parallelism: run.Parallelism,
84-
}
85-
86-
if run.Status == "RUNNING" {
87-
jsonRun.Duration = trickest.Duration{Duration: time.Since(*run.StartedDate)}
88-
} else {
89-
jsonRun.Duration = trickest.Duration{Duration: run.CompletedDate.Sub(*run.StartedDate)}
84+
Duration: trickest.Duration{Duration: run.Duration()},
9085
}
9186

9287
jsonRun.SubJobs = make([]JSONSubJob, len(subjobs))

cmd/help/help.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,16 @@ func generateHelpMarkdown(workflow *trickest.Workflow, labeledPrimitiveNodes []*
168168
sb.WriteString("|------------|-------------|----------|-----|\n")
169169
for _, run := range runs {
170170
machines := run.Parallelism
171-
date := run.StartedDate.Format("2006-01-02 15:04")
172-
duration := run.CompletedDate.Sub(*run.StartedDate)
173-
durationStr := display.FormatDuration(duration)
171+
dateStr := "N/A"
172+
if run.StartedDate != nil {
173+
dateStr = run.StartedDate.Format("2006-01-02 15:04")
174+
}
175+
durationStr := "N/A"
176+
if duration := run.Duration(); duration > 0 {
177+
durationStr = display.FormatDuration(duration)
178+
}
174179
runURL := fmt.Sprintf("%s?run=%s", workflowURL, run.ID)
175-
sb.WriteString(fmt.Sprintf("| %s | %d | %s | [View](%s) |\n", date, machines, durationStr, runURL))
180+
sb.WriteString(fmt.Sprintf("| %s | %d | %s | [View](%s) |\n", dateStr, machines, durationStr, runURL))
176181
}
177182
sb.WriteString("\n")
178183
sb.WriteString("Use the `--machines` flag to set the number of machines (maximum parallelism) to run the workflow on.\n\n")

pkg/display/run/printer.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,31 +68,28 @@ func (p *RunPrinter) PrintAll(run *trickest.Run, subJobs []trickest.SubJob, vers
6868
output.WriteString(p.formatKeyValue("Created",
6969
run.CreatedDate.In(time.Local).Format(time.RFC1123)+" ("+FormatDuration(time.Since(*run.CreatedDate))+" ago)"))
7070
}
71-
if run.Status != "PENDING" {
72-
if run.StartedDate != nil {
73-
output.WriteString(p.formatKeyValue("Started",
74-
run.StartedDate.In(time.Local).Format(time.RFC1123)+" ("+FormatDuration(time.Since(*run.StartedDate))+" ago)"))
75-
}
71+
if run.Status != "PENDING" && run.StartedDate != nil {
72+
output.WriteString(p.formatKeyValue("Started",
73+
run.StartedDate.In(time.Local).Format(time.RFC1123)+" ("+FormatDuration(time.Since(*run.StartedDate))+" ago)"))
7674
}
77-
if run.Finished {
75+
if run.Finished && run.CompletedDate != nil {
7876
output.WriteString(p.formatKeyValue("Finished",
7977
run.CompletedDate.In(time.Local).Format(time.RFC1123)+" ("+FormatDuration(time.Since(*run.CompletedDate))+" ago)"))
8078
}
8179
output.WriteString("\n")
8280

8381
// Print duration and average duration
84-
if run.Finished {
85-
output.WriteString(p.formatKeyValue("Duration", FormatDuration(run.CompletedDate.Sub(*run.StartedDate))))
86-
} else if run.Status == "RUNNING" {
87-
output.WriteString(p.formatKeyValue("Duration", FormatDuration(time.Since(*run.StartedDate))))
82+
durationStr := "N/A"
83+
if duration := run.Duration(); duration > 0 {
84+
durationStr = FormatDuration(duration)
8885
}
89-
if run.AverageDuration != nil {
90-
if run.AverageDuration.Duration > 0 {
91-
output.WriteString(p.formatKeyValue("Average Duration", FormatDuration(run.AverageDuration.Duration)))
92-
} else {
93-
output.WriteString(p.formatKeyValue("Average Duration", "N/A"))
94-
}
86+
output.WriteString(p.formatKeyValue("Duration", durationStr))
87+
88+
avgDurationStr := "N/A"
89+
if run.AverageDuration != nil && run.AverageDuration.Duration > 0 {
90+
avgDurationStr = FormatDuration(run.AverageDuration.Duration)
9591
}
92+
output.WriteString(p.formatKeyValue("Average Duration", avgDurationStr))
9693
output.WriteString("\n")
9794

9895
// Print subjob insights

pkg/trickest/run.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,19 @@ type Run struct {
3737
UseStaticIPs *bool `json:"use_static_ips,omitempty"`
3838
IPAddresses []string `json:"ip_addresses,omitempty"`
3939
RunInsights *RunSubJobInsights `json:"run_insights,omitempty"`
40-
Duration *Duration `json:"duration,omitempty"`
4140
AverageDuration *Duration `json:"average_duration,omitempty"`
4241
}
4342

43+
func (r Run) Duration() time.Duration {
44+
if r.StartedDate == nil {
45+
return 0
46+
}
47+
if r.CompletedDate == nil {
48+
return time.Since(*r.StartedDate)
49+
}
50+
return r.CompletedDate.Sub(*r.StartedDate)
51+
}
52+
4453
// Duration is a custom type for duration that json marshals to "Xh Ym" or "Xm Ys" matching the web UI
4554
type Duration struct {
4655
Duration time.Duration

pkg/trickest/workflow.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,7 @@ func (c *Client) GetWorkflowRunsAverageDuration(ctx context.Context, workflowID
335335

336336
totalDuration := time.Duration(0)
337337
for _, pastRun := range pastRuns {
338-
duration := pastRun.CompletedDate.Sub(*pastRun.StartedDate)
339-
totalDuration += duration
338+
totalDuration += pastRun.Duration()
340339
}
341340
averageDuration := totalDuration / time.Duration(len(pastRuns))
342341

0 commit comments

Comments
 (0)