Beispiel #1
0
    def __init__(self, repo_group, publish_conduit, config, distributor_type):
        """
        :param repo_group: Pulp managed Yum repository
        :type  repo_group: pulp.plugins.model.RepositoryGroup
        :param publish_conduit: Conduit providing access to relative Pulp functionality
        :type  publish_conduit: pulp.plugins.conduits.repo_publish.RepoGroupPublishConduit
        :param config: Pulp configuration for the distributor
        :type  config: pulp.plugins.config.PluginCallConfiguration
        :param distributor_type: The type of the distributor that is being published
        :type distributor_type: str
        """
        super(ExportRepoGroupPublisher,
              self).__init__(constants.PUBLISH_STEP_EXPORT_REPO_GROUP,
                             repo_group,
                             publish_conduit,
                             config,
                             plugin_type=distributor_type)

        working_dir = self.get_working_dir()
        scratch_dir = os.path.join(working_dir, 'scratch')
        realized_dir = os.path.join(working_dir, 'realized')

        flat_config = config.flatten()
        export_dir = config.get(constants.EXPORT_DIRECTORY_KEYWORD)
        if export_dir:
            repo_config = config
        else:
            repo_config = PluginCallConfiguration(
                flat_config,
                {constants.EXPORT_DIRECTORY_KEYWORD: realized_dir})

        repo_objs = model.Repository.objects(repo_id__in=repo_group.repo_ids)
        empty_repos = True
        for repo_obj in repo_objs:
            empty_repos = False
            repo = repo_obj.to_transfer_repo()
            # Make sure we only publish rpm repo's
            if repo.notes['_repo-type'] != 'rpm-repo':
                continue

            repo_config_copy = copy.deepcopy(repo_config)

            # Need some code to pull the distributor
            distributor = model.Distributor.objects(
                repo_id=repo_obj['repo_id'],
                distributor_id=ids.EXPORT_DISTRIBUTOR_ID,
                config__relative_url__exists=True).first()

            if distributor is not None:
                relative_url = distributor['config']['relative_url']
            else:
                relative_url = repo_obj['repo_id']

            if not export_dir:
                repo_config_copy.override_config['relative_url'] = relative_url
            else:
                merged_rel = repo_config_copy.get('relative_url',
                                                  '') + '/' + relative_url
                repo_config_copy.override_config['relative_url'] = merged_rel

            repo_working_dir = os.path.join(scratch_dir, repo.id)
            repo_conduit = RepoPublishConduit(repo.id, distributor_type)
            publisher = ExportRepoPublisher(repo,
                                            repo_conduit,
                                            repo_config_copy,
                                            distributor_type,
                                            working_dir=repo_working_dir)
            publisher.description = _("Exporting Repo: %s") % repo.id
            self.add_child(publisher)
        if empty_repos:
            os.makedirs(realized_dir)
            self.add_child(GenerateListingFileStep(realized_dir, realized_dir))

        # If we aren't exporting to a directory add the ISO create & publish steps
        if not export_dir:
            # Create the steps to generate the ISO and publish them to their final location
            output_dir = os.path.join(working_dir, 'output')
            self.add_child(CreateIsoStep(realized_dir, output_dir))

            # create the PULP_MANIFEST file if requested in the config
            if config.get_boolean(constants.CREATE_PULP_MANIFEST) is True:
                self.add_child(
                    platform_steps.CreatePulpManifestStep(output_dir))

            export_dirs = configuration.get_export_repo_group_publish_dirs(
                repo_group, config)
            publish_location = [('/', location) for location in export_dirs]

            master_dir = configuration.get_master_publish_dir_from_group(
                repo_group, distributor_type)
            self.add_child(
                platform_steps.AtomicDirectoryPublishStep(
                    output_dir, publish_location, master_dir))
Beispiel #2
0
    def test_process_main(self, mock_make_manifest):
        step = publish_step.CreatePulpManifestStep('/foo/')

        step.process_main()

        mock_make_manifest.assert_called_once_with('/foo/')
Beispiel #3
0
    def __init__(self, repo, publish_conduit, config, distributor_type,
                 **kwargs):
        """
        :param repo: Pulp managed Yum repository
        :type  repo: pulp.plugins.model.Repository
        :param publish_conduit: Conduit providing access to relative Pulp functionality
        :type  publish_conduit: pulp.plugins.conduits.repo_publish.RepoPublishConduit
        :param config: Pulp configuration for the distributor
        :type  config: pulp.plugins.config.PluginCallConfiguration
        :param distributor_type: The type of the distributor that is being published
        :type distributor_type: str
        """
        super(ExportRepoPublisher,
              self).__init__(repo, publish_conduit, config, distributor_type,
                             **kwargs)

        date_q = export_utils.create_date_range_filter(config)
        if date_q:
            # Since this is a partial export we don't generate metadata
            # we have to clear out the previously added steps
            # we only need special version s of the rpm, drpm, and errata steps
            self.clear_children()
            self.add_child(
                PublishRpmAndDrpmStepIncremental(repo_content_unit_q=date_q))
            self.add_child(
                PublishErrataStepIncremental(repo_content_unit_q=date_q))

        working_directory = self.get_working_dir()
        export_dir = config.get(constants.EXPORT_DIRECTORY_KEYWORD)
        if export_dir:
            target_dir = os.path.join(
                export_dir,
                configuration.get_repo_relative_path(repo.repo_obj, config))
            self.add_child(
                platform_steps.CopyDirectoryStep(working_directory,
                                                 target_dir))
            self.add_child(GenerateListingFileStep(export_dir, target_dir))
        else:
            # Reset the steps to use an internal scratch directory other than the base working dir
            content_dir = os.path.join(working_directory, 'scratch')
            for step in self.children:
                step.working_dir = content_dir
            self.working_dir = content_dir

            # Set up step to copy all the files to a realized directory with no symlinks
            # This could be optimized with a pathspec so that we don't create all the files
            # separately
            realized_dir = os.path.join(working_directory, 'realized')
            copy_target = os.path.join(
                realized_dir,
                configuration.get_repo_relative_path(repo.repo_obj, config))
            self.add_child(
                platform_steps.CopyDirectoryStep(content_dir, copy_target))
            self.add_child(GenerateListingFileStep(realized_dir, copy_target))

            # Create the steps to generate the ISO and publish them to their final location
            output_dir = os.path.join(working_directory, 'output')
            self.add_child(CreateIsoStep(realized_dir, output_dir))

            # create the PULP_MANIFEST file if requested in the config
            if config.get_boolean(constants.CREATE_PULP_MANIFEST) is True:
                self.add_child(
                    platform_steps.CreatePulpManifestStep(output_dir))

            dirs = configuration.get_export_repo_publish_dirs(
                repo.repo_obj, config)
            publish_location = [('/', location) for location in dirs]

            master_dir = configuration.get_master_publish_dir(
                repo.repo_obj, self.get_plugin_type())
            atomic_publish = platform_steps.AtomicDirectoryPublishStep(
                output_dir, publish_location, master_dir)
            atomic_publish.description = _('Moving ISO to final location')
            self.add_child(atomic_publish)
Beispiel #4
0
    def test_init(self):
        step = publish_step.CreatePulpManifestStep('/foo')

        # make sure the description has some value
        self.assertTrue(step.description)