From 95b4bc2790fa23db43f8720fc5cfdf032ef1f09e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:31:45 +0000 Subject: [PATCH 1/2] Initial plan From 129e1e9172ce4d973c7791817138eac9f3794bc9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:35:59 +0000 Subject: [PATCH 2/2] Refactor DirectorySync step to generic provider-agnostic module - Create new IdLE.Steps.DirectorySync module (generic naming) - Move and update Invoke-IdleStepTriggerDirectorySync with provider-neutral help and defaults - Update StepRegistry to register IdLE.Step.TriggerDirectorySync with new module - Update all test references to use new module name - Update documentation to use provider-neutral language - Update meta-module and test helpers to reference new module - Remove old IdLE.Steps.DirectorySync.EntraConnect module Co-authored-by: blindzero <13959569+blindzero@users.noreply.github.com> --- docs/reference/steps.md | 2 +- .../Private/Get-IdleStepRegistry.ps1 | 7 ++++ .../IdLE.Steps.DirectorySync.psd1} | 6 +-- .../IdLE.Steps.DirectorySync.psm1} | 0 .../Invoke-IdleStepTriggerDirectorySync.ps1 | 6 +-- src/IdLE/IdLE.psd1 | 2 +- ...oke-IdleStepTriggerDirectorySync.Tests.ps1 | 38 +++++++++---------- tests/_testHelpers.ps1 | 2 +- tools/Generate-IdleStepReference.ps1 | 2 +- 9 files changed, 36 insertions(+), 29 deletions(-) rename src/{IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psd1 => IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psd1} (80%) rename src/{IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psm1 => IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psm1} (100%) rename src/{IdLE.Steps.DirectorySync.EntraConnect => IdLE.Steps.DirectorySync}/Public/Invoke-IdleStepTriggerDirectorySync.ps1 (97%) diff --git a/docs/reference/steps.md b/docs/reference/steps.md index 5e73415a..03d81d18 100644 --- a/docs/reference/steps.md +++ b/docs/reference/steps.md @@ -308,7 +308,7 @@ Authentication: **Synopsis** -Triggers an Entra Connect directory sync cycle and optionally waits for completion. +Triggers a directory sync cycle and optionally waits for completion. **Description** diff --git a/src/IdLE.Core/Private/Get-IdleStepRegistry.ps1 b/src/IdLE.Core/Private/Get-IdleStepRegistry.ps1 index d1b3fa98..365c8682 100644 --- a/src/IdLE.Core/Private/Get-IdleStepRegistry.ps1 +++ b/src/IdLE.Core/Private/Get-IdleStepRegistry.ps1 @@ -163,5 +163,12 @@ function Get-IdleStepRegistry { } } + if (-not $registry.ContainsKey('IdLE.Step.TriggerDirectorySync')) { + $handler = Resolve-IdleStepHandlerName -CommandName 'Invoke-IdleStepTriggerDirectorySync' -ModuleName 'IdLE.Steps.DirectorySync' + if (-not [string]::IsNullOrWhiteSpace($handler)) { + $registry['IdLE.Step.TriggerDirectorySync'] = $handler + } + } + return $registry } diff --git a/src/IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psd1 b/src/IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psd1 similarity index 80% rename from src/IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psd1 rename to src/IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psd1 index c372e008..910e49d1 100644 --- a/src/IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psd1 +++ b/src/IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psd1 @@ -1,10 +1,10 @@ @{ - RootModule = 'IdLE.Steps.DirectorySync.EntraConnect.psm1' + RootModule = 'IdLE.Steps.DirectorySync.psm1' ModuleVersion = '0.8.0' GUID = 'b2c3d4e5-6f78-9012-bcde-f12345678901' Author = 'Matthias Fleschuetz' Copyright = '(c) Matthias Fleschuetz. All rights reserved.' - Description = 'Entra Connect directory sync steps for IdLE.' + Description = 'Generic directory sync steps for IdLE.' PowerShellVersion = '7.0' RequiredModules = @( @@ -17,7 +17,7 @@ PrivateData = @{ PSData = @{ - Tags = @('IdentityLifecycleEngine', 'IdLE', 'Steps', 'DirectorySync', 'EntraConnect') + Tags = @('IdentityLifecycleEngine', 'IdLE', 'Steps', 'DirectorySync') LicenseUri = 'https://www.apache.org/licenses/LICENSE-2.0' ProjectUri = 'https://github.com/blindzero/IdentityLifecycleEngine' ContactEmail = '13959569+blindzero@users.noreply.github.com' diff --git a/src/IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psm1 b/src/IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psm1 similarity index 100% rename from src/IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psm1 rename to src/IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psm1 diff --git a/src/IdLE.Steps.DirectorySync.EntraConnect/Public/Invoke-IdleStepTriggerDirectorySync.ps1 b/src/IdLE.Steps.DirectorySync/Public/Invoke-IdleStepTriggerDirectorySync.ps1 similarity index 97% rename from src/IdLE.Steps.DirectorySync.EntraConnect/Public/Invoke-IdleStepTriggerDirectorySync.ps1 rename to src/IdLE.Steps.DirectorySync/Public/Invoke-IdleStepTriggerDirectorySync.ps1 index e194aac3..8056112f 100644 --- a/src/IdLE.Steps.DirectorySync.EntraConnect/Public/Invoke-IdleStepTriggerDirectorySync.ps1 +++ b/src/IdLE.Steps.DirectorySync/Public/Invoke-IdleStepTriggerDirectorySync.ps1 @@ -1,7 +1,7 @@ function Invoke-IdleStepTriggerDirectorySync { <# .SYNOPSIS - Triggers an Entra Connect directory sync cycle and optionally waits for completion. + Triggers a directory sync cycle and optionally waits for completion. .DESCRIPTION This is a provider-agnostic step. The host must supply a provider instance via @@ -35,10 +35,10 @@ function Invoke-IdleStepTriggerDirectorySync { .EXAMPLE $step = @{ - Name = 'Trigger Entra Connect sync' + Name = 'Trigger directory sync' Type = 'IdLE.Step.TriggerDirectorySync' With = @{ - AuthSessionName = 'EntraConnect' + AuthSessionName = 'DirectorySync' PolicyType = 'Delta' Wait = $true } diff --git a/src/IdLE/IdLE.psd1 b/src/IdLE/IdLE.psd1 index 5f4f2abc..267423e5 100644 --- a/src/IdLE/IdLE.psd1 +++ b/src/IdLE/IdLE.psd1 @@ -10,7 +10,7 @@ NestedModules = @( '..\IdLE.Core\IdLE.Core.psd1', '..\IdLE.Steps.Common\IdLE.Steps.Common.psd1', - '..\IdLE.Steps.DirectorySync.EntraConnect\IdLE.Steps.DirectorySync.EntraConnect.psd1', + '..\IdLE.Steps.DirectorySync\IdLE.Steps.DirectorySync.psd1', '..\IdLE.Provider.DirectorySync.EntraConnect\IdLE.Provider.DirectorySync.EntraConnect.psd1', '..\IdLE.Provider.AD\IdLE.Provider.AD.psd1' ) diff --git a/tests/Invoke-IdleStepTriggerDirectorySync.Tests.ps1 b/tests/Invoke-IdleStepTriggerDirectorySync.Tests.ps1 index 0aeffc47..82015d90 100644 --- a/tests/Invoke-IdleStepTriggerDirectorySync.Tests.ps1 +++ b/tests/Invoke-IdleStepTriggerDirectorySync.Tests.ps1 @@ -100,7 +100,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { Type = 'IdLE.Step.TriggerDirectorySync' } - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw } @@ -108,7 +108,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.Remove('AuthSessionName') - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw -ErrorId * -ExpectedMessage '*AuthSessionName*' } @@ -116,7 +116,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.Remove('PolicyType') - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw -ErrorId * -ExpectedMessage '*PolicyType*' } @@ -124,7 +124,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.PolicyType = 'Invalid' - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw -ErrorId * -ExpectedMessage '*PolicyType*' } @@ -132,7 +132,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.PolicyType = 'Delta' - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $result.Status | Should -Be 'Completed' @@ -142,7 +142,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.PolicyType = 'Initial' - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $result.Status | Should -Be 'Completed' @@ -152,7 +152,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.Remove('Provider') - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $result.Status | Should -Be 'Completed' @@ -162,7 +162,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.TimeoutSeconds = -1 - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw -ErrorId * -ExpectedMessage '*TimeoutSeconds*' } @@ -170,7 +170,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.PollIntervalSeconds = 0 - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw -ErrorId * -ExpectedMessage '*PollIntervalSeconds*' } } @@ -180,7 +180,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step = $script:StepTemplate $step.With.Wait = $false - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $result.Status | Should -Be 'Completed' @@ -191,7 +191,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { It 'defaults to not waiting when Wait is not specified' { $step = $script:StepTemplate - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $result.Status | Should -Be 'Completed' @@ -204,7 +204,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step.With.Wait = $true $step.With.PollIntervalSeconds = 1 - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $result.Status | Should -Be 'Completed' @@ -227,7 +227,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step.With.TimeoutSeconds = 2 $step.With.PollIntervalSeconds = 1 - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $step } | Should -Throw -ErrorId * -ExpectedMessage '*Timeout*' } @@ -249,7 +249,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step.With.Wait = $true $step.With.PollIntervalSeconds = 1 - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $result = & $handler -Context $script:Context -Step $step $script:MockProvider.PollCount | Should -BeGreaterThan 1 @@ -260,7 +260,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { It 'throws when provider is missing' { $script:Context.Providers.Clear() - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $script:StepTemplate } | Should -Throw -ErrorId * -ExpectedMessage '*Provider*' } @@ -268,7 +268,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $badProvider = [pscustomobject]@{ Name = 'BadProvider' } $script:Context.Providers['DirectorySync'] = $badProvider - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' { & $handler -Context $script:Context -Step $script:StepTemplate } | Should -Throw -ErrorId * -ExpectedMessage '*StartSyncCycle*' } } @@ -282,7 +282,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $null = $capturedEvents.Add(@{ Type = $Type; Message = $Message; StepName = $StepName; Data = $Data }) } -Force - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $null = & $handler -Context $script:Context -Step $script:StepTemplate $capturedEvents.Type | Should -Contain 'DirectorySyncTriggered' @@ -296,7 +296,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $null = $capturedEvents.Add(@{ Type = $Type; Message = $Message; StepName = $StepName; Data = $Data }) } -Force - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $null = & $handler -Context $script:Context -Step $script:StepTemplate $capturedEvents.Type | Should -Contain 'DirectorySyncCompleted' @@ -314,7 +314,7 @@ Describe 'Invoke-IdleStepTriggerDirectorySync (DirectorySync step)' { $step.With.Wait = $true $step.With.PollIntervalSeconds = 1 - $handler = 'IdLE.Steps.DirectorySync.EntraConnect\Invoke-IdleStepTriggerDirectorySync' + $handler = 'IdLE.Steps.DirectorySync\Invoke-IdleStepTriggerDirectorySync' $null = & $handler -Context $script:Context -Step $step $capturedEvents.Type | Should -Contain 'DirectorySyncWaiting' diff --git a/tests/_testHelpers.ps1 b/tests/_testHelpers.ps1 index 8c3ff658..f3f3ed95 100644 --- a/tests/_testHelpers.ps1 +++ b/tests/_testHelpers.ps1 @@ -26,7 +26,7 @@ function Import-IdleTestModule { $stepsCommonManifestPath = Resolve-Path -Path (Join-Path (Get-RepoRootPath) 'src/IdLE.Steps.Common/IdLE.Steps.Common.psd1') Import-Module -Name $stepsCommonManifestPath -Force -ErrorAction Stop - $stepsDirectorySyncManifestPath = Resolve-Path -Path (Join-Path (Get-RepoRootPath) 'src/IdLE.Steps.DirectorySync.EntraConnect/IdLE.Steps.DirectorySync.EntraConnect.psd1') + $stepsDirectorySyncManifestPath = Resolve-Path -Path (Join-Path (Get-RepoRootPath) 'src/IdLE.Steps.DirectorySync/IdLE.Steps.DirectorySync.psd1') Import-Module -Name $stepsDirectorySyncManifestPath -Force -ErrorAction Stop $mockProviderManifestPath = Resolve-Path -Path (Join-Path (Get-RepoRootPath) 'src/IdLE.Provider.Mock/IdLE.Provider.Mock.psd1') diff --git a/tools/Generate-IdleStepReference.ps1 b/tools/Generate-IdleStepReference.ps1 index 898a73b3..eabc8e89 100644 --- a/tools/Generate-IdleStepReference.ps1 +++ b/tools/Generate-IdleStepReference.ps1 @@ -13,7 +13,7 @@ param( # Restrict which step modules are scanned. [Parameter()] [ValidateNotNullOrEmpty()] - [string[]] $StepModules = @('IdLE.Steps.Common', 'IdLE.Steps.DirectorySync.EntraConnect'), + [string[]] $StepModules = @('IdLE.Steps.Common', 'IdLE.Steps.DirectorySync'), # Optional: Step function names to exclude (exact command names). [Parameter()]