コード例 #1
0
    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")
コード例 #2
0
ファイル: common.py プロジェクト: dinhxuanvu/ssm-1
 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)
コード例 #3
0
ファイル: common.py プロジェクト: system-storage-manager/ssm
 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)
コード例 #4
0
    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)
コード例 #5
0
    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)
コード例 #6
0
    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")
コード例 #7
0
    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
コード例 #8
0
    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))
コード例 #9
0
    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")
コード例 #10
0
ファイル: test_btrfs.py プロジェクト: dinhxuanvu/ssm-1
    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")
コード例 #11
0
    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")