mirror of https://github.com/ansible/ansible.git
Windows: Add backup parameter to modules (#50033)
* Windows: Add backup parameter to modules This PR adds a backup infrastructure for modules. * Fixes based on review feedback * Various fixes to check-mode and backup * Add integration tests * Fix win_xml integration test * Add backup support to copy action plugin * Added integration tests * Improve test efficiencies and other minor impvpull/52906/head
parent
76b5a9fb52
commit
3d1dd0e599
@ -0,0 +1,33 @@
|
||||
# Copyright (c): 2018, Dag Wieers (@dagwieers) <dag@wieers.com>
|
||||
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
|
||||
|
||||
Function Backup-File {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Helper function to make a backup of a file.
|
||||
.EXAMPLE
|
||||
Backup-File -path $path -WhatIf:$check_mode
|
||||
#>
|
||||
[CmdletBinding(SupportsShouldProcess=$true)]
|
||||
|
||||
Param (
|
||||
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
|
||||
[string] $path
|
||||
)
|
||||
|
||||
Process {
|
||||
$backup_path = $null
|
||||
if (Test-Path -LiteralPath $path -PathType Leaf) {
|
||||
$backup_path = "$path.$pid." + [DateTime]::Now.ToString("yyyyMMdd-HHmmss") + ".bak";
|
||||
Try {
|
||||
Copy-Item -LiteralPath $path -Destination $backup_path
|
||||
} Catch {
|
||||
throw "Failed to create backup file '$backup_path' from '$path'. ($($_.Exception.Message))"
|
||||
}
|
||||
}
|
||||
return $backup_path
|
||||
}
|
||||
}
|
||||
|
||||
# This line must stay at the bottom to ensure all defined module parts are exported
|
||||
Export-ModuleMember -Function Backup-File
|
||||
@ -0,0 +1,89 @@
|
||||
#!powershell
|
||||
|
||||
# Copyright: (c) 2019, Dag Wieers (@dagwieers) <dag@wieers.com>
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
#AnsibleRequires -CSharpUtil Ansible.Basic
|
||||
#Requires -Module Ansible.ModuleUtils.Backup
|
||||
|
||||
$module = [Ansible.Basic.AnsibleModule]::Create($args, @{})
|
||||
|
||||
Function Assert-Equals {
|
||||
param(
|
||||
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][AllowNull()]$Actual,
|
||||
[Parameter(Mandatory=$true, Position=0)][AllowNull()]$Expected
|
||||
)
|
||||
|
||||
$matched = $false
|
||||
if ($Actual -is [System.Collections.ArrayList] -or $Actual -is [Array]) {
|
||||
$Actual.Count | Assert-Equals -Expected $Expected.Count
|
||||
for ($i = 0; $i -lt $Actual.Count; $i++) {
|
||||
$actual_value = $Actual[$i]
|
||||
$expected_value = $Expected[$i]
|
||||
Assert-Equals -Actual $actual_value -Expected $expected_value
|
||||
}
|
||||
$matched = $true
|
||||
} else {
|
||||
$matched = $Actual -ceq $Expected
|
||||
}
|
||||
|
||||
if (-not $matched) {
|
||||
if ($Actual -is [PSObject]) {
|
||||
$Actual = $Actual.ToString()
|
||||
}
|
||||
|
||||
$call_stack = (Get-PSCallStack)[1]
|
||||
$module.Result.test = $test
|
||||
$module.Result.actual = $Actual
|
||||
$module.Result.expected = $Expected
|
||||
$module.Result.line = $call_stack.ScriptLineNumber
|
||||
$module.Result.method = $call_stack.Position.Text
|
||||
$module.FailJson("AssertionError: actual != expected")
|
||||
}
|
||||
}
|
||||
|
||||
$tmp_dir = $module.Tmpdir
|
||||
|
||||
$tests = @{
|
||||
"Test backup file with missing file" = {
|
||||
$actual = Backup-File -path (Join-Path -Path $tmp_dir -ChildPath "missing")
|
||||
$actual | Assert-Equals -Expected $null
|
||||
}
|
||||
|
||||
"Test backup file in check mode" = {
|
||||
$orig_file = Join-Path -Path $tmp_dir -ChildPath "file-check.txt"
|
||||
Set-Content -Path $orig_file -Value "abc"
|
||||
$actual = Backup-File -path $orig_file -WhatIf
|
||||
|
||||
(Test-Path -LiteralPath $actual) | Assert-Equals -Expected $false
|
||||
|
||||
$parent_dir = Split-Path -Path $actual
|
||||
$backup_file = Split-Path -Path $actual -Leaf
|
||||
$parent_dir | Assert-Equals -Expected $tmp_dir
|
||||
($backup_file -match "^file-check\.txt\.$pid\.\d{8}-\d{6}\.bak$") | Assert-Equals -Expected $true
|
||||
}
|
||||
|
||||
"Test backup file" = {
|
||||
$content = "abc"
|
||||
$orig_file = Join-Path -Path $tmp_dir -ChildPath "file.txt"
|
||||
Set-Content -Path $orig_file -Value $content
|
||||
$actual = Backup-File -path $orig_file
|
||||
|
||||
(Test-Path -LiteralPath $actual) | Assert-Equals -Expected $true
|
||||
|
||||
$parent_dir = Split-Path -Path $actual
|
||||
$backup_file = Split-Path -Path $actual -Leaf
|
||||
$parent_dir | Assert-Equals -Expected $tmp_dir
|
||||
($backup_file -match "^file\.txt\.$pid\.\d{8}-\d{6}\.bak$") | Assert-Equals -Expected $true
|
||||
(Get-Content -Path $actual -Raw) | Assert-Equals -Expected "$content`r`n"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($test_impl in $tests.GetEnumerator()) {
|
||||
$test = $test_impl.Key
|
||||
&$test_impl.Value
|
||||
}
|
||||
|
||||
$module.Result.res = 'success'
|
||||
|
||||
$module.ExitJson()
|
||||
Loading…
Reference in New Issue