Пример #1
0
def get_repo_checksum_type(publish_conduit, config):
    """
    Lookup checksum type on the repo to use for metadata generation;
    importer sets this value if available on the repo scratchpad.

    WARNING: This method has a side effect of saving the checksum type on the distributor
    config if a checksum has not already been set on the distributor config. However, it
    will only save the checksum type if it was explicitly provided. It will not save a
    checksum type to the distributor if the default was used.

    :param publish_conduit: publish conduit
    :type  publish_conduit: pulp.plugins.conduits.repo_publish.RepoPublishConduit
    :param config:          plugin configuration
    :type  config:          pulp.plugins.config.PluginCallConfiguration

    :return the type of checksum to use for the repository
    :rtype str
    """
    # Try to get the checksum type from the config; otherwise, fall back to the scratchpad
    checksum_type = config.get(CONFIG_KEY_CHECKSUM_TYPE)
    if not checksum_type:
        scratchpad_data = publish_conduit.get_repo_scratchpad()
        if scratchpad_data and SCRATCHPAD_DEFAULT_METADATA_CHECKSUM in scratchpad_data:
            checksum_type = scratchpad_data[
                SCRATCHPAD_DEFAULT_METADATA_CHECKSUM]

    if checksum_type == 'sha':
        checksum_type = 'sha1'

    distributor_config = config.repo_plugin_config
    if CONFIG_KEY_CHECKSUM_TYPE not in distributor_config and checksum_type:
        try:
            dist = model.Distributor.objects.get_or_404(
                repo_id=publish_conduit.repo_id,
                distributor_id=publish_conduit.distributor_id)
            if dist.distributor_type_id == TYPE_ID_DISTRIBUTOR_YUM:
                dist_controller.update(dist.repo_id,
                                       dist.distributor_id,
                                       config={'checksum_type': checksum_type})
        except MissingResource:
            # If the distributor doesn't exist on the repo (such as with a group distributor
            # this is ok
            pass

    # If no checksum type is set, use the default
    if not checksum_type:
        checksum_type = CONFIG_DEFAULT_CHECKSUM

    return checksum_type
Пример #2
0
    def test_bindings_err(self, m_exception, m_model, m_plug_api, m_plug_call_conf,
                          m_repo_conf_conduit, m_managers, m_task):
        """
        Test handling of errors raised by binding consumers.
        """
        repo = m_model.Repository.objects.get_repo_or_missing_resource.return_value
        dist = m_model.Distributor.objects.get_or_404.return_value
        dist.config = {'dist': 'conf'}
        m_dist_inst = mock.MagicMock()
        m_plug_config = mock.MagicMock()
        m_plug_api.get_distributor_by_id.return_value = (m_dist_inst, m_plug_config)
        m_call_conf = m_plug_call_conf.return_value
        m_conf_conduit = m_repo_conf_conduit.return_value
        m_dist_inst.validate_config.return_value = True
        m_bind_man = m_managers.consumer_bind_manager.return_value
        m_bind = {'consumer_id': 'cid', 'repo_id': 'rid', 'distributor_id': 'did',
                  'notify_agent': 'ag', 'binding_config': 'bind_conf'}
        m_bind_man.find_by_distributor.return_value = [m_bind]
        m_bind_man.bind.side_effect = Exception("dang")

        result = distributor.update(dist, {'dist': 'conf'}, {})

        m_plug_api.get_distributor_by_id.assert_called_once_with(dist.distributor_type_id)
        m_plug_call_conf.assert_called_once_with(m_plug_config, {'dist': 'conf'})
        m_repo_conf_conduit.assert_called_once_with(dist.distributor_type_id)
        m_dist_inst.validate_config.assert_called_once_with(repo.to_transfer_repo.return_value,
                                                            m_call_conf, m_conf_conduit)
        m_model.Distributor.SERIALIZER.assert_called_once_with(dist)
        m_task.assert_called_once_with(m_model.Distributor.SERIALIZER.return_value.data,
                                       error=m_exception.return_value, spawned_tasks=[])
        m_bind_man.bind.assert_called_once_with(
            m_bind['consumer_id'], m_bind['repo_id'], m_bind['distributor_id'],
            m_bind['notify_agent'], m_bind['binding_config'], {})
        self.assertTrue(result is m_task.return_value)
