Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions packages/dashmate/docker-compose.platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ services:
drive_abci:
image: ${PLATFORM_DRIVE_ABCI_DOCKER_IMAGE:?err}
restart: unless-stopped
depends_on:
- core
volumes:
- drive_abci_data:/platform/packages/js-drive/db
- ${PLATFORM_DRIVE_ABCI_LOG_PRETTY_DIRECTORY_PATH:?err}:/var/log/pretty
Expand Down Expand Up @@ -58,7 +56,6 @@ services:
restart: unless-stopped
depends_on:
- drive_tenderdash
- core
environment:
- API_JSON_RPC_PORT=3004
- API_GRPC_PORT=3005
Expand All @@ -81,8 +78,6 @@ services:
dapi_tx_filter_stream:
image: ${PLATFORM_DAPI_API_DOCKER_IMAGE:?err}
restart: unless-stopped
depends_on:
- core
environment:
- TX_FILTER_STREAM_GRPC_PORT=3006
- DASHCORE_RPC_HOST=core
Expand Down
67 changes: 20 additions & 47 deletions packages/dashmate/src/commands/group/reset.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const { Flags } = require('@oclif/core');

const GroupBaseCommand = require('../../oclif/command/GroupBaseCommand');
const MuteOneLineError = require('../../oclif/errors/MuteOneLineError');
const { PRESET_LOCAL } = require('../../constants');

