def test_upgrade_0(self):
     """Test the upgrade from the first shelf layout version."""
     self._build_layout_version_0()
     old_shelf = LegacyShareFileShelf(self.share_md_dir)
     # add the root_uuid key
     root_share = _Share(path=self.root_dir)
     root_share.access_level = ACCESS_LEVEL_RW
     old_shelf[request.ROOT] = root_share
     for idx in range(1, 10):
         sid = str(uuid.uuid4())
         old_shelf[sid] = _Share(
             path=os.path.join(self.shares_dir, str(idx)), share_id=sid)
     # ShareFileShelf.keys returns a generator
     old_keys = [key for key in old_shelf.keys()]
     self.assertEqual(10, len(old_keys))
     if self.md_version_None:
         self.set_md_version('')
     # set the ro permissions
     self._set_permissions()
     self.main = FakeMain(self.new_root_dir, self.new_shares_dir,
                          self.data_dir, self.partials_dir)
     new_keys = [new_key for new_key in self.main.vm.shares.keys()]
     self.assertEqual(10, len(new_keys))
     for new_key in new_keys:
         self.assertIn(new_key, old_keys)
     # check the old data is still there (in the backup)
     bkp_dir = os.path.join(os.path.dirname(self.vm_data_dir),
                            '5.bkp', '0.bkp')
     backup_shelf = LegacyShareFileShelf(bkp_dir)
     backup_keys = [key for key in backup_shelf.keys()]
     for old_key in old_keys:
         self.assertIn(old_key, backup_keys)
     for new_key in new_keys:
         self.assertIn(new_key, backup_keys)
     self.check_version()
    def test_missing_version_file_with_version_non_0(self):
        """Test the upgrade from the first shelf layout version
        while the metadata sould be in v3 or greater format.

        """
        self._build_layout_version_1()
        maybe_old_shelf = LegacyShareFileShelf(self.share_md_dir)
        # add the root_uuid key
        root_share = _Share(path=self.root_dir)
        root_share.access_level = ACCESS_LEVEL_RW
        maybe_old_shelf[request.ROOT] = root_share
        for idx in range(1, 10):
            share_id = str(uuid.uuid4())
            maybe_old_shelf[share_id] = _Share(
                share_id=share_id, path=os.path.join(self.shares_dir, str(idx))
            )
        # ShareFileShelf.keys returns a generator
        maybe_old_keys = [key for key in maybe_old_shelf.keys()]
        self.assertEqual(10, len(maybe_old_keys))
        if self.md_version_None:
            self.set_md_version('')
        self.main = FakeMain(self.new_root_dir, self.new_shares_dir,
                             self.data_dir, self.partials_dir)
        new_keys = [new_key for new_key in self.main.vm.shares.keys()]
        self.assertEqual(10, len(new_keys))
        for new_key in new_keys:
            self.assertIn(new_key, maybe_old_keys)
        # as we didn't actually upgrade the shelf, just the .version file
        # check the empty 0.bkp
        # check the old data is still there (in the backup)
        backup_shelf = LegacyShareFileShelf(os.path.join(self.vm_data_dir,
                                                         '0.bkp'))
        backup_keys = [key for key in backup_shelf.keys()]
        self.assertEqual(0, len(backup_keys))
        self.check_version()
    def test_upgrade_5_critical_error(self):
        """Test the migration from version 5 with a critical error."""
        # build a fake version 5 state
        self._build_layout_version_4()
        self.set_md_version('5')
        # create some old shares and shared metadata
        legacy_shares = LegacyShareFileShelf(self.share_md_dir)
        root_share = _Share(path=self.root_dir, share_id=request.ROOT,
                            access_level=ACCESS_LEVEL_RW)
        legacy_shares[request.ROOT] = root_share
        for idx, name in enumerate(['share'] * 10):
            sid = str(uuid.uuid4())
            share_name = name + '_' + str(idx)
            share = _Share(path=os.path.join(self.shares_dir, share_name),
                           share_id=sid, name=share_name,
                           node_id=str(uuid.uuid4()),
                           other_username='******' + str(idx),
                           other_visible_name='visible name ' + str(idx))
            if idx % 2:
                share.access_level = ACCESS_LEVEL_RW
            else:
                share.access_level = ACCESS_LEVEL_RO
            legacy_shares[sid] = share
        # create shared shares
        legacy_shared = LegacyShareFileShelf(self.shared_md_dir)
        for idx, name in enumerate(['dir'] * 5):
            sid = str(uuid.uuid4())
            share_name = name + '_' + str(idx)
            share = _Share(path=os.path.join(self.root_dir, share_name),
                           share_id=sid, node_id=str(uuid.uuid4()),
                           name=share_name, other_username='******',
                           other_visible_name='hola')
            if idx % 2:
                share.access_level = ACCESS_LEVEL_RW
            else:
                share.access_level = ACCESS_LEVEL_RO
            legacy_shared[sid] = share

        # keep a copy of the current shares and shared metadata to check
        # the upgrade went ok
        legacy_shares = dict(legacy_shares.items())
        legacy_shared = dict(legacy_shared.items())

        if self.md_version_None:
            self.set_md_version('')
        # upgrade it!
        old_upgrade_share_to_volume = MetadataUpgrader._upgrade_share_to_volume

        def upgrade_share_to_volume(share, shared=False):
            raise ValueError('FAIL!')
        MetadataUpgrader._upgrade_share_to_volume = upgrade_share_to_volume
        try:
            self.assertRaises(ValueError, FakeMain, self.root_dir,
                              self.shares_dir, self.data_dir,
                              self.partials_dir)
        finally:
            MetadataUpgrader._upgrade_share_to_volume = \
                    old_upgrade_share_to_volume

        shares = LegacyShareFileShelf(self.share_md_dir)
        self.assertEqual(len(list(shares.keys())), len(legacy_shares.keys()))
        for sid, share in shares.iteritems():
            old_share = legacy_shares[sid]
            self.assertTrue(isinstance(share, _Share))
            self.assertTrue(isinstance(old_share, _Share))
        shared = LegacyShareFileShelf(self.shared_md_dir)
        self.assertEqual(len(list(shared.keys())), len(legacy_shared.keys()))
        for sid, share in shared.iteritems():
            old_share = legacy_shared[sid]
            self.assertTrue(isinstance(share, _Share))
            self.assertTrue(isinstance(old_share, _Share))