1 #!powershell
2
3 # Copyright: (c) 2019, Brant Evans <bevans@redhat.com>
4 # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
6 #AnsibleRequires -CSharpUtil Ansible.Basic
7 #AnsibleRequires -OSVersion 6.2
8
9 Set-StrictMode -Version 2
10
11 $spec = @{
12 options = @{
13 disk_number = @{ type = "int" }
14 uniqueid = @{ type = "str" }
15 path = @{ type = "str" }
16 style = @{ type = "str"; choices = "gpt", "mbr"; default = "gpt" }
17 online = @{ type = "bool"; default = $true }
18 force = @{ type = "bool"; default = $false }
19 }
20 mutually_exclusive = @(
21 ,@('disk_number', 'uniqueid', 'path')
22 )
23 required_one_of = @(
24 ,@('disk_number', 'uniqueid', 'path')
25 )
26 supports_check_mode = $true
27 }
28
29 $module = [Ansible.Basic.AnsibleModule]::Create($args, $spec)
30
31 $disk_number = $module.Params.disk_number
32 $uniqueid = $module.Params.uniqueid
33 $path = $module.Params.path
34 $partition_style = $module.Params.style
35 $bring_online = $module.Params.online
36 $force_init = $module.Params.force
37
Get-AnsibleDisknull38 function Get-AnsibleDisk {
39 param(
40 $DiskNumber,
41 $UniqueId,
42 $Path
43 )
44
45 if ($null -ne $DiskNumber) {
46 try {
47 $disk = Get-Disk -Number $DiskNumber
48 } catch {
49 $module.FailJson("There was an error retrieving the disk using disk_number $($DiskNumber): $($_.Exception.Message)")
50 }
51 } elseif ($null -ne $UniqueId) {
52 try {
53 $disk = Get-Disk -UniqueId $UniqueId
54 } catch {
55 $module.FailJson("There was an error retrieving the disk using id $($UniqueId): $($_.Exception.Message)")
56 }
57 } elseif ($null -ne $Path) {
58 try {
59 $disk = Get-Disk -Path $Path
60 } catch {
61 $module.FailJson("There was an error retrieving the disk using path $($Path): $($_.Exception.Message)")
62 }
63 } else {
64 $module.FailJson("Unable to retrieve disk: disk_number, id, or path was not specified")
65 }
66
67 return $disk
68 }
69
Initialize-AnsibleDisk()70 function Initialize-AnsibleDisk {
71 param(
72 $AnsibleDisk,
73 $PartitionStyle
74 )
75
76 if ($AnsibleDisk.IsReadOnly) {
77 $module.FailJson("Unable to initialize disk as it is read-only")
78 }
79
80 $parameters = @{
81 Number = $AnsibleDisk.Number
82 PartitionStyle = $PartitionStyle
83 }
84
85 if (-Not $module.CheckMode) {
86 Initialize-Disk @parameters -Confirm:$false
87 }
88
89 $module.Result.changed = $true
90 }
91
Clear-AnsibleDisknull92 function Clear-AnsibleDisk {
93 param(
94 $AnsibleDisk
95 )
96
97 $parameters = @{
98 Number = $AnsibleDisk.Number
99 }
100
101 if (-Not $module.CheckMode) {
102 Clear-Disk @parameters -RemoveData -RemoveOEM -Confirm:$false
103 }
104 }
105
Set-AnsibleDisknull106 function Set-AnsibleDisk {
107 param(
108 $AnsibleDisk,
109 $BringOnline
110 )
111
112 $refresh_disk_status = $false
113
114 if ($BringOnline) {
115 if (-Not $module.CheckMode) {
116 if ($AnsibleDisk.IsOffline) {
117 Set-Disk -Number $AnsibleDisk.Number -IsOffline:$false
118 $refresh_disk_status = $true
119 }
120
121 if ($AnsibleDisk.IsReadOnly) {
122 Set-Disk -Number $AnsibleDisk.Number -IsReadOnly:$false
123 $refresh_disk_status = $true
124 }
125 }
126 }
127
128 if ($refresh_disk_status) {
129 $AnsibleDisk = Get-AnsibleDisk -DiskNumber $AnsibleDisk.Number
130 }
131
132 return $AnsibleDisk
133 }
134
135 $ansible_disk = Get-AnsibleDisk -DiskNumber $disk_number -UniqueId $uniqueid -Path $path
136 $ansible_part_style = $ansible_disk.PartitionStyle
137
138 if ("RAW" -eq $ansible_part_style) {
139 $ansible_disk = Set-AnsibleDisk -AnsibleDisk $ansible_disk -BringOnline $bring_online
140 Initialize-AnsibleDisk -AnsibleDisk $ansible_disk -PartitionStyle $partition_style
141 } else {
142 if (($ansible_part_style -ne $partition_style.ToUpper()) -And -Not $force_init) {
143 $module.FailJson("Force initialization must be specified since the target partition style: $($partition_style.ToLower()) is different from the current partition style: $($ansible_part_style.ToLower())")
144 } elseif ($force_init) {
145 $ansible_disk = Set-AnsibleDisk -AnsibleDisk $ansible_disk -BringOnline $bring_online
146 Clear-AnsibleDisk -AnsibleDisk $ansible_disk
147 if ( $bring_online ) { Initialize-AnsibleDisk -AnsibleDisk $ansible_disk -PartitionStyle $partition_style }
148 }
149 }
150
151 $module.ExitJson()
152