Skip to content

Commit b33e19a

Browse files
committed
[bridge] Hide class registration with feature flag
1 parent 33fc6cd commit b33e19a

File tree

4 files changed

+66
-29
lines changed

4 files changed

+66
-29
lines changed

components/ws-manager-bridge/src/cluster-service-server.ts

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ import {
3535
UpdateResponse,
3636
AdmissionConstraint as GRPCAdmissionConstraint,
3737
} from "@gitpod/ws-manager-bridge-api/lib";
38-
import { DescribeClusterRequest, DescribeClusterResponse, WorkspaceClass } from "@gitpod/ws-manager/lib";
38+
import {
39+
DescribeClusterRequest,
40+
DescribeClusterResponse,
41+
GetWorkspacesRequest,
42+
WorkspaceClass,
43+
} from "@gitpod/ws-manager/lib";
3944
import { WorkspaceManagerClientProvider } from "@gitpod/ws-manager/lib/client-provider";
4045
import {
4146
WorkspaceManagerClientProviderCompositeSource,
@@ -46,6 +51,7 @@ import { ServiceError as grpcServiceError } from "@grpc/grpc-js";
4651
import { inject, injectable } from "inversify";
4752
import { BridgeController } from "./bridge-controller";
4853
import { Configuration } from "./config";
54+
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
4955

5056
export interface ClusterServiceServerOptions {
5157
port: number;
@@ -149,8 +155,32 @@ export class ClusterService implements IClusterServiceServer {
149155
tls,
150156
};
151157

152-
let classConstraints = await getSupportedWorkspaceClasses(this.clientProvider, newCluster);
153-
newCluster.admissionConstraints = admissionConstraints.concat(classConstraints);
158+
const enabled = await getExperimentsClientForBackend().getValueAsync(
159+
"workspace_classes_backend",
160+
false,
161+
{},
162+
);
163+
if (enabled) {
164+
let classConstraints = await getSupportedWorkspaceClasses(this.clientProvider, newCluster);
165+
newCluster.admissionConstraints = admissionConstraints.concat(classConstraints);
166+
} else {
167+
// try to connect to validate the config. Throws an exception if it fails.
168+
await new Promise<void>((resolve, reject) => {
169+
const c = this.clientProvider.createClient(newCluster);
170+
c.getWorkspaces(new GetWorkspacesRequest(), (err: any) => {
171+
if (err) {
172+
reject(
173+
new GRPCError(
174+
grpc.status.FAILED_PRECONDITION,
175+
`cannot reach ${req.url}: ${err.message}`,
176+
),
177+
);
178+
} else {
179+
resolve();
180+
}
181+
});
182+
});
183+
}
154184

155185
await this.clusterDB.save(newCluster);
156186
log.info({}, "cluster registered", { cluster: req.name });
@@ -433,8 +463,11 @@ export class ClusterSyncService {
433463

434464
protected timer: NodeJS.Timer;
435465

436-
public start() {
437-
this.timer = setInterval(() => this.reconcile(), this.config.clusterSyncIntervalSeconds * 1000);
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+
}
438471
}
439472

440473
private async reconcile() {
@@ -453,8 +486,11 @@ export class ClusterSyncService {
453486
log.debug("done reconciling workspace classes");
454487
}
455488

456-
public stop() {
457-
clearInterval(this.timer);
489+
public async stop() {
490+
const enabled = await getExperimentsClientForBackend().getValueAsync("workspace_classes_backend", false, {});
491+
if (enabled) {
492+
clearInterval(this.timer);
493+
}
458494
}
459495
}
460496

install/installer/pkg/common/common.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,27 @@ func DatabaseEnv(cfg *config.Config) (res []corev1.EnvVar) {
263263
return envvars
264264
}
265265

266+
func ConfigcatEnv(ctx *RenderContext) []corev1.EnvVar {
267+
var sdkKey string
268+
_ = ctx.WithExperimental(func(cfg *experimental.Config) error {
269+
if cfg.WebApp != nil && cfg.WebApp.ConfigcatKey != "" {
270+
sdkKey = cfg.WebApp.ConfigcatKey
271+
}
272+
return nil
273+
})
274+
275+
if sdkKey == "" {
276+
return nil
277+
}
278+
279+
return []corev1.EnvVar{
280+
{
281+
Name: "CONFIGCAT_SDK_KEY",
282+
Value: sdkKey,
283+
},
284+
}
285+
}
286+
266287
func DatabaseWaiterContainer(ctx *RenderContext) *corev1.Container {
267288
return &corev1.Container{
268289
Name: "database-waiter",

install/installer/pkg/components/server/deployment.go

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
7777
common.WebappTracingEnv(ctx),
7878
common.AnalyticsEnv(&ctx.Config),
7979
common.MessageBusEnv(&ctx.Config),
80-
configcatEnv(ctx),
80+
common.ConfigcatEnv(ctx),
8181
[]corev1.EnvVar{
8282
{
8383
Name: "CONFIG_PATH",
@@ -402,24 +402,3 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
402402
},
403403
}, nil
404404
}
405-
406-
func configcatEnv(ctx *common.RenderContext) []corev1.EnvVar {
407-
var sdkKey string
408-
_ = ctx.WithExperimental(func(cfg *experimental.Config) error {
409-
if cfg.WebApp != nil && cfg.WebApp.ConfigcatKey != "" {
410-
sdkKey = cfg.WebApp.ConfigcatKey
411-
}
412-
return nil
413-
})
414-
415-
if sdkKey == "" {
416-
return nil
417-
}
418-
419-
return []corev1.EnvVar{
420-
{
421-
Name: "CONFIGCAT_SDK_KEY",
422-
Value: sdkKey,
423-
},
424-
}
425-
}

install/installer/pkg/components/ws-manager-bridge/deployment.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
130130
common.AnalyticsEnv(&ctx.Config),
131131
common.MessageBusEnv(&ctx.Config),
132132
common.DatabaseEnv(&ctx.Config),
133+
common.ConfigcatEnv(ctx),
133134
[]corev1.EnvVar{{
134135
Name: "WSMAN_BRIDGE_CONFIGPATH",
135136
Value: "/config/ws-manager-bridge.json",

0 commit comments

Comments
 (0)