Skip to content

Commit 051f735

Browse files
committed
feat: service node (#2)
fix: renamed unit tests
1 parent e46f15d commit 051f735

File tree

662 files changed

+26736
-169
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

662 files changed

+26736
-169
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ If you are creating a Symbol node for the first time, please have look at the [s
3232
- Node 12.0.0+
3333
- Docker 18.3.0+
3434
- Docker Compose 1.25.0+
35-
- Symbol Bootstrap 1.1.3+.
35+
- Symbol Bootstrap 1.1.4+.
3636

3737
# Installation
3838

@@ -45,7 +45,7 @@ $ npm install -g symbol-network
4545
$ symbol-network COMMAND
4646
running command...
4747
$ symbol-network (-v|--version|version)
48-
symbol-network/0.0.1 linux-x64 node-v12.18.3
48+
symbol-network/0.0.1 linux-x64 node-v12.22.1
4949
$ symbol-network --help [COMMAND]
5050
USAGE
5151
$ symbol-network COMMAND

package-lock.json

Lines changed: 8717 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
"inquirer": "^8.2.0",
6464
"lodash": "^4.17.21",
6565
"remove": "^0.1.5",
66-
"symbol-bootstrap": "^1.1.4-alpha-3f3b67b",
66+
"symbol-bootstrap": "^1.1.4-alpha-e63d2e2",
6767
"symbol-sdk": "^1.0.3",
6868
"tslib": "^2.3.1",
6969
"winston": "^3.4.0"

src/commands/configureNodes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ This command can be executed multiple times if you need to update or upgrade you
5858
const workingDir = Constants.defaultWorkingDir;
5959
const keyStore = await NetworkCommandUtils.createStore(flags, logger, true, workingDir);
6060
const nodePassword = await NetworkCommandUtils.resolveNodePassword(flags, logger);
61-
await new NetworkService(logger, workingDir).updateNodes(keyStore, { nodePassword, offline: flags.offline, zip: flags.zip });
61+
await new NetworkService(logger, workingDir).configureNodes(keyStore, { nodePassword, offline: flags.offline, zip: flags.zip });
6262
}
6363
}

src/commands/listServices.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ export default class ListServices extends Command {
5454
logger.info(` - Explorer - ${NetworkUtils.resolveExplorerUrl(hostname)}`);
5555
logger.info(` - Faucet - ${NetworkUtils.resolveFaucetUrl(hostname)}`);
5656
}
57+
if (metadata.services) {
58+
//pretty hardcoded!
59+
logger.info(` - Explorer - ${'https://explorer.' + input.domain}`);
60+
logger.info(` - Faucet - ${'https://faucet.' + input.domain}`);
61+
}
5762
});
5863
}
5964
}

src/model/NodeInformation.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { CustomPreset, NodeAccount as NodeAddresses } from 'symbol-bootstrap';
17+
import { Assembly, CustomPreset, NodeAccount as NodeAddresses } from 'symbol-bootstrap';
1818

1919
export enum NodeMetadataType {
2020
VotingPeer = 'VotingPeer',
@@ -24,6 +24,7 @@ export enum NodeMetadataType {
2424
HarvestingDual = 'HarvestingDual',
2525
HarvestingDemo = 'HarvestingDemo',
2626
VotingNonHarvestingPeer = 'VotingNonHarvestingPeer',
27+
Services = 'Services',
2728
Peer = 'Peer',
2829
Api = 'Api',
2930
}
@@ -51,8 +52,10 @@ export interface NodeTypeMetadata {
5152
harvesting: boolean;
5253
voting: boolean;
5354
demo: boolean;
55+
services?: boolean;
5456
nickName: string;
5557
assembly?: string;
58+
suggestedCount: number;
5659
}
5760

5861
export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
@@ -65,6 +68,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
6568
api: false,
6669
peer: true,
6770
nickName: 'beacon',
71+
suggestedCount: 3,
6872
},
6973
VotingApi: {
7074
name: 'Voting Api',
@@ -75,6 +79,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
7579
api: false,
7680
peer: true,
7781
nickName: 'beacon',
82+
suggestedCount: 3,
7883
},
7984
VotingDual: {
8085
name: 'Voting Dual',
@@ -85,6 +90,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
8590
api: true,
8691
peer: true,
8792
nickName: 'dual',
93+
suggestedCount: 3,
8894
},
8995
HarvestingPeer: {
9096
name: 'Harvesting Peer',
@@ -95,6 +101,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
95101
api: false,
96102
peer: true,
97103
nickName: 'beacon',
104+
suggestedCount: 3,
98105
},
99106
HarvestingDual: {
100107
name: 'Harvesting Dual',
@@ -105,6 +112,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
105112
api: true,
106113
peer: true,
107114
nickName: 'dual',
115+
suggestedCount: 3,
108116
},
109117

