Switch to TestContainers for manging services in Playwright (#28860)
* Switch to TestContainers for manging services in Playwright Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Flip fixture dependency order Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove mas dep Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update matrix-authentication-service in Playwright tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix SMTP port Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Comments Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Strip ansi from playwright logs to make them more readable Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Actually do the update Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove access to homeserver.config.baseUrl field in favour of homeserver.baseUrl Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Use sane default_server_config and specify server.invalid in the specific tests which demand it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix mas run Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * break cycle Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * typo Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * prettier Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Wire up basics of dendriteHomeserver Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
@@ -0,0 +1,266 @@
|
||||
/*
|
||||
Copyright 2024 New Vector Ltd.
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { GenericContainer, Wait } from "testcontainers";
|
||||
import { APIRequestContext } from "@playwright/test";
|
||||
import * as YAML from "yaml";
|
||||
import { set } from "lodash";
|
||||
|
||||
import { randB64Bytes } from "../plugins/utils/rand.ts";
|
||||
import { StartedSynapseContainer } from "./synapse.ts";
|
||||
import { deepCopy } from "../plugins/utils/object.ts";
|
||||
import { HomeserverContainer } from "./HomeserverContainer.ts";
|
||||
|
||||
const DEFAULT_CONFIG = {
|
||||
version: 2,
|
||||
global: {
|
||||
server_name: "localhost",
|
||||
private_key: "matrix_key.pem",
|
||||
old_private_keys: null,
|
||||
key_validity_period: "168h0m0s",
|
||||
cache: {
|
||||
max_size_estimated: "1gb",
|
||||
max_age: "1h",
|
||||
},
|
||||
well_known_server_name: "",
|
||||
well_known_client_name: "",
|
||||
trusted_third_party_id_servers: ["matrix.org", "vector.im"],
|
||||
disable_federation: false,
|
||||
presence: {
|
||||
enable_inbound: false,
|
||||
enable_outbound: false,
|
||||
},
|
||||
report_stats: {
|
||||
enabled: false,
|
||||
endpoint: "https://matrix.org/report-usage-stats/push",
|
||||
},
|
||||
server_notices: {
|
||||
enabled: false,
|
||||
local_part: "_server",
|
||||
display_name: "Server Alerts",
|
||||
avatar_url: "",
|
||||
room_name: "Server Alerts",
|
||||
},
|
||||
jetstream: {
|
||||
addresses: null,
|
||||
disable_tls_validation: false,
|
||||
storage_path: "./",
|
||||
topic_prefix: "Dendrite",
|
||||
},
|
||||
metrics: {
|
||||
enabled: false,
|
||||
basic_auth: {
|
||||
username: "metrics",
|
||||
password: "metrics",
|
||||
},
|
||||
},
|
||||
dns_cache: {
|
||||
enabled: false,
|
||||
cache_size: 256,
|
||||
cache_lifetime: "5m",
|
||||
},
|
||||
},
|
||||
app_service_api: {
|
||||
disable_tls_validation: false,
|
||||
config_files: null,
|
||||
},
|
||||
client_api: {
|
||||
registration_disabled: false,
|
||||
guests_disabled: true,
|
||||
registration_shared_secret: "secret",
|
||||
enable_registration_captcha: false,
|
||||
recaptcha_public_key: "",
|
||||
recaptcha_private_key: "",
|
||||
recaptcha_bypass_secret: "",
|
||||
turn: {
|
||||
turn_user_lifetime: "5m",
|
||||
turn_uris: null,
|
||||
turn_shared_secret: "",
|
||||
},
|
||||
rate_limiting: {
|
||||
enabled: true,
|
||||
threshold: 20,
|
||||
cooloff_ms: 500,
|
||||
exempt_user_ids: null,
|
||||
},
|
||||
},
|
||||
federation_api: {
|
||||
send_max_retries: 16,
|
||||
disable_tls_validation: false,
|
||||
disable_http_keepalives: false,
|
||||
key_perspectives: [
|
||||
{
|
||||
server_name: "matrix.org",
|
||||
keys: [
|
||||
{
|
||||
key_id: "ed25519:auto",
|
||||
public_key: "Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw",
|
||||
},
|
||||
{
|
||||
key_id: "ed25519:a_RXGa",
|
||||
public_key: "l8Hft5qXKn1vfHrg3p4+W8gELQVo8N13JkluMfmn2sQ",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
prefer_direct_fetch: false,
|
||||
database: {
|
||||
connection_string: "file:dendrite-federationapi.db",
|
||||
},
|
||||
},
|
||||
media_api: {
|
||||
base_path: "./media_store",
|
||||
max_file_size_bytes: 10485760,
|
||||
dynamic_thumbnails: false,
|
||||
max_thumbnail_generators: 10,
|
||||
thumbnail_sizes: [
|
||||
{
|
||||
width: 32,
|
||||
height: 32,
|
||||
method: "crop",
|
||||
},
|
||||
{
|
||||
width: 96,
|
||||
height: 96,
|
||||
method: "crop",
|
||||
},
|
||||
{
|
||||
width: 640,
|
||||
height: 480,
|
||||
method: "scale",
|
||||
},
|
||||
],
|
||||
database: {
|
||||
connection_string: "file:dendrite-mediaapi.db",
|
||||
},
|
||||
},
|
||||
mscs: {
|
||||
mscs: null,
|
||||
database: {
|
||||
connection_string: "file:dendrite-msc.db",
|
||||
},
|
||||
},
|
||||
sync_api: {
|
||||
search: {
|
||||
enabled: false,
|
||||
index_path: "./searchindex",
|
||||
language: "en",
|
||||
},
|
||||
database: {
|
||||
connection_string: "file:dendrite-syncapi.db",
|
||||
},
|
||||
},
|
||||
user_api: {
|
||||
bcrypt_cost: 10,
|
||||
auto_join_rooms: null,
|
||||
account_database: {
|
||||
connection_string: "file:dendrite-userapi.db",
|
||||
},
|
||||
},
|
||||
room_server: {
|
||||
database: {
|
||||
connection_string: "file:dendrite-roomserverapi.db",
|
||||
},
|
||||
},
|
||||
key_server: {
|
||||
database: {
|
||||
connection_string: "file:dendrite-keyserverapi.db",
|
||||
},
|
||||
},
|
||||
relay_api: {
|
||||
database: {
|
||||
connection_string: "file:dendrite-relayapi.db",
|
||||
},
|
||||
},
|
||||
tracing: {
|
||||
enabled: false,
|
||||
jaeger: {
|
||||
serviceName: "",
|
||||
disabled: false,
|
||||
rpc_metrics: false,
|
||||
tags: [],
|
||||
sampler: null,
|
||||
reporter: null,
|
||||
headers: null,
|
||||
baggage_restrictions: null,
|
||||
throttler: null,
|
||||
},
|
||||
},
|
||||
logging: [
|
||||
{
|
||||
type: "std",
|
||||
level: "debug",
|
||||
},
|
||||
{
|
||||
type: "file",
|
||||
level: "debug",
|
||||
params: {
|
||||
path: "./logs",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export class DendriteContainer extends GenericContainer implements HomeserverContainer<typeof DEFAULT_CONFIG> {
|
||||
private config: typeof DEFAULT_CONFIG;
|
||||
|
||||
constructor(
|
||||
private request: APIRequestContext,
|
||||
image = "matrixdotorg/dendrite-monolith:main",
|
||||
binary = "/usr/bin/dendrite",
|
||||
) {
|
||||
super(image);
|
||||
|
||||
this.config = deepCopy(DEFAULT_CONFIG);
|
||||
this.config.client_api.registration_shared_secret = randB64Bytes(16);
|
||||
|
||||
this.withEntrypoint(["/bin/sh"])
|
||||
.withCommand([
|
||||
"-c",
|
||||
`/usr/bin/generate-keys -private-key /etc/dendrite/matrix_key.pem && ${binary} --config /etc/dendrite/dendrite.yaml --really-enable-open-registration true run`,
|
||||
])
|
||||
.withExposedPorts(8008)
|
||||
.withWaitStrategy(Wait.forHttp("/_matrix/client/versions", 8008));
|
||||
}
|
||||
|
||||
public withConfigField(key: string, value: any): this {
|
||||
set(this.config, key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public withConfig(config: Partial<typeof DEFAULT_CONFIG>): this {
|
||||
this.config = {
|
||||
...this.config,
|
||||
...config,
|
||||
};
|
||||
return this;
|
||||
}
|
||||
|
||||
public override async start(): Promise<StartedSynapseContainer> {
|
||||
this.withCopyContentToContainer([
|
||||
{
|
||||
target: "/etc/dendrite/dendrite.yaml",
|
||||
content: YAML.stringify(this.config),
|
||||
},
|
||||
]);
|
||||
|
||||
const container = await super.start();
|
||||
// Surprisingly, Dendrite implements the same register user Admin API Synapse, so we can just extend it
|
||||
return new StartedSynapseContainer(
|
||||
container,
|
||||
`http://${container.getHost()}:${container.getMappedPort(8008)}`,
|
||||
this.config.client_api.registration_shared_secret,
|
||||
this.request,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class PineconeContainer extends DendriteContainer {
|
||||
constructor(request: APIRequestContext) {
|
||||
super(request, "matrixdotorg/dendrite-demo-pinecone:main", "/usr/bin/dendrite-demo-pinecone");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user