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
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)
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)
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)
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'})
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)
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)
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))
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
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))
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)
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)
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'})
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)
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)