Skip to content

Commit fd3e88e

Browse files
committed
cr comments, updates
1 parent 1bc9e81 commit fd3e88e

File tree

22 files changed

+1221
-717
lines changed

22 files changed

+1221
-717
lines changed

client/api/disk/v1beta1/api.pb.go

Lines changed: 444 additions & 629 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/api/disk/v1beta1/api.proto

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ service Disk {
1818

1919
// ListDiskIDs returns a map of DiskID objects where the key is the disk number
2020
rpc ListDiskIDs(ListDiskIDsRequest) returns (ListDiskIDsResponse) {}
21+
22+
rpc DiskStats(DiskStatsRequest) returns (DiskStatsResponse) {}
2123
}
2224

2325
message ListDiskLocationsRequest {
@@ -66,3 +68,13 @@ message ListDiskIDsResponse {
6668
// Map of disk device numbers and IDs <page83> associated with each disk device
6769
map <string, DiskIDs> diskIDs = 1;
6870
}
71+
72+
message DiskStatsRequest {
73+
// Disk device ID of the disk to get the size from
74+
string diskID = 1;
75+
}
76+
77+
message DiskStatsResponse {
78+
//Total size of the volume
79+
int64 diskSize = 1;
80+
}

client/api/volume/v1beta1/api.pb.go

Lines changed: 282 additions & 46 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/api/volume/v1beta1/api.proto

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,68 +20,102 @@ service Volume {
2020
rpc ResizeVolume(ResizeVolumeRequest) returns (ResizeVolumeResponse) {}
2121
// VolumeStats gathers DiskSize, VolumeSize and VolumeUsedSize for a volume
2222
rpc VolumeStats(VolumeStatsRequest) returns (VolumeStatsResponse) {}
23+
// GetVolumeDiskNumber gets the disk number of the disk where the volume is located
24+
rpc GetVolumeDiskNumber(VolumeDiskNumberRequest) returns (VolumeDiskNumberResponse) {}
25+
// GetVolumeIDFromMount gets the volume id for a given mount
26+
rpc GetVolumeIDFromMount(VolumeIDFromMountRequest) returns (VolumeIDFromMountResponse) {}
2327
}
28+
2429
message ListVolumesOnDiskRequest {
2530
// Disk device ID of the disk to query for volumes
2631
string disk_id = 1;
2732
}
33+
2834
message ListVolumesOnDiskResponse {
2935
// Volume device IDs of volumes on the specified disk
3036
repeated string volume_ids = 1;
3137
}
38+
3239
message MountVolumeRequest {
3340
// Volume device ID of the volume to mount
3441
string volume_id = 1;
3542
// Path in the host's file system where the volume needs to be mounted
3643
string path = 2;
3744
}
45+
3846
message MountVolumeResponse {
3947
// Intentionally empty
4048
}
49+
4150
message DismountVolumeRequest {
4251
// Volume device ID of the volume to dismount
4352
string volume_id = 1;
4453
// Path where the volume has been mounted.
4554
string path = 2;
4655
}
56+
4757
message DismountVolumeResponse {
4858
// Intentionally empty
4959
}
60+
5061
message IsVolumeFormattedRequest {
5162
// Volume device ID of the volume to check
5263
string volume_id = 1;
5364
}
65+
5466
message IsVolumeFormattedResponse {
5567
// Is the volume formatted with NTFS
5668
bool formatted = 1;
5769
}
70+
5871
message FormatVolumeRequest {
5972
// Volume device ID of the volume to format
6073
string volume_id = 1;
6174
}
75+
6276
message FormatVolumeResponse {
6377
// Intentionally empty
6478
}
79+
6580
message ResizeVolumeRequest {
6681
// Volume device ID of the volume to dismount
6782
string volume_id = 1;
6883
// New size of the volume
6984
int64 size = 2;
7085
}
86+
7187
message ResizeVolumeResponse {
7288
// Intentionally empty
7389
}
7490

7591
message VolumeStatsRequest{
76-
// Volume device Id of the volume to dismount
92+
// Volume device Id of the volume to get the stats for
7793
string volume_id = 1;
7894
}
7995

8096
message VolumeStatsResponse{
81-
//Total size of the volume
82-
int64 diskSize = 1;
83-
//Capacity of the volume
84-
int64 volumeSize = 2;
85-
//Used bytes
86-
int64 volumeUsedSize = 3;
87-
}
97+
// Capacity of the volume
98+
int64 volumeSize = 1;
99+
// Used bytes
100+
int64 volumeUsedSize = 2;
101+
}
102+
103+
message VolumeDiskNumberRequest{
104+
// Volume device Id of the volume to get the disk number for
105+
string volume_id = 1;
106+
}
107+
108+
message VolumeDiskNumberResponse{
109+
// Corresponding disk number
110+
int64 diskNumber = 1;
111+
}
112+
113+
message VolumeIDFromMountRequest {
114+
// Mount
115+
string mount = 1;
116+
}
117+
118+
message VolumeIDFromMountResponse {
119+
// Mount
120+
string volume_id = 1;
121+
}

