def _do_publish(group, distributor_id, distributor_instance, conduit, call_config): distributor_coll = RepoGroupDistributor.get_collection() publish_result_coll = RepoGroupPublishResult.get_collection() group_id = group.id # Perform the publish publish_start_timestamp = _now_timestamp() try: report = distributor_instance.publish_group( group, conduit, call_config) except Exception, e: publish_end_timestamp = _now_timestamp() # Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({ 'id': distributor_id, 'repo_group_id': group_id }) distributor['last_publish'] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish history entry for the run result = RepoGroupPublishResult.error_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, e, sys.exc_info()[2]) publish_result_coll.save(result) raise
def _do_publish(self, group, distributor_id, distributor_instance, conduit, call_config): distributor_coll = RepoGroupDistributor.get_collection() publish_result_coll = RepoGroupPublishResult.get_collection() group_id = group.id # Perform the publish publish_start_timestamp = _now_timestamp() try: report = distributor_instance.publish_group(group, conduit, call_config) except Exception, e: publish_end_timestamp = _now_timestamp() # Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({'id' : distributor_id, 'repo_group_id' : group_id}) distributor['last_publish'] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish history entry for the run result = RepoGroupPublishResult.error_result(group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, e, sys.exc_info()[2]) publish_result_coll.save(result, safe=True) _LOG.exception('Exception caught from plugin during publish call for group [%s]' % group_id) raise PulpExecutionException(e), None, sys.exc_info()[2]
def _do_publish(group, distributor_id, distributor_instance, conduit, call_config): distributor_coll = RepoGroupDistributor.get_collection() publish_result_coll = RepoGroupPublishResult.get_collection() group_id = group.id # Perform the publish publish_start_timestamp = _now_timestamp() try: report = distributor_instance.publish_group(group, conduit, call_config) except Exception, e: publish_end_timestamp = _now_timestamp() # Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({"id": distributor_id, "repo_group_id": group_id}) distributor["last_publish"] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish history entry for the run result = RepoGroupPublishResult.error_result( group_id, distributor_id, distributor["distributor_type_id"], publish_start_timestamp, publish_end_timestamp, e, sys.exc_info()[2], ) publish_result_coll.save(result, safe=True) raise
def test_publish_with_plugin_no_report(self): # Test self.publish_manager.publish(self.group_id, self.distributor_id) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_SUCCESS)
def test_publish_with_plugin_no_report(self, mock_get_working_directory): # Test self.publish_manager.publish(self.group_id, self.distributor_id) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_SUCCESS)
def test_publish_with_plugin_no_report(self): # Test distributor, instance, config = self.publish_manager._get_distributor_instance_and_config(self.group_id, self.distributor_id) self.publish_manager.publish(self.group_id, self.distributor_id, distributor, instance, config) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_SUCCESS)
def test_publish(self): # Setup summary = 'summary' details = 'details' mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = PublishReport( True, summary, details) # Test override_config = {'o': 'o'} self.publish_manager.publish(self.group_id, self.distributor_id, publish_config_override=override_config) # Verify # Plugin Call self.assertEqual( 1, mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.call_count) call_args = mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.call_args[ 0] self.assertTrue(isinstance(call_args[0], RepositoryGroup)) self.assertEqual(call_args[0].id, self.group_id) self.assertTrue(isinstance(call_args[1], RepoGroupPublishConduit)) self.assertEqual(call_args[1].group_id, self.group_id) self.assertEqual(call_args[1].distributor_id, self.distributor_id) self.assertTrue(isinstance(call_args[2], PluginCallConfiguration)) self.assertEqual(call_args[2].override_config, override_config) # History Entry history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['group_id'], self.group_id) self.assertEqual(history_entries[0]['distributor_id'], self.distributor_id) self.assertEqual(history_entries[0]['distributor_type_id'], 'mock-group-distributor') self.assertTrue(history_entries[0]['started'] is not None) self.assertTrue(history_entries[0]['completed'] is not None) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_SUCCESS) self.assertTrue(history_entries[0]['error_message'] is None) self.assertTrue(history_entries[0]['exception'] is None) self.assertTrue(history_entries[0]['traceback'] is None) self.assertEqual(history_entries[0]['summary'], summary) self.assertEqual(history_entries[0]['details'], details) # Distributor Update distributor = self.distributor_manager.get_distributor( self.group_id, self.distributor_id) self.assertTrue(distributor['last_publish'] is not None) # Clean Up mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = None
def test_publish(self): # Setup summary = 'summary' details = 'details' mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = PublishReport( True, summary, details) # Test override_config = {'o': 'o'} self.publish_manager.publish(self.group_id, self.distributor_id, publish_config_override=override_config) # Verify # Plugin Call self.assertEqual(1, mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.call_count) call_args = mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.call_args[0] self.assertTrue(isinstance(call_args[0], RepositoryGroup)) self.assertEqual(call_args[0].id, self.group_id) self.assertTrue(isinstance(call_args[1], RepoGroupPublishConduit)) self.assertEqual(call_args[1].group_id, self.group_id) self.assertEqual(call_args[1].distributor_id, self.distributor_id) self.assertTrue(isinstance(call_args[2], PluginCallConfiguration)) self.assertEqual(call_args[2].override_config, override_config) # History Entry history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['group_id'], self.group_id) self.assertEqual(history_entries[0]['distributor_id'], self.distributor_id) self.assertEqual(history_entries[0]['distributor_type_id'], 'mock-group-distributor') self.assertTrue(history_entries[0]['started'] is not None) self.assertTrue(history_entries[0]['completed'] is not None) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_SUCCESS) self.assertTrue(history_entries[0]['error_message'] is None) self.assertTrue(history_entries[0]['exception'] is None) self.assertTrue(history_entries[0]['traceback'] is None) self.assertEqual(history_entries[0]['summary'], summary) self.assertEqual(history_entries[0]['details'], details) # Distributor Update distributor = self.distributor_manager.get_distributor(self.group_id, self.distributor_id) self.assertTrue(distributor['last_publish'] is not None) # Clean Up mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = None
def test_publish_with_plugin_failure_report(self): # Setup summary = 'summary' details = 'details' mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = PublishReport(False, summary, details) # Test self.publish_manager.publish(self.group_id, self.distributor_id) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_FAILED) self.assertEqual(history_entries[0]['summary'], summary) self.assertEqual(history_entries[0]['details'], details) # Clean Up mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = None
def test_publish_with_plugin_failure_report(self): # Setup summary = 'summary' details = 'details' mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = PublishReport(False, summary, details) # Test distributor, instance, config = self.publish_manager._get_distributor_instance_and_config(self.group_id, self.distributor_id) self.publish_manager.publish(self.group_id, self.distributor_id, distributor, instance, config) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_FAILED) self.assertEqual(history_entries[0]['summary'], summary) self.assertEqual(history_entries[0]['details'], details) # Clean Up mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.return_value = None
def test_publish_with_plugin_exception(self): # Setup mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.side_effect = Exception() # Test self.assertRaises(PulpExecutionException, self.publish_manager.publish, self.group_id, self.distributor_id) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_ERROR) self.assertTrue(history_entries[0]['error_message'] is not None) self.assertTrue(history_entries[0]['exception'] is not None) self.assertTrue(history_entries[0]['traceback'] is not None) self.assertTrue(history_entries[0]['summary'] is None) self.assertTrue(history_entries[0]['details'] is None) # Clean Up mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.side_effect = None
def test_publish_with_plugin_exception(self): # Setup mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.side_effect = Exception() # Test distributor, instance, config = self.publish_manager._get_distributor_instance_and_config(self.group_id, self.distributor_id) self.assertRaises(PulpExecutionException, self.publish_manager.publish, self.group_id, self.distributor_id, distributor, instance, config) # Verify history_entries = list(RepoGroupPublishResult.get_collection().find()) self.assertEqual(1, len(history_entries)) self.assertEqual(history_entries[0]['result'], RepoGroupPublishResult.RESULT_ERROR) self.assertTrue(history_entries[0]['error_message'] is not None) self.assertTrue(history_entries[0]['exception'] is not None) self.assertTrue(history_entries[0]['traceback'] is not None) self.assertTrue(history_entries[0]['summary'] is None) self.assertTrue(history_entries[0]['details'] is None) # Clean Up mock_plugins.MOCK_GROUP_DISTRIBUTOR.publish_group.side_effect = None
class RepoGroupPublishManager(object): @staticmethod def publish(group_id, distributor_id, publish_config_override=None): """ Requests the given distributor publish the repository group. :param group_id: identifies the repo group :type group_id: str :param distributor_id: identifies the group's distributor :type distributor_id: str :param publish_config_override: values to pass the plugin for this publish call alone :type publish_config_override: dict """ distributor_manager = manager_factory.repo_group_distributor_manager() distributor = distributor_manager.get_distributor( group_id, distributor_id) distributor_type_id = distributor['distributor_type_id'] distributor_instance, plugin_config = plugin_api.get_group_distributor_by_id( distributor_type_id) group_query_manager = manager_factory.repo_group_query_manager() # Validation group = group_query_manager.get_group(group_id) distributor_type_id = distributor['distributor_type_id'] # Assemble the data needed for publish conduit = RepoGroupPublishConduit(group_id, distributor) call_config = PluginCallConfiguration(plugin_config, distributor['config'], publish_config_override) transfer_group = common_utils.to_transfer_repo_group(group) transfer_group.working_dir = common_utils.get_working_directory() # TODO: Add events for group publish start/complete RepoGroupPublishManager._do_publish(transfer_group, distributor_id, distributor_instance, conduit, call_config) @staticmethod def _do_publish(group, distributor_id, distributor_instance, conduit, call_config): distributor_coll = RepoGroupDistributor.get_collection() publish_result_coll = RepoGroupPublishResult.get_collection() group_id = group.id # Perform the publish publish_start_timestamp = _now_timestamp() try: report = distributor_instance.publish_group( group, conduit, call_config) except Exception, e: publish_end_timestamp = _now_timestamp() # Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({ 'id': distributor_id, 'repo_group_id': group_id }) distributor['last_publish'] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish history entry for the run result = RepoGroupPublishResult.error_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, e, sys.exc_info()[2]) publish_result_coll.save(result) raise publish_end_timestamp = _now_timestamp() # Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({ 'id': distributor_id, 'repo_group_id': group_id }) distributor['last_publish'] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish entry if report is not None and isinstance(report, PublishReport): summary = report.summary details = report.details if report.success_flag: result = RepoGroupPublishResult.expected_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) else: result = RepoGroupPublishResult.failed_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) else: msg = _( 'Plugin type [%(t)s] did not return a valid publish report') msg = msg % {'t': distributor['distributor_type_id']} logger.warn(msg) summary = details = _('Unknown') result = RepoGroupPublishResult.expected_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) publish_result_coll.save(result) return result
def clean(self): super(RepoGroupPublishManagerTests, self).clean() RepoGroup.get_collection().remove() RepoGroupDistributor.get_collection().remove() RepoGroupPublishResult.get_collection().remove()
raise PulpExecutionException(e), None, sys.exc_info()[2] publish_end_timestamp = _now_timestamp() # Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({'id' : distributor_id, 'repo_group_id' : group_id}) distributor['last_publish'] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish entry if report is not None and isinstance(report, PublishReport): summary = report.summary details = report.details if report.success_flag: result = RepoGroupPublishResult.expected_result(group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) else: result = RepoGroupPublishResult.failed_result(group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) else: _LOG.warn('Plugin type [%s] did not return a valid publish report' % distributor['distributor_type_id']) summary = details = _('Unknown') result = RepoGroupPublishResult.expected_result(group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) publish_result_coll.save(result, safe=True) return result
# Reload the distributor in case the scratchpad is changed by the plugin distributor = distributor_coll.find_one({ 'id': distributor_id, 'repo_group_id': group_id }) distributor['last_publish'] = publish_end_timestamp distributor_coll.save(distributor) # Add a publish entry if report is not None and isinstance(report, PublishReport): summary = report.summary details = report.details if report.success_flag: result = RepoGroupPublishResult.expected_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) else: result = RepoGroupPublishResult.failed_result( group_id, distributor_id, distributor['distributor_type_id'], publish_start_timestamp, publish_end_timestamp, summary, details) else: _LOG.warn( 'Plugin type [%s] did not return a valid publish report' % distributor['distributor_type_id']) summary = details = _('Unknown') result = RepoGroupPublishResult.expected_result(