From 7d2012fdd73336a874d39c746dbe993aa7c13e77 Mon Sep 17 00:00:00 2001 From: Gyorgy Nadaban Date: Tue, 22 May 2018 17:36:57 -0400 Subject: [PATCH] Implemented support for Repository selection when installing module (#39909) * Implemented support for Repository selection when installing module * Fixed AllowClobber check * Fixing missing AllowClobber argument * Fixed missing -Force switch * Test installing package from custom repo * Added custom repo variables * Fixed repo registration * Modified output check * Modified output check * Adding debug output * Modified update handling * Fixed output check * Added missing PowerShellGet 1.6.0 install * Added error handling * Modified test output check * Fixing output check * Fixing output filter * Implemented registering custom repo * Fixing registering custom repo * Fixing registering custom repo * Fixing registering custom repo * Tweaked module to shorten execution time * Removed installing PowerShellGet 1.6.0 * Re-added Install-NugetProvider --- lib/ansible/modules/windows/win_psmodule.ps1 | 28 +++++-- lib/ansible/modules/windows/win_psmodule.py | 10 ++- .../targets/win_psmodule/defaults/main.yml | 2 + .../targets/win_psmodule/tasks/test.yml | 73 ++++++++++++++++++- 4 files changed, 103 insertions(+), 10 deletions(-) diff --git a/lib/ansible/modules/windows/win_psmodule.ps1 b/lib/ansible/modules/windows/win_psmodule.ps1 index 24595ca3af..20efd38ab6 100644 --- a/lib/ansible/modules/windows/win_psmodule.ps1 +++ b/lib/ansible/modules/windows/win_psmodule.ps1 @@ -108,6 +108,7 @@ Function Install-PsModule { param( [Parameter(Mandatory=$true)] [string]$Name, + [string]$Repository, [bool]$AllowClobber, [bool]$CheckMode ) @@ -117,15 +118,27 @@ Function Install-PsModule { else { try{ # Install NuGet Provider if needed - Install-NugetProvider -CheckMode $CheckMode + Install-NugetProvider -CheckMode $CheckMode; - # Check Powershell Version (-AllowClobber was introduced in early version only) - if ($PsVersion.Minor -ge 1){ - Install-Module -Name $Name -Force -ErrorAction Stop -Whatif:$CheckMode -AllowClobber:$AllowClobber | out-null + $ht = @{ + Name = $Name; + WhatIf = $CheckMode; + ErrorAction = "Stop"; + Force = $true; + }; + + # If specified, use repository name to select module source + if ($Repository) { + $ht["Repository"] = "$Repository"; } - else { - Install-Module -Name $Name -Force -ErrorAction Stop -Whatif:$CheckMode | out-null + + # Check Powershell Version (-AllowClobber was introduced in PowerShellGet 1.6.0) + if ("AllowClobber" -in ((Get-Command PowerShellGet\Install-Module | Select -ExpandProperty Parameters).Keys)) { + $ht['AllowClobber'] = $AllowClobber; } + + Install-Module @ht | out-null; + $result.output = "Module $($Name) installed" $result.changed = $true } @@ -174,7 +187,8 @@ if ($state -eq "present") { else { $ErrorMessage = "Repository Name and Url are mandatory if you want to add a new repository" } - Install-PsModule -Name $Name -CheckMode $check_mode -AllowClobber $allow_clobber + + Install-PsModule -Name $Name -Repository $repo -CheckMode $check_mode -AllowClobber $allow_clobber; } else { if ($repo) { diff --git a/lib/ansible/modules/windows/win_psmodule.py b/lib/ansible/modules/windows/win_psmodule.py index 511a4adc3a..ed73557cd4 100644 --- a/lib/ansible/modules/windows/win_psmodule.py +++ b/lib/ansible/modules/windows/win_psmodule.py @@ -30,10 +30,10 @@ options: default: 'no' repository: description: - - Name of the custom repository to register. + - Name of the custom repository to register or use. url: description: - - URL of the custom repository. + - URL of the custom repository to register. state: description: - If C(present) a new module is installed. @@ -61,6 +61,12 @@ EXAMPLES = ''' url: https://myrepo.com state: present +- name: Add a powershell module from a specific repository + win_psmodule: + name: PowershellModule + repository: MyRepository + state: present + - name: Remove a powershell module win_psmodule: name: PowershellModule diff --git a/test/integration/targets/win_psmodule/defaults/main.yml b/test/integration/targets/win_psmodule/defaults/main.yml index 40f6f720fa..fbfdf97cce 100644 --- a/test/integration/targets/win_psmodule/defaults/main.yml +++ b/test/integration/targets/win_psmodule/defaults/main.yml @@ -3,3 +3,5 @@ powershell_module: powershell-yaml wrong_module: powershell_yaml allow_clobber_module: PowerShellCookbook +custom_repo_path: C:\_repo +custom_repo_name: PSRegisterRepo diff --git a/test/integration/targets/win_psmodule/tasks/test.yml b/test/integration/targets/win_psmodule/tasks/test.yml index 40f73eacc6..b74ab4fa64 100644 --- a/test/integration/targets/win_psmodule/tasks/test.yml +++ b/test/integration/targets/win_psmodule/tasks/test.yml @@ -132,5 +132,76 @@ - "module_uninstall_2 is not changed" - "module_uninstall_3 is changed" +- name: Create repository path + win_file: + path: "{{custom_repo_path}}" + state: directory + +- name: Make sure sample module is uninstalled + win_psmodule: + name: "{{ powershell_module }}" + state: absent + register: module_uninstall_4 + +- name: Copy some module to custom repo + win_shell: | + + # Need PSGet 1.6.0 for publishing and named repo usage + $psg = [PSCustomObject]@{ n="PowerShellGet"; v="1.6.0"}; + Remove-Module -Name $psg.n -Force -EA SilentlyContinue; + Import-PackageProvider -Name $psg.n -RequiredVersion $psg.v -EV missingProvider -Force | Out-Null; + + if($missingProvider){ + Install-PackageProvider -Name $psg.n -RequiredVersion $psg.v -Confirm:$false -Force | Out-Null; - \ No newline at end of file + # Unload previous version + Remove-Module -Name $psg.n -Force -EA SilentlyContinue; + Import-PackageProvider -Name $psg.n -RequiredVersion $psg.v -Force | Out-Null; + } + + $modName = "{{powershell_module}}"; + $temp = $env:Temp; + + Save-Module -Name $modName -Repository PSGallery -Path $temp | Out-Null; + + $repoName = "{{custom_repo_name}}"; + $repoPath = "{{custom_repo_path}}"; + + if(!(Test-Path $repoPath)){ + New-Item -Type Directory $repoPath -Force | Out-Null; + } + + Register-PSRepository -Name $repoName -SourceLocation $repoPath -InstallationPolicy Trusted | Out-Null; + + Publish-Module -Path "$temp\\$modName" -Repository $repoName -Force -Confirm:$false | Out-Null; + Get-ChildItem "$repoPath\\*" | ? Name -match "$modName.*.nupkg" | % Name; + + register: saved_package + +- name: Validate sample module in custom repo + assert: + that: + - "powershell_module in (saved_package.stdout_lines | last)" + +- name: Install module from custom Powershell repository + win_psmodule: + name: "{{ powershell_module }}" + state: present + repository: "{{custom_repo_name}}" + url: "{{custom_repo_path}}" + register: module_from_custom_repo + +- name: Test custom Powershell repository module install + assert: + that: + - "module_from_custom_repo is changed" + - "module_from_custom_repo.output == 'Module {{ powershell_module }} installed'" + +- name: Verify module was installed from custom repo + win_shell: (Get-InstalledModule -Name "{{powershell_module}}").Repository + register: is_package_customrepo + +- name: Validate sample module is installed from custom repo + assert: + that: + - "is_package_customrepo.stdout_lines[0] == custom_repo_name"