Skip to content

Commit 62b4d3a

Browse files
chore: add details to grad rollout decisions
1 parent 7ea53a6 commit 62b4d3a

File tree

2 files changed

+72
-10
lines changed

2 files changed

+72
-10
lines changed

apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/gradualrollout/gradualrollout.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,40 @@ func (e *GradualRolloutEvaluator) Evaluate(ctx context.Context, environment *oap
133133
return nil, err
134134
}
135135

136-
if rolloutStartTime == nil {
137-
return results.NewPendingResult(results.ActionTypeWait, "Rollout has not started yet"), nil
138-
}
139-
140-
if now.Before(*rolloutStartTime) {
141-
return results.NewPendingResult(results.ActionTypeWait, "Rollout has not started yet"), nil
142-
}
143-
144136
rolloutPosition, err := e.getRolloutPositionForTarget(ctx, environment, version, releaseTarget)
145137
if err != nil {
146138
return results.NewDeniedResult("Failed to get rollout position"), err
147139
}
148140

141+
if rolloutStartTime == nil {
142+
return results.
143+
NewPendingResult(results.ActionTypeWait, "Rollout has not started yet").
144+
WithDetail("rollout_start_time", nil).
145+
WithDetail("target_rollout_position", rolloutPosition).
146+
WithDetail("target_rollout_time", nil), nil
147+
}
148+
149149
deploymentOffset := e.getDeploymentOffset(rolloutPosition, e.rule.TimeScaleInterval)
150150
deploymentTime := rolloutStartTime.Add(deploymentOffset)
151151

152+
if now.Before(*rolloutStartTime) {
153+
return results.
154+
NewPendingResult(results.ActionTypeWait, "Rollout has not started yet").
155+
WithDetail("rollout_start_time", rolloutStartTime.Format(time.RFC3339)).
156+
WithDetail("target_rollout_position", rolloutPosition).
157+
WithDetail("target_rollout_time", deploymentTime.Format(time.RFC3339)), nil
158+
}
159+
152160
if now.Before(deploymentTime) {
153161
reason := fmt.Sprintf("Rollout will start at %s for this release target", deploymentTime.Format(time.RFC3339))
154-
return results.NewPendingResult(results.ActionTypeWait, reason), nil
162+
return results.NewPendingResult(results.ActionTypeWait, reason).
163+
WithDetail("rollout_start_time", rolloutStartTime.Format(time.RFC3339)).
164+
WithDetail("target_rollout_position", rolloutPosition).
165+
WithDetail("target_rollout_time", deploymentTime.Format(time.RFC3339)), nil
155166
}
156167

157-
return results.NewAllowedResult("Rollout has progressed to this release target"), nil
168+
return results.NewAllowedResult("Rollout has progressed to this release target").
169+
WithDetail("rollout_start_time", rolloutStartTime.Format(time.RFC3339)).
170+
WithDetail("target_rollout_position", rolloutPosition).
171+
WithDetail("target_rollout_time", deploymentTime.Format(time.RFC3339)), nil
158172
}

apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/gradualrollout/gradualrollout_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ func TestGradualRolloutEvaluator_BasicLinearRollout(t *testing.T) {
155155
assert.False(t, result1.ActionRequired)
156156
assert.Nil(t, result1.ActionType)
157157
assert.Equal(t, result1.Message, "Rollout has progressed to this release target")
158+
assert.NotNil(t, result1.Details)
159+
assert.Equal(t, versionCreatedAt.Format(time.RFC3339), result1.Details["rollout_start_time"])
160+
assert.Equal(t, int32(0), result1.Details["target_rollout_position"])
161+
assert.Equal(t, baseTime.Format(time.RFC3339), result1.Details["target_rollout_time"])
158162

159163
result2, err := evaluator.Evaluate(ctx, environment, version, releaseTarget2)
160164
if err != nil {
@@ -165,6 +169,10 @@ func TestGradualRolloutEvaluator_BasicLinearRollout(t *testing.T) {
165169
assert.False(t, result2.ActionRequired)
166170
assert.Nil(t, result2.ActionType)
167171
assert.Equal(t, result2.Message, "Rollout has progressed to this release target")
172+
assert.NotNil(t, result2.Details)
173+
assert.Equal(t, versionCreatedAt.Format(time.RFC3339), result2.Details["rollout_start_time"])
174+
assert.Equal(t, int32(1), result2.Details["target_rollout_position"])
175+
assert.Equal(t, baseTime.Add(60*time.Minute).Format(time.RFC3339), result2.Details["target_rollout_time"])
168176

169177
result3, err := evaluator.Evaluate(ctx, environment, version, releaseTarget3)
170178
if err != nil {
@@ -175,6 +183,10 @@ func TestGradualRolloutEvaluator_BasicLinearRollout(t *testing.T) {
175183
assert.True(t, result3.ActionRequired)
176184
assert.Equal(t, *result3.ActionType, oapi.Wait)
177185
assert.Equal(t, result3.Message, "Rollout will start at 2025-01-01T02:00:00Z for this release target")
186+
assert.NotNil(t, result3.Details)
187+
assert.Equal(t, versionCreatedAt.Format(time.RFC3339), result3.Details["rollout_start_time"])
188+
assert.Equal(t, int32(2), result3.Details["target_rollout_position"])
189+
assert.Equal(t, "2025-01-01T02:00:00Z", result3.Details["target_rollout_time"])
178190
}
179191

180192
func TestGradualRolloutEvaluator_ZeroTimeScaleIntervalStartsImmediately(t *testing.T) {
@@ -236,6 +248,10 @@ func TestGradualRolloutEvaluator_ZeroTimeScaleIntervalStartsImmediately(t *testi
236248
assert.False(t, result1.ActionRequired)
237249
assert.Nil(t, result1.ActionType)
238250
assert.Equal(t, result1.Message, "Rollout has progressed to this release target")
251+
assert.NotNil(t, result1.Details)
252+
assert.Equal(t, versionCreatedAt.Format(time.RFC3339), result1.Details["rollout_start_time"])
253+
assert.Equal(t, int32(0), result1.Details["target_rollout_position"])
254+
assert.Equal(t, baseTime.Format(time.RFC3339), result1.Details["target_rollout_time"])
239255

240256
result2, err := evaluator.Evaluate(ctx, environment, version, releaseTarget2)
241257
if err != nil {
@@ -246,6 +262,10 @@ func TestGradualRolloutEvaluator_ZeroTimeScaleIntervalStartsImmediately(t *testi
246262
assert.False(t, result2.ActionRequired)
247263
assert.Nil(t, result2.ActionType)
248264
assert.Equal(t, result2.Message, "Rollout has progressed to this release target")
265+
assert.NotNil(t, result2.Details)
266+
assert.Equal(t, versionCreatedAt.Format(time.RFC3339), result2.Details["rollout_start_time"])
267+
assert.Equal(t, int32(1), result2.Details["target_rollout_position"])
268+
assert.Equal(t, baseTime.Format(time.RFC3339), result2.Details["target_rollout_time"])
249269

250270
result3, err := evaluator.Evaluate(ctx, environment, version, releaseTarget3)
251271
if err != nil {
@@ -256,6 +276,10 @@ func TestGradualRolloutEvaluator_ZeroTimeScaleIntervalStartsImmediately(t *testi
256276
assert.False(t, result3.ActionRequired)
257277
assert.Nil(t, result3.ActionType)
258278
assert.Equal(t, result3.Message, "Rollout has progressed to this release target")
279+
assert.NotNil(t, result3.Details)
280+
assert.Equal(t, versionCreatedAt.Format(time.RFC3339), result3.Details["rollout_start_time"])
281+
assert.Equal(t, int32(2), result3.Details["target_rollout_position"])
282+
assert.Equal(t, baseTime.Format(time.RFC3339), result3.Details["target_rollout_time"])
259283
}
260284

261285
func TestGradualRolloutEvaluator_UnsatisfiedApprovalRequirement(t *testing.T) {
@@ -344,6 +368,10 @@ func TestGradualRolloutEvaluator_UnsatisfiedApprovalRequirement(t *testing.T) {
344368
assert.True(t, result1.ActionRequired)
345369
assert.Equal(t, *result1.ActionType, oapi.Wait)
346370
assert.Equal(t, result1.Message, "Rollout has not started yet")
371+
assert.NotNil(t, result1.Details)
372+
assert.Nil(t, result1.Details["rollout_start_time"])
373+
assert.Equal(t, int32(0), result1.Details["target_rollout_position"])
374+
assert.Nil(t, result1.Details["target_rollout_time"])
347375

348376
result2, err := evaluator.Evaluate(ctx, environment, version, releaseTarget2)
349377
if err != nil {
@@ -354,6 +382,10 @@ func TestGradualRolloutEvaluator_UnsatisfiedApprovalRequirement(t *testing.T) {
354382
assert.True(t, result2.ActionRequired)
355383
assert.Equal(t, *result2.ActionType, oapi.Wait)
356384
assert.Equal(t, result2.Message, "Rollout has not started yet")
385+
assert.NotNil(t, result2.Details)
386+
assert.Nil(t, result2.Details["rollout_start_time"])
387+
assert.Equal(t, int32(1), result2.Details["target_rollout_position"])
388+
assert.Nil(t, result2.Details["target_rollout_time"])
357389

358390
result3, err := evaluator.Evaluate(ctx, environment, version, releaseTarget3)
359391
if err != nil {
@@ -364,6 +396,10 @@ func TestGradualRolloutEvaluator_UnsatisfiedApprovalRequirement(t *testing.T) {
364396
assert.True(t, result3.ActionRequired)
365397
assert.Equal(t, *result3.ActionType, oapi.Wait)
366398
assert.Equal(t, result3.Message, "Rollout has not started yet")
399+
assert.NotNil(t, result3.Details)
400+
assert.Nil(t, result3.Details["rollout_start_time"])
401+
assert.Equal(t, int32(2), result3.Details["target_rollout_position"])
402+
assert.Nil(t, result3.Details["target_rollout_time"])
367403
}
368404

369405
func TestGradualRolloutEvaluator_SatisfiedApprovalRequirement(t *testing.T) {
@@ -470,6 +506,10 @@ func TestGradualRolloutEvaluator_SatisfiedApprovalRequirement(t *testing.T) {
470506
assert.False(t, result1.ActionRequired)
471507
assert.Nil(t, result1.ActionType)
472508
assert.Equal(t, result1.Message, "Rollout has progressed to this release target")
509+
assert.NotNil(t, result1.Details)
510+
assert.Equal(t, oneHourLater.Format(time.RFC3339), result1.Details["rollout_start_time"])
511+
assert.Equal(t, int32(0), result1.Details["target_rollout_position"])
512+
assert.Equal(t, oneHourLater.Format(time.RFC3339), result1.Details["target_rollout_time"])
473513

474514
result2, err := evaluator.Evaluate(ctx, environment, version, releaseTarget2)
475515
if err != nil {
@@ -480,6 +520,10 @@ func TestGradualRolloutEvaluator_SatisfiedApprovalRequirement(t *testing.T) {
480520
assert.False(t, result2.ActionRequired)
481521
assert.Nil(t, result2.ActionType)
482522
assert.Equal(t, result2.Message, "Rollout has progressed to this release target")
523+
assert.NotNil(t, result2.Details)
524+
assert.Equal(t, oneHourLater.Format(time.RFC3339), result2.Details["rollout_start_time"])
525+
assert.Equal(t, int32(1), result2.Details["target_rollout_position"])
526+
assert.Equal(t, twoHoursLater.Format(time.RFC3339), result2.Details["target_rollout_time"])
483527

484528
result3, err := evaluator.Evaluate(ctx, environment, version, releaseTarget3)
485529
if err != nil {
@@ -490,4 +534,8 @@ func TestGradualRolloutEvaluator_SatisfiedApprovalRequirement(t *testing.T) {
490534
assert.True(t, result3.ActionRequired)
491535
assert.Equal(t, *result3.ActionType, oapi.Wait)
492536
assert.Equal(t, result3.Message, "Rollout will start at 2025-01-01T03:00:00Z for this release target")
537+
assert.NotNil(t, result3.Details)
538+
assert.Equal(t, oneHourLater.Format(time.RFC3339), result3.Details["rollout_start_time"])
539+
assert.Equal(t, int32(2), result3.Details["target_rollout_position"])
540+
assert.Equal(t, "2025-01-01T03:00:00Z", result3.Details["target_rollout_time"])
493541
}

0 commit comments

Comments
 (0)