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))
def test_process_main(self, mock_make_manifest): step = publish_step.CreatePulpManifestStep('/foo/') step.process_main() mock_make_manifest.assert_called_once_with('/foo/')
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)
def test_init(self): step = publish_step.CreatePulpManifestStep('/foo') # make sure the description has some value self.assertTrue(step.description)