UNPKG

@hotglue/cli

Version:
171 lines (144 loc) 5.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handler = exports.desc = exports.command = exports.builder = void 0; var _debug = _interopRequireDefault(require("../../helpers/debug")); var _ora = _interopRequireDefault(require("ora")); var _awsSdk = _interopRequireDefault(require("aws-sdk")); var _cliTable = _interopRequireDefault(require("cli-table")); var _descriptions = _interopRequireDefault(require("../../helpers/descriptions")); var _print = require("../../helpers/print"); var _api = require("../../helpers/api"); var _flow = require("../../helpers/flow"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const debug = (0, _debug.default)('commands:etl:delete'); const command = 'delete'; exports.command = command; const desc = 'Delete ETL scripts'; exports.desc = desc; const builder = async yargs => { debug('builder', command); return yargs.option('flow', _descriptions.default.options['flow'].config).demandOption('flow', _descriptions.default.options['flow'].demandText).option('tap', _descriptions.default.options['tap'].config).demandOption('tap', _descriptions.default.options['tap'].demandText).option('tenant', { ..._descriptions.default.options['tenant'].config }).demandOption('tenant', _descriptions.default.options['tenant'].demandText); }; exports.builder = builder; const handler = async argv => { debug('handler', command, argv); const { hg, json, apikey, env, flow, tap, tenant } = argv; const { clientApiBaseUri } = hg; let message; let spinner = (0, _ora.default)(); try { var _listObjectsRes$Conte, _listObjectsRes$Conte2; message = (0, _print.themed)(`Deleting ETL scripts for Tenant ${(0, _print.themed)(tenant, 'info')} Flow ${(0, _print.themed)(flow, 'info')} and Tap ${(0, _print.themed)(tap, 'info')} to ${(0, _print.themed)(env, 'info')}`); !json && spinner.info((0, _print.themed)(`Info: ${message}.`, 'secondary')); // 1. get STS credentials message = (0, _print.themed)(`Verifying user and authorizing`); !json && spinner.start((0, _print.themed)(`In progress: ${message}...`, 'secondary')); const { accessKeyId, secretAccessKey, sessionToken } = await (0, _api.genCredentialsOnClientApi)({ debug, baseUri: clientApiBaseUri, task: 'etl-deploy', env, tenant, flow, tap, apikey }); // created authenticated S3 instance const s3 = new _awsSdk.default.S3({ accessKeyId, secretAccessKey, sessionToken }); !json && spinner.succeed((0, _print.themed)(`Finished: ${message}.`, 'secondary')); // 2. delete ETL folder message = (0, _print.themed)(`Deleting ETL scripts`); !json && spinner.start((0, _print.themed)(`In progress: ${message}...`, 'secondary')); const keyPrefix = `${tenant}/flows/${flow}/${await (0, _flow.getEntityLabel)(s3, env, tenant, flow)}/${tap}/etl/`; // 2.1 Get all objects from folder const listObjectsRes = await s3.listObjectsV2({ Bucket: env, Prefix: keyPrefix }).promise(); debug('s3-list-objects-res', listObjectsRes); if (((_listObjectsRes$Conte = listObjectsRes.Contents) === null || _listObjectsRes$Conte === void 0 ? void 0 : _listObjectsRes$Conte.length) > 0) { // 2.2 Delete all objects const deleteObjectsRes = await s3.deleteObjects({ Bucket: env, Delete: { Objects: listObjectsRes.Contents.map(object => { return { Key: object.Key }; }) } }).promise(); debug('s3-list-objects-res', deleteObjectsRes); } // 2.3 Delete the folder if needed const response = await s3.deleteObject({ Bucket: env, Key: keyPrefix }).promise(); debug('s3-delete-object-res', response); !json && spinner.succeed((0, _print.themed)(`Finished: ${message}.`, 'secondary')); if (((_listObjectsRes$Conte2 = listObjectsRes.Contents) === null || _listObjectsRes$Conte2 === void 0 ? void 0 : _listObjectsRes$Conte2.length) > 0) { const table = new _cliTable.default({ head: ['File', 'Status'] }); listObjectsRes.Contents.filter(({ Key }) => { return Key !== keyPrefix; }).forEach(({ Key }) => { const splittedKey = Key.split('/'); const filename = splittedKey[splittedKey.length - 1]; table.push([filename, (0, _print.themed)('Deleted', 'info')]); }); if (json) { (0, _print.printJSON)({ status: 'success', deletedObjects: (listObjectsRes.Contents ?? []).map(({ Key }) => Key) }); } else { (0, _print.cl)(table.toString()); } } else { message = (0, _print.themed)(`There was no file or folder to be deleted`); json ? (0, _print.printJSON)({ status: 'success', deletedObjects: [] }) : spinner.info((0, _print.themed)(`Info: ${message}.`, 'secondary')); } } catch (err) { if (json) { (0, _print.printJSON)({ status: 'error', error: err }); } else { spinner.fail((0, _print.themed)(`Error: ${message}.`, 'secondary')); (0, _print.pr)((0, _print.themed)(`Message: ${(0, _print.themed)(err.message)}`, 'secondary')); debug(err); if (err && err.response && err.response.data) { debug('response', err.response.data); } } } }; exports.handler = handler;