Пример #3
0
    def test_remove_none_values(self, m_model, m_plug_api, m_plug_call_conf, m_repo_conf_conduit,
                                m_managers, m_task):
        """
        Ensure that None value in the update removes the associated key from the distributor config.
        """
        repo = m_model.Repository.objects.get_repo_or_missing_resource.return_value
        dist = m_model.Distributor.objects.get_or_404.return_value
        m_dist_inst = mock.MagicMock()
        m_plug_config = mock.MagicMock()
        m_plug_api.get_distributor_by_id.return_value = (m_dist_inst, m_plug_config)
        m_call_conf = m_plug_call_conf.return_value
        m_conf_conduit = m_repo_conf_conduit.return_value
        m_dist_inst.validate_config.return_value = True
        m_bind_man = m_managers.consumer_bind_manager.return_value
        m_bind_man.find_by_distributor.return_value = []

        result = distributor.update('rid', 'did', {'rm': None}, {})

        m_plug_api.get_distributor_by_id.assert_called_once_with(dist.distributor_type_id)
        m_plug_call_conf.assert_called_once_with(m_plug_config, dist.config)
        m_repo_conf_conduit.assert_called_once_with(dist.distributor_type_id)
        m_dist_inst.validate_config.assert_called_once_with(repo.to_transfer_repo.return_value,
                                                            m_call_conf, m_conf_conduit)
        m_model.Distributor.SERIALIZER.assert_called_once_with(dist)
        m_task.assert_called_once_with(m_model.Distributor.SERIALIZER.return_value.data,
                                       error=None, spawned_tasks=[])
        self.assertTrue(result is m_task.return_value)
Пример #4
0
    def test_bindings_spawn(self, m_model, m_plug_api, m_plug_call_conf, m_repo_conf_conduit,
                            m_managers, m_task):
        """
        Ensure that when tasks are spawned by binding consumers, they are included in the result.
        """
        repo = m_model.Repository.objects.get_repo_or_missing_resource.return_value
        dist = m_model.Distributor.objects.get_or_404.return_value
        dist.config = {'dist': 'conf'}
        m_dist_inst = mock.MagicMock()
        m_plug_config = mock.MagicMock()
        m_plug_api.get_distributor_by_id.return_value = (m_dist_inst, m_plug_config)
        m_call_conf = m_plug_call_conf.return_value
        m_conf_conduit = m_repo_conf_conduit.return_value
        m_dist_inst.validate_config.return_value = True
        m_bind_man = m_managers.consumer_bind_manager.return_value
        m_bind = {'consumer_id': 'cid', 'repo_id': 'rid', 'distributor_id': 'did',
                  'notify_agent': 'ag', 'binding_config': 'bind_conf'}
        m_bind_man.find_by_distributor.return_value = [m_bind]
        m_bind_man.bind.return_value = mock.MagicMock(spawned_tasks=['spawned task'])

        result = distributor.update(dist, {'dist': 'conf'}, {})

        m_plug_api.get_distributor_by_id.assert_called_once_with(dist.distributor_type_id)
        m_plug_call_conf.assert_called_once_with(m_plug_config, {'dist': 'conf'})
        m_repo_conf_conduit.assert_called_once_with(dist.distributor_type_id)
        m_dist_inst.validate_config.assert_called_once_with(repo.to_transfer_repo.return_value,
                                                            m_call_conf, m_conf_conduit)
        m_model.Distributor.SERIALIZER.assert_called_once_with(dist)
        m_task.assert_called_once_with(m_model.Distributor.SERIALIZER.return_value.data,
                                       error=None, spawned_tasks=['spawned task'])
        m_bind_man.bind.assert_called_once_with(
            m_bind['consumer_id'], m_bind['repo_id'], m_bind['distributor_id'],
            m_bind['notify_agent'], m_bind['binding_config'], {})
        self.assertTrue(result is m_task.return_value)
Пример #5
0
    def test_distributor_update_with_bindings(self, mock_dist_manager,
                                              mock_bind_manager, mock_bind):
        generated_distributor = {'foo': 'bar'}
        mock_dist_manager.return_value.update_distributor_config.return_value = \
            generated_distributor
        mock_bind_manager.return_value.find_by_distributor.return_value = [{
            'consumer_id':
            'foo',
            'repo_id':
            'repo-foo',
            'distributor_id':
            'dist-id',
            'notify_agent':
            True,
            'binding_config': {
                'conf': 'baz'
            }
        }]

        mock_bind.return_value = TaskResult(
            spawned_tasks=[{
                'task_id': 'foo-request-id'
            }])

        result = dist_controller.update('foo-id', 'bar-id', {}, None)
        self.assertEquals(None, result.error)
        mock_bind.assert_called_once_with('foo', 'repo-foo', 'dist-id', True,
                                          {'conf': 'baz'}, ANY)
        self.assertEquals(result.spawned_tasks[0],
                          {'task_id': 'foo-request-id'})
