Exemple #1
0
    def test_handle_container_update_metadata(self, mock_swift, mock_exists,
                                              mock_open):
        mock_exists.return_value = True
        old_hash = hash_dict({'X-Container-Meta': 'foo'})
        db_entries = {
            'db-id-1': {
                'aws_bucket': 'bucket',
                'last_row': 5,
                SyncContainer.METADATA_HASH_KEY: old_hash
            }
        }
        fake_conf_file = self.MockMetaConf(db_entries)
        mock_open.return_value = fake_conf_file

        settings = {
            'aws_bucket': self.aws_bucket,
            'aws_identity': 'identity',
            'aws_secret': 'credential',
            'aws_endpoint': 'http://example.com',
            'account': 'account',
            'sync_container_metadata': True,
            'container': 'container',
            'protocol': 'swift'
        }

        sync = SyncContainer(self.scratch_space, settings, self.stats_factory)
        metadata = {
            'X-Container-Meta-Foo': ('foo', '1545160000.1234'),
            'X-Container-Meta-Bar': ('bar', '1546123456.7896'),
            'Some-Other-Key': ('val', '1545179217.201453'),
            'X-Versions-Locations': ('versions', '1545179217.201453')
        }
        mock_swift.return_value.post_container.return_value = {}

        sync.handle_container_info({'id': 'db-id-1'}, metadata)
        mock_swift.assert_called_once_with(authurl='http://example.com',
                                           key='credential',
                                           user='******',
                                           os_options={},
                                           retries=3)
        self.assertEqual([
            mock.call.post_container(self.aws_bucket,
                                     headers={
                                         'X-Container-Meta-Foo': 'foo',
                                         'X-Container-Meta-Bar': 'bar'
                                     })
        ], mock_swift.return_value.mock_calls)
Exemple #2
0
    def test_handle_container_same_metadata(self, mock_swift, mock_exists,
                                            mock_open):
        mock_exists.return_value = True
        metadata = {
            'X-Container-Meta-Foo': ('foo', '1545160000.1234'),
            'X-Container-Meta-Bar': ('bar', '1546123456.7896'),
            'Some-Other-Key': ('val', '1545179217.201453'),
            'X-Versions-Locations': ('versions', '1545179217.201453')
        }
        meta_hash = hash_dict({
            'X-Container-Meta-Foo': 'foo',
            'X-Container-Meta-Bar': 'bar'
        })
        db_entries = {
            'db-id-1': {
                'aws_bucket': 'bucket',
                'last_row': 5,
                SyncContainer.METADATA_HASH_KEY: meta_hash
            }
        }
        fake_conf_file = self.MockMetaConf(db_entries)
        mock_open.return_value = fake_conf_file

        settings = {
            'aws_bucket': self.aws_bucket,
            'aws_identity': 'identity',
            'aws_endpoint': 'http://example.com',
            'aws_secret': 'credential',
            'account': 'account',
            'sync_container_metadata': True,
            'container': 'container',
            'protocol': 'swift'
        }

        sync = SyncContainer(self.scratch_space, settings, self.stats_factory)

        sync.handle_container_info({'id': 'db-id-1'}, metadata)
        # Connections are lazy-initialized
        mock_swift.assert_not_called()
Exemple #3
0
    def test_handle_container_info_errors(self, mock_swift):
        db_entries = {'db-id-1': {'aws_bucket': 'bucket', 'last_row': 5}}
        settings = {
            'aws_bucket': self.aws_bucket,
            'aws_identity': 'identity',
            'aws_secret': 'credential',
            'aws_endpoint': 'http://example.com',
            'account': 'account',
            'sync_container_metadata': True,
            'container': 'container',
            'protocol': 'swift'
        }

        metadata = {
            'X-Container-Meta-Foo': ('foo', '1545179217.201453'),
            'X-Delete-At': ('1645179217', '1545179217.201453'),
            'Some-Other-Key': ('val', '1545179217.201453'),
            'X-Versions-Locations': ('versions', '1545179217.201453'),
            'X-Container-Meta-Bar': ('bar', '1545179217.201453'),
        }

        tmpdir = tempfile.mkdtemp()
        try:
            os.makedirs(os.path.join(tmpdir, 'account'))
            with open(os.path.join(tmpdir, 'account', 'container'), 'w') as fh:
                fh.write(json.dumps(db_entries))

            sync = SyncContainer(tmpdir, settings, self.stats_factory)
            sync.logger = mock.Mock()
            mock_swift.return_value.post_container.side_effect = RuntimeError(
                'failed to post container')
            sync.handle_container_info({'id': 'db-id-1'}, metadata)
            sync.logger.error.assert_called_once_with(mock.ANY)
            sync.logger.debug.assert_called_once_with(mock.ANY)
        finally:
            shutil.rmtree(tmpdir)