@kadena/kadena-cli
Version:
Kadena CLI tool to interact with the Kadena blockchain (manage keys, transactions, etc.)
107 lines • 4.11 kB
JavaScript
import { execSync } from 'child_process';
import { log } from '../../../utils/logger.js';
const volumePrefix = 'kadena_';
const containerDataFolder = '/data';
const containerPactFolder = '/pact-cli';
const containerPactFolderPermissions = 'ro';
const chainwebNodeApiPort = '8080';
const devnetImageName = 'kadena/devnet';
export const guardDockerInstalled = () => {
try {
execSync('docker -v', { stdio: 'pipe' });
}
catch (error) {
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
if (error.stderr.includes('command not found')) {
throw new Error('Please install Docker.');
}
}
};
export const guardDockerRunning = () => {
try {
execSync('docker ps', { stdio: 'pipe' });
}
catch (error) {
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
if (error.stderr.includes('Cannot connect to the Docker daemon')) {
throw new Error('Please make sure the Docker daemon is running.');
}
}
};
export const guardDocker = () => {
guardDockerInstalled();
guardDockerRunning();
};
export const dockerVolumeName = (containerName) => `${volumePrefix}${containerName}`;
const maybeCreateVolume = (useVolume, containerName) => {
if (!useVolume) {
log.info(log.color.green('Not creating persistent volume as per configuration.'));
return;
}
const volumeName = dockerVolumeName(containerName);
const existingVolumes = execSync('docker volume ls --format "{{.Name}}"')
.toString()
.trim()
.split('\n');
if (existingVolumes.includes(volumeName)) {
log.info(log.color.green(`Using existing volume: ${volumeName}`));
return;
}
log.info(log.color.green(`Creating volume: ${volumeName}`));
execSync(`docker volume create ${volumeName}`);
log.info(log.color.green(`Successfully created volume: ${volumeName}`));
};
const formatDockerRunOptions = (configuration) => {
const options = ['-d'];
if (configuration.port) {
options.push('-p');
options.push(`${configuration.port.toString()}:${chainwebNodeApiPort}`);
}
if (configuration.useVolume) {
options.push('-v');
options.push(`${dockerVolumeName(configuration.name)}:${containerDataFolder}`);
}
if (configuration.mountPactFolder) {
options.push('-v');
options.push(`${configuration.mountPactFolder}:${containerPactFolder}:${containerPactFolderPermissions}`);
}
options.push('--name');
options.push(configuration.name);
const version = configuration.version ? `:${configuration.version}` : '';
options.push(`${devnetImageName}${version}`);
return options.join(' ');
};
const containerExists = (name) => {
const existingContainers = execSync('docker ps -a --format "{{.Names}}"')
.toString()
.trim()
.split('\n');
return existingContainers.includes(name);
};
export function runDevnet(configuration) {
maybeCreateVolume(!!configuration.useVolume, configuration.name);
const dockerRunOptions = formatDockerRunOptions(configuration);
if (containerExists(configuration.name)) {
execSync(`docker start ${configuration.name}`);
log.info(log.color.green(`Started existing container: ${configuration.name}`));
return;
}
execSync(`docker run ${dockerRunOptions}`);
log.info(log.color.green(`New devnet container "${configuration.name}" is running`));
}
export function stopDevnet(containerName) {
execSync(`docker stop ${containerName}`);
log.info(log.color.green(`Stopped devnet container: ${containerName}`));
}
export function removeDevnet(containerName) {
execSync(`docker rm -v ${containerName}`);
}
export function removeVolume(containerName) {
execSync(`docker volume rm ${dockerVolumeName(containerName)}`);
}
export function updateDevnet(version) {
const image = `${devnetImageName}:${version}`;
execSync(`docker pull ${image}`);
log.info(log.color.green(`Updated ${image}`));
}
//# sourceMappingURL=docker.js.map