Path: blob/main/components/ws-manager-bridge/src/container-module.ts
2498 views
/**1* Copyright (c) 2020 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56require("reflect-metadata");78import { ContainerModule } from "inversify";9import { Configuration } from "./config";10import * as fs from "fs";11import { WorkspaceManagerBridgeFactory, WorkspaceManagerBridge } from "./bridge";12import { Metrics } from "./metrics";13import { BridgeController, WorkspaceManagerClientProviderConfigSource } from "./bridge-controller";14import { filePathTelepresenceAware } from "@gitpod/gitpod-protocol/lib/env";15import {16WorkspaceManagerClientProvider,17IWorkspaceManagerClientCallMetrics,18} from "@gitpod/ws-manager/lib/client-provider";19import {20WorkspaceManagerClientProviderCompositeSource,21WorkspaceManagerClientProviderDBSource,22WorkspaceManagerClientProviderSource,23} from "@gitpod/ws-manager/lib/client-provider-source";24import { ClusterService, ClusterServiceServer } from "./cluster-service-server";25import { IAnalyticsWriter } from "@gitpod/gitpod-protocol/lib/analytics";26import { newAnalyticsWriterFromEnv } from "@gitpod/gitpod-protocol/lib/util/analytics";27import { IClientCallMetrics } from "@gitpod/gitpod-protocol/lib/util/grpc";28import { PrometheusClientCallMetrics } from "@gitpod/gitpod-protocol/lib/messaging/client-call-metrics";29import { PrebuildStateMapper } from "./prebuild-state-mapper";30import { DebugApp } from "@gitpod/gitpod-protocol/lib/util/debug-app";31import { Client as ExperimentsClient } from "@gitpod/gitpod-protocol/lib/experiments/types";32import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server";33import { WorkspaceInstanceController, WorkspaceInstanceControllerImpl } from "./workspace-instance-controller";34import { AppClusterWorkspaceInstancesController } from "./app-cluster-instance-controller";35import { PrebuildUpdater } from "./prebuild-updater";36import { Redis } from "ioredis";37import { RedisPublisher, newRedisClient } from "@gitpod/gitpod-db/lib";3839export const containerModule = new ContainerModule((bind) => {40bind(BridgeController).toSelf().inSingletonScope();4142bind(PrometheusClientCallMetrics).toSelf().inSingletonScope();43bind(IClientCallMetrics).to(PrometheusClientCallMetrics).inSingletonScope();44bind(IWorkspaceManagerClientCallMetrics).toService(IClientCallMetrics);4546bind(WorkspaceManagerClientProvider).toSelf().inSingletonScope();47bind(WorkspaceManagerClientProviderCompositeSource).toSelf().inSingletonScope();48bind(WorkspaceManagerClientProviderSource).to(WorkspaceManagerClientProviderConfigSource).inSingletonScope();49bind(WorkspaceManagerClientProviderSource).to(WorkspaceManagerClientProviderDBSource).inSingletonScope();5051bind(WorkspaceManagerBridge).toSelf().inRequestScope();52bind(WorkspaceManagerBridgeFactory).toAutoFactory(WorkspaceManagerBridge);5354bind(ClusterServiceServer).toSelf().inSingletonScope();55bind(ClusterService).toSelf().inRequestScope();5657bind(Metrics).toSelf().inSingletonScope();5859bind(Configuration)60.toDynamicValue((ctx) => {61let cfgPath = process.env.WSMAN_BRIDGE_CONFIGPATH;62if (!cfgPath) {63throw new Error("No WSMAN_BRIDGE_CONFIGPATH env var set - cannot start without config!");64}65cfgPath = filePathTelepresenceAware(cfgPath);6667const cfg = fs.readFileSync(cfgPath);68const result = JSON.parse(cfg.toString());69return result;70})71.inSingletonScope();7273bind(IAnalyticsWriter).toDynamicValue(newAnalyticsWriterFromEnv).inSingletonScope();7475bind(PrebuildStateMapper).toSelf().inSingletonScope();76bind(PrebuildUpdater).toSelf().inSingletonScope();7778bind(DebugApp).toSelf().inSingletonScope();7980bind(ExperimentsClient).toDynamicValue(getExperimentsClientForBackend).inSingletonScope();8182// transient to make sure we're creating a separate instance every time we ask for it83bind(WorkspaceInstanceController).to(WorkspaceInstanceControllerImpl).inTransientScope();8485bind(AppClusterWorkspaceInstancesController).toSelf().inSingletonScope();8687bind(Redis).toDynamicValue((ctx) => {88const config = ctx.container.get<Configuration>(Configuration);89const [host, port] = config.redis.address.split(":");90const username = process.env.REDIS_USERNAME;91const password = process.env.REDIS_PASSWORD;92return newRedisClient({ host, port: Number(port), connectionName: "server", username, password });93});94bind(RedisPublisher).toSelf().inSingletonScope();95});969798