class GroupResetCommand extends GroupBaseCommand {
/**
Expand All @@ -16,7 +17,6 @@ class GroupResetCommand extends GroupBaseCommand {
* @param {configureTenderdashTask} configureTenderdashTask
* @param {generateToAddressTask} generateToAddressTask
* @param {ConfigFile} configFile
* @param {Object[]} systemConfigs
* @return {Promise<void>}
*/
async runWithDependencies(
Expand All @@ -25,7 +25,7 @@ class GroupResetCommand extends GroupBaseCommand {
verbose: isVerbose,
hard: isHardReset,
force: isForce,
'platform-only': isPlatformOnlyReset,
platform: isPlatformOnlyReset,
},
isSystemConfig,
resetNodeTask,
Expand All @@ -34,68 +34,41 @@ class GroupResetCommand extends GroupBaseCommand {
configureTenderdashTask,
generateToAddressTask,
configFile,
systemConfigs,
) {
const groupName = configGroup[0].get('group');

if (isHardReset && !isSystemConfig(groupName)) {
throw new Error(`Cannot hard reset non-system config group "${configGroup[0].get('group')}"`);
}

const baseConfig = systemConfigs.base;

const amount = 100;

const tasks = new Listr(
[
{
title: `Reset ${groupName} nodes`,
task: () => new Listr(configGroup.map((config) => ({
title: `Reset ${config.getName()} node`,
task: (ctx) => {
ctx.skipPlatformInitialization = true;

config.set('platform.dpns', baseConfig.platform.dpns);
config.set('platform.dashpay', baseConfig.platform.dashpay);
config.set('platform.featureFlags', baseConfig.platform.featureFlags);
config.set('platform.masternodeRewardShares', baseConfig.platform.masternodeRewardShares);

// TODO: Should stay the same
config.set('platform.drive.tenderdash.node.id', baseConfig.platform.drive.tenderdash.node.id);
config.set('platform.drive.tenderdash.node.key', baseConfig.platform.drive.tenderdash.node.key);
config.set('platform.drive.tenderdash.genesis', baseConfig.platform.drive.tenderdash.genesis);

if (!ctx.isPlatformOnlyReset) {
config.set('core.masternode.operator.privateKey', baseConfig.core.masternode.operator.privateKey);
}
task: () => {
const resetTasks = configGroup.map((config) => ({
title: `Reset ${config.getName()} node`,
task: () => resetNodeTask(config),
}));

return resetNodeTask(config);
},
}))),
return new Listr(resetTasks);
},
},
{
enabled: (ctx) => ctx.isHardReset,
enabled: (ctx) => ctx.isHardReset && groupName === PRESET_LOCAL,
title: 'Delete node configs',
task: () => (
configGroup.forEach((config) => configFile.removeConfig(config.getName()))
configGroup
.filter((config) => configFile.isConfigExists(config.getName()))
.forEach((config) => configFile.removeConfig(config.getName()))
),
},
{
enabled: (ctx) => !ctx.isHardReset,
title: 'Configure Tenderdash nodes',
task: () => configureTenderdashTask(configGroup),
},
{
enabled: (ctx) => !ctx.isHardReset && !ctx.isPlatformOnlyReset,
enabled: (ctx) => !ctx.isHardReset
&& !ctx.isPlatformOnlyReset && groupName === PRESET_LOCAL,
title: 'Configure Core nodes',
task: () => configureCoreTask(configGroup),
},
{
// in case we don't need to register masternodes
title: `Generate ${amount} dash to local wallet`,
enabled: (ctx) => !ctx.isHardReset,
skip: (ctx) => !!ctx.fundingPrivateKeyString,
task: () => generateToAddressTask(configGroup[0], amount),
enabled: (ctx) => !ctx.isHardReset && groupName === PRESET_LOCAL,
title: 'Configure Tenderdash nodes',
task: () => configureTenderdashTask(configGroup),
},
],
{
Expand Down Expand Up @@ -135,9 +108,9 @@ GroupResetCommand.flags = {
description: 'reset even running node',
default: false,
}),
'platform-only': Flags.boolean({
platform: Flags.boolean({
char: 'p',
description: 'reset platform data only',
description: 'reset platform services and data only',
default: false,
}),
};
Expand Down
12 changes: 2 additions & 10 deletions packages/dashmate/src/commands/reset.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,12 @@ class ResetCommand extends ConfigBaseCommand {
verbose: isVerbose,
hard: isHardReset,
force: isForce,
'platform-only': isPlatformOnlyReset,
platform: isPlatformOnlyReset,
},
isSystemConfig,
config,
resetNodeTask,
) {
if (isHardReset && !isSystemConfig(config.getName())) {
throw new Error(`Cannot hard reset non-system config "${config.getName()}"`);
}

if (!config.get('platform.enable') && isPlatformOnlyReset) {
throw new Error('Cannot reset platform only if platform services are not enabled in config');
}

const tasks = new Listr([
{
title: `Reset ${config.getName()} node`,
Expand Down Expand Up @@ -71,7 +63,7 @@ ResetCommand.flags = {
...ConfigBaseCommand.flags,
hard: Flags.boolean({ char: 'h', description: 'reset config as well as data', default: false }),
force: Flags.boolean({ char: 'f', description: 'skip running services check', default: false }),
'platform-only': Flags.boolean({ char: 'p', description: 'reset platform data only', default: false }),
platform: Flags.boolean({ char: 'p', description: 'reset platform services and data only', default: false }),
verbose: Flags.boolean({ char: 'v', description: 'use verbose mode for output', default: false }),
};

Expand Down
16 changes: 11 additions & 5 deletions packages/dashmate/src/config/Config.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,20 @@ class Config {
}

/**
*
* @param {Object} [options={}]
* @param {boolean} [options.platformOnly=false]
* @return {{CONFIG_NAME: string, COMPOSE_PROJECT_NAME: string}}
*/
toEnvs() {
const dockerComposeFiles = ['docker-compose.yml'];
toEnvs(options = {}) {
const dockerComposeFiles = [];

if (!options.platformOnly) {
// TODO: it should contain only the dashmate helper that must be ran always
dockerComposeFiles.push('docker-compose.yml');

if (this.get('core.masternode.enable') === true) {
dockerComposeFiles.push('docker-compose.sentinel.yml');
if (this.get('core.masternode.enable') === true) {
dockerComposeFiles.push('docker-compose.sentinel.yml');
}
}

if (this.get('platform.enable')) {
Expand Down
4 changes: 2 additions & 2 deletions packages/dashmate/src/docker/DockerCompose.js
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ class DockerCompose {
* @param {Object} envs
* @param {string} [filterServiceNames]
* @param {boolean} returnServiceNames
* @return {string[]}
* @return {Promise<string[]>}
*/
async getContainersList(
envs,
Expand Down Expand Up @@ -324,7 +324,7 @@ class DockerCompose {
try {
await dockerCompose.rm({
...this.getOptions(envs),
commandOptions: ['--stop', '-v'],
commandOptions: ['--stop'],
}, ...serviceNames);
} catch (e) {
throw new DockerComposeError(e);
Expand Down
55 changes: 39 additions & 16 deletions packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const { Listr } = require('listr2');
* @param {startNodeTask} startNodeTask
* @param {generateToAddressTask} generateToAddressTask
* @param {systemConfigs} systemConfigs
* @param {ConfigFile} configFile
* @return {resetNodeTask}
*/
function resetNodeTaskFactory(
Expand All @@ -14,13 +15,21 @@ function resetNodeTaskFactory(
startNodeTask,
generateToAddressTask,
systemConfigs,
configFile,
) {
/**
* @typedef {resetNodeTask}
* @param {Config} config
*/
function resetNodeTask(config) {
return new Listr([
{
task: (ctx) => {
if (!config.get('platform.enable') && ctx.isPlatformOnlyReset) {
throw new Error('Cannot reset platform only if platform services are not enabled in config');
}
},
},
{
title: 'Check services are not running',
skip: (ctx) => ctx.isForce,
Expand All @@ -37,43 +46,57 @@ function resetNodeTaskFactory(
},
{
title: 'Remove platform services and associated data',
enabled: (ctx) => ctx.isPlatformOnlyReset && config.get('platform.enable'),
enabled: (ctx) => ctx.isPlatformOnlyReset,
task: async () => {
// Remove containers
const coreContainerNames = ['core', 'sentinel'];
const containerNames = await dockerCompose
.getContainersList(config.toEnvs(), undefined, true);
const platformContainerNames = containerNames
.filter((containerName) => !coreContainerNames.includes(containerName));
const serviceNames = await dockerCompose
.getContainersList(
config.toEnvs({ platformOnly: true }),
undefined,
true,
);

await dockerCompose.rm(config.toEnvs(), platformContainerNames);
await dockerCompose.rm(config.toEnvs(), serviceNames);

// Remove volumes
const coreVolumeNames = ['core_data'];
const { COMPOSE_PROJECT_NAME: composeProjectName } = config.toEnvs();

const projectVolumeNames = await dockerCompose.getVolumeNames(config.toEnvs());
const projectVolumeNames = await dockerCompose.getVolumeNames(
config.toEnvs({ platformOnly: true }),
);

await Promise.all(
projectVolumeNames
.filter((volumeName) => !coreVolumeNames.includes(volumeName))
.map((volumeName) => `${composeProjectName}_${volumeName}`)
.map(async (volumeName) => docker.getVolume(volumeName).remove()),
);
},
},
{
title: 'Reset dashmate\'s ephemeral data',
task: (ctx) => {
if (!ctx.isPlatformOnlyReset) {
config.set('core.miner.mediantime', null);
}
},
},
{
title: `Reset config ${config.getName()}`,
enabled: (ctx) => ctx.isHardReset,
task: (ctx) => {
const name = config.get('group') || config.getName();
const baseConfigName = config.get('group') || config.getName();

if (ctx.isPlatformOnlyReset) {
// TODO: This won't work for user created configs
const { platform: systemPlatformConfig } = systemConfigs[name];
config.set('platform', systemPlatformConfig);
if (systemConfigs[baseConfigName]) {
// Reset config if has a base config
if (ctx.isPlatformOnlyReset) {
const { platform: systemPlatformConfig } = systemConfigs[baseConfigName];
config.set('platform', systemPlatformConfig);
} else {
config.setOptions(systemConfigs[baseConfigName]);
}
} else {
config.setOptions(systemConfigs[name]);
// Delete config if no base config
configFile.removeConfig(config.getName());
}
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,13 +162,6 @@ function configureCoreTaskFactory(

const subTasks = masternodeConfigs.map((config, index) => ({
title: `Register ${config.getName()} masternode`,
skip: () => {
if (config.get('core.masternode.operator.privateKey')) {
return `Masternode operator private key ('core.masternode.operator.privateKey') is already set in ${config.getName()} config`;
}

return false;
},
task: () => new Listr([
{
title: 'Generate a masternode operator key',
Expand Down