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