Skip to content

Commit 3c5fc2c

Browse files
committed
Update imports (generated through csi-proxy-api-gen)
1 parent 90cf16d commit 3c5fc2c

File tree

15 files changed

+107
-17
lines changed

15 files changed

+107
-17
lines changed

client/groups/disk/v1/client_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/groups/filesystem/v1/client_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/groups/smb/v1/client_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/groups/volume/v1/client_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

integrationtests/apigroups/client/dummy/v1/client_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

integrationtests/apigroups/server/dummy/api_group_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

integrationtests/apigroups/server/dummy/impl/v1/server_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

integrationtests/volume_test.go

-4
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,4 @@ func TestVolumeAPIs(t *testing.T) {
172172
skipTestOnCondition(t, isRunningOnGhActions())
173173
v1VolumeTests(t)
174174
})
175-
t.Run("v2alpha1Tests", func(t *testing.T) {
176-
skipTestOnCondition(t, isRunningOnGhActions())
177-
v2alpha1VolumeTests(t)
178-
})
179175
}

pkg/os/volume/api.go

+94
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package volume
33
import (
44
"encoding/json"
55
"fmt"
6+
"os"
67
"os/exec"
8+
"path/filepath"
79
"regexp"
810
"strconv"
911
"strings"
@@ -33,6 +35,8 @@ type API interface {
3335
GetVolumeIDFromTargetPath(targetPath string) (string, error)
3436
// WriteVolumeCache writes the volume `volumeID`'s cache to disk.
3537
WriteVolumeCache(volumeID string) error
38+
// GetVolumeIDFromTargetPath returns the volume id of a given target path.
39+
GetClosestVolumeIDFromTargetPath(targetPath string) (string, error)
3640
}
3741

3842
// VolumeAPI implements the internal Volume APIs
@@ -268,6 +272,96 @@ func getTarget(mount string) (string, error) {
268272
return volumeString, nil
269273
}
270274

275+
// GetVolumeIDFromTargetPath returns the volume id of a given target path.
276+
func (VolumeAPI) GetClosestVolumeIDFromTargetPath(targetPath string) (string, error) {
277+
volumeString, err := findClosestVolume(targetPath)
278+
279+
if err != nil {
280+
return "", fmt.Errorf("error getting the closest volume for the path=%s, err=%v", targetPath, err)
281+
}
282+
283+
return volumeString, nil
284+
}
285+
286+
// findClosestVolume finds the closest volume id for a given target path
287+
// by following symlinks and moving up in the filesystem, if after moving up in the filesystem
288+
// we get to a DriveLetter then the volume corresponding to this drive letter is returned instead.
289+
func findClosestVolume(path string) (string, error) {
290+
candidatePath := path
291+
292+
// run in a bounded loop to avoid doing an infinite loop
293+
// while trying to follow symlinks
294+
for i := 0; i < 256; i += 1 {
295+
fi, err := os.Lstat(candidatePath)
296+
if err != nil {
297+
return "", err
298+
}
299+
isSymlink := fi.Mode()&os.ModeSymlink != 0
300+
301+
if isSymlink {
302+
target, err := dereferenceSymlink(candidatePath)
303+
if err != nil {
304+
return "", err
305+
}
306+
// if it has the form Volume{volumeid}\ then it's a volume
307+
if strings.HasPrefix(target, "Volume") {
308+
// symlinks that are pointing to Volumes don't have this prefix
309+
target = "\\\\?\\" + target
310+
return target, nil
311+
}
312+
// otherwise follow the symlink
313+
candidatePath = target
314+
} else {
315+
// if it's not a symlink move one level up
316+
previousPath := candidatePath
317+
candidatePath = filepath.Dir(candidatePath)
318+
319+
// if the new path is the same as the previous path then we reached the root path
320+
if previousPath == candidatePath {
321+
// find the volume for the root path (assuming that it's a DriveLetter)
322+
target, err := getVolumeForDriveLetter(candidatePath[0:1])
323+
if err != nil {
324+
return "", err
325+
}
326+
return target, nil
327+
}
328+
}
329+
330+
}
331+
332+
return "", fmt.Errorf("Failed to find the closest volume for path=%s", path)
333+
}
334+
335+
// dereferenceSymlink dereferences the symlink `path` and returns the stdout.
336+
func dereferenceSymlink(path string) (string, error) {
337+
cmd := exec.Command("powershell", "/c", fmt.Sprintf(`(Get-Item -Path %s).Target`, path))
338+
klog.V(8).Infof("About to execute: %q", cmd.String())
339+
targetb, err := cmd.Output()
340+
if err != nil {
341+
return "", err
342+
}
343+
output := strings.TrimSpace(string(targetb))
344+
klog.V(8).Infof("Stdout: %s", output)
345+
return output, nil
346+
}
347+
348+
// getVolumeForDriveLetter gets a volume from a drive letter (e.g. C:/).
349+
func getVolumeForDriveLetter(path string) (string, error) {
350+
if len(path) != 1 {
351+
return "", fmt.Errorf("The path=%s is not a valid DriverLetter", path)
352+
}
353+
354+
cmd := exec.Command("powershell", "/c", fmt.Sprintf(`(Get-Partition -DriveLetter %s | Get-Volume).UniqueId`, path))
355+
klog.V(8).Infof("About to execute: %q", cmd.String())
356+
targetb, err := cmd.Output()
357+
if err != nil {
358+
return "", err
359+
}
360+
output := strings.TrimSpace(string(targetb))
361+
klog.V(8).Infof("Stdout: %s", output)
362+
return output, nil
363+
}
364+
271365
func writeCache(volumeID string) error {
272366
cmd := fmt.Sprintf("Get-Volume -UniqueId \"%s\" | Write-Volumecache", volumeID)
273367
out, err := runExec(cmd)

pkg/server/disk/api_group_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/server/disk/impl/v1/server_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/server/filesystem/api_group_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/server/filesystem/impl/v1/server_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/server/smb/api_group_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/server/smb/impl/v1/server_generated.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)