예제 #1
0
    def test_analyze_directory(self, list_files_mock, rsync_factory_mock,
                               tmpdir):
        """
        Unit test for RsyncCopyController._analyze_directory's code
        """

        # Build file list for ref
        ref_list = [
            _FileItem(
                'drwxrwxrwt', 69632,
                datetime(year=2015,
                         month=2,
                         day=9,
                         hour=15,
                         minute=1,
                         second=0,
                         tzinfo=dateutil.tz.tzlocal()), '.'),
            _FileItem(
                'drwxrwxrwt', 69612,
                datetime(year=2015,
                         month=2,
                         day=19,
                         hour=15,
                         minute=1,
                         second=22,
                         tzinfo=dateutil.tz.tzlocal()), 'tmp'),
            _FileItem(
                '-rw-r--r--', 69632,
                datetime(year=2015,
                         month=2,
                         day=20,
                         hour=18,
                         minute=15,
                         second=33,
                         tzinfo=dateutil.tz.tzlocal()), 'tmp/safe'),
            _FileItem(
                '-rw-r--r--', 69612,
                datetime(year=2015,
                         month=2,
                         day=20,
                         hour=19,
                         minute=15,
                         second=33,
                         tzinfo=dateutil.tz.tzlocal()), 'tmp/check'),
            _FileItem(
                '-rw-r--r--', 69612,
                datetime(year=2015,
                         month=2,
                         day=20,
                         hour=19,
                         minute=15,
                         second=33,
                         tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_time'),
            _FileItem(
                '-rw-r--r--', 69612,
                datetime(year=2015,
                         month=2,
                         day=20,
                         hour=19,
                         minute=15,
                         second=33,
                         tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_size'),
        ]

        # Build the list for source adding a new file, ...
        src_list = ref_list + [
            _FileItem(
                '-rw-r--r--', 69612,
                datetime(year=2015,
                         month=2,
                         day=20,
                         hour=22,
                         minute=15,
                         second=33,
                         tzinfo=dateutil.tz.tzlocal()), 'tmp/new'),
        ]
        # ... changing the timestamp one old file ...
        src_list[4] = _FileItem(
            '-rw-r--r--', 69612,
            datetime(year=2015,
                     month=2,
                     day=20,
                     hour=20,
                     minute=15,
                     second=33,
                     tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_time')
        # ... and changing the size of another
        src_list[5] = _FileItem(
            '-rw-r--r--', 77777,
            datetime(year=2015,
                     month=2,
                     day=20,
                     hour=19,
                     minute=15,
                     second=33,
                     tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_size')

        # Apply it to _list_files calls
        list_files_mock.side_effect = [ref_list, src_list]

        # Build the prerequisites
        server = build_real_server(
            global_conf={'barman_home': tmpdir.mkdir('home').strpath})
        config = server.config
        executor = server.backup_manager.executor

        # Create the RsyncCopyController putting the safe_horizon between
        # the tmp/safe and tmp2/check timestamps
        rcc = RsyncCopyController(
            path=server.path,
            ssh_command=executor.ssh_command,
            ssh_options=executor.ssh_options,
            network_compression=config.network_compression,
            reuse_backup=None,
            safe_horizon=datetime(year=2015,
                                  month=2,
                                  day=20,
                                  hour=19,
                                  minute=0,
                                  second=0,
                                  tzinfo=dateutil.tz.tzlocal()))

        backup_info = build_test_backup_info(
            server=server,
            pgdata="/pg/data",
            config_file="/etc/postgresql.conf",
            hba_file="/pg/data/pg_hba.conf",
            ident_file="/pg/data/pg_ident.conf",
            begin_xlog="0/2000028",
            begin_wal="000000010000000000000002",
            begin_offset=28)
        backup_info.save()
        # This is to check that all the preparation is done correctly
        assert os.path.exists(backup_info.filename)

        # Add a temp dir (usually created by copy method
        rcc.temp_dir = tmpdir.mkdir('tmp').strpath

        # Create an item to inspect
        item = _RsyncCopyItem(label='pgdata',
                              src=':/pg/data/',
                              dst=backup_info.get_data_directory(),
                              is_directory=True,
                              item_class=rcc.PGDATA_CLASS,
                              optional=False)

        # Then run the _analyze_directory method
        rcc._analyze_directory(item)

        # Verify that _rsync_factory has been called correctly
        assert rsync_factory_mock.mock_calls == [
            mock.call(item),
        ]

        # Verify that _list_files has been called correctly
        assert list_files_mock.mock_calls == [
            mock.call(rsync_factory_mock.return_value,
                      backup_info.get_data_directory() + '/'),
            mock.call(rsync_factory_mock.return_value, ':/pg/data/')
        ]

        # Check the result
        # 1) The list of directories should be there and should contain all
        # the directories
        assert item.dir_file
        assert open(item.dir_file).read() == ('.\n' 'tmp\n')
        # The exclude_and_protect file should be populated correctly with all
        # the files in the source
        assert item.exclude_and_protect_file
        assert open(
            item.exclude_and_protect_file).read() == ('P tmp/safe\n'
                                                      '- tmp/safe\n'
                                                      'P tmp/check\n'
                                                      '- tmp/check\n'
                                                      'P tmp/diff_time\n'
                                                      '- tmp/diff_time\n'
                                                      'P tmp/diff_size\n'
                                                      '- tmp/diff_size\n'
                                                      'P tmp/new\n'
                                                      '- tmp/new\n')
        # The check list must contain identical files after the safe_horizon
        assert len(item.check_list) == 1
        assert item.check_list[0].path == 'tmp/check'
        # The safe list must contain every file that is not in check and is
        # present in the source
        assert len(item.safe_list) == 4
        assert item.safe_list[0].path == 'tmp/safe'
        assert item.safe_list[1].path == 'tmp/diff_time'
        assert item.safe_list[2].path == 'tmp/diff_size'
        assert item.safe_list[3].path == 'tmp/new'
예제 #2
0
    def _run_analyze_directory(self, list_files_mock, tmpdir, ref_list,
                               src_list):
        # Apply it to _list_files calls
        list_files_mock.side_effect = [ref_list, src_list]

        # Build the prerequisites
        server = build_real_server(
            global_conf={"barman_home": tmpdir.mkdir("home").strpath})
        config = server.config
        executor = server.backup_manager.executor

        # Create the RsyncCopyController putting the safe_horizon between
        # the tmp/safe and tmp2/check timestamps
        rcc = RsyncCopyController(
            path=server.path,
            ssh_command=executor.ssh_command,
            ssh_options=executor.ssh_options,
            network_compression=config.network_compression,
            reuse_backup=None,
            safe_horizon=datetime(
                year=2015,
                month=2,
                day=20,
                hour=19,
                minute=0,
                second=0,
                tzinfo=dateutil.tz.tzlocal(),
            ),
        )

        backup_info = build_test_backup_info(
            server=server,
            pgdata="/pg/data",
            config_file="/etc/postgresql.conf",
            hba_file="/pg/data/pg_hba.conf",
            ident_file="/pg/data/pg_ident.conf",
            begin_xlog="0/2000028",
            begin_wal="000000010000000000000002",
            begin_offset=28,
        )
        backup_info.save()
        # This is to check that all the preparation is done correctly
        assert os.path.exists(backup_info.filename)

        # Add a temp dir (usually created by copy method
        rcc.temp_dir = tmpdir.mkdir("tmp").strpath

        # Create an item to inspect
        item = _RsyncCopyItem(
            label="pgdata",
            src=":/pg/data/",
            dst=backup_info.get_data_directory(),
            is_directory=True,
            item_class=rcc.PGDATA_CLASS,
            optional=False,
        )

        # Then run the _analyze_directory method
        rcc._analyze_directory(item)

        return item, backup_info