Take symlinks into account for partition size

Signed-off-by: Mauro Morales <mauro.morales@spectrocloud.com>
This commit is contained in:
Mauro Morales 2023-09-27 16:25:34 +02:00
parent 677254e570
commit 5fab99f5b7

View File

@ -19,6 +19,7 @@ package config
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"reflect"
"strings"
@ -480,11 +481,40 @@ func GetSourceSize(config *Config, source *v1.ImageSource) (int64, error) {
if err != nil {
return err
}
info, err := d.Info()
if d.Type()&fs.ModeSymlink != 0 {
// If it's a symlink, get its target and calculate its size.
linkTarget, err := os.Readlink(path)
if err != nil {
return err
}
size += info.Size()
if !filepath.IsAbs(linkTarget) {
// If it's a relative path, join it with the base directory path.
linkTarget = filepath.Join(filepath.Dir(path), linkTarget)
}
_, err = os.Stat(linkTarget)
if os.IsNotExist(err) {
size += 0
} else if err != nil {
return err
} else {
linkInfo, err := os.Stat(linkTarget)
if err != nil {
return err
}
size += linkInfo.Size()
}
} else if !d.IsDir() {
// If it's a regular file, add its size to the total.
fileInfo, err := d.Info()
if err != nil {
return err
}
size += fileInfo.Size()
}
return nil
})