Enable running cypress tests with dendrite & pinecone (#10418)
This commit is contained in:
parent
065e970325
commit
d33e416fc7
2 changed files with 41 additions and 12 deletions
|
@ -32,14 +32,16 @@ import { HomeserverConfig, HomeserverInstance } from "../utils/homeserver";
|
||||||
|
|
||||||
const dendrites = new Map<string, HomeserverInstance>();
|
const dendrites = new Map<string, HomeserverInstance>();
|
||||||
|
|
||||||
|
const dockerConfigDir = "/etc/dendrite/";
|
||||||
|
const dendriteConfigFile = "dendrite.yaml";
|
||||||
|
|
||||||
function randB64Bytes(numBytes: number): string {
|
function randB64Bytes(numBytes: number): string {
|
||||||
return crypto.randomBytes(numBytes).toString("base64").replace(/=*$/, "");
|
return crypto.randomBytes(numBytes).toString("base64").replace(/=*$/, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cfgDirFromTemplate(template: string): Promise<HomeserverConfig> {
|
async function cfgDirFromTemplate(template: string, dendriteImage: string): Promise<HomeserverConfig> {
|
||||||
template = "default";
|
template = "default";
|
||||||
const templateDir = path.join(__dirname, "templates", template);
|
const templateDir = path.join(__dirname, "templates", template);
|
||||||
const configFile = "dendrite.yaml";
|
|
||||||
|
|
||||||
const stats = await fse.stat(templateDir);
|
const stats = await fse.stat(templateDir);
|
||||||
if (!stats?.isDirectory) {
|
if (!stats?.isDirectory) {
|
||||||
|
@ -49,7 +51,7 @@ async function cfgDirFromTemplate(template: string): Promise<HomeserverConfig> {
|
||||||
|
|
||||||
// copy the contents of the template dir, omitting homeserver.yaml as we'll template that
|
// copy the contents of the template dir, omitting homeserver.yaml as we'll template that
|
||||||
console.log(`Copy ${templateDir} -> ${tempDir}`);
|
console.log(`Copy ${templateDir} -> ${tempDir}`);
|
||||||
await fse.copy(templateDir, tempDir, { filter: (f) => path.basename(f) !== configFile });
|
await fse.copy(templateDir, tempDir, { filter: (f) => path.basename(f) !== dendriteConfigFile });
|
||||||
|
|
||||||
const registrationSecret = randB64Bytes(16);
|
const registrationSecret = randB64Bytes(16);
|
||||||
|
|
||||||
|
@ -57,13 +59,13 @@ async function cfgDirFromTemplate(template: string): Promise<HomeserverConfig> {
|
||||||
const baseUrl = `http://localhost:${port}`;
|
const baseUrl = `http://localhost:${port}`;
|
||||||
|
|
||||||
// now copy homeserver.yaml, applying substitutions
|
// now copy homeserver.yaml, applying substitutions
|
||||||
console.log(`Gen ${path.join(templateDir, configFile)}`);
|
console.log(`Gen ${path.join(templateDir, dendriteConfigFile)}`);
|
||||||
let hsYaml = await fse.readFile(path.join(templateDir, configFile), "utf8");
|
let hsYaml = await fse.readFile(path.join(templateDir, dendriteConfigFile), "utf8");
|
||||||
hsYaml = hsYaml.replace(/{{REGISTRATION_SECRET}}/g, registrationSecret);
|
hsYaml = hsYaml.replace(/{{REGISTRATION_SECRET}}/g, registrationSecret);
|
||||||
await fse.writeFile(path.join(tempDir, configFile), hsYaml);
|
await fse.writeFile(path.join(tempDir, dendriteConfigFile), hsYaml);
|
||||||
|
|
||||||
await dockerRun({
|
await dockerRun({
|
||||||
image: "matrixdotorg/dendrite-monolith:main",
|
image: dendriteImage,
|
||||||
params: ["--rm", "--entrypoint=", "-v", `${tempDir}:/mnt`],
|
params: ["--rm", "--entrypoint=", "-v", `${tempDir}:/mnt`],
|
||||||
containerName: `react-sdk-cypress-dendrite-keygen`,
|
containerName: `react-sdk-cypress-dendrite-keygen`,
|
||||||
cmd: ["/usr/bin/generate-keys", "-private-key", "/mnt/matrix_key.pem"],
|
cmd: ["/usr/bin/generate-keys", "-private-key", "/mnt/matrix_key.pem"],
|
||||||
|
@ -81,23 +83,40 @@ async function cfgDirFromTemplate(template: string): Promise<HomeserverConfig> {
|
||||||
// one of the templates in the cypress/plugins/dendritedocker/templates
|
// one of the templates in the cypress/plugins/dendritedocker/templates
|
||||||
// directory
|
// directory
|
||||||
async function dendriteStart(template: string): Promise<HomeserverInstance> {
|
async function dendriteStart(template: string): Promise<HomeserverInstance> {
|
||||||
const denCfg = await cfgDirFromTemplate(template);
|
return containerStart(template, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start a dendrite instance using pinecone routing: the template must be the name of
|
||||||
|
// one of the templates in the cypress/plugins/dendritedocker/templates
|
||||||
|
// directory
|
||||||
|
async function dendritePineconeStart(template: string): Promise<HomeserverInstance> {
|
||||||
|
return containerStart(template, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function containerStart(template: string, usePinecone: boolean): Promise<HomeserverInstance> {
|
||||||
|
let dendriteImage = "matrixdotorg/dendrite-monolith:main";
|
||||||
|
let dendriteEntrypoint = "/usr/bin/dendrite-monolith-server";
|
||||||
|
if (usePinecone) {
|
||||||
|
dendriteImage = "matrixdotorg/dendrite-demo-pinecone:main";
|
||||||
|
dendriteEntrypoint = "/usr/bin/dendrite-demo-pinecone";
|
||||||
|
}
|
||||||
|
const denCfg = await cfgDirFromTemplate(template, dendriteImage);
|
||||||
|
|
||||||
console.log(`Starting dendrite with config dir ${denCfg.configDir}...`);
|
console.log(`Starting dendrite with config dir ${denCfg.configDir}...`);
|
||||||
|
|
||||||
const dendriteId = await dockerRun({
|
const dendriteId = await dockerRun({
|
||||||
image: "matrixdotorg/dendrite-monolith:main",
|
image: dendriteImage,
|
||||||
params: [
|
params: [
|
||||||
"--rm",
|
"--rm",
|
||||||
"-v",
|
"-v",
|
||||||
`${denCfg.configDir}:/etc/dendrite`,
|
`${denCfg.configDir}:` + dockerConfigDir,
|
||||||
"-p",
|
"-p",
|
||||||
`${denCfg.port}:8008/tcp`,
|
`${denCfg.port}:8008/tcp`,
|
||||||
"--entrypoint",
|
"--entrypoint",
|
||||||
"/usr/bin/dendrite-monolith-server",
|
dendriteEntrypoint,
|
||||||
],
|
],
|
||||||
containerName: `react-sdk-cypress-dendrite`,
|
containerName: `react-sdk-cypress-dendrite`,
|
||||||
cmd: ["--really-enable-open-registration", "true", "run"],
|
cmd: ["--config", dockerConfigDir + dendriteConfigFile, "--really-enable-open-registration", "true", "run"],
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`Started dendrite with id ${dendriteId} on port ${denCfg.port}.`);
|
console.log(`Started dendrite with id ${dendriteId} on port ${denCfg.port}.`);
|
||||||
|
@ -152,6 +171,10 @@ async function dendriteStop(id: string): Promise<void> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function dendritePineconeStop(id: string): Promise<void> {
|
||||||
|
return dendriteStop(id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {Cypress.PluginConfig}
|
* @type {Cypress.PluginConfig}
|
||||||
*/
|
*/
|
||||||
|
@ -159,6 +182,8 @@ export function dendriteDocker(on: PluginEvents, config: PluginConfigOptions) {
|
||||||
on("task", {
|
on("task", {
|
||||||
dendriteStart,
|
dendriteStart,
|
||||||
dendriteStop,
|
dendriteStop,
|
||||||
|
dendritePineconeStart,
|
||||||
|
dendritePineconeStop,
|
||||||
});
|
});
|
||||||
|
|
||||||
on("after:spec", async (spec) => {
|
on("after:spec", async (spec) => {
|
||||||
|
|
|
@ -346,6 +346,10 @@ key_server:
|
||||||
database:
|
database:
|
||||||
connection_string: file:dendrite-keyserverapi.db
|
connection_string: file:dendrite-keyserverapi.db
|
||||||
|
|
||||||
|
relay_api:
|
||||||
|
database:
|
||||||
|
connection_string: file:dendrite-relayapi.db
|
||||||
|
|
||||||
# Configuration for Opentracing.
|
# Configuration for Opentracing.
|
||||||
# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on
|
# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on
|
||||||
# how this works and how to set it up.
|
# how this works and how to set it up.
|
||||||
|
|
Loading…
Reference in a new issue