diff --git a/pkg/admin/prerun/prerun.go b/pkg/admin/prerun/prerun.go index f8718e980a..44a2b049a6 100644 --- a/pkg/admin/prerun/prerun.go +++ b/pkg/admin/prerun/prerun.go @@ -55,17 +55,17 @@ func (pr *PreRun) Perform() error { return nil } - dataExists, err := util.PathExists(config.DataDir) + dataExists, err := util.PathExistsAndIsNotEmpty(config.DataDir, ".nodename") if err != nil { return fmt.Errorf("failed to check if data directory already exists: %w", err) } - versionExists, err := util.PathExists(versionFilePath) + versionExists, err := util.PathExistsAndIsNotEmpty(versionFilePath) if err != nil { return fmt.Errorf("checking if version metadata exists failed: %w", err) } - healthExists, err := util.PathExists(healthFilepath) + healthExists, err := util.PathExistsAndIsNotEmpty(healthFilepath) if err != nil { return fmt.Errorf("failed to check if health file already exists: %w", err) } @@ -363,7 +363,7 @@ func getCurrentBootID() (string, error) { } func getHealthInfo() (*HealthInfo, error) { - if exists, err := util.PathExists(healthFilepath); err != nil { + if exists, err := util.PathExistsAndIsNotEmpty(healthFilepath); err != nil { return nil, err } else if !exists { return nil, errHealthFileDoesNotExist diff --git a/pkg/admin/prerun/version.go b/pkg/admin/prerun/version.go index c6ca61103a..3219a139e3 100644 --- a/pkg/admin/prerun/version.go +++ b/pkg/admin/prerun/version.go @@ -101,7 +101,7 @@ func getVersionOfExecutable() (versionMetadata, error) { } func getVersionOfData() (versionMetadata, error) { - exists, err := util.PathExists(versionFilePath) + exists, err := util.PathExistsAndIsNotEmpty(versionFilePath) if err != nil { return versionMetadata{}, fmt.Errorf("checking if path exists failed: %w", err) } diff --git a/pkg/util/util.go b/pkg/util/util.go index e7fb5d787d..b1077c8aaf 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -4,6 +4,8 @@ import ( "errors" "fmt" "os" + + "k8s.io/apimachinery/pkg/util/sets" ) func Must(err error) { @@ -32,3 +34,33 @@ func PathExists(path string) (bool, error) { func MakeDir(path string) error { return os.MkdirAll(path, 0700) } + +func PathExistsAndIsNotEmpty(path string, ignores ...string) (bool, error) { + fi, err := os.Stat(path) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return false, nil + } else { + return false, fmt.Errorf("checking if path (%s) exists failed: %w", path, err) + } + } + + if !fi.IsDir() { + return fi.Size() != 0, nil + } + + files, err := os.ReadDir(path) + if err != nil { + return false, fmt.Errorf("failed to ReadDir %q: %w", path, err) + } + + iset := sets.New[string](ignores...) + for _, f := range files { + if iset.Has(f.Name()) { + continue + } + return true, nil + } + + return false, nil +}