UNPKG

vtex

Version:

The platform for e-commerce apps

121 lines (120 loc) 5.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const chalk_1 = tslib_1.__importDefault(require("chalk")); const install_1 = tslib_1.__importDefault(require("../../../modules/apps/install")); const utils_1 = require("../../error/utils"); const Sponsor_1 = require("../../clients/IOClients/apps/Sponsor"); const SessionManager_1 = require("../../session/SessionManager"); const logger_1 = tslib_1.__importDefault(require("../../logger")); const utils_2 = require("../utils"); const switch_1 = require("../auth/switch"); const prompts_1 = require("../prompts"); const promptSwitchToAccount = async (account, initial) => { const reason = initial ? `Initial edition can only be set by ${chalk_1.default.blue(account)} account` : `Only current account sponsor (${chalk_1.default.blue(account)}) can change its edition`; const proceed = await prompts_1.promptConfirm(`${reason}. Do you want to switch to account ${chalk_1.default.blue(account)}?`); if (!proceed) { return false; } await switch_1.switchAccount(account, {}); return true; }; const confirmAndSwitchEnvironment = async (sponsorAccount, targetAccount, targetWorkspace) => { if (!sponsorAccount) { if (targetWorkspace !== 'master') { throw utils_1.createFlowIssueError('Can only set initial edition in master workspace'); } return promptSwitchToAccount('vtex', true); } const workspaceIsOk = targetWorkspace !== 'master' || (await utils_2.promptWorkspaceMaster(targetAccount)); if (!workspaceIsOk) return false; return promptSwitchToAccount(sponsorAccount, false); }; const tenantProvisionerApp = 'vtex.tenant-provisioner'; const promptInstallTenantProvisioner = async (account) => { logger_1.default.warn(`Tenant provisioner app seems not to be installed in sponsor account ${chalk_1.default.blue(account)}.`); const proceed = await prompts_1.promptConfirm(`Do you want to install ${chalk_1.default.blue(tenantProvisionerApp)} in account ${chalk_1.default.blue(account)} now?`); if (!proceed) { return false; } await install_1.default([tenantProvisionerApp], { force: false }); return true; }; const isProvisionerNotInstalledError = (err) => { var _a, _b; const res = err.response; return (res === null || res === void 0 ? void 0 : res.status) === 404 && ((_a = res.data) === null || _a === void 0 ? void 0 : _a.source) === 'Vtex.Kube.Router' && ((_b = res.data) === null || _b === void 0 ? void 0 : _b.code) === 'NotFound'; }; const trySetEditionOnce = async (client, targetAccount, targetWorkspace, edition) => { try { await client.setEdition(targetAccount, targetWorkspace, edition); return true; } catch (err) { if (!isProvisionerNotInstalledError(err)) { throw err; } return false; } }; const maxSetEditionRetries = 3; const trySetEdition = async (sponsorAccount, targetAccount, targetWorkspace, edition) => { const client = Sponsor_1.Sponsor.createClient(); let success = await trySetEditionOnce(client, targetAccount, targetWorkspace, edition); if (success) { return true; } const installed = await promptInstallTenantProvisioner(sponsorAccount); if (!installed) { return false; } const workspaceNotice = targetWorkspace === 'master' ? '' : `in workspace ${chalk_1.default.blue(targetWorkspace)} `; logger_1.default.info(`Now setting edition ${chalk_1.default.blue(edition)} ${workspaceNotice}of account ${chalk_1.default.blue(targetAccount)}...`); // Retry a couple of times since it might take some time for the installation to propagate until the route is available. /* eslint-disable no-await-in-loop */ for (let retry = 1; !success && retry <= maxSetEditionRetries; retry++) { await utils_2.sleepSec(1.5 * retry); success = retry < maxSetEditionRetries ? await trySetEditionOnce(client, targetAccount, targetWorkspace, edition) : await client.setEdition(targetAccount, targetWorkspace, edition).then(() => true); } /* eslint-enable no-await-in-loop */ return success; }; async function setEdition(edition, workspace, autoSwitchBack = false) { const session = SessionManager_1.SessionManager.getSingleton(); const { account: previousAccount, workspace: previousWorkspace } = session; const targetAccount = session.account; const targetWorkspace = workspace !== null && workspace !== void 0 ? workspace : session.workspace; const workspaceNotice = targetWorkspace === 'master' ? '' : ` in workspace ${chalk_1.default.blue(targetWorkspace)}`; logger_1.default.info(`Changing edition of account ${chalk_1.default.blue(targetAccount)}${workspaceNotice}.`); const sponsorClient = Sponsor_1.Sponsor.createClient(); const sponsorAccount = await sponsorClient.getSponsorAccount(); const switched = await confirmAndSwitchEnvironment(sponsorAccount, targetAccount, targetWorkspace); if (!switched) { return; } try { if (!(await trySetEdition(sponsorAccount, targetAccount, targetWorkspace, edition))) { return; } logger_1.default.info(`Successfully changed edition${workspaceNotice} of account ${chalk_1.default.blue(targetAccount)}.`); } catch (err) { logger_1.default.error(`Failed to change edition of account ${chalk_1.default.blue(targetAccount)}.`); throw err; } finally { if (autoSwitchBack) { await switch_1.returnToPreviousAccount({ previousAccount, previousWorkspace, promptConfirmation: false }); } else { await switch_1.returnToPreviousAccount({ previousAccount, previousWorkspace }); } } } exports.default = setEdition;