Skip to content

Commit 180253c

Browse files
petermetzLeeyoungone
authored andcommitted
fix(plugin-consortium-manual): drop repo constructor arg hyperledger-cacti#1199
Removes the non-serializable consortiumRepo argument from the constructor of the consortium plugin manual class's options. Refactors the constructor and the internals of the plugin to initialize the consortium repo from the consortium database at runtime instead of expecting it passed in via the constructor. Refactors the internal code previously using the options.consoritumRepo object to use this.repo instead which is what gets initalized in the constructor as explained above. All this leads to equivalent functionality but less boilerplate and now thanks to this the plugin can be (should be - more tests needed) initialized by the API server purely based on the static configuration file when necessary. Fixes hyperledger-cacti#1199 Signed-off-by: Peter Somogyvari <[email protected]>
1 parent 0e79dd0 commit 180253c

File tree

6 files changed

+30
-52
lines changed

6 files changed

+30
-52
lines changed

examples/cactus-example-supply-chain-backend/src/main/typescript/supply-chain-app.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
LedgerType,
1616
} from "@hyperledger/cactus-core-api";
1717

18-
import { PluginRegistry, ConsortiumRepository } from "@hyperledger/cactus-core";
18+
import { PluginRegistry } from "@hyperledger/cactus-core";
1919

