From 258c783e7692550a5763d0a8552a230e19f664cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Di=C3=A9ffrei=20Quadros?= Date: Mon, 20 Jan 2025 14:47:24 -0300 Subject: [PATCH] feat: support psg update awaiter timeout --- resources/schemas/sfdx-project.schema.json | 8 ++++++- .../packageInstallers/InstallPackage.ts | 17 ++++++++------ .../PermissionSetGroupUpdateAwaiter.ts | 22 ++++++++++++++++++- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/resources/schemas/sfdx-project.schema.json b/resources/schemas/sfdx-project.schema.json index 9aa9244de..4a80bf6a8 100644 --- a/resources/schemas/sfdx-project.schema.json +++ b/resources/schemas/sfdx-project.schema.json @@ -1149,6 +1149,12 @@ "description": "Disable Entitlement filtering in source package,which skips entitlements that are already in the target org", "default": false }, + "permissionsetGroupTimeout": { + "title": "Permission set group recalculation timeout", + "type": "integer", + "description": "Permission set group recalculation timeout", + "default": false + }, "disableTransitiveDependencyResolver": { "title": "Disable Transitive Dependency Resolver", "type": "boolean", @@ -1183,4 +1189,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/core/package/packageInstallers/InstallPackage.ts b/src/core/package/packageInstallers/InstallPackage.ts index 644d1480a..21dfe2e01 100644 --- a/src/core/package/packageInstallers/InstallPackage.ts +++ b/src/core/package/packageInstallers/InstallPackage.ts @@ -98,7 +98,7 @@ export abstract class InstallPackage { }; } } - + checkPackageDirectoryExists() { let absPackageDirectory: string = path.join(this.sfpPackage.sourceDir, this.packageDirectory); if (!fs.existsSync(absPackageDirectory)) { @@ -107,11 +107,14 @@ export abstract class InstallPackage { } private async waitTillAllPermissionSetGroupIsUpdated() { + const projectConfig = ProjectConfig.getSFDXProjectConfig(this.sfpPackage.sourceDir); try { //Package Has Permission Set Group let permissionSetGroupUpdateAwaiter: PermissionSetGroupUpdateAwaiter = new PermissionSetGroupUpdateAwaiter( this.connection, - this.logger + this.logger, + 6000,//TODO fix + projectConfig.plugins.sfp.permissionsetGroupTimeout ); await permissionSetGroupUpdateAwaiter.waitTillAllPermissionSetGroupIsUpdated(); } catch (error) { @@ -222,15 +225,15 @@ export abstract class InstallPackage { if (skipIfPackageInstalled) { let installationStatus = await this.sfpOrg.isArtifactInstalledInOrg(this.logger, this.sfpPackage); return !installationStatus.isInstalled; - } else if(this.sfpPackage.packageType == PackageType.Diff) + } else if(this.sfpPackage.packageType == PackageType.Diff) { // If diff package, check if there are any changes to be deployed, else skip if(!this.sfpPackage.destructiveChanges && this.sfpPackage.metadataCount==0) - { + { return false; } } - + return true; // Always install packages if skipIfPackageInstalled is false } @@ -363,7 +366,7 @@ export abstract class InstallPackage { let analyzers = AnalyzerRegistry.getAnalyzers(); for (const analyzer of analyzers) { - if(await analyzer.isEnabled(this.sfpPackage, this.logger)) + if(await analyzer.isEnabled(this.sfpPackage, this.logger)) { SFPLogger.log(`Executing ${COLOR_KEY_MESSAGE(analyzer.getName())}`, LoggerLevel.INFO, this.logger); this.sfpPackage = await analyzer.analyze(this.sfpPackage,componentSet, this.logger); @@ -489,7 +492,7 @@ export abstract class InstallPackage { deploymentOptions.rollBackOnError = true; return deploymentOptions; } - + private getAStringOfSpecificTestClasses(apexTestClassses: string[]) { let specifedTests = apexTestClassses.join(); return specifedTests; diff --git a/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts b/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts index ad8d2f716..05abc3d97 100644 --- a/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts +++ b/src/core/permsets/PermissionSetGroupUpdateAwaiter.ts @@ -6,7 +6,16 @@ import { delay } from '../utils/Delay'; const psGroupQuery = `SELECT Id,MasterLabel,Status FROM PermissionSetGroup WHERE Status IN ('Updating', 'Outdated')`; export default class PermissionSetGroupUpdateAwaiter { - constructor(private connection: Connection, private logger: Logger, private intervalBetweenRepeats = 60000) {} + private startTime: number; + + constructor( + private connection: Connection, + private logger: Logger, + private intervalBetweenRepeats = 60000, + private timeoutInMs = 30 * 60 * 1000 // Default timeout of 30 minutes + ) { + this.startTime = Date.now(); + } async waitTillAllPermissionSetGroupIsUpdated() { SFPLogger.log( @@ -14,8 +23,19 @@ export default class PermissionSetGroupUpdateAwaiter { LoggerLevel.INFO, this.logger ); + while (true) { try { + // Check if timeout has been reached + if (Date.now() - this.startTime >= this.timeoutInMs) { + SFPLogger.log( + `Timeout of ${this.timeoutInMs/1000} seconds reached. Proceeding with deployment regardless of PermissionSetGroup status`, + LoggerLevel.WARN, + this.logger + ); + break; + } + let records = await QueryHelper.query(psGroupQuery, this.connection, false); if (records.length > 0) { SFPLogger.log(