@hashgraph/solo
Version:
An opinionated CLI tool to deploy and manage private Hedera Networks.
113 lines (104 loc) • 5.4 kB
text/typescript
// SPDX-License-Identifier: Apache-2.0
import {inject, injectable} from 'tsyringe-neo';
import {InjectTokens} from '../../core/dependency-injection/inject-tokens.js';
import {patchInject} from '../../core/dependency-injection/container-helper.js';
import BlockNodeCommand from '../block-node.js';
import {BaseCommandDefinition} from './base-command-definition.js';
import {CommandBuilder, CommandGroup, Subcommand} from '../../core/command-path-builders/command-builder.js';
import {type CommandDefinition} from '../../types/index.js';
import {type SoloLogger} from '../../core/logging/solo-logger.js';
import * as constants from '../../core/constants.js';
()
export class BlockCommandDefinition extends BaseCommandDefinition {
public constructor(
(InjectTokens.SoloLogger) private readonly logger?: SoloLogger,
(InjectTokens.BlockNodeCommand) public readonly blockNodeCommand?: BlockNodeCommand,
) {
super();
this.blockNodeCommand = patchInject(blockNodeCommand, InjectTokens.BlockNodeCommand, this.constructor.name);
this.logger = patchInject(logger, InjectTokens.SoloLogger, this.constructor.name);
}
public static override readonly COMMAND_NAME: string = 'block';
protected static override readonly DESCRIPTION: string =
'Block Node operations for creating, modifying, and destroying resources. ' +
'These commands require the presence of an existing deployment.';
public static readonly NODE_SUBCOMMAND_NAME: string = 'node';
private static readonly NODE_SUBCOMMAND_DESCRIPTION: string =
'Create, manage, or destroy block node instances. Operates on a single block node instance at a time.';
public static readonly NODE_ADD: string = 'add';
public static readonly NODE_DESTROY: string = 'destroy';
public static readonly NODE_UPGRADE: string = 'upgrade';
public static readonly NODE_ADD_EXTERNAL: string = 'add-external';
public static readonly NODE_DELETE_EXTERNAL: string = 'delete-external';
public static readonly ADD_COMMAND: string =
`${BlockCommandDefinition.COMMAND_NAME} ${BlockCommandDefinition.NODE_SUBCOMMAND_NAME} ${BlockCommandDefinition.NODE_ADD}` as const;
public static readonly DESTROY_COMMAND: string =
`${BlockCommandDefinition.COMMAND_NAME} ${BlockCommandDefinition.NODE_SUBCOMMAND_NAME} ${BlockCommandDefinition.NODE_DESTROY}` as const;
public static readonly UPGRADE_COMMAND: string =
`${BlockCommandDefinition.COMMAND_NAME} ${BlockCommandDefinition.NODE_SUBCOMMAND_NAME} ${BlockCommandDefinition.NODE_UPGRADE}` as const;
public getCommandDefinition(): CommandDefinition {
return new CommandBuilder(BlockCommandDefinition.COMMAND_NAME, BlockCommandDefinition.DESCRIPTION, this.logger)
.addCommandGroup(
new CommandGroup(
BlockCommandDefinition.NODE_SUBCOMMAND_NAME,
BlockCommandDefinition.NODE_SUBCOMMAND_DESCRIPTION,
)
.addSubcommand(
new Subcommand(
BlockCommandDefinition.NODE_ADD,
'Creates and configures a new block node instance for the specified ' +
'deployment using the specified Kubernetes cluster. ' +
'The cluster must be accessible and attached to the specified deployment.',
this.blockNodeCommand,
this.blockNodeCommand.add,
BlockNodeCommand.ADD_FLAGS_LIST,
[...constants.BASE_DEPENDENCIES],
),
)
.addSubcommand(
new Subcommand(
BlockCommandDefinition.NODE_DESTROY,
'Destroys a single block node instance in the specified deployment. ' +
'Requires access to all Kubernetes clusters attached to the deployment.',
this.blockNodeCommand,
this.blockNodeCommand.destroy,
BlockNodeCommand.DESTROY_FLAGS_LIST,
[...constants.BASE_DEPENDENCIES],
),
)
.addSubcommand(
new Subcommand(
BlockCommandDefinition.NODE_UPGRADE,
'Upgrades a single block node instance in the specified deployment. ' +
'Requires access to all Kubernetes clusters attached to the deployment.',
this.blockNodeCommand,
this.blockNodeCommand.upgrade,
BlockNodeCommand.UPGRADE_FLAGS_LIST,
[...constants.BASE_DEPENDENCIES],
),
)
.addSubcommand(
new Subcommand(
BlockCommandDefinition.NODE_ADD_EXTERNAL,
'Add an external block node for the specified deployment. ' +
'You can specify the priority and consensus nodes to which to connect or use the default settings.',
this.blockNodeCommand,
this.blockNodeCommand.addExternal,
BlockNodeCommand.ADD_EXTERNAL_FLAGS_LIST,
[...constants.BASE_DEPENDENCIES],
),
)
.addSubcommand(
new Subcommand(
BlockCommandDefinition.NODE_DELETE_EXTERNAL,
'Deletes an external block node from the specified deployment.',
this.blockNodeCommand,
this.blockNodeCommand.deleteExternal,
BlockNodeCommand.DELETE_EXTERNAL_FLAGS_LIST,
[...constants.BASE_DEPENDENCIES],
),
),
)
.build();
}
}