diff --git a/pkg/minikube/assets/vm_assets.go b/pkg/minikube/assets/vm_assets.go index 3751a85e08..3d4541d754 100644 --- a/pkg/minikube/assets/vm_assets.go +++ b/pkg/minikube/assets/vm_assets.go @@ -93,15 +93,21 @@ func NewMemoryAssetTarget(d []byte, targetPath, permissions string) *MemoryAsset // NewFileAsset creates a new FileAsset func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, error) { glog.V(4).Infof("NewFileAsset: %s -> %s", src, path.Join(targetDir, targetName)) + f, err := os.Open(src) if err != nil { - return nil, errors.Wrapf(err, "Error opening file asset: %s", src) + return nil, errors.Wrap(err, "open") } + info, err := os.Stat(src) if err != nil { - return nil, errors.Wrapf(err, "Error getting info for %s", src) + return nil, errors.Wrapf(err, "stat") } - r := io.NewSectionReader(f, 0, info.Size()) + + if info.Size() == 0 { + glog.Warningf("NewFileAsset: %s is an empty file!", src) + } + return &FileAsset{ BaseAsset: BaseAsset{ SourcePath: src, @@ -109,7 +115,7 @@ func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, e TargetName: targetName, Permissions: permissions, }, - reader: r, + reader: io.NewSectionReader(f, 0, info.Size()), }, nil } @@ -117,6 +123,7 @@ func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, e func (f *FileAsset) GetLength() (flen int) { fi, err := os.Stat(f.SourcePath) if err != nil { + glog.Errorf("stat(%q) failed: %v", f.SourcePath, err) return 0 } return int(fi.Size()) @@ -126,6 +133,7 @@ func (f *FileAsset) GetLength() (flen int) { func (f *FileAsset) GetModTime() (time.Time, error) { fi, err := os.Stat(f.SourcePath) if err != nil { + glog.Errorf("stat(%q) failed: %v", f.SourcePath, err) return time.Time{}, err } return fi.ModTime(), nil diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index 8545e811a7..5f1ef0124b 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -814,11 +814,16 @@ func setupFileSync(ctx context.Context, t *testing.T, profile string) { testPem := "./testdata/minikube_test.pem" - err = copy.Copy(testPem, localTestCertPath()) - if err != nil { + // Write to a temp file for an atomic write + tmpPem := localTestCertPath() + ".pem" + if err := copy.Copy(testPem, tmpPem); err != nil { t.Fatalf("failed to copy %s: %v", testPem, err) } + if err := os.Rename(tmpPem, localTestCertPath()); err != nil { + t.Fatalf("failed to rename %s: %v", tmpPem, err) + } + want, err := os.Stat(testPem) if err != nil { t.Fatalf("stat failed: %v", err)