110118
HarvestingDemo: {
@@ -117,6 +125,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
117125
peer: true,
118126
assembly: 'demo',
119127
nickName: 'demo',
128+
suggestedCount: 1,
120129
},
121130
Peer: {
122131
name: 'Peer',
@@ -127,6 +136,20 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
127136
api: false,
128137
peer: true,
129138
nickName: 'peer',
139+
suggestedCount: 3,
140+
},
141+
Services: {
142+
name: 'Services',
143+
balances: [],
144+
voting: false,
145+
harvesting: false,
146+
demo: false,
147+
api: false,
148+
peer: false,
149+
services: true,
150+
nickName: 'services',
151+
assembly: Assembly.services,
152+
suggestedCount: 1,
130153
},
131154
Api: {
132155
name: 'Api',
@@ -137,6 +160,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
137160
api: true,
138161
peer: false,
139162
nickName: 'api',
163+
suggestedCount: 3,
140164
},
141165
VotingNonHarvestingPeer: {
142166
name: 'Non Harvesting Voting Peer',
@@ -147,6 +171,7 @@ export const nodesMetadata: Record<NodeMetadataType, NodeTypeMetadata> = {
147171
api: false,
148172
peer: true,
149173
nickName: 'peer',
174+
suggestedCount: 3,
150175
},
151176
};
152177

