Project

Profile

Help

Story #3202

Updated by bmbouter over 6 years ago

As a user, I can sync RPM/SRPM/Erratum from a remote Yum/DNF repository. 

 Other unknown types of a content should be ignored during sync. 

 This story is complete when: 

 * I can initiate a sync from remote Yum/DNF repo 
 * The sync completes without error 
 * I can see that the expected content was added to the repo 

 h2. Pseudo Code First Stage Example 

 The sync will create a Stages API first stage and then pass all of them to DeclarativeVersion. Here is some pseudocode that can run inside of the <code>__call__()</code>    of the first stage. 

 <pre> 
 with ProgressBar(message='Downloading Metadata') as pb: 
             repomd_url = url = self.remote.url + '/repodata/repomd.xml' 
             downloader = self.remote.get_downloader(repomd_url)    # get the downloader 
             result = await downloader.run()    # downloading happens here 
             pb.increment()    # tell the user we downloading something 

             other_metadata_files = get_other_metadata_files_as_list(result)    # gives urls of comps, updateinfo, etc. 
             downloaders = [] 
             for url in other_metadata_files: 
                        downloader = self.remote.get_downloader(repomd_url)    # get the downloader 
                        downloaders.append(downloader.run())    # This only creates the coroutine, it doesn't run it 

             while downloaders: 
                        done, downloaders = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED) 
                        for finished_downloader in done: 
                                      pb.increment()    # tell the user we downloading something 
                                      in_memory_parsed_metadata = createrepo_c.load_xml(finished_downloader.path) 
                                      for package in in_memory_parsed_metadata: 
                                                  if is_updaterecord(package): 
                                                               content = UpdateRecord(content_data_from_package) 
                                                               artifact = Artifact(digest_data_from_package) 
                                                               da = DeclarativeArtifact(artifact, url, entry.relative_path, self.remote) 
                                                               dc = DeclarativeContent(content=file, d_artifacts=[da]) 
                                                               await out_q.put(dc) 
                                                  if is_packagerecord(package): 
                                                               #    Similar to what we did    only using RpmContent / SrpmContent 
 </pre>

Back