UNPKG

sfdx-hardis

Version:

Swiss-army-knife Toolbox for Salesforce. Allows you to define a complete CD/CD Pipeline. Orchestrate base commands and assist users with interactive wizards

104 lines 4.72 kB
/* jscpd:ignore-start */ import { SfCommand, Flags, requiredOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core'; import { Messages } from '@salesforce/core'; import axios from 'axios'; import moment from 'moment'; import c from 'chalk'; import { uxLog } from '../../../../common/utils/index.js'; import { soqlQuery } from '../../../../common/utils/apiUtils.js'; import { NotifProvider } from '../../../../common/notifProvider/index.js'; import { getNotificationButtons, getOrgMarkdown } from '../../../../common/utils/notifUtils.js'; import { setConnectionVariables } from '../../../../common/utils/orgUtils.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('sfdx-hardis', 'org'); export default class DiagnoseInstanceUpgrade extends SfCommand { static title = 'Get Instance Upgrade date'; static description = `Get the date when the org instance will be upgraded (to Spring, Summer or Winter) `; static examples = ['$ sf hardis:org:diagnose:instanceupgrade']; static flags = { debug: Flags.boolean({ char: 'd', default: false, description: messages.getMessage('debugMode'), }), websocket: Flags.string({ description: messages.getMessage('websocket'), }), skipauth: Flags.boolean({ description: 'Skip authentication check when a default username is required', }), 'target-org': requiredOrgFlagWithDeprecations, }; static requiresProject = false; debugMode = false; /* jscpd:ignore-end */ async run() { const { flags } = await this.parse(DiagnoseInstanceUpgrade); this.debugMode = flags.debug || false; // Get instance name const orgQuery = 'SELECT FIELDS(all) FROM Organization LIMIT 1'; const orgQueryRes = await soqlQuery(orgQuery, flags['target-org'].getConnection()); const orgInfo = orgQueryRes.records[0]; const instanceName = orgInfo.InstanceName; // Get Salesforce instance info const instanceStatusUrl = `https://api.status.salesforce.com/v1/instances/${instanceName}/status`; const axiosResponse = await axios.get(instanceStatusUrl); const instanceInfo = axiosResponse.data; const maintenances = instanceInfo.Maintenances || []; orgInfo.maintenanceNextUpgrade = {}; for (const maintenance of maintenances) { if (maintenance.isCore && maintenance.releaseType === 'Major' && maintenance.serviceKeys.includes('coreService')) { orgInfo.maintenanceNextUpgrade = maintenance; break; } } // Get number of days before next major upgrade const nextUpgradeDate = moment(orgInfo?.maintenanceNextUpgrade?.plannedStartTime); const nextMajorUpgradeDateStr = nextUpgradeDate.format("ll"); const today = moment(); const daysBeforeUpgrade = today.diff(nextUpgradeDate, 'days'); // Manage notifications const orgMarkdown = await getOrgMarkdown(flags['target-org']?.getConnection()?.instanceUrl); const notifButtons = await getNotificationButtons(); let notifSeverity = 'log'; const notifText = `Salesforce instance *${instanceName}* of ${orgMarkdown} will be upgraded on ${nextMajorUpgradeDateStr} (*${daysBeforeUpgrade} days*) to ${orgInfo?.maintenanceNextUpgrade?.name}`; // Change severity according to number of days if (daysBeforeUpgrade <= 15) { notifSeverity = 'warning'; uxLog(this, c.yellow(notifText)); } else if (daysBeforeUpgrade <= 30) { notifSeverity = 'info'; uxLog(this, c.green(notifText)); } else { uxLog(this, c.green(notifText)); } await setConnectionVariables(flags['target-org']?.getConnection()); // Required for some notifications providers like Email await NotifProvider.postNotifications({ type: 'ORG_INFO', text: notifText, attachments: [], buttons: notifButtons, severity: notifSeverity, logElements: [orgInfo], data: { metric: daysBeforeUpgrade, }, metrics: { DayBeforeUpgrade: daysBeforeUpgrade, }, }); // Return an object to be displayed with --json return { message: notifText, nextUpgradeDate: nextUpgradeDate.format(), orgInfo: orgInfo, instanceInfo: instanceInfo, }; } } //# sourceMappingURL=instanceupgrade.js.map