Skip to content

Commit 2f09f8c

Browse files
committed
[ws-manager] PodRejected: Add test for phase transitions
1 parent c895e84 commit 2f09f8c

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

components/ws-manager-mk2/controllers/suite_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ func TestAPIs(t *testing.T) {
4949
}
5050

5151
var (
52-
ctx context.Context
53-
cancel context.CancelFunc
54-
wsMetrics *controllerMetrics
52+
ctx context.Context
53+
cancel context.CancelFunc
54+
wsMetrics *controllerMetrics
55+
RegisterSubscriber func(func(*workspacev1.Workspace))
5556
)
5657

5758
var _ = BeforeSuite(func() {
@@ -116,6 +117,15 @@ var _ = BeforeSuite(func() {
116117
Expect(timeoutReconciler.SetupWithManager(k8sManager)).To(Succeed())
117118

118119
ctx, cancel = context.WithCancel(context.Background())
120+
subscriberReconciler, err := NewSubscriberReconciler(k8sManager.GetClient(), &conf)
121+
Expect(err).ToNot(HaveOccurred())
122+
Expect(subscriberReconciler.SetupWithManager(ctx, k8sManager)).To(Succeed())
123+
RegisterSubscriber = func(onReconcile func(*workspacev1.Workspace)) {
124+
subscriberReconciler.OnReconcile = func(ctx context.Context, ws *workspacev1.Workspace) {
125+
onReconcile(ws)
126+
}
127+
}
128+
119129
_ = createNamespace(secretsNamespace)
120130

121131
go func() {

components/ws-manager-mk2/controllers/workspace_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
235235
// Reset status
236236
sc := workspace.Status.DeepCopy()
237237
workspace.Status = workspacev1.WorkspaceStatus{}
238+
workspace.Status.Phase = workspacev1.WorkspacePhasePending
238239
workspace.Status.OwnerToken = sc.OwnerToken
239240
workspace.Status.PodStarts = sc.PodStarts
240241
workspace.Status.PodRecreated = sc.PodRecreated + 1

components/ws-manager-mk2/controllers/workspace_controller_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ var _ = Describe("WorkspaceController", func() {
392392
It("pod rejection should result in a retry", func() {
393393
ws := newWorkspace(uuid.NewString(), "default")
394394
m := collectMetricCounts(wsMetrics, ws)
395+
su := collectSubscriberUpdates()
395396

396397
// ### prepare block start
397398
By("creating workspace")
@@ -530,6 +531,8 @@ var _ = Describe("WorkspaceController", func() {
530531
starts: 1, // this is NOT PodStarts, but merely an artifact of how we count it in the tests
531532
recreations: map[int]int{1: 1},
532533
})
534+
535+
expectPhaseTransitions(su, []workspacev1.WorkspacePhase{workspacev1.WorkspacePhasePending, workspacev1.WorkspacePhaseCreating, workspacev1.WorkspacePhaseInitializing, workspacev1.WorkspacePhaseRunning})
533536
// ### validate end
534537
})
535538
})
@@ -1042,3 +1045,35 @@ func expectMetricsDelta(initial metricCounts, cur metricCounts, expectedDelta me
10421045
Expect(cur.restores-initial.restores).To(Equal(expectedDelta.restores), "expected metric count delta for restores")
10431046
Expect(cur.restoreFailures-initial.restoreFailures).To(Equal(expectedDelta.restoreFailures), "expected metric count delta for restoreFailures")
10441047
}
1048+
1049+
type subscriberUpdates struct {
1050+
phaseTransitions []workspacev1.WorkspacePhase
1051+
}
1052+
1053+
func collectSubscriberUpdates() *subscriberUpdates {
1054+
su := subscriberUpdates{}
1055+
recordPhaseTransition := func(su *subscriberUpdates, ws *workspacev1.Workspace) {
1056+
phase := ws.Status.Phase
1057+
1058+
var lastPhase workspacev1.WorkspacePhase
1059+
lenPhases := len(su.phaseTransitions)
1060+
if lenPhases > 0 {
1061+
lastPhase = su.phaseTransitions[lenPhases-1]
1062+
}
1063+
1064+
if lastPhase != phase {
1065+
su.phaseTransitions = append(su.phaseTransitions, phase)
1066+
}
1067+
}
1068+
1069+
RegisterSubscriber(func(ws *workspacev1.Workspace) {
1070+
recordPhaseTransition(&su, ws)
1071+
})
1072+
return &su
1073+
}
1074+
1075+
func expectPhaseTransitions(su *subscriberUpdates, expectation []workspacev1.WorkspacePhase) {
1076+
GinkgoHelper()
1077+
By("checking recorded phase transitions")
1078+
Expect(su.phaseTransitions).To(HaveExactElements(expectation), "expected list of recorded phase transitions")
1079+
}

0 commit comments

Comments
 (0)