From aa8ebcd078b06829ff479371fa63781e2d8587fc Mon Sep 17 00:00:00 2001 From: Ned Petrov Date: Wed, 5 Aug 2026 08:00:19 +0300 Subject: [PATCH 1/4] Retry resize2fs on transient Permission denied during disk grow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a persistent disk is extended online, the block device's new size may not yet be consistently visible to the guest at the time the agent calls resize2fs. This causes a transient EPERM that resolves once the underlying storage layer settles. Retry resize2fs up to 10 times with a 5s sleep between attempts, but only on "Permission denied to resize filesystem" — any other error still fails immediately. Follows the same clock-injection pattern used by NewPartedPartitioner and NewSfdiskPartitioner in the same package. --- platform/disk/linux_disk_manager.go | 2 +- platform/disk/linux_formatter.go | 45 ++++++++++++---- platform/disk/linux_formatter_test.go | 76 ++++++++++++++++++++------- 3 files changed, 93 insertions(+), 30 deletions(-) diff --git a/platform/disk/linux_disk_manager.go b/platform/disk/linux_disk_manager.go index 3a281081b..b8bdf7ac4 100644 --- a/platform/disk/linux_disk_manager.go +++ b/platform/disk/linux_disk_manager.go @@ -82,7 +82,7 @@ func NewLinuxDiskManager( return linuxDiskManager{ ephemeralPartitioner: ephemeralPartitioner, diskUtil: diskUtil, - formatter: NewLinuxFormatter(runner, fs), + formatter: NewLinuxFormatter(runner, fs, clock.NewClock()), fs: fs, logger: logger, mounter: mounter, diff --git a/platform/disk/linux_formatter.go b/platform/disk/linux_formatter.go index a50beeea4..60b954b31 100644 --- a/platform/disk/linux_formatter.go +++ b/platform/disk/linux_formatter.go @@ -3,20 +3,30 @@ package disk import ( "regexp" "strings" + "time" + "code.cloudfoundry.org/clock" bosherr "github.com/cloudfoundry/bosh-utils/errors" boshsys "github.com/cloudfoundry/bosh-utils/system" ) +const ( + growFilesystemRetryDelay = 5 * time.Second + growFilesystemMaxAttempts = 10 + growFilesystemPermDeniedMsg = "Permission denied to resize filesystem" +) + type linuxFormatter struct { - runner boshsys.CmdRunner - fs boshsys.FileSystem + runner boshsys.CmdRunner + fs boshsys.FileSystem + timeService clock.Clock } -func NewLinuxFormatter(runner boshsys.CmdRunner, fs boshsys.FileSystem) Formatter { +func NewLinuxFormatter(runner boshsys.CmdRunner, fs boshsys.FileSystem, timeService clock.Clock) Formatter { return linuxFormatter{ - runner: runner, - fs: fs, + runner: runner, + fs: fs, + timeService: timeService, } } @@ -74,11 +84,7 @@ func (f linuxFormatter) GrowFilesystem(partitionPath string) error { switch existingFsType { case FileSystemExt4: - _, _, _, err := f.runner.RunCommand( - "resize2fs", - "-f", - partitionPath, - ) + err = f.growExt4WithRetry(partitionPath) if err != nil { return bosherr.WrapError(err, "Failed to grow Ext4 filesystem") } @@ -97,6 +103,25 @@ func (f linuxFormatter) GrowFilesystem(partitionPath string) error { return nil } +// growExt4WithRetry retries resize2fs when the block device reports "Permission +// denied". This can happen transiently after an online volume extension while +// the block device's new size is not yet consistently visible to the guest, and +// resolves once the underlying storage layer settles. +func (f linuxFormatter) growExt4WithRetry(partitionPath string) error { + var err error + for range growFilesystemMaxAttempts { + _, _, _, err = f.runner.RunCommand("resize2fs", "-f", partitionPath) + if err == nil { + return nil + } + if !strings.Contains(err.Error(), growFilesystemPermDeniedMsg) { + return err + } + f.timeService.Sleep(growFilesystemRetryDelay) + } + return err +} + func (f linuxFormatter) makeFileSystemExt4(partitionPath string) error { var err error if f.fs.FileExists("/sys/fs/ext4/features/lazy_itable_init") { diff --git a/platform/disk/linux_formatter_test.go b/platform/disk/linux_formatter_test.go index c1a252acf..935a6ca94 100644 --- a/platform/disk/linux_formatter_test.go +++ b/platform/disk/linux_formatter_test.go @@ -9,6 +9,7 @@ import ( fakesys "github.com/cloudfoundry/bosh-utils/system/fakes" + fakeboshaction "github.com/cloudfoundry/bosh-agent/v2/agent/action/fakes" . "github.com/cloudfoundry/bosh-agent/v2/platform/disk" ) @@ -20,7 +21,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{ExitStatus: 2, Error: errors.New("Exit code 2")}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemSwap) Expect(err).NotTo(HaveOccurred()) @@ -33,7 +34,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda1", FileSystemSwap) Expect(err).NotTo(HaveOccurred()) @@ -46,7 +47,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="swap" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda1", FileSystemSwap) Expect(err).NotTo(HaveOccurred()) @@ -63,7 +64,7 @@ var _ = Describe("Linux Formatter", func() { Expect(err).NotTo(HaveOccurred()) fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext2" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err = formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -94,7 +95,7 @@ var _ = Describe("Linux Formatter", func() { fakeRunner.AddCmdResult(mkeCmd, fakesys.FakeCmdResult{ ExitStatus: 0, }) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -107,7 +108,7 @@ var _ = Describe("Linux Formatter", func() { fakeRunner.AddCmdResult(mkeCmd, fakesys.FakeCmdResult{ Error: errors.New(`some other error`), }) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).To(HaveOccurred()) @@ -121,7 +122,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext2" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -134,7 +135,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda1", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -147,7 +148,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="xfs" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -160,7 +161,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="somethingelse" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -175,7 +176,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{ExitStatus: 2, Error: errors.New("Exit code 2")}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemXFS) Expect(err).NotTo(HaveOccurred()) @@ -188,7 +189,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda1", FileSystemXFS) Expect(err).NotTo(HaveOccurred()) @@ -201,7 +202,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="xfs" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda1", FileSystemXFS) Expect(err).NotTo(HaveOccurred()) @@ -215,7 +216,7 @@ var _ = Describe("Linux Formatter", func() { fakeRunner.AddCmdResult("mkfs.xfs /dev/xvda2", fakesys.FakeCmdResult{Error: errors.New("Sadness")}) fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stderr: "", ExitStatus: 2}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs) + formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) err := formatter.Format("/dev/xvda2", FileSystemXFS) Expect(err).To(HaveOccurred()) @@ -228,18 +229,20 @@ var _ = Describe("Linux Formatter", func() { var ( fakeRunner *fakesys.FakeCmdRunner fakeFs *fakesys.FakeFileSystem + fakeClock *fakeboshaction.FakeClock formatter Formatter ) BeforeEach(func() { fakeRunner = fakesys.NewFakeCmdRunner() fakeFs = fakesys.NewFakeFileSystem() + fakeClock = &fakeboshaction.FakeClock{} }) Context("when determining partition filesystem fails", func() { BeforeEach(func() { fakeRunner.AddCmdResult("blkid -p /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: errors.New("No GPT found")}) - formatter = NewLinuxFormatter(fakeRunner, fakeFs) + formatter = NewLinuxFormatter(fakeRunner, fakeFs, fakeClock) }) It("returns an error", func() { @@ -253,7 +256,7 @@ var _ = Describe("Linux Formatter", func() { Context("when using Ext4", func() { BeforeEach(func() { fakeRunner.AddCmdResult("blkid -p /dev/nvme2n1p1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter = NewLinuxFormatter(fakeRunner, fakeFs) + formatter = NewLinuxFormatter(fakeRunner, fakeFs, fakeClock) }) It("grows the Ext4 filesystem", func() { @@ -263,17 +266,52 @@ var _ = Describe("Linux Formatter", func() { Expect(fakeRunner.RunCommands[1]).To(Equal([]string{"resize2fs", "-f", "/dev/nvme2n1p1"})) }) - Context("when resize2fs fails", func() { + Context("when resize2fs fails with a non-retryable error", func() { BeforeEach(func() { fakeRunner.AddCmdResult("resize2fs -f /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: errors.New("resize2fs failure")}) }) - It("returns an error", func() { + It("returns the error immediately without retrying", func() { err := formatter.GrowFilesystem("/dev/nvme2n1p1") Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("Failed to grow Ext4 filesystem")) Expect(err.Error()).To(ContainSubstring("resize2fs failure")) + Expect(fakeClock.SleepCallCount()).To(Equal(0)) + }) + }) + + Context("when resize2fs fails with 'Permission denied to resize filesystem'", func() { + BeforeEach(func() { + permDeniedErr := errors.New("Permission denied to resize filesystem") + fakeRunner.AddCmdResult("resize2fs -f /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: permDeniedErr}) + fakeRunner.AddCmdResult("resize2fs -f /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: permDeniedErr}) + fakeRunner.AddCmdResult("resize2fs -f /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 0}) + }) + + It("retries until success and sleeps between attempts", func() { + err := formatter.GrowFilesystem("/dev/nvme2n1p1") + + Expect(err).NotTo(HaveOccurred()) + Expect(fakeClock.SleepCallCount()).To(Equal(2)) + }) + }) + + Context("when resize2fs keeps failing with 'Permission denied' for all attempts", func() { + BeforeEach(func() { + permDeniedErr := errors.New("Permission denied to resize filesystem") + for i := 0; i < 10; i++ { + fakeRunner.AddCmdResult("resize2fs -f /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: permDeniedErr}) + } + }) + + It("returns an error after exhausting all attempts", func() { + err := formatter.GrowFilesystem("/dev/nvme2n1p1") + + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("Failed to grow Ext4 filesystem")) + Expect(err.Error()).To(ContainSubstring("Permission denied to resize filesystem")) + Expect(fakeClock.SleepCallCount()).To(Equal(10)) }) }) }) @@ -281,7 +319,7 @@ var _ = Describe("Linux Formatter", func() { Context("when using XFS", func() { BeforeEach(func() { fakeRunner.AddCmdResult("blkid -p /dev/nvme2n1p1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="xfs" yyyy zzzz`}) - formatter = NewLinuxFormatter(fakeRunner, fakeFs) + formatter = NewLinuxFormatter(fakeRunner, fakeFs, fakeClock) }) It("grows the XFS filesystem", func() { From e3a4c6ae8321be7befaf8dac7adeda6a7363d4e0 Mon Sep 17 00:00:00 2001 From: Ned Petrov Date: Wed, 5 Aug 2026 08:16:23 +0300 Subject: [PATCH 2/4] Address review: fix retry loop sleep semantics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sleep only between retries (not after the last failure). The loop now performs one initial attempt plus up to 10 retries, sleeping before each retry — 11 total resize2fs calls, 10 sleeps, 50s max delay. Rename growFilesystemMaxAttempts to growFilesystemMaxRetries to match the PR description semantics. --- platform/disk/linux_formatter.go | 10 ++++++---- platform/disk/linux_formatter_test.go | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/platform/disk/linux_formatter.go b/platform/disk/linux_formatter.go index 60b954b31..693a5a623 100644 --- a/platform/disk/linux_formatter.go +++ b/platform/disk/linux_formatter.go @@ -11,8 +11,8 @@ import ( ) const ( - growFilesystemRetryDelay = 5 * time.Second - growFilesystemMaxAttempts = 10 + growFilesystemRetryDelay = 5 * time.Second + growFilesystemMaxRetries = 10 growFilesystemPermDeniedMsg = "Permission denied to resize filesystem" ) @@ -109,7 +109,10 @@ func (f linuxFormatter) GrowFilesystem(partitionPath string) error { // resolves once the underlying storage layer settles. func (f linuxFormatter) growExt4WithRetry(partitionPath string) error { var err error - for range growFilesystemMaxAttempts { + for retry := range growFilesystemMaxRetries + 1 { + if retry > 0 { + f.timeService.Sleep(growFilesystemRetryDelay) + } _, _, _, err = f.runner.RunCommand("resize2fs", "-f", partitionPath) if err == nil { return nil @@ -117,7 +120,6 @@ func (f linuxFormatter) growExt4WithRetry(partitionPath string) error { if !strings.Contains(err.Error(), growFilesystemPermDeniedMsg) { return err } - f.timeService.Sleep(growFilesystemRetryDelay) } return err } diff --git a/platform/disk/linux_formatter_test.go b/platform/disk/linux_formatter_test.go index 935a6ca94..151aa995e 100644 --- a/platform/disk/linux_formatter_test.go +++ b/platform/disk/linux_formatter_test.go @@ -300,7 +300,7 @@ var _ = Describe("Linux Formatter", func() { Context("when resize2fs keeps failing with 'Permission denied' for all attempts", func() { BeforeEach(func() { permDeniedErr := errors.New("Permission denied to resize filesystem") - for i := 0; i < 10; i++ { + for i := 0; i < 11; i++ { fakeRunner.AddCmdResult("resize2fs -f /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: permDeniedErr}) } }) From 1c557fe165e607f3c7ca5f0dcf8ce9ee1e4767cc Mon Sep 17 00:00:00 2001 From: Ned Petrov Date: Wed, 5 Aug 2026 08:19:10 +0300 Subject: [PATCH 3/4] Fix const block alignment to satisfy goimports --- platform/disk/linux_formatter.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/disk/linux_formatter.go b/platform/disk/linux_formatter.go index 693a5a623..532342b1f 100644 --- a/platform/disk/linux_formatter.go +++ b/platform/disk/linux_formatter.go @@ -11,8 +11,8 @@ import ( ) const ( - growFilesystemRetryDelay = 5 * time.Second - growFilesystemMaxRetries = 10 + growFilesystemRetryDelay = 5 * time.Second + growFilesystemMaxRetries = 10 growFilesystemPermDeniedMsg = "Permission denied to resize filesystem" ) From bb6e0334d7e9beec58c61e66642bcecaa869a6c9 Mon Sep 17 00:00:00 2001 From: Ned Petrov Date: Wed, 5 Aug 2026 08:26:28 +0300 Subject: [PATCH 4/4] Restore NewLinuxFormatter(runner, fs) signature for API compatibility NewLinuxFormatter is exported from a non-internal package, so changing its signature is a breaking API change for downstream importers. Restore the original two-arg signature as a compatibility wrapper and introduce NewLinuxFormatterWithClock for clock injection in tests. --- platform/disk/linux_disk_manager.go | 2 +- platform/disk/linux_formatter.go | 6 ++++- platform/disk/linux_formatter_test.go | 34 +++++++++++++-------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/platform/disk/linux_disk_manager.go b/platform/disk/linux_disk_manager.go index b8bdf7ac4..3a281081b 100644 --- a/platform/disk/linux_disk_manager.go +++ b/platform/disk/linux_disk_manager.go @@ -82,7 +82,7 @@ func NewLinuxDiskManager( return linuxDiskManager{ ephemeralPartitioner: ephemeralPartitioner, diskUtil: diskUtil, - formatter: NewLinuxFormatter(runner, fs, clock.NewClock()), + formatter: NewLinuxFormatter(runner, fs), fs: fs, logger: logger, mounter: mounter, diff --git a/platform/disk/linux_formatter.go b/platform/disk/linux_formatter.go index 532342b1f..c2f581465 100644 --- a/platform/disk/linux_formatter.go +++ b/platform/disk/linux_formatter.go @@ -22,7 +22,11 @@ type linuxFormatter struct { timeService clock.Clock } -func NewLinuxFormatter(runner boshsys.CmdRunner, fs boshsys.FileSystem, timeService clock.Clock) Formatter { +func NewLinuxFormatter(runner boshsys.CmdRunner, fs boshsys.FileSystem) Formatter { + return NewLinuxFormatterWithClock(runner, fs, clock.NewClock()) +} + +func NewLinuxFormatterWithClock(runner boshsys.CmdRunner, fs boshsys.FileSystem, timeService clock.Clock) Formatter { return linuxFormatter{ runner: runner, fs: fs, diff --git a/platform/disk/linux_formatter_test.go b/platform/disk/linux_formatter_test.go index 151aa995e..2724efd56 100644 --- a/platform/disk/linux_formatter_test.go +++ b/platform/disk/linux_formatter_test.go @@ -21,7 +21,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{ExitStatus: 2, Error: errors.New("Exit code 2")}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemSwap) Expect(err).NotTo(HaveOccurred()) @@ -34,7 +34,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda1", FileSystemSwap) Expect(err).NotTo(HaveOccurred()) @@ -47,7 +47,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="swap" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda1", FileSystemSwap) Expect(err).NotTo(HaveOccurred()) @@ -64,7 +64,7 @@ var _ = Describe("Linux Formatter", func() { Expect(err).NotTo(HaveOccurred()) fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext2" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err = formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -95,7 +95,7 @@ var _ = Describe("Linux Formatter", func() { fakeRunner.AddCmdResult(mkeCmd, fakesys.FakeCmdResult{ ExitStatus: 0, }) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -108,7 +108,7 @@ var _ = Describe("Linux Formatter", func() { fakeRunner.AddCmdResult(mkeCmd, fakesys.FakeCmdResult{ Error: errors.New(`some other error`), }) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).To(HaveOccurred()) @@ -122,7 +122,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext2" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -135,7 +135,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda1", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -148,7 +148,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="xfs" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -161,7 +161,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="somethingelse" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemExt4) Expect(err).NotTo(HaveOccurred()) @@ -176,7 +176,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{ExitStatus: 2, Error: errors.New("Exit code 2")}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemXFS) Expect(err).NotTo(HaveOccurred()) @@ -189,7 +189,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda1", FileSystemXFS) Expect(err).NotTo(HaveOccurred()) @@ -202,7 +202,7 @@ var _ = Describe("Linux Formatter", func() { fakeFs := fakesys.NewFakeFileSystem() fakeRunner.AddCmdResult("blkid -p /dev/xvda1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="xfs" yyyy zzzz`}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda1", FileSystemXFS) Expect(err).NotTo(HaveOccurred()) @@ -216,7 +216,7 @@ var _ = Describe("Linux Formatter", func() { fakeRunner.AddCmdResult("mkfs.xfs /dev/xvda2", fakesys.FakeCmdResult{Error: errors.New("Sadness")}) fakeRunner.AddCmdResult("blkid -p /dev/xvda2", fakesys.FakeCmdResult{Stderr: "", ExitStatus: 2}) - formatter := NewLinuxFormatter(fakeRunner, fakeFs, &fakeboshaction.FakeClock{}) + formatter := NewLinuxFormatter(fakeRunner, fakeFs) err := formatter.Format("/dev/xvda2", FileSystemXFS) Expect(err).To(HaveOccurred()) @@ -242,7 +242,7 @@ var _ = Describe("Linux Formatter", func() { Context("when determining partition filesystem fails", func() { BeforeEach(func() { fakeRunner.AddCmdResult("blkid -p /dev/nvme2n1p1", fakesys.FakeCmdResult{ExitStatus: 1, Error: errors.New("No GPT found")}) - formatter = NewLinuxFormatter(fakeRunner, fakeFs, fakeClock) + formatter = NewLinuxFormatterWithClock(fakeRunner, fakeFs, fakeClock) }) It("returns an error", func() { @@ -256,7 +256,7 @@ var _ = Describe("Linux Formatter", func() { Context("when using Ext4", func() { BeforeEach(func() { fakeRunner.AddCmdResult("blkid -p /dev/nvme2n1p1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="ext4" yyyy zzzz`}) - formatter = NewLinuxFormatter(fakeRunner, fakeFs, fakeClock) + formatter = NewLinuxFormatterWithClock(fakeRunner, fakeFs, fakeClock) }) It("grows the Ext4 filesystem", func() { @@ -319,7 +319,7 @@ var _ = Describe("Linux Formatter", func() { Context("when using XFS", func() { BeforeEach(func() { fakeRunner.AddCmdResult("blkid -p /dev/nvme2n1p1", fakesys.FakeCmdResult{Stdout: `xxxxx TYPE="xfs" yyyy zzzz`}) - formatter = NewLinuxFormatter(fakeRunner, fakeFs, fakeClock) + formatter = NewLinuxFormatterWithClock(fakeRunner, fakeFs, fakeClock) }) It("grows the XFS filesystem", func() {