@hashgraph/solo
Version:
An opinionated CLI tool to deploy and manage private Hedera Networks.
155 lines (136 loc) • 6.78 kB
text/typescript
/**
* SPDX-License-Identifier: Apache-2.0
*/
import {container, Lifecycle} from 'tsyringe-neo';
import {SoloLogger} from '../logging.js';
import {PackageDownloader} from '../package_downloader.js';
import {Zippy} from '../zippy.js';
import {DependencyManager, HelmDependencyManager} from '../dependency_managers/index.js';
import * as constants from '../constants.js';
import {Helm} from '../helm.js';
import {ChartManager} from '../chart_manager.js';
import {ConfigManager} from '../config_manager.js';
import {AccountManager} from '../account_manager.js';
import {PlatformInstaller} from '../platform_installer.js';
import {KeyManager} from '../key_manager.js';
import {ProfileManager} from '../profile_manager.js';
import {IntervalLeaseRenewalService} from '../lease/interval_lease_renewal.js';
import {LeaseManager} from '../lease/lease_manager.js';
import {CertificateManager} from '../certificate_manager.js';
import path, {normalize} from 'path';
import {LocalConfig} from '../config/local_config.js';
import {RemoteConfigManager} from '../config/remote/remote_config_manager.js';
import os from 'os';
import * as version from '../../../version.js';
import {NetworkNodes} from '../network_nodes.js';
import {ClusterChecks} from '../cluster_checks.js';
import {InjectTokens} from './inject_tokens.js';
import {K8ClientFactory} from '../kube/k8_client/k8_client_factory.js';
/**
* Container class to manage the dependency injection container
*/
export class Container {
private static instance: Container = null;
private static isInitialized = false;
private constructor() {}
/**
* Get the singleton instance of the container
*/
static getInstance() {
if (!Container.instance) {
Container.instance = new Container();
}
return Container.instance;
}
/**
* Initialize the container with the default dependencies
* @param cacheDir - the cache directory to use, defaults to constants.SOLO_CACHE_DIR
* @param logLevel - the log level to use, defaults to 'debug'
* @param devMode - if true, show full stack traces in error messages
*/
init(cacheDir: string = constants.SOLO_CACHE_DIR, logLevel: string = 'debug', devMode: boolean = false) {
// SoloLogger
container.register(InjectTokens.LogLevel, {useValue: logLevel});
container.register(InjectTokens.DevMode, {useValue: devMode});
container.register(InjectTokens.SoloLogger, {useClass: SoloLogger}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.PackageDownloader, {useClass: PackageDownloader}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.Zippy, {useClass: Zippy}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.DependencyManager, {useClass: DependencyManager}, {lifecycle: Lifecycle.Singleton});
// Helm & HelmDependencyManager
container.register(InjectTokens.OsPlatform, {useValue: os.platform()});
container.register(InjectTokens.Helm, {useClass: Helm}, {lifecycle: Lifecycle.Singleton});
// HelmDependencyManager
container.register(InjectTokens.HelmInstallationDir, {useValue: path.join(constants.SOLO_HOME_DIR, 'bin')});
container.register(InjectTokens.OsArch, {useValue: os.arch()});
container.register(InjectTokens.HelmVersion, {useValue: version.HELM_VERSION});
container.register(
InjectTokens.HelmDependencyManager,
{useClass: HelmDependencyManager},
{lifecycle: Lifecycle.Singleton},
);
container.register(InjectTokens.ChartManager, {useClass: ChartManager}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.ConfigManager, {useClass: ConfigManager}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.K8Factory, {useClass: K8ClientFactory}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.AccountManager, {useClass: AccountManager}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.PlatformInstaller, {useClass: PlatformInstaller}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.KeyManager, {useClass: KeyManager}, {lifecycle: Lifecycle.Singleton});
// ProfileManager
container.register(InjectTokens.CacheDir, {useValue: cacheDir});
container.register(InjectTokens.ProfileManager, {useClass: ProfileManager}, {lifecycle: Lifecycle.Singleton});
// LeaseRenewalService
container.register(
InjectTokens.LeaseRenewalService,
{useClass: IntervalLeaseRenewalService},
{lifecycle: Lifecycle.Singleton},
);
container.register(InjectTokens.LeaseManager, {useClass: LeaseManager}, {lifecycle: Lifecycle.Singleton});
container.register(
InjectTokens.CertificateManager,
{useClass: CertificateManager},
{lifecycle: Lifecycle.Singleton},
);
// LocalConfig
const localConfigPath = normalize(path.join(cacheDir, constants.DEFAULT_LOCAL_CONFIG_FILE));
container.register(InjectTokens.LocalConfigFilePath, {useValue: localConfigPath});
container.register(InjectTokens.LocalConfig, {useClass: LocalConfig}, {lifecycle: Lifecycle.Singleton});
container.register(
InjectTokens.RemoteConfigManager,
{useClass: RemoteConfigManager},
{lifecycle: Lifecycle.Singleton},
);
container.register(InjectTokens.ClusterChecks, {useClass: ClusterChecks}, {lifecycle: Lifecycle.Singleton});
container.register(InjectTokens.NetworkNodes, {useClass: NetworkNodes}, {lifecycle: Lifecycle.Singleton});
Container.isInitialized = true;
}
/**
* clears the container registries and re-initializes the container
* @param cacheDir - the cache directory to use, defaults to constants.SOLO_CACHE_DIR
* @param logLevel - the log level to use, defaults to 'debug'
* @param devMode - if true, show full stack traces in error messages
*/
reset(cacheDir?: string, logLevel?: string, devMode?: boolean) {
if (Container.instance && Container.isInitialized) {
container.reset();
}
Container.getInstance().init(cacheDir, logLevel, devMode);
}
/**
* clears the container instances, useful for testing when you are using container.registerInstance()
* @param cacheDir - the cache directory to use, defaults to constants.SOLO_CACHE_DIR
* @param logLevel - the log level to use, defaults to 'debug'
* @param devMode - if true, show full stack traces in error messages
*/
clearInstances(cacheDir?: string, logLevel?: string, devMode?: boolean) {
if (Container.instance && Container.isInitialized) {
container.clearInstances();
} else {
Container.getInstance().init(cacheDir, logLevel, devMode);
}
}
/**
* only call dispose when you are about to system exit
*/
async dispose() {
await container.dispose();
}
}