From d937ae1b5985d413ca3669920249e07b7ae1bb1d Mon Sep 17 00:00:00 2001 From: Patryk Matuszak <305846+pmtk@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:23:58 +0200 Subject: [PATCH] consider filepath as not existing even if exists but is empty Before the prerun, MicroShift creates a .nodename file in the data directory. To not interpret existence of the data dir with just the .nodename as "MicroShift already ran on this device", we need a more thorough check. Extending this philosophy to files, will allow us in testing to create empty health.json that will be considered as "no health info" but writable by green or red script after adding immutable attr too backups directory. --- pkg/admin/prerun/prerun.go | 8 ++++---- pkg/admin/prerun/version.go | 2 +- pkg/util/util.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) 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 +}