From 47efdceb4aefc00964babac7f11294c09b725e91 Mon Sep 17 00:00:00 2001 From: Akshay Kumar Date: Wed, 30 Jul 2025 13:56:28 +0530 Subject: [PATCH] updating design for sidecar --- .../SpnWebAppSiteContainersValidator.js | 11 +++++++- lib/ActionInputValidator/ValidatorFactory.js | 24 ++++++++--------- .../DeploymentProviderFactory.js | 15 +++++------ .../WebAppSiteContainersDeploymentProvider.js | 11 ++++++-- lib/main.js | 22 +++++++-------- .../SpnWebAppSiteContainersValidator.ts | 11 ++++++-- src/ActionInputValidator/ValidatorFactory.ts | 27 +++++++++---------- .../DeploymentProviderFactory.ts | 17 +++++------- .../WebAppSiteContainersDeploymentProvider.ts | 9 ++++++- src/main.ts | 22 +++++++-------- 10 files changed, 90 insertions(+), 79 deletions(-) diff --git a/lib/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.js b/lib/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.js index 46f54d856..639e16254 100644 --- a/lib/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.js +++ b/lib/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.js @@ -11,9 +11,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge Object.defineProperty(exports, "__esModule", { value: true }); exports.SpnWebAppSiteContainersValidator = void 0; const Validations_1 = require("../Validations"); -class SpnWebAppSiteContainersValidator { +const SpnLinuxWebAppValidator_1 = require("./SpnLinuxWebAppValidator"); +const actionparameters_1 = require("../../actionparameters"); +class SpnWebAppSiteContainersValidator extends SpnLinuxWebAppValidator_1.SpnLinuxWebAppValidator { validate() { + const _super = Object.create(null, { + validate: { get: () => super.validate } + }); return __awaiter(this, void 0, void 0, function* () { + let actionParams = actionparameters_1.ActionParameters.getActionParams(); + if (!!actionParams.blessedAppSitecontainers) { + yield _super.validate.call(this); + } (0, Validations_1.validateSiteContainersInputs)(); }); } diff --git a/lib/ActionInputValidator/ValidatorFactory.js b/lib/ActionInputValidator/ValidatorFactory.js index 11b392ae7..593b1d6d1 100644 --- a/lib/ActionInputValidator/ValidatorFactory.js +++ b/lib/ActionInputValidator/ValidatorFactory.js @@ -68,11 +68,11 @@ class ValidatorFactory { let actionParams = actionparameters_1.ActionParameters.getActionParams(); if (type === BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE) { if (!!actionParams.blessedAppSitecontainers || !!actionParams.siteContainers) { - return [new PublishProfileWebAppSiteContainersValidator_1.PublishProfileWebAppSiteContainersValidator()]; + return new PublishProfileWebAppSiteContainersValidator_1.PublishProfileWebAppSiteContainersValidator(); } else if (!!actionParams.images) { yield this.setResourceDetails(actionParams); - return [new PublishProfileContainerWebAppValidator_1.PublishProfileContainerWebAppValidator()]; + return new PublishProfileContainerWebAppValidator_1.PublishProfileContainerWebAppValidator(); } else { try { @@ -81,7 +81,7 @@ class ValidatorFactory { catch (error) { core.warning(`Failed to set resource details: ${error.message}`); } - return [new PublishProfileWebAppValidator_1.PublishProfileWebAppValidator()]; + return new PublishProfileWebAppValidator_1.PublishProfileWebAppValidator(); } } else if (type == BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.SPN) { @@ -90,24 +90,22 @@ class ValidatorFactory { yield this.getResourceDetails(actionParams); if (!!actionParams.isLinux) { if (!!actionParams.siteContainers) { - if (yield this.isBlessedSitecontainerApp(actionParams)) { - return [new SpnLinuxWebAppValidator_1.SpnLinuxWebAppValidator(), new SpnWebAppSiteContainersValidator_1.SpnWebAppSiteContainersValidator()]; - } - return [new SpnWebAppSiteContainersValidator_1.SpnWebAppSiteContainersValidator()]; + yield this.setBlessedSitecontainerApp(actionParams); + return new SpnWebAppSiteContainersValidator_1.SpnWebAppSiteContainersValidator(); } else if (!!actionParams.images || !!actionParams.multiContainerConfigFile) { - return [new SpnLinuxContainerWebAppValidator_1.SpnLinuxContainerWebAppValidator()]; + return new SpnLinuxContainerWebAppValidator_1.SpnLinuxContainerWebAppValidator(); } else { - return [new SpnLinuxWebAppValidator_1.SpnLinuxWebAppValidator()]; + return new SpnLinuxWebAppValidator_1.SpnLinuxWebAppValidator(); } } else { if (!!actionParams.images) { - return [new SpnWindowsContainerWebAppValidator_1.SpnWindowsContainerWebAppValidator()]; + return new SpnWindowsContainerWebAppValidator_1.SpnWindowsContainerWebAppValidator(); } else { - return [new SpnWindowsWebAppValidator_1.SpnWindowsWebAppValidator()]; + return new SpnWindowsWebAppValidator_1.SpnWindowsWebAppValidator(); } } } @@ -133,7 +131,7 @@ class ValidatorFactory { actionParams.isLinux = appOS.includes(RuntimeConstants_1.default.Unix) || appOS.includes(RuntimeConstants_1.default.Unix.toLowerCase()); }); } - static isBlessedSitecontainerApp(actionParams) { + static setBlessedSitecontainerApp(actionParams) { return __awaiter(this, void 0, void 0, function* () { var _a; const appService = new azure_app_service_1.AzureAppService(actionParams.endpoint, actionParams.resourceGroupName, actionParams.appName, actionParams.slotName); @@ -143,7 +141,7 @@ class ValidatorFactory { actionParams.blessedAppSitecontainers = (!linuxFxVersion.startsWith("DOCKER|") && !linuxFxVersion.startsWith("COMPOSE|") && linuxFxVersion !== "SITECONTAINERS"); - return actionParams.blessedAppSitecontainers; + core.debug(`Is blessed app sitecontainers: ${actionParams.blessedAppSitecontainers}`); }); } } diff --git a/lib/DeploymentProvider/DeploymentProviderFactory.js b/lib/DeploymentProvider/DeploymentProviderFactory.js index fc3f117c0..a0684a0f9 100644 --- a/lib/DeploymentProvider/DeploymentProviderFactory.js +++ b/lib/DeploymentProvider/DeploymentProviderFactory.js @@ -11,24 +11,21 @@ class DeploymentProviderFactory { static getDeploymentProvider(type) { if (type === BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE) { if (!!actionparameters_1.ActionParameters.getActionParams().images) { - return [new PublishProfileWebAppContainerDeploymentProvider_1.PublishProfileWebAppContainerDeploymentProvider(type)]; + return new PublishProfileWebAppContainerDeploymentProvider_1.PublishProfileWebAppContainerDeploymentProvider(type); } else { - return [new WebAppDeploymentProvider_1.WebAppDeploymentProvider(type)]; + return new WebAppDeploymentProvider_1.WebAppDeploymentProvider(type); } } else if (type == BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.SPN) { - if (!!actionparameters_1.ActionParameters.getActionParams().blessedAppSitecontainers) { - return [new WebAppDeploymentProvider_1.WebAppDeploymentProvider(type), new WebAppSiteContainersDeploymentProvider_1.WebAppSiteContainersDeploymentProvider(type)]; - } - else if (!!actionparameters_1.ActionParameters.getActionParams().siteContainers) { - return [new WebAppSiteContainersDeploymentProvider_1.WebAppSiteContainersDeploymentProvider(type)]; + if (!!actionparameters_1.ActionParameters.getActionParams().blessedAppSitecontainers || !!actionparameters_1.ActionParameters.getActionParams().siteContainers) { + return new WebAppSiteContainersDeploymentProvider_1.WebAppSiteContainersDeploymentProvider(type); } else if (!!actionparameters_1.ActionParameters.getActionParams().images || (!!actionparameters_1.ActionParameters.getActionParams().isLinux && !!actionparameters_1.ActionParameters.getActionParams().multiContainerConfigFile)) { - return [new WebAppContainerDeployment_1.WebAppContainerDeploymentProvider(type)]; + return new WebAppContainerDeployment_1.WebAppContainerDeploymentProvider(type); } else { - return [new WebAppDeploymentProvider_1.WebAppDeploymentProvider(type)]; + return new WebAppDeploymentProvider_1.WebAppDeploymentProvider(type); } } else { diff --git a/lib/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.js b/lib/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.js index a268b7221..cf41c4cae 100644 --- a/lib/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.js +++ b/lib/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.js @@ -43,12 +43,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebAppSiteContainersDeploymentProvider = void 0; -const BaseWebAppDeploymentProvider_1 = require("./BaseWebAppDeploymentProvider"); const SiteContainerDeploymentUtility_1 = require("azure-actions-appservice-rest/Utilities/SiteContainerDeploymentUtility"); const core = __importStar(require("@actions/core")); -class WebAppSiteContainersDeploymentProvider extends BaseWebAppDeploymentProvider_1.BaseWebAppDeploymentProvider { +const WebAppDeploymentProvider_1 = require("./WebAppDeploymentProvider"); +class WebAppSiteContainersDeploymentProvider extends WebAppDeploymentProvider_1.WebAppDeploymentProvider { DeployWebAppStep() { + const _super = Object.create(null, { + DeployWebAppStep: { get: () => super.DeployWebAppStep } + }); return __awaiter(this, void 0, void 0, function* () { + if (!!this.actionParams.blessedAppSitecontainers) { + core.info("Blessed site containers detected, using WebAppDeploymentProvider for deployment."); + yield _super.DeployWebAppStep.call(this); + } let siteContainerDeploymentUtility = new SiteContainerDeploymentUtility_1.SiteContainerDeploymentUtility(this.appService); let siteContainers = this.actionParams.siteContainers; core.info("Updating site containers"); diff --git a/lib/main.js b/lib/main.js index 438e54438..5a68a7d35 100644 --- a/lib/main.js +++ b/lib/main.js @@ -71,17 +71,13 @@ function main() { type = BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE; } // Validate action inputs - let validators = yield ValidatorFactory_1.ValidatorFactory.getValidator(type); - for (const validator of validators) { - yield validator.validate(); - } - var deploymentProviders = DeploymentProviderFactory_1.DeploymentProviderFactory.getDeploymentProvider(type); - for (const provider of deploymentProviders) { - core.info("Predeployment Step Started"); - yield provider.PreDeploymentStep(); - core.info("Deployment Step Started"); - yield provider.DeployWebAppStep(); - } + let validator = yield ValidatorFactory_1.ValidatorFactory.getValidator(type); + yield validator.validate(); + var deploymentProvider = DeploymentProviderFactory_1.DeploymentProviderFactory.getDeploymentProvider(type); + core.info("Predeployment Step Started"); + yield deploymentProvider.PreDeploymentStep(); + core.info("Deployment Step Started"); + yield deploymentProvider.DeployWebAppStep(); } catch (error) { isDeploymentSuccess = false; @@ -95,8 +91,8 @@ function main() { } } finally { - if (deploymentProviders != null) { - yield deploymentProviders[0].UpdateDeploymentStatus(isDeploymentSuccess); + if (deploymentProvider != null) { + yield deploymentProvider.UpdateDeploymentStatus(isDeploymentSuccess); } // Reset AZURE_HTTP_USER_AGENT core.exportVariable('AZURE_HTTP_USER_AGENT', prefix); diff --git a/src/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.ts b/src/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.ts index 71f049fea..90e4fc186 100644 --- a/src/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.ts +++ b/src/ActionInputValidator/ActionValidators/SpnWebAppSiteContainersValidator.ts @@ -1,10 +1,17 @@ import { validateSiteContainersInputs } from "../Validations"; + import { IValidator } from "./IValidator"; +import { SpnLinuxWebAppValidator } from "./SpnLinuxWebAppValidator"; +import { ActionParameters } from "../../actionparameters"; -export class SpnWebAppSiteContainersValidator implements IValidator { +export class SpnWebAppSiteContainersValidator extends SpnLinuxWebAppValidator { async validate(): Promise { + + let actionParams: ActionParameters = ActionParameters.getActionParams(); + if (!!actionParams.blessedAppSitecontainers) { + await super.validate(); + } validateSiteContainersInputs(); - } } \ No newline at end of file diff --git a/src/ActionInputValidator/ValidatorFactory.ts b/src/ActionInputValidator/ValidatorFactory.ts index 66f0d98b1..535eb80e8 100644 --- a/src/ActionInputValidator/ValidatorFactory.ts +++ b/src/ActionInputValidator/ValidatorFactory.ts @@ -18,15 +18,15 @@ import { PublishProfileWebAppSiteContainersValidator } from "./ActionValidators/ import { AzureAppService } from "azure-actions-appservice-rest/Arm/azure-app-service"; export class ValidatorFactory { - public static async getValidator(type: DEPLOYMENT_PROVIDER_TYPES) : Promise { + public static async getValidator(type: DEPLOYMENT_PROVIDER_TYPES) : Promise { let actionParams: ActionParameters = ActionParameters.getActionParams(); if(type === DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE) { if (!!actionParams.blessedAppSitecontainers || !!actionParams.siteContainers) { - return [new PublishProfileWebAppSiteContainersValidator()]; + return new PublishProfileWebAppSiteContainersValidator(); } else if (!!actionParams.images) { await this.setResourceDetails(actionParams); - return [new PublishProfileContainerWebAppValidator()]; + return new PublishProfileContainerWebAppValidator(); } else { try { @@ -35,7 +35,7 @@ export class ValidatorFactory { catch (error) { core.warning(`Failed to set resource details: ${error.message}`); } - return [new PublishProfileWebAppValidator()]; + return new PublishProfileWebAppValidator(); } } else if(type == DEPLOYMENT_PROVIDER_TYPES.SPN) { @@ -44,25 +44,22 @@ export class ValidatorFactory { await this.getResourceDetails(actionParams); if (!!actionParams.isLinux) { if (!!actionParams.siteContainers) { - if (await this.isBlessedSitecontainerApp(actionParams)) { - return [new SpnLinuxWebAppValidator(), new SpnWebAppSiteContainersValidator()]; - } - - return [new SpnWebAppSiteContainersValidator()]; + await this.setBlessedSitecontainerApp(actionParams); + return new SpnWebAppSiteContainersValidator(); } else if (!!actionParams.images || !!actionParams.multiContainerConfigFile) { - return [new SpnLinuxContainerWebAppValidator()]; + return new SpnLinuxContainerWebAppValidator(); } else { - return [new SpnLinuxWebAppValidator()]; + return new SpnLinuxWebAppValidator(); } } else { if (!!actionParams.images) { - return [new SpnWindowsContainerWebAppValidator()]; + return new SpnWindowsContainerWebAppValidator(); } else { - return [new SpnWindowsWebAppValidator()]; + return new SpnWindowsWebAppValidator(); } } } @@ -86,7 +83,7 @@ export class ValidatorFactory { actionParams.isLinux = appOS.includes(RuntimeConstants.Unix) || appOS.includes(RuntimeConstants.Unix.toLowerCase()); } - private static async isBlessedSitecontainerApp(actionParams: ActionParameters): Promise { + private static async setBlessedSitecontainerApp(actionParams: ActionParameters): Promise { const appService = new AzureAppService(actionParams.endpoint, actionParams.resourceGroupName, actionParams.appName, actionParams.slotName); let config = await appService.getConfiguration(); @@ -98,6 +95,6 @@ export class ValidatorFactory { && !linuxFxVersion.startsWith("COMPOSE|") && linuxFxVersion !== "SITECONTAINERS"); - return actionParams.blessedAppSitecontainers; + core.debug(`Is blessed app sitecontainers: ${actionParams.blessedAppSitecontainers}`); } } diff --git a/src/DeploymentProvider/DeploymentProviderFactory.ts b/src/DeploymentProvider/DeploymentProviderFactory.ts index 20adc724f..36b42d19d 100644 --- a/src/DeploymentProvider/DeploymentProviderFactory.ts +++ b/src/DeploymentProvider/DeploymentProviderFactory.ts @@ -9,27 +9,24 @@ import { WebAppSiteContainersDeploymentProvider } from "./Providers/WebAppSiteCo export class DeploymentProviderFactory { - public static getDeploymentProvider(type: DEPLOYMENT_PROVIDER_TYPES) : IWebAppDeploymentProvider[] { + public static getDeploymentProvider(type: DEPLOYMENT_PROVIDER_TYPES) : IWebAppDeploymentProvider { if(type === DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE) { if (!!ActionParameters.getActionParams().images) { - return [new PublishProfileWebAppContainerDeploymentProvider(type)]; + return new PublishProfileWebAppContainerDeploymentProvider(type); } else { - return [new WebAppDeploymentProvider(type)]; + return new WebAppDeploymentProvider(type); } } else if(type == DEPLOYMENT_PROVIDER_TYPES.SPN) { - if (!!ActionParameters.getActionParams().blessedAppSitecontainers) { - return [new WebAppDeploymentProvider(type), new WebAppSiteContainersDeploymentProvider(type)]; - } - else if (!!ActionParameters.getActionParams().siteContainers) { - return [new WebAppSiteContainersDeploymentProvider(type)]; + if (!!ActionParameters.getActionParams().blessedAppSitecontainers || !!ActionParameters.getActionParams().siteContainers) { + return new WebAppSiteContainersDeploymentProvider(type); } else if(!!ActionParameters.getActionParams().images || (!!ActionParameters.getActionParams().isLinux && !!ActionParameters.getActionParams().multiContainerConfigFile)) { - return [new WebAppContainerDeploymentProvider(type)]; + return new WebAppContainerDeploymentProvider(type); } else { - return [new WebAppDeploymentProvider(type)]; + return new WebAppDeploymentProvider(type); } } else { diff --git a/src/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.ts b/src/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.ts index 23dd3d0f5..b3b9509fc 100644 --- a/src/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.ts +++ b/src/DeploymentProvider/Providers/WebAppSiteContainersDeploymentProvider.ts @@ -1,9 +1,16 @@ import { BaseWebAppDeploymentProvider } from './BaseWebAppDeploymentProvider'; import { SiteContainerDeploymentUtility } from 'azure-actions-appservice-rest/Utilities/SiteContainerDeploymentUtility'; import * as core from '@actions/core'; +import { WebAppDeploymentProvider } from './WebAppDeploymentProvider'; -export class WebAppSiteContainersDeploymentProvider extends BaseWebAppDeploymentProvider { +export class WebAppSiteContainersDeploymentProvider extends WebAppDeploymentProvider { public async DeployWebAppStep() { + + if(!!this.actionParams.blessedAppSitecontainers){ + core.info("Blessed site containers detected, using WebAppDeploymentProvider for deployment."); + await super.DeployWebAppStep(); + } + let siteContainerDeploymentUtility = new SiteContainerDeploymentUtility(this.appService); let siteContainers = this.actionParams.siteContainers; diff --git a/src/main.ts b/src/main.ts index e8927cadc..752c79395 100644 --- a/src/main.ts +++ b/src/main.ts @@ -34,19 +34,15 @@ export async function main() { } // Validate action inputs - let validators = await ValidatorFactory.getValidator(type); - for (const validator of validators) { - await validator.validate(); - } + let validator = await ValidatorFactory.getValidator(type); + await validator.validate(); - var deploymentProviders = DeploymentProviderFactory.getDeploymentProvider(type); + var deploymentProvider = DeploymentProviderFactory.getDeploymentProvider(type); - for (const provider of deploymentProviders) { - core.info("Predeployment Step Started"); - await provider.PreDeploymentStep(); - core.info("Deployment Step Started"); - await provider.DeployWebAppStep(); - } + core.info("Predeployment Step Started"); + await deploymentProvider.PreDeploymentStep(); + core.info("Deployment Step Started"); + await deploymentProvider.DeployWebAppStep(); } catch(error) { isDeploymentSuccess = false; @@ -60,8 +56,8 @@ export async function main() { } } finally { - if(deploymentProviders != null) { - await deploymentProviders[0].UpdateDeploymentStatus(isDeploymentSuccess); + if(deploymentProvider != null) { + await deploymentProvider.UpdateDeploymentStatus(isDeploymentSuccess); } // Reset AZURE_HTTP_USER_AGENT