summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/windows/win_data_deduplication.ps1
blob: 593ee763815ba56d8ecbb62fd4a3e26b95e4486b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!powershell

# Copyright: 2019, rnsc(@rnsc) <github@rnsc.be>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt

#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -OSVersion 6.3

$spec = @{
    options = @{
        drive_letter = @{ type = "str"; required = $true }
        state = @{ type = "str"; choices = "absent", "present"; default = "present"; }
        settings = @{
            type = "dict"
            required = $false
            options = @{
                minimum_file_size = @{ type = "int"; default = 32768 }
                minimum_file_age_days = @{ type = "int"; default = 2 }
                no_compress = @{ type = "bool"; required = $false; default = $false }
                optimize_in_use_files = @{ type = "bool"; required = $false; default = $false }
                verify = @{ type = "bool"; required = $false; default = $false }
            }
        }
    }
    supports_check_mode = $true
}

$module = [Ansible.Basic.AnsibleModule]::Create($args, $spec)

$drive_letter = $module.Params.drive_letter
$state = $module.Params.state
$settings = $module.Params.settings

$module.Result.changed = $false
$module.Result.reboot_required = $false
$module.Result.msg = ""

function Set-DataDeduplication($volume, $state, $settings, $dedup_job) {

  $current_state = 'absent'

  try {
    $dedup_info = Get-DedupVolume -Volume "$($volume.DriveLetter):"
  } catch {
    $dedup_info = $null
  }

  if ($dedup_info.Enabled) {
    $current_state = 'present'
  }

  if ( $state -ne $current_state ) {
    if( -not $module.CheckMode) {
      if($state -eq 'present') {
        # Enable-DedupVolume -Volume <String>
        Enable-DedupVolume -Volume "$($volume.DriveLetter):"
      } elseif ($state -eq 'absent') {
        Disable-DedupVolume -Volume "$($volume.DriveLetter):"
      }
    }
    $module.Result.changed = $true
  }

  if ($state -eq 'present') {
    if ($null -ne $settings) {
      Set-DataDedupJobSettings -volume $volume -settings $settings
    }
  }
}

function Set-DataDedupJobSettings ($volume, $settings) {

  try {
    $dedup_info = Get-DedupVolume -Volume "$($volume.DriveLetter):"
  } catch {
    $dedup_info = $null
  }

  ForEach ($key in $settings.keys) {

    # See Microsoft documentation:
    # https://docs.microsoft.com/en-us/powershell/module/deduplication/set-dedupvolume?view=win10-ps

    $update_key = $key
    $update_value = $settings.$($key)
    # Transform Ansible style options to Powershell params
    $update_key = $update_key -replace('_', '')

    if ($update_key -eq "MinimumFileSize" -and $update_value -lt 32768) {
      $update_value = 32768
    }

    $current_value = ($dedup_info | Select-Object -ExpandProperty $update_key)

    if ($update_value -ne $current_value) {
      $command_param = @{
        $($update_key) = $update_value
      }

      # Set-DedupVolume -Volume <String>`
      #                 -NoCompress <bool> `
      #                 -MinimumFileAgeDays <UInt32> `
      #                 -MinimumFileSize <UInt32> (minimum 32768)
      if( -not $module.CheckMode ) {
        Set-DedupVolume -Volume "$($volume.DriveLetter):" @command_param
      }

      $module.Result.changed = $true
    }
  }

}

# Install required feature
$feature_name = "FS-Data-Deduplication"
if( -not $module.CheckMode) {
  $feature = Install-WindowsFeature -Name $feature_name

  if ($feature.RestartNeeded -eq 'Yes') {
    $module.Result.reboot_required = $true
    $module.FailJson("$feature_name was installed but requires Windows to be rebooted to work.")
  }
}

$volume = Get-Volume -DriveLetter $drive_letter

Set-DataDeduplication -volume $volume -state $state -settings $settings -dedup_job $dedup_job

$module.ExitJson()