示例#1
0
    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
示例#2
0
文件: publish.py 项目: ashcrow/pulp
    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]
示例#3
0
    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
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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
示例#8
0
    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
示例#10
0
    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
示例#12
0
    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
示例#13
0
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
示例#14
0
    def clean(self):
        super(RepoGroupPublishManagerTests, self).clean()

        RepoGroup.get_collection().remove()
        RepoGroupDistributor.get_collection().remove()
        RepoGroupPublishResult.get_collection().remove()
示例#15
0
文件: publish.py 项目: ashcrow/pulp
            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
示例#16
0
文件: publish.py 项目: tomlanyon/pulp
        # 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(