2020
import {
2121
LogLevelDesc,
@@ -210,16 +210,13 @@ export class SupplyChainApp {
210210
const connectionProfile = await this.ledgers.fabric.getConnectionProfileOrg1();
211211
const sshConfig = await this.ledgers.fabric.getSshConfig();
212212

213-
const consortiumRepo = new ConsortiumRepository({ db: consortiumDatabase });
214-
215213
const registryA = new PluginRegistry({
216214
plugins: [
217215
new PluginConsortiumManual({
218216
instanceId: "PluginConsortiumManual_A",
219217
consortiumDatabase,
220218
keyPairPem: keyPairPemA,
221219
logLevel: this.options.logLevel,
222-
consortiumRepo,
223220
}),
224221
new SupplyChainCactusPlugin({
225222
logLevel: this.options.logLevel,
@@ -259,7 +256,6 @@ export class SupplyChainApp {
259256
consortiumDatabase,
260257
keyPairPem: keyPairPemB,
261258
logLevel: this.options.logLevel,
262-
consortiumRepo,
263259
}),
264260
new SupplyChainCactusPlugin({
265261
logLevel: this.options.logLevel,
@@ -298,7 +294,6 @@ export class SupplyChainApp {
298294
consortiumDatabase,
299295
keyPairPem: keyPairPemC,
300296
logLevel: "INFO",
301-
consortiumRepo,
302297
}),
303298
new SupplyChainCactusPlugin({
304299
logLevel: "INFO",

packages/cactus-plugin-consortium-manual/src/main/typescript/plugin-consortium-manual.ts

+21-20
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ export interface IWebAppOptions {
4848
export interface IPluginConsortiumManualOptions extends ICactusPluginOptions {
4949
keyPairPem: string;
5050
consortiumDatabase: ConsortiumDatabase;
51-
consortiumRepo: ConsortiumRepository;
5251
prometheusExporter?: PrometheusExporter;
5352
pluginRegistry?: PluginRegistry;
5453
logLevel?: LogLevelDesc;
@@ -57,12 +56,18 @@ export interface IPluginConsortiumManualOptions extends ICactusPluginOptions {
5756

5857
export class PluginConsortiumManual
5958
implements ICactusPlugin, IPluginWebService {
59+
public static readonly CLASS_NAME = "PluginConsortiumManual";
6060
public prometheusExporter: PrometheusExporter;
6161
private readonly log: Logger;
6262
private readonly instanceId: string;
63+
private readonly repo: ConsortiumRepository;
6364
private endpoints: IWebServiceEndpoint[] | undefined;
6465
private httpServer: Server | SecureServer | null = null;
6566

67+
public get className(): string {
68+
return PluginConsortiumManual.CLASS_NAME;
69+
}
70+
6671
constructor(public readonly options: IPluginConsortiumManualOptions) {
6772
const fnTag = `PluginConsortiumManual#constructor()`;
6873
if (!options) {
@@ -73,13 +78,18 @@ export class PluginConsortiumManual
7378
options.consortiumDatabase,
7479
`${fnTag} options.consortiumDatabase`,
7580
);
81+
7682
this.log = LoggerProvider.getOrCreate({
7783
label: "plugin-consortium-manual",
7884
});
85+
7986
this.instanceId = this.options.instanceId;
87+
this.repo = new ConsortiumRepository({ db: options.consortiumDatabase });
88+
8089
this.prometheusExporter =
8190
options.prometheusExporter ||
8291
new PrometheusExporter({ pollingIntervalInMin: 1 });
92+
8393
Checks.truthy(
8494
this.prometheusExporter,
8595
`${fnTag} options.prometheusExporter`,
@@ -107,12 +117,8 @@ export class PluginConsortiumManual
107117
}
108118

109119
public getNodeCount(): number {
110-
const consortiumDatabase: ConsortiumDatabase = this.options
111-
.consortiumDatabase;
112-
const consortiumRepo: ConsortiumRepository = new ConsortiumRepository({
113-
db: consortiumDatabase,
114-
});
115-
return consortiumRepo.allNodes.length;
120+
Checks.truthy(this.repo, `${this.className}.this.repo`);
121+
return this.repo.allNodes.length;
116122
}
117123

118124
/**
@@ -121,12 +127,8 @@ export class PluginConsortiumManual
121127
* only affects **the metrics**.
122128
*/
123129
public updateMetricNodeCount(): void {
124-
const consortiumDatabase: ConsortiumDatabase = this.options
125-
.consortiumDatabase;
126-
const consortiumRepo: ConsortiumRepository = new ConsortiumRepository({
127-
db: consortiumDatabase,
128-
});
129-
this.prometheusExporter.setNodeCount(consortiumRepo.allNodes.length);
130+
const nodeCount = this.getNodeCount();
131+
this.prometheusExporter.setNodeCount(nodeCount);
130132
}
131133

132134
public async shutdown(): Promise<void> {
@@ -184,10 +186,8 @@ export class PluginConsortiumManual
184186
// presence of webAppOptions implies that caller wants the plugin to configure it's own express instance on a custom
185187
// host/port to listen on
186188

187-
const { consortiumDatabase, keyPairPem } = this.options;
188-
const consortiumRepo = new ConsortiumRepository({
189-
db: consortiumDatabase,
190-
});
189+
const { keyPairPem } = this.options;
190+
const consortiumRepo = this.repo;
191191

192192
const endpoints: IWebServiceEndpoint[] = [];
193193
{
@@ -229,11 +229,12 @@ export class PluginConsortiumManual
229229
}
230230

231231
public async getNodeJws(): Promise<JWSGeneral> {
232-
const { keyPairPem, consortiumRepo: repo } = this.options;
232+
Checks.truthy(this.repo, `${this.className}.this.repo`);
233+
const { keyPairPem } = this.options;
233234

234235
this.updateMetricNodeCount();
235236
const keyPair = JWK.asKey(keyPairPem);
236-
const payloadObject = { consortiumDatabase: repo.consortiumDatabase };
237+
const payloadObject = { consortiumDatabase: this.repo.consortiumDatabase };
237238
const payloadJson = jsonStableStringify(payloadObject);
238239
const _protected = {
239240
iat: Date.now(),
@@ -245,7 +246,7 @@ export class PluginConsortiumManual
245246
}
246247

247248
public async getConsortiumJws(): Promise<JWSGeneral> {
248-
const nodes = this.options.consortiumRepo.allNodes;
249+
const nodes = this.repo.allNodes;
249250

250251
const requests = nodes
251252
.map((cnm) => cnm.nodeApiHost)

packages/cactus-plugin-consortium-manual/src/test/typescript/unit/consortium/get-node-jws-endpoint-v1.test.ts

+3-10
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,13 @@ import {
1313
Configuration,
1414
} from "@hyperledger/cactus-core-api";
1515

16-
import { ConsortiumRepository } from "@hyperledger/cactus-core";
17-
1816
import {
1917
PluginConsortiumManual,
2018
IPluginConsortiumManualOptions,
21-
} from "../../../../main/typescript/plugin-consortium-manual";
22-
23-
import {
24-
GetNodeJwsEndpoint,
25-
// IGetNodeJwsEndpointOptions,
2619
} from "../../../../main/typescript/public-api";
2720

21+
import { GetNodeJwsEndpoint } from "../../../../main/typescript/public-api";
22+
2823
import { v4 as uuidv4 } from "uuid";
2924

3025
import { DefaultApi as ConsortiumManualApi } from "../../../../main/typescript/public-api";
@@ -44,14 +39,12 @@ test("Can provide JWS", async (t: Test) => {
4439
ledger: [],
4540
pluginInstance: [],
4641
};
47-
const consortiumRepo = new ConsortiumRepository({ db });
4842

4943
// Creating the PluginConsortiumManual object to observe the prometheus metrics.
5044
const options: IPluginConsortiumManualOptions = {
5145
instanceId: uuidv4(),
5246
keyPairPem: keyPairPem,
5347
consortiumDatabase: db,
54-
consortiumRepo,
5548
};
5649

5750
const pluginConsortiumManual: PluginConsortiumManual = new PluginConsortiumManual(
@@ -138,7 +131,7 @@ test("Can provide JWS", async (t: Test) => {
138131
publicKeyPem: "",
139132
};
140133

141-
consortiumRepo.consortiumDatabase.cactusNode.push(dummyCactusNode);
134+
db.cactusNode.push(dummyCactusNode);
142135
// The invocation of the node JWS endpoint internally triggers the update
143136
// of the metrics so after it has executed we can expect the metrics to
144137
// show the new values for our assertions below

packages/cactus-test-api-client/src/test/typescript/integration/api-client-routing-node-to-node.test.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
Ledger,
2121
LedgerType,
2222
} from "@hyperledger/cactus-core-api";
23-
import { PluginRegistry, ConsortiumRepository } from "@hyperledger/cactus-core";
23+
import { PluginRegistry } from "@hyperledger/cactus-core";
2424
import {
2525
DefaultApi as QuorumApi,
2626
PluginLedgerConnectorQuorum,
@@ -128,8 +128,6 @@ test(testCase, async (t: Test) => {
128128
pluginInstance: [],
129129
};
130130

131-
const consortiumRepo = new ConsortiumRepository({ db: consortiumDatabase });
132-
133131
const config = new Configuration({ basePath: consortium.mainApiHost });
134132
const mainApiClient = new ApiClient(config);
135133

@@ -176,7 +174,6 @@ test(testCase, async (t: Test) => {
176174
keyPairPem: keyPair1.toPEM(true),
177175
consortiumDatabase,
178176
logLevel,
179-
consortiumRepo,
180177
};
181178
const pluginConsortiumManual = new PluginConsortiumManual(options);
182179

@@ -219,7 +216,6 @@ test(testCase, async (t: Test) => {
219216
keyPairPem: keyPair2.toPEM(true),
220217
consortiumDatabase,
221218
logLevel,
222-
consortiumRepo,
223219
};
224220
const pluginConsortiumManual = new PluginConsortiumManual(options);
225221

packages/cactus-test-plugin-consortium-manual/src/test/typescript/integration/plugin-consortium-manual/get-consortium-jws-endpoint.test.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
ConsortiumDatabase,
2323
ConsortiumMember,
2424
} from "@hyperledger/cactus-core-api";
25-
import { PluginRegistry, ConsortiumRepository } from "@hyperledger/cactus-core";
25+
import { PluginRegistry } from "@hyperledger/cactus-core";
2626

2727
test("member node public keys and hosts are pre-shared", async (t: Test) => {
2828
const consortiumId = uuidV4();
@@ -138,7 +138,6 @@ test("member node public keys and hosts are pre-shared", async (t: Test) => {
138138
pluginInstance: [],
139139
};
140140

141-
const consortiumRepo = new ConsortiumRepository({ db: consortiumDatabase });
142141
t.comment(`Setting up first node...`);
143142
{
144143
// 2. Instantiate plugin registry which will provide the web service plugin with the key value storage plugin
@@ -151,7 +150,6 @@ test("member node public keys and hosts are pre-shared", async (t: Test) => {
151150
keyPairPem: keyPair1.toPEM(true),
152151
consortiumDatabase,
153152
logLevel: "trace",
154-
consortiumRepo,
155153
};
156154
const pluginConsortiumManual = new PluginConsortiumManual(options);
157155

@@ -205,8 +203,7 @@ test("member node public keys and hosts are pre-shared", async (t: Test) => {
205203
pluginRegistry,
206204
keyPairPem: keyPair2.toPEM(true),
207205
consortiumDatabase,
208-
logLevel: "trace",
209-
consortiumRepo,
206+
logLevel: "TRACE",
210207
};
211208
const pluginConsortiumManual = new PluginConsortiumManual(options);
212209

@@ -261,8 +258,7 @@ test("member node public keys and hosts are pre-shared", async (t: Test) => {
261258
pluginRegistry,
262259
keyPairPem: keyPair3.toPEM(true),
263260
consortiumDatabase,
264-
logLevel: "trace",
265-
consortiumRepo,
261+
logLevel: "TRACE",
266262
};
267263
const pluginConsortiumManual = new PluginConsortiumManual(options);
268264

packages/cactus-test-plugin-consortium-manual/src/test/typescript/integration/plugin-consortium-manual/security-isolation-via-api-server-ports.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
Consortium,
1616
ConsortiumDatabase,
1717
} from "@hyperledger/cactus-core-api";
18-
import { PluginRegistry, ConsortiumRepository } from "@hyperledger/cactus-core";
18+
import { PluginRegistry } from "@hyperledger/cactus-core";
1919

2020
import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory";
2121
import {
@@ -83,8 +83,6 @@ tap.test(
8383
consortium: [consortium],
8484
};
8585

86-
const consortiumRepo = new ConsortiumRepository({ db: consortiumDatabase });
87-
8886
// 3. Instantiate the web service consortium plugin which will host itself on a new TCP port for isolation/security
8987
// Note that if we omitted the `webAppOptions` object that the web service plugin would default to installing itself
9088
// on the default port of the API server. This allows for flexibility in deployments.
@@ -98,7 +96,6 @@ tap.test(
9896
hostname: "127.0.0.1",
9997
port: 0,
10098
},
101-
consortiumRepo,
10299
};
103100
const pluginConsortiumManual = new PluginConsortiumManual(options);
104101

0 commit comments

Comments
 (0)