@constellation-network/node-pilot 0.0.8 → 0.0.9

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.
Files changed (82) hide show
  1. package/README.md +22 -15
  2. package/bin/dev.js +1 -6
  3. package/bin/run.js +1 -1
  4. package/dist/base-command.d.ts +9 -0
  5. package/dist/base-command.js +20 -0
  6. package/dist/checks/check-hardware.js +3 -3
  7. package/dist/checks/check-layers.js +7 -7
  8. package/dist/checks/check-network.d.ts +2 -0
  9. package/dist/checks/check-network.js +46 -11
  10. package/dist/checks/check-node-ctl.js +4 -4
  11. package/dist/checks/check-project.js +13 -8
  12. package/dist/checks/check-wallet.d.ts +3 -0
  13. package/dist/checks/check-wallet.js +37 -0
  14. package/dist/clm.d.ts +1 -0
  15. package/dist/clm.js +3 -0
  16. package/dist/commands/config/get.d.ts +6 -0
  17. package/dist/commands/config/get.js +57 -11
  18. package/dist/commands/config/set.d.ts +0 -1
  19. package/dist/commands/config/set.js +13 -11
  20. package/dist/commands/config.js +17 -22
  21. package/dist/commands/info.js +3 -2
  22. package/dist/commands/logs.d.ts +1 -1
  23. package/dist/commands/logs.js +7 -3
  24. package/dist/commands/restart.d.ts +5 -2
  25. package/dist/commands/restart.js +25 -5
  26. package/dist/commands/shutdown.js +3 -3
  27. package/dist/commands/status.js +4 -0
  28. package/dist/commands/test.js +11 -3
  29. package/dist/config-store.d.ts +43 -30
  30. package/dist/config-store.js +71 -33
  31. package/dist/helpers/config-helper.js +2 -2
  32. package/dist/helpers/env-templates.d.ts +4 -3
  33. package/dist/helpers/env-templates.js +28 -20
  34. package/dist/helpers/key-file-helper.d.ts +2 -0
  35. package/dist/helpers/key-file-helper.js +51 -16
  36. package/dist/helpers/project-helper.d.ts +2 -2
  37. package/dist/helpers/project-helper.js +37 -38
  38. package/dist/helpers/prompt-helper.d.ts +0 -1
  39. package/dist/helpers/prompt-helper.js +15 -15
  40. package/dist/services/archiver-service.d.ts +17 -0
  41. package/dist/services/archiver-service.js +104 -0
  42. package/dist/services/cluster-service.d.ts +10 -6
  43. package/dist/services/cluster-service.js +45 -45
  44. package/dist/services/docker-service.d.ts +9 -0
  45. package/dist/{helpers/docker-helper.js → services/docker-service.js} +8 -5
  46. package/dist/services/fastforward-service.js +3 -3
  47. package/dist/services/get-random-node.js +1 -1
  48. package/dist/{helpers/github-helper.d.ts → services/github-service.d.ts} +1 -1
  49. package/dist/{helpers/github-helper.js → services/github-service.js} +1 -1
  50. package/dist/services/node-service.js +14 -14
  51. package/dist/test.d.ts +1 -0
  52. package/dist/test.js +50 -0
  53. package/dist/types.d.ts +6 -0
  54. package/install-dependencies.sh +0 -2
  55. package/oclif.manifest.json +23 -4
  56. package/package.json +9 -8
  57. package/projects/hypergraph/Dockerfile +27 -18
  58. package/projects/hypergraph/docker-compose.yml +14 -12
  59. package/projects/hypergraph/networks/integrationnet/gl0.env +4 -0
  60. package/projects/hypergraph/networks/integrationnet/gl1.env +4 -0
  61. package/projects/hypergraph/networks/integrationnet/network.env +8 -0
  62. package/projects/hypergraph/networks/{integrationnet.env → integrationnet/source-nodes.env} +1 -9
  63. package/projects/hypergraph/networks/mainnet/gl0.env +4 -0
  64. package/projects/hypergraph/networks/mainnet/gl1.env +4 -0
  65. package/projects/hypergraph/networks/mainnet/network.env +8 -0
  66. package/projects/hypergraph/networks/{mainnet.env → mainnet/source-nodes.env} +0 -8
  67. package/projects/hypergraph/networks/testnet/gl0.env +5 -0
  68. package/projects/hypergraph/networks/testnet/gl1.env +4 -0
  69. package/projects/hypergraph/networks/testnet/network.env +8 -0
  70. package/projects/hypergraph/networks/{testnet.env → testnet/source-nodes.env} +0 -8
  71. package/projects/hypergraph/scripts/check-version.sh +31 -0
  72. package/projects/hypergraph/scripts/docker-build.sh +12 -1
  73. package/projects/hypergraph/scripts/install.sh +30 -25
  74. package/projects/hypergraph/seedlist +268 -0
  75. package/scripts/autoheal.sh +8 -0
  76. package/scripts/services/io.constellationnetwork.nodepilot.Updater.plist +16 -0
  77. package/scripts/services/node-pilot-autoheal.service +14 -0
  78. package/scripts/services/node-pilot-updater-hypergraph.service +15 -0
  79. package/scripts/updater.sh +13 -0
  80. package/dist/helpers/docker-helper.d.ts +0 -7
  81. package/projects/hypergraph/layers/gl1.env +0 -3
  82. package/projects/scripts/docker-cleanup.sh +0 -64
