@hotglue/cli
Version:
hotglue CLI tools
171 lines (144 loc) • 5.57 kB
JavaScript
;
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;