@@ -18,7 +18,6 @@ import {
18
18
AdmissionConstraintHasUserLevel ,
19
19
AdmissionConstraintHasMoreResources ,
20
20
} from "@gitpod/gitpod-protocol/lib/workspace-cluster" ;
21
- import { AdmissionConstraintHasClass } from "@gitpod/gitpod-protocol/src/workspace-cluster" ;
22
21
import {
23
22
ClusterServiceService ,
24
23
ClusterState ,
@@ -35,23 +34,19 @@ import {
35
34
UpdateResponse ,
36
35
AdmissionConstraint as GRPCAdmissionConstraint ,
37
36
} from "@gitpod/ws-manager-bridge-api/lib" ;
38
- import {
39
- DescribeClusterRequest ,
40
- DescribeClusterResponse ,
41
- GetWorkspacesRequest ,
42
- WorkspaceClass ,
43
- } from "@gitpod/ws-manager/lib" ;
37
+ import { GetWorkspacesRequest } from "@gitpod/ws-manager/lib" ;
44
38
import { WorkspaceManagerClientProvider } from "@gitpod/ws-manager/lib/client-provider" ;
45
39
import {
46
40
WorkspaceManagerClientProviderCompositeSource ,
47
41
WorkspaceManagerClientProviderSource ,
48
42
} from "@gitpod/ws-manager/lib/client-provider-source" ;
49
43
import * as grpc from "@grpc/grpc-js" ;
50
- import { ServiceError as grpcServiceError } from "@grpc/grpc-js" ;
51
44
import { inject , injectable } from "inversify" ;
52
45
import { BridgeController } from "./bridge-controller" ;
46
+ import { getSupportedWorkspaceClasses } from "./cluster-sync-service" ;
53
47
import { Configuration } from "./config" ;
54
48
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server" ;
49
+ import { GRPCError } from "./rpc" ;
55
50
56
51
export interface ClusterServiceServerOptions {
57
52
port : number ;
@@ -396,10 +391,6 @@ function mapAdmissionConstraint(c: GRPCAdmissionConstraint | undefined): Admissi
396
391
return ;
397
392
}
398
393
399
- function mapWorkspaceClass ( c : WorkspaceClass ) : AdmissionConstraintHasClass {
400
- return < AdmissionConstraintHasClass > { type : "has-class" , id : c . getId ( ) , displayName : c . getDisplayname ( ) } ;
401
- }
402
-
403
394
function mapPreferabilityToScore ( p : Preferability ) : number | undefined {
404
395
switch ( p ) {
405
396
case Preferability . PREFER :
@@ -450,66 +441,6 @@ function getClientInfo(call: grpc.ServerUnaryCall<any, any>) {
450
441
return { clientIP, clientName, userAgent } ;
451
442
}
452
443
453
- @injectable ( )
454
- export class ClusterSyncService {
455
- @inject ( Configuration )
456
- protected readonly config : Configuration ;
457
-
458
- @inject ( WorkspaceClusterDB )
459
- protected readonly clusterDB : WorkspaceClusterDB ;
460
-
461
- @inject ( WorkspaceManagerClientProvider )
462
- protected readonly clientProvider : WorkspaceManagerClientProvider ;
463
-
464
- protected timer : NodeJS . Timer ;
465
-
466
- public async start ( ) {
467
- const enabled = await getExperimentsClientForBackend ( ) . getValueAsync ( "workspace_classes_backend" , false , { } ) ;
468
- if ( enabled ) {
469
- this . timer = setInterval ( ( ) => this . reconcile ( ) , this . config . clusterSyncIntervalSeconds * 1000 ) ;
470
- }
471
- }
472
-
473
- private async reconcile ( ) {
474
- log . debug ( "reconciling workspace classes..." ) ;
475
- let allClusters = await this . clusterDB . findAll ( ) ;
476
- for ( const cluster of allClusters ) {
477
- try {
478
- let supportedClasses = await getSupportedWorkspaceClasses ( this . clientProvider , cluster ) ;
479
- let existingOtherConstraints = cluster . admissionConstraints ?. filter ( ( c ) => c . type !== "has-class" ) ;
480
- cluster . admissionConstraints = existingOtherConstraints ?. concat ( supportedClasses ) ;
481
- await this . clusterDB . save ( cluster ) ;
482
- } catch ( err ) {
483
- log . error ( "failed to reconcile workspace classes for cluster" , err , { cluster : cluster . name } ) ;
484
- }
485
- }
486
- log . debug ( "done reconciling workspace classes" ) ;
487
- }
488
-
489
- public async stop ( ) {
490
- const enabled = await getExperimentsClientForBackend ( ) . getValueAsync ( "workspace_classes_backend" , false , { } ) ;
491
- if ( enabled ) {
492
- clearInterval ( this . timer ) ;
493
- }
494
- }
495
- }
496
-
497
- async function getSupportedWorkspaceClasses ( clientProvider : WorkspaceManagerClientProvider , cluster : WorkspaceCluster ) {
498
- let constraints = await new Promise < AdmissionConstraintHasClass [ ] > ( ( resolve , reject ) => {
499
- const c = clientProvider . createClient ( cluster ) ;
500
- c . describeCluster ( new DescribeClusterRequest ( ) , ( err : any , resp : DescribeClusterResponse ) => {
501
- if ( err ) {
502
- reject ( new GRPCError ( grpc . status . FAILED_PRECONDITION , `cannot reach ${ cluster . url } : ${ err . message } ` ) ) ;
503
- } else {
504
- let classes = resp . getWorkspaceclassesList ( ) . map ( ( cl ) => mapWorkspaceClass ( cl ) ) ;
505
- resolve ( classes ) ;
506
- }
507
- } ) ;
508
- } ) ;
509
-
510
- return constraints ;
511
- }
512
-
513
444
// "grpc" does not allow additional methods on it's "ServiceServer"s so we have an additional wrapper here
514
445
@injectable ( )
515
446
export class ClusterServiceServer {
@@ -519,9 +450,6 @@ export class ClusterServiceServer {
519
450
@inject ( ClusterService )
520
451
protected readonly service : ClusterService ;
521
452
522
- @inject ( ClusterSyncService )
523
- protected readonly sync : ClusterSyncService ;
524
-
525
453
protected server : grpc . Server | undefined = undefined ;
526
454
527
455
public async start ( ) {
@@ -543,7 +471,6 @@ export class ClusterServiceServer {
543
471
log . info ( `gRPC server listening on: ${ bindTo } ` ) ;
544
472
server . start ( ) ;
545
473
} ) ;
546
- this . sync . start ( ) ;
547
474
}
548
475
549
476
public async stop ( ) {
@@ -554,30 +481,5 @@ export class ClusterServiceServer {
554
481
} ) ;
555
482
this . server = undefined ;
556
483
}
557
- this . sync . stop ( ) ;
558
- }
559
- }
560
-
561
- class GRPCError extends Error implements Partial < grpcServiceError > {
562
- public name = "ServiceError" ;
563
-
564
- details : string ;
565
-
566
- constructor ( public readonly status : grpc . status , err : any ) {
567
- super ( GRPCError . errToMessage ( err ) ) ;
568
-
569
- this . details = this . message ;
570
- }
571
-
572
- static errToMessage ( err : any ) : string | undefined {
573
- if ( typeof err === "string" ) {
574
- return err ;
575
- } else if ( typeof err === "object" ) {
576
- return err . message ;
577
- }
578
- }
579
-
580
- static isGRPCError ( obj : any ) : obj is GRPCError {
581
- return obj !== undefined && typeof obj === "object" && "status" in obj ;
582
484
}
583
485
}
0 commit comments