UNPKG

@hashgraph/solo

Version:

An opinionated CLI tool to deploy and manage private Hedera Networks.

512 lines (447 loc) 28.3 kB
// SPDX-License-Identifier: Apache-2.0 import {color, type ListrLogger, PRESET_TIMER} from 'listr2'; import path from 'node:path'; import url from 'node:url'; import {NamespaceName} from '../types/namespace/namespace-name.js'; import {ContainerName} from '../integration/kube/resources/container/container-name.js'; import {PathEx} from '../business/utils/path-ex.js'; import {PrivateKey} from '@hiero-ledger/sdk'; import 'dotenv/config'; import {type NodeAlias} from '../types/aliases.js'; export function getEnvironmentVariable(name: string): string | undefined { if (process.env[name] && process.env[name].trim() !== '') { console.log(`>> environment variable '${name}' exists, using its value`); return process.env[name]; } return undefined; } export const ROOT_DIR: string = PathEx.joinWithRealPath(path.dirname(url.fileURLToPath(import.meta.url)), '..', '..'); // -------------------- solo related constants --------------------------------------------------------------------- export const SOLO_HOME_DIR: string = getEnvironmentVariable('SOLO_HOME') || PathEx.join((process.env.HOME as string) || (process.env.USERPROFILE as string), '.solo'); export const SOLO_LOGS_DIR: string = PathEx.join(SOLO_HOME_DIR, 'logs'); export const SOLO_CACHE_DIR: string = getEnvironmentVariable('SOLO_CACHE_DIR') || PathEx.join(SOLO_HOME_DIR, 'cache'); export const SOLO_VALUES_DIR: string = PathEx.join(SOLO_CACHE_DIR, 'values-files'); export const SOLO_LOG_LEVEL: string = getEnvironmentVariable('SOLO_LOG_LEVEL') || 'info'; export const DEFAULT_NAMESPACE: NamespaceName = NamespaceName.of('default'); export const DEFAULT_CERT_MANAGER_NAMESPACE: NamespaceName = NamespaceName.of('cert-manager'); export const HELM: string = 'helm'; export const KIND: string = 'kind'; export const PODMAN: string = 'podman'; export const VFKIT: string = 'vfkit'; export const GVPROXY: string = 'gvproxy'; export const DOCKER: string = 'docker'; export const KUBECTL: string = 'kubectl'; export const CRANE: string = 'crane'; export const BASE_DEPENDENCIES: string[] = [HELM, KIND, KUBECTL]; export const DEFAULT_CLUSTER: string = 'solo-cluster'; export const RESOURCES_DIR: string = PathEx.joinWithRealPath(ROOT_DIR, 'resources'); export const KIND_CLUSTER_CONFIG_FILE: string = getEnvironmentVariable('SOLO_KIND_CLUSTER_CONFIG_FILE') || PathEx.joinWithRealPath(RESOURCES_DIR, 'kind-config.yaml'); export const KIND_NODE_IMAGE: string = getEnvironmentVariable('SOLO_KIND_NODE_IMAGE') || getEnvironmentVariable('KIND_IMAGE') || 'kindest/node:v1.31.9@sha256:b94a3a6c06198d17f59cca8c6f486236fa05e2fb359cbd75dabbfc348a10b211'; export const PODMAN_MACHINE_NAME: string = 'podman-machine-default'; export const SOLO_DEV_OUTPUT: boolean = Boolean(getEnvironmentVariable('SOLO_DEV_OUTPUT')) || false; export const ENABLE_S6_IMAGE: boolean = getEnvironmentVariable('ENABLE_S6_IMAGE') === 'true' || true; export const CONFIG: {ENABLE_IMAGE_CACHE: boolean} = { ENABLE_IMAGE_CACHE: getEnvironmentVariable('ENABLE_IMAGE_CACHE') === 'true' || false, }; export const ROOT_CONTAINER: ContainerName = ContainerName.of('root-container'); export const SOLO_REMOTE_CONFIGMAP_NAME: string = 'solo-remote-config'; export const SOLO_REMOTE_CONFIGMAP_DATA_KEY: string = 'remote-config-data'; export const SOLO_REMOTE_CONFIGMAP_LABELS: Record<string, string> = {'solo.hedera.com/type': 'remote-config'}; export const SOLO_REMOTE_CONFIG_MAX_COMMAND_IN_HISTORY: number = 50; export const SOLO_REMOTE_CONFIGMAP_LABEL_SELECTOR: string = 'solo.hedera.com/type=remote-config'; export const NODE_COPY_CONCURRENT: number = Number(getEnvironmentVariable('NODE_COPY_CONCURRENT')) || 4; export const SKIP_NODE_PING: boolean = Boolean(getEnvironmentVariable('SKIP_NODE_PING')) || false; export const DEFAULT_LOCK_ACQUIRE_ATTEMPTS: number = +getEnvironmentVariable('SOLO_LEASE_ACQUIRE_ATTEMPTS') || 10; export const DEFAULT_LEASE_DURATION: number = +getEnvironmentVariable('SOLO_LEASE_DURATION') || 20; export const SOLO_USER_AGENT_HEADER: string = 'Solo-User-Agent'; // --------------- Hedera network and node related constants -------------------------------------------------------------------- export const HEDERA_CHAIN_ID: string = getEnvironmentVariable('SOLO_CHAIN_ID') || '298'; export const HEDERA_HGCAPP_DIR: string = '/opt/hgcapp'; export const HEDERA_SERVICES_PATH: string = `${HEDERA_HGCAPP_DIR}/services-hedera`; export const HEDERA_HAPI_PATH: string = `${HEDERA_SERVICES_PATH}/HapiApp2.0`; export const HEDERA_DATA_APPS_DIR: string = 'data/apps'; export const HEDERA_DATA_LIB_DIR: string = 'data/lib'; export const HEDERA_USER_HOME_DIR: string = '/home/hedera'; export const HEDERA_APP_NAME: string = 'HederaNode.jar'; export const HEDERA_BUILDS_URL: string = 'https://builds.hedera.com'; export const HEDERA_NODE_INTERNAL_GOSSIP_PORT: string = getEnvironmentVariable('SOLO_NODE_INTERNAL_GOSSIP_PORT') || '50111'; export const HEDERA_NODE_EXTERNAL_GOSSIP_PORT: string = getEnvironmentVariable('SOLO_NODE_EXTERNAL_GOSSIP_PORT') || '50111'; export const HEDERA_NODE_DEFAULT_STAKE_AMOUNT: number = +getEnvironmentVariable('SOLO_NODE_DEFAULT_STAKE_AMOUNT') || 500; // S6-based consensus node image configuration (overridable via environment) export const S6_NODE_IMAGE_REGISTRY: string = getEnvironmentVariable('SOLO_S6_NODE_IMAGE_REGISTRY') || 'ghcr.io'; export const S6_NODE_IMAGE_REPOSITORY: string = getEnvironmentVariable('SOLO_S6_NODE_IMAGE_REPOSITORY') || 'hashgraph/solo-containers/ubi8-s6-java25'; // Pods with a name matching one of these strings will be ignored when collecting pod metrics const ignorePodMetricsEnvironment: string = getEnvironmentVariable('IGNORE_POD_METRICS'); export const IGNORE_POD_METRICS: string[] = ignorePodMetricsEnvironment ? ignorePodMetricsEnvironment.split(',') : ['network-load-generator', 'metrics-server']; export const HEDERA_NODE_SIDECARS: string[] = [ 'recordStreamUploader', 'eventStreamUploader', 'backupUploader', 'accountBalanceUploader', 'otelCollector', 'blockstreamUploader', ]; export const REDIS_IMAGE_REGISTRY: string = 'gcr.io'; export const REDIS_IMAGE_REPOSITORY: string = 'mirrornode/redis'; export const REDIS_SENTINEL_IMAGE_REGISTRY: string = 'gcr.io'; export const REDIS_SENTINEL_IMAGE_REPOSITORY: string = 'mirrornode/redis-sentinel'; export const REDIS_SENTINEL_MASTER_SET: string = 'mirror'; // --------------- Charts related constants ---------------------------------------------------------------------------- export const SOLO_SETUP_NAMESPACE: NamespaceName = NamespaceName.of('solo-setup'); // TODO: remove after migrated to resources/solo-config.yaml export const SOLO_TESTING_CHART_URL: string = 'oci://ghcr.io/hashgraph/solo-charts'; // TODO: remove after migrated to resources/solo-config.yaml export const SOLO_DEPLOYMENT_CHART: string = 'solo-deployment'; // TODO: remove after migrated to resources/solo-config.yaml export const SOLO_CERT_MANAGER_CHART: string = 'solo-cert-manager'; export const SOLO_SHARED_RESOURCES_CHART: string = 'solo-shared-resources'; export const JSON_RPC_RELAY_CHART_URL: string = getEnvironmentVariable('JSON_RPC_RELAY_CHART_URL') ?? 'https://hiero-ledger.github.io/hiero-json-rpc-relay/charts'; export const JSON_RPC_RELAY_CHART: string = 'hedera-json-rpc'; export const JSON_RPC_RELAY_RELEASE_NAME: string = 'relay'; export const MIRROR_NODE_CHART_URL: string = getEnvironmentVariable('MIRROR_NODE_CHART_URL') ?? 'https://hiero-ledger.github.io/hiero-mirror-node/charts'; export const MIRROR_NODE_CHART: string = 'hedera-mirror'; export const MIRROR_NODE_RELEASE_NAME: string = 'mirror'; export const MIRROR_NODE_PINGER_TPS: number = +getEnvironmentVariable('MIRROR_NODE_PINGER_TPS') || 5; // Version boundary for mirror node upgrade behavior // Versions <= v0.143.0 require skipping reuseValues to avoid RegularExpression rules conflicts export const MIRROR_NODE_VERSION_BOUNDARY: string = 'v0.143.0'; export const PROMETHEUS_STACK_CHART_URL: string = getEnvironmentVariable('PROMETHEUS_STACK_CHART_URL') ?? 'https://prometheus-community.github.io/helm-charts'; export const PROMETHEUS_STACK_CHART: string = 'kube-prometheus-stack'; export const PROMETHEUS_RELEASE_NAME: string = 'kube-prometheus-stack'; export const SOLO_SERVICE_MONITOR_NAME: string = 'solo-service-monitor'; export const POD_MONITOR_ROLE: string = 'pod-monitor-role'; export const MINIO_OPERATOR_CHART_URL: string = getEnvironmentVariable('MINIO_OPERATOR_CHART_URL') ?? 'https://operator.min.io/'; export const MINIO_OPERATOR_CHART: string = 'operator'; export const MINIO_OPERATOR_RELEASE_NAME: string = 'operator'; export const METRICS_SERVER_CHART_URL: string = getEnvironmentVariable('METRICS_SERVER_CHART_URL') ?? 'https://kubernetes-sigs.github.io/metrics-server/'; export const METRICS_SERVER_CHART: string = 'metrics-server'; export const METRICS_SERVER_RELEASE_NAME: string = 'metrics-server'; export const METRICS_SERVER_NAMESPACE: NamespaceName = NamespaceName.of('kube-system'); export const METRICS_SERVER_INSTALL_ARGS: string = '--set "args[0]=--kubelet-insecure-tls"'; export const EXPLORER_CHART_URL: string = getEnvironmentVariable('EXPLORER_CHART_URL') ?? 'oci://ghcr.io/hiero-ledger/hiero-mirror-node-explorer/hiero-explorer-chart'; export const EXPLORER_RELEASE_NAME: string = 'hiero-explorer'; export const SOLO_RELAY_LABEL: string = 'app=hedera-json-rpc'; export const SOLO_EXPLORER_LABEL: string = 'app.kubernetes.io/component=hiero-explorer'; export const OLD_SOLO_EXPLORER_LABEL: string = 'app.kubernetes.io/component=hedera-explorer'; // TODO: remove after migrated to resources/solo-config.yaml export const INGRESS_CONTROLLER_CHART_URL: string = getEnvironmentVariable('INGRESS_CONTROLLER_CHART_URL') ?? 'https://haproxy-ingress.github.io/charts'; // TODO: remove after migrated to resources/solo-config.yaml export const INGRESS_CONTROLLER_RELEASE_NAME: string = 'haproxy-ingress'; export const EXPLORER_INGRESS_CONTROLLER_RELEASE_NAME: string = 'explorer-haproxy-ingress'; // TODO: remove after migrated to resources/solo-config.yaml export const INGRESS_CONTROLLER_PREFIX: string = 'haproxy-ingress.github.io/controller/'; export const BLOCK_NODE_CHART_URL: string = getEnvironmentVariable('BLOCK_NODE_CHART_URL') ?? 'oci://ghcr.io/hiero-ledger/hiero-block-node'; export const BLOCK_NODE_CHART: string = getEnvironmentVariable('BLOCK_NODE_CHART') ?? 'block-node-server'; export const BLOCK_NODE_RELEASE_NAME: string = 'block-node'; export const BLOCK_NODE_CONTAINER_NAME: ContainerName = ContainerName.of(BLOCK_NODE_CHART); export const NETWORK_LOAD_GENERATOR_CHART: string = 'network-load-generator'; export const NETWORK_LOAD_GENERATOR_RELEASE_NAME: string = 'network-load-generator'; export const NETWORK_LOAD_GENERATOR_CHART_URL: string = getEnvironmentVariable('NETWORK_LOAD_GENERATOR_CHART_URL') ?? 'oci://artifacts.hashgraph.io/load-generator-helm-release-local'; export const NETWORK_LOAD_GENERATOR_POD_LABELS: string[] = [ 'app.kubernetes.io/instance=network-load-generator', 'app.kubernetes.io/name=network-load-generator', ]; export const PROMETHEUS_OPERATOR_CRDS_RELEASE_NAME: string = 'prometheus-operator-crds'; export const PROMETHEUS_OPERATOR_CRDS_CHART: string = 'prometheus-operator-crds'; export const PROMETHEUS_OPERATOR_CRDS_REPO: string = 'prometheus-community'; export const PROMETHEUS_OPERATOR_CRDS_CHART_URL: string = getEnvironmentVariable('PROMETHEUS_OPERATOR_CRDS_CHART_URL') || 'https://prometheus-community.github.io/helm-charts'; export const NETWORK_LOAD_GENERATOR_CONTAINER: ContainerName = ContainerName.of('nlg'); // TODO: remove after migrated to resources/solo-config.yaml export const CERT_MANAGER_NAME_SPACE: string = 'cert-manager'; export const SOLO_HEDERA_MIRROR_IMPORTER: string[] = [ 'app.kubernetes.io/component=importer', 'app.kubernetes.io/instance=mirror', ]; // Component label selectors for pod discovery export const SOLO_RELAY_NAME_LABEL: string = 'app.kubernetes.io/name=relay'; export const SOLO_MIRROR_IMPORTER_NAME_LABEL: string = 'app.kubernetes.io/name=importer'; export const SOLO_MIRROR_PINGER_NAME_LABEL: string = 'app.kubernetes.io/name=pinger'; export const SOLO_MIRROR_GRPC_NAME_LABEL: string = 'app.kubernetes.io/name=grpc'; export const SOLO_MIRROR_MONITOR_NAME_LABEL: string = 'app.kubernetes.io/name=monitor'; export const SOLO_MIRROR_REST_NAME_LABEL: string = 'app.kubernetes.io/name=rest'; export const SOLO_MIRROR_WEB3_NAME_LABEL: string = 'app.kubernetes.io/name=web3'; export const SOLO_MIRROR_POSTGRES_NAME_LABEL: string = 'app.kubernetes.io/name=postgres'; export const SOLO_MIRROR_REDIS_NAME_LABEL: string = 'app.kubernetes.io/name=redis'; export const SOLO_MIRROR_RESTJAVA_NAME_LABEL: string = 'app.kubernetes.io/name=restjava'; export const SOLO_BLOCK_NODE_NAME_LABEL: string = 'app.kubernetes.io/name=block-node-1'; export const SOLO_INGRESS_CONTROLLER_NAME_LABEL: string = 'app.kubernetes.io/name=haproxy-ingress'; export const DEFAULT_CHART_REPO: Map<string, string> = new Map() .set(JSON_RPC_RELAY_CHART, JSON_RPC_RELAY_CHART_URL) .set(MIRROR_NODE_RELEASE_NAME, MIRROR_NODE_CHART_URL) .set(PROMETHEUS_RELEASE_NAME, PROMETHEUS_STACK_CHART_URL) .set(MINIO_OPERATOR_RELEASE_NAME, MINIO_OPERATOR_CHART_URL) .set(METRICS_SERVER_RELEASE_NAME, METRICS_SERVER_CHART_URL) .set(INGRESS_CONTROLLER_RELEASE_NAME, INGRESS_CONTROLLER_CHART_URL); export const MIRROR_INGRESS_CLASS_NAME: string = 'mirror-ingress-class'; export const MIRROR_INGRESS_CONTROLLER: string = 'mirror-ingress-controller'; export const EXPLORER_INGRESS_CLASS_NAME: string = 'explorer-ingress-class'; export const EXPLORER_INGRESS_CONTROLLER: string = 'explorer-ingress-controller'; // ------------------- Hedera Account related --------------------------------------------------------------------------------- export const DEFAULT_OPERATOR_ID_NUMBER: number = +getEnvironmentVariable('SOLO_OPERATOR_ID') || 2; export const OPERATOR_KEY: string = getEnvironmentVariable('SOLO_OPERATOR_KEY') || '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137'; export const OPERATOR_PUBLIC_KEY: string = getEnvironmentVariable('SOLO_OPERATOR_PUBLIC_KEY') || '302a300506032b65700321000aa8e21064c61eab86e2a9c164565b4e7a9a4146106e0a6cd03a8c395a110e92'; export const DEFAULT_FREEZE_ID_NUMBER: number = +getEnvironmentVariable('FREEZE_ADMIN_ACCOUNT') || 58; export const DEFAULT_TREASURY_ID_NUMBER: number = 2; export const DEFAULT_START_ID_NUMBER: number = +getEnvironmentVariable('DEFAULT_START_ID_NUMBER') || 3; export const DEFAULT_GENESIS_KEY: string = '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137'; export const GENESIS_KEY: string = getEnvironmentVariable('GENESIS_KEY') || DEFAULT_GENESIS_KEY; export const GENESIS_PUBLIC_KEY: ReturnType<typeof PrivateKey.fromStringED25519>['publicKey'] = PrivateKey.fromStringED25519(GENESIS_KEY).publicKey; export const SYSTEM_ACCOUNTS: number[][] = [ [3, 100], [200, 349], [400, 750], [900, 1000], ]; // do account 0.0.2 last and outside the loop export const SHORTER_SYSTEM_ACCOUNTS: number[][] = [[3, 60]]; export const TREASURY_ACCOUNT: number = 2; export const LOCAL_NODE_START_PORT: number = +getEnvironmentVariable('LOCAL_NODE_START_PORT') || 30_212; export const ACCOUNT_UPDATE_BATCH_SIZE: number = +getEnvironmentVariable('ACCOUNT_UPDATE_BATCH_SIZE') || 10; export const POD_PHASE_RUNNING: string = 'Running'; export const POD_CONDITION_INITIALIZED: string = 'Initialized'; export const POD_CONDITION_READY: string = 'Ready'; export const POD_CONDITION_POD_SCHEDULED: string = 'PodScheduled'; export const POD_CONDITION_STATUS_TRUE: string = 'True'; export const BLOCK_NODE_SOLO_DEV_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'block-node-solo-dev.yaml'); export const EXPLORER_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'hiero-explorer-values.yaml'); export const RELAY_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'relay-values.yaml'); export const MIRROR_NODE_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'mirror-node-values.yaml'); /* vars MIRROR_NODE_OLD_.* can be removed once minimum mirrornode version support is 0.152.0. * These variables will only be applied if the MIRROR_NODE_VERSION < 0.152.0 * */ export const MIRROR_NODE_OLD_IMAGE_REGISTRY: string = getEnvironmentVariable('MIRROR_NODE_OLD_IMAGE_REGISTRY') || 'gcr.io'; export const MIRROR_NODE_OLD_IMAGE_REPO_ROOT: string = getEnvironmentVariable('MIRROR_NODE_OLD_IMAGE_REPO_ROOT') || 'mirrornode/hedera-mirror-'; export const MIRROR_NODE_OLD_MEMORY_REST: string = getEnvironmentVariable('MIRROR_NODE_OLD_MEMORY_REST') || '200Mi'; export const MIRROR_NODE_OLD_MEMORY_RESTJAVA: string = getEnvironmentVariable('MIRROR_NODE_OLD_MEMORY_RESTJAVA') || '500Mi'; export const MIRROR_NODE_OLD_MEMORY_WEB3: string = getEnvironmentVariable('MIRROR_NODE_OLD_MEMORY_WEB3') || '1000Mi'; export const MIRROR_NODE_OLD_MEMORY_IMPORTER: string = getEnvironmentVariable('MIRROR_NODE_OLD_MEMORY_IMPORTER') || '2000Mi'; export const MIRROR_NODE_OLD_MEMORY_GRPC: string = getEnvironmentVariable('MIRROR_NODE_OLD_MEMORY_GRPC') || '1000Mi'; export const MIRROR_NODE_HIKARI_LIMITS_FILE: string = PathEx.joinWithRealPath( RESOURCES_DIR, 'mirror-node-hikari-limits.yaml', ); export const MIRROR_NODE_VALUES_FILE_HEDERA: string = PathEx.joinWithRealPath( RESOURCES_DIR, 'mirror-node-values-hedera.yaml', ); export const INGRESS_CONTROLLER_VALUES_FILE: string = PathEx.joinWithRealPath( RESOURCES_DIR, 'ingress-controller-values.yaml', ); export const BLOCK_NODE_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'block-node-values.yaml'); export const MIRROR_POSTGRES_TRUNCATE_SQL_FILE: string = PathEx.joinWithRealPath( RESOURCES_DIR, 'mirror-postgres-truncate.sql', ); export const UPGRADE_MIGRATIONS_FILE: string = PathEx.join(RESOURCES_DIR, 'component-upgrade-migrations.json'); export const SOLO_DEPLOYMENT_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'solo-values.yaml'); export const BLOCK_NODE_TSS_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'block-node-tss-values.yaml'); export const CLEANUP_STATE_ROUNDS_SCRIPT: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'cleanup-state-rounds.sh'); export const RENAME_STATE_NODE_ID_SCRIPT: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'rename-state-node-id.sh'); export const NODE_LOG_FAILURE_MSG: string = 'failed to download logs from pod'; export const ONE_SHOT_WITH_BLOCK_NODE: string = getEnvironmentVariable('ONE_SHOT_WITH_BLOCK_NODE') || 'false'; export const RAPID_FIRE_VALUES_FILE: string = PathEx.joinWithRealPath(RESOURCES_DIR, 'rapid-fire', 'nlg-values.yaml'); export const SOLO_CACHE_IMAGES_TARGET_FILE: string = PathEx.joinWithRealPath( RESOURCES_DIR, 'config', 'solo-cache-images-target.yaml', ); export const CONTAINER_COPY_MAX_ATTEMPTS: number = +getEnvironmentVariable('CONTAINER_COPY_MAX_ATTEMPTS') || 3; export const CONTAINER_COPY_BACKOFF_MS: number = +getEnvironmentVariable('CONTAINER_COPY_BACKOFF_MS') || 300; export const CHECK_WRAPS_DIRECTORY_MAX_ATTEMPTS: number = +getEnvironmentVariable('CHECK_WRAPS_DIRECTORY_MAX_ATTEMPTS') || 10; export const CHECK_WRAPS_DIRECTORY_BACKOFF_MS: number = +getEnvironmentVariable('CHECK_WRAPS_DIRECTORY_BACKOFF_MS') || 2000; /** * Listr related * @returns a object that defines the default color options */ export const LISTR_DEFAULT_RENDERER_TIMER_OPTION: any = { ...PRESET_TIMER, condition: (duration: number): boolean => duration > 100, format: (duration: number) => { if (duration > 30_000) { return color.red; } return color.green; }, }; export const LISTR_DEFAULT_RENDERER_OPTION: { collapseSubtasks: boolean; timer: { condition: (duration: number) => boolean; format: (duration: number) => any; field: string | ((arguments_0: number) => string); args?: [number]; }; logger?: ListrLogger; persistentOutput: boolean; clearOutput: boolean; collapseErrors: boolean; showErrorMessage: boolean; formatOutput: 'wrap' | 'truncate'; } = { collapseSubtasks: false, timer: LISTR_DEFAULT_RENDERER_TIMER_OPTION, persistentOutput: true, clearOutput: false, collapseErrors: false, showErrorMessage: false, formatOutput: 'wrap', }; type ListrOptionsType = { concurrent: boolean; rendererOptions: typeof LISTR_DEFAULT_RENDERER_OPTION; fallbackRendererOptions: { timer: typeof LISTR_DEFAULT_RENDERER_TIMER_OPTION; }; }; export const LISTR_DEFAULT_OPTIONS: { DEFAULT: ListrOptionsType; WITH_CONCURRENCY: ListrOptionsType; } = { DEFAULT: { concurrent: false, rendererOptions: LISTR_DEFAULT_RENDERER_OPTION, fallbackRendererOptions: { timer: LISTR_DEFAULT_RENDERER_TIMER_OPTION, }, }, WITH_CONCURRENCY: { concurrent: true, rendererOptions: LISTR_DEFAULT_RENDERER_OPTION, fallbackRendererOptions: { timer: LISTR_DEFAULT_RENDERER_TIMER_OPTION, }, }, }; export const SIGNING_KEY_PREFIX: string = 's'; export const CERTIFICATE_VALIDITY_YEARS: number = 100; // years export const LOCAL_HOST: string = '127.0.0.1'; export const STANDARD_DATAMASK: string = '***'; // ------ Hedera SDK Related ------ export const NODE_CLIENT_MAX_ATTEMPTS: number = +getEnvironmentVariable('NODE_CLIENT_MAX_ATTEMPTS') || 600; export const NODE_CLIENT_MIN_BACKOFF: number = +getEnvironmentVariable('NODE_CLIENT_MIN_BACKOFF') || 1000; export const NODE_CLIENT_MAX_BACKOFF: number = +getEnvironmentVariable('NODE_CLIENT_MAX_BACKOFF') || 1000; export const NODE_CLIENT_REQUEST_TIMEOUT: number = +getEnvironmentVariable('NODE_CLIENT_REQUEST_TIMEOUT') || 600_000; export const NODE_CLIENT_MAX_QUERY_PAYMENT: number = +getEnvironmentVariable('NODE_CLIENT_MAX_QUERY_PAYMENT') || 20; export const NODE_CLIENT_SDK_PING_MAX_RETRIES: number = +getEnvironmentVariable('NODE_CLIENT_SDK_PING_MAX_RETRIES') || 5; export const NODE_CLIENT_SDK_PING_RETRY_INTERVAL: number = +getEnvironmentVariable('NODE_CLIENT_SDK_PING_RETRY_INTERVAL') || 10_000; // ---- New Node Related ---- export const ENDPOINT_TYPE_IP: string = 'IP'; export const ENDPOINT_TYPE_FQDN: string = 'FQDN'; export const DEFAULT_NETWORK_NODE_NAME: NodeAlias = 'node1'; // file-id must be between 0.0.150 and 0.0.159 // file must be uploaded using FileUpdateTransaction in maximum of 5Kb chunks export const UPGRADE_FILE_ID_NUM: number = 150; export const UPGRADE_FILE_CHUNK_SIZE: number = 1024 * 5; // 5Kb export const JVM_DEBUG_PORT: number = 5005; export const PODS_RUNNING_MAX_ATTEMPTS: number = +getEnvironmentVariable('PODS_RUNNING_MAX_ATTEMPTS') || 60 * 15; export const PODS_RUNNING_DELAY: number = +getEnvironmentVariable('PODS_RUNNING_DELAY') || 1000; export const NETWORK_NODE_ACTIVE_MAX_ATTEMPTS: number = +getEnvironmentVariable('NETWORK_NODE_ACTIVE_MAX_ATTEMPTS') || 300; export const NETWORK_NODE_ACTIVE_DELAY: number = +getEnvironmentVariable('NETWORK_NODE_ACTIVE_DELAY') || 1000; export const NETWORK_NODE_ACTIVE_TIMEOUT: number = +getEnvironmentVariable('NETWORK_NODE_ACTIVE_TIMEOUT') || 1000; export const NETWORK_NODE_ACTIVE_EXTRA_DELAY_MS: number = +getEnvironmentVariable('NETWORK_NODE_ACTIVE_EXTRA_DELAY_MS') || 2000; export const NETWORK_PROXY_MAX_ATTEMPTS: number = +getEnvironmentVariable('NETWORK_PROXY_MAX_ATTEMPTS') || 300; export const NETWORK_PROXY_DELAY: number = +getEnvironmentVariable('NETWORK_PROXY_DELAY') || 2000; export const PODS_READY_MAX_ATTEMPTS: number = +getEnvironmentVariable('PODS_READY_MAX_ATTEMPTS') || 300; export const PODS_READY_DELAY: number = +getEnvironmentVariable('PODS_READY_DELAY') || 2000; export const RELAY_PODS_RUNNING_MAX_ATTEMPTS: number = +getEnvironmentVariable('RELAY_PODS_RUNNING_MAX_ATTEMPTS') || 900; export const RELAY_PODS_RUNNING_DELAY: number = +getEnvironmentVariable('RELAY_PODS_RUNNING_RUNNING_DELAY') || 1000; export const RELAY_PODS_READY_MAX_ATTEMPTS: number = +getEnvironmentVariable('RELAY_PODS_READY_MAX_ATTEMPTS') || 100; export const RELAY_PODS_READY_DELAY: number = +getEnvironmentVariable('RELAY_PODS_READY_DELAY') || 1000; export const BLOCK_NODE_PODS_RUNNING_MAX_ATTEMPTS: number = +getEnvironmentVariable('BLOCK_NODE_PODS_RUNNING_MAX_ATTEMPTS') || 900; export const BLOCK_NODE_PODS_RUNNING_DELAY: number = +getEnvironmentVariable('BLOCK_NODE_PODS_RUNNING_DELAY') || 1000; export const BLOCK_NODE_ACTIVE_MAX_ATTEMPTS: number = +getEnvironmentVariable('BLOCK_NODE_ACTIVE_MAX_ATTEMPTS') || 100; export const BLOCK_NODE_ACTIVE_DELAY: number = +getEnvironmentVariable('BLOCK_NODE_ACTIVE_DELAY') || 60; export const BLOCK_NODE_ACTIVE_TIMEOUT: number = +getEnvironmentVariable('BLOCK_NODE_ACTIVE_TIMEOUT') || 60; export const BLOCK_NODE_PORT: number = +getEnvironmentVariable('BLOCK_NODE_PORT') || 40_840; export const BLOCK_NODE_PORT_LEGACY: number = +getEnvironmentVariable('BLOCK_NODE_PORT_LEGACY') || 8080; export const BLOCK_ITEM_BATCH_SIZE: number = +getEnvironmentVariable('BLOCK_ITEM_BATCH_SIZE') || 256; // Filename suffix used for log/config archive files export const LOG_CONFIG_ZIP_SUFFIX: string = '-log-config.zip'; export const NETWORK_LOAD_GENERATOR_POD_RUNNING_MAX_ATTEMPTS: number = +getEnvironmentVariable('NETWORK_LOAD_GENERATOR_PODS_RUNNING_MAX_ATTEMPTS') || 900; export const NETWORK_LOAD_GENERATOR_POD_RUNNING_DELAY: number = +getEnvironmentVariable('NETWORK_LOAD_GENERATOR_PODS_RUNNING_DELAY') || 1000; export const PORT_FORWARDING_MESSAGE_GROUP: string = 'port-forwarding'; export const GRPC_PORT: number = +getEnvironmentVariable('GRPC_PORT') || 50_211; export const GRPC_LOCAL_PORT: number = +getEnvironmentVariable('GRPC_LOCAL_PORT') || 35_211; export const GRPC_WEB_PORT: number = +getEnvironmentVariable('GRPC_WEB_PORT') || 8080; export const JSON_RPC_RELAY_PORT: number = +getEnvironmentVariable('JSON_RPC_RELAY_PORT') || 7546; export const JSON_RPC_RELAY_LOCAL_PORT: number = +getEnvironmentVariable('JSON_RPC_RELAY_LOCAL_PORT') || 37_546; export const EXPLORER_PORT: number = +getEnvironmentVariable('EXPLORER_PORT') || 8080; export const EXPLORER_LOCAL_PORT: number = +getEnvironmentVariable('EXPLORER_LOCAL_PORT') || 38_080; export const MIRROR_NODE_PORT: number = +getEnvironmentVariable('MIRROR_NODE_PORT') || 38_081; export const LOCAL_BUILD_COPY_RETRY: number = +getEnvironmentVariable('LOCAL_BUILD_COPY_RETRY') || 3; export const LOAD_BALANCER_CHECK_DELAY_SECS: number = +getEnvironmentVariable('LOAD_BALANCER_CHECK_DELAY_SECS') || 5; export const LOAD_BALANCER_CHECK_MAX_ATTEMPTS: number = +getEnvironmentVariable('LOAD_BALANCER_CHECK_MAX_ATTEMPTS') || 60; export const NETWORK_DESTROY_WAIT_TIMEOUT: number = +getEnvironmentVariable('NETWORK_DESTROY_WAIT_TIMEOUT') || 120; export const DEFAULT_LOCAL_CONFIG_FILE: string = 'local-config.yaml'; export const NODE_OVERRIDE_FILE: string = 'node-overrides.yaml'; export const IGNORED_NODE_ACCOUNT_ID: string = '0.0.0'; export const UPLOADER_SECRET_NAME: string = 'uploader-mirror-secrets'; export const MINIO_SECRET_NAME: string = 'minio-secrets'; export const BACKUP_SECRET_NAME: string = 'backup-uploader-secrets'; export const MIRROR_INGRESS_TLS_SECRET_NAME: string = 'ca-secret-mirror-node'; export const EXPLORER_INGRESS_TLS_SECRET_NAME: string = 'ca-secret-hiero-explorer'; export const BLOCK_STREAM_STREAM_MODE: string = getEnvironmentVariable('BLOCK_STREAM_STREAM_MODE') || 'BOTH'; export const BLOCK_STREAM_WRITER_MODE: string = getEnvironmentVariable('BLOCK_STREAM_WRITER_MODE') || 'FILE_AND_GRPC'; export const BLOCK_NODE_IMAGE_NAME: string = 'block-node-server'; export const APPLICATION_PROPERTIES: string = 'application.properties'; export const BLOCK_NODES_JSON_FILE: string = 'block-nodes.json'; export const NETWORK_NODE_SHARED_DATA_CONFIG_MAP_NAME: string = 'network-node-data-config-cm'; export const enum StorageType { MINIO_ONLY = 'minio_only', AWS_ONLY = 'aws_only', GCS_ONLY = 'gcs_only', AWS_AND_GCS = 'aws_and_gcs', } export const CERT_MANAGER_CRDS: string[] = [ 'certificaterequests.cert-manager.io', 'certificates.cert-manager.io', 'clusterissuers.cert-manager.io', 'issuers.cert-manager.io', ]; export const TRIGGER_STAKE_WEIGHT_CALCULATE_WAIT_SECONDS: number = +getEnvironmentVariable('TRIGGER_STAKE_WEIGHT_CALCULATE_WAIT_SECONDS') || 60;