@@ -1,5 +1,7 @@
1
1
  import { Args, Command } from '@oclif/core';
2
- import { commonEnvNames, configStore, layerEnvNames } from "../../config-store.js";
2
+ import chalk from "chalk";
3
+ import { clm } from "../../clm.js";
4
+ import { configStore, layerEnvNames, networkEnvNames } from "../../config-store.js";
3
5
  import { configHelper } from "../../helpers/config-helper.js";
4
6
  export default class ConfigSet extends Command {
5
7
  static args = {
@@ -11,31 +13,31 @@ export default class ConfigSet extends Command {
11
13
  '<%= config.bin %> <%= command.id %> CL_EXTERNAL_IP 127.0.0.1',
12
14
  '<%= config.bin %> <%= command.id %> gl0:CL_PUBLIC_HTTP_PORT 9000',
13
15
  ];
14
- logErrorAndExit(message) {
15
- this.log(message);
16
- this.exit(0);
17
- }
18
16
  async run() {
19
17
  configHelper.assertProject('No configuration found. ');
20
18
  const { args } = await this.parse(ConfigSet);
21
19
  const { layersToRun } = configStore.getProjectInfo();
20
+ if (args.name.startsWith('key')) {
21
+ clm.error(`Key properties cannot be set directly. Please run ${chalk.cyan('cpilot config')} and select ${chalk.cyan('Key Info')} to manage the key file.`);
22
+ }
23
+ const { type: network } = configStore.getNetworkInfo();
22
24
  if (args.name.includes(':')) {
23
25
  const [layer, name] = args.name.split(':');
24
26
  if (!layersToRun.includes(layer)) {
25
- this.logErrorAndExit(`Invalid layer: ${layer}. Available layers: ${layersToRun.join(',')}`);
27
+ clm.error(`Invalid layer: ${layer}. Available layers: ${layersToRun.join(',')}`);
26
28
  }
27
29
  const validLayer = layer;
28
30
  if (!Object.hasOwn(layerEnvNames, name)) {
29
- this.logErrorAndExit(`Invalid layer configuration name: ${name}`);
31
+ clm.error(`Invalid layer configuration name: ${name}. Valid names are: ${Object.keys(layerEnvNames).join(', ')}`);
30
32
  }
31
- configStore.setEnvLayerInfo(validLayer, { [name]: args.value });
33
+ configStore.setEnvLayerInfo(network, validLayer, { [name]: args.value });
32
34
  }
33
35
  else {
34
36
  const { name } = args;
35
- if (!Object.hasOwn(commonEnvNames, name)) {
36
- this.logErrorAndExit(`Invalid configuration name: ${name}`);
37
+ if (!Object.hasOwn(networkEnvNames, name)) {
38
+ clm.error(`Invalid configuration name: ${name}. Valid names are: ${Object.keys(networkEnvNames).join(', ')}`);
37
39
  }
38
- configStore.setEnvCommonInfo({ [name]: args.value });
40
+ configStore.setEnvNetworkInfo(network, { [name]: args.value });
39
41
  }
40
42
  }
41
43
  }
@@ -3,11 +3,10 @@ import { Command } from '@oclif/core';
3
3
  import { checkNetwork } from "../checks/check-network.js";
4
4
  import { checkProject } from "../checks/check-project.js";
5
5
  import { clm } from "../clm.js";
6
- import { configStore } from "../config-store.js";
7
6
  import { configHelper } from "../helpers/config-helper.js";
8
- import { dockerHelper } from "../helpers/docker-helper.js";
9
7
  import { keyFileHelper } from "../helpers/key-file-helper.js";
10
8
  import { promptHelper } from "../helpers/prompt-helper.js";
9
+ import { dockerService } from "../services/docker-service.js";
11
10
  export default class Config extends Command {
12
11
  static description = 'Update configuration settings';
13
12
  static examples = [
@@ -15,51 +14,47 @@ export default class Config extends Command {
15
14
  ];
16
15
  async run() {
17
16
  configHelper.assertProject('No configuration found. ');
18
- let { name } = configStore.getProjectInfo();
19
- name = name.charAt(0).toUpperCase() + name.slice(1);
17
+ // let {name} = configStore.getProjectInfo();
18
+ // name = name.charAt(0).toUpperCase() + name.slice(1);
20
19
  const answer = await select({
21
20
  choices: [
22
- { name: 'Auto Restart', value: 'autoRestart' },
23
21
  { name: 'External IP Address', value: 'externalIp' },
24
22
  { name: 'Java Memory', value: 'javaMemory' },
25
23
  { name: 'Key File', value: 'keyFile' },
26
- { name: `${name} - Layers To Run`, value: 'layersToRun' },
27
- { name: `Network (mainnet, testnet or intnet)`, value: 'network' },
24
+ { name: 'Layers To Run', value: 'layersToRun' },
25
+ { name: `Network`, value: 'network' },
28
26
  ],
29
27
  message: 'What would you like to change?:',
30
28
  });
31
29
  // eslint-disable-next-line unicorn/prefer-switch
32
- if (answer === 'autoRestart') {
33
- await promptHelper.configureAutoRestart();
34
- }
35
- else if (answer === 'externalIp') {
30
+ if (answer === 'externalIp') {
36
31
  await checkNetwork.configureIpAddress();
37
32
  }
38
33
  else if (answer === 'javaMemory') {
34
+ await shutdownNodeIfRunning();
39
35
  await promptHelper.configureJavaMemoryArguments();
40
- if (await dockerHelper.isRunning()) {
41
- clm.preStep('The validator node must be restarted before changes can be applied.');
42
- await promptHelper.doYouWishToContinue();
43
- await dockerHelper.dockerDown();
44
- await dockerHelper.dockerUp();
45
- }
46
36
  }
47
37
  else if (answer === 'keyFile') {
38
+ await shutdownNodeIfRunning();
48
39
  await keyFileHelper.showKeyFileInfo();
49
40
  await keyFileHelper.promptForKeyFile();
50
41
  }
51
42
  else if (answer === 'layersToRun') {
52
- if (await dockerHelper.isRunning()) {
53
- clm.preStep('The validator node must be stopped first.');
54
- await promptHelper.doYouWishToContinue();
55
- await dockerHelper.dockerDown();
56
- }
43
+ await shutdownNodeIfRunning();
57
44
  await promptHelper.selectLayers();
58
45
  await promptHelper.configureJavaMemoryArguments();
59
46
  }
60
47
  else if (answer === 'network') {
48
+ await shutdownNodeIfRunning();
61
49
  await promptHelper.selectNetwork();
62
50
  await checkProject.runInstall();
63
51
  }
64
52
  }
65
53
  }
54
+ async function shutdownNodeIfRunning() {
55
+ if (await dockerService.isRunning()) {
56
+ clm.preStep('The validator node must be stopped first.');
57
+ await promptHelper.doYouWishToContinue();
58
+ await dockerService.dockerDown();
59
+ }
60
+ }
@@ -10,10 +10,13 @@ export default class Info extends Command {
10
10
  configHelper.assertProject('No project info found. ');
11
11
  const projectInfo = configStore.getProjectInfo();
12
12
  const networkInfo = configStore.getNetworkInfo();
13
+ const { CL_EXTERNAL_IP: currentIpAddress } = configStore.getEnvInfo();
13
14
  // Project Name
14
15
  configHelper.showEnvInfo('Project Name', projectInfo.name);
15
16
  // DAG Address
16
17
  configHelper.showEnvInfo('DAG Address', projectInfo.dagAddress);
18
+ // External IP Address
19
+ configHelper.showEnvInfo('External IP Address', currentIpAddress);
17
20
  // Node ID
18
21
  configHelper.showEnvInfo('Node ID', projectInfo.nodeId);
19
22
  // Layers to Run
@@ -26,7 +29,5 @@ export default class Info extends Command {
26
29
  configHelper.showEnvInfo('Project Directory', projectInfo.projectDir);
27
30
  // Fast Forward
28
31
  configHelper.showEnvInfo('Fast Forward Enabled', (projectInfo.fastForward === undefined || Boolean(projectInfo.fastForward)).toString());
29
- // Auto Restart
30
- configHelper.showEnvInfo('Auto Restart Enabled', Boolean(projectInfo.autoRestart).toString());
31
32
  }
32
33
  }
@@ -1,7 +1,7 @@
1
1
  import { Command } from '@oclif/core';
2
2
  export default class Logs extends Command {
3
3
  static args: {
4
- layer: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
4
+ layer: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
5
  };
6
6
  static description: string;
7
7
  static examples: string[];
@@ -5,7 +5,7 @@ import { configHelper } from "../helpers/config-helper.js";
5
5
  import { shellService } from "../services/shell-service.js";
6
6
  export default class Logs extends Command {
7
7
  static args = {
8
- layer: Args.string({ description: 'network layer to view. e.g. gl0' }),
8
+ layer: Args.string({ description: 'network layer to view. e.g. gl0', required: true }),
9
9
  };
10
10
  static description = 'view validator node runtime logs';
11
11
  static examples = [
@@ -17,14 +17,18 @@ export default class Logs extends Command {
17
17
  };
18
18
  async run() {
19
19
  configHelper.assertProject('No project found. ');
20
- const { flags } = await this.parse(Logs);
20
+ const { args, flags } = await this.parse(Logs);
21
21
  const numOfLines = Number.isNaN(Number(flags.numOfLines)) ? 100 : Number(flags.numOfLines);
22
+ const { layersToRun } = configStore.getProjectInfo();
23
+ if (!layersToRun.includes(args.layer)) {
24
+ this.error(`Invalid layer: ${args.layer}. Available layers: ${layersToRun.join(',')}`);
25
+ }
22
26
  let tailFlag = flags.numOfLines ? `-n ${numOfLines}` : '-n 100';
23
27
  if (flags.follow) {
24
28
  tailFlag = ' -f';
25
29
  }
26
30
  const { projectDir } = configStore.getProjectInfo();
27
- const logPath = path.join(projectDir, 'app-data', 'gl0-logs', 'app.log');
31
+ const logPath = path.join(projectDir, 'app-data', `${args.layer}-logs`, 'app.log');
28
32
  await shellService.runCommand(`tail ${tailFlag} ${logPath}`).catch(() => 1);
29
33
  }
30
34
  }
@@ -1,5 +1,8 @@
1
- import { Command } from '@oclif/core';
2
- export default class Restart extends Command {
1
+ import { BaseCommand } from "../base-command.js";
2
+ export default class Restart extends BaseCommand {
3
+ static args: {
4
+ layer: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
5
+ };
3
6
  static description: string;
4
7
  static examples: string[];
5
8
  run(): Promise<void>;
@@ -1,25 +1,45 @@
1
- import { Command } from '@oclif/core';
1
+ import { Args } from '@oclif/core';
2
+ import { BaseCommand } from "../base-command.js";
2
3
  import { checkProject } from "../checks/check-project.js";
3
4
  import { clm } from "../clm.js";
4
5
  import { configStore } from "../config-store.js";
5
6
  import { configHelper } from "../helpers/config-helper.js";
6
- import { dockerHelper } from "../helpers/docker-helper.js";
7
+ import { dockerService } from "../services/docker-service.js";
7
8
  import { nodeService } from "../services/node-service.js";
8
- export default class Restart extends Command {
9
+ export default class Restart extends BaseCommand {
10
+ static args = {
11
+ layer: Args.string({ description: 'network layer to view. e.g. gl0' }),
12
+ };
9
13
  static description = 'A full shutdown of the validator node, then restart';
10
14
  static examples = [
11
15
  '<%= config.bin %> <%= command.id %>',
12
16
  ];
13
17
  async run() {
18
+ const { args, flags } = await this.parse(Restart);
19
+ this.checkProject(flags);
14
20
  configHelper.assertProject('No project found. ');
15
21
  const { layersToRun } = configStore.getProjectInfo();
22
+ if (!await dockerService.isRunning()) {
23
+ this.error('The validator node is not running.');
24
+ }
25
+ if (args && args.layer) {
26
+ const layer = args.layer;
27
+ if (!layersToRun.includes(layer)) {
28
+ this.error(`Invalid layer: ${layer}. Available layers: ${layersToRun.join(',')}`);
29
+ }
30
+ await nodeService.leaveCluster(layer);
31
+ await nodeService.pollForLayersState([layer], 'Offline');
32
+ clm.preStep(`Restarting ${layer.toUpperCase()}...`);
33
+ await dockerService.dockerRestart(layer);
34
+ return;
35
+ }
16
36
  await nodeService.leaveClusterAllLayers();
17
37
  await nodeService.pollForLayersState(layersToRun, 'Offline');
18
38
  clm.preStep('Stopping the node...');
19
- await dockerHelper.dockerDown();
39
+ await dockerService.dockerDown();
20
40
  clm.preStep('Checking for a new version...');
21
41
  await checkProject.runUpgrade();
22
42
  clm.preStep('Starting the node...');
23
- await dockerHelper.dockerUp();
43
+ await dockerService.dockerUp();
24
44
  }
25
45
  }
@@ -1,8 +1,8 @@
1
1
  import { Command } from '@oclif/core';
2
2
  import { configStore } from "../config-store.js";
3
- import { dockerHelper } from "../helpers/docker-helper.js";
4
- import { nodeService } from "../services/node-service.js";
5
3
  import { configHelper } from "../helpers/config-helper.js";
4
+ import { dockerService } from "../services/docker-service.js";
5
+ import { nodeService } from "../services/node-service.js";
6
6
  export default class Shutdown extends Command {
7
7
  static description = 'A full shutdown of the validator node';
8
8
  static examples = [
@@ -13,6 +13,6 @@ export default class Shutdown extends Command {
13
13
  const { layersToRun } = configStore.getProjectInfo();
14
14
  await nodeService.leaveClusterAllLayers();
15
15
  await nodeService.pollForLayersState(layersToRun, 'Offline');
16
- await dockerHelper.dockerDown();
16
+ await dockerService.dockerDown();
17
17
  }
18
18
  }
@@ -4,6 +4,7 @@ import { checkLayers } from "../checks/check-layers.js";
4
4
  import { checkNetwork } from "../checks/check-network.js";
5
5
  import { checkNodeCtl } from "../checks/check-node-ctl.js";
6
6
  import { checkProject } from "../checks/check-project.js";
7
+ import { checkWallet } from "../checks/check-wallet.js";
7
8
  import { keyFileHelper } from "../helpers/key-file-helper.js";
8
9
  export default class Status extends Command {
9
10
  // eslint-disable-next-line no-warning-comments
@@ -16,10 +17,13 @@ export default class Status extends Command {
16
17
  export async function checkInstallationAndConfigurationStatus() {
17
18
  await checkInitialSetup.firstTimeRun();
18
19
  await checkProject.projectInstallation();
20
+ await checkNetwork.isNetworkConnectable();
19
21
  await checkProject.releaseVersion();
20
22
  await checkNodeCtl.check4Migration();
21
23
  await keyFileHelper.promptIfNoKeyFile();
22
24
  await checkNetwork.checkSeedList();
25
+ await checkNetwork.checkForExistingNodeIdInCluster();
26
+ await checkWallet.checkCollateral();
23
27
  await checkLayers.layersRunning();
24
28
  await checkLayers.layersReadyToJoin();
25
29
  await checkLayers.layersStatus();
@@ -3,16 +3,24 @@ import dotenv from "dotenv";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
+ import { archiverService } from "../services/archiver-service.js";
6
7
  import { getRandomNode } from "../services/get-random-node.js";
7
- import { checkNodeCtl } from "../checks/check-node-ctl.js";
8
8
  export default class Test extends Command {
9
9
  static description = 'node pilot test command';
10
10
  static hidden = true;
11
11
  async run() {
12
- await checkNodeCtl.importKeyInfo(path.resolve('/Users/ffox/Projects/Constellation/node-pilot/cn-config.yaml'));
12
+ // await checkNodeCtl.importKeyInfo(path.resolve('/Users/ffox/Projects/Constellation/node-pilot/cn-config.yaml'));
13
+ // await this.testRandomNode();
14
+ // const info = await archiverService.getArchiveSnapshotInfo();
15
+ // console.log(info);
16
+ // const ordinal = archiverService.getDownloadedSnapshotRange();
17
+ // console.log(ordinal)
18
+ //
19
+ // await archiverService.syncToLatestSnapshot();
20
+ await archiverService.checkLogsForMissingSnapshots();
13
21
  }
14
22
  async testRandomNode() {
15
- const filePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), `../../projects/hypergraph/networks/mainnet.env`);
23
+ const filePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), `../../projects/hypergraph/networks/mainnet/source-nodes.env`);
16
24
  const conetent = fs.readFileSync(filePath);
17
25
  const parsed = dotenv.parse(conetent);
18
26
  const nodes = ['1', '2', '3'].map(i => {
@@ -1,80 +1,97 @@
1
- import { TessellationLayer } from "./types.js";
1
+ import { ClusterStats, TessellationLayer } from "./types.js";
2
2
  declare class ConfigStore {
3
3
  private pilotStore;
4
4
  private projectStore;
5
5
  constructor();
6
6
  applyNewProjectStore(name: string): Promise<void>;
7
7
  changeProjectStore(name: string): void;
8
+ getAppDir(): string;
8
9
  getDockerEnvInfo(): object;
9
- getEnvCommonInfo(): EnvCommonInfo;
10
10
  getEnvInfo(): EnvInfo;
11
- getEnvLayerInfo(layer: TessellationLayer): EnvLayerInfo;
11
+ getEnvLayerInfo(network: NetworkType, layer: TessellationLayer): EnvLayerInfo;
12
+ getEnvNetworkInfo(network: NetworkType): EnvNetworkInfo;
12
13
  getLayerPortInfo(layer: TessellationLayer): PortInfo;
13
- getNetworkEnvInfo(network: NetworkType): EnvCommonInfo;
14
14
  getNetworkInfo(): NetworkInfo;
15
15
  getProjectInfo(): ProjectInfo;
16
+ getProjects(): string[];
16
17
  getSystemInfo(): SystemInfo;
17
- hasProjectFlag(name: string): boolean;
18
+ hasProjectFlag(name: string): any;
18
19
  hasProjects(): boolean;
20
+ setClusterStats(info: Partial<ClusterStats>): void;
19
21
  setDockerEnvInfo(info: Partial<{
20
22
  DOCKER_IMAGE_VERSION: string;
21
23
  DOCKER_USER_ID: string;
22
24
  }>): void;
23
- setEnvCommonInfo(info: Partial<EnvCommonInfo>): void;
24
- setEnvInfo(info: DeepPartial<EnvInfo>): void;
25
- setEnvLayerInfo(layer: TessellationLayer, info: Partial<EnvLayerInfo>): void;
26
- setNetworkEnvInfo(info: NetworkEnvInfo): void;
25
+ setEnvInfo(info: Partial<EnvInfo>): void;
26
+ setEnvLayerInfo(network: NetworkType, layer: TessellationLayer, info: Partial<EnvLayerInfo>): void;
27
+ setEnvNetworkInfo(network: NetworkType, info: Partial<EnvNetworkInfo>): void;
27
28
  setNetworkInfo(info: Partial<NetworkInfo>): void;
28
29
  setProjectFlag(name: string, value: boolean): any;
29
30
  setProjectInfo(info: Partial<ProjectInfo>): void;
30
31
  setSystemInfo(info: Partial<SystemInfo>): void;
32
+ private getPilotInfo;
33
+ private setPilotInfo;
31
34
  }
32
35
  export declare const configStore: ConfigStore;
33
- type DeepPartial<T> = {
34
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
36
+ export type EnvInfo = EnvKeyInfo & {
37
+ CL_ARCHIVE_NODE: boolean;
38
+ CL_EXTERNAL_IP: string;
35
39
  };
36
- export type EnvInfo = {
37
- common: EnvCommonInfo;
38
- layers: Record<TessellationLayer, EnvLayerInfo>;
40
+ export declare const envNames: {
41
+ CL_EXTERNAL_IP: number;
42
+ CL_KEYALIAS: number;
43
+ CL_KEYSTORE: number;
44
+ CL_PASSWORD: number;
39
45
  };
40
- export type EnvCommonInfo = {
46
+ export type EnvCombinedInfo = EnvInfo & EnvLayerInfo & EnvNetworkInfo;
47
+ export type EnvNetworkInfo = EnvPeerInfo & {
41
48
  CL_APP_ENV: string;
42
- CL_EXTERNAL_IP: string;
49
+ CL_COLLATERAL: string;
50
+ CL_L0_TOKEN_IDENTIFIER: string;
51
+ };
52
+ export type EnvKeyInfo = {
53
+ CL_KEYALIAS: string;
54
+ CL_KEYSTORE: string;
55
+ CL_PASSWORD: string;
56
+ };
57
+ export type EnvPeerInfo = {
43
58
  CL_GLOBAL_L0_PEER_HOST: string;
44
59
  CL_GLOBAL_L0_PEER_HTTP_PORT: string;
45
60
  CL_GLOBAL_L0_PEER_ID: string;
46
- CL_KEYALIAS: string;
47
- CL_KEYSTORE: string;
48
61
  CL_L0_PEER_HTTP_HOST: string;
49
62
  CL_L0_PEER_HTTP_PORT: string;
50
63
  CL_L0_PEER_ID: string;
51
64
  CL_L0_PEER_P2P_PORT: string;
52
- CL_L0_TOKEN_IDENTIFIER: string;
53
- CL_PASSWORD: string;
54
65
  };
55
- export declare const commonEnvNames: {
66
+ export declare const networkEnvNames: {
56
67
  CL_APP_ENV: number;
57
- CL_EXTERNAL_IP: number;
58
68
  CL_GLOBAL_L0_PEER_HOST: number;
59
69
  CL_GLOBAL_L0_PEER_HTTP_PORT: number;
60
70
  CL_GLOBAL_L0_PEER_ID: number;
61
- CL_KEYALIAS: number;
62
- CL_KEYSTORE: number;
63
71
  CL_L0_PEER_HTTP_HOST: number;
64
72
  CL_L0_PEER_HTTP_PORT: number;
65
73
  CL_L0_PEER_ID: number;
74
+ CL_L0_PEER_P2P_PORT: number;
66
75
  CL_L0_TOKEN_IDENTIFIER: number;
67
- CL_PASSWORD: number;
68
76
  };
69
- export type EnvLayerInfo = {
77
+ export type EnvLayerInfo = EnvPeerInfo & {
70
78
  CL_CLI_HTTP_PORT: string;
71
79
  CL_DOCKER_JAVA_OPTS: string;
80
+ CL_LB: string;
72
81
  CL_P2P_HTTP_PORT: string;
73
82
  CL_PUBLIC_HTTP_PORT: string;
74
83
  };
75
84
  export declare const layerEnvNames: {
76
85
  CL_CLI_HTTP_PORT: number;
77
86
  CL_DOCKER_JAVA_OPTS: number;
87
+ CL_GLOBAL_L0_PEER_HOST: number;
88
+ CL_GLOBAL_L0_PEER_HTTP_PORT: number;
89
+ CL_GLOBAL_L0_PEER_ID: number;
90
+ CL_L0_PEER_HTTP_HOST: number;
91
+ CL_L0_PEER_HTTP_PORT: number;
92
+ CL_L0_PEER_ID: number;
93
+ CL_L0_PEER_P2P_PORT: number;
94
+ CL_LB: number;
78
95
  CL_P2P_HTTP_PORT: number;
79
96
  CL_PUBLIC_HTTP_PORT: number;
80
97
  };
@@ -87,9 +104,6 @@ export type SystemInfo = {
87
104
  };
88
105
  export type NetworkType = 'integrationnet' | 'mainnet' | 'testnet';
89
106
  export type ProjectInfo = {
90
- autoRestart: boolean;
91
- autoStart: boolean;
92
- autoUpdate: boolean;
93
107
  dagAddress: string;
94
108
  fastForward: boolean;
95
109
  homeDir: string;
@@ -103,7 +117,6 @@ export type NetworkInfo = {
103
117
  type: NetworkType;
104
118
  version: string;
105
119
  };
106
- export type NetworkEnvInfo = Record<NetworkType, EnvCommonInfo>;
107
120
  export type PortInfo = {
108
121
  CLI: string;
109
122
  P2P: string;
@@ -41,83 +41,102 @@ class ConfigStore {
41
41
  }
42
42
  }
43
43
  else {
44
- this.pilotStore.setItem('pilot', { appDir, project: name, projects: [...projects, name] });
44
+ this.setPilotInfo({ project: name, projects: [...projects, name] });
45
45
  }
46
46
  fs.mkdirSync(path.join(projectDir, 'config'), { recursive: true });
47
47
  this.projectStore = new JSONStorage(path.join(projectDir, 'config'));
48
48
  this.setDockerEnvInfo({ DOCKER_IMAGE_VERSION: 'test' });
49
49
  this.setProjectInfo({ name, projectDir });
50
- this.setEnvInfo({ common: { CL_GLOBAL_L0_PEER_HTTP_PORT: '9000' }, layers: { gl0: { CL_PUBLIC_HTTP_PORT: "9000" } } });
51
50
  }
52
51
  changeProjectStore(name) {
53
- const { appDir, projects } = this.pilotStore.getItem('pilot');
52
+ const { appDir, project, projects } = this.pilotStore.getItem('pilot');
54
53
  if (projects && projects.includes(name)) {
54
+ if (project === name)
55
+ return;
55
56
  this.projectStore = new JSONStorage(path.join(appDir, name, 'config'));
57
+ this.setPilotInfo({ project: name });
56
58
  }
57
59
  else {
58
60
  throw new Error(`Project ${name} doesn't exist.`);
59
61
  }
60
62
  }
63
+ getAppDir() {
64
+ const { appDir } = this.pilotStore.getItem('pilot');
65
+ return appDir;
66
+ }
61
67
  getDockerEnvInfo() {
62
68
  return this.projectStore.getItem('docker');
63
69
  }
64
- getEnvCommonInfo() {
65
- return this.projectStore.getItem('env')?.common;
66
- }
67
70
  getEnvInfo() {
68
- return this.projectStore.getItem('env');
71
+ return this.projectStore.getItem('env') || {};
69
72
  }
70
- getEnvLayerInfo(layer) {
71
- const envInfo = this.projectStore.getItem('env');
73
+ getEnvLayerInfo(network, layer) {
74
+ const envInfo = this.projectStore.getItem('layer-env');
75
+ if (!envInfo)
76
+ return { [network]: {} };
77
+ return envInfo[network][layer] || {};
78
+ }
79
+ getEnvNetworkInfo(network) {
80
+ const envInfo = this.projectStore.getItem('network-env');
72
81
  if (!envInfo)
73
82
  return {};
74
- return { ...envInfo.common, ...envInfo.layers[layer] };
83
+ return envInfo[network];
75
84
  }
76
85
  getLayerPortInfo(layer) {
77
- const layerInfo = this.getEnvLayerInfo(layer);
86
+ const { type: network } = this.getNetworkInfo();
87
+ const layerInfo = this.getEnvLayerInfo(network, layer);
78
88
  return { CLI: layerInfo.CL_CLI_HTTP_PORT, P2P: layerInfo.CL_P2P_HTTP_PORT, PUBLIC: layerInfo.CL_PUBLIC_HTTP_PORT };
79
89
  }
80
- getNetworkEnvInfo(network) {
81
- const info = this.projectStore.getItem('network-env');
82
- return info ? info[network] : {};
83
- }
84
90
  getNetworkInfo() {
85
91
  return this.projectStore.getItem('network');
86
92
  }
87
93
  getProjectInfo() {
88
94
  return this.projectStore.getItem('project');
89
95
  }
96
+ getProjects() {
97
+ const { projects } = this.pilotStore.getItem('pilot');
98
+ return projects;
99
+ }
90
100
  getSystemInfo() {
91
101
  return this.pilotStore.getItem('system');
92
102
  }
93
103
  hasProjectFlag(name) {
94
104
  const flags = this.projectStore.getItem('flags') || {};
95
- return flags[name] !== undefined;
105
+ return flags[name] || false;
96
106
  }
97
107
  hasProjects() {
98
108
  const { projects } = this.pilotStore.getItem('pilot');
99
109
  return projects.length > 0;
100
110
  }
111
+ // setCurrentEnvNetworkInfo(info: Partial<EnvNetworkInfo>) {
112
+ // const {type} = this.getNetworkInfo();
113
+ // this.setEnvNetworkInfo(type, info);
114
+ // }
115
+ setClusterStats(info) {
116
+ const oldInfo = this.projectStore.getItem('cluster-stats');
117
+ this.projectStore.setItem('cluster-stats', { ...oldInfo, ...info });
118
+ }
101
119
  setDockerEnvInfo(info) {
102
120
  const oldInfo = this.projectStore.getItem('docker');
103
121
  this.projectStore.setItem('docker', { ...oldInfo, ...info });
104
122
  }
105
- setEnvCommonInfo(info) {
106
- const oldInfo = this.projectStore.getItem('env');
107
- this.projectStore.setItem('env', { common: { ...oldInfo.common, ...info }, layers: oldInfo.layers });
108
- }
109
123
  setEnvInfo(info) {
110
124
  const oldInfo = this.projectStore.getItem('env');
111
125
  this.projectStore.setItem('env', { ...oldInfo, ...info });
112
126
  }
113
- setEnvLayerInfo(layer, info) {
114
- const envInfo = this.projectStore.getItem('env');
115
- const { common, layers } = envInfo;
116
- this.projectStore.setItem('env', { common, layers: { ...layers, [layer]: { ...layers[layer], ...info } } });
127
+ setEnvLayerInfo(network, layer, info) {
128
+ let layers = this.projectStore.getItem('layer-env');
129
+ if (!layers)
130
+ layers = {};
131
+ if (!layers[network])
132
+ layers[network] = {};
133
+ this.projectStore.setItem('layer-env', { ...layers, [network]: { ...layers[network], [layer]: { ...layers[network][layer], ...info } } });
117
134
  }
118
- setNetworkEnvInfo(info) {
119
- const oldInfo = this.projectStore.getItem('network-env');
120
- this.projectStore.setItem('network-env', { ...oldInfo, ...info });
135
+ setEnvNetworkInfo(network, info) {
136
+ let networks = this.projectStore.getItem('network-env');
137
+ if (!networks)
138
+ networks = {};
139
+ this.projectStore.setItem('network-env', { ...networks, [network]: { ...networks[network], ...info } });
121
140
  }
122
141
  setNetworkInfo(info) {
123
142
  const oldInfo = this.projectStore.getItem('network');
@@ -137,25 +156,44 @@ class ConfigStore {
137
156
  const oldInfo = this.projectStore.getItem('system');
138
157
  this.pilotStore.setItem('system', { ...oldInfo, ...info });
139
158
  }
159
+ getPilotInfo() {
160
+ return this.pilotStore.getItem('pilot');
161
+ }
162
+ setPilotInfo(info) {
163
+ const oldInfo = this.pilotStore.getItem('pilot');
164
+ this.pilotStore.setItem('pilot', { ...oldInfo, ...info });
165
+ }
140
166
  }
141
167
  export const configStore = new ConfigStore();
142
- export const commonEnvNames = {
143
- CL_APP_ENV: 1,
168
+ export const envNames = {
144
169
  CL_EXTERNAL_IP: 1,
170
+ CL_KEYALIAS: 1,
171
+ CL_KEYSTORE: 1,
172
+ CL_PASSWORD: 1
173
+ };
174
+ export const networkEnvNames = {
175
+ CL_APP_ENV: 1,
145
176
  CL_GLOBAL_L0_PEER_HOST: 1,
146
177
  CL_GLOBAL_L0_PEER_HTTP_PORT: 1,
147
178
  CL_GLOBAL_L0_PEER_ID: 1,
148
- CL_KEYALIAS: 1,
149
- CL_KEYSTORE: 1,
150
179
  CL_L0_PEER_HTTP_HOST: 1,
151
180
  CL_L0_PEER_HTTP_PORT: 1,
152
181
  CL_L0_PEER_ID: 1,
182
+ CL_L0_PEER_P2P_PORT: 1,
153
183
  CL_L0_TOKEN_IDENTIFIER: 1,
154
- CL_PASSWORD: 1
155
184
  };
185
+ // NETWORK LAYER
156
186
  export const layerEnvNames = {
157
187
  CL_CLI_HTTP_PORT: 1,
158
188
  CL_DOCKER_JAVA_OPTS: 1,
189
+ CL_GLOBAL_L0_PEER_HOST: 1,
190
+ CL_GLOBAL_L0_PEER_HTTP_PORT: 1,
191
+ CL_GLOBAL_L0_PEER_ID: 1,
192
+ CL_L0_PEER_HTTP_HOST: 1,
193
+ CL_L0_PEER_HTTP_PORT: 1,
194
+ CL_L0_PEER_ID: 1,
195
+ CL_L0_PEER_P2P_PORT: 1,
196
+ CL_LB: 1,
159
197
  CL_P2P_HTTP_PORT: 1,
160
- CL_PUBLIC_HTTP_PORT: 1,
198
+ CL_PUBLIC_HTTP_PORT: 1
161
199
  };
@@ -18,8 +18,8 @@ export const configHelper = {
18
18
  }
19
19
  const versionObj = this.parseEnvFile(lastInstallVersion);
20
20
  return {
21
- network: versionObj.RELEASE_NETWORK_TYPE,
22
- version: versionObj.RELEASE_NETWORK_VERSION
21
+ network: versionObj.INSTALLED_NETWORK_TYPE,
22
+ version: versionObj.INSTALLED_NETWORK_VERSION
23
23
  };
24
24
  },
25
25
  parseEnvFile(filePath) {