@@ -42,7 +42,7 @@ func TestPrebuildWorkspaceTaskSuccess(t *testing.T) {
42
42
CheckoutLocation : "empty" ,
43
43
WorkspaceRoot : "/workspace/empty" ,
44
44
Task : []gitpod.TasksItems {
45
- {Init : "echo \" some output\" > someFile; sleep 10; exit 0;" },
45
+ {Init : "echo \" some output\" > someFile; exit 0;" },
46
46
},
47
47
},
48
48
}
@@ -85,7 +85,7 @@ func TestPrebuildWorkspaceTaskSuccess(t *testing.T) {
85
85
}
86
86
req .Spec .WorkspaceLocation = test .CheckoutLocation
87
87
return nil
88
- }))
88
+ }), integration . WithWaitWorkspaceForOpts ( integration . WaitForStopped ) )
89
89
if err != nil {
90
90
t .Fatalf ("cannot launch a workspace: %q" , err )
91
91
}
@@ -95,18 +95,16 @@ func TestPrebuildWorkspaceTaskSuccess(t *testing.T) {
95
95
t .Errorf ("cannot stop workspace: %q" , err )
96
96
}
97
97
})
98
- _ , err = integration .WaitForWorkspace (ctx , api , ws .Req .Id , func (status * wsmanapi.WorkspaceStatus ) bool {
99
- if status .Phase != wsmanapi .WorkspacePhase_STOPPED {
100
- return false
101
- }
102
- if status .Conditions .HeadlessTaskFailed != "" {
103
- t .Logf ("Conditions: %v" , status .Conditions )
104
- t .Fatal ("unexpected HeadlessTaskFailed condition" )
105
- }
106
- return true
107
- })
108
- if err != nil {
109
- t .Fatalf ("failed for wait workspace stop: %q" , err )
98
+
99
+ if ws .LastStatus == nil {
100
+ t .Fatal ("workspace status is nil" )
101
+ }
102
+ if ws .LastStatus .Phase != wsmanapi .WorkspacePhase_STOPPED {
103
+ t .Fatalf ("unexpected workspace phase: %v" , ws .LastStatus .Phase )
104
+ }
105
+ if ws .LastStatus .Conditions != nil && ws .LastStatus .Conditions .HeadlessTaskFailed != "" {
106
+ t .Logf ("Conditions: %v" , ws .LastStatus .Conditions )
107
+ t .Fatalf ("unexpected HeadlessTaskFailed condition: %v" , ws .LastStatus .Conditions .HeadlessTaskFailed )
110
108
}
111
109
})
112
110
}
@@ -135,10 +133,10 @@ func TestPrebuildWorkspaceTaskFail(t *testing.T) {
135
133
req .Type = wsmanapi .WorkspaceType_PREBUILD
136
134
req .Spec .Envvars = append (req .Spec .Envvars , & wsmanapi.EnvironmentVariable {
137
135
Name : "GITPOD_TASKS" ,
138
- Value : `[{ "init": "echo \"some output\" > someFile; sleep 10; exit 1;" }]` ,
136
+ Value : `[{ "init": "echo \"some output\" > someFile; exit 1;" }]` ,
139
137
})
140
138
return nil
141
- }))
139
+ }), integration . WithWaitWorkspaceForOpts ( integration . WaitForStopped ) )
142
140
if err != nil {
143
141
t .Fatalf ("cannot start workspace: %q" , err )
144
142
}
@@ -150,18 +148,15 @@ func TestPrebuildWorkspaceTaskFail(t *testing.T) {
150
148
}
151
149
})
152
150
153
- _ , err = integration .WaitForWorkspace (ctx , api , ws .Req .Id , func (status * wsmanapi.WorkspaceStatus ) bool {
154
- if status .Phase != wsmanapi .WorkspacePhase_STOPPED {
155
- return false
156
- }
157
- if status .Conditions .HeadlessTaskFailed == "" {
158
- t .Logf ("Conditions: %v" , status .Conditions )
159
- t .Fatal ("expected HeadlessTaskFailed condition" )
160
- }
161
- return true
162
- })
163
- if err != nil {
164
- t .Fatalf ("failed for wait workspace stop: %q" , err )
151
+ if ws .LastStatus == nil {
152
+ t .Fatal ("workspace status is nil" )
153
+ }
154
+ if ws .LastStatus .Phase != wsmanapi .WorkspacePhase_STOPPED {
155
+ t .Fatalf ("unexpected workspace phase: %v" , ws .LastStatus .Phase )
156
+ }
157
+ if ws .LastStatus .Conditions == nil || ws .LastStatus .Conditions .HeadlessTaskFailed == "" {
158
+ t .Logf ("Status: %v" , ws .LastStatus )
159
+ t .Fatal ("expected HeadlessTaskFailed condition" )
165
160
}
166
161
167
162
return ctx
@@ -174,7 +169,7 @@ func TestPrebuildWorkspaceTaskFail(t *testing.T) {
174
169
const (
175
170
prebuildLogPath string = "/workspace/.gitpod"
176
171
prebuildLog string = "'🍊 This task ran as a workspace prebuild'"
177
- initTask string = "echo \" some output\" > someFile; sleep 10; "
172
+ initTask string = "echo \" some output\" > someFile;"
178
173
regularPrefix string = "ws-"
179
174
)
180
175
@@ -227,25 +222,30 @@ func TestOpenWorkspaceFromPrebuildSerialOnly(t *testing.T) {
227
222
// create a prebuild and stop workspace
228
223
// TODO: change to use server API to launch the workspace, so we could run the integration test as the user code flow
229
224
// which is client -> server -> ws-manager rather than client -> ws-manager directly
230
- ws , prebuildStopWs , err := integration .LaunchWorkspaceDirectly (t , ctx , api , integration .WithRequestModifier (func (req * wsmanapi.StartWorkspaceRequest ) error {
231
- req .Type = wsmanapi .WorkspaceType_PREBUILD
232
- req .Spec .Envvars = append (req .Spec .Envvars , & wsmanapi.EnvironmentVariable {
233
- Name : "GITPOD_TASKS" ,
234
- Value : fmt .Sprintf (`[{ "init": %q }]` , initTask ),
235
- })
236
- req .Spec .FeatureFlags = test .FF
237
- req .Spec .Initializer = & csapi.WorkspaceInitializer {
238
- Spec : & csapi.WorkspaceInitializer_Git {
239
- Git : & csapi.GitInitializer {
240
- RemoteUri : test .ContextURL ,
241
- CheckoutLocation : test .CheckoutLocation ,
242
- Config : & csapi.GitConfig {},
225
+ ws , prebuildStopWs , err := integration .LaunchWorkspaceDirectly (t , ctx , api ,
226
+ integration .WithRequestModifier (func (req * wsmanapi.StartWorkspaceRequest ) error {
227
+ req .Type = wsmanapi .WorkspaceType_PREBUILD
228
+ req .Spec .Envvars = append (req .Spec .Envvars , & wsmanapi.EnvironmentVariable {
229
+ Name : "GITPOD_TASKS" ,
230
+ Value : fmt .Sprintf (`[{ "init": %q }]` , initTask ),
231
+ })
232
+ req .Spec .FeatureFlags = test .FF
233
+ req .Spec .Initializer = & csapi.WorkspaceInitializer {
234
+ Spec : & csapi.WorkspaceInitializer_Git {
235
+ Git : & csapi.GitInitializer {
236
+ RemoteUri : test .ContextURL ,
237
+ CheckoutLocation : test .CheckoutLocation ,
238
+ Config : & csapi.GitConfig {},
239
+ },
243
240
},
244
- },
245
- }
246
- req .Spec .WorkspaceLocation = test .CheckoutLocation
247
- return nil
248
- }))
241
+ }
242
+ req .Spec .WorkspaceLocation = test .CheckoutLocation
243
+ return nil
244
+ }),
245
+ // Wait for the prebuild to finish, as this can happen quickly before we
246
+ // would have time to observe the workspace to stop and get its status.
247
+ integration .WithWaitWorkspaceForOpts (integration .WaitForStopped ),
248
+ )
249
249
if err != nil {
250
250
t .Fatalf ("cannot launch a workspace: %q" , err )
251
251
}
@@ -255,7 +255,7 @@ func TestOpenWorkspaceFromPrebuildSerialOnly(t *testing.T) {
255
255
}
256
256
}()
257
257
258
- prebuildSnapshot , _ , err = watchStopWorkspaceAndFindSnapshot (t , ctx , ws .Req . Id , ws . WorkspaceID , api )
258
+ prebuildSnapshot , _ , err = findSnapshotFromStoppedWs (t , ctx , ws .LastStatus )
259
259
if err != nil {
260
260
_ = stopWorkspace (t , cfg , prebuildStopWs )
261
261
t .Fatalf ("stop workspace and find snapshot error: %v" , err )
@@ -472,9 +472,9 @@ func TestOpenWorkspaceFromOutdatedPrebuild(t *testing.T) {
472
472
req .Spec .WorkspaceLocation = test .CheckoutLocation
473
473
return nil
474
474
}),
475
- // The init task only runs for a short duration, so it's possible we miss the Running state, as it quickly transitions to Stopping.
476
- // Therefore ignore if we can't see the Running state .
477
- integration .WithWaitWorkspaceForOpts (integration .WorkspaceCanFail ))
475
+ // The init task only runs for a short duration, so it's possible we miss the Running state, as it quickly transitions to Stopping/Stopped .
476
+ // Therefore wait for the workspace to stop to get its last status .
477
+ integration .WithWaitWorkspaceForOpts (integration .WaitForStopped ))
478
478
if err != nil {
479
479
t .Fatalf ("cannot launch a workspace: %q" , err )
480
480
}
@@ -484,7 +484,7 @@ func TestOpenWorkspaceFromOutdatedPrebuild(t *testing.T) {
484
484
t .Errorf ("cannot stop workspace: %q" , err )
485
485
}
486
486
}()
487
- prebuildSnapshot , _ , err := watchStopWorkspaceAndFindSnapshot (t , ctx , ws .Req . Id , ws . WorkspaceID , api )
487
+ prebuildSnapshot , _ , err := findSnapshotFromStoppedWs (t , ctx , ws .LastStatus )
488
488
if err != nil {
489
489
t .Fatalf ("stop workspace and find snapshot error: %v" , err )
490
490
}
@@ -690,18 +690,19 @@ func checkGitFolderPermission(t *testing.T, rsa *integration.RpcClient, workspac
690
690
}
691
691
}
692
692
693
- func watchStopWorkspaceAndFindSnapshot (t * testing.T , ctx context.Context , instanceId string , workspaceID string , api * integration.ComponentAPI ) (string , * wsmanapi.VolumeSnapshotInfo , error ) {
694
- ready := make (chan struct {}, 1 )
695
- lastStatus , err := integration .WaitForWorkspaceStop (t , ctx , ready , api , instanceId , workspaceID )
696
- if err != nil {
697
- return "" , nil , err
693
+ func findSnapshotFromStoppedWs (t * testing.T , ctx context.Context , lastStatus * wsmanapi.WorkspaceStatus ) (string , * wsmanapi.VolumeSnapshotInfo , error ) {
694
+ if lastStatus == nil {
695
+ return "" , nil , fmt .Errorf ("did not get last workspace status" )
698
696
}
699
- if lastStatus .Conditions != nil && lastStatus . Conditions . HeadlessTaskFailed != "" {
700
- return "" , nil , errors . New ( "unexpected HeadlessTaskFailed condition" )
697
+ if lastStatus .Phase != wsmanapi . WorkspacePhase_STOPPED {
698
+ return "" , nil , fmt . Errorf ( "workspace is not stopped: %s" , lastStatus . Phase )
701
699
}
702
- if lastStatus == nil || lastStatus .Conditions == nil {
700
+ if lastStatus .Conditions == nil {
703
701
return "" , nil , nil
704
702
}
703
+ if lastStatus .Conditions .HeadlessTaskFailed != "" {
704
+ return "" , nil , errors .New ("unexpected HeadlessTaskFailed condition" )
705
+ }
705
706
return lastStatus .Conditions .Snapshot , lastStatus .Conditions .VolumeSnapshot , nil
706
707
}
707
708
0 commit comments