client/groups/disk/v1beta1/client_generated.go

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/groups/volume/v1beta1/client_generated.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

integrationtests/volume_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import (
99
"testing"
1010
"time"
1111

12+
diskv1beta1 "github.com/kubernetes-csi/csi-proxy/client/api/disk/v1beta1"
1213
"github.com/kubernetes-csi/csi-proxy/client/api/volume/v1alpha1"
1314
"github.com/kubernetes-csi/csi-proxy/client/api/volume/v1beta1"
15+
diskv1beta1client "github.com/kubernetes-csi/csi-proxy/client/groups/disk/v1beta1"
1416
v1alpha1client "github.com/kubernetes-csi/csi-proxy/client/groups/volume/v1alpha1"
1517
v1beta1client "github.com/kubernetes-csi/csi-proxy/client/groups/volume/v1beta1"
1618
)
@@ -228,6 +230,7 @@ func negativeDiskTests(t *testing.T) {
228230
func simpleE2e(t *testing.T) {
229231
var client *v1alpha1client.Client
230232
var betaClient *v1beta1client.Client
233+
var diskBetaClient *diskv1beta1client.Client
231234
var err error
232235

233236
if client, err = v1alpha1client.NewClient(); err != nil {
@@ -240,6 +243,11 @@ func simpleE2e(t *testing.T) {
240243
}
241244
defer betaClient.Close()
242245

246+
if diskBetaClient, err = diskv1beta1client.NewClient(); err != nil {
247+
t.Fatalf("DiskBetaClient new error: %v", err)
248+
}
249+
defer diskBetaClient.Close()
250+
243251
s1 := rand.NewSource(time.Now().UTC().UnixNano())
244252
r1 := rand.New(s1)
245253

@@ -327,6 +335,30 @@ func simpleE2e(t *testing.T) {
327335
t.Fatalf("VolumeSize reported is not smaller after resize, it is %v", volumeStatsResponse.VolumeSize)
328336
}
329337

338+
volumeDiskNumberRequest := &v1beta1.VolumeDiskNumberRequest{
339+
VolumeId: volumeID,
340+
}
341+
342+
volumeDiskNumberResponse, err := betaClient.GetVolumeDiskNumber(context.TODO(), volumeDiskNumberRequest)
343+
if err != nil {
344+
t.Fatalf("GetVolumeDiskNumber failed: %v", err)
345+
}
346+
347+
diskNumberString := fmt.Sprintf("%d", volumeDiskNumberResponse.DiskNumber)
348+
349+
diskStatsRequest := &diskv1beta1.DiskStatsRequest{
350+
DiskID: diskNumberString,
351+
}
352+
353+
diskStatsResponse, err := diskBetaClient.DiskStats(context.TODO(), diskStatsRequest)
354+
if err != nil {
355+
t.Fatalf("DiskStats request error: %v", err)
356+
}
357+
358+
if diskStatsResponse.DiskSize < 0 {
359+
t.Fatalf("Invalid disk size was returned %v", diskStatsResponse.DiskSize)
360+
}
361+
330362
// Mount the volume
331363
mountVolumeRequest := &v1alpha1.MountVolumeRequest{
332364
VolumeId: volumeID,

internal/os/disk/api.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"fmt"
88
"os/exec"
9+
"regexp"
910
"strconv"
1011
"strings"
1112
"syscall"
@@ -295,3 +296,25 @@ func (imp APIImplementor) ListDiskIDs() (map[string]shared.DiskIDs, error) {
295296

296297
return m, nil
297298
}
299+
300+
func (imp APIImplementor) DiskStats(diskID string) (int64, error) {
301+
cmd := fmt.Sprintf("(Get-Disk -Number %s).Size", diskID)
302+
out, err := exec.Command("powershell", "/c", cmd).CombinedOutput()
303+
if err != nil || len(out) == 0 {
304+
return -1, fmt.Errorf("error getting size of disk. cmd: %s, output: %s, error: %v", cmd, string(out), err)
305+
}
306+
307+
reg, err := regexp.Compile("[^0-9]+")
308+
if err != nil {
309+
return -1, fmt.Errorf("error compiling regex. err: %v", err)
310+
}
311+
diskSizeOutput := reg.ReplaceAllString(string(out), "")
312+
313+
diskSize, err := strconv.ParseInt(diskSizeOutput, 10, 64)
314+
315+
if err != nil {
316+
return -1, fmt.Errorf("error parsing size of disk. cmd: %s, output: %s, error: %v", cmd, diskSizeOutput, err)
317+
}
318+
319+
return diskSize, nil
320+
}

internal/os/volume/api.go

Lines changed: 88 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -84,48 +84,57 @@ func (VolAPIImplementor) DismountVolume(volumeID, path string) error {
8484
func (VolAPIImplementor) ResizeVolume(volumeID string, size int64) error {
8585
// TODO: Check the size of the resize
8686
// TODO: We have to get the right partition.
87-
cmd := fmt.Sprintf("Get-Volume -UniqueId \"%s\" | Get-partition | Resize-Partition -Size %d", volumeID, size)
87+
cmd := fmt.Sprintf("Get-Volume -UniqueId \"%s\" | Get-partition | Get-PartitionSupportedSize | Select SizeMin,SizeMax | ConvertTo-Json", volumeID)
8888
out, err := runExec(cmd)
89+
90+
if err != nil || len(out) == 0 {
91+
return fmt.Errorf("error getting sizemin,sizemax from mount. cmd: %s, output: %s, error: %v", cmd, string(out), err)
92+
}
93+
94+
var getVolumeSizing map[string]int64
95+
outString := string(out)
96+
err = json.Unmarshal([]byte(outString), &getVolumeSizing)
8997
if err != nil {
90-
return fmt.Errorf("error resizing volume. cmd: %s, output: %s, error: %v", cmd, string(out), err)
98+
return fmt.Errorf("out %v outstring %v err %v", out, outString, err)
9199
}
92-
return nil
93-
}
94100

95-
// VolumeStats - resize the volume to the size specified as parameter.
96-
func (VolAPIImplementor) VolumeStats(volumeID string) (int64, int64, int64, error) {
101+
sizeMin := getVolumeSizing["SizeMin"]
102+
sizeMax := getVolumeSizing["SizeMax"]
97103

98-
//first get the disk size where the volume resides
99-
cmd := fmt.Sprintf("(Get-Volume -UniqueId \"%s\" | Get-partition | Get-Disk).Size", volumeID)
100-
out, err := runExec(cmd)
101-
if err != nil || len(out) == 0 {
102-
return -1, -1, -1, fmt.Errorf("error getting size of disk. cmd: %s, output: %s, error: %v", cmd, string(out), err)
104+
//if the size is too small then fail here
105+
if size < sizeMin {
106+
return fmt.Errorf("size %v is below the minimum %v allowed for the volume", size, sizeMin)
103107
}
104108

105-
reg, err := regexp.Compile("[^0-9]+")
106-
if err != nil {
107-
return -1, -1, -1, fmt.Errorf("error compiling regex. err: %v", err)
109+
//if the size is greater than sizeMax but within 10% it might be due to overhead, change size to sizeMax
110+
//otherwise let size go through, it will fail the resize operation
111+
if (size > sizeMax) && (float64(size) < float64(float64(sizeMax)*float64(1.1))) {
112+
size = sizeMax
108113
}
109-
diskSizeOutput := reg.ReplaceAllString(string(out), "")
110114

111-
diskSize, err := strconv.ParseInt(diskSizeOutput, 10, 64)
115+
cmd = fmt.Sprintf("Get-Volume -UniqueId \"%s\" | Get-partition | Resize-Partition -Size %d", volumeID, size)
116+
out, err = runExec(cmd)
112117
if err != nil {
113-
return -1, -1, -1, fmt.Errorf("error parsing size of disk. cmd: %s, output: %s, error: %v", cmd, diskSizeOutput, err)
118+
return fmt.Errorf("error resizing volume. cmd: %s, output: %s size:%v, sizeMax %v, error: %v", cmd, string(out), size, sizeMax, err)
114119
}
120+
return nil
121+
}
115122

116-
// secondly, get the size and sizeRemaining for the volume
117-
cmd = fmt.Sprintf("(Get-Volume -UniqueId \"%s\" | Select SizeRemaining,Size) | ConvertTo-Json", volumeID)
118-
out, err = runExec(cmd)
123+
// VolumeStats - resize the volume to the size specified as parameter.
124+
func (VolAPIImplementor) VolumeStats(volumeID string) (int64, int64, error) {
125+
// get the size and sizeRemaining for the volume
126+
cmd := fmt.Sprintf("(Get-Volume -UniqueId \"%s\" | Select SizeRemaining,Size) | ConvertTo-Json", volumeID)
127+
out, err := runExec(cmd)
119128

120129
if err != nil {
121-
return -1, -1, -1, fmt.Errorf("error getting capacity and used size of volume. cmd: %s, output: %s, error: %v", cmd, string(out), err)
130+
return -1, -1, fmt.Errorf("error getting capacity and used size of volume. cmd: %s, output: %s, error: %v", cmd, string(out), err)
122131
}
123132

124133
var getVolume map[string]int64
125134
outString := string(out)
126135
err = json.Unmarshal([]byte(outString), &getVolume)
127136
if err != nil {
128-
return -1, -1, -1, fmt.Errorf("out %v outstring %v err %v", out, outString, err)
137+
return -1, -1, fmt.Errorf("out %v outstring %v err %v", out, outString, err)
129138
}
130139
var volumeSizeRemaining int64
131140
var volumeSize int64
@@ -134,5 +143,61 @@ func (VolAPIImplementor) VolumeStats(volumeID string) (int64, int64, int64, erro
134143
volumeSizeRemaining = getVolume["SizeRemaining"]
135144

136145
volumeUsedSize := volumeSize - volumeSizeRemaining
137-
return diskSize, volumeSize, volumeUsedSize, nil
146+
return volumeSizeRemaining, volumeUsedSize, nil
147+
}
148+
149+
// GetVolumeDiskNumber - gets the disk number where the volume is.
150+
func (VolAPIImplementor) GetVolumeDiskNumber(volumeID string) (int64, error) {
151+
// get the size and sizeRemaining for the volume
152+
cmd := fmt.Sprintf("(Get-Volume -UniqueId \"%s\" | Get-Partition).DiskNumber", volumeID)
153+
out, err := runExec(cmd)
154+
155+
if err != nil || len(out) == 0 {
156+
return -1, fmt.Errorf("error getting disk number. cmd: %s, output: %s, error: %v", cmd, string(out), err)
157+
}
158+
159+
reg, err := regexp.Compile("[^0-9]+")
160+
if err != nil {
161+
return -1, fmt.Errorf("error compiling regex. err: %v", err)
162+
}
163+
diskNumberOutput := reg.ReplaceAllString(string(out), "")
164+
165+
diskNumber, err := strconv.ParseInt(diskNumberOutput, 10, 64)
166+
167+
if err != nil {
168+
return -1, fmt.Errorf("error parsing disk number. cmd: %s, output: %s, error: %v", cmd, diskNumberOutput, err)
169+
}
170+
171+
return diskNumber, nil
172+
}
173+
174+
// GetVolumeIDFromMount - gets the volume ID given a mount point
175+
func (VolAPIImplementor) GetVolumeIDFromMount(mount string) (string, error) {
176+
// get the size and sizeRemaining for the volume
177+
cmd := fmt.Sprintf("Get-Item -LiteralPath \"%s\" | Select Target | ConvertTo-Json", mount)
178+
out, err := runExec(cmd)
179+
180+
if err != nil || len(out) == 0 {
181+
return "", fmt.Errorf("error getting volume from mount. cmd: %s, output: %s, error: %v", cmd, string(out), err)
182+
}
183+
184+
var getVolume map[string][]string
185+
outString := string(out)
186+
err = json.Unmarshal([]byte(outString), &getVolume)
187+
if err != nil {
188+
return "", fmt.Errorf("out %v outstring %v err %v", out, outString, err)
189+
}
190+
var volumeString string
191+
192+
volumeString = getVolume["Target"][0]
193+
194+
volumeString = strings.TrimSuffix(volumeString, "\n")
195+
196+
if !strings.HasPrefix(volumeString, "Volume") {
197+
return "", fmt.Errorf("error getting the volume for the mount %s, received (%s), extracted %s", mount, outString, volumeString)
198+
}
199+
200+
volumeString = "\\\\?\\" + volumeString
201+
202+
return volumeString, nil
138203
}

0 commit comments

Comments
 (0)