@@ -60,6 +60,8 @@ import {
60
60
EnvVarWithValue ,
61
61
BillingTier ,
62
62
Project ,
63
+ GitpodServer ,
64
+ IDESettings ,
63
65
} from "@gitpod/gitpod-protocol" ;
64
66
import { IAnalyticsWriter } from "@gitpod/gitpod-protocol/lib/analytics" ;
65
67
import { log } from "@gitpod/gitpod-protocol/lib/util/logging" ;
@@ -127,9 +129,8 @@ import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution";
127
129
import { LogContext } from "@gitpod/gitpod-protocol/lib/util/logging" ;
128
130
import { repeat } from "@gitpod/gitpod-protocol/lib/util/repeat" ;
129
131
130
- export interface StartWorkspaceOptions {
132
+ export interface StartWorkspaceOptions extends GitpodServer . StartWorkspaceOptions {
131
133
rethrow ?: boolean ;
132
- forceDefaultImage ?: boolean ;
133
134
excludeFeatureFlags ?: NamedWorkspaceFeatureFlag [ ] ;
134
135
}
135
136
@@ -139,21 +140,31 @@ const INSTANCE_START_RETRY_INTERVAL_SECONDS = 2;
139
140
export async function getWorkspaceClassForInstance (
140
141
ctx : TraceContext ,
141
142
workspace : Workspace ,
143
+ previousInstance : WorkspaceInstance | undefined ,
142
144
user : User ,
143
145
project : Project | undefined ,
146
+ workspaceClassOverride : string | undefined ,
144
147
entitlementService : EntitlementService ,
145
148
config : WorkspaceClassesConfig ,
146
149
) : Promise < string > {
147
150
const span = TraceContext . startSpan ( "getWorkspaceClassForInstance" , ctx ) ;
148
151
try {
149
152
let workspaceClass : string | undefined ;
150
- switch ( workspace . type ) {
151
- case "prebuild" :
152
- workspaceClass = project ?. settings ?. workspaceClasses ?. prebuild ;
153
- break ;
154
- case "regular" :
155
- workspaceClass = project ?. settings ?. workspaceClasses ?. regular ;
156
- break ;
153
+ if ( workspaceClassOverride ) {
154
+ workspaceClass = workspaceClassOverride ;
155
+ }
156
+ if ( ! workspaceClass && previousInstance ) {
157
+ workspaceClass = previousInstance . workspaceClass ;
158
+ }
159
+ if ( ! workspaceClass ) {
160
+ switch ( workspace . type ) {
161
+ case "prebuild" :
162
+ workspaceClass = project ?. settings ?. workspaceClasses ?. prebuild ;
163
+ break ;
164
+ case "regular" :
165
+ workspaceClass = project ?. settings ?. workspaceClasses ?. regular ;
166
+ break ;
167
+ }
157
168
}
158
169
if ( ! workspaceClass && ( await entitlementService . userGetsMoreResources ( user ) ) ) {
159
170
workspaceClass = config . find ( ( c ) => ! ! c . marker ?. moreResources ) ?. id ;
@@ -269,7 +280,7 @@ export class WorkspaceStarter {
269
280
}
270
281
}
271
282
272
- const ideConfig = await this . resolveIDEConfiguration ( ctx , workspace , user ) ;
283
+ const ideConfig = await this . resolveIDEConfiguration ( ctx , workspace , user , options . ideSettings ) ;
273
284
274
285
// create and store instance
275
286
let instance = await this . workspaceDb
@@ -283,6 +294,7 @@ export class WorkspaceStarter {
283
294
project ,
284
295
options . excludeFeatureFlags || [ ] ,
285
296
ideConfig ,
297
+ options . workspaceClass ,
286
298
) ,
287
299
) ;
288
300
span . log ( { newInstance : instance . id } ) ;
@@ -350,15 +362,20 @@ export class WorkspaceStarter {
350
362
}
351
363
}
352
364
353
- private async resolveIDEConfiguration ( ctx : TraceContext , workspace : Workspace , user : User ) {
365
+ private async resolveIDEConfiguration (
366
+ ctx : TraceContext ,
367
+ workspace : Workspace ,
368
+ user : User ,
369
+ userSelectedIdeSettings ?: IDESettings ,
370
+ ) {
354
371
const span = TraceContext . startSpan ( "resolveIDEConfiguration" , ctx ) ;
355
372
try {
356
373
const migrated = this . ideService . migrateSettings ( user ) ;
357
374
if ( user . additionalData ?. ideSettings && migrated ) {
358
375
user . additionalData . ideSettings = migrated ;
359
376
}
360
377
361
- const resp = await this . ideService . resolveWorkspaceConfig ( workspace , user ) ;
378
+ const resp = await this . ideService . resolveWorkspaceConfig ( workspace , user , userSelectedIdeSettings ) ;
362
379
if ( ! user . additionalData ?. ideSettings && resp . refererIde ) {
363
380
// A user does not have IDE settings configured yet configure it with a referrer ide as default.
364
381
const additionalData = user ?. additionalData || { } ;
@@ -770,6 +787,7 @@ export class WorkspaceStarter {
770
787
project : Project | undefined ,
771
788
excludeFeatureFlags : NamedWorkspaceFeatureFlag [ ] ,
772
789
ideConfig : IdeServiceApi . ResolveWorkspaceConfigResponse ,
790
+ workspaceClassOverride ?: string ,
773
791
) : Promise < WorkspaceInstance > {
774
792
const span = TraceContext . startSpan ( "newInstance" , ctx ) ;
775
793
try {
@@ -814,8 +832,10 @@ export class WorkspaceStarter {
814
832
let workspaceClass = await getWorkspaceClassForInstance (
815
833
ctx ,
816
834
workspace ,
835
+ previousInstance ,
817
836
user ,
818
837
project ,
838
+ workspaceClassOverride ,
819
839
this . entitlementService ,
820
840
this . config . workspaceClasses ,
821
841
) ;
0 commit comments