account-lookup-service 15.5.0-iso.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.circleci/config.yml +11 -0
- package/.ncurc.yaml +6 -0
- package/.nvmrc +1 -0
- package/.nycrc.yml +20 -0
- package/.versionrc +15 -0
- package/CHANGELOG.md +330 -0
- package/CODEOWNERS +38 -0
- package/Dockerfile +45 -0
- package/LICENSE.md +10 -0
- package/README.md +252 -0
- package/audit-ci.jsonc +32 -0
- package/audit-resolve.json +161 -0
- package/config/default.json +109 -0
- package/config/knexfile.js +21 -0
- package/docker/account-lookup-service/default.json +106 -0
- package/docker/account-lookup-service/make-default-json.sh +5 -0
- package/docker/account-lookup-service/override.json +15 -0
- package/docker/central-ledger/default.json +458 -0
- package/docker/config-modifier/account-lookup-service.js +31 -0
- package/docker/kafka/consumer.properties +26 -0
- package/docker/kafka/producer.properties +45 -0
- package/docker/kafka/server.properties +143 -0
- package/docker/kafka/tools-log4j.properties +21 -0
- package/docker/mock-proxy/Dockerfile +15 -0
- package/docker/mock-proxy/package-lock.json +4986 -0
- package/docker/mock-proxy/package.json +24 -0
- package/docker/mock-proxy/src/config.ts +14 -0
- package/docker/mock-proxy/src/server.ts +94 -0
- package/docker/mock-proxy/src/utils.ts +29 -0
- package/docker/mock-proxy/tsconfig.json +24 -0
- package/docker/sql-init/01_permissions.sql +2 -0
- package/docker/sql-init-central-ledger/01_permissions.sql +2 -0
- package/docker/wait-for/wait-for-account-lookup-service.sh +10 -0
- package/docker/wait-for/wait-for-central-ledger.sh +11 -0
- package/docker/wait-for/wait-for-kafka.sh +7 -0
- package/docker/wait-for/wait-for-ml-api-adapter.sh +9 -0
- package/docker/wait-for/wait-for-mockserver.sh +20 -0
- package/docker/wait-for/wait-for-mysql-als.sh +14 -0
- package/docker/wait-for/wait-for-mysql-central-ledger.sh +11 -0
- package/docker/wait-for/wait-for-mysql.sh +11 -0
- package/docker/wait-for/wait-for-objstore.sh +12 -0
- package/docker/wait-for/wait-for.env +18 -0
- package/docker/wait-for/wait-for.sh +81 -0
- package/docker-compose.integration.yml +29 -0
- package/docker-compose.yml +243 -0
- package/jest-int.config.js +8 -0
- package/jest.config.js +16 -0
- package/jsdoc.json +38 -0
- package/migrations/01_currency.js +42 -0
- package/migrations/02_endpointType.js +43 -0
- package/migrations/03_endpointType-indexes.js +37 -0
- package/migrations/04_partyIdType.js +43 -0
- package/migrations/05_partyIdType-indexes.js +38 -0
- package/migrations/08_oracleEndpoint.js +51 -0
- package/migrations/09_oracleEndpoint-indexes.js +41 -0
- package/migrations/10_oracleEndpoint-remove-constraints.js +38 -0
- package/package.json +180 -0
- package/scripts/_wait4_all.js +143 -0
- package/scripts/test-functional.sh +76 -0
- package/secrets/jwsSigningKey.key +27 -0
- package/seeds/currency.js +765 -0
- package/seeds/endpointType.js +65 -0
- package/seeds/partyIdType.js +79 -0
- package/src/api/endpointcache.js +67 -0
- package/src/api/health.js +66 -0
- package/src/api/index.js +85 -0
- package/src/api/oracles/{ID}.js +100 -0
- package/src/api/oracles.js +96 -0
- package/src/api/participants/{ID}/error.js +44 -0
- package/src/api/participants/{ID}.js +44 -0
- package/src/api/participants/{Type}/{ID}/error.js +74 -0
- package/src/api/participants/{Type}/{ID}/{SubId}/error.js +68 -0
- package/src/api/participants/{Type}/{ID}/{SubId}.js +113 -0
- package/src/api/participants/{Type}/{ID}.js +133 -0
- package/src/api/participants.js +63 -0
- package/src/api/parties/{Type}/{ID}/error.js +66 -0
- package/src/api/parties/{Type}/{ID}/{SubId}/error.js +56 -0
- package/src/api/parties/{Type}/{ID}/{SubId}.js +77 -0
- package/src/api/parties/{Type}/{ID}.js +98 -0
- package/src/api/routes.js +294 -0
- package/src/constants.js +16 -0
- package/src/domain/oracle/index.js +33 -0
- package/src/domain/oracle/oracle.js +234 -0
- package/src/domain/participants/index.js +35 -0
- package/src/domain/participants/participants.js +560 -0
- package/src/domain/parties/getPartiesByTypeAndID.js +239 -0
- package/src/domain/parties/index.js +32 -0
- package/src/domain/parties/parties.js +215 -0
- package/src/domain/parties/utils.js +84 -0
- package/src/domain/timeout/dto.js +48 -0
- package/src/domain/timeout/index.js +104 -0
- package/src/handlers/TimeoutHandler.js +94 -0
- package/src/handlers/index.js +70 -0
- package/src/handlers/monitoring/index.js +51 -0
- package/src/handlers/monitoring/plugins/health.js +61 -0
- package/src/handlers/monitoring/plugins/metrics.js +48 -0
- package/src/handlers/register.js +102 -0
- package/src/index.js +66 -0
- package/src/interface/admin-swagger.yaml +804 -0
- package/src/interface/admin_swagger.json +959 -0
- package/src/interface/api-swagger-iso20022-parties.yaml +1734 -0
- package/src/interface/api-swagger.yaml +1733 -0
- package/src/interface/api_swagger.json +3046 -0
- package/src/interface/fspiop-rest-v2.0-ISO20022_parties.yaml +2256 -0
- package/src/interface/thirdparty/admin-swagger.yaml +808 -0
- package/src/interface/thirdparty/admin_swagger.json +961 -0
- package/src/interface/thirdparty/api-swagger.yaml +1739 -0
- package/src/interface/thirdparty/api_swagger.json +3142 -0
- package/src/lib/argv.js +39 -0
- package/src/lib/cache.js +126 -0
- package/src/lib/config.js +183 -0
- package/src/lib/db.js +26 -0
- package/src/lib/headers.js +53 -0
- package/src/lib/healthCheck/subServiceHealth.js +84 -0
- package/src/lib/index.js +11 -0
- package/src/lib/migrator.js +17 -0
- package/src/lib/requestLogger.js +54 -0
- package/src/lib/util.js +66 -0
- package/src/metrics/handler.js +33 -0
- package/src/metrics/plugin.js +52 -0
- package/src/metrics/routes.js +43 -0
- package/src/models/currency/currency.js +48 -0
- package/src/models/currency/index.js +32 -0
- package/src/models/endpointType/endpointType.js +48 -0
- package/src/models/endpointType/index.js +32 -0
- package/src/models/misc/migrationLock.js +49 -0
- package/src/models/oracle/facade.js +341 -0
- package/src/models/oracle/index.js +41 -0
- package/src/models/oracle/oracleEndpoint.js +192 -0
- package/src/models/oracle/oracleEndpointCached.js +108 -0
- package/src/models/participantEndpoint/facade.js +238 -0
- package/src/models/partyIdType/index.js +32 -0
- package/src/models/partyIdType/partyIdType.js +41 -0
- package/src/plugins.js +139 -0
- package/src/server.js +199 -0
- package/test/fixtures/index.js +131 -0
- package/test/fixtures/iso.js +110 -0
- package/test/integration/.env +8 -0
- package/test/integration/api/parties.test.js +137 -0
- package/test/integration/constants.js +20 -0
- package/test/integration/domain/oracle/index.test.js +324 -0
- package/test/integration/domain/timeout/index.test.js +75 -0
- package/test/integration/env.sh +15 -0
- package/test/integration/example.test.js +12 -0
- package/test/integration/models/currency/currency.test.js +68 -0
- package/test/integration/plugins.test.js +62 -0
- package/test/integration/prepareTestParticipants.js +30 -0
- package/test/integration/setup.js +5 -0
- package/test/integration-config.json +81 -0
- package/test/integration-runner.sh +108 -0
- package/test/unit/api/health.test.js +142 -0
- package/test/unit/api/oracles/{ID}.test.js +264 -0
- package/test/unit/api/oracles.test.js +173 -0
- package/test/unit/api/participants/participants.test.js +117 -0
- package/test/unit/api/participants/{Type}/{ID}/error.test.js +155 -0
- package/test/unit/api/participants/{Type}/{ID}/{SubId}/error.test.js +131 -0
- package/test/unit/api/participants/{Type}/{ID}/{SubId}.test.js +377 -0
- package/test/unit/api/participants/{Type}/{ID}.test.js +383 -0
- package/test/unit/api/participants.test.js +108 -0
- package/test/unit/api/parties/endpointcache.test.js +83 -0
- package/test/unit/api/parties/parties.test.js +102 -0
- package/test/unit/api/parties/{Type}/{ID}/error.test.js +145 -0
- package/test/unit/api/parties/{Type}/{ID}/{SubId}/error.test.js +141 -0
- package/test/unit/api/parties/{Type}/{ID}/{SubId}.test.js +241 -0
- package/test/unit/api/parties/{Type}/{ID}.test.js +240 -0
- package/test/unit/domain/oracle/oracle.test.js +505 -0
- package/test/unit/domain/participants/participants.test.js +1724 -0
- package/test/unit/domain/parties/parties.test.js +940 -0
- package/test/unit/domain/timeout/dto.test.js +28 -0
- package/test/unit/domain/timeout/index.test.js +81 -0
- package/test/unit/handlers/TimeoutHandler.test.js +125 -0
- package/test/unit/handlers/index.test.js +56 -0
- package/test/unit/handlers/register.test.js +90 -0
- package/test/unit/index.test.js +139 -0
- package/test/unit/iso20022/partiesValidation.test.js +129 -0
- package/test/unit/lib/TransformFacades.test.js +18 -0
- package/test/unit/lib/argv.test.js +40 -0
- package/test/unit/lib/cache.test.js +172 -0
- package/test/unit/lib/config.test.js +108 -0
- package/test/unit/lib/healthCheck/subServiceHealth.test.js +89 -0
- package/test/unit/lib/migrator.test.js +52 -0
- package/test/unit/lib/requestLogger.test.js +115 -0
- package/test/unit/lib/util.test.js +68 -0
- package/test/unit/mocks.js +66 -0
- package/test/unit/models/currency/currency.test.js +91 -0
- package/test/unit/models/endpointType/endpointType.test.js +69 -0
- package/test/unit/models/misc/migrationLock.test.js +96 -0
- package/test/unit/models/oracle/facade.test.js +546 -0
- package/test/unit/models/oracle/oracleEndpoint.test.js +409 -0
- package/test/unit/models/oracle/oracleEndpointCached.test.js +153 -0
- package/test/unit/models/participantEndpoint/facade.test.js +295 -0
- package/test/unit/models/partyIdType/partyIdType.test.js +88 -0
- package/test/unit/plugins.test.js +89 -0
- package/test/unit/setup.js +7 -0
- package/test/util/apiClients/AlsApiClient.js +44 -0
- package/test/util/apiClients/BasicApiClient.js +34 -0
- package/test/util/apiClients/ProxyApiClient.js +25 -0
- package/test/util/apiClients/index.js +7 -0
- package/test/util/helper.js +332 -0
- package/test/util/index.js +11 -0
- package/test/util/mockgen.js +43 -0
- package/test/util/onboarding.js +132 -0
- package/test/util/scripts/addAlsDb.sh +33 -0
- package/test/util/scripts/configureMockServer.sh +35 -0
- package/test/util/scripts/env.sh +19 -0
- package/test/util/scripts/populateTestData.sh +62 -0
- package/test/util/scripts/startMockCentralServer.sh +45 -0
- package/test/util/scripts/startMockOracleServer.sh +45 -0
- package/test/util/testConfig.js +44 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
{
|
2
|
+
"name": "mock-proxy",
|
3
|
+
"version": "0.1.0",
|
4
|
+
"description": "Mock proxy adapter",
|
5
|
+
"author": "Eugen Klymniuk (geka-evk)",
|
6
|
+
"license": "Apache-2.0",
|
7
|
+
"main": "src/server.ts",
|
8
|
+
"scripts": {
|
9
|
+
"start": "ts-node src/server.ts"
|
10
|
+
},
|
11
|
+
"dependencies": {
|
12
|
+
"@mojaloop/central-services-shared": "^18.6.0-snapshot.4",
|
13
|
+
"@types/node": "^20.14.2",
|
14
|
+
"axios": "^1.7.2",
|
15
|
+
"body-parser": "^1.20.2",
|
16
|
+
"express": "^4.19.2",
|
17
|
+
"ts-node": "^10.9.2",
|
18
|
+
"typescript": "^5.4.5"
|
19
|
+
},
|
20
|
+
"devDependencies": {
|
21
|
+
"@types/body-parser": "^1.19.5",
|
22
|
+
"@types/express": "^4.17.21"
|
23
|
+
}
|
24
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import process from 'node:process';
|
2
|
+
|
3
|
+
console.log('process.env:', process.env);
|
4
|
+
|
5
|
+
export const {
|
6
|
+
PROXY_PORT = 14200,
|
7
|
+
PROXY_NAME = 'proxyAB',
|
8
|
+
CL_HOST = 'localhost',
|
9
|
+
CL_PORT = 3001,
|
10
|
+
} = process.env;
|
11
|
+
|
12
|
+
export const ROUTES = {
|
13
|
+
history: '/history',
|
14
|
+
} as const;
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import http from 'node:http';
|
2
|
+
import * as console from 'node:console';
|
3
|
+
import express, { Request, Response, NextFunction } from 'express';
|
4
|
+
import bodyParser from 'body-parser';
|
5
|
+
|
6
|
+
import { PROXY_PORT, PROXY_NAME, ROUTES, CL_HOST, CL_PORT } from './config';
|
7
|
+
import { hubCbHeaders, dfspCbHeaders } from './utils';
|
8
|
+
|
9
|
+
const app = express();
|
10
|
+
app.use(bodyParser.json());
|
11
|
+
app.use(bodyParser.urlencoded({ extended: true }));
|
12
|
+
|
13
|
+
const history: Record<string, unknown>[] = [];
|
14
|
+
|
15
|
+
app.all('*', (req: Request, res: Response, next: NextFunction) => {
|
16
|
+
const { path, method, headers, body, params, query } = req;
|
17
|
+
const reqDetails = { path, method, headers, body, params, query }
|
18
|
+
console.log(`[==>] [${new Date().toISOString()}] incoming request...`, reqDetails);
|
19
|
+
|
20
|
+
if (path !== ROUTES.history) {
|
21
|
+
history.push(reqDetails);
|
22
|
+
}
|
23
|
+
next();
|
24
|
+
});
|
25
|
+
|
26
|
+
app.get(ROUTES.history, (req: Request, res: Response) => {
|
27
|
+
res.json({ history });
|
28
|
+
});
|
29
|
+
app.delete(ROUTES.history, (req: Request, res: Response) => {
|
30
|
+
history.length = 0
|
31
|
+
res.json({ history });
|
32
|
+
});
|
33
|
+
|
34
|
+
app.get('/health', (req: Request, res: Response) => {
|
35
|
+
res.json({ success: true });
|
36
|
+
});
|
37
|
+
|
38
|
+
app.get('/parties/:type/:id', (req: Request, res: Response) => {
|
39
|
+
const { type, id } = req.params;
|
40
|
+
const headers = hubCbHeaders(req.headers);
|
41
|
+
console.log('parties request details:', { type, id, headers, CL_HOST, CL_PORT });
|
42
|
+
|
43
|
+
// todo: reply to CL with party info
|
44
|
+
|
45
|
+
res
|
46
|
+
.set(headers)
|
47
|
+
.status(202)
|
48
|
+
.json({ success: true });
|
49
|
+
});
|
50
|
+
|
51
|
+
app.put('/parties/:type/:id/error', (req: Request, res: Response) => {
|
52
|
+
const { type, id } = req.params;
|
53
|
+
const headers = dfspCbHeaders(req.headers);
|
54
|
+
console.log('parties put error request details:', { type, id, headers, CL_HOST, CL_PORT });
|
55
|
+
|
56
|
+
res
|
57
|
+
.set(headers)
|
58
|
+
.status(200)
|
59
|
+
.json({ success: true });
|
60
|
+
});
|
61
|
+
|
62
|
+
app.get('/oracle*', (req: Request, res: Response) => {
|
63
|
+
// console.log('oracle request details:', { type, id, headers });
|
64
|
+
const data = {
|
65
|
+
partyList: []
|
66
|
+
}
|
67
|
+
res.json({ data });
|
68
|
+
});
|
69
|
+
|
70
|
+
app.all('/echo', async (req: Request, res: Response) => {
|
71
|
+
const input = {
|
72
|
+
method: req.method,
|
73
|
+
path: req.path,
|
74
|
+
headers: req.headers,
|
75
|
+
query: req.query,
|
76
|
+
body: req.body,
|
77
|
+
};
|
78
|
+
console.log('incoming request...', input);
|
79
|
+
|
80
|
+
res.set(hubCbHeaders).json(input);
|
81
|
+
});
|
82
|
+
|
83
|
+
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
|
84
|
+
const { message, stack, cause } = err;
|
85
|
+
const response = { message, stack, cause };
|
86
|
+
console.error('error response:', response);
|
87
|
+
res.status(500).json(response);
|
88
|
+
});
|
89
|
+
|
90
|
+
const httpsServer = http.createServer(app);
|
91
|
+
|
92
|
+
httpsServer.listen(PROXY_PORT, () => {
|
93
|
+
console.log(`Mock proxyAdapter "${PROXY_NAME}" is running on port ${PROXY_PORT}...`);
|
94
|
+
});
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { IncomingHttpHeaders } from 'node:http';
|
2
|
+
import { Enum } from '@mojaloop/central-services-shared';
|
3
|
+
import { PROXY_NAME } from './config';
|
4
|
+
|
5
|
+
const { Headers} = Enum.Http
|
6
|
+
|
7
|
+
export const hubCbHeaders = (headers: IncomingHttpHeaders) => {
|
8
|
+
const {
|
9
|
+
[Headers.FSPIOP.SOURCE]: source,
|
10
|
+
[Headers.FSPIOP.DESTINATION]: destination,
|
11
|
+
host,
|
12
|
+
'content-length': _,
|
13
|
+
...restHeaders
|
14
|
+
} = headers;
|
15
|
+
|
16
|
+
return {
|
17
|
+
...restHeaders,
|
18
|
+
[Headers.FSPIOP.SOURCE]: destination,
|
19
|
+
[Headers.FSPIOP.DESTINATION]: source,
|
20
|
+
[Headers.FSPIOP.PROXY]: PROXY_NAME,
|
21
|
+
};
|
22
|
+
};
|
23
|
+
|
24
|
+
export const dfspCbHeaders = (headers: IncomingHttpHeaders) => {
|
25
|
+
const h = hubCbHeaders(headers);
|
26
|
+
delete h[Headers.FSPIOP.PROXY];
|
27
|
+
|
28
|
+
return h;
|
29
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
{
|
2
|
+
"compilerOptions": {
|
3
|
+
"baseUrl": "./",
|
4
|
+
"rootDir": "./src",
|
5
|
+
"outDir": "./dist",
|
6
|
+
"strict": true,
|
7
|
+
"noUncheckedIndexedAccess": true,
|
8
|
+
"noImplicitAny": true,
|
9
|
+
"lib": ["esNext"],
|
10
|
+
"target": "esNext",
|
11
|
+
"module": "nodeNext",
|
12
|
+
"moduleResolution": "nodeNext",
|
13
|
+
"esModuleInterop": true,
|
14
|
+
"forceConsistentCasingInFileNames": true,
|
15
|
+
"allowSyntheticDefaultImports": true,
|
16
|
+
"skipLibCheck": true,
|
17
|
+
"resolveJsonModule": true,
|
18
|
+
"sourceMap": true,
|
19
|
+
"declaration": true,
|
20
|
+
"declarationMap": true
|
21
|
+
},
|
22
|
+
"include": ["./src"],
|
23
|
+
"exclude": ["node_modules"]
|
24
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
echo "** STARTUP - Checking for Account Lookup Service..."
|
4
|
+
|
5
|
+
source /opt/wait-for/wait-for.env
|
6
|
+
|
7
|
+
sh /opt/wait-for/wait-for-mysql-als.sh
|
8
|
+
sh /opt/wait-for/wait-for-mysql-central-ledger.sh
|
9
|
+
|
10
|
+
echo "** STARTUP - Account Lookup Service successful!"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# wait-for-mockserver.sh
|
3
|
+
|
4
|
+
source /opt/wait-for/wait-for.env
|
5
|
+
|
6
|
+
function healthCheck() {
|
7
|
+
curl -s -X GET "http://$WAIT_FOR_MOCK_HOST:$WAIT_FOR_MOCK_PORT"
|
8
|
+
}
|
9
|
+
|
10
|
+
function command() {
|
11
|
+
curl -s -X PUT "http://$WAIT_FOR_MOCK_HOST:$WAIT_FOR_MOCK_PORT/expectation" -d '{ "httpRequest": { "method": ".*", "path": "/.*transfers.*" }, "times" : { "remainingTimes" : 0, "unlimited" : true }, "timeToLive" : { "unlimited" : true }, "httpResponse": { "statusCode": 200, "body": "{}" } }';
|
12
|
+
}
|
13
|
+
|
14
|
+
until healthCheck; do
|
15
|
+
>&2 echo "mockserver is unavailable - sleeping"
|
16
|
+
sleep 1
|
17
|
+
done
|
18
|
+
|
19
|
+
>&2 echo "mockserver is up - executing command"
|
20
|
+
command
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
echo "** STARTUP - Checking for DB connection..."
|
4
|
+
|
5
|
+
source /opt/wait-for/wait-for.env
|
6
|
+
|
7
|
+
apk --no-cache add mysql-client
|
8
|
+
|
9
|
+
until result=$(mysql -h $WAIT_FOR_DB_HOST_ALS -P $WAIT_FOR_DB_PORT_ALS -u $WAIT_FOR_DB_USER_ALS --password=$WAIT_FOR_DB_PASSWORD_ALS $WAIT_FOR_DB_DATABASE_ALS -ss -N -e 'select 1;') \
|
10
|
+
&& eval 'echo is_connected=$result' \
|
11
|
+
&& if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for MySQL; sleep 2;
|
12
|
+
done;
|
13
|
+
|
14
|
+
echo "** STARTUP - DB connection successful!"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
echo "** STARTUP - Checking for DB connection..."
|
4
|
+
|
5
|
+
source /opt/wait-for/wait-for.env
|
6
|
+
|
7
|
+
apk --no-cache add mysql-client
|
8
|
+
|
9
|
+
until result=$(mysql -h $WAIT_FOR_DB_HOST_CL -P $WAIT_FOR_DB_PORT_CL -u $WAIT_FOR_DB_USER_CL --password=$WAIT_FOR_DB_PASSWORD_CL $WAIT_FOR_DB_DATABASE_CL -ss -N -e 'select 1;') && eval 'echo is_connected=$result' && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for MySQL; sleep 2; done;
|
10
|
+
|
11
|
+
echo "** STARTUP - DB connection successful!"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
echo "** STARTUP - Checking for DB connection..."
|
4
|
+
|
5
|
+
source /opt/wait-for/wait-for.env
|
6
|
+
|
7
|
+
apk --no-cache add mysql-client
|
8
|
+
|
9
|
+
until result=$(mysql -h $WAIT_FOR_DB_HOST -P $WAIT_FOR_DB_PORT -u $WAIT_FOR_DB_USER --password=$WAIT_FOR_DB_PASSWORD $WAIT_FOR_DB_DATABASE -ss -N -e 'select 1;') && eval 'echo is_connected=$result' && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for MySQL; sleep 2; done;
|
10
|
+
|
11
|
+
echo "** STARTUP - DB connection successful!"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
echo "** STARTUP - Checking for Object Store connection..."
|
4
|
+
|
5
|
+
source /opt/wait-for/wait-for.env
|
6
|
+
|
7
|
+
apk add --no-cache mongodb
|
8
|
+
|
9
|
+
#sh /opt/wait-for/wait-for.sh objstore:1080 -- echo "** STARTUP - Object Store connection successful!"
|
10
|
+
until result=$(mongo $WAIT_FOR_DB_OBJSTORE_URI --eval "db.adminCommand('ping')") && eval 'echo is_connected=$result' && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for ObjStore; sleep 2; done;
|
11
|
+
|
12
|
+
echo "** STARTUP - Object Store connection successful!"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Environment config for wait-for scripts
|
2
|
+
|
3
|
+
WAIT_FOR_DB_HOST_CL=mysql-cl
|
4
|
+
WAIT_FOR_DB_PORT_CL=3306
|
5
|
+
WAIT_FOR_DB_USER_CL=central_ledger
|
6
|
+
WAIT_FOR_DB_PASSWORD_CL=password
|
7
|
+
WAIT_FOR_DB_DATABASE_CL=central_ledger
|
8
|
+
|
9
|
+
WAIT_FOR_DB_HOST_ALS=mysql-als
|
10
|
+
WAIT_FOR_DB_PORT_ALS=3306
|
11
|
+
WAIT_FOR_DB_USER_ALS=account_lookup
|
12
|
+
WAIT_FOR_DB_PASSWORD_ALS=password
|
13
|
+
WAIT_FOR_DB_DATABASE_ALS=account_lookup
|
14
|
+
|
15
|
+
WAIT_FOR_DB_OBJSTORE_URI=mongodb://objstore:27017/mlos
|
16
|
+
WAIT_FOR_DB_KAFKA_BROKER=kafka:29092
|
17
|
+
WAIT_FOR_MOCK_HOST=mockserver
|
18
|
+
WAIT_FOR_MOCK_PORT=1080
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
# Script from https://github.com/eficode/wait-for
|
4
|
+
|
5
|
+
TIMEOUT=15
|
6
|
+
QUIET=0
|
7
|
+
|
8
|
+
echoerr() {
|
9
|
+
if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
|
10
|
+
}
|
11
|
+
|
12
|
+
usage() {
|
13
|
+
exitcode="$1"
|
14
|
+
cat << USAGE >&2
|
15
|
+
Usage:
|
16
|
+
$cmdname host:port [-t timeout] [-- command args]
|
17
|
+
-q | --quiet Do not output any status messages
|
18
|
+
-t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout
|
19
|
+
-- COMMAND ARGS Execute command with args after the test finishes
|
20
|
+
USAGE
|
21
|
+
exit "$exitcode"
|
22
|
+
}
|
23
|
+
|
24
|
+
wait_for() {
|
25
|
+
for i in `seq $TIMEOUT` ; do
|
26
|
+
nc -z "$HOST" "$PORT" > /dev/null 2>&1
|
27
|
+
|
28
|
+
result=$?
|
29
|
+
if [ $result -eq 0 ] ; then
|
30
|
+
if [ $# -gt 0 ] ; then
|
31
|
+
exec "$@"
|
32
|
+
fi
|
33
|
+
exit 0
|
34
|
+
fi
|
35
|
+
sleep 1
|
36
|
+
done
|
37
|
+
echo "Operation timed out" >&2
|
38
|
+
exit 1
|
39
|
+
}
|
40
|
+
|
41
|
+
while [ $# -gt 0 ]
|
42
|
+
do
|
43
|
+
case "$1" in
|
44
|
+
*:* )
|
45
|
+
HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
|
46
|
+
PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
|
47
|
+
shift 1
|
48
|
+
;;
|
49
|
+
-q | --quiet)
|
50
|
+
QUIET=1
|
51
|
+
shift 1
|
52
|
+
;;
|
53
|
+
-t)
|
54
|
+
TIMEOUT="$2"
|
55
|
+
if [ "$TIMEOUT" = "" ]; then break; fi
|
56
|
+
shift 2
|
57
|
+
;;
|
58
|
+
--timeout=*)
|
59
|
+
TIMEOUT="${1#*=}"
|
60
|
+
shift 1
|
61
|
+
;;
|
62
|
+
--)
|
63
|
+
shift
|
64
|
+
break
|
65
|
+
;;
|
66
|
+
--help)
|
67
|
+
usage 0
|
68
|
+
;;
|
69
|
+
*)
|
70
|
+
echoerr "Unknown argument: $1"
|
71
|
+
usage 1
|
72
|
+
;;
|
73
|
+
esac
|
74
|
+
done
|
75
|
+
|
76
|
+
if [ "$HOST" = "" -o "$PORT" = "" ]; then
|
77
|
+
echoerr "Error: you need to provide a host and port to test."
|
78
|
+
usage 2
|
79
|
+
fi
|
80
|
+
|
81
|
+
wait_for "$@"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
version: "3.7"
|
2
|
+
|
3
|
+
services:
|
4
|
+
account-lookup-service-int:
|
5
|
+
image: mojaloop/account-lookup-service-int:local
|
6
|
+
build:
|
7
|
+
context: .
|
8
|
+
target: builder
|
9
|
+
cache_from:
|
10
|
+
- mojaloop/account-lookup-service
|
11
|
+
- account-lookup-service
|
12
|
+
container_name: als_account-lookup-service-int
|
13
|
+
user: root
|
14
|
+
networks:
|
15
|
+
- als-mojaloop-net
|
16
|
+
command:
|
17
|
+
- sh
|
18
|
+
- -c
|
19
|
+
- "tail -f /dev/null"
|
20
|
+
depends_on:
|
21
|
+
- mysql-als
|
22
|
+
- central-ledger
|
23
|
+
volumes:
|
24
|
+
- ./src:/opt/app/src
|
25
|
+
- ./secrets:/opt/app/secrets
|
26
|
+
- ./test:/opt/app/test
|
27
|
+
- ./package.json:/opt/app/package.json
|
28
|
+
- ./test/integration-config.json:/opt/app/config/default.json
|
29
|
+
- ./docker/wait-for:/opt/wait-for
|
@@ -0,0 +1,243 @@
|
|
1
|
+
networks:
|
2
|
+
als-mojaloop-net:
|
3
|
+
name: als-mojaloop-net
|
4
|
+
|
5
|
+
# @see https://uninterrupted.tech/blog/hassle-free-redis-cluster-deployment-using-docker/
|
6
|
+
x-redis-node: &REDIS_NODE
|
7
|
+
image: docker.io/bitnami/redis-cluster:6.2.14
|
8
|
+
environment: &REDIS_ENVS
|
9
|
+
ALLOW_EMPTY_PASSWORD: yes
|
10
|
+
REDIS_CLUSTER_DYNAMIC_IPS: no
|
11
|
+
REDIS_CLUSTER_ANNOUNCE_IP: ${REDIS_CLUSTER_ANNOUNCE_IP}
|
12
|
+
REDIS_NODES: localhost:6379 localhost:6380 localhost:6381 localhost:6382 localhost:6383 localhost:6384
|
13
|
+
healthcheck:
|
14
|
+
test: [ "CMD", "redis-cli", "ping" ]
|
15
|
+
timeout: 2s
|
16
|
+
network_mode: host
|
17
|
+
|
18
|
+
x-account-lookup-service: &ACCOUNT_LOOKUP_SERVICE
|
19
|
+
image: mojaloop/account-lookup-service:local
|
20
|
+
build:
|
21
|
+
context: .
|
22
|
+
target: builder
|
23
|
+
user: root
|
24
|
+
environment:
|
25
|
+
LOG_LEVEL: debug
|
26
|
+
networks:
|
27
|
+
- als-mojaloop-net
|
28
|
+
depends_on:
|
29
|
+
- central-ledger
|
30
|
+
- proxy
|
31
|
+
- mysql-als
|
32
|
+
- redis-node-0
|
33
|
+
# - redis
|
34
|
+
volumes:
|
35
|
+
- ./secrets:/opt/app/secrets
|
36
|
+
- ./src:/opt/app/src
|
37
|
+
- ./docker/account-lookup-service/default.json:/opt/app/config/default.json
|
38
|
+
- ./docker/wait-for:/opt/wait-for
|
39
|
+
extra_hosts:
|
40
|
+
- "redis-node-0:host-gateway"
|
41
|
+
|
42
|
+
services:
|
43
|
+
account-lookup-service:
|
44
|
+
<<: *ACCOUNT_LOOKUP_SERVICE
|
45
|
+
container_name: als_account-lookup-service
|
46
|
+
command:
|
47
|
+
- "sh"
|
48
|
+
- "-c"
|
49
|
+
- "sh /opt/wait-for/wait-for-account-lookup-service.sh && node src/index.js server"
|
50
|
+
ports:
|
51
|
+
- "4001:4001"
|
52
|
+
- "4002:4002"
|
53
|
+
healthcheck:
|
54
|
+
test: ["CMD", "sh", "-c" ,"apk --no-cache add curl", ";", "curl", "http://localhost:4001/health"]
|
55
|
+
timeout: 20s
|
56
|
+
retries: 10
|
57
|
+
interval: 30s
|
58
|
+
|
59
|
+
account-lookup-service-handlers:
|
60
|
+
<<: *ACCOUNT_LOOKUP_SERVICE
|
61
|
+
container_name: als_account-lookup-service-handlers
|
62
|
+
command:
|
63
|
+
- "sh"
|
64
|
+
- "-c"
|
65
|
+
- "node src/handlers/index.js h --timeout"
|
66
|
+
depends_on:
|
67
|
+
- redis-node-0
|
68
|
+
ports:
|
69
|
+
- "4003:4003"
|
70
|
+
healthcheck:
|
71
|
+
test: ["CMD", "sh", "-c" ,"apk --no-cache add curl", ";", "curl", "http://localhost:4003/health"]
|
72
|
+
timeout: 20s
|
73
|
+
retries: 10
|
74
|
+
interval: 30s
|
75
|
+
|
76
|
+
central-ledger:
|
77
|
+
# image: mojaloop/central-ledger:latest
|
78
|
+
image: mojaloop/central-ledger:v17.8.0-snapshot.34
|
79
|
+
container_name: als_central-ledger
|
80
|
+
user: root
|
81
|
+
command:
|
82
|
+
- "sh"
|
83
|
+
- "-c"
|
84
|
+
- "sh /opt/wait-for/wait-for-central-ledger.sh && node src/api/index.js"
|
85
|
+
ports:
|
86
|
+
- "${CL_PORT:-3001}:3001"
|
87
|
+
volumes:
|
88
|
+
- ./docker/central-ledger/default.json:/opt/app/config/default.json
|
89
|
+
- ./docker/wait-for:/opt/wait-for
|
90
|
+
environment:
|
91
|
+
- LOG_LEVEL=debug
|
92
|
+
- CLEDG_DATABASE_URI=mysql://central_ledger:password@mysql-cl:3306/central_ledger
|
93
|
+
- CLEDG_SIDECAR__DISABLED=true
|
94
|
+
- CLEDG_MONGODB__DISABLED=true
|
95
|
+
networks:
|
96
|
+
- als-mojaloop-net
|
97
|
+
depends_on:
|
98
|
+
- mysql-cl
|
99
|
+
- kafka
|
100
|
+
- redis-node-0
|
101
|
+
extra_hosts:
|
102
|
+
- "redis-node-0:host-gateway"
|
103
|
+
healthcheck:
|
104
|
+
test: ["CMD", "sh", "-c" ,"apk --no-cache add curl", ";", "curl", "http://localhost:3001/health"]
|
105
|
+
timeout: 20s
|
106
|
+
retries: 10
|
107
|
+
interval: 30s
|
108
|
+
|
109
|
+
proxy:
|
110
|
+
build:
|
111
|
+
context: ./docker/mock-proxy
|
112
|
+
dockerfile: Dockerfile
|
113
|
+
restart: always
|
114
|
+
env_file: ./test/integration/.env
|
115
|
+
ports:
|
116
|
+
- "${PROXY_PORT}:${PROXY_PORT}"
|
117
|
+
networks:
|
118
|
+
- als-mojaloop-net
|
119
|
+
|
120
|
+
kafka:
|
121
|
+
image: johnnypark/kafka-zookeeper:2.3.0
|
122
|
+
container_name: als_kafka
|
123
|
+
volumes:
|
124
|
+
- ./docker/kafka/:/opt/kafka_2.12-2.3.0/config/
|
125
|
+
ports:
|
126
|
+
- "2181:2181"
|
127
|
+
- "9092:9092"
|
128
|
+
environment:
|
129
|
+
- ZOO_LOG4J_PROP=WARN
|
130
|
+
networks:
|
131
|
+
- als-mojaloop-net
|
132
|
+
healthcheck:
|
133
|
+
test: ["CMD", "/opt/kafka_2.12-2.3.0/bin/kafka-broker-api-versions.sh", "--bootstrap-server", "kafka:29092"]
|
134
|
+
timeout: 20s
|
135
|
+
retries: 10
|
136
|
+
start_period: 40s
|
137
|
+
interval: 30s
|
138
|
+
|
139
|
+
mysql-als:
|
140
|
+
image: mysql/mysql-server
|
141
|
+
container_name: als_mysql
|
142
|
+
ports:
|
143
|
+
- "3306:3306"
|
144
|
+
volumes:
|
145
|
+
- ./docker/sql-init/:/docker-entrypoint-initdb.d/
|
146
|
+
environment:
|
147
|
+
- MYSQL_USER=${DBUSER:-account_lookup}
|
148
|
+
- MYSQL_PASSWORD=${DBPASS:-password}
|
149
|
+
- MYSQL_DATABASE=${DBUSER:-account_lookup}
|
150
|
+
- MYSQL_ALLOW_EMPTY_PASSWORD=true
|
151
|
+
networks:
|
152
|
+
- als-mojaloop-net
|
153
|
+
healthcheck:
|
154
|
+
test: ["CMD", "mysqladmin" ,"ping", "-h", "mysql-als"]
|
155
|
+
timeout: 20s
|
156
|
+
retries: 10
|
157
|
+
start_period: 40s
|
158
|
+
interval: 30s
|
159
|
+
|
160
|
+
mysql-cl:
|
161
|
+
image: mysql/mysql-server
|
162
|
+
container_name: als_mysql_central_ledger
|
163
|
+
ports:
|
164
|
+
- "3307:3306"
|
165
|
+
volumes:
|
166
|
+
- ./docker/sql-init-central-ledger/:/docker-entrypoint-initdb.d/
|
167
|
+
environment:
|
168
|
+
- MYSQL_USER=${DBUSER:-central_ledger}
|
169
|
+
- MYSQL_PASSWORD=${DBPASS:-password}
|
170
|
+
- MYSQL_DATABASE=${DBUSER:-central_ledger}
|
171
|
+
- MYSQL_ALLOW_EMPTY_PASSWORD=true
|
172
|
+
networks:
|
173
|
+
- als-mojaloop-net
|
174
|
+
healthcheck:
|
175
|
+
test: ["CMD", "mysqladmin" ,"ping", "-h", "mysql-cl"]
|
176
|
+
timeout: 20s
|
177
|
+
retries: 10
|
178
|
+
start_period: 40s
|
179
|
+
interval: 30s
|
180
|
+
|
181
|
+
redis-node-0:
|
182
|
+
<<: *REDIS_NODE
|
183
|
+
environment:
|
184
|
+
<<: *REDIS_ENVS
|
185
|
+
REDIS_CLUSTER_CREATOR: yes
|
186
|
+
REDIS_PORT_NUMBER: 6379
|
187
|
+
depends_on:
|
188
|
+
- redis-node-1
|
189
|
+
- redis-node-2
|
190
|
+
- redis-node-3
|
191
|
+
- redis-node-4
|
192
|
+
- redis-node-5
|
193
|
+
redis-node-1:
|
194
|
+
<<: *REDIS_NODE
|
195
|
+
environment:
|
196
|
+
<<: *REDIS_ENVS
|
197
|
+
REDIS_PORT_NUMBER: 6380
|
198
|
+
ports:
|
199
|
+
- "16380:16380"
|
200
|
+
redis-node-2:
|
201
|
+
<<: *REDIS_NODE
|
202
|
+
environment:
|
203
|
+
<<: *REDIS_ENVS
|
204
|
+
REDIS_PORT_NUMBER: 6381
|
205
|
+
ports:
|
206
|
+
- "16381:16381"
|
207
|
+
redis-node-3:
|
208
|
+
<<: *REDIS_NODE
|
209
|
+
environment:
|
210
|
+
<<: *REDIS_ENVS
|
211
|
+
REDIS_PORT_NUMBER: 6382
|
212
|
+
ports:
|
213
|
+
- "16382:16382"
|
214
|
+
redis-node-4:
|
215
|
+
<<: *REDIS_NODE
|
216
|
+
environment:
|
217
|
+
<<: *REDIS_ENVS
|
218
|
+
REDIS_PORT_NUMBER: 6383
|
219
|
+
ports:
|
220
|
+
- "16383:16383"
|
221
|
+
redis-node-5:
|
222
|
+
<<: *REDIS_NODE
|
223
|
+
environment:
|
224
|
+
<<: *REDIS_ENVS
|
225
|
+
REDIS_PORT_NUMBER: 6384
|
226
|
+
ports:
|
227
|
+
- "16384:16384"
|
228
|
+
|
229
|
+
## To be used with proxyCache.type === 'redis'
|
230
|
+
# redis:
|
231
|
+
# image: redis:6.2.4-alpine
|
232
|
+
# restart: "unless-stopped"
|
233
|
+
# environment:
|
234
|
+
# <<: *REDIS_ENVS
|
235
|
+
# REDIS_CLUSTER_CREATOR: yes
|
236
|
+
# depends_on:
|
237
|
+
# - redis-node-1
|
238
|
+
# - redis-node-2
|
239
|
+
# - redis-node-3
|
240
|
+
# - redis-node-4
|
241
|
+
# - redis-node-5
|
242
|
+
# ports:
|
243
|
+
# - "6379:6379"
|