/
partitioner.go
132 lines (110 loc) · 2.89 KB
/
partitioner.go
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
130
131
132
package disk
import (
"fmt"
"strings"
"strconv"
boshsys "github.com/cloudfoundry/bosh-utils/system"
)
type Partitioner struct {
Runner boshsys.CmdRunner
}
func (p *Partitioner) GetCountOnDisk(diskNumber string) (string, error) {
getCountCommand := fmt.Sprintf(
"Get-Disk -Number %s | Select -ExpandProperty NumberOfPartitions",
diskNumber,
)
getCountCommandArgs := strings.Split(getCountCommand, " ")
stdout, _, _, err := p.Runner.RunCommand(
getCountCommandArgs[0],
getCountCommandArgs[1:]...,
)
if err != nil {
return "", fmt.Errorf("failed to get existing partition count for disk %s: %s", diskNumber, err)
}
return strings.TrimSpace(stdout), nil
}
func (p *Partitioner) GetFreeSpaceOnDisk(diskNumber string) (int, error) {
getFreeSpaceCommand := fmt.Sprintf(
"Get-Disk %s | Select -ExpandProperty LargestFreeExtent",
diskNumber,
)
getFreeSpaceCommandArgs := strings.Split(getFreeSpaceCommand, " ")
stdout, _, _, err := p.Runner.RunCommand(
getFreeSpaceCommandArgs[0],
getFreeSpaceCommandArgs[1:]...,
)
if err != nil {
return 0, fmt.Errorf("failed to find free space on disk %s: %s", diskNumber, err)
}
stdoutTrimmed := strings.TrimSpace(stdout)
freeSpace, err := strconv.Atoi(stdoutTrimmed)
if err != nil {
return 0, fmt.Errorf(
"Failed to convert output of \"%s\" command in to number. Output was: \"%s\"",
getFreeSpaceCommand,
stdoutTrimmed,
)
}
return freeSpace, nil
}
func (p *Partitioner) InitializeDisk(diskNumber string) error {
_, _, _, err := p.Runner.RunCommand("Initialize-Disk", "-Number", diskNumber, "-PartitionStyle", "GPT")
if err != nil {
return fmt.Errorf("failed to initialize disk %s: %s", diskNumber, err.Error())
}
return nil
}
func (p *Partitioner) PartitionDisk(diskNumber string) (string, error) {
stdout, _, _, err := p.Runner.RunCommand(
"New-Partition",
"-DiskNumber",
diskNumber,
"-UseMaximumSize",
"|",
"Select",
"-ExpandProperty",
"PartitionNumber",
)
if err != nil {
return "", fmt.Errorf("failed to create partition on disk %s: %s", diskNumber, err)
}
return strings.TrimSpace(stdout), nil
}
func (p *Partitioner) AssignDriveLetter(diskNumber, partitionNumber string) (string, error) {
_, _, _, err := p.Runner.RunCommand(
"Add-PartitionAccessPath",
"-DiskNumber",
diskNumber,
"-PartitionNumber",
partitionNumber,
"-AssignDriveLetter",
)
if err != nil {
return "", fmt.Errorf(
"failed to add partition access path to partition %s on disk %s: %s",
partitionNumber,
diskNumber,
err,
)
}
stdout, _, _, err := p.Runner.RunCommand(
"Get-Partition",
"-DiskNumber",
diskNumber,
"-PartitionNumber",
partitionNumber,
"|",
"Select",
"-ExpandProperty",
"DriveLetter",
)
if err != nil {
return "", fmt.Errorf(
"failed to find drive letter for partition %s on disk %s: %s",
partitionNumber,
diskNumber,
err,
)
}
return strings.TrimSpace(stdout), nil
}