src/services/NetworkConfigurationService.ts

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ import {
2525
CryptoUtils,
2626
CustomPreset,
2727
DeepPartial,
28+
FaucetPreset,
2829
FileSystemService,
2930
Logger,
30-
NodePreset,
3131
Password,
3232
PeerInfo,
3333
PrivateKeySecurityMode,
@@ -82,19 +82,21 @@ export class NetworkConfigurationService {
8282
const metadata = nodesMetadata[nodeTypeInput.nodeType];
8383
const assembly = NodeMetadataUtils.getAssembly(metadata);
8484

85-
const customPreset: CustomPreset = {
86-
privateKeySecurityMode: PrivateKeySecurityMode.PROMPT_MAIN_TRANSPORT,
87-
nodes: [
88-
{
89-
friendlyName: friendlyName,
90-
host: hostname,
91-
voting: metadata.voting,
92-
harvesting: metadata.harvesting,
93-
dockerComposeDebugMode: false,
94-
brokerDockerComposeDebugMode: false,
95-
},
96-
],
97-
};
85+
const customPreset: CustomPreset = metadata.services
86+
? { domain: input.domain }
87+
: {
88+
privateKeySecurityMode: PrivateKeySecurityMode.PROMPT_MAIN_TRANSPORT,
89+
nodes: [
90+
{
91+
friendlyName: friendlyName,
92+
host: hostname,
93+
voting: metadata.voting,
94+
harvesting: metadata.harvesting,
95+
dockerComposeDebugMode: false,
96+
brokerDockerComposeDebugMode: false,
97+
},
98+
],
99+
};
98100
if (metadata.api && nodeTypeInput.restProtocol == RestProtocol.HttpsOnly) {
99101
customPreset.gateways = [
100102
{
@@ -164,7 +166,7 @@ export class NetworkConfigurationService {
164166
return output;
165167
}
166168

167-
public async updateNodes({ nodePassword, offline, composeUser, zip }: UpdateNodesParams): Promise<void> {
169+
public async configureNodes({ nodePassword, offline, composeUser, zip }: UpdateNodesParams): Promise<void> {
168170
const input = await NetworkUtils.loadNetwork(this.workingDir);
169171
const networkPreset = ConfigLoader.loadNetworkPreset(input.preset, this.workingDir);
170172
const customNetwork = YamlUtils.isYmlFile(input.preset);
@@ -183,25 +185,20 @@ export class NetworkConfigurationService {
183185

184186
const toStoreCustomPreset = CryptoUtils.removePrivateKeys(node.customPreset) as CustomPreset;
185187

186-
const nodeCustomPreset: DeepPartial<NodePreset> | undefined = toStoreCustomPreset?.nodes?.[0];
187-
if (!nodeCustomPreset) {
188-
throw new Error(`Node's custom preset cannot be found!`);
189-
}
190-
191188
const metadata = nodesMetadata[node.nodeType];
192-
if (metadata.demo) {
189+
if (metadata.demo || metadata.services) {
193190
const faucetAccount = input.faucetBalances
194191
? await this.keyStore.getNetworkAccount(input.networkType, 'faucet', true)
195192
: undefined;
196-
toStoreCustomPreset.faucets = [
197-
_.merge(
198-
{
199-
repeat: faucetAccount ? 1 : 0,
200-
privateKey: faucetAccount?.privateKey,
193+
const faucetCustomPreset: DeepPartial<FaucetPreset> = {
194+
repeat: faucetAccount ? 1 : 0,
195+
compose: {
196+
environment: {
197+
FAUCET_PRIVATE_KEY: faucetAccount?.privateKey,
201198
},
202-
toStoreCustomPreset.faucets?.[0],
203-
),
204-
];
199+
},
200+
};
201+
toStoreCustomPreset.faucets = [_.merge(faucetCustomPreset, toStoreCustomPreset.faucets?.[0])];
205202
}
206203

207204
if (input.nemesisSeedFolder) {
@@ -241,18 +238,22 @@ export class NetworkConfigurationService {
241238
{
242239
user: composeUser || ConfigService.defaultParams.user,
243240
target: bootstrapTargetFolder,
241+
offline: offline,
244242
upgrade: true,
245243
workingDir: this.workingDir,
246244
password: nodePassword as string,
247245
},
248246
result.presetData,
249247
result.addresses,
250248
);
251-
const nodeAddresses = result.addresses.nodes?.[0];
252-
if (!nodeAddresses) {
253-
throw new Error('Node addresses should have been resolved!!!');
249+
if (!metadata.services) {
250+
const nodeAddresses = result.addresses.nodes?.[0];
251+
if (!nodeAddresses) {
252+
throw new Error('Node addresses should have been resolved!!!');
253+
}
254+
node.addresses = nodeAddresses;
254255
}
255-
node.addresses = nodeAddresses;
256+
256257
if (zip) {
257258
const zipName = `${hostname}.zip`;
258259
const zipDir = `${this.workingDir}/distribution`;

src/services/NetworkGenesisService.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ export class NetworkGenesisService {
9494
const founderAccount = await this.keyStore.getNetworkAccount(networkType, 'founder', true);
9595
for (const node of input.nodes) {
9696
const metadata = nodesMetadata[node.nodeType];
97+
if (metadata.services) {
98+
continue;
99+
}
97100
const hostname = node.hostname;
98101
const nodeId = `node-${NetworkUtils.zeroPad(node.number, 3)}`;
99102
this.logger.info(`Generating transactions and balances for node ${nodeId} ${hostname}`);
@@ -270,8 +273,8 @@ export class NetworkGenesisService {
270273
};
271274
this.logger.info(`Generating nemesis block...`);
272275
this.logger.info('');
273-
const node = input.nodes.find(async (node) => {
274-
const metadata = nodesMetadata[node.nodeType];
276+
const node = input.nodes.find(async (n) => {
277+
const metadata = nodesMetadata[n.nodeType];
275278
return metadata.harvesting;
276279
});
277280
if (!node) {
@@ -292,6 +295,7 @@ export class NetworkGenesisService {
292295
customPresetObject: nemesisCustomPreset,
293296
});
294297
await service.compose({
298+
offline: true,
295299
target: nemesisTargetFolder,
296300
user: composeUser || ConfigService.defaultParams.user,
297301
password: password || undefined,

src/services/NetworkService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class NetworkService {
4646
return new NetworkLinkService(this.logger, this.workingDir, keyStore).linkNodes(params);
4747
}
4848

49-
updateNodes(keyStore: KeyStore, params: UpdateNodesParams): Promise<void> {
50-
return new NetworkConfigurationService(this.logger, this.workingDir, keyStore).updateNodes(params);
49+
configureNodes(keyStore: KeyStore, params: UpdateNodesParams): Promise<void> {
50+
return new NetworkConfigurationService(this.logger, this.workingDir, keyStore).configureNodes(params);
5151
}
5252
}

src/utils/InitFromFileService.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ export class InitFromFileService {
2626

2727
const logger = LoggerFactory.getLogger(LogType.Console);
2828

29-
console.log();
30-
console.log(`Welcome to the ${NetworkCommandUtils.CLI_TOOL} tool. `);
31-
console.log();
32-
console.log('This tool will allow you creating a new network or a node cluster for an existing network.');
33-
console.log();
34-
console.log('The init.yml file has been provided. Cli will automatically generate the required information.');
35-
console.log();
29+
this.logger.info('');
30+
this.logger.info(`Welcome to the ${NetworkCommandUtils.CLI_TOOL} tool. `);
31+
this.logger.info('');
32+
this.logger.info('This tool will allow you creating a new network or a node cluster for an existing network.');
33+
this.logger.info('');
34+
this.logger.info('The init.yml file has been provided. Cli will automatically generate the required information.');
35+
this.logger.info('');
3636

3737
const networkInput: NetworkInputFile = await NetworkUtils.loadNetworkInput(this.workingDir);
3838

@@ -69,18 +69,18 @@ export class InitFromFileService {
6969
networkInput,
7070
customNetworkPresetFile,
7171
);
72-
console.log();
73-
console.log(
72+
this.logger.info('');
73+
this.logger.info(
7474
`The initial network preset ${customNetworkPresetFile} for the new network has been stored. This file will be updated in the following steps.`,
7575
);
76-
console.log();
76+
this.logger.info('');
7777
}
7878

7979
await NetworkUtils.saveNetworkInput(this.workingDir, networkInput);
80-
console.log();
81-
console.log(`You have created the initial ${networkInputFile}. Have a look and once once you are happy, run: `);
82-
console.log();
83-
console.log(`$ ${NetworkCommandUtils.CLI_TOOL} expandNodes`);
84-
console.log();
80+
this.logger.info('');
81+
this.logger.info(`You have created the initial ${networkInputFile}. Have a look and once once you are happy, run: `);
82+
this.logger.info('');
83+
this.logger.info(`$ ${NetworkCommandUtils.CLI_TOOL} expandNodes`);
84+
this.logger.info('');
8585
}
8686
}

0 commit comments

Comments
 (0)