Пример #6
0
    def test_minimal(self, m_model, m_plug_api, m_plug_call_conf, m_repo_conf_conduit, m_managers,
                     m_task):
        """
        Test that a minimal update works as expected.
        """
        repo = m_model.Repository.objects.get_repo_or_missing_resource.return_value
        dist = m_model.Distributor.objects.get_or_404.return_value
        dist.config = {}
        m_dist_inst = mock.MagicMock()
        m_plug_config = mock.MagicMock()
        m_plug_api.get_distributor_by_id.return_value = (m_dist_inst, m_plug_config)
        m_call_conf = m_plug_call_conf.return_value
        m_conf_conduit = m_repo_conf_conduit.return_value
        m_dist_inst.validate_config.return_value = True
        m_bind_man = m_managers.consumer_bind_manager.return_value
        m_bind_man.find_by_distributor.return_value = []

        result = distributor.update('rid', 'did', {'dist': 'conf'}, {})

        m_plug_api.get_distributor_by_id.assert_called_once_with(dist.distributor_type_id)
        m_plug_call_conf.assert_called_once_with(m_plug_config, {'dist': 'conf'})
        m_repo_conf_conduit.assert_called_once_with(dist.distributor_type_id)
        m_dist_inst.validate_config.assert_called_once_with(repo.to_transfer_repo.return_value,
                                                            m_call_conf, m_conf_conduit)
        m_model.Distributor.SERIALIZER.assert_called_once_with(dist)
        m_task.assert_called_once_with(m_model.Distributor.SERIALIZER.return_value.data,
                                       error=None, spawned_tasks=[])
        self.assertTrue(result is m_task.return_value)
Пример #7
0
    def test_distributor_update_with_agent_errors(self, mock_dist_manager,
                                                  mock_bind_manager,
                                                  mock_bind):
        generated_distributor = {'foo': 'bar'}
        mock_dist_manager.return_value.update_distributor_config.return_value = \
            generated_distributor
        mock_bind_manager.return_value.find_by_distributor.return_value = [{
            'consumer_id':
            'foo',
            'repo_id':
            'repo-foo',
            'distributor_id':
            'dist-id',
            'notify_agent':
            True,
            'binding_config': {
                'conf': 'baz'
            }
        }]
        side_effect_exception = PulpException('foo')
        mock_bind.side_effect = side_effect_exception

        result = dist_controller.update('foo-id', 'bar-id', {}, None)

        self.assertTrue(isinstance(result.error, PulpException))
        self.assertEquals(result.error.error_code, error_codes.PLP0002)
        self.assertEquals(result.error.child_exceptions[0],
                          side_effect_exception)
Пример #8
0
 def test_distributor_update_with_auto_publish(self, mock_dist_manager, mock_bind_manager):
     config = {}
     delta = {'auto_publish': True}
     result = dist_controller.update('foo-id', 'bar-id', {}, delta)
     mock_dist_manager.return_value.update_distributor_config. \
         assert_called_with('foo-id', 'bar-id', config, True)
     self.assertTrue(isinstance(result, TaskResult))
Пример #9
0
def get_repo_checksum_type(publish_conduit, config):
    """
    Lookup checksum type on the repo to use for metadata generation;
    importer sets this value if available on the repo scratchpad.

    WARNING: This method has a side effect of saving the checksum type on the distributor
    config if a checksum has not already been set on the distributor config. However, it
    will only save the checksum type if it was explicitly provided. It will not save a
    checksum type to the distributor if the default was used.

    :param publish_conduit: publish conduit
    :type  publish_conduit: pulp.plugins.conduits.repo_publish.RepoPublishConduit
    :param config:          plugin configuration
    :type  config:          pulp.plugins.config.PluginCallConfiguration

    :return the type of checksum to use for the repository
    :rtype str
    """
    # Try to get the checksum type from the config; otherwise, fall back to the scratchpad
    checksum_type = config.get(CONFIG_KEY_CHECKSUM_TYPE)
    if not checksum_type:
        scratchpad_data = publish_conduit.get_repo_scratchpad()
        if scratchpad_data and SCRATCHPAD_DEFAULT_METADATA_CHECKSUM in scratchpad_data:
            checksum_type = scratchpad_data[SCRATCHPAD_DEFAULT_METADATA_CHECKSUM]

    if checksum_type == "sha":
        checksum_type = "sha1"

    distributor_config = config.repo_plugin_config
    if CONFIG_KEY_CHECKSUM_TYPE not in distributor_config and checksum_type:
        try:
            dist = model.Distributor.objects.get_or_404(
                repo_id=publish_conduit.repo_id, distributor_id=publish_conduit.distributor_id
            )
            if dist.distributor_type_id == TYPE_ID_DISTRIBUTOR_YUM:
                dist_controller.update(dist.repo_id, dist.distributor_id, config={"checksum_type": checksum_type})
        except MissingResource:
            # If the distributor doesn't exist on the repo (such as with a group distributor
            # this is ok
            pass

    # If no checksum type is set, use the default
    if not checksum_type:
        checksum_type = CONFIG_DEFAULT_CHECKSUM

    return checksum_type
