Files
Minikura/packages/k8s-operator/src/controllers/server-controller.ts
T

107 lines
3.4 KiB
TypeScript
Raw Normal View History

2026-02-17 18:12:02 +07:00
import type { CustomEnvironmentVariable, Server } from "@minikura/db";
2026-01-16 12:32:36 +07:00
import { createServer, deleteServer } from "../resources/server";
2026-02-17 18:12:02 +07:00
import type { ServerConfig } from "../types";
import { BaseController } from "./base-controller";
2025-05-12 12:34:09 +07:00
type ServerWithEnvVars = Server & {
env_variables: CustomEnvironmentVariable[];
};
export class ServerController extends BaseController {
private deployedServers = new Map<string, ServerWithEnvVars>();
protected getControllerName(): string {
2026-01-16 12:32:36 +07:00
return "ServerController";
2025-05-12 12:34:09 +07:00
}
protected async syncResources(): Promise<void> {
try {
const appsApi = this.k8sClient.getAppsApi();
const coreApi = this.k8sClient.getCoreApi();
const networkingApi = this.k8sClient.getNetworkingApi();
2026-01-16 12:32:36 +07:00
const servers = (await this.prisma.server.findMany({
2025-05-12 12:34:09 +07:00
include: {
env_variables: true,
2026-01-16 12:32:36 +07:00
},
})) as ServerWithEnvVars[];
const currentServerIds = new Set(servers.map((server) => server.id));
2025-05-12 12:34:09 +07:00
for (const [serverId, server] of this.deployedServers.entries()) {
if (!currentServerIds.has(serverId)) {
2026-02-17 18:12:02 +07:00
this.logger.info(
{ serverId, serverName: server.id },
"Server removed from database, deleting K8s resources"
2026-01-16 12:32:36 +07:00
);
2026-02-13 15:52:13 +07:00
await deleteServer(serverId, appsApi, coreApi, this.namespace);
2025-05-12 12:34:09 +07:00
this.deployedServers.delete(serverId);
}
}
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
for (const server of servers) {
const deployedServer = this.deployedServers.get(server.id);
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
if (!deployedServer || this.hasServerChanged(deployedServer, server)) {
2026-02-17 18:12:02 +07:00
const action = !deployedServer ? "Creating" : "Updating";
this.logger.info(
{
serverId: server.id,
serverType: server.type,
action: action.toLowerCase(),
memory: server.memory,
port: server.listen_port,
},
`${action} Minecraft server in Kubernetes`
2026-01-16 12:32:36 +07:00
);
2025-05-12 12:34:09 +07:00
const serverConfig: ServerConfig = {
id: server.id,
type: server.type,
apiKey: server.api_key,
description: server.description,
listen_port: server.listen_port,
memory: server.memory,
2026-02-17 18:12:02 +07:00
service_type: server.service_type,
2026-01-16 12:32:36 +07:00
env_variables: server.env_variables?.map((ev) => ({
2025-05-12 12:34:09 +07:00
key: ev.key,
2026-01-16 12:32:36 +07:00
value: ev.value,
})),
2025-05-12 12:34:09 +07:00
};
2026-01-16 12:32:36 +07:00
await createServer(serverConfig, appsApi, coreApi, networkingApi, this.namespace);
2025-05-12 12:34:09 +07:00
this.deployedServers.set(server.id, { ...server });
}
}
} catch (error) {
2026-02-17 18:12:02 +07:00
this.logger.error({ err: error }, "Failed to sync servers to Kubernetes");
2025-05-12 12:34:09 +07:00
throw error;
}
}
2026-01-16 12:32:36 +07:00
private hasServerChanged(oldServer: ServerWithEnvVars, newServer: ServerWithEnvVars): boolean {
const basicPropsChanged =
2025-05-12 12:34:09 +07:00
oldServer.type !== newServer.type ||
oldServer.listen_port !== newServer.listen_port ||
2026-02-17 18:12:02 +07:00
oldServer.description !== newServer.description ||
oldServer.service_type !== newServer.service_type;
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
if (basicPropsChanged) return true;
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
const oldEnvVars = oldServer.env_variables || [];
const newEnvVars = newServer.env_variables || [];
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
if (oldEnvVars.length !== newEnvVars.length) return true;
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
for (const newEnv of newEnvVars) {
2026-01-16 12:32:36 +07:00
const oldEnv = oldEnvVars.find((e) => e.key === newEnv.key);
2025-05-12 12:34:09 +07:00
if (!oldEnv || oldEnv.value !== newEnv.value) {
return true;
}
}
2026-01-16 12:32:36 +07:00
2025-05-12 12:34:09 +07:00
return false;
}
2026-01-16 12:32:36 +07:00
}