github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/storage/provider/managedfs_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provider_test 5 6 import ( 7 "path/filepath" 8 9 "github.com/juju/names" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/storage" 14 "github.com/juju/juju/storage/provider" 15 "github.com/juju/juju/testing" 16 ) 17 18 var _ = gc.Suite(&managedfsSuite{}) 19 20 type managedfsSuite struct { 21 testing.BaseSuite 22 commands *mockRunCommand 23 dirFuncs *provider.MockDirFuncs 24 blockDevices map[names.VolumeTag]storage.BlockDevice 25 filesystems map[names.FilesystemTag]storage.Filesystem 26 } 27 28 func (s *managedfsSuite) SetUpTest(c *gc.C) { 29 s.BaseSuite.SetUpTest(c) 30 s.blockDevices = make(map[names.VolumeTag]storage.BlockDevice) 31 s.filesystems = make(map[names.FilesystemTag]storage.Filesystem) 32 } 33 34 func (s *managedfsSuite) TearDownTest(c *gc.C) { 35 if s.commands != nil { 36 s.commands.assertDrained() 37 } 38 s.BaseSuite.TearDownTest(c) 39 } 40 41 func (s *managedfsSuite) initSource(c *gc.C) storage.FilesystemSource { 42 s.commands = &mockRunCommand{c: c} 43 source, mockDirFuncs := provider.NewMockManagedFilesystemSource( 44 s.commands.run, 45 s.blockDevices, 46 s.filesystems, 47 ) 48 s.dirFuncs = mockDirFuncs 49 return source 50 } 51 52 func (s *managedfsSuite) TestCreateFilesystems(c *gc.C) { 53 source := s.initSource(c) 54 // sda is (re)partitioned and the filesystem created 55 // on the partition. 56 s.commands.expect("sgdisk", "--zap-all", "/dev/sda") 57 s.commands.expect("sgdisk", "-n", "1:0:-1", "/dev/sda") 58 s.commands.expect("mkfs.ext4", "/dev/sda1") 59 // xvdf1 is assumed to not require a partition, on 60 // account of ending with a digit. 61 s.commands.expect("mkfs.ext4", "/dev/xvdf1") 62 63 s.blockDevices[names.NewVolumeTag("0")] = storage.BlockDevice{ 64 DeviceName: "sda", 65 HardwareId: "capncrunch", 66 Size: 2, 67 } 68 s.blockDevices[names.NewVolumeTag("1")] = storage.BlockDevice{ 69 DeviceName: "xvdf1", 70 HardwareId: "weetbix", 71 Size: 3, 72 } 73 results, err := source.CreateFilesystems([]storage.FilesystemParams{{ 74 Tag: names.NewFilesystemTag("0/0"), 75 Volume: names.NewVolumeTag("0"), 76 Size: 2, 77 }, { 78 Tag: names.NewFilesystemTag("0/1"), 79 Volume: names.NewVolumeTag("1"), 80 Size: 3, 81 }}) 82 c.Assert(err, jc.ErrorIsNil) 83 c.Assert(results, jc.DeepEquals, []storage.CreateFilesystemsResult{{ 84 Filesystem: &storage.Filesystem{ 85 names.NewFilesystemTag("0/0"), 86 names.NewVolumeTag("0"), 87 storage.FilesystemInfo{ 88 FilesystemId: "filesystem-0-0", 89 Size: 2, 90 }, 91 }, 92 }, { 93 Filesystem: &storage.Filesystem{ 94 names.NewFilesystemTag("0/1"), 95 names.NewVolumeTag("1"), 96 storage.FilesystemInfo{ 97 FilesystemId: "filesystem-0-1", 98 Size: 3, 99 }, 100 }, 101 }}) 102 } 103 104 func (s *managedfsSuite) TestCreateFilesystemsNoBlockDevice(c *gc.C) { 105 source := s.initSource(c) 106 results, err := source.CreateFilesystems([]storage.FilesystemParams{{ 107 Tag: names.NewFilesystemTag("0/0"), 108 Volume: names.NewVolumeTag("0"), 109 Size: 2, 110 }}) 111 c.Assert(err, jc.ErrorIsNil) 112 c.Assert(results[0].Error, gc.ErrorMatches, "backing-volume 0 is not yet attached") 113 } 114 115 func (s *managedfsSuite) TestAttachFilesystems(c *gc.C) { 116 s.testAttachFilesystems(c, false, false) 117 } 118 119 func (s *managedfsSuite) TestAttachFilesystemsReadOnly(c *gc.C) { 120 s.testAttachFilesystems(c, true, false) 121 } 122 123 func (s *managedfsSuite) TestAttachFilesystemsReattach(c *gc.C) { 124 s.testAttachFilesystems(c, true, true) 125 } 126 127 func (s *managedfsSuite) testAttachFilesystems(c *gc.C, readOnly, reattach bool) { 128 const testMountPoint = "/in/the/place" 129 130 source := s.initSource(c) 131 cmd := s.commands.expect("df", "--output=source", filepath.Dir(testMountPoint)) 132 cmd.respond("headers\n/same/as/rootfs", nil) 133 cmd = s.commands.expect("df", "--output=source", testMountPoint) 134 if reattach { 135 cmd.respond("headers\n/different/to/rootfs", nil) 136 } else { 137 cmd.respond("headers\n/same/as/rootfs", nil) 138 var args []string 139 if readOnly { 140 args = append(args, "-o", "ro") 141 } 142 args = append(args, "/dev/sda1", testMountPoint) 143 s.commands.expect("mount", args...) 144 } 145 146 s.blockDevices[names.NewVolumeTag("0")] = storage.BlockDevice{ 147 DeviceName: "sda", 148 HardwareId: "capncrunch", 149 Size: 2, 150 } 151 s.filesystems[names.NewFilesystemTag("0/0")] = storage.Filesystem{ 152 Tag: names.NewFilesystemTag("0/0"), 153 Volume: names.NewVolumeTag("0"), 154 } 155 156 results, err := source.AttachFilesystems([]storage.FilesystemAttachmentParams{{ 157 Filesystem: names.NewFilesystemTag("0/0"), 158 FilesystemId: "filesystem-0-0", 159 AttachmentParams: storage.AttachmentParams{ 160 Machine: names.NewMachineTag("0"), 161 InstanceId: "inst-ance", 162 ReadOnly: readOnly, 163 }, 164 Path: testMountPoint, 165 }}) 166 c.Assert(err, jc.ErrorIsNil) 167 c.Assert(results, jc.DeepEquals, []storage.AttachFilesystemsResult{{ 168 FilesystemAttachment: &storage.FilesystemAttachment{ 169 names.NewFilesystemTag("0/0"), 170 names.NewMachineTag("0"), 171 storage.FilesystemAttachmentInfo{ 172 Path: testMountPoint, 173 ReadOnly: readOnly, 174 }, 175 }, 176 }}) 177 } 178 179 func (s *managedfsSuite) TestDetachFilesystems(c *gc.C) { 180 source := s.initSource(c) 181 testDetachFilesystems(c, s.commands, source, true) 182 } 183 184 func (s *managedfsSuite) TestDetachFilesystemsUnattached(c *gc.C) { 185 source := s.initSource(c) 186 testDetachFilesystems(c, s.commands, source, false) 187 }