Skip to content

Commit 723ca3a

Browse files
committed
Add RemoveDynamicDisk action
It will delete the symlink to real device path in /var/vcap/data/dynamic_disks
1 parent 41e785c commit 723ca3a

File tree

9 files changed

+199
-2
lines changed

9 files changed

+199
-2
lines changed

agent/action/concrete_factory.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ func NewFactory(
8686
"add_persistent_disk": NewAddPersistentDiskAction(settingsService),
8787
"remove_persistent_disk": NewRemovePersistentDiskAction(settingsService),
8888
"add_dynamic_disk": NewAddDynamicDiskAction(settingsService, platform),
89+
"remove_dynamic_disk": NewRemoveDynamicDiskAction(platform),
8990

9091
// ARP cache management
9192
"delete_arp_entries": NewDeleteARPEntries(platform),
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package action
2+
3+
import (
4+
"errors"
5+
6+
boshplatform "github.com/cloudfoundry/bosh-agent/v2/platform"
7+
bosherr "github.com/cloudfoundry/bosh-utils/errors"
8+
)
9+
10+
type RemoveDynamicDiskAction struct {
11+
platform boshplatform.Platform
12+
}
13+
14+
func NewRemoveDynamicDiskAction(platform boshplatform.Platform) RemoveDynamicDiskAction {
15+
return RemoveDynamicDiskAction{
16+
platform: platform,
17+
}
18+
}
19+
20+
func (a RemoveDynamicDiskAction) Run(diskCID string) (interface{}, error) {
21+
if err := a.platform.CleanupDynamicDisk(diskCID); err != nil {
22+
return "", bosherr.WrapError(err, "Setting up dynamic disk")
23+
}
24+
25+
return map[string]string{}, nil
26+
}
27+
28+
func (a RemoveDynamicDiskAction) IsAsynchronous(_ ProtocolVersion) bool {
29+
return true
30+
}
31+
32+
func (a RemoveDynamicDiskAction) IsPersistent() bool {
33+
return false
34+
}
35+
36+
func (a RemoveDynamicDiskAction) IsLoggable() bool {
37+
return true
38+
}
39+
40+
func (a RemoveDynamicDiskAction) Resume() (interface{}, error) {
41+
return nil, errors.New("not supported")
42+
}
43+
44+
func (a RemoveDynamicDiskAction) Cancel() error {
45+
return errors.New("not supported")
46+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package action
2+
3+
import (
4+
. "github.com/onsi/ginkgo/v2"
5+
. "github.com/onsi/gomega"
6+
"github.com/pkg/errors"
7+
8+
"github.com/cloudfoundry/bosh-agent/v2/platform/platformfakes"
9+
)
10+
11+
var _ = Describe("RemoveDynamicDiskAction", func() {
12+
var (
13+
action RemoveDynamicDiskAction
14+
platform *platformfakes.FakePlatform
15+
)
16+
17+
BeforeEach(func() {
18+
platform = &platformfakes.FakePlatform{}
19+
action = NewRemoveDynamicDiskAction(platform)
20+
})
21+
22+
It("cleans up dynamic disk", func() {
23+
result, err := action.Run("diskCID")
24+
25+
Expect(err).ToNot(HaveOccurred())
26+
Expect(result).To(Equal(map[string]string{}))
27+
Expect(platform.CleanupDynamicDiskCallCount()).To(Equal(1))
28+
Expect(platform.CleanupDynamicDiskArgsForCall(0)).To(Equal("diskCID"))
29+
})
30+
31+
Context("when cleaning up dynamic disk fails", func() {
32+
BeforeEach(func() {
33+
platform.CleanupDynamicDiskReturns(errors.New("Could not setup"))
34+
})
35+
36+
It("should raise error", func() {
37+
_, err := action.Run("diskCID")
38+
Expect(err).To(HaveOccurred())
39+
})
40+
})
41+
})

platform/dummy_platform.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ func (p dummyPlatform) SetupDynamicDisk(diskSetting boshsettings.DiskSettings) (
226226
return
227227
}
228228

229+
func (p dummyPlatform) CleanupDynamicDisk(diskCID string) (err error) {
230+
return
231+
}
232+
229233
func (p dummyPlatform) SetupDataDir(_ boshsettings.JobDir, _ boshsettings.RunDir) error {
230234
dataDir := p.dirProvider.DataDir()
231235

platform/linux_platform.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -781,15 +781,24 @@ func (p linux) SetupRawEphemeralDisks(devices []boshsettings.DiskSettings) (err
781781
func (p linux) SetupDynamicDisk(diskSetting boshsettings.DiskSettings) error {
782782
devicePath, timedOut, err := p.devicePathResolver.GetRealDevicePath(diskSetting)
783783
if err != nil {
784-
return bosherr.WrapError(err, "Getting real device path")
784+
return bosherr.WrapError(err, "Getting dynamic disk real device path")
785785
}
786786
if timedOut {
787787
return bosherr.WrapErrorf(err, "Timed out resolving device path for %s", diskSetting.ID)
788788
}
789789

790790
symlinkDestination := filepath.Join(p.dirProvider.DataDynamicDisksDir(), diskSetting.ID)
791791
if err := p.fs.Symlink(devicePath, symlinkDestination); err != nil {
792-
return bosherr.WrapError(err, "Symlinking real device path")
792+
return bosherr.WrapError(err, "Symlinking dynamic disk real device path")
793+
}
794+
795+
return nil
796+
}
797+
798+
func (p linux) CleanupDynamicDisk(diskCID string) error {
799+
symlinkDestination := filepath.Join(p.dirProvider.DataDynamicDisksDir(), diskCID)
800+
if err := p.fs.RemoveAll(symlinkDestination); err != nil {
801+
return bosherr.WrapError(err, "Removing dynamic disk symlink")
793802
}
794803

795804
return nil

platform/linux_platform_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -996,6 +996,25 @@ fake-base-path/data/sys/log/*.log fake-base-path/data/sys/log/.*.log fake-base-p
996996
})
997997
})
998998

999+
Describe("CleanupDynamicDisk", func() {
1000+
BeforeEach(func() {
1001+
devicePathResolver.GetRealDevicePathStub = func(diskSettings boshsettings.DiskSettings) (string, bool, error) {
1002+
return diskSettings.Path, false, nil
1003+
}
1004+
})
1005+
1006+
It("removes dynamic disk symlink", func() {
1007+
err := platform.SetupDynamicDisk(boshsettings.DiskSettings{ID: "diskID", Path: "/dev/sdb"})
1008+
Expect(err).NotTo(HaveOccurred())
1009+
1010+
err = platform.CleanupDynamicDisk("diskID")
1011+
Expect(err).NotTo(HaveOccurred())
1012+
1013+
sysStats := fs.GetFileTestStat("/fake-dir/data/dynamic_disks/diskID")
1014+
Expect(sysStats).To(BeNil())
1015+
})
1016+
})
1017+
9991018
Describe("SetupEphemeralDiskWithPath", func() {
10001019
var (
10011020
labelPrefix string

platform/platform_interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ type Platform interface {
8989
IsPersistentDiskMountable(diskSettings boshsettings.DiskSettings) (bool, error)
9090
AssociateDisk(name string, settings boshsettings.DiskSettings) error
9191
SetupDynamicDisk(diskSetting boshsettings.DiskSettings) error
92+
CleanupDynamicDisk(diskCID string) error
9293

9394
GetFileContentsFromCDROM(filePath string) (contents []byte, err error)
9495
GetFilesContentsFromDisk(diskPath string, fileNames []string) (contents [][]byte, err error)

platform/platformfakes/fake_platform.go

Lines changed: 72 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

platform/windows_platform.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,10 @@ func (p WindowsPlatform) SetupDynamicDisk(diskSetting boshsettings.DiskSettings)
552552
return
553553
}
554554

555+
func (p WindowsPlatform) CleanupDynamicDisk(diskID string) (err error) {
556+
return
557+
}
558+
555559
func (p WindowsPlatform) SetupDataDir(_ boshsettings.JobDir, _ boshsettings.RunDir) error {
556560
dataDir := p.dirProvider.DataDir()
557561
sysDataDir := filepath.Join(dataDir, "sys")

0 commit comments

Comments
 (0)