diff --git a/src/commands/flags.ts b/src/commands/flags.ts index e73cee854..df4b76359 100644 --- a/src/commands/flags.ts +++ b/src/commands/flags.ts @@ -1619,6 +1619,17 @@ export class Flags { prompt: undefined, }; + static readonly loadBalancerEnabled: CommandFlag = { + constName: 'loadBalancerEnabled', + name: 'load-balancer', + definition: { + describe: 'Enable load balancer for network node proxies', + defaultValue: false, + type: 'boolean', + }, + prompt: undefined, + }; + static readonly allFlags: CommandFlag[] = [ Flags.accountId, Flags.amount, @@ -1671,6 +1682,7 @@ export class Flags { Flags.hederaExplorerTlsLoadBalancerIp, Flags.hederaExplorerVersion, Flags.inputDir, + Flags.loadBalancerEnabled, Flags.localBuildPath, Flags.log4j2Xml, Flags.mirrorNodeVersion, diff --git a/src/commands/network.ts b/src/commands/network.ts index b3fd759f9..135e1549f 100644 --- a/src/commands/network.ts +++ b/src/commands/network.ts @@ -38,13 +38,13 @@ import {ConsensusNodeComponent} from '../core/config/remote/components/consensus import {ConsensusNodeStates} from '../core/config/remote/enumerations.js'; import {EnvoyProxyComponent} from '../core/config/remote/components/envoy_proxy_component.js'; import {HaProxyComponent} from '../core/config/remote/components/ha_proxy_component.js'; -import {GenesisNetworkDataConstructor} from '../core/genesis_network_models/genesis_network_data_constructor.js'; export interface NetworkDeployConfigClass { applicationEnv: string; cacheDir: string; chartDirectory: string; enablePrometheusSvcMonitor: boolean; + loadBalancerEnabled: boolean; soloChartVersion: string; namespace: string; nodeAliasesUnparsed: string; @@ -62,7 +62,6 @@ export interface NetworkDeployConfigClass { grpcWebTlsCertificatePath: string; grpcTlsKeyPath: string; grpcWebTlsKeyPath: string; - genesisNetworkData: GenesisNetworkDataConstructor; genesisThrottlesFile: string; resolvedThrottlesFile: string; getUnusedConfigs: () => string[]; @@ -116,6 +115,7 @@ export class NetworkCommand extends BaseCommand { flags.enablePrometheusSvcMonitor, flags.soloChartVersion, flags.debugNodeAlias, + flags.loadBalancerEnabled, flags.log4j2Xml, flags.namespace, flags.nodeAliasesUnparsed, @@ -146,8 +146,8 @@ export class NetworkCommand extends BaseCommand { valuesFile?: string; haproxyIpsParsed?: Record; envoyIpsParsed?: Record; - genesisNetworkData: GenesisNetworkDataConstructor; resolvedThrottlesFile: string; + loadBalancerEnabled: boolean; }) { let valuesArg = config.chartDirectory ? `-f ${path.join(config.chartDirectory, 'solo-deployment', 'values.yaml')}` @@ -165,15 +165,11 @@ export class NetworkCommand extends BaseCommand { } const profileName = this.configManager.getFlag(flags.profileName) as string; - this.profileValuesFile = await this.profileManager.prepareValuesForSoloChart( - profileName, - config.genesisNetworkData, - ); + this.profileValuesFile = await this.profileManager.prepareValuesForSoloChart(profileName); if (this.profileValuesFile) { valuesArg += this.prepareValuesFiles(this.profileValuesFile); } - // do not deploy mirror node until after we have the updated address book valuesArg += ` --set "telemetry.prometheus.svcMonitor.enabled=${config.enablePrometheusSvcMonitor}"`; valuesArg += ` --set "defaults.volumeClaims.enabled=${config.persistentVolumeClaims}"`; @@ -200,6 +196,11 @@ export class NetworkCommand extends BaseCommand { valuesArg += ` --set-file "hedera.configMaps.genesisThrottlesJson=${config.resolvedThrottlesFile}"`; } + if (config.loadBalancerEnabled) { + valuesArg += ' --set "defaults.haproxy.serviceType=LoadBalancer"'; + valuesArg += ' --set "defaults.envoyProxy.serviceType=LoadBalancer"'; + } + if (config.valuesFile) { valuesArg += this.prepareValuesFiles(config.valuesFile); } @@ -224,6 +225,7 @@ export class NetworkCommand extends BaseCommand { flags.chainId, flags.chartDirectory, flags.debugNodeAlias, + flags.loadBalancerEnabled, flags.log4j2Xml, flags.persistentVolumeClaims, flags.profileName, @@ -272,12 +274,6 @@ export class NetworkCommand extends BaseCommand { config.stagingDir = Templates.renderStagingDir(config.cacheDir, config.releaseTag); config.stagingKeysDir = path.join(validatePath(config.stagingDir), 'keys'); - config.genesisNetworkData = await GenesisNetworkDataConstructor.initialize( - config.nodeAliases, - this.keyManager, - config.keysDir, - ); - config.resolvedThrottlesFile = resolveValidJsonFilePath( config.genesisThrottlesFile, flags.genesisThrottlesFile.definition.defaultValue as string, diff --git a/src/commands/node/tasks.ts b/src/commands/node/tasks.ts index c90c18b04..4a5b35d2b 100644 --- a/src/commands/node/tasks.ts +++ b/src/commands/node/tasks.ts @@ -24,8 +24,6 @@ import {type ChartManager} from '../../core/chart_manager.js'; import {type CertificateManager} from '../../core/certificate_manager.js'; import {Zippy} from '../../core/zippy.js'; import * as constants from '../../core/constants.js'; -import {Templates} from '../../core/templates.js'; -import {Task} from '../../core/task.js'; import { DEFAULT_NETWORK_NODE_NAME, FREEZE_ADMIN_ACCOUNT, @@ -33,6 +31,8 @@ import { IGNORED_NODE_ACCOUNT_ID, TREASURY_ACCOUNT_ID, } from '../../core/constants.js'; +import {Templates} from '../../core/templates.js'; +import {Task} from '../../core/task.js'; import { AccountBalanceQuery, AccountId, @@ -42,10 +42,10 @@ import { FreezeTransaction, FreezeType, Long, - PrivateKey, NodeCreateTransaction, NodeDeleteTransaction, NodeUpdateTransaction, + PrivateKey, Timestamp, } from '@hashgraph/sdk'; import {IllegalArgumentError, MissingArgumentError, SoloError} from '../../core/errors.js'; @@ -68,7 +68,6 @@ import { type ConfigBuilder, type NodeAlias, type NodeAliases, - type NodeId, type PodName, type SkipCheck, } from '../../types/aliases.js'; @@ -79,6 +78,7 @@ import {ListrLease} from '../../core/lease/listr_lease.js'; import {Duration} from '../../core/time/duration.js'; import {type BaseCommand} from '../base.js'; import {type NodeAddConfigClass} from './node_add_config.js'; +import {GenesisNetworkDataConstructor} from '../../core/genesis_network_models/genesis_network_data_constructor.js'; export class NodeCommandTasks { private readonly accountManager: AccountManager; @@ -542,7 +542,7 @@ export class NodeCommandTasks { // Create the transaction const transaction = new AccountUpdateTransaction() .setAccountId(accountId) - .setStakedNodeId(Templates.nodeIdFromNodeAlias(nodeAlias) - 1) + .setStakedNodeId(Templates.nodeIdFromNodeAlias(nodeAlias)) .freezeWith(client); // Sign the transaction with the account's private key @@ -871,13 +871,26 @@ export class NodeCommandTasks { } setupNetworkNodes(nodeAliasesProperty: string) { - return new Task('Setup network nodes', (ctx: any, task: ListrTaskWrapper) => { + return new Task('Setup network nodes', async (ctx: any, task: ListrTaskWrapper) => { + // TODO extract method + const networkNodeServiceMap = await this.accountManager.getNodeServiceMap(ctx.config.namespace); + + const genesisNetworkData = await GenesisNetworkDataConstructor.initialize( + ctx.config.nodeAliases, + this.keyManager, + ctx.config.keysDir, + networkNodeServiceMap, + ); + + const genesisNetworkJson = path.join(ctx.config.stagingDir, 'genesis-network.json'); + fs.writeFileSync(genesisNetworkJson, genesisNetworkData.toJSON()); + const subTasks = []; for (const nodeAlias of ctx.config[nodeAliasesProperty]) { const podName = ctx.config.podNames[nodeAlias]; subTasks.push({ title: `Node: ${chalk.yellow(nodeAlias)}`, - task: () => this.platformInstaller.taskSetup(podName), + task: () => this.platformInstaller.taskSetup(podName, ctx.config.stagingDir), }); } @@ -1287,7 +1300,7 @@ export class NodeCommandTasks { return new Task('Send node update transaction', async (ctx: any, task: ListrTaskWrapper) => { const config: NodeUpdateConfigClass = ctx.config; - const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias) - 1; + const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias); self.logger.info(`nodeId: ${nodeId}, config.newAccountNumber: ${config.newAccountNumber}`); if (config.existingNodeAliases.length > 1) { @@ -1373,14 +1386,19 @@ export class NodeCommandTasks { } const index = config.existingNodeAliases.length; - const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias) - 1; + let maxNodeId = 0; + for (const nodeAlias of config.existingNodeAliases) { + const nodeId = config.serviceMap.get(nodeAlias).nodeId; + maxNodeId = Math.max(nodeId, maxNodeId); + } + const nodeId = maxNodeId + 1; let valuesArg = ''; for (let i = 0; i < index; i++) { if (transactionType === NodeSubcommandType.UPDATE && config.newAccountNumber && i === nodeId) { // for the case of updating node // use new account number for this node id - valuesArg += ` --set "hedera.nodes[${i}].accountId=${config.newAccountNumber}" --set "hedera.nodes[${i}].name=${config.existingNodeAliases[i]}"`; + valuesArg += ` --set "hedera.nodes[${i}].accountId=${config.newAccountNumber}" --set "hedera.nodes[${i}].name=${config.existingNodeAliases[i]}"--set "hedera.nodes[${i}].node-id=${nodeId}" `; } else if (transactionType !== NodeSubcommandType.DELETE || i !== nodeId) { // for the case of deleting node valuesArg += ` --set "hedera.nodes[${i}].accountId=${config.serviceMap.get(config.existingNodeAliases[i]).accountId}" --set "hedera.nodes[${i}].name=${config.existingNodeAliases[i]}"`; @@ -1402,8 +1420,7 @@ export class NodeCommandTasks { } const nodeAlias: NodeAlias = config.nodeAlias; - const nodeId: NodeId = Templates.nodeIdFromNodeAlias(nodeAlias); - const nodeIndexInValues = nodeId - 1; + const nodeIndexInValues = Templates.nodeIdFromNodeAlias(nodeAlias); // Set static IPs for HAProxy if (config.haproxyIpsParsed) { @@ -1564,7 +1581,7 @@ export class NodeCommandTasks { async (ctx: any, task: ListrTaskWrapper) => { const config = ctx.config; const newNodeFullyQualifiedPodName = Templates.renderNetworkPodName(config.nodeAlias); - const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias) - 1; + const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias); const savedStateDir = config.lastStateZipPath.match(/\/(\d+)\.zip$/)[1]; const savedStatePath = `${constants.HEDERA_HAPI_PATH}/data/saved/com.hedera.services.ServicesMain/${nodeId}/123/${savedStateDir}`; await this.k8.execContainer(newNodeFullyQualifiedPodName, constants.ROOT_CONTAINER, [ @@ -1596,7 +1613,7 @@ export class NodeCommandTasks { const accountMap = getNodeAccountMap(config.existingNodeAliases); const deleteAccountId = accountMap.get(config.nodeAlias); this.logger.debug(`Deleting node: ${config.nodeAlias} with account: ${deleteAccountId}`); - const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias) - 1; + const nodeId = Templates.nodeIdFromNodeAlias(config.nodeAlias); const nodeDeleteTx = new NodeDeleteTransaction().setNodeId(nodeId).freezeWith(config.nodeClient); const signedTx = await nodeDeleteTx.sign(config.adminKey); diff --git a/src/core/account_manager.ts b/src/core/account_manager.ts index 2a9af9ec9..d39b8be6e 100644 --- a/src/core/account_manager.ts +++ b/src/core/account_manager.ts @@ -390,15 +390,18 @@ export class AccountManager { // retrieve the list of services and build custom objects for the attributes we need for (const service of serviceList.body.items) { - const serviceType = service.metadata.labels['solo.hedera.com/type']; - let serviceBuilder = new NetworkNodeServicesBuilder( - service.metadata.labels['solo.hedera.com/node-name'] as NodeAlias, - ); + let serviceBuilder: NetworkNodeServicesBuilder; if (serviceBuilderMap.has(serviceBuilder.key())) { serviceBuilder = serviceBuilderMap.get(serviceBuilder.key()) as NetworkNodeServicesBuilder; + } else { + serviceBuilder = new NetworkNodeServicesBuilder( + service.metadata.labels['solo.hedera.com/node-name'] as NodeAlias, + ); + serviceBuilder.withNamespace(namespace); } + const serviceType = service.metadata.labels['solo.hedera.com/type']; switch (serviceType) { // solo.hedera.com/type: envoy-proxy-svc case 'envoy-proxy-svc': @@ -413,7 +416,6 @@ export class AccountManager { // solo.hedera.com/type: haproxy-svc case 'haproxy-svc': serviceBuilder - .withAccountId(service.metadata!.labels!['solo.hedera.com/account-id']) .withHaProxyAppSelector(service.spec!.selector!.app) .withHaProxyName(service.metadata!.name as string) .withHaProxyClusterIp(service.spec!.clusterIP as string) @@ -427,6 +429,8 @@ export class AccountManager { // solo.hedera.com/type: network-node-svc case 'network-node-svc': serviceBuilder + .withNodeId(service.metadata!.labels!['solo.hedera.com/node-id']) + .withAccountId(service.metadata!.labels!['solo.hedera.com/account-id']) .withNodeServiceName(service.metadata!.name as string) .withNodeServiceClusterIp(service.spec!.clusterIP as string) .withNodeServiceLoadBalancerIp( diff --git a/src/core/genesis_network_models/genesis_network_data_constructor.ts b/src/core/genesis_network_models/genesis_network_data_constructor.ts index 81450c28e..3e3b4bd6e 100644 --- a/src/core/genesis_network_models/genesis_network_data_constructor.ts +++ b/src/core/genesis_network_models/genesis_network_data_constructor.ts @@ -14,7 +14,7 @@ * limitations under the License. * */ -import {PrivateKey} from '@hashgraph/sdk'; +import {AccountId, PrivateKey} from '@hashgraph/sdk'; import {GenesisNetworkNodeDataWrapper} from './genesis_network_node_data_wrapper.js'; import * as constants from '../constants.js'; @@ -24,6 +24,7 @@ import type {JsonString, NodeAlias, NodeAliases} from '../../types/aliases.js'; import {GenesisNetworkRosterEntryDataWrapper} from './genesis_network_roster_entry_data_wrapper.js'; import {Templates} from '../templates.js'; import path from 'path'; +import type {NetworkNodeServices} from '../network_node_services.js'; /** * Used to construct the nodes data and convert them to JSON @@ -36,14 +37,35 @@ export class GenesisNetworkDataConstructor implements ToJSON { private readonly nodeAliases: NodeAliases, private readonly keyManager: KeyManager, private readonly keysDir: string, + private readonly networkNodeServiceMap: Map, ) { - nodeAliases.forEach((nodeAlias, nodeId) => { - // TODO: get nodeId from label in pod. + nodeAliases.forEach(nodeAlias => { const adminPrivateKey = PrivateKey.fromStringED25519(constants.GENESIS_KEY); const adminPubKey = adminPrivateKey.publicKey; - this.nodes[nodeAlias] = new GenesisNetworkNodeDataWrapper(nodeId, adminPubKey, nodeAlias); - this.rosters[nodeAlias] = new GenesisNetworkRosterEntryDataWrapper(nodeId); + const nodeDataWrapper = new GenesisNetworkNodeDataWrapper( + +networkNodeServiceMap.get(nodeAlias).nodeId, + adminPubKey, + nodeAlias, + ); + this.nodes[nodeAlias] = nodeDataWrapper; + nodeDataWrapper.accountId = AccountId.fromString(networkNodeServiceMap.get(nodeAlias).accountId); + + const rosterDataWrapper = new GenesisNetworkRosterEntryDataWrapper(+networkNodeServiceMap.get(nodeAlias).nodeId); + this.rosters[nodeAlias] = rosterDataWrapper; + rosterDataWrapper.weight = this.nodes[nodeAlias].weight = constants.HEDERA_NODE_DEFAULT_STAKE_AMOUNT; + + const externalPort = +constants.HEDERA_NODE_EXTERNAL_GOSSIP_PORT; + const namespace = networkNodeServiceMap.get(nodeAlias).namespace; + const externalIP = Templates.renderFullyQualifiedNetworkSvcName(namespace, nodeAlias); + // Add gossip endpoints + nodeDataWrapper.addGossipEndpoint(externalIP, externalPort); + rosterDataWrapper.addGossipEndpoint(externalIP, externalPort); + + const haProxyFqdn = Templates.renderFullyQualifiedHaProxyName(nodeAlias, namespace); + + // Add service endpoints + nodeDataWrapper.addServiceEndpoint(haProxyFqdn, constants.GRPC_PORT); }); } @@ -51,8 +73,9 @@ export class GenesisNetworkDataConstructor implements ToJSON { nodeAliases: NodeAliases, keyManager: KeyManager, keysDir: string, + networkNodeServiceMap: Map, ): Promise { - const instance = new GenesisNetworkDataConstructor(nodeAliases, keyManager, keysDir); + const instance = new GenesisNetworkDataConstructor(nodeAliases, keyManager, keysDir, networkNodeServiceMap); await instance.load(); diff --git a/src/core/helpers.ts b/src/core/helpers.ts index c850a4a7e..719b31921 100644 --- a/src/core/helpers.ts +++ b/src/core/helpers.ts @@ -226,7 +226,7 @@ export function renameAndCopyFile(srcFilePath: string, expectedBaseName: string, */ export function addDebugOptions(valuesArg: string, debugNodeAlias: NodeAlias, index = 0) { if (debugNodeAlias) { - const nodeId = Templates.nodeIdFromNodeAlias(debugNodeAlias) - 1; + const nodeId = Templates.nodeIdFromNodeAlias(debugNodeAlias); valuesArg += ` --set "hedera.nodes[${nodeId}].root.extraEnv[${index}].name=JAVA_OPTS"`; valuesArg += ` --set "hedera.nodes[${nodeId}].root.extraEnv[${index}].value=-agentlib:jdwp=transport=dt_socket\\,server=y\\,suspend=y\\,address=*:${constants.JVM_DEBUG_PORT}"`; } diff --git a/src/core/network_node_services.ts b/src/core/network_node_services.ts index fccdf8349..722c4c482 100644 --- a/src/core/network_node_services.ts +++ b/src/core/network_node_services.ts @@ -19,6 +19,8 @@ import type {NodeAlias, PodName} from '../types/aliases.js'; export class NetworkNodeServices { public readonly nodeAlias: NodeAlias; + public readonly namespace: string; + public readonly nodeId: string | number; public readonly nodePodName?: PodName; public readonly haProxyName?: string; public readonly haProxyLoadBalancerIp?: string; @@ -41,6 +43,8 @@ export class NetworkNodeServices { constructor(builder: NetworkNodeServicesBuilder) { this.nodeAlias = builder.nodeAlias; + this.namespace = builder.namespace; + this.nodeId = builder.nodeId; this.nodePodName = builder.nodePodName; this.haProxyName = builder.haProxyName; this.haProxyLoadBalancerIp = builder.haProxyLoadBalancerIp; @@ -68,6 +72,8 @@ export class NetworkNodeServices { } export class NetworkNodeServicesBuilder { + public namespace?: string; + public nodeId?: string | number; public haProxyName?: string; public accountId?: string; public haProxyClusterIp!: string; @@ -91,6 +97,16 @@ export class NetworkNodeServicesBuilder { constructor(public readonly nodeAlias: NodeAlias) {} + withNamespace(namespace: string) { + this.namespace = namespace; + return this; + } + + withNodeId(nodeId: string | number) { + this.nodeId = nodeId; + return this; + } + withAccountId(accountId: string) { this.accountId = accountId; return this; diff --git a/src/core/platform_installer.ts b/src/core/platform_installer.ts index b916c118e..649a11008 100644 --- a/src/core/platform_installer.ts +++ b/src/core/platform_installer.ts @@ -278,10 +278,17 @@ export class PlatformInstaller { } /** Return a list of task to perform node directory setup */ - taskSetup(podName: PodName) { + taskSetup(podName: PodName, stagingDir: string) { const self = this; return new Listr( [ + { + title: 'Copy configuration files', + task: async () => { + const genesisNetworkJson = [path.join(stagingDir, 'genesis-network.json')]; + await self.copyFiles(podName, genesisNetworkJson, `${constants.HEDERA_HAPI_PATH}/data/config`); + }, + }, { title: 'Set file permissions', task: async () => await self.setPlatformDirPermissions(podName), diff --git a/src/core/profile_manager.ts b/src/core/profile_manager.ts index 0f58add1c..289461ee6 100644 --- a/src/core/profile_manager.ts +++ b/src/core/profile_manager.ts @@ -28,11 +28,9 @@ import * as constants from './constants.js'; import {ConfigManager} from './config_manager.js'; import * as helpers from './helpers.js'; import {getNodeAccountMap} from './helpers.js'; -import {AccountId} from '@hashgraph/sdk'; import type {SemVer} from 'semver'; import {SoloLogger} from './logging.js'; import type {AnyObject, DirPath, NodeAlias, NodeAliases, Path} from '../types/aliases.js'; -import type {GenesisNetworkDataConstructor} from './genesis_network_models/genesis_network_data_constructor.js'; import type {Optional} from '../types/index.js'; import {inject, injectable} from 'tsyringe-neo'; import {patchInject} from './container_helper.js'; @@ -194,12 +192,7 @@ export class ProfileManager { } } - resourcesForConsensusPod( - profile: AnyObject, - nodeAliases: NodeAliases, - yamlRoot: AnyObject, - genesisNetworkData?: GenesisNetworkDataConstructor, - ): AnyObject { + resourcesForConsensusPod(profile: AnyObject, nodeAliases: NodeAliases, yamlRoot: AnyObject): AnyObject { if (!profile) throw new MissingArgumentError('profile is required'); const accountMap = getNodeAccountMap(nodeAliases); @@ -207,6 +200,7 @@ export class ProfileManager { // set consensus pod level resources for (let nodeIndex = 0; nodeIndex < nodeAliases.length; nodeIndex++) { this._setValue(`hedera.nodes.${nodeIndex}.name`, nodeAliases[nodeIndex], yamlRoot); + this._setValue(`hedera.nodes.${nodeIndex}.nodeId`, nodeIndex, yamlRoot); this._setValue(`hedera.nodes.${nodeIndex}.accountId`, accountMap.get(nodeAliases[nodeIndex]), yamlRoot); } @@ -226,7 +220,6 @@ export class ProfileManager { this.configManager.getFlag(flags.releaseTag), this.configManager.getFlag(flags.app), this.configManager.getFlag(flags.chainId), - genesisNetworkData, ); for (const flag of flags.nodeConfigFileFlags.values()) { @@ -269,14 +262,6 @@ export class ProfileManager { yamlRoot, ); - if (genesisNetworkData) { - const genesisNetworkJson = path.join(stagingDir, 'genesis-network.json'); - - fs.writeFileSync(genesisNetworkJson, genesisNetworkData.toJSON()); - - this._setFileContentsAsValue('hedera.configMaps.genesisNetworkJson', genesisNetworkJson, yamlRoot); - } - if (this.configManager.getFlag(flags.applicationEnv)) { this._setFileContentsAsValue( 'hedera.configMaps.applicationEnv', @@ -342,7 +327,7 @@ export class ProfileManager { * @param genesisNetworkData - reference to the constructor * @returns return the full path to the values file */ - public async prepareValuesForSoloChart(profileName: string, genesisNetworkData?: GenesisNetworkDataConstructor) { + public async prepareValuesForSoloChart(profileName: string) { if (!profileName) throw new MissingArgumentError('profileName is required'); const profile = this.getProfile(profileName); @@ -351,7 +336,7 @@ export class ProfileManager { // generate the YAML const yamlRoot = {}; - this.resourcesForConsensusPod(profile, nodeAliases, yamlRoot, genesisNetworkData); + this.resourcesForConsensusPod(profile, nodeAliases, yamlRoot); this.resourcesForHaProxyPod(profile, yamlRoot); this.resourcesForEnvoyProxyPod(profile, yamlRoot); this.resourcesForMinioTenantPod(profile, yamlRoot); @@ -490,7 +475,6 @@ export class ProfileManager { releaseTagOverride: string, appName = constants.HEDERA_APP_NAME, chainId = constants.HEDERA_CHAIN_ID, - genesisNetworkData?: GenesisNetworkDataConstructor, ) { let releaseTag = releaseTagOverride; if (!nodeAccountMap || nodeAccountMap.size === 0) { @@ -522,25 +506,6 @@ export class ProfileManager { const externalIP = Templates.renderFullyQualifiedNetworkSvcName(namespace, nodeAlias); const account = nodeAccountMap.get(nodeAlias); - if (genesisNetworkData) { - // TODO: Use the "nodeSeq" - - const nodeDataWrapper = genesisNetworkData.nodes[nodeAlias]; - const rosterDataWrapper = genesisNetworkData.rosters[nodeAlias]; - - rosterDataWrapper.weight = nodeDataWrapper.weight = nodeStakeAmount; - nodeDataWrapper.accountId = AccountId.fromString(account); - - // Add gossip endpoints - nodeDataWrapper.addGossipEndpoint(externalIP, externalPort); - rosterDataWrapper.addGossipEndpoint(externalIP, externalPort); - - const haProxyFqdn = Templates.renderFullyQualifiedHaProxyName(nodeAlias, namespace); - - // Add service endpoints - nodeDataWrapper.addServiceEndpoint(haProxyFqdn, constants.GRPC_PORT); - } - configLines.push( `address, ${nodeSeq}, ${nodeSeq}, ${nodeAlias}, ${nodeStakeAmount}, ${internalIP}, ${internalPort}, ${externalIP}, ${externalPort}, ${account}`, ); diff --git a/src/core/templates.ts b/src/core/templates.ts index 06f91be0b..a8bdf4a35 100644 --- a/src/core/templates.ts +++ b/src/core/templates.ts @@ -173,7 +173,7 @@ export class Templates { for (let i = nodeAlias.length - 1; i > 0; i--) { // @ts-ignore if (isNaN(nodeAlias[i])) { - return parseInt(nodeAlias.substring(i + 1, nodeAlias.length)); + return parseInt(nodeAlias.substring(i + 1, nodeAlias.length)) - 1; } }