diff options
author | Jordan Borean <jborean93@gmail.com> | 2019-11-08 07:40:25 +1000 |
---|---|---|
committer | Matt Clay <matt@mystile.com> | 2019-11-07 13:40:25 -0800 |
commit | ab910e1f5a12fbf028d4d70d28dd7ec36427e602 (patch) | |
tree | 21c97735035d510cb96f06c983bbf0d60e05be95 | |
parent | 0b4b832f9cbab4246ec9aab7bd36c0447e04549d (diff) | |
download | ansible-ab910e1f5a12fbf028d4d70d28dd7ec36427e602.tar.gz |
win_psmodule - remove reliance on PSGallery in the tests for stable-2.7 (#64468)
* win_psmodule - remove reliance on PSGallery in the tests for stable-2.7
* Ignore non-powershell files from sanity check
11 files changed, 293 insertions, 145 deletions
diff --git a/test/integration/targets/win_psmodule/defaults/main.yml b/test/integration/targets/win_psmodule/defaults/main.yml deleted file mode 100644 index fbfdf97cce..0000000000 --- a/test/integration/targets/win_psmodule/defaults/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - -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/files/module/template.nuspec b/test/integration/targets/win_psmodule/files/module/template.nuspec new file mode 100644 index 0000000000..49fc53210f --- /dev/null +++ b/test/integration/targets/win_psmodule/files/module/template.nuspec @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> + <metadata> + <id>--- NAME ---</id> + <version>--- VERSION ---</version> + <authors>Ansible</authors> + <owners>Ansible</owners> + <requireLicenseAcceptance>false</requireLicenseAcceptance> + <description>Test for Ansible win_ps* modules</description> + <releaseNotes></releaseNotes> + <copyright>Copyright (c) 2019 Ansible, licensed under MIT.</copyright> + <tags>PSModule PSIncludes_Function PSFunction_--- FUNCTION --- PSCommand_--- FUNCTION ---</tags> + </metadata> +</package> diff --git a/test/integration/targets/win_psmodule/files/module/template.psd1 b/test/integration/targets/win_psmodule/files/module/template.psd1 new file mode 100644 index 0000000000..cd6709722b --- /dev/null +++ b/test/integration/targets/win_psmodule/files/module/template.psd1 @@ -0,0 +1,17 @@ +@{ + RootModule = '--- NAME ---.psm1' + ModuleVersion = '--- VERSION ---' + GUID = '--- GUID ---' + Author = 'Ansible' + Copyright = 'Copyright (c) 2019 Ansible, licensed under MIT.' + Description = "Test for Ansible win_ps* modules" + PowerShellVersion = '3.0' + FunctionsToExport = @( + "--- FUNCTION ---" + ) + PrivateData = @{ + PSData = @{ +--- PS_DATA --- + } + } +} diff --git a/test/integration/targets/win_psmodule/files/module/template.psm1 b/test/integration/targets/win_psmodule/files/module/template.psm1 new file mode 100644 index 0000000000..74c71a7eb7 --- /dev/null +++ b/test/integration/targets/win_psmodule/files/module/template.psm1 @@ -0,0 +1,9 @@ +Function --- FUNCTION --- { + return [PSCustomObject]@{ + Name = "--- NAME ---" + Version = "--- VERSION ---" + Repo = "--- REPO ---" + } +} + +Export-ModuleMember -Function --- FUNCTION --- diff --git a/test/integration/targets/win_psmodule/files/setup_modules.ps1 b/test/integration/targets/win_psmodule/files/setup_modules.ps1 new file mode 100644 index 0000000000..850ec053c5 --- /dev/null +++ b/test/integration/targets/win_psmodule/files/setup_modules.ps1 @@ -0,0 +1,57 @@ +$ErrorActionPreference = "Stop" + +$template_path = $args[0] +$template_manifest = Join-Path -Path $template_path -ChildPath template.psd1 +$template_script = Join-Path -Path $template_path -ChildPath template.psm1 +$template_nuspec = Join-Path -Path $template_path -ChildPath template.nuspec +$nuget_exe = Join-Path -Path $template_path -ChildPath nuget.exe + +$packages = @( + @{ name = "ansible-test1"; version = "1.0.0"; repo = "PSRepo 1"; function = "Get-AnsibleTest1" }, + @{ name = "ansible-clobber"; version = "1.0.0"; repo = "PSRepo 1"; function = "Enable-PSTrace" } +) + +foreach ($package in $packages) { + $tmp_dir = Join-Path -Path $template_path -ChildPath $package.name + if (Test-Path -Path $tmp_dir) { + Remove-Item -Path $tmp_dir -Force -Recurse + } + New-Item -Path $tmp_dir -ItemType Directory > $null + + try { + $ps_data = "" + $nuget_version = $package.version + + $manifest = [System.IO.File]::ReadAllText($template_manifest) + $manifest = $manifest.Replace('--- NAME ---', $package.name).Replace('--- VERSION ---', $package.version) + $manifest = $manifest.Replace('--- GUID ---', [Guid]::NewGuid()).Replace('--- FUNCTION ---', $package.function) + + $manifest = $manifest.Replace('--- PS_DATA ---', $ps_data) + $manifest_path = Join-Path -Path $tmp_dir -ChildPath "$($package.name).psd1" + Set-Content -Path $manifest_path -Value $manifest + + $script = [System.IO.File]::ReadAllText($template_script) + $script = $script.Replace('--- NAME ---', $package.name).Replace('--- VERSION ---', $package.version) + $script = $script.Replace('--- REPO ---', $package.repo).Replace('--- FUNCTION ---', $package.function) + $script_path = Join-Path -Path $tmp_dir -ChildPath "$($package.name).psm1" + Set-Content -Path $script_path -Value $script + + # We should just be able to use Publish-Module but it fails when running over WinRM for older hosts and become + # does not fix this. It fails to respond to nuget.exe push errors when it canno find the .nupkg file. We will + # just manually do that ourselves. This also has the added benefit of being a lot quicker than Publish-Module + # which seems to take forever to publish the module. + $nuspec = [System.IO.File]::ReadAllText($template_nuspec) + $nuspec = $nuspec.Replace('--- NAME ---', $package.name).Replace('--- VERSION ---', $nuget_version) + $nuspec = $nuspec.Replace('--- FUNCTION ---', $package.function) + Set-Content -Path (Join-Path -Path $tmp_dir -ChildPath "$($package.name).nuspec") -Value $nuspec + + &$nuget_exe pack "$tmp_dir\$($package.name).nuspec" -outputdirectory $tmp_dir + + $repo_path = Join-Path -Path $template_path -ChildPath $package.repo + $nupkg_filename = "$($package.name).$($nuget_version).nupkg" + Copy-Item -Path (Join-Path -Path $tmp_dir -ChildPath $nupkg_filename) ` + -Destination (Join-Path -Path $repo_path -ChildPath $nupkg_filename) + } finally { + Remove-Item -Path $tmp_dir -Force -Recurse + } +} diff --git a/test/integration/targets/win_psmodule/handlers/main.yml b/test/integration/targets/win_psmodule/handlers/main.yml new file mode 100644 index 0000000000..2c1f6abe74 --- /dev/null +++ b/test/integration/targets/win_psmodule/handlers/main.yml @@ -0,0 +1,22 @@ +- name: delete temporary directory + win_file: + path: "{{ remote_tmp_dir }}" + state: absent + +- name: re-add PSGallery repository + win_shell: Register-PSRepository -Default -InstallationPolicy Untrusted + +- name: remove registered repo + win_shell: | + $name = 'PSRepo 1' + if ((Get-PSRepository -Name $name -ErrorAction SilentlyContinue)) { + Unregister-PSRepository -Name $name + } + +- name: remove test packages + win_psmodule: + name: '{{ item }}' + state: absent + loop: + - ansible-test1 + - ansible-clobber diff --git a/test/integration/targets/win_psmodule/tasks/install.yml b/test/integration/targets/win_psmodule/tasks/install.yml new file mode 100644 index 0000000000..3754f73c7b --- /dev/null +++ b/test/integration/targets/win_psmodule/tasks/install.yml @@ -0,0 +1,60 @@ +# Updates PackageManagement to the required version so the module won't try and talk to PSGallery +--- +- name: create the required folder for the nuget provider dll + win_file: + path: C:\Program Files\PackageManagement\ProviderAssemblies\nuget\2.8.5.208 + state: directory + +- name: download nuget provider dll + win_get_url: + url: https://ansible-ci-files.s3.amazonaws.com/test/integration/targets/setup_win_psget/Microsoft.PackageManagement.NuGetProvider-2.8.5.208.dll + dest: C:\Program Files\PackageManagement\ProviderAssemblies\nuget\2.8.5.208\Microsoft.PackageManagement.NuGetProvider.dll + +- name: get version and install location of PackageManagement and PowerShellGet + win_shell: | + $info = @{} + $modules = Get-Module -ListAvailable | Where-Object { + ($_.Name -eq "PackageManagement" -and $_.Version -lt "1.1.7") -or ` + ($_.Name -eq "PowerShellGet" -and $_.Version -lt "1.6.0") + } | ForEach-Object { + $module_version = switch($_.Name) { + PackageManagement { "1.1.7.0" } + PowerShellGet { "1.6.0" } + } + $module_info = @{ + install_path = ([System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($_.ModuleBase), $module_version)) + } + $info.($_.Name) = $module_info + } + ConvertTo-Json -InputObject $info -Compress + changed_when: False + register: installed_modules + +- name: register installed_modules info + set_fact: + installed_modules: '{{ installed_modules.stdout | trim | from_json }}' + +- name: update the PackageManagement and PowerShellGet versions + when: installed_modules.keys() | list | length > 0 + block: + - name: download newer PackageManagement and PowerShellGet nupkg + win_get_url: + url: '{{ item.url }}' + dest: '{{ remote_tmp_dir }}\{{ item.name }}.zip' # .zip is required for win_unzip + when: item.name in installed_modules + loop: + - name: PackageManagement + url: https://ansible-ci-files.s3.amazonaws.com/test/integration/targets/setup_win_psget/packagemanagement.1.1.7.nupkg + - name: PowerShellGet + url: https://ansible-ci-files.s3.amazonaws.com/test/integration/targets/setup_win_psget/powershellget.1.6.0.nupkg + + - name: extract new modules to correct location + win_unzip: + src: '{{ remote_tmp_dir }}\{{ item.name }}.zip' + dest: '{{ item.path }}' + when: item.path != "" + loop: + - name: PackageManagement + path: '{{ installed_modules.PackageManagement.install_path | default("") }}' + - name: PowerShellGet + path: '{{ installed_modules.PowerShellGet.install_path | default("") }}' diff --git a/test/integration/targets/win_psmodule/tasks/main.yml b/test/integration/targets/win_psmodule/tasks/main.yml index 7daa468550..5e094aec40 100644 --- a/test/integration/targets/win_psmodule/tasks/main.yml +++ b/test/integration/targets/win_psmodule/tasks/main.yml @@ -1,28 +1,29 @@ -# test code for the win_psmodule module when using winrm connection -# (c) 2017, Daniele Lazzari <lazzari@mailup.com> +--- +- name: get PowerShell version of the host + win_shell: $PSVersionTable.PSVersion.Major + changed_when: False + register: ps_version -# This file is part of Ansible -# -# Ansible is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Ansible is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Ansible. If not, see <http://www.gnu.org/licenses/>. +- name: setup and run tests block + when: ps_version.stdout | trim | int >= 5 + block: + - name: create temporary directory + win_tempfile: + state: directory + suffix: .test + register: remote_tmp_dir + notify: + - delete temporary directory + - name: record temporary directory + set_fact: + remote_tmp_dir: '{{ remote_tmp_dir.path }}' -- name: get facts - setup: + - name: update PSGet and PackageManagement for tests + include_tasks: install.yml -- name: Perform integration tests for Powershell 5+ - when: ansible_powershell_version >= 5 - block: + - name: setup local PSRepository with test modules + include_tasks: repo.yml - - name: run all tasks - include: test.yml + - name: test win_psmodule + include_tasks: test.yml diff --git a/test/integration/targets/win_psmodule/tasks/repo.yml b/test/integration/targets/win_psmodule/tasks/repo.yml new file mode 100644 index 0000000000..eeec141713 --- /dev/null +++ b/test/integration/targets/win_psmodule/tasks/repo.yml @@ -0,0 +1,60 @@ +# Sets up a local repo that contains mock packages for testing. +# +# PSRepo 1 contains +# ansible-test1 - 1.0.0 +# ansible-clobber - 1.0.0 +# +# These modules will have the following cmdlets +# ansible-test1 +# Get-AnsibleTest1 +# +# ansible-clobber +# Enable-PSTrace (clobbers the Enable-PSTrace cmdlet) +# +# All cmdlets return +# [PSCustomObject]@{ +# Name = "the name of the module" +# Version = "the version of the module" +# Repo = "the repo where the module was sourced from" +# } +--- +- name: create test repo folder + win_file: + path: '{{ remote_tmp_dir }}\PSRepo 1' + state: directory + +- name: register test repo + win_shell: | + $name = 'PSRepo 1' + $source_location = '{{ remote_tmp_dir }}\PSRepo 1' + if (-not (Get-PSRepository -Name $name -ErrorAction SilentlyContinue)) { + Register-PSRepository -Name $name -SourceLocation $source_location -InstallationPolicy Trusted + } + notify: remove registered repo + +- name: remove PSGallery repository + win_shell: | + if ((Get-PSRepository -Name 'PSGallery' -ErrorAction SilentlyContinue)) { + Unregister-PSRepository -Name 'PSGallery' + $true + } else { + $false + } + register: remove_gallery + changed_when: remove_gallery.stdout | trim | bool + notify: re-add PSGallery repository + +- name: copy across module template files + win_copy: + src: module/ + dest: '{{ remote_tmp_dir }}' + +# Used in the script below to create the .nupkg for each test module +- name: download NuGet binary for module publishing + win_get_url: + url: https://ansible-ci-files.s3.amazonaws.com/test/integration/targets/win_psmodule/nuget.exe + dest: '{{ remote_tmp_dir }}' + +- name: create test PowerShell modules + script: setup_modules.ps1 "{{ remote_tmp_dir }}" + notify: remove test packages diff --git a/test/integration/targets/win_psmodule/tasks/test.yml b/test/integration/targets/win_psmodule/tasks/test.yml index b74ab4fa64..5e33675d61 100644 --- a/test/integration/targets/win_psmodule/tasks/test.yml +++ b/test/integration/targets/win_psmodule/tasks/test.yml @@ -1,20 +1,24 @@ --- - -- name: install module from Powershell Gallery +- name: install module win_psmodule: - name: "{{ powershell_module }}" + name: ansible-test1 state: present register: module_setup +- name: test that module is installed + win_shell: Import-Module -Name ansible-test1; Get-AnsibleTest1 | ConvertTo-Json + register: module_setup_actual + - name: test Powershell Gallery module setup assert: that: - "module_setup is changed" - - "module_setup.output == 'Module {{ powershell_module }} installed'" + - "module_setup.output == 'Module ansible-test1 installed'" + - module_setup_actual.stdout | from_json == {"Name":"ansible-test1","Version":"1.0.0","Repo":"PSRepo 1"} - name: check idempotency reinstalling module win_psmodule: - name: "{{ powershell_module }}" + name: ansible-test1 state: present register: module_reinstall @@ -25,7 +29,7 @@ - name: check module install with allow_clobber not active win_psmodule: - name: "{{ allow_clobber_module }}" + name: ansible-clobber register: fail_allow_clobber ignore_errors: yes @@ -36,18 +40,23 @@ - name: check module install with allow_clobber active win_psmodule: - name: "{{ allow_clobber_module }}" + name: ansible-clobber allow_clobber: yes register: ok_allow_clobber +- name: get result of install with allow_clobber active + win_shell: Import-Module -Name ansible-clobber; Enable-PSTrace | ConvertTo-Json + register: ok_allow_clobber_actual + - name: test module install with allow_clobber active assert: that: - "ok_allow_clobber is changed" + - ok_allow_clobber_actual.stdout | from_json == {"Name":"ansible-clobber","Version":"1.0.0","Repo":"PSRepo 1"} - name: check wrong module install attempt - win_psmodule: - name: "{{ wrong_module }}" + win_psmodule: + name: fake_module state: present ignore_errors: yes register: module_fail @@ -59,7 +68,7 @@ - name: check fake custom ps repository registration attempt win_psmodule: - name: "{{ wrong_module }}" + name: fake_module repository: Fake repository url: http://my_fake_repo.com/repo/ ignore_errors: yes @@ -70,48 +79,26 @@ that: - "repo_fail is failed" -- name: check module is installed - win_shell: (Get-Module -Name {{ powershell_module }} -ListAvailable).Name - register: module_check - -- name: test module is installed - assert: - that: - - "module_check.stdout_lines[0] == '{{ powershell_module }}'" - -- name: check allow_clobber module is installed - win_shell: (Get-Module -Name {{ allow_clobber_module }} -ListAvailable).Name - register: allow_clobber_check - -- name: test allow_clobber module is installed - assert: - that: - - "allow_clobber_check.stdout_lines[0] == '{{ allow_clobber_module }}'" - - name: remove installed powershell module win_psmodule: - name: powershell-yaml + name: ansible-test1 state: absent register: module_uninstall +- name: get result of remove installed powershell module + win_shell: (Get-Module -ListAvailable -Name ansible-test1 | Measure-Object).Count + register: module_uninstall_actual + - name: test powershell module removal assert: that: - "module_uninstall is changed" - - "module_uninstall.output == 'Module {{ powershell_module }} removed'" - -- name: check module is uninstalled - win_shell: (Get-Module -Name {{ powershell_module }} -ListAvailable).Name - register: module_check - -- name: test module is no more present - assert: - that: - - "module_check.stdout == ''" + - "module_uninstall.output == 'Module ansible-test1 removed'" + - module_uninstall_actual.stdout | trim | int == 0 - name: check idempotency re-removing module win_psmodule: - name: "{{ powershell_module }}" + name: ansible-test1 state: absent register: module_uninstall_2 @@ -122,7 +109,7 @@ - name: check removing allow_clobber module win_psmodule: - name: "{{ allow_clobber_module }}" + name: ansible-clobber state: absent register: module_uninstall_3 @@ -131,77 +118,3 @@ that: - "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; - - # 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" diff --git a/test/sanity/pslint/skip.txt b/test/sanity/pslint/skip.txt index 12e84739a8..44b1e94a69 100644 --- a/test/sanity/pslint/skip.txt +++ b/test/sanity/pslint/skip.txt @@ -1 +1,3 @@ test/integration/targets/win_ping/library/win_ping_syntax_error.ps1 +test/integration/targets/win_psmodule/files/module/template.psd1 +test/integration/targets/win_psmodule/files/module/template.psm1 |