-
Notifications
You must be signed in to change notification settings - Fork 116
/
experiment_run.go
125 lines (108 loc) · 3.5 KB
/
experiment_run.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package experimentstore
import (
"time"
"google.golang.org/protobuf/types/known/timestamppb"
experimentationv1 "github.com/lyft/clutch/backend/api/chaos/experimentation/v1"
)
type ExperimentRun struct {
Id string
StartTime time.Time
EndTime *time.Time
CancellationTime *time.Time
CreationTime time.Time
TerminationReason string
}
func (er *ExperimentRun) Status(now time.Time) experimentationv1.Experiment_Status {
if er.CancellationTime != nil {
if (er.EndTime == nil && er.CancellationTime.After(er.StartTime)) || (er.EndTime != nil && er.CancellationTime.After(*er.EndTime)) {
return experimentationv1.Experiment_STATUS_COMPLETED
}
return experimentationv1.Experiment_STATUS_CANCELED
} else {
if now.Before(er.StartTime) {
return experimentationv1.Experiment_STATUS_SCHEDULED
} else if (now.Equal(er.StartTime) || now.After(er.StartTime)) && (er.EndTime == nil || now.Before(*er.EndTime)) {
return experimentationv1.Experiment_STATUS_RUNNING
}
return experimentationv1.Experiment_STATUS_COMPLETED
}
}
func (er *ExperimentRun) CreateProperties(now time.Time) ([]*experimentationv1.Property, error) {
status := er.Status(now)
startTimeTimestamp := timestamppb.New(er.StartTime)
if err := startTimeTimestamp.CheckValid(); err != nil {
return nil, err
}
creationTimeTimestamp := timestamppb.New(er.CreationTime)
if err := creationTimeTimestamp.CheckValid(); err != nil {
return nil, err
}
properties := []*experimentationv1.Property{
{
Id: "run_identifier",
Label: "Run Identifier",
Value: &experimentationv1.Property_StringValue{StringValue: er.Id},
},
{
Id: "status",
Label: "Status",
Value: &experimentationv1.Property_StringValue{StringValue: StatusToString(status)},
},
{
Id: "run_creation_time",
Label: "Created At",
Value: &experimentationv1.Property_DateValue{DateValue: creationTimeTimestamp},
},
{
Id: "start_time",
Label: "Start Time",
Value: &experimentationv1.Property_DateValue{DateValue: startTimeTimestamp},
},
}
var time *time.Time
if er.EndTime != nil {
time = er.EndTime
} else if er.CancellationTime != nil {
time = er.CancellationTime
}
endTimeTimestamp, err := TimeToPropertyDateValue(time)
if err != nil {
return nil, err
}
properties = append(properties, &experimentationv1.Property{
Id: "end_time",
Label: "End Time",
Value: endTimeTimestamp,
})
cancellationTimeTimestamp, err := TimeToPropertyDateValue(er.CancellationTime)
if err != nil {
return nil, err
}
if status == experimentationv1.Experiment_STATUS_CANCELED {
if er.CancellationTime != nil && er.CancellationTime.After(er.StartTime) {
properties = append(properties, &experimentationv1.Property{
Id: "stopped_at",
Label: "Stopped At",
Value: cancellationTimeTimestamp,
})
} else if status == experimentationv1.Experiment_STATUS_CANCELED {
properties = append(properties, &experimentationv1.Property{
Id: "canceled_at",
Label: "Canceled At",
Value: cancellationTimeTimestamp,
})
}
}
if status == experimentationv1.Experiment_STATUS_CANCELED || status == experimentationv1.Experiment_STATUS_COMPLETED {
terminationReason := "N/A"
if er.TerminationReason != "" {
terminationReason = er.TerminationReason
}
properties = append(properties, &experimentationv1.Property{
Id: "termination_reason",
Label: "Termination Reason",
Value: &experimentationv1.Property_StringValue{StringValue: terminationReason},
})
}
return properties, nil
}