From bde7dc1f6e7f20e515ac88c0557b5b4376514546 Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 09:00:32 +1100 Subject: [PATCH 1/9] fix: rebrand fullstack-network-manager as solo Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- .gitignore | 2 +- .../test/e2e/setup-e2e.sh | 9 ---- .../.eslintrc.yml | 0 .../.npmignore | 0 .../.remarkrc.yml | 0 {fullstack-network-manager => solo}/README.md | 47 +++++++++--------- .../jest.config.mjs | 0 .../package-lock.json | 6 +-- .../package.json | 19 +++---- .../resources/extract-jar.sh | 0 .../resources/templates/config.template | 0 .../resources/templates/hedera.crt | 0 .../resources/templates/hedera.key | 0 .../resources/templates/log4j2.xml | 0 .../templates/node-keys/private-node0.pfx | Bin .../templates/node-keys/private-node1.pfx | Bin .../templates/node-keys/private-node2.pfx | Bin .../templates/node-keys/private-node3.pfx | Bin .../resources/templates/node-keys/public.pfx | Bin .../properties/api-permission.properties | 0 .../properties/application.properties | 0 .../templates/properties/bootstrap.properties | 0 .../resources/templates/settings.txt | 0 .../fsnetman.mjs => solo/solo.mjs | 0 .../src/commands/base.mjs | 0 .../src/commands/cluster.mjs | 0 .../src/commands/flags.mjs | 0 .../src/commands/index.mjs | 0 .../src/commands/init.mjs | 0 .../src/commands/network.mjs | 0 .../src/commands/node.mjs | 0 .../src/commands/prompts.mjs | 0 .../src/commands/relay.mjs | 0 .../src/core/chart_manager.mjs | 0 .../src/core/config_manager.mjs | 0 .../src/core/constants.mjs | 6 +-- .../src/core/dependency_manager.mjs | 0 .../src/core/errors.mjs | 0 .../src/core/helm.mjs | 0 .../src/core/helpers.mjs | 0 .../src/core/index.mjs | 0 .../src/core/k8.mjs | 2 +- .../src/core/logging.mjs | 2 +- .../src/core/package_downloader.mjs | 0 .../src/core/platform_installer.mjs | 0 .../src/core/shell_runner.mjs | 0 .../src/core/templates.mjs | 0 .../src/core/zippy.mjs | 0 .../src/index.mjs | 5 +- .../test/data/.empty | 0 .../test/data/fsnetman-test-1.config | 0 .../test/data/fsnetman-test-2.config | 0 .../test/e2e/commands/node.test.mjs | 0 .../test/e2e/core/k8_e2e.test.mjs | 0 .../e2e/core/package_downloader_e2e.test.mjs | 0 .../e2e/core/platform_installer_e2e.test.mjs | 0 solo/test/e2e/setup-e2e.sh | 9 ++++ .../test/test_util.js | 0 .../test/unit/commands/base.test.mjs | 0 .../test/unit/commands/init.test.mjs | 0 .../test/unit/core/config_manager.test.mjs | 6 +-- .../unit/core/dependency_manager.test.mjs | 0 .../test/unit/core/errors.test.mjs | 0 .../test/unit/core/helm.test.mjs | 0 .../test/unit/core/logging.test.mjs | 0 .../unit/core/package_downloader.test.mjs | 0 .../unit/core/platform_installer.test.mjs | 0 .../test/unit/core/shell_runner.test.mjs | 0 .../test/unit/core/zippy.test.mjs | 0 solo/unused/private-alice.pfx | Bin 0 -> 7732 bytes solo/unused/private-bob.pfx | Bin 0 -> 4936 bytes solo/unused/private-node0.pfx | Bin 0 -> 7732 bytes solo/unused/public.pfx | Bin 0 -> 2966 bytes 73 files changed, 56 insertions(+), 57 deletions(-) delete mode 100755 fullstack-network-manager/test/e2e/setup-e2e.sh rename {fullstack-network-manager => solo}/.eslintrc.yml (100%) rename {fullstack-network-manager => solo}/.npmignore (100%) rename {fullstack-network-manager => solo}/.remarkrc.yml (100%) rename {fullstack-network-manager => solo}/README.md (61%) rename {fullstack-network-manager => solo}/jest.config.mjs (100%) rename {fullstack-network-manager => solo}/package-lock.json (99%) rename {fullstack-network-manager => solo}/package.json (77%) rename {fullstack-network-manager => solo}/resources/extract-jar.sh (100%) rename {fullstack-network-manager => solo}/resources/templates/config.template (100%) rename {fullstack-network-manager => solo}/resources/templates/hedera.crt (100%) rename {fullstack-network-manager => solo}/resources/templates/hedera.key (100%) rename {fullstack-network-manager => solo}/resources/templates/log4j2.xml (100%) rename {fullstack-network-manager => solo}/resources/templates/node-keys/private-node0.pfx (100%) rename {fullstack-network-manager => solo}/resources/templates/node-keys/private-node1.pfx (100%) rename {fullstack-network-manager => solo}/resources/templates/node-keys/private-node2.pfx (100%) rename {fullstack-network-manager => solo}/resources/templates/node-keys/private-node3.pfx (100%) rename {fullstack-network-manager => solo}/resources/templates/node-keys/public.pfx (100%) rename {fullstack-network-manager => solo}/resources/templates/properties/api-permission.properties (100%) rename {fullstack-network-manager => solo}/resources/templates/properties/application.properties (100%) rename {fullstack-network-manager => solo}/resources/templates/properties/bootstrap.properties (100%) rename {fullstack-network-manager => solo}/resources/templates/settings.txt (100%) rename fullstack-network-manager/fsnetman.mjs => solo/solo.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/base.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/cluster.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/flags.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/index.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/init.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/network.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/node.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/prompts.mjs (100%) rename {fullstack-network-manager => solo}/src/commands/relay.mjs (100%) rename {fullstack-network-manager => solo}/src/core/chart_manager.mjs (100%) rename {fullstack-network-manager => solo}/src/core/config_manager.mjs (100%) rename {fullstack-network-manager => solo}/src/core/constants.mjs (94%) rename {fullstack-network-manager => solo}/src/core/dependency_manager.mjs (100%) rename {fullstack-network-manager => solo}/src/core/errors.mjs (100%) rename {fullstack-network-manager => solo}/src/core/helm.mjs (100%) rename {fullstack-network-manager => solo}/src/core/helpers.mjs (100%) rename {fullstack-network-manager => solo}/src/core/index.mjs (100%) rename {fullstack-network-manager => solo}/src/core/k8.mjs (99%) rename {fullstack-network-manager => solo}/src/core/logging.mjs (99%) rename {fullstack-network-manager => solo}/src/core/package_downloader.mjs (100%) rename {fullstack-network-manager => solo}/src/core/platform_installer.mjs (100%) rename {fullstack-network-manager => solo}/src/core/shell_runner.mjs (100%) rename {fullstack-network-manager => solo}/src/core/templates.mjs (100%) rename {fullstack-network-manager => solo}/src/core/zippy.mjs (100%) rename {fullstack-network-manager => solo}/src/index.mjs (87%) rename {fullstack-network-manager => solo}/test/data/.empty (100%) rename {fullstack-network-manager => solo}/test/data/fsnetman-test-1.config (100%) rename {fullstack-network-manager => solo}/test/data/fsnetman-test-2.config (100%) rename {fullstack-network-manager => solo}/test/e2e/commands/node.test.mjs (100%) rename {fullstack-network-manager => solo}/test/e2e/core/k8_e2e.test.mjs (100%) rename {fullstack-network-manager => solo}/test/e2e/core/package_downloader_e2e.test.mjs (100%) rename {fullstack-network-manager => solo}/test/e2e/core/platform_installer_e2e.test.mjs (100%) create mode 100755 solo/test/e2e/setup-e2e.sh rename {fullstack-network-manager => solo}/test/test_util.js (100%) rename {fullstack-network-manager => solo}/test/unit/commands/base.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/commands/init.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/config_manager.test.mjs (95%) rename {fullstack-network-manager => solo}/test/unit/core/dependency_manager.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/errors.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/helm.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/logging.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/package_downloader.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/platform_installer.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/shell_runner.test.mjs (100%) rename {fullstack-network-manager => solo}/test/unit/core/zippy.test.mjs (100%) create mode 100644 solo/unused/private-alice.pfx create mode 100644 solo/unused/private-bob.pfx create mode 100644 solo/unused/private-node0.pfx create mode 100644 solo/unused/public.pfx diff --git a/.gitignore b/.gitignore index 4a91b2ba8..39e228e07 100644 --- a/.gitignore +++ b/.gitignore @@ -514,5 +514,5 @@ dev/local-node/config.txt dev/temp/.env charts/deleteme.yaml node_modules -fullstack-network-manager/coverage +solo/coverage dev/resources/nmt/version.properties diff --git a/fullstack-network-manager/test/e2e/setup-e2e.sh b/fullstack-network-manager/test/e2e/setup-e2e.sh deleted file mode 100755 index ebb955bcc..000000000 --- a/fullstack-network-manager/test/e2e/setup-e2e.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -FST_CLUSTER_NAME=fst-local -FST_NAMESPACE=fst-local -kind delete cluster -n "${FST_CLUSTER_NAME}" || true -kind create cluster -n "${FST_CLUSTER_NAME}" || exit 1 -kubectl create ns "${FST_NAMESPACE}" || exit 1 -fsnetman init -d ../charts --namespace "${FST_NAMESPACE}" || exit 1 # cache args for subsequent commands -fsnetman cluster setup --cert-manager --cert-manager-crds --minio || exit 1 -fsnetman network deploy --no-enable-prometheus-svc-monitor --enable-hedera-explorer-tls || exit 1 diff --git a/fullstack-network-manager/.eslintrc.yml b/solo/.eslintrc.yml similarity index 100% rename from fullstack-network-manager/.eslintrc.yml rename to solo/.eslintrc.yml diff --git a/fullstack-network-manager/.npmignore b/solo/.npmignore similarity index 100% rename from fullstack-network-manager/.npmignore rename to solo/.npmignore diff --git a/fullstack-network-manager/.remarkrc.yml b/solo/.remarkrc.yml similarity index 100% rename from fullstack-network-manager/.remarkrc.yml rename to solo/.remarkrc.yml diff --git a/fullstack-network-manager/README.md b/solo/README.md similarity index 61% rename from fullstack-network-manager/README.md rename to solo/README.md index 2cf899015..5d136715d 100644 --- a/fullstack-network-manager/README.md +++ b/solo/README.md @@ -1,6 +1,6 @@ # Full Stack Network Manager CLI -Full Stack Network Manager (fsnetman) is a CLI tool to manage and deploy a Hedera Network using the FS Helm Charts. +Full Stack Network Manager (solo) is a CLI tool to manage and deploy a Hedera Network using the FS Helm Charts. ## Install @@ -15,7 +15,7 @@ Full Stack Network Manager (fsnetman) is a CLI tool to manage and deploy a Heder your [Github access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) and setup an environment variable GITHUB\_TOKEN. -* Run `npm install -g @hashgraph/fullstack-network-manager` +* Run `npm install -g @hashgraph/solo` * Ensure you have a valid kubernetes context, cluster and namespace. You may use `kind` and `kubectl` CLIs to create cluster and namespace as below (See [`test/e2e/setup-e2e.sh`](test/e2e/setup_e2e.sh)): @@ -25,30 +25,29 @@ export FST_CLUSTER_NAME=fst-local export FST_NAMESPACE=fst-local kind create cluster -n "${FST_CLUSTER_NAME}" kubectl create ns "${FST_NAMESPACE}" -fsnetman init -d ../charts --namespace "${FST_NAMESPACE}" # cache args for subsequent commands +solo init -d ../charts --namespace "${FST_NAMESPACE}" # cache args for subsequent commands ``` -* Run `fsnetman` from a terminal, It may show usage options as shown below: +* Run `solo` from a terminal, It may show usage options as shown below: ``` -❯ fsnetman - -------------------------------------------------------------------------------- -*** Fullstack Network Manager (FsNetMan) *** -Version : 0.16.0 -Kubernetes Context : kind-fst-local -Kubernetes Cluster : kind-fst-local -------------------------------------------------------------------------------- - +❯ solo + +******************************* Solo ********************************************* +Version : 0.18.0 +Kubernetes Context : kind-kind +Kubernetes Cluster : kind-kind +Kubernetes Namespace : undefined +********************************************************************************** Usage: - fsnetman <command> [options] + solo <command> [options] Commands: - fsnetman init Perform dependency checks and initialize local environment - fsnetman cluster Manage cluster - fsnetman chart Manage chart deployment - fsnetman node Manage a node running Hedera platform - fsnetman relay Manage JSON RPC relays + solo init Initialize local environment + solo cluster Manage fullstack testing cluster + solo network Manage fullstack testing network deployment + solo node Manage Hedera platform node in fullstack testing network + solo relay Manage JSON RPC relays in fullstack testing network Options: --dev Enable developer mode [boolean] [default: false] @@ -67,12 +66,12 @@ Select a command * `Run->Edit Configurations->Edit Configuration Templates->Jest` and then set `--experimental-vm-modules` in `Node Options`. * Run `npm i` to install the required packages -* Run `npm link` to install `fsnetman` as the CLI - * Note: you need to do it once. If `fsnetman` already exists in your path, you will need to remove it first. - * Alternative way would be to run `npm run fsnetman -- <COMMAND> <ARGS>` +* Run `npm link` to install `solo` as the CLI + * Note: you need to do it once. If `solo` already exists in your path, you will need to remove it first. + * Alternative way would be to run `npm run solo -- <COMMAND> <ARGS>` * Run `npm test` or `npm run test` to run the unit tests -* Run `fsnetman` to access the CLI as shown above. -* Note that debug logs are stored at `~/.fsnetman/logs/fst.log`. So you may use `tail -f ~/.fsnetman/logs/fst.log | jq +* Run `solo` to access the CLI as shown above. +* Note that debug logs are stored at `~/.solo/logs/fst.log`. So you may use `tail -f ~/.solo/logs/fst.log | jq ` in a separate terminal to keep an eye on the logs. * Before making a commit run `npm run format` diff --git a/fullstack-network-manager/jest.config.mjs b/solo/jest.config.mjs similarity index 100% rename from fullstack-network-manager/jest.config.mjs rename to solo/jest.config.mjs diff --git a/fullstack-network-manager/package-lock.json b/solo/package-lock.json similarity index 99% rename from fullstack-network-manager/package-lock.json rename to solo/package-lock.json index c125bef97..eb3970761 100644 --- a/fullstack-network-manager/package-lock.json +++ b/solo/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@hashgraph/fullstack-network-manager", + "name": "@hashgraph/solo", "version": "0.18.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@hashgraph/fullstack-network-manager", + "name": "@hashgraph/solo", "version": "0.18.0", "license": "Apache2.0", "os": [ @@ -32,7 +32,7 @@ "yargs": "^17.7.2" }, "bin": { - "fsnetman": "fsnetman.mjs" + "solo": "solo.mjs" }, "devDependencies": { "@jest/globals": "^29.7.0", diff --git a/fullstack-network-manager/package.json b/solo/package.json similarity index 77% rename from fullstack-network-manager/package.json rename to solo/package.json index 16342ad1b..812033b51 100644 --- a/fullstack-network-manager/package.json +++ b/solo/package.json @@ -1,27 +1,28 @@ { - "name": "@hashgraph/fullstack-network-manager", + "name": "@hashgraph/solo", "version": "0.18.0", - "description": "Fullstack-Network-Manager is a CLI tool to manage and deploy a Hedera Network using Helm chart for local testing.", + "description": "SOLO is a CLI tool to manage a private Hedera Network using Helm chart.", "main": "src/index.mjs", "type": "module", "publishConfig": { "registry": "https://npm.pkg.github.com" }, "bin": { - "fsnetman": "fsnetman.mjs" + "solo": "solo.mjs" }, "scripts": { "test": "NODE_OPTIONS=--experimental-vm-modules jest --runInBand --detectOpenHandles --forceExit --testPathIgnorePatterns=\".*/e2e/.*\"", "test-e2e": "NODE_OPTIONS=--experimental-vm-modules jest --runInBand --detectOpenHandles --forceExit --testPathIgnorePatterns=\\\".*/unit/.*\\\"", - "fsnetman": "NODE_OPTIONS=--experimental-vm-modules node fsnetman.mjs", + "solo": "NODE_OPTIONS=--experimental-vm-modules node solo.mjs", "check": "remark . --quiet --frail && eslint .", "format": "remark . --quiet --frail --output && eslint --fix ." }, "keywords": [ - "fullstack-network-manager", - "full-stack-testing" + "solo", + "full-stack-testing", + "fullstack-network-manager" ], - "author": "Lenin Mehedy", + "author": "Swirlds Labs", "license": "Apache2.0", "dependencies": { "@hashgraph/sdk": "^2.40.0", @@ -57,8 +58,8 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/hashgraph/full-stack-testing.git", - "directory": "fullstack-network-manager" + "url": "git+https://github.com/hashgraph/solo.git", + "directory": "solo" }, "os": [ "darwin", diff --git a/fullstack-network-manager/resources/extract-jar.sh b/solo/resources/extract-jar.sh similarity index 100% rename from fullstack-network-manager/resources/extract-jar.sh rename to solo/resources/extract-jar.sh diff --git a/fullstack-network-manager/resources/templates/config.template b/solo/resources/templates/config.template similarity index 100% rename from fullstack-network-manager/resources/templates/config.template rename to solo/resources/templates/config.template diff --git a/fullstack-network-manager/resources/templates/hedera.crt b/solo/resources/templates/hedera.crt similarity index 100% rename from fullstack-network-manager/resources/templates/hedera.crt rename to solo/resources/templates/hedera.crt diff --git a/fullstack-network-manager/resources/templates/hedera.key b/solo/resources/templates/hedera.key similarity index 100% rename from fullstack-network-manager/resources/templates/hedera.key rename to solo/resources/templates/hedera.key diff --git a/fullstack-network-manager/resources/templates/log4j2.xml b/solo/resources/templates/log4j2.xml similarity index 100% rename from fullstack-network-manager/resources/templates/log4j2.xml rename to solo/resources/templates/log4j2.xml diff --git a/fullstack-network-manager/resources/templates/node-keys/private-node0.pfx b/solo/resources/templates/node-keys/private-node0.pfx similarity index 100% rename from fullstack-network-manager/resources/templates/node-keys/private-node0.pfx rename to solo/resources/templates/node-keys/private-node0.pfx diff --git a/fullstack-network-manager/resources/templates/node-keys/private-node1.pfx b/solo/resources/templates/node-keys/private-node1.pfx similarity index 100% rename from fullstack-network-manager/resources/templates/node-keys/private-node1.pfx rename to solo/resources/templates/node-keys/private-node1.pfx diff --git a/fullstack-network-manager/resources/templates/node-keys/private-node2.pfx b/solo/resources/templates/node-keys/private-node2.pfx similarity index 100% rename from fullstack-network-manager/resources/templates/node-keys/private-node2.pfx rename to solo/resources/templates/node-keys/private-node2.pfx diff --git a/fullstack-network-manager/resources/templates/node-keys/private-node3.pfx b/solo/resources/templates/node-keys/private-node3.pfx similarity index 100% rename from fullstack-network-manager/resources/templates/node-keys/private-node3.pfx rename to solo/resources/templates/node-keys/private-node3.pfx diff --git a/fullstack-network-manager/resources/templates/node-keys/public.pfx b/solo/resources/templates/node-keys/public.pfx similarity index 100% rename from fullstack-network-manager/resources/templates/node-keys/public.pfx rename to solo/resources/templates/node-keys/public.pfx diff --git a/fullstack-network-manager/resources/templates/properties/api-permission.properties b/solo/resources/templates/properties/api-permission.properties similarity index 100% rename from fullstack-network-manager/resources/templates/properties/api-permission.properties rename to solo/resources/templates/properties/api-permission.properties diff --git a/fullstack-network-manager/resources/templates/properties/application.properties b/solo/resources/templates/properties/application.properties similarity index 100% rename from fullstack-network-manager/resources/templates/properties/application.properties rename to solo/resources/templates/properties/application.properties diff --git a/fullstack-network-manager/resources/templates/properties/bootstrap.properties b/solo/resources/templates/properties/bootstrap.properties similarity index 100% rename from fullstack-network-manager/resources/templates/properties/bootstrap.properties rename to solo/resources/templates/properties/bootstrap.properties diff --git a/fullstack-network-manager/resources/templates/settings.txt b/solo/resources/templates/settings.txt similarity index 100% rename from fullstack-network-manager/resources/templates/settings.txt rename to solo/resources/templates/settings.txt diff --git a/fullstack-network-manager/fsnetman.mjs b/solo/solo.mjs similarity index 100% rename from fullstack-network-manager/fsnetman.mjs rename to solo/solo.mjs diff --git a/fullstack-network-manager/src/commands/base.mjs b/solo/src/commands/base.mjs similarity index 100% rename from fullstack-network-manager/src/commands/base.mjs rename to solo/src/commands/base.mjs diff --git a/fullstack-network-manager/src/commands/cluster.mjs b/solo/src/commands/cluster.mjs similarity index 100% rename from fullstack-network-manager/src/commands/cluster.mjs rename to solo/src/commands/cluster.mjs diff --git a/fullstack-network-manager/src/commands/flags.mjs b/solo/src/commands/flags.mjs similarity index 100% rename from fullstack-network-manager/src/commands/flags.mjs rename to solo/src/commands/flags.mjs diff --git a/fullstack-network-manager/src/commands/index.mjs b/solo/src/commands/index.mjs similarity index 100% rename from fullstack-network-manager/src/commands/index.mjs rename to solo/src/commands/index.mjs diff --git a/fullstack-network-manager/src/commands/init.mjs b/solo/src/commands/init.mjs similarity index 100% rename from fullstack-network-manager/src/commands/init.mjs rename to solo/src/commands/init.mjs diff --git a/fullstack-network-manager/src/commands/network.mjs b/solo/src/commands/network.mjs similarity index 100% rename from fullstack-network-manager/src/commands/network.mjs rename to solo/src/commands/network.mjs diff --git a/fullstack-network-manager/src/commands/node.mjs b/solo/src/commands/node.mjs similarity index 100% rename from fullstack-network-manager/src/commands/node.mjs rename to solo/src/commands/node.mjs diff --git a/fullstack-network-manager/src/commands/prompts.mjs b/solo/src/commands/prompts.mjs similarity index 100% rename from fullstack-network-manager/src/commands/prompts.mjs rename to solo/src/commands/prompts.mjs diff --git a/fullstack-network-manager/src/commands/relay.mjs b/solo/src/commands/relay.mjs similarity index 100% rename from fullstack-network-manager/src/commands/relay.mjs rename to solo/src/commands/relay.mjs diff --git a/fullstack-network-manager/src/core/chart_manager.mjs b/solo/src/core/chart_manager.mjs similarity index 100% rename from fullstack-network-manager/src/core/chart_manager.mjs rename to solo/src/core/chart_manager.mjs diff --git a/fullstack-network-manager/src/core/config_manager.mjs b/solo/src/core/config_manager.mjs similarity index 100% rename from fullstack-network-manager/src/core/config_manager.mjs rename to solo/src/core/config_manager.mjs diff --git a/fullstack-network-manager/src/core/constants.mjs b/solo/src/core/constants.mjs similarity index 94% rename from fullstack-network-manager/src/core/constants.mjs rename to solo/src/core/constants.mjs index 2b6b4c00d..6135659d6 100644 --- a/fullstack-network-manager/src/core/constants.mjs +++ b/solo/src/core/constants.mjs @@ -4,17 +4,17 @@ import { dirname, normalize } from 'path' import { fileURLToPath } from 'url' import chalk from 'chalk' -// -------------------- fsnetman related constants --------------------------------------------------------------------- +// -------------------- solo related constants --------------------------------------------------------------------- export const CUR_FILE_DIR = dirname(fileURLToPath(import.meta.url)) export const USER = `${process.env.USER}` export const USER_SANITIZED = USER.replace(/[\W_]+/g, '-') -export const FST_HOME_DIR = `${process.env.HOME}/.fsnetman` +export const FST_HOME_DIR = `${process.env.HOME}/.solo` export const FST_LOGS_DIR = `${FST_HOME_DIR}/logs` export const FST_CACHE_DIR = `${FST_HOME_DIR}/cache` export const DEFAULT_NAMESPACE = 'default' export const HELM = 'helm' export const CWD = process.cwd() -export const FST_CONFIG_FILE = `${FST_HOME_DIR}/fsnetman.config` +export const FST_CONFIG_FILE = `${FST_HOME_DIR}/solo.config` export const RESOURCES_DIR = normalize(CUR_FILE_DIR + '/../../resources') export const ROOT_CONTAINER = 'root-container' diff --git a/fullstack-network-manager/src/core/dependency_manager.mjs b/solo/src/core/dependency_manager.mjs similarity index 100% rename from fullstack-network-manager/src/core/dependency_manager.mjs rename to solo/src/core/dependency_manager.mjs diff --git a/fullstack-network-manager/src/core/errors.mjs b/solo/src/core/errors.mjs similarity index 100% rename from fullstack-network-manager/src/core/errors.mjs rename to solo/src/core/errors.mjs diff --git a/fullstack-network-manager/src/core/helm.mjs b/solo/src/core/helm.mjs similarity index 100% rename from fullstack-network-manager/src/core/helm.mjs rename to solo/src/core/helm.mjs diff --git a/fullstack-network-manager/src/core/helpers.mjs b/solo/src/core/helpers.mjs similarity index 100% rename from fullstack-network-manager/src/core/helpers.mjs rename to solo/src/core/helpers.mjs diff --git a/fullstack-network-manager/src/core/index.mjs b/solo/src/core/index.mjs similarity index 100% rename from fullstack-network-manager/src/core/index.mjs rename to solo/src/core/index.mjs diff --git a/fullstack-network-manager/src/core/k8.mjs b/solo/src/core/k8.mjs similarity index 99% rename from fullstack-network-manager/src/core/k8.mjs rename to solo/src/core/k8.mjs index 379f66978..662276459 100644 --- a/fullstack-network-manager/src/core/k8.mjs +++ b/solo/src/core/k8.mjs @@ -10,7 +10,7 @@ import * as tar from 'tar' import { v4 as uuid4 } from 'uuid' /** - * A kubernetes API wrapper class providing custom functionalities required by fsnetman + * A kubernetes API wrapper class providing custom functionalities required by solo * * Note: Take care if the same instance is used for parallel execution, as the behaviour may be unpredictable. * For parallel execution, create separate instances by invoking clone() diff --git a/fullstack-network-manager/src/core/logging.mjs b/solo/src/core/logging.mjs similarity index 99% rename from fullstack-network-manager/src/core/logging.mjs rename to solo/src/core/logging.mjs index 9f4d41177..136c1aa4d 100644 --- a/fullstack-network-manager/src/core/logging.mjs +++ b/solo/src/core/logging.mjs @@ -60,7 +60,7 @@ export const Logger = class { // - Write all logs with importance level of `error` or less to `error.log` // - Write all logs with importance level of `info` or less to `fst.log` // - new winston.transports.File({ filename: `${constants.FST_LOGS_DIR}/fst.log` }) + new winston.transports.File({ filename: `${constants.FST_LOGS_DIR}/solo.log` }) // new winston.transports.File({filename: constants.TMP_DIR + "/logs/error.log", level: 'error'}), // new winston.transports.Console({format: customFormat}) ] diff --git a/fullstack-network-manager/src/core/package_downloader.mjs b/solo/src/core/package_downloader.mjs similarity index 100% rename from fullstack-network-manager/src/core/package_downloader.mjs rename to solo/src/core/package_downloader.mjs diff --git a/fullstack-network-manager/src/core/platform_installer.mjs b/solo/src/core/platform_installer.mjs similarity index 100% rename from fullstack-network-manager/src/core/platform_installer.mjs rename to solo/src/core/platform_installer.mjs diff --git a/fullstack-network-manager/src/core/shell_runner.mjs b/solo/src/core/shell_runner.mjs similarity index 100% rename from fullstack-network-manager/src/core/shell_runner.mjs rename to solo/src/core/shell_runner.mjs diff --git a/fullstack-network-manager/src/core/templates.mjs b/solo/src/core/templates.mjs similarity index 100% rename from fullstack-network-manager/src/core/templates.mjs rename to solo/src/core/templates.mjs diff --git a/fullstack-network-manager/src/core/zippy.mjs b/solo/src/core/zippy.mjs similarity index 100% rename from fullstack-network-manager/src/core/zippy.mjs rename to solo/src/core/zippy.mjs diff --git a/fullstack-network-manager/src/index.mjs b/solo/src/index.mjs similarity index 87% rename from fullstack-network-manager/src/index.mjs rename to solo/src/index.mjs index b9b255f95..175214432 100644 --- a/fullstack-network-manager/src/index.mjs +++ b/solo/src/index.mjs @@ -38,13 +38,12 @@ export function main (argv) { } configManager.persist() - logger.showUser(chalk.green('\n-------------------------------------------------------------------------------')) - logger.showUser(chalk.cyan('*** Fullstack Network Manager (FsNetMan) ***')) + logger.showUser(chalk.cyan('\n******************************* Solo *********************************************')) logger.showUser(chalk.cyan('Version\t\t\t:'), chalk.yellow(configManager.getVersion())) logger.showUser(chalk.cyan('Kubernetes Context\t:'), chalk.yellow(context.name)) logger.showUser(chalk.cyan('Kubernetes Cluster\t:'), chalk.yellow(configManager.getFlag(flags.clusterName))) logger.showUser(chalk.cyan('Kubernetes Namespace\t:'), chalk.yellow(configManager.getFlag(flags.namespace))) - logger.showUser(chalk.green('-------------------------------------------------------------------------------\n')) + logger.showUser(chalk.cyan('**********************************************************************************')) const opts = { logger, diff --git a/fullstack-network-manager/test/data/.empty b/solo/test/data/.empty similarity index 100% rename from fullstack-network-manager/test/data/.empty rename to solo/test/data/.empty diff --git a/fullstack-network-manager/test/data/fsnetman-test-1.config b/solo/test/data/fsnetman-test-1.config similarity index 100% rename from fullstack-network-manager/test/data/fsnetman-test-1.config rename to solo/test/data/fsnetman-test-1.config diff --git a/fullstack-network-manager/test/data/fsnetman-test-2.config b/solo/test/data/fsnetman-test-2.config similarity index 100% rename from fullstack-network-manager/test/data/fsnetman-test-2.config rename to solo/test/data/fsnetman-test-2.config diff --git a/fullstack-network-manager/test/e2e/commands/node.test.mjs b/solo/test/e2e/commands/node.test.mjs similarity index 100% rename from fullstack-network-manager/test/e2e/commands/node.test.mjs rename to solo/test/e2e/commands/node.test.mjs diff --git a/fullstack-network-manager/test/e2e/core/k8_e2e.test.mjs b/solo/test/e2e/core/k8_e2e.test.mjs similarity index 100% rename from fullstack-network-manager/test/e2e/core/k8_e2e.test.mjs rename to solo/test/e2e/core/k8_e2e.test.mjs diff --git a/fullstack-network-manager/test/e2e/core/package_downloader_e2e.test.mjs b/solo/test/e2e/core/package_downloader_e2e.test.mjs similarity index 100% rename from fullstack-network-manager/test/e2e/core/package_downloader_e2e.test.mjs rename to solo/test/e2e/core/package_downloader_e2e.test.mjs diff --git a/fullstack-network-manager/test/e2e/core/platform_installer_e2e.test.mjs b/solo/test/e2e/core/platform_installer_e2e.test.mjs similarity index 100% rename from fullstack-network-manager/test/e2e/core/platform_installer_e2e.test.mjs rename to solo/test/e2e/core/platform_installer_e2e.test.mjs diff --git a/solo/test/e2e/setup-e2e.sh b/solo/test/e2e/setup-e2e.sh new file mode 100755 index 000000000..4d26b3a1f --- /dev/null +++ b/solo/test/e2e/setup-e2e.sh @@ -0,0 +1,9 @@ +#!/bin/bash +FST_CLUSTER_NAME=fst-local +FST_NAMESPACE=fst-local +kind delete cluster -n "${FST_CLUSTER_NAME}" || true +kind create cluster -n "${FST_CLUSTER_NAME}" || exit 1 +kubectl create ns "${FST_NAMESPACE}" || exit 1 +solo init -d ../charts --namespace "${FST_NAMESPACE}" || exit 1 # cache args for subsequent commands +solo cluster setup --cert-manager --cert-manager-crds --minio || exit 1 +solo network deploy --no-enable-prometheus-svc-monitor --enable-hedera-explorer-tls || exit 1 diff --git a/fullstack-network-manager/test/test_util.js b/solo/test/test_util.js similarity index 100% rename from fullstack-network-manager/test/test_util.js rename to solo/test/test_util.js diff --git a/fullstack-network-manager/test/unit/commands/base.test.mjs b/solo/test/unit/commands/base.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/commands/base.test.mjs rename to solo/test/unit/commands/base.test.mjs diff --git a/fullstack-network-manager/test/unit/commands/init.test.mjs b/solo/test/unit/commands/init.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/commands/init.test.mjs rename to solo/test/unit/commands/init.test.mjs diff --git a/fullstack-network-manager/test/unit/core/config_manager.test.mjs b/solo/test/unit/core/config_manager.test.mjs similarity index 95% rename from fullstack-network-manager/test/unit/core/config_manager.test.mjs rename to solo/test/unit/core/config_manager.test.mjs index 62d745161..48cb21c44 100644 --- a/fullstack-network-manager/test/unit/core/config_manager.test.mjs +++ b/solo/test/unit/core/config_manager.test.mjs @@ -36,7 +36,7 @@ describe('ConfigManager', () => { }) describe('ConfigManager with loaded configs', () => { const testLogger = logging.NewLogger('debug') - const configFilePath = process.cwd() + '/test/data/fsnetman-test-1.config' + const configFilePath = process.cwd() + '/test/data/solo-test-1.config' const cm = new ConfigManager(testLogger, configFilePath, false) it('should be able to load a config file override in the constructor', @@ -83,7 +83,7 @@ describe('ConfigManager', () => { }) describe('ConfigManager with loaded configs and argv overrides', () => { const testLogger = logging.NewLogger('debug') - const configFilePath = process.cwd() + '/test/data/fsnetman-test-2.config' + const configFilePath = process.cwd() + '/test/data/solo-test-2.config' const cm = new ConfigManager(testLogger, configFilePath) const clusterName = '' const namespace = '' @@ -91,7 +91,7 @@ describe('ConfigManager', () => { argv[flags.clusterName.name] = clusterName argv[flags.namespace.name] = namespace cm.load(argv) - const configJSON = fs.readFileSync(process.cwd() + '/test/data/fsnetman-test-2.config') + const configJSON = fs.readFileSync(process.cwd() + '/test/data/solo-test-2.config') const newConfig = JSON.parse(configJSON.toString()) it('config file takes precedence over empty namespace', () => { diff --git a/fullstack-network-manager/test/unit/core/dependency_manager.test.mjs b/solo/test/unit/core/dependency_manager.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/dependency_manager.test.mjs rename to solo/test/unit/core/dependency_manager.test.mjs diff --git a/fullstack-network-manager/test/unit/core/errors.test.mjs b/solo/test/unit/core/errors.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/errors.test.mjs rename to solo/test/unit/core/errors.test.mjs diff --git a/fullstack-network-manager/test/unit/core/helm.test.mjs b/solo/test/unit/core/helm.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/helm.test.mjs rename to solo/test/unit/core/helm.test.mjs diff --git a/fullstack-network-manager/test/unit/core/logging.test.mjs b/solo/test/unit/core/logging.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/logging.test.mjs rename to solo/test/unit/core/logging.test.mjs diff --git a/fullstack-network-manager/test/unit/core/package_downloader.test.mjs b/solo/test/unit/core/package_downloader.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/package_downloader.test.mjs rename to solo/test/unit/core/package_downloader.test.mjs diff --git a/fullstack-network-manager/test/unit/core/platform_installer.test.mjs b/solo/test/unit/core/platform_installer.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/platform_installer.test.mjs rename to solo/test/unit/core/platform_installer.test.mjs diff --git a/fullstack-network-manager/test/unit/core/shell_runner.test.mjs b/solo/test/unit/core/shell_runner.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/shell_runner.test.mjs rename to solo/test/unit/core/shell_runner.test.mjs diff --git a/fullstack-network-manager/test/unit/core/zippy.test.mjs b/solo/test/unit/core/zippy.test.mjs similarity index 100% rename from fullstack-network-manager/test/unit/core/zippy.test.mjs rename to solo/test/unit/core/zippy.test.mjs diff --git a/solo/unused/private-alice.pfx b/solo/unused/private-alice.pfx new file mode 100644 index 0000000000000000000000000000000000000000..62022a5078faa33e05d0ee5d501220740e658cdd GIT binary patch literal 7732 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 PE@p{RrNrd_bLI9Ql>J<` literal 0 HcmV?d00001 diff --git a/solo/unused/private-bob.pfx b/solo/unused/private-bob.pfx new file mode 100644 index 0000000000000000000000000000000000000000..ac80503c5cf90472943c8f76257bce07a6954609 GIT binary patch literal 4936 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 literal 0 HcmV?d00001 diff --git a/solo/unused/private-node0.pfx b/solo/unused/private-node0.pfx new file mode 100644 index 0000000000000000000000000000000000000000..c49257a731f45466098a32bf9ba4ac55b270c1cb GIT binary patch literal 7732 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 PO3)8_Dwzxa{^a&=Exb@= literal 0 HcmV?d00001 diff --git a/solo/unused/public.pfx b/solo/unused/public.pfx new file mode 100644 index 0000000000000000000000000000000000000000..19fdb968952362a02e252d4126f13d0269c0d022 GIT binary patch literal 2966 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 M7b9`8i2?#A5M^VX4FCWD literal 0 HcmV?d00001 From 0d7f49aec3271545b80252a654b2d7911eb9f244 Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 09:04:59 +1100 Subject: [PATCH 2/9] doc: update solo description Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- solo/README.md | 2 +- solo/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/solo/README.md b/solo/README.md index 5d136715d..1693772de 100644 --- a/solo/README.md +++ b/solo/README.md @@ -1,6 +1,6 @@ # Full Stack Network Manager CLI -Full Stack Network Manager (solo) is a CLI tool to manage and deploy a Hedera Network using the FS Helm Charts. +Solo is a CLI tool to manage and deploy a private Hedera Network. ## Install diff --git a/solo/package.json b/solo/package.json index 812033b51..8d09a966d 100644 --- a/solo/package.json +++ b/solo/package.json @@ -1,7 +1,7 @@ { "name": "@hashgraph/solo", "version": "0.18.0", - "description": "SOLO is a CLI tool to manage a private Hedera Network using Helm chart.", + "description": "Solo is a CLI tool to manage and deploy a private Hedera Network.", "main": "src/index.mjs", "type": "module", "publishConfig": { From 1ae2880dfcb5f77abc0f3b849435eab36b5166bd Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 09:05:33 +1100 Subject: [PATCH 3/9] fix: rename Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- solo/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solo/README.md b/solo/README.md index 1693772de..23e174b06 100644 --- a/solo/README.md +++ b/solo/README.md @@ -1,4 +1,4 @@ -# Full Stack Network Manager CLI +# Solo Solo is a CLI tool to manage and deploy a private Hedera Network. From 3a3623e5d73e1aab8619d1f49a83911b3c3b2bbf Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 10:45:41 +1100 Subject: [PATCH 4/9] ci: fix directory names for solo Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- .github/workflows/flow-deploy-release-artifact.yaml | 6 +++--- .../{zxc-fsnetman-tests.yaml => zxc-solo-tests.yaml} | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) rename .github/workflows/{zxc-fsnetman-tests.yaml => zxc-solo-tests.yaml} (96%) diff --git a/.github/workflows/flow-deploy-release-artifact.yaml b/.github/workflows/flow-deploy-release-artifact.yaml index ad4af0402..5d29b0da8 100644 --- a/.github/workflows/flow-deploy-release-artifact.yaml +++ b/.github/workflows/flow-deploy-release-artifact.yaml @@ -270,13 +270,13 @@ jobs: npm install -g marked-mangle@1.0.1 marked-gfm-heading-id@3.0.4 semantic-release-conventional-commits@3.0.0 - name: Install Dependencies - working-directory: fullstack-network-manager + working-directory: solo run: npm ci - name: Setup NPM Authentication - working-directory: fullstack-network-manager + working-directory: solo run: | - # create .npmrc file to publish fullstack-network-manager to Github NPM registry + # create .npmrc file to publish solo to Github NPM registry rm -f .npmrc || true echo '//npm.pkg.github.com/:_authToken=${NPM_TOKEN}' > ".npmrc" echo '@hashgraph:registry=https://npm.pkg.github.com' >> ".npmrc" diff --git a/.github/workflows/zxc-fsnetman-tests.yaml b/.github/workflows/zxc-solo-tests.yaml similarity index 96% rename from .github/workflows/zxc-fsnetman-tests.yaml rename to .github/workflows/zxc-solo-tests.yaml index 86a410cf7..3570dbe63 100644 --- a/.github/workflows/zxc-fsnetman-tests.yaml +++ b/.github/workflows/zxc-solo-tests.yaml @@ -55,7 +55,7 @@ jobs: uses: tj-actions/changed-files@90a06d6ba9543371ab4df8eeca0be07ca6054959 #v42.0.2 with: files: | - fullstack-network-manager/** + solo/** - name: List all related changed files id: check-changed-files @@ -121,7 +121,7 @@ jobs: - name: NodeJS CLI Unit Tests id: nodejs-test - working-directory: fullstack-network-manager + working-directory: solo if: ${{ steps.check-changed-files.outputs.run-tests && !cancelled() && !failure() }} run: | which npm @@ -132,7 +132,7 @@ jobs: - name: NodeJS CLI E2E Tests id: nodejs-test-e2e - working-directory: fullstack-network-manager + working-directory: solo if: ${{ steps.check-changed-files.outputs.run-tests && !cancelled() && !failure() }} run: | npm i @@ -145,7 +145,7 @@ jobs: - name: Output logs id: nodejs-test-e2e-logs - working-directory: fullstack-network-manager + working-directory: solo if: ${{ steps.check-changed-files.outputs.run-tests && !cancelled() }} run: | cat ~/.fsnetman/logs/fst.log From 9a6a3870addce0f1af2c360812fa986a764b2108 Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 11:07:10 +1100 Subject: [PATCH 5/9] fix: rename FST with SOLO Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- solo/README.md | 12 ++--- solo/src/commands/cluster.mjs | 16 +++--- solo/src/commands/flags.mjs | 2 +- solo/src/commands/init.mjs | 6 +-- solo/src/commands/network.mjs | 22 ++++---- solo/src/commands/prompts.mjs | 2 +- solo/src/commands/relay.mjs | 4 +- solo/src/core/config_manager.mjs | 4 +- solo/src/core/constants.mjs | 50 +++++++++---------- solo/src/core/logging.mjs | 2 +- ...etman-test-1.config => solo-test-1.config} | 2 +- ...etman-test-2.config => solo-test-2.config} | 2 +- solo/test/e2e/commands/node.test.mjs | 2 +- solo/test/e2e/setup-e2e.sh | 12 ++--- solo/test/unit/core/config_manager.test.mjs | 6 +-- 15 files changed, 71 insertions(+), 73 deletions(-) rename solo/test/data/{fsnetman-test-1.config => solo-test-1.config} (91%) rename solo/test/data/{fsnetman-test-2.config => solo-test-2.config} (91%) diff --git a/solo/README.md b/solo/README.md index 23e174b06..5bce544f2 100644 --- a/solo/README.md +++ b/solo/README.md @@ -21,11 +21,11 @@ Solo is a CLI tool to manage and deploy a private Hedera Network. cluster and namespace as below (See [`test/e2e/setup-e2e.sh`](test/e2e/setup_e2e.sh)): ``` -export FST_CLUSTER_NAME=fst-local -export FST_NAMESPACE=fst-local -kind create cluster -n "${FST_CLUSTER_NAME}" -kubectl create ns "${FST_NAMESPACE}" -solo init -d ../charts --namespace "${FST_NAMESPACE}" # cache args for subsequent commands +export SOLO_CLUSTER_NAME=solo-local +export SOLO_NAMESPACE=solo-local +kind create cluster -n "${SOLO_CLUSTER_NAME}" +kubectl create ns "${SOLO_NAMESPACE}" +solo init -d ../charts --namespace "${SOLO_NAMESPACE}" # cache args for subsequent commands ``` * Run `solo` from a terminal, It may show usage options as shown below: @@ -71,7 +71,7 @@ Select a command * Alternative way would be to run `npm run solo -- <COMMAND> <ARGS>` * Run `npm test` or `npm run test` to run the unit tests * Run `solo` to access the CLI as shown above. -* Note that debug logs are stored at `~/.solo/logs/fst.log`. So you may use `tail -f ~/.solo/logs/fst.log | jq +* Note that debug logs are stored at `~/.solo/logs/solo.log`. So you may use `tail -f ~/.solo/logs/solo.log | jq ` in a separate terminal to keep an eye on the logs. * Before making a commit run `npm run format` diff --git a/solo/src/commands/cluster.mjs b/solo/src/commands/cluster.mjs index ca1649b97..aa046c94b 100644 --- a/solo/src/commands/cluster.mjs +++ b/solo/src/commands/cluster.mjs @@ -76,7 +76,7 @@ export class ClusterCommand extends BaseCommand { self.logger.debug('Prepare ctx.config', { config: ctx.config, argv }) - ctx.isChartInstalled = await this.chartManager.isChartInstalled(ctx.config.namespace, constants.CHART_FST_SETUP_NAME) + ctx.isChartInstalled = await this.chartManager.isChartInstalled(ctx.config.namespace, constants.FULLSTACK_CLUSTER_SETUP_CHART) } }, { @@ -94,7 +94,7 @@ export class ClusterCommand extends BaseCommand { skip: (ctx, _) => ctx.isChartInstalled }, { - title: `Install '${constants.CHART_FST_SETUP_NAME}' chart`, + title: `Install '${constants.FULLSTACK_CLUSTER_SETUP_CHART}' chart`, task: async (ctx, _) => { const namespace = ctx.config.namespace const version = ctx.config.version @@ -103,12 +103,12 @@ export class ClusterCommand extends BaseCommand { const valuesArg = ctx.valuesArg try { - await self.chartManager.install(namespace, constants.CHART_FST_SETUP_NAME, chartPath, version, valuesArg) + await self.chartManager.install(namespace, constants.FULLSTACK_CLUSTER_SETUP_CHART, chartPath, version, valuesArg) } catch (e) { // if error, uninstall the chart and rethrow the error - self.logger.debug(`Error on installing ${constants.CHART_FST_SETUP_NAME}. attempting to rollback by uninstalling the chart`, e) + self.logger.debug(`Error on installing ${constants.FULLSTACK_CLUSTER_SETUP_CHART}. attempting to rollback by uninstalling the chart`, e) try { - await self.chartManager.uninstall(namespace, constants.CHART_FST_SETUP_NAME) + await self.chartManager.uninstall(namespace, constants.FULLSTACK_CLUSTER_SETUP_CHART) } catch (ex) { // ignore error during uninstall since we are doing the best-effort uninstall here } @@ -155,14 +155,14 @@ export class ClusterCommand extends BaseCommand { namespace } - ctx.isChartInstalled = await this.chartManager.isChartInstalled(ctx.config.namespace, constants.CHART_FST_SETUP_NAME) + ctx.isChartInstalled = await this.chartManager.isChartInstalled(ctx.config.namespace, constants.FULLSTACK_CLUSTER_SETUP_CHART) } }, { - title: `Uninstall '${constants.CHART_FST_SETUP_NAME}' chart`, + title: `Uninstall '${constants.FULLSTACK_CLUSTER_SETUP_CHART}' chart`, task: async (ctx, _) => { const namespace = ctx.config.namespace - await self.chartManager.uninstall(namespace, constants.CHART_FST_SETUP_NAME) + await self.chartManager.uninstall(namespace, constants.FULLSTACK_CLUSTER_SETUP_CHART) await self.showInstalledChartList(namespace) }, skip: (ctx, _) => !ctx.isChartInstalled diff --git a/solo/src/commands/flags.mjs b/solo/src/commands/flags.mjs index d8e6dda0e..f7bc32f3b 100644 --- a/solo/src/commands/flags.mjs +++ b/solo/src/commands/flags.mjs @@ -171,7 +171,7 @@ export const cacheDir = { definition: { describe: 'Local cache directory containing platform release artifacts', alias: 'd', - default: core.constants.FST_CACHE_DIR, + default: core.constants.SOLO_CACHE_DIR, type: 'string' } } diff --git a/solo/src/commands/init.mjs b/solo/src/commands/init.mjs index 7999c8540..6446e863b 100644 --- a/solo/src/commands/init.mjs +++ b/solo/src/commands/init.mjs @@ -15,9 +15,9 @@ export class InitCommand extends BaseCommand { * @param dirs a list of directories that need to be created in sequence */ setupHomeDirectory (dirs = [ - constants.FST_HOME_DIR, - constants.FST_LOGS_DIR, - constants.FST_CACHE_DIR + constants.SOLO_HOME_DIR, + constants.SOLO_LOGS_DIR, + constants.SOLO_CACHE_DIR ]) { const self = this diff --git a/solo/src/commands/network.mjs b/solo/src/commands/network.mjs index 6527f095b..d9f3fadd9 100644 --- a/solo/src/commands/network.mjs +++ b/solo/src/commands/network.mjs @@ -104,7 +104,7 @@ export class NetworkCommand extends BaseCommand { // compute values config.chartPath = await this.prepareChartPath(config.chartDir, - constants.CHART_FST_REPO_NAME, constants.CHART_FST_DEPLOYMENT_NAME) + constants.FULLSTACK_TESTING_CHART, constants.FULLSTACK_DEPLOYMENT_CHART) config.valuesArg = this.prepareValuesArg(config.chartDir, config.valuesFile, config.deployMirrorNode, config.deployHederaExplorer, @@ -130,15 +130,15 @@ export class NetworkCommand extends BaseCommand { } }, { - title: `Install chart '${constants.CHART_FST_DEPLOYMENT_NAME}'`, + title: `Install chart '${constants.FULLSTACK_DEPLOYMENT_CHART}'`, task: async (ctx, _) => { - if (await self.chartManager.isChartInstalled(ctx.config.namespace, constants.CHART_FST_DEPLOYMENT_NAME)) { - await self.chartManager.uninstall(ctx.config.namespace, constants.CHART_FST_DEPLOYMENT_NAME) + if (await self.chartManager.isChartInstalled(ctx.config.namespace, constants.FULLSTACK_DEPLOYMENT_CHART)) { + await self.chartManager.uninstall(ctx.config.namespace, constants.FULLSTACK_DEPLOYMENT_CHART) } await this.chartManager.install( ctx.config.namespace, - constants.CHART_FST_DEPLOYMENT_NAME, + constants.FULLSTACK_DEPLOYMENT_CHART, ctx.config.chartPath, ctx.config.version, ctx.config.valuesArg) @@ -178,7 +178,7 @@ export class NetworkCommand extends BaseCommand { try { await tasks.run() } catch (e) { - throw new FullstackTestingError(`Error installing chart ${constants.CHART_FST_DEPLOYMENT_NAME}`, e) + throw new FullstackTestingError(`Error installing chart ${constants.FULLSTACK_DEPLOYMENT_CHART}`, e) } return true @@ -218,9 +218,9 @@ export class NetworkCommand extends BaseCommand { } }, { - title: `Uninstall chart ${constants.CHART_FST_DEPLOYMENT_NAME}`, + title: `Uninstall chart ${constants.FULLSTACK_DEPLOYMENT_CHART}`, task: async (ctx, _) => { - await self.chartManager.uninstall(ctx.config.namespace, constants.CHART_FST_DEPLOYMENT_NAME) + await self.chartManager.uninstall(ctx.config.namespace, constants.FULLSTACK_DEPLOYMENT_CHART) } }, { @@ -271,11 +271,11 @@ export class NetworkCommand extends BaseCommand { } }, { - title: `Upgrade chart '${constants.CHART_FST_DEPLOYMENT_NAME}'`, + title: `Upgrade chart '${constants.FULLSTACK_DEPLOYMENT_CHART}'`, task: async (ctx, _) => { await this.chartManager.upgrade( ctx.config.namespace, - constants.CHART_FST_DEPLOYMENT_NAME, + constants.FULLSTACK_DEPLOYMENT_CHART, ctx.config.chartPath, ctx.config.valuesArg) } @@ -296,7 +296,7 @@ export class NetworkCommand extends BaseCommand { try { await tasks.run() } catch (e) { - throw new FullstackTestingError(`Error upgrading chart ${constants.CHART_FST_DEPLOYMENT_NAME}`, e) + throw new FullstackTestingError(`Error upgrading chart ${constants.FULLSTACK_DEPLOYMENT_CHART}`, e) } return true diff --git a/solo/src/commands/prompts.mjs b/solo/src/commands/prompts.mjs index c5e4afaf4..e1da7285d 100644 --- a/solo/src/commands/prompts.mjs +++ b/solo/src/commands/prompts.mjs @@ -121,7 +121,7 @@ export async function promptCacheDir (task, input) { if (!input) { input = await task.prompt(ListrEnquirerPromptAdapter).run({ type: 'text', - default: constants.FST_CACHE_DIR, + default: constants.SOLO_CACHE_DIR, message: 'Enter local cache directory path:' }) } diff --git a/solo/src/commands/relay.mjs b/solo/src/commands/relay.mjs index 2c74e78be..6e95ebc14 100644 --- a/solo/src/commands/relay.mjs +++ b/solo/src/commands/relay.mjs @@ -17,7 +17,7 @@ export class RelayCommand extends BaseCommand { }) } - valuesArg += ` --set config.MIRROR_NODE_URL=${constants.CHART_FST_DEPLOYMENT_NAME}-rest` + valuesArg += ` --set config.MIRROR_NODE_URL=${constants.FULLSTACK_DEPLOYMENT_CHART}-rest` if (chainID) { valuesArg += ` --set config.CHAIN_ID=${chainID}` @@ -109,7 +109,7 @@ export class RelayCommand extends BaseCommand { { title: 'Prepare chart values', task: async (ctx, _) => { - ctx.chartPath = await this.prepareChartPath(ctx.config.chartDir, constants.CHART_JSON_RPC_RELAY_REPO_NAME, constants.CHART_JSON_RPC_RELAY_NAME) + ctx.chartPath = await this.prepareChartPath(ctx.config.chartDir, constants.JSON_RPC_RELAY_CHART, constants.CHART_JSON_RPC_RELAY_NAME) ctx.valuesArg = this.prepareValuesArg( ctx.config.valuesFile, ctx.config.nodeIds, diff --git a/solo/src/core/config_manager.mjs b/solo/src/core/config_manager.mjs index 56773a585..0fbc2be9d 100644 --- a/solo/src/core/config_manager.mjs +++ b/solo/src/core/config_manager.mjs @@ -10,10 +10,10 @@ import { fileURLToPath } from 'url' const CUR_FILE_DIR = paths.dirname(fileURLToPath(import.meta.url)) export class ConfigManager { - constructor (logger, fstConfigFile = constants.FST_CONFIG_FILE, persistMode = true) { + constructor (logger, fstConfigFile = constants.SOLO_CONFIG_FILE, persistMode = true) { if (!logger || !(logger instanceof Logger)) throw new MissingArgumentError('An instance of core/Logger is required') - if (fstConfigFile === constants.FST_CONFIG_FILE) { + if (fstConfigFile === constants.SOLO_CONFIG_FILE) { this.fstConfigFile = fstConfigFile } else { if (this.verifyConfigFile(fstConfigFile)) { diff --git a/solo/src/core/constants.mjs b/solo/src/core/constants.mjs index 6135659d6..10ad2b897 100644 --- a/solo/src/core/constants.mjs +++ b/solo/src/core/constants.mjs @@ -8,19 +8,19 @@ import chalk from 'chalk' export const CUR_FILE_DIR = dirname(fileURLToPath(import.meta.url)) export const USER = `${process.env.USER}` export const USER_SANITIZED = USER.replace(/[\W_]+/g, '-') -export const FST_HOME_DIR = `${process.env.HOME}/.solo` -export const FST_LOGS_DIR = `${FST_HOME_DIR}/logs` -export const FST_CACHE_DIR = `${FST_HOME_DIR}/cache` +export const SOLO_HOME_DIR = `${process.env.HOME}/.solo` +export const SOLO_LOGS_DIR = `${SOLO_HOME_DIR}/logs` +export const SOLO_CACHE_DIR = `${SOLO_HOME_DIR}/cache` export const DEFAULT_NAMESPACE = 'default' export const HELM = 'helm' export const CWD = process.cwd() -export const FST_CONFIG_FILE = `${FST_HOME_DIR}/solo.config` +export const SOLO_CONFIG_FILE = `${SOLO_HOME_DIR}/solo.config` export const RESOURCES_DIR = normalize(CUR_FILE_DIR + '/../../resources') export const ROOT_CONTAINER = 'root-container' // --------------- Hedera network and node related constants -------------------------------------------------------------------- -export const HEDERA_CHAIN_ID = process.env.FST_CHAIN_ID || '298' +export const HEDERA_CHAIN_ID = process.env.SOLO_CHAIN_ID || '298' export const HEDERA_HGCAPP_DIR = '/opt/hgcapp' export const HEDERA_SERVICES_PATH = `${HEDERA_HGCAPP_DIR}/services-hedera` export const HEDERA_HAPI_PATH = `${HEDERA_SERVICES_PATH}/HapiApp2.0` @@ -29,13 +29,13 @@ export const HEDERA_DATA_LIB_DIR = 'data/lib' export const HEDERA_USER_HOME_DIR = '/home/hedera' export const HEDERA_APP_NAME = 'HederaNode.jar' export const HEDERA_BUILDS_URL = 'https://builds.hedera.com' -export const HEDERA_NODE_ACCOUNT_ID_START = AccountId.fromString(process.env.FST_NODE_ACCOUNT_ID_START || '0.0.3') -export const HEDERA_NODE_INTERNAL_GOSSIP_PORT = process.env.FST_NODE_INTERNAL_GOSSIP_PORT || '50111' -export const HEDERA_NODE_EXTERNAL_GOSSIP_PORT = process.env.FST_NODE_EXTERNAL_GOSSIP_PORT || '50111' +export const HEDERA_NODE_ACCOUNT_ID_START = AccountId.fromString(process.env.SOLO_NODE_ACCOUNT_ID_START || '0.0.3') +export const HEDERA_NODE_INTERNAL_GOSSIP_PORT = process.env.SOLO_NODE_INTERNAL_GOSSIP_PORT || '50111' +export const HEDERA_NODE_EXTERNAL_GOSSIP_PORT = process.env.SOLO_NODE_EXTERNAL_GOSSIP_PORT || '50111' -export const HEDERA_NODE_GRPC_PORT = process.env.FST_NODE_GRPC_PORT || '50211' -export const HEDERA_NODE_GRPCS_PORT = process.env.FST_NODE_GRPC_PORT || '50212' -export const HEDERA_NODE_DEFAULT_STAKE_AMOUNT = process.env.FST_NODE_DEFAULT_STAKE_AMOUNT || 1 +export const HEDERA_NODE_GRPC_PORT = process.env.SOLO_NODE_GRPC_PORT || '50211' +export const HEDERA_NODE_GRPCS_PORT = process.env.SOLO_NODE_GRPC_PORT || '50212' +export const HEDERA_NODE_DEFAULT_STAKE_AMOUNT = process.env.SOLO_NODE_DEFAULT_STAKE_AMOUNT || 1 // --------------- Logging related constants --------------------------------------------------------------------------- export const LOG_STATUS_PROGRESS = chalk.cyan('>>') @@ -43,24 +43,22 @@ export const LOG_STATUS_DONE = chalk.green('OK') export const LOG_GROUP_DIVIDER = chalk.yellow('----------------------------------------------------------------------------') // --------------- Charts related constants ---------------------------------------------------------------------------- -export const CHART_REPO_FST_URL = 'https://hashgraph.github.io/full-stack-testing/charts' -export const CHART_FST_REPO_NAME = 'full-stack-testing' -export const CHART_FST_SETUP_NAME = 'fullstack-cluster-setup' -export const CHART_FST_DEPLOYMENT_NAME = 'fullstack-deployment' -export const CHART_REPO_JSON_RPC_RELAY_URL = 'https://hashgraph.github.io/hedera-json-rpc-relay/charts' -export const CHART_JSON_RPC_RELAY_REPO_NAME = 'hedera-json-rpc-relay' -export const CHART_JSON_RPC_RELAY_NAME = 'hedera-json-rpc-relay' -export const CHART_MIRROR_NODE_URL = 'https://hashgraph.github.io/hedera-mirror-node/charts' -export const CHART_MIRROR_NODE_REPO_NAME = 'hedera-mirror' -export const CHART_MIRROR_NODE_NAME = 'hedera-mirror' +export const FULLSTACK_TESTING_CHART_URL = 'https://hashgraph.github.io/full-stack-testing/charts' +export const FULLSTACK_TESTING_CHART = 'full-stack-testing' +export const FULLSTACK_CLUSTER_SETUP_CHART = 'fullstack-cluster-setup' +export const FULLSTACK_DEPLOYMENT_CHART = 'fullstack-deployment' +export const JSON_RPC_RELAY_CHART_URL = 'https://hashgraph.github.io/hedera-json-rpc-relay/charts' +export const JSON_RPC_RELAY_CHART = 'hedera-json-rpc-relay' +export const MIRROR_NODE_CHART_URL = 'https://hashgraph.github.io/hedera-mirror-node/charts' +export const MIRROR_NODE_CHART = 'hedera-mirror' export const DEFAULT_CHART_REPO = new Map() - .set(CHART_FST_REPO_NAME, CHART_REPO_FST_URL) - .set(CHART_JSON_RPC_RELAY_REPO_NAME, CHART_REPO_JSON_RPC_RELAY_URL) - .set(CHART_MIRROR_NODE_REPO_NAME, CHART_MIRROR_NODE_URL) + .set(FULLSTACK_TESTING_CHART, FULLSTACK_TESTING_CHART_URL) + .set(JSON_RPC_RELAY_CHART, JSON_RPC_RELAY_CHART_URL) + .set(MIRROR_NODE_CHART, MIRROR_NODE_CHART_URL) // ------------------- Hedera Account related --------------------------------------------------------------------------------- -export const OPERATOR_ID = process.env.FST_OPERATOR_ID || '0.0.2' -export const OPERATOR_KEY = process.env.FST_OPERATOR_KEY || '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137' +export const OPERATOR_ID = process.env.SOLO_OPERATOR_ID || '0.0.2' +export const OPERATOR_KEY = process.env.SOLO_OPERATOR_KEY || '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137' export const POD_STATUS_RUNNING = 'Running' export const POD_STATUS_READY = 'Ready' diff --git a/solo/src/core/logging.mjs b/solo/src/core/logging.mjs index 136c1aa4d..3a36b92a3 100644 --- a/solo/src/core/logging.mjs +++ b/solo/src/core/logging.mjs @@ -60,7 +60,7 @@ export const Logger = class { // - Write all logs with importance level of `error` or less to `error.log` // - Write all logs with importance level of `info` or less to `fst.log` // - new winston.transports.File({ filename: `${constants.FST_LOGS_DIR}/solo.log` }) + new winston.transports.File({ filename: `${constants.SOLO_LOGS_DIR}/solo.log` }) // new winston.transports.File({filename: constants.TMP_DIR + "/logs/error.log", level: 'error'}), // new winston.transports.Console({format: customFormat}) ] diff --git a/solo/test/data/fsnetman-test-1.config b/solo/test/data/solo-test-1.config similarity index 91% rename from solo/test/data/fsnetman-test-1.config rename to solo/test/data/solo-test-1.config index cb0ad235b..454d1a211 100644 --- a/solo/test/data/fsnetman-test-1.config +++ b/solo/test/data/solo-test-1.config @@ -1,7 +1,7 @@ { "flags": { "dev": false, - "namespace": "fst-user", + "namespace": "solo-user", "chart-dir": "", "cluster-name": "kind-kind", "prometheus-stack": false, diff --git a/solo/test/data/fsnetman-test-2.config b/solo/test/data/solo-test-2.config similarity index 91% rename from solo/test/data/fsnetman-test-2.config rename to solo/test/data/solo-test-2.config index cb0ad235b..454d1a211 100644 --- a/solo/test/data/fsnetman-test-2.config +++ b/solo/test/data/solo-test-2.config @@ -1,7 +1,7 @@ { "flags": { "dev": false, - "namespace": "fst-user", + "namespace": "solo-user", "chart-dir": "", "cluster-name": "kind-kind", "prometheus-stack": false, diff --git a/solo/test/e2e/commands/node.test.mjs b/solo/test/e2e/commands/node.test.mjs index 3115c45d4..d7c35bcc9 100644 --- a/solo/test/e2e/commands/node.test.mjs +++ b/solo/test/e2e/commands/node.test.mjs @@ -158,7 +158,7 @@ describe('NodeCommand', () => { testLogger.showUserError(e) } - await nodeCmd.run(`tail ${constants.FST_LOGS_DIR}/fst.log`) + await nodeCmd.run(`tail ${constants.SOLO_LOGS_DIR}/fst.log`) } }, 60000) diff --git a/solo/test/e2e/setup-e2e.sh b/solo/test/e2e/setup-e2e.sh index 4d26b3a1f..56ef765b9 100755 --- a/solo/test/e2e/setup-e2e.sh +++ b/solo/test/e2e/setup-e2e.sh @@ -1,9 +1,9 @@ #!/bin/bash -FST_CLUSTER_NAME=fst-local -FST_NAMESPACE=fst-local -kind delete cluster -n "${FST_CLUSTER_NAME}" || true -kind create cluster -n "${FST_CLUSTER_NAME}" || exit 1 -kubectl create ns "${FST_NAMESPACE}" || exit 1 -solo init -d ../charts --namespace "${FST_NAMESPACE}" || exit 1 # cache args for subsequent commands +SOLO_CLUSTER_NAME=solo-local +SOLO_NAMESPACE=solo-local +kind delete cluster -n "${SOLO_CLUSTER_NAME}" || true +kind create cluster -n "${SOLO_CLUSTER_NAME}" || exit 1 +kubectl create ns "${SOLO_NAMESPACE}" || exit 1 +solo init -d ../charts --namespace "${SOLO_NAMESPACE}" || exit 1 # cache args for subsequent commands solo cluster setup --cert-manager --cert-manager-crds --minio || exit 1 solo network deploy --no-enable-prometheus-svc-monitor --enable-hedera-explorer-tls || exit 1 diff --git a/solo/test/unit/core/config_manager.test.mjs b/solo/test/unit/core/config_manager.test.mjs index 48cb21c44..2c653cf63 100644 --- a/solo/test/unit/core/config_manager.test.mjs +++ b/solo/test/unit/core/config_manager.test.mjs @@ -47,8 +47,8 @@ describe('ConfigManager', () => { it('config file match, dev=false', () => { expect(cm.config.flags[flags.devMode.name]).toBeFalsy() }) - it('config file match, namespace=fst-user', () => { - expect(cm.config.flags[flags.namespace.name]).toBe('fst-user') + it('config file match, namespace=solo-user', () => { + expect(cm.config.flags[flags.namespace.name]).toBe('solo-user') }) it('config file match, chartDirectory is empty', () => { expect(cm.config.flags[flags.chartDirectory.name]).toBe('') @@ -95,7 +95,7 @@ describe('ConfigManager', () => { const newConfig = JSON.parse(configJSON.toString()) it('config file takes precedence over empty namespace', () => { - expect(newConfig.flags[flags.namespace.name]).toBe('fst-user') + expect(newConfig.flags[flags.namespace.name]).toBe('solo-user') }) it('config file takes precedence over empty cluster name', () => { expect(newConfig.flags[flags.clusterName.name]).toBe('kind-kind') From e3710378237fe4e04623e590194a42f84bc21371 Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 11:18:42 +1100 Subject: [PATCH 6/9] test: fix loading config in e2e test Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- solo/README.md | 2 +- solo/test/e2e/core/k8_e2e.test.mjs | 6 +++++- solo/test/e2e/core/platform_installer_e2e.test.mjs | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/solo/README.md b/solo/README.md index 5bce544f2..a937b5961 100644 --- a/solo/README.md +++ b/solo/README.md @@ -1,4 +1,4 @@ -# Solo +# Solo Solo is a CLI tool to manage and deploy a private Hedera Network. diff --git a/solo/test/e2e/core/k8_e2e.test.mjs b/solo/test/e2e/core/k8_e2e.test.mjs index baf87e394..ac212ae6f 100644 --- a/solo/test/e2e/core/k8_e2e.test.mjs +++ b/solo/test/e2e/core/k8_e2e.test.mjs @@ -1,4 +1,4 @@ -import { describe, expect, it } from '@jest/globals' +import { beforeAll, describe, expect, it } from '@jest/globals' import fs from 'fs' import net from 'net' import os from 'os' @@ -14,6 +14,10 @@ describe('K8', () => { const k8 = new K8(configManager, testLogger) const downloader = new PackageDownloader(testLogger) + beforeAll(async () => { + await configManager.load() + }) + it('should be able to list clusters', async () => { const clusters = await k8.getClusters() expect(clusters).not.toHaveLength(0) diff --git a/solo/test/e2e/core/platform_installer_e2e.test.mjs b/solo/test/e2e/core/platform_installer_e2e.test.mjs index 5138d32be..43a7dc7e3 100644 --- a/solo/test/e2e/core/platform_installer_e2e.test.mjs +++ b/solo/test/e2e/core/platform_installer_e2e.test.mjs @@ -23,10 +23,12 @@ describe('PackageInstallerE2E', () => { const packageTag = 'v0.42.5' let packageFile = '' - beforeAll(() => { + beforeAll(async () => { if (!fs.existsSync(testCacheDir)) { fs.mkdirSync(testCacheDir) } + + await configManager.load() }) describe('setupHapiDirectories', () => { From 541510d3582a093f6cb0ad525e058cec1bcc5ecf Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 11:19:50 +1100 Subject: [PATCH 7/9] fix: remove unused keys Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- solo/unused/private-alice.pfx | Bin 7732 -> 0 bytes solo/unused/private-bob.pfx | Bin 4936 -> 0 bytes solo/unused/private-node0.pfx | Bin 7732 -> 0 bytes solo/unused/public.pfx | Bin 2966 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 solo/unused/private-alice.pfx delete mode 100644 solo/unused/private-bob.pfx delete mode 100644 solo/unused/private-node0.pfx delete mode 100644 solo/unused/public.pfx diff --git a/solo/unused/private-alice.pfx b/solo/unused/private-alice.pfx deleted file mode 100644 index 62022a5078faa33e05d0ee5d501220740e658cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7732 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 PE@p{RrNrd_bLI9Ql>J<` diff --git a/solo/unused/private-bob.pfx b/solo/unused/private-bob.pfx deleted file mode 100644 index ac80503c5cf90472943c8f76257bce07a6954609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4936 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 diff --git a/solo/unused/private-node0.pfx b/solo/unused/private-node0.pfx deleted file mode 100644 index c49257a731f45466098a32bf9ba4ac55b270c1cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7732 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 PO3)8_Dwzxa{^a&=Exb@= diff --git a/solo/unused/public.pfx b/solo/unused/public.pfx deleted file mode 100644 index 19fdb968952362a02e252d4126f13d0269c0d022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2966 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 M7b9`8i2?#A5M^VX4FCWD From 29bacb369ee06b68bac1275a489fadf110097f24 Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 11:27:13 +1100 Subject: [PATCH 8/9] ci: rename fsnetman in workflow files Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- .github/workflows/flow-pull-request-checks.yaml | 6 +++--- .github/workflows/zxc-solo-tests.yaml | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/flow-pull-request-checks.yaml b/.github/workflows/flow-pull-request-checks.yaml index 6e190392b..d110e5846 100644 --- a/.github/workflows/flow-pull-request-checks.yaml +++ b/.github/workflows/flow-pull-request-checks.yaml @@ -1,5 +1,5 @@ ## -# Copyright (C) 2023 Hedera Hashgraph, LLC +# Copyright (C) 2023-2024 Hedera Hashgraph, LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -65,9 +65,9 @@ jobs: with: custom-job-label: Standard - fsnetman-tests: + solo-tests: name: FS Network Manager Tests - uses: ./.github/workflows/zxc-fsnetman-tests.yaml + uses: ./.github/workflows/zxc-solo-tests.yaml with: custom-job-label: Standard diff --git a/.github/workflows/zxc-solo-tests.yaml b/.github/workflows/zxc-solo-tests.yaml index 3570dbe63..dc448f4a3 100644 --- a/.github/workflows/zxc-solo-tests.yaml +++ b/.github/workflows/zxc-solo-tests.yaml @@ -26,7 +26,7 @@ on: description: "Custom Job Label:" type: string required: false - default: "fsnetman Test" + default: "solo Test" node-version: description: "NodeJS Version:" type: string @@ -47,7 +47,7 @@ permissions: jobs: test: - name: ${{ inputs.custom-job-label || 'fsnetman Test' }} + name: ${{ inputs.custom-job-label || 'solo Test' }} runs-on: [ self-hosted, Linux, medium, ephemeral ] steps: - name: Get related changed files @@ -68,9 +68,9 @@ jobs: echo "" if [ "${{ steps.changed-files.outputs.any_changed }}" == "true" ]; then echo "run-tests=true" >> "${GITHUB_OUTPUT}" - echo "Executing fsnetman tests...." + echo "Scheduled solo tests...." else - echo ">> No relevant files are changed. No need to run fsnetman tests" + echo ">> No relevant files are changed. No need to run solo tests" fi - name: Checkout Code @@ -148,4 +148,4 @@ jobs: working-directory: solo if: ${{ steps.check-changed-files.outputs.run-tests && !cancelled() }} run: | - cat ~/.fsnetman/logs/fst.log + cat ~/.solo/logs/solo.log From ae7ac4754b10fc729718fdce74036d5f8c99f619 Mon Sep 17 00:00:00 2001 From: Lenin Mehedy <lenin.mehedy@swirldslabs.com> Date: Wed, 31 Jan 2024 11:39:56 +1100 Subject: [PATCH 9/9] fix: rename fst with solo Signed-off-by: Lenin Mehedy <lenin.mehedy@swirldslabs.com> --- solo/src/core/logging.mjs | 4 ++-- solo/test/e2e/commands/node.test.mjs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/solo/src/core/logging.mjs b/solo/src/core/logging.mjs index 3a36b92a3..e2cc76da7 100644 --- a/solo/src/core/logging.mjs +++ b/solo/src/core/logging.mjs @@ -5,7 +5,7 @@ import * as util from 'util' import chalk from 'chalk' const customFormat = winston.format.combine( - winston.format.label({ label: 'FST', message: false }), + winston.format.label({ label: 'SOLO', message: false }), winston.format.splat(), @@ -58,7 +58,7 @@ export const Logger = class { transports: [ // // - Write all logs with importance level of `error` or less to `error.log` - // - Write all logs with importance level of `info` or less to `fst.log` + // - Write all logs with importance level of `info` or less to `solo.log` // new winston.transports.File({ filename: `${constants.SOLO_LOGS_DIR}/solo.log` }) // new winston.transports.File({filename: constants.TMP_DIR + "/logs/error.log", level: 'error'}), diff --git a/solo/test/e2e/commands/node.test.mjs b/solo/test/e2e/commands/node.test.mjs index d7c35bcc9..f44e675ff 100644 --- a/solo/test/e2e/commands/node.test.mjs +++ b/solo/test/e2e/commands/node.test.mjs @@ -158,7 +158,7 @@ describe('NodeCommand', () => { testLogger.showUserError(e) } - await nodeCmd.run(`tail ${constants.SOLO_LOGS_DIR}/fst.log`) + await nodeCmd.run(`tail ${constants.SOLO_LOGS_DIR}/solo.log`) } }, 60000)