testcontainers 8.10.0-beta.0 → 8.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/dockerfile-parser.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -1
- package/dist/modules/nats/nats-container.d.ts +55 -0
- package/dist/modules/nats/nats-container.js +98 -0
- package/dist/port-forwarder.js +4 -1
- package/dist/reaper.js +2 -2
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -41,6 +41,7 @@ The following environment variables are supported:
|
|
|
41
41
|
- `TESTCONTAINERS_RYUK_PRIVILEGED=true` Run [ryuk](#ryuk) as a privileged container
|
|
42
42
|
- `TESTCONTAINERS_RYUK_DISABLED=true` Disable [ryuk](#ryuk)
|
|
43
43
|
- `TESTCONTAINERS_RYUK_PORT=65515` Explicitly set [ryuk](#ryuk) host port (not recommended)
|
|
44
|
+
- `TESTCONTAINERS_SSHD_PORT=65515` Explicitly set [SSHd](#SSHd) host port (not recommended)
|
|
44
45
|
- `RYUK_CONTAINER_IMAGE=registry.mycompany.com/mirror/ryuk:0.3.0` Custom image for [ryuk](#ryuk)
|
|
45
46
|
- `SSHD_CONTAINER_IMAGE=registry.mycompany.com/mirror/sshd:1.0.0` Custom image for [SSHd](#SSHd)
|
|
46
47
|
|
|
@@ -20,8 +20,8 @@ const getDockerfileImages = (dockerfile) => __awaiter(void 0, void 0, void 0, fu
|
|
|
20
20
|
.split(os_1.EOL)
|
|
21
21
|
.filter((line) => line.toUpperCase().startsWith("FROM"))
|
|
22
22
|
.map((line) => {
|
|
23
|
-
const parts = line.split(" ");
|
|
24
|
-
return parts[
|
|
23
|
+
const parts = line.split(" ").filter((part) => part !== "");
|
|
24
|
+
return parts[1];
|
|
25
25
|
})
|
|
26
26
|
.reduce((prev, next) => prev.add(next), new Set())
|
|
27
27
|
.values()).map((image) => docker_image_name_1.DockerImageName.fromString(image));
|
package/dist/index.d.ts
CHANGED
|
@@ -15,3 +15,4 @@ export { Neo4jContainer, StartedNeo4jContainer } from "./modules/neo4j/neo4j-con
|
|
|
15
15
|
export { ArangoDBContainer, StartedArangoContainer } from "./modules/arangodb/arangodb-container";
|
|
16
16
|
export { ElasticsearchContainer, StartedElasticsearchContainer } from "./modules/elasticsearch/elasticsearch-container";
|
|
17
17
|
export { MySqlContainer, StartedMySqlContainer } from "./modules/mysql/mysql-container";
|
|
18
|
+
export { NatsContainer, StartedNatsContainer, NatsConnectionOptions, NatsTlsOptions, } from "./modules/nats/nats-container";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StartedMySqlContainer = exports.MySqlContainer = exports.StartedElasticsearchContainer = exports.ElasticsearchContainer = exports.StartedArangoContainer = exports.ArangoDBContainer = exports.StartedNeo4jContainer = exports.Neo4jContainer = exports.StartedKafkaContainer = exports.KafkaContainer = exports.StartedPostgreSqlContainer = exports.PostgreSqlContainer = exports.AlwaysPullPolicy = exports.DefaultPullPolicy = exports.Wait = exports.StoppedNetwork = exports.StartedNetwork = exports.Network = exports.DownedDockerComposeEnvironment = exports.StoppedDockerComposeEnvironment = exports.StartedDockerComposeEnvironment = exports.DockerComposeEnvironment = exports.TestContainers = exports.GenericContainerBuilder = exports.GenericContainer = void 0;
|
|
3
|
+
exports.StartedNatsContainer = exports.NatsContainer = exports.StartedMySqlContainer = exports.MySqlContainer = exports.StartedElasticsearchContainer = exports.ElasticsearchContainer = exports.StartedArangoContainer = exports.ArangoDBContainer = exports.StartedNeo4jContainer = exports.Neo4jContainer = exports.StartedKafkaContainer = exports.KafkaContainer = exports.StartedPostgreSqlContainer = exports.PostgreSqlContainer = exports.AlwaysPullPolicy = exports.DefaultPullPolicy = exports.Wait = exports.StoppedNetwork = exports.StartedNetwork = exports.Network = exports.DownedDockerComposeEnvironment = exports.StoppedDockerComposeEnvironment = exports.StartedDockerComposeEnvironment = exports.DockerComposeEnvironment = exports.TestContainers = exports.GenericContainerBuilder = exports.GenericContainer = void 0;
|
|
4
4
|
var generic_container_1 = require("./generic-container/generic-container");
|
|
5
5
|
Object.defineProperty(exports, "GenericContainer", { enumerable: true, get: function () { return generic_container_1.GenericContainer; } });
|
|
6
6
|
var generic_container_builder_1 = require("./generic-container/generic-container-builder");
|
|
@@ -42,3 +42,6 @@ Object.defineProperty(exports, "StartedElasticsearchContainer", { enumerable: tr
|
|
|
42
42
|
var mysql_container_1 = require("./modules/mysql/mysql-container");
|
|
43
43
|
Object.defineProperty(exports, "MySqlContainer", { enumerable: true, get: function () { return mysql_container_1.MySqlContainer; } });
|
|
44
44
|
Object.defineProperty(exports, "StartedMySqlContainer", { enumerable: true, get: function () { return mysql_container_1.StartedMySqlContainer; } });
|
|
45
|
+
var nats_container_1 = require("./modules/nats/nats-container");
|
|
46
|
+
Object.defineProperty(exports, "NatsContainer", { enumerable: true, get: function () { return nats_container_1.NatsContainer; } });
|
|
47
|
+
Object.defineProperty(exports, "StartedNatsContainer", { enumerable: true, get: function () { return nats_container_1.StartedNatsContainer; } });
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { GenericContainer } from "../../generic-container/generic-container";
|
|
2
|
+
import { StartedTestContainer } from "../../test-container";
|
|
3
|
+
import { AbstractStartedContainer } from "../abstract-started-container";
|
|
4
|
+
export declare class NatsContainer extends GenericContainer {
|
|
5
|
+
private args;
|
|
6
|
+
constructor(image?: string);
|
|
7
|
+
withUser(user: string): this;
|
|
8
|
+
withPass(pass: string): this;
|
|
9
|
+
withArg(name: string, value: string): this;
|
|
10
|
+
private static ensureDashInFrontOfArgumentName;
|
|
11
|
+
start(): Promise<StartedNatsContainer>;
|
|
12
|
+
private getUser;
|
|
13
|
+
private getPass;
|
|
14
|
+
}
|
|
15
|
+
export declare class StartedNatsContainer extends AbstractStartedContainer {
|
|
16
|
+
readonly username: string;
|
|
17
|
+
readonly password: string;
|
|
18
|
+
private readonly connectionOptions;
|
|
19
|
+
constructor(startedTestContainer: StartedTestContainer, username: string, password: string);
|
|
20
|
+
getConnectionOptions(): NatsConnectionOptions;
|
|
21
|
+
}
|
|
22
|
+
export interface NatsConnectionOptions {
|
|
23
|
+
debug?: boolean;
|
|
24
|
+
maxPingOut?: number;
|
|
25
|
+
maxReconnectAttempts?: number;
|
|
26
|
+
name?: string;
|
|
27
|
+
noEcho?: boolean;
|
|
28
|
+
noRandomize?: boolean;
|
|
29
|
+
pass?: string;
|
|
30
|
+
pedantic?: boolean;
|
|
31
|
+
pingInterval?: number;
|
|
32
|
+
port?: number;
|
|
33
|
+
reconnect?: boolean;
|
|
34
|
+
reconnectDelayHandler?: () => number;
|
|
35
|
+
reconnectJitter?: number;
|
|
36
|
+
reconnectJitterTLS?: number;
|
|
37
|
+
reconnectTimeWait?: number;
|
|
38
|
+
servers?: Array<string> | string;
|
|
39
|
+
timeout?: number;
|
|
40
|
+
tls?: NatsTlsOptions;
|
|
41
|
+
token?: string;
|
|
42
|
+
user?: string;
|
|
43
|
+
verbose?: boolean;
|
|
44
|
+
waitOnFirstConnect?: boolean;
|
|
45
|
+
ignoreClusterUpdates?: boolean;
|
|
46
|
+
inboxPrefix?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface NatsTlsOptions {
|
|
49
|
+
certFile?: string;
|
|
50
|
+
cert?: string;
|
|
51
|
+
caFile?: string;
|
|
52
|
+
ca?: string;
|
|
53
|
+
keyFile?: string;
|
|
54
|
+
key?: string;
|
|
55
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.StartedNatsContainer = exports.NatsContainer = void 0;
|
|
13
|
+
const generic_container_1 = require("../../generic-container/generic-container");
|
|
14
|
+
const uuid_1 = require("../../uuid");
|
|
15
|
+
const abstract_started_container_1 = require("../abstract-started-container");
|
|
16
|
+
const wait_1 = require("../../wait");
|
|
17
|
+
const CLIENT_PORT = 4222;
|
|
18
|
+
const ROUTING_PORT_FOR_CLUSTERING = 6222;
|
|
19
|
+
const HTTP_MANAGEMENT_PORT = 8222;
|
|
20
|
+
const USER_ARGUMENT_KEY = "--user";
|
|
21
|
+
const PASS_ARGUMENT_KEY = "--pass";
|
|
22
|
+
class NatsContainer extends generic_container_1.GenericContainer {
|
|
23
|
+
constructor(image = "nats:2.8-alpine") {
|
|
24
|
+
super(image);
|
|
25
|
+
this.args = {};
|
|
26
|
+
this.args[USER_ARGUMENT_KEY] = new uuid_1.RandomUuid().nextUuid();
|
|
27
|
+
this.args[PASS_ARGUMENT_KEY] = new uuid_1.RandomUuid().nextUuid();
|
|
28
|
+
}
|
|
29
|
+
withUser(user) {
|
|
30
|
+
this.args[USER_ARGUMENT_KEY] = user;
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
withPass(pass) {
|
|
34
|
+
this.args[PASS_ARGUMENT_KEY] = pass;
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
withArg(name, value) {
|
|
38
|
+
name = NatsContainer.ensureDashInFrontOfArgumentName(name);
|
|
39
|
+
this.args[name] = value;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
static ensureDashInFrontOfArgumentName(name) {
|
|
43
|
+
if (name.startsWith("--") || name.startsWith("-")) {
|
|
44
|
+
return name;
|
|
45
|
+
}
|
|
46
|
+
if (name.length == 1) {
|
|
47
|
+
return "-" + name;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
return "--" + name;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
start() {
|
|
54
|
+
const _super = Object.create(null, {
|
|
55
|
+
start: { get: () => super.start }
|
|
56
|
+
});
|
|
57
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
+
function buildCmdsFromArgs(args) {
|
|
59
|
+
const result = [];
|
|
60
|
+
result.push("nats-server");
|
|
61
|
+
for (const argsKey in args) {
|
|
62
|
+
result.push(argsKey);
|
|
63
|
+
result.push(args[argsKey]);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
this.withCmd(buildCmdsFromArgs(this.args))
|
|
68
|
+
.withExposedPorts(...(this.hasExposedPorts ? this.ports : [CLIENT_PORT, ROUTING_PORT_FOR_CLUSTERING, HTTP_MANAGEMENT_PORT]))
|
|
69
|
+
.withWaitStrategy(wait_1.Wait.forLogMessage(new RegExp(".*Server is ready.*")))
|
|
70
|
+
.withStartupTimeout(120000);
|
|
71
|
+
return new StartedNatsContainer(yield _super.start.call(this), this.getUser(), this.getPass());
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
getUser() {
|
|
75
|
+
return this.args[USER_ARGUMENT_KEY];
|
|
76
|
+
}
|
|
77
|
+
getPass() {
|
|
78
|
+
return this.args[PASS_ARGUMENT_KEY];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.NatsContainer = NatsContainer;
|
|
82
|
+
class StartedNatsContainer extends abstract_started_container_1.AbstractStartedContainer {
|
|
83
|
+
constructor(startedTestContainer, username, password) {
|
|
84
|
+
super(startedTestContainer);
|
|
85
|
+
this.username = username;
|
|
86
|
+
this.password = password;
|
|
87
|
+
const port = startedTestContainer.getMappedPort(CLIENT_PORT);
|
|
88
|
+
this.connectionOptions = {
|
|
89
|
+
servers: `${this.startedTestContainer.getHost()}:${port}`,
|
|
90
|
+
user: this.username,
|
|
91
|
+
pass: this.password,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
getConnectionOptions() {
|
|
95
|
+
return this.connectionOptions;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.StartedNatsContainer = StartedNatsContainer;
|
package/dist/port-forwarder.js
CHANGED
|
@@ -56,9 +56,12 @@ class PortForwarderInstance {
|
|
|
56
56
|
logger_1.log.debug(`Creating new Port Forwarder`);
|
|
57
57
|
const username = "root";
|
|
58
58
|
const password = new uuid_1.RandomUuid().nextUuid();
|
|
59
|
+
const containerPort = process.env["TESTCONTAINERS_SSHD_PORT"]
|
|
60
|
+
? { container: 22, host: Number(process.env["TESTCONTAINERS_SSHD_PORT"]) }
|
|
61
|
+
: 22;
|
|
59
62
|
const container = yield new generic_container_1.GenericContainer(images_1.SSHD_IMAGE)
|
|
60
63
|
.withName(`testcontainers-port-forwarder-${session_id_1.sessionId}`)
|
|
61
|
-
.withExposedPorts(
|
|
64
|
+
.withExposedPorts(containerPort)
|
|
62
65
|
.withEnv("PASSWORD", password)
|
|
63
66
|
.withCmd([
|
|
64
67
|
"sh",
|
package/dist/reaper.js
CHANGED
|
@@ -81,13 +81,13 @@ class ReaperInstance {
|
|
|
81
81
|
var _a;
|
|
82
82
|
return __awaiter(this, void 0, void 0, function* () {
|
|
83
83
|
const dockerSocket = (_a = process.env["TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE"]) !== null && _a !== void 0 ? _a : "/var/run/docker.sock";
|
|
84
|
-
const
|
|
84
|
+
const containerPort = process.env["TESTCONTAINERS_RYUK_PORT"]
|
|
85
85
|
? { container: 8080, host: Number(process.env["TESTCONTAINERS_RYUK_PORT"]) }
|
|
86
86
|
: 8080;
|
|
87
87
|
logger_1.log.debug(`Creating new Reaper for session: ${session_id_1.sessionId}`);
|
|
88
88
|
const container = new generic_container_1.GenericContainer(images_1.REAPER_IMAGE)
|
|
89
89
|
.withName(`testcontainers-ryuk-${session_id_1.sessionId}`)
|
|
90
|
-
.withExposedPorts(
|
|
90
|
+
.withExposedPorts(containerPort)
|
|
91
91
|
.withBindMount(dockerSocket, "/var/run/docker.sock")
|
|
92
92
|
.withWaitStrategy(wait_1.Wait.forLogMessage(/.+ Started!/));
|
|
93
93
|
if (this.isPrivileged()) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testcontainers",
|
|
3
3
|
"author": "Cristian Greco",
|
|
4
|
-
"version": "8.
|
|
4
|
+
"version": "8.11.0",
|
|
5
5
|
"main": "dist/index",
|
|
6
6
|
"types": "dist/index",
|
|
7
7
|
"keywords": [
|
|
@@ -74,7 +74,8 @@
|
|
|
74
74
|
"ts-jest": "^27.1.4",
|
|
75
75
|
"ts-node": "^10.7.0",
|
|
76
76
|
"typescript": "^4.6.3",
|
|
77
|
-
"wait-for-expect": "^3.0.2"
|
|
77
|
+
"wait-for-expect": "^3.0.2",
|
|
78
|
+
"nats": "^2.7.1"
|
|
78
79
|
},
|
|
79
80
|
"lint-staged": {
|
|
80
81
|
"src/**/*.ts": [
|