Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/ws-manager-bridge/src/container-module.ts
2498 views
1
/**
2
* Copyright (c) 2020 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
require("reflect-metadata");
8
9
import { ContainerModule } from "inversify";
10
import { Configuration } from "./config";
11
import * as fs from "fs";
12
import { WorkspaceManagerBridgeFactory, WorkspaceManagerBridge } from "./bridge";
13
import { Metrics } from "./metrics";
14
import { BridgeController, WorkspaceManagerClientProviderConfigSource } from "./bridge-controller";
15
import { filePathTelepresenceAware } from "@gitpod/gitpod-protocol/lib/env";
16
import {
17
WorkspaceManagerClientProvider,
18
IWorkspaceManagerClientCallMetrics,
19
} from "@gitpod/ws-manager/lib/client-provider";
20
import {
21
WorkspaceManagerClientProviderCompositeSource,
22
WorkspaceManagerClientProviderDBSource,
23
WorkspaceManagerClientProviderSource,
24
} from "@gitpod/ws-manager/lib/client-provider-source";
25
import { ClusterService, ClusterServiceServer } from "./cluster-service-server";
26
import { IAnalyticsWriter } from "@gitpod/gitpod-protocol/lib/analytics";
27
import { newAnalyticsWriterFromEnv } from "@gitpod/gitpod-protocol/lib/util/analytics";
28
import { IClientCallMetrics } from "@gitpod/gitpod-protocol/lib/util/grpc";
29
import { PrometheusClientCallMetrics } from "@gitpod/gitpod-protocol/lib/messaging/client-call-metrics";
30
import { PrebuildStateMapper } from "./prebuild-state-mapper";
31
import { DebugApp } from "@gitpod/gitpod-protocol/lib/util/debug-app";
32
import { Client as ExperimentsClient } from "@gitpod/gitpod-protocol/lib/experiments/types";
33
import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";
34
import { WorkspaceInstanceController, WorkspaceInstanceControllerImpl } from "./workspace-instance-controller";
35
import { AppClusterWorkspaceInstancesController } from "./app-cluster-instance-controller";
36
import { PrebuildUpdater } from "./prebuild-updater";
37
import { Redis } from "ioredis";
38
import { RedisPublisher, newRedisClient } from "@gitpod/gitpod-db/lib";
39
40
export const containerModule = new ContainerModule((bind) => {
41
bind(BridgeController).toSelf().inSingletonScope();
42
43
bind(PrometheusClientCallMetrics).toSelf().inSingletonScope();
44
bind(IClientCallMetrics).to(PrometheusClientCallMetrics).inSingletonScope();
45
bind(IWorkspaceManagerClientCallMetrics).toService(IClientCallMetrics);
46
47
bind(WorkspaceManagerClientProvider).toSelf().inSingletonScope();
48
bind(WorkspaceManagerClientProviderCompositeSource).toSelf().inSingletonScope();
49
bind(WorkspaceManagerClientProviderSource).to(WorkspaceManagerClientProviderConfigSource).inSingletonScope();
50
bind(WorkspaceManagerClientProviderSource).to(WorkspaceManagerClientProviderDBSource).inSingletonScope();
51
52
bind(WorkspaceManagerBridge).toSelf().inRequestScope();
53
bind(WorkspaceManagerBridgeFactory).toAutoFactory(WorkspaceManagerBridge);
54
55
bind(ClusterServiceServer).toSelf().inSingletonScope();
56
bind(ClusterService).toSelf().inRequestScope();
57
58
bind(Metrics).toSelf().inSingletonScope();
59
60
bind(Configuration)
61
.toDynamicValue((ctx) => {
62
let cfgPath = process.env.WSMAN_BRIDGE_CONFIGPATH;
63
if (!cfgPath) {
64
throw new Error("No WSMAN_BRIDGE_CONFIGPATH env var set - cannot start without config!");
65
}
66
cfgPath = filePathTelepresenceAware(cfgPath);
67
68
const cfg = fs.readFileSync(cfgPath);
69
const result = JSON.parse(cfg.toString());
70
return result;
71
})
72
.inSingletonScope();
73
74
bind(IAnalyticsWriter).toDynamicValue(newAnalyticsWriterFromEnv).inSingletonScope();
75
76
bind(PrebuildStateMapper).toSelf().inSingletonScope();
77
bind(PrebuildUpdater).toSelf().inSingletonScope();
78
79
bind(DebugApp).toSelf().inSingletonScope();
80
81
bind(ExperimentsClient).toDynamicValue(getExperimentsClientForBackend).inSingletonScope();
82
83
// transient to make sure we're creating a separate instance every time we ask for it
84
bind(WorkspaceInstanceController).to(WorkspaceInstanceControllerImpl).inTransientScope();
85
86
bind(AppClusterWorkspaceInstancesController).toSelf().inSingletonScope();
87
88
bind(Redis).toDynamicValue((ctx) => {
89
const config = ctx.container.get<Configuration>(Configuration);
90
const [host, port] = config.redis.address.split(":");
91
const username = process.env.REDIS_USERNAME;
92
const password = process.env.REDIS_PASSWORD;
93
return newRedisClient({ host, port: Number(port), connectionName: "server", username, password });
94
});
95
bind(RedisPublisher).toSelf().inSingletonScope();
96
});
97
98