Skip to content

feat: Add adminKey flag to node setup command #1193

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
13 changes: 13 additions & 0 deletions src/commands/flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1351,6 +1351,17 @@ export class Flags {
prompt: undefined,
};

static readonly adminPublicKeys: CommandFlag = {
constName: 'adminPublicKeys',
name: 'admin-public-keys',
definition: {
describe: 'Comma separated list of DER encoded ED25519 public keys',
defaultValue: constants.GENESIS_KEY,
type: 'string',
},
prompt: undefined,
};

static readonly quiet: CommandFlag = {
constName: 'quiet',
name: 'quiet-mode',
Expand Down Expand Up @@ -1733,6 +1744,8 @@ export class Flags {

static readonly allFlags: CommandFlag[] = [
Flags.accountId,
Flags.adminKey,
Flags.adminPublicKeys,
Flags.amount,
Flags.apiPermissionProperties,
Flags.app,
Expand Down
1 change: 1 addition & 0 deletions src/commands/node/configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ export interface NodeDeleteConfigClass {
export interface NodeSetupConfigClass {
app: string;
appConfig: string;
adminKey: string;
cacheDir: string;
devMode: boolean;
localBuildPath: string;
Expand Down
2 changes: 1 addition & 1 deletion src/commands/node/flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -254,5 +254,5 @@ export const START_FLAGS = {
export const SETUP_FLAGS = {
requiredFlags: [flags.cacheDir, flags.namespace, flags.releaseTag],
requiredFlagsWithDisabledPrompt: [flags.app, flags.appConfig, flags.nodeAliasesUnparsed],
optionalFlags: [flags.quiet, flags.devMode, flags.localBuildPath],
optionalFlags: [flags.quiet, flags.devMode, flags.localBuildPath, flags.adminPublicKeys],
};
2 changes: 2 additions & 0 deletions src/commands/node/tasks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -964,11 +964,13 @@
) {
const networkNodeServiceMap = await this.accountManager.getNodeServiceMap(namespace);

const adminPublicKeys = splitFlagInput(this.configManager.getFlag(flags.adminPublicKeys));

Check warning on line 967 in src/commands/node/tasks.ts

View check run for this annotation

Codecov / codecov/patch

src/commands/node/tasks.ts#L967

Added line #L967 was not covered by tests
const genesisNetworkData = await GenesisNetworkDataConstructor.initialize(
nodeAliases,
this.keyManager,
keysDir,
networkNodeServiceMap,
adminPublicKeys,

Check warning on line 973 in src/commands/node/tasks.ts

View check run for this annotation

Codecov / codecov/patch

src/commands/node/tasks.ts#L973

Added line #L973 was not covered by tests
);

const genesisNetworkJson = path.join(stagingDir, 'genesis-network.json');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*
*/
import {AccountId, PrivateKey} from '@hashgraph/sdk';
import {AccountId, PrivateKey, PublicKey} from '@hashgraph/sdk';
import {GenesisNetworkNodeDataWrapper} from './genesis_network_node_data_wrapper.js';
import * as constants from '../constants.js';

Expand All @@ -25,6 +25,8 @@
import {Templates} from '../templates.js';
import path from 'path';
import type {NetworkNodeServices} from '../network_node_services.js';
import {SoloError} from '../errors.js';
import {Flags as flags} from '../../commands/flags.js';

/**
* Used to construct the nodes data and convert them to JSON
Expand All @@ -38,10 +40,13 @@
private readonly keyManager: KeyManager,
private readonly keysDir: string,
private readonly networkNodeServiceMap: Map<string, NetworkNodeServices>,
adminPublicKeyMap: Map<NodeAlias, string>,

Check warning on line 43 in src/core/genesis_network_models/genesis_network_data_constructor.ts

View check run for this annotation

Codecov / codecov/patch

src/core/genesis_network_models/genesis_network_data_constructor.ts#L43

Added line #L43 was not covered by tests
) {
nodeAliases.forEach(nodeAlias => {
const adminPrivateKey = PrivateKey.fromStringED25519(constants.GENESIS_KEY);
const adminPubKey = adminPrivateKey.publicKey;
const genesisPrivateKey = PrivateKey.fromStringED25519(constants.GENESIS_KEY);
const adminPubKey = PublicKey.fromStringED25519(adminPublicKeyMap[nodeAlias])
? adminPublicKeyMap[nodeAlias]
: genesisPrivateKey.publicKey;

Check warning on line 49 in src/core/genesis_network_models/genesis_network_data_constructor.ts

View check run for this annotation

Codecov / codecov/patch

src/core/genesis_network_models/genesis_network_data_constructor.ts#L46-L49

Added lines #L46 - L49 were not covered by tests

const nodeDataWrapper = new GenesisNetworkNodeDataWrapper(
+networkNodeServiceMap.get(nodeAlias).nodeId,
Expand Down Expand Up @@ -74,8 +79,30 @@
keyManager: KeyManager,
keysDir: string,
networkNodeServiceMap: Map<string, NetworkNodeServices>,
adminPublicKeys: string[],

Check warning on line 82 in src/core/genesis_network_models/genesis_network_data_constructor.ts

View check run for this annotation

Codecov / codecov/patch

src/core/genesis_network_models/genesis_network_data_constructor.ts#L82

Added line #L82 was not covered by tests
): Promise<GenesisNetworkDataConstructor> {
const instance = new GenesisNetworkDataConstructor(nodeAliases, keyManager, keysDir, networkNodeServiceMap);
const adminPublicKeyMap: Map<NodeAlias, string> = new Map();

const adminPublicKeyIsDefaultValue =
adminPublicKeys.length === 1 && adminPublicKeys[0] === flags.adminPublicKeys.definition.defaultValue;
// If admin keys are passed and if it is not the default value from flags then validate and build the adminPublicKeyMap
if (adminPublicKeys.length > 0 && !adminPublicKeyIsDefaultValue) {
if (adminPublicKeys.length !== nodeAliases.length) {
throw new SoloError('Provide a comma separated list of DER encoded ED25519 public keys for each node');
}

adminPublicKeys.forEach((key, i) => {
adminPublicKeyMap[nodeAliases[i]] = key;
});
}

const instance = new GenesisNetworkDataConstructor(
nodeAliases,
keyManager,
keysDir,
networkNodeServiceMap,
adminPublicKeyMap,
);

Check warning on line 105 in src/core/genesis_network_models/genesis_network_data_constructor.ts

View check run for this annotation

Codecov / codecov/patch

src/core/genesis_network_models/genesis_network_data_constructor.ts#L84-L105

Added lines #L84 - L105 were not covered by tests

await instance.load();

Expand Down
1 change: 1 addition & 0 deletions test/test_util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,7 @@ export function e2eTestSuite(
expect(nodeCmd.getUnusedConfigs(NodeCommandConfigs.SETUP_CONFIGS_NAME)).to.deep.equal([
flags.quiet.constName,
flags.devMode.constName,
flags.adminPublicKeys.constName,
]);
} catch (e) {
nodeCmd.logger.showUserError(e);
Expand Down
Loading