Пример #10
0
 def test_distributor_update_with_auto_publish(self, mock_dist_manager,
                                               mock_bind_manager):
     config = {}
     delta = {'auto_publish': True}
     result = dist_controller.update('foo-id', 'bar-id', {}, delta)
     mock_dist_manager.return_value.update_distributor_config. \
         assert_called_with('foo-id', 'bar-id', config, True)
     self.assertTrue(isinstance(result, TaskResult))
Пример #11
0
    def test_distributor_update_no_bindings(self, mock_dist_manager, mock_bind_manager):
        config = {'configvalue': 'baz'}
        generated_distributor = {'foo': 'bar'}
        mock_dist_manager.return_value.update_distributor_config.return_value = \
            generated_distributor

        # Use None for the delta value to ensure it doesn't throw an exception
        result = dist_controller.update('foo-id', 'bar-id', config, None)

        mock_dist_manager.return_value.update_distributor_config. \
            assert_called_with('foo-id', 'bar-id', config, None)
        self.assertTrue(isinstance(result, TaskResult))
        util.compare_dict(generated_distributor, result.return_value)
        self.assertEquals(None, result.error)
Пример #12
0
    def test_distributor_update_no_bindings(self, mock_dist_manager,
                                            mock_bind_manager):
        config = {'configvalue': 'baz'}
        generated_distributor = {'foo': 'bar'}
        mock_dist_manager.return_value.update_distributor_config.return_value = \
            generated_distributor

        # Use None for the delta value to ensure it doesn't throw an exception
        result = dist_controller.update('foo-id', 'bar-id', config, None)

        mock_dist_manager.return_value.update_distributor_config. \
            assert_called_with('foo-id', 'bar-id', config, None)
        self.assertTrue(isinstance(result, TaskResult))
        util.compare_dict(generated_distributor, result.return_value)
        self.assertEquals(None, result.error)
Пример #13
0
    def test_distributor_update_with_bindings(self, mock_dist_manager, mock_bind_manager,
                                              mock_bind):
        generated_distributor = {'foo': 'bar'}
        mock_dist_manager.return_value.update_distributor_config.return_value = \
            generated_distributor
        mock_bind_manager.return_value.find_by_distributor.return_value = [
            {'consumer_id': 'foo', 'repo_id': 'repo-foo', 'distributor_id': 'dist-id',
             'notify_agent': True, 'binding_config': {'conf': 'baz'}}]

        mock_bind.return_value = TaskResult(spawned_tasks=[{'task_id': 'foo-request-id'}])

        result = dist_controller.update('foo-id', 'bar-id', {}, None)
        self.assertEquals(None, result.error)
        mock_bind.assert_called_once_with('foo', 'repo-foo', 'dist-id', True, {'conf': 'baz'}, ANY)
        self.assertEquals(result.spawned_tasks[0], {'task_id': 'foo-request-id'})
Пример #14
0
    def test_distributor_update_with_agent_errors(self, mock_dist_manager, mock_bind_manager,
                                                  mock_bind):
        generated_distributor = {'foo': 'bar'}
        mock_dist_manager.return_value.update_distributor_config.return_value = \
            generated_distributor
        mock_bind_manager.return_value.find_by_distributor.return_value = [
            {'consumer_id': 'foo', 'repo_id': 'repo-foo', 'distributor_id': 'dist-id',
             'notify_agent': True, 'binding_config': {'conf': 'baz'}}]
        side_effect_exception = PulpException('foo')
        mock_bind.side_effect = side_effect_exception

        result = dist_controller.update('foo-id', 'bar-id', {}, None)

        self.assertTrue(isinstance(result.error, PulpException))
        self.assertEquals(result.error.error_code, error_codes.PLP0002)
        self.assertEquals(result.error.child_exceptions[0], side_effect_exception)
Пример #15
0
    def test_remove_none_values_non_existing(self, m_model, m_plug_api, m_plug_call_conf,
                                             m_repo_conf_conduit, m_managers, m_task):
        """
        Test removing config option which does not exist in config.
        """
        m_dist_inst = mock.MagicMock()
        m_plug_config = mock.MagicMock()
        m_plug_api.get_distributor_by_id.return_value = (m_dist_inst, m_plug_config)
        m_dist_inst.validate_config.return_value = True
        m_bind_man = m_managers.consumer_bind_manager.return_value
        m_bind_man.find_by_distributor.return_value = []

        m_model.Distributor.objects.get_or_404.return_value.config = {}

        result = distributor.update('rid', 'did', {"checksum_type": None}, {})

        self.assertTrue(result is m_task.return_value)