def test_mount(self): self._addDir("/mnt/test") self._addDir("/mnt/test1") self._addDir("/mnt/test2") # Generate some storage data self._addPool('default_pool', ['/dev/sda', '/dev/sdb']) self._addPool('my_pool', ['/dev/sdc2', '/dev/sdc3', '/dev/sdc1']) self._addVol('vol001', 117283225, 1, 'default_pool', ['/dev/sda'], '/mnt/test1') self._addVol('vol002', 237284225, 1, 'my_pool', ['/dev/sda']) # Simple mount test main.main("ssm mount /dev/default_pool/vol001 /mnt/test") self._cmdEq("mount /dev/default_pool/vol001 /mnt/test") main.main("ssm mount -o discard /dev/default_pool/vol001 /mnt/test") self._cmdEq("mount -o discard /dev/default_pool/vol001 /mnt/test") main.main( "ssm mount --options rw,discard,neco=44 /dev/my_pool/vol002 /mnt/test1" ) self._cmdEq( "mount -o rw,discard,neco=44 /dev/my_pool/vol002 /mnt/test1") # Non existing volume main.main("ssm mount nonexisting /mnt/test1") self._cmdEq("mount nonexisting /mnt/test1") main.main("ssm mount -o discard,rw nonexisting /mnt/test1") self._cmdEq("mount -o discard,rw nonexisting /mnt/test1")
def _checkCmd(self, command, args, expected=None): self.run_data = [] for case in misc.permutations(args): cmd = command + " " + " ".join(case) main.main(cmd) if expected: self._cmdEq(expected)
def _checkCmd(self, command, args, expected=None, NotEq=False, expected_args=None): """ Note: Permutated arguments are joined 'as is', so if you want a space as a delimiter, it has to be part of the string """ self.run_data = [] for case in misc.permutations(args): cmd = command + " " + " ".join(case) main.main(cmd) if expected: if NotEq: self._cmdNotEq(expected, -1, expected_args) else: self._cmdEq(expected, -1, expected_args)
def test_btrfs_migrate(self): # Generate some storage data self._addDevice('/dev/sdd1', 11489037516) self._addDevice('/dev/sdd2', 11489037516) self._addDevice('/dev/sde', 11489037516) self._addPool('my_pool', ['/dev/sdc1', '/dev/sdc2']) self._addVol('vol002', 237284225, 1, 'my_pool', ['/dev/sdc1']) self._addPool('my_pool2', ['/dev/sdd1', '/dev/sdd2']) self._addVol('vol002', 237284225, 1, 'my_pool2', ['/dev/sdd1']) with self.assertRaises(problem.DeviceUsed): main.main("ssm migrate /dev/sdc1 /dev/sdc2") with self.assertRaises(problem.UserInterrupted): main.main("ssm migrate /dev/sde /dev/sdc2") self._checkCmd("ssm migrate /dev/sdc2 /dev/sde", [], "btrfs replace start -B /dev/sdc2 /dev/sde /tmp/mount") # test moving a dev from one fs to another with self.assertRaises(problem.UserInterrupted): main.main("ssm migrate /dev/sdc1 /dev/sdd2") self._checkCmd( "ssm -f migrate /dev/sdc1 /dev/sdd2", [], "btrfs replace start -f -B /dev/sdc1 /dev/sdd2 /tmp/mount") self.assertTrue( "btrfs device delete /dev/sdd2 /tmp/mount" in self.run_data)
def test_lvm_migrate(self): # Generate some storage data self._addDevice('/dev/sdd1', 11489037516) self._addDevice('/dev/sdd2', 11489037516) self._addDevice('/dev/sde', 11489037516) self._addPool('my_pool', ['/dev/sdc1', '/dev/sdc2']) self._addVol('vol002', 237284225, 1, 'my_pool', ['/dev/sdc1']) self._addPool('my_pool2', ['/dev/sdd1', '/dev/sdd2']) self._addVol('vol002', 237284225, 1, 'my_pool2', ['/dev/sdd1']) self._checkCmd("ssm migrate /dev/sdc1 /dev/sdc2", [], "lvm pvmove --atomic /dev/sdc1 /dev/sdc2") self._checkCmd("ssm migrate /dev/sdc1 /dev/sde", [], "lvm pvmove --atomic /dev/sdc1 /dev/sde") with self.assertRaises(problem.UserInterrupted): main.main("ssm migrate /dev/sde /dev/sdc2") # test moving a pv from one pool to another with self.assertRaises(problem.UserInterrupted): main.main("ssm migrate /dev/sdc1 /dev/sdd2") self._checkCmd("ssm -f migrate /dev/sdc1 /dev/sdd2", [], "lvm pvmove --atomic /dev/sdc1 /dev/sdd2") self.assertTrue("lvm vgreduce -f my_pool2 /dev/sdd2" in self.run_data) self.assertTrue("lvm vgextend -f my_pool /dev/sdd2" in self.run_data)
def test_list_xfs(self): # Generate some storage data self._addPool('default_pool', ['/dev/sda', '/dev/sdb']) self._addPool('my_pool', ['/dev/sdc2', '/dev/sdc3', '/dev/sdc1']) self._addVol('vol001', 117283225, 1, 'default_pool', ['/dev/sda'], fstype="xfs") # Test what commands are called for list with xfs. # For unmounted fs, it shoud be xfs_db, otherwise os.statvfs. # This will raise an exception as we do not correctly mock the data, # but we need to only test what commands have been called # not what data was reported with self.assertRaises(KeyError) as context: main.main("ssm list volumes") self._cmdEq('xfs_db -r -c sb -c print /dev/default_pool/vol001') # mount it self._mountVol('vol001', 'default_pool', ['/dev/sda'], '/mnt/test1') # Here we get OSError because os.statvfs mock only throws this. # We do not need to test anything else, so this hard stop is all right # in this usecase. # Should we get anything else, it clearly goes to some other branch. with self.assertRaises(NotImplementedError) as context: main.main("ssm list volumes")
def test_mp_mock_raw_data(self): self._stdout = sys.stdout sys.stdout = self._stringio = StringIO() try: main.main("ssm list dev") finally: sys.stdout = self._stdout vol_entries = 0 for line in self._stringio.getvalue().splitlines(): if line[:6] in ['------', 'Device']: continue dev = line.split(" ") if dev[0] in ['/dev/dm-90', '/dev/dm-91']: vol_entries += 1 self.assertEqual( vol_entries, 2, "List vol should show 2 entries for 2 multipath devices, but found {0}." .format(vol_entries)) # There should be no output for pools sys.stdout = self._stringio = StringIO() try: main.main("ssm list pool") finally: sys.stdout = self._stdout self.assertEqual(self._stringio.getvalue(), "", "Multipath should show no pool, but has some.") # There should be no output for vols sys.stdout = self._stringio = StringIO() try: main.main("ssm list vol") finally: sys.stdout = self._stdout self.assertEqual(self._stringio.getvalue(), "", "Multipath should show no vols, but has some.") sys.stdout = self._stringio = StringIO() try: main.main("ssm list vol") finally: sys.stdout = self._stdout
def test_mp_mock_raw_data(self): self._stdout = sys.stdout sys.stdout = self._stringio = StringIO() try: main.main("ssm list dev") finally: sys.stdout = self._stdout # keep this commented block here for some time in case we decide to hide the devices #for line in self._stringio.getvalue().splitlines(): # dev = line.split(' ')[0] # self.assertNotEqual(dev, "/dev/sda", "Multipath devices should be hidden in list dev: /dev/sda") # self.assertNotEqual(dev, "/dev/sdb", "Multipath devices should be hidden in list dev: /dev/sdb.") # self.assertNotEqual(dev, "/dev/dm-90", "Multipath devices should be hidden in list dev: /dev/dm-90.") # self.assertNotEqual(dev, "/dev/mapper/mpatha", "Multipath devices should be hidden in list dev: /dev/mapper/mpatha.") # There should be no output for pools sys.stdout = self._stringio = StringIO() try: main.main("ssm list pool") finally: sys.stdout = self._stdout self.assertEqual(self._stringio.getvalue(), "", "Multipath should show no pool, but has some.") sys.stdout = self._stringio = StringIO() try: main.main("ssm list vol") finally: sys.stdout = self._stdout vol_entries = 0 for line in self._stringio.getvalue().splitlines(): if line[:6] in ['------', 'Volume']: continue dev = line.split(" ") if dev[0] in ['/dev/dm-90', '/dev/dm-91']: vol_entries += 1 self.assertEqual( vol_entries, 2, "List vol should show exactly 2 entries for 2 multipath volumes, but found {0}." .format(vol_entries))
def test_lvm_remove(self): # Generate some storage data self._addPool('default_pool', ['/dev/sda', '/dev/sdb']) self._addPool('my_pool', ['/dev/sdc2', '/dev/sdc3', '/dev/sdc1']) self._addVol('vol001', 117283225, 1, 'default_pool', ['/dev/sda']) self._addVol('vol002', 237284225, 1, 'default_pool', ['/dev/sda']) self._addVol('vol003', 1024, 1, 'default_pool', ['/dev/sdd']) self._addVol('vol004', 209715200, 2, 'default_pool', ['/dev/sda', '/dev/sdb']) # remove volume main.main("ssm remove /dev/default_pool/vol002") self._cmdEq("lvm lvremove /dev/default_pool/vol002") # remove multiple volumes main.main("ssm remove /dev/default_pool/vol002 /dev/default_pool/vol003") self.assertEqual(self.run_data[-2], "lvm lvremove /dev/default_pool/vol002") self._cmdEq("lvm lvremove /dev/default_pool/vol003") # remove pool main.main("ssm remove my_pool") self._cmdEq("lvm vgremove my_pool") # remove multiple pools main.main("ssm remove my_pool default_pool") self.assertEqual(self.run_data[-2], "lvm vgremove my_pool") self._cmdEq("lvm vgremove default_pool") # remove device main.main("ssm remove /dev/sdc1") self._cmdEq("lvm vgreduce my_pool /dev/sdc1") # remove multiple devices main.main("ssm remove /dev/sdc1 /dev/sdb") self.assertEqual(self.run_data[-2], "lvm vgreduce my_pool /dev/sdc1") self._cmdEq("lvm vgreduce default_pool /dev/sdb") # remove combination main.main("ssm remove /dev/sdb my_pool /dev/default_pool/vol001") self.assertEqual(self.run_data[-3], "lvm vgreduce default_pool /dev/sdb") self.assertEqual(self.run_data[-2], "lvm vgremove my_pool") self._cmdEq("lvm lvremove /dev/default_pool/vol001") # remove all main.main("ssm remove --all") self.assertEqual(self.run_data[-2], "lvm vgremove default_pool") self._cmdEq("lvm vgremove my_pool") # remove force main.main("ssm -f remove /dev/default_pool/vol002") self._cmdEq("lvm lvremove -f /dev/default_pool/vol002") # remove verbose main.main("ssm -v remove /dev/default_pool/vol002") self._cmdEq("lvm lvremove -v /dev/default_pool/vol002") # remove verbose + force main.main("ssm -v -f remove /dev/default_pool/vol002") self._cmdEq("lvm lvremove -v -f /dev/default_pool/vol002")
def test_btrfs_mount(self): self._addDir("/mnt/test") self._addDir("/mnt/test1") self._addDir("/mnt/test2") # Generate some storage data self._addPool('default_pool', ['/dev/sda', '/dev/sdb']) self._addPool('my_pool', ['/dev/sdc2', '/dev/sdc3', '/dev/sdc1']) self._addVol('vol001', 117283225, 1, 'default_pool', ['/dev/sda']) self._addVol('vol002', 237284225, 1, 'default_pool', ['/dev/sda'], '/mnt/mount1') self._addVol('vol003/vol006', 1024, 1, 'default_pool', ['/dev/sdd']) self._addVol('vol004', 209715200, 2, 'default_pool', ['/dev/sda', '/dev/sdb'], '/mnt/mount') # Mount subvolume main.main("ssm mount default_pool:/dev/default_pool/vol002 /mnt/test") self._cmdEq("mount -o subvolid=2 /dev/sda /mnt/test") main.main( "ssm mount -o discard default_pool:/dev/default_pool/vol002 /mnt/test" ) self._cmdEq("mount -o discard,subvolid=2 /dev/sda /mnt/test") main.main( "ssm mount --options rw,discard,neco=44 default_pool:/dev/default_pool/vol004 /mnt/test1" ) self._cmdEq( "mount -o rw,discard,neco=44,subvolid=4 /dev/sda /mnt/test1") main.main( "ssm mount -o discard default_pool:/dev/default_pool/vol003/vol006 /mnt/test2" ) self._cmdEq("mount -o discard,subvolid=3 /dev/sda /mnt/test2") # Mount the whole file system main.main("ssm mount default_pool /mnt/test2") self._cmdEq("mount -o subvolid=0 /dev/sda /mnt/test2") main.main( "ssm mount --options rw,discard,neco=44 default_pool /mnt/test1") self._cmdEq( "mount -o rw,discard,neco=44,subvolid=0 /dev/sda /mnt/test1") main.main("ssm mount /dev/sdb /mnt/test1") self._cmdEq("mount /dev/sdb /mnt/test1") main.main("ssm mount -o rw,discard,neco=44 /dev/sdb /mnt/test1") self._cmdEq("mount -o rw,discard,neco=44 /dev/sdb /mnt/test1") # Non existing volume main.main("ssm mount nonexisting /mnt/test1") self._cmdEq("mount nonexisting /mnt/test1") main.main("ssm mount -o discard,rw nonexisting /mnt/test1") self._cmdEq("mount -o discard,rw nonexisting /mnt/test1")
def test_migrate(self): # Generate some storage data self._addPool('default_pool', ['/dev/sda', '/dev/sdb']) self._addPool('my_pool', ['/dev/sdc2', '/dev/sdc3', '/dev/sdc1']) self._addVol('vol001', 117283225, 1, 'default_pool', ['/dev/sda']) self._addVol('vol002', 237284225, 1, 'default_pool', ['/dev/sda']) self._addVol('vol003', 1024, 1, 'default_pool', ['/dev/sdb'],) self._addVol('vol004', 209715200, 2, 'default_pool', ['/dev/sda', '/dev/sdb']) # migrate a pv to an unused device main.main("ssm migrate /dev/sda /dev/sdd") self._cmdEq("migrate default_pool /dev/sda /dev/sdd") # migrate data between pvs within a vg main.main("ssm migrate /dev/sda /dev/sdb") self._cmdEq("migrate default_pool /dev/sda /dev/sdb") # try a used device without -f with self.assertRaises(problem.UserInterrupted): main.main("ssm migrate /dev/sdc2 /dev/sda") # again, this time with -f main.main("ssm -f migrate /dev/sdc2 /dev/sda") self._cmdEq("force migrate my_pool /dev/sdc2 /dev/sda") # migrate raw devices main.main("ssm migrate /dev/sdf /dev/sdg") self._cmdEq("dd if=/dev/sdf of=/dev/sdg conv=fsync") with self.assertRaises(SystemExit): main.main("ssm migrate /dev/sdc2") with self.assertRaises(SystemExit): main.main("ssm migrate /dev/foo /dev/bar") with self.assertRaises(SystemExit): main.main("ssm migrate /dev/sda /dev/sdb /dev/sde") with self.assertRaises(problem.DuplicateTarget): main.main("ssm migrate /dev/sda /dev/sda")