From: Jan Provaznik jprovazn@redhat.com
Makes aggregator compatible with pulp/contentapi with minimal effort. This patch is only example how we can integrate contentapi (it shouldn't be pushed to master).
To try this patch, you need a running pulp server. --- src/app/util/repository_manager.rb | 124 +------------------ .../util/repository_manager/comps_repository.rb | 111 +++++++++++++++++ src/app/util/repository_manager/pulp_repository.rb | 34 ++++++ src/app/util/repository_manager/repository.rb | 6 + .../image_descriptor_package_repositories.yml | 8 +- 5 files changed, 165 insertions(+), 118 deletions(-) create mode 100644 src/app/util/repository_manager/comps_repository.rb create mode 100644 src/app/util/repository_manager/pulp_repository.rb create mode 100644 src/app/util/repository_manager/repository.rb
diff --git a/src/app/util/repository_manager.rb b/src/app/util/repository_manager.rb index 05cc5da..ad719bf 100644 --- a/src/app/util/repository_manager.rb +++ b/src/app/util/repository_manager.rb @@ -17,125 +17,11 @@ # MA 02110-1301, USA. A copy of the GNU General Public License is # also available at http://www.gnu.org/copyleft/gpl.html.
-require 'open-uri' require 'yaml' +require 'util/repository_manager/comps_repository' +require 'util/repository_manager/pulp_repository'
class RepositoryManager - class CompsRepository - def initialize(baseurl, id) - @id = id - @baseurl = baseurl - end - - def get_packages - packages = [] - get_packages_nodes.each do |node| - name = node.at_xpath('./xmlns:name/child::text()') - group = node.at_xpath('./xmlns:format/rpm:group/child::text()') - description = node.at_xpath('./xmlns:description/child::text()') - next unless name and group - packages << { - :repository_id => @id, - :name => name.text, - :group => group.text, - :description => description ? description.text : '', - } - end - return packages - end - - def get_groups - groups = {} - get_groups_nodes.each do |g| - pkgs = get_group_packages(g) - next if pkgs.empty? - name = g.at_xpath('name').text - groups[name] = { - :name => name, - :description => (t = g.at_xpath('description')) ? t.text : '', - :packages => pkgs, - } - end - return groups - end - - def download_xml(type) - begin - url = get_url(type) - rescue - return '' - end - - xml_data = open(url) - if url =~ /.gz$/ - return Zlib::GzipReader.new(xml_data).read - else - return xml_data.read - end - end - - private - - def get_xml(type) - # FIXME: I'm not sure config is right dir for automatic storing of - # xml files, but this should be temporary solution until Image Repo is - # done - xml_dir = "#{RAILS_ROOT}/config/image_descriptor_xmls" - xml_file = "#{xml_dir}/#{@id}.#{type}.xml" - begin - return File.open(xml_file) { |f| f.read } - rescue - xml = download_xml(type) - Dir.mkdir(xml_dir) unless File.directory?(xml_dir) - File.open(xml_file, 'w') { |f| f.write xml } - return xml - end - end - - def get_group_packages(group_node) - pkgs = {} - group_node.xpath('packagelist/packagereq').each do |p| - pkgs[p.text] = p.attr('type') - end - return pkgs - end - - def get_packages_nodes - unless @packages_nodes - data = get_xml('primary') - xml = Nokogiri::XML(data) - @packages_nodes = xml.xpath('/xmlns:metadata/xmlns:package') - end - return @packages_nodes - end - - def get_groups_nodes - unless @groups_nodes - data = get_xml('group') - xml = Nokogiri::XML(data) - @groups_nodes = xml.xpath('/comps/group') - end - return @groups_nodes - end - - def get_url(type) - if type == 'repomd' - return File.join(@baseurl, 'repodata', 'repomd.xml') - else - location = repomd.xpath("/xmlns:repomd/xmlns:data[@type="#{type}"]/xmlns:location").first - raise "location for #{type} data not found" unless location - return File.join(@baseurl, location['href']) - end - end - - def repomd - unless @repomd - @repomd = Nokogiri::XML(get_xml('repomd')) - end - return @repomd - end - end - def initialize @config = YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_package_repositories.yml") end @@ -143,7 +29,11 @@ class RepositoryManager def get_repository(repository_id) repo = @config[repository_id] raise "Repository '#{repository_id}' doesn't exist" unless repo - return CompsRepository.new(repo['baseurl'], repository_id) + if repo['type'] == 'pulp' + return PulpRepository.new(repo['baseurl'], repository_id) + else + return CompsRepository.new(repo['baseurl'], repository_id) + end end
def repositories diff --git a/src/app/util/repository_manager/comps_repository.rb b/src/app/util/repository_manager/comps_repository.rb new file mode 100644 index 0000000..4646f7f --- /dev/null +++ b/src/app/util/repository_manager/comps_repository.rb @@ -0,0 +1,111 @@ +require 'util/repository_manager/repository' +require 'open-uri' + +class CompsRepository < Repository + def get_packages + packages = [] + get_packages_nodes.each do |node| + name = node.at_xpath('./xmlns:name/child::text()') + group = node.at_xpath('./xmlns:format/rpm:group/child::text()') + description = node.at_xpath('./xmlns:description/child::text()') + next unless name and group + packages << { + :repository_id => @id, + :name => name.text, + :description => description ? description.text : '', + } + end + return packages + end + + def get_groups + groups = {} + get_groups_nodes.each do |g| + pkgs = get_group_packages(g) + next if pkgs.empty? + name = g.at_xpath('name').text + groups[name] = { + :name => name, + :description => (t = g.at_xpath('description')) ? t.text : '', + :packages => pkgs, + } + end + return groups + end + + def download_xml(type) + begin + url = get_url(type) + rescue + return '' + end + + xml_data = open(url) + if url =~ /.gz$/ + return Zlib::GzipReader.new(xml_data).read + else + return xml_data.read + end + end + + private + + def get_xml(type) + # FIXME: I'm not sure config is right dir for automatic storing of + # xml files, but this should be temporary solution until Image Repo is + # done + xml_dir = "#{RAILS_ROOT}/config/image_descriptor_xmls" + xml_file = "#{xml_dir}/#{@id}.#{type}.xml" + begin + return File.open(xml_file) { |f| f.read } + rescue + xml = download_xml(type) + Dir.mkdir(xml_dir) unless File.directory?(xml_dir) + File.open(xml_file, 'w') { |f| f.write xml } + return xml + end + end + + def get_group_packages(group_node) + pkgs = {} + group_node.xpath('packagelist/packagereq').each do |p| + pkgs[p.text] = p.attr('type') + end + return pkgs + end + + def get_packages_nodes + unless @packages_nodes + data = get_xml('primary') + xml = Nokogiri::XML(data) + @packages_nodes = xml.xpath('/xmlns:metadata/xmlns:package') + end + return @packages_nodes + end + + def get_groups_nodes + unless @groups_nodes + data = get_xml('group') + xml = Nokogiri::XML(data) + @groups_nodes = xml.xpath('/comps/group') + end + return @groups_nodes + end + + def get_url(type) + if type == 'repomd' + return File.join(@baseurl, 'repodata', 'repomd.xml') + else + location = repomd.xpath("/xmlns:repomd/xmlns:data[@type="#{type}"]/xmlns:location").first + raise "location for #{type} data not found" unless location + return File.join(@baseurl, location['href']) + end + end + + def repomd + unless @repomd + @repomd = Nokogiri::XML(get_xml('repomd')) + end + return @repomd + end +end diff --git a/src/app/util/repository_manager/pulp_repository.rb b/src/app/util/repository_manager/pulp_repository.rb new file mode 100644 index 0000000..585b3fc --- /dev/null +++ b/src/app/util/repository_manager/pulp_repository.rb @@ -0,0 +1,34 @@ +require 'util/repository_manager/repository' +require 'restclient' +require 'json' + +class PulpRepository < Repository + def get_packages + packages = [] + JSON.parse(RestClient.get "#{@baseurl}/repositories/#{@id}/packages/").each_value do |info| + packages << { + :repository_id => @id, + :name => info['name'], + :description => info['description'], + } + end + return packages + end + + def get_groups + groups = {} + JSON.parse(RestClient.get "#{@baseurl}/repositories/#{@id}/packagegroups/").each do |name, info| + pkgs = {} + info['default_package_names'].each {|p| pkgs[p] = 'default'} + info['optional_package_names'].each {|p| pkgs[p] = 'optional'} + info['mandatory_package_names'].each {|p| pkgs[p] = 'mandatory'} + next if pkgs.empty? + groups[name] = { + :name => name, + :description => info['description'].to_s, + :packages => pkgs, + } + end + return groups + end +end diff --git a/src/app/util/repository_manager/repository.rb b/src/app/util/repository_manager/repository.rb new file mode 100644 index 0000000..9d29bc8 --- /dev/null +++ b/src/app/util/repository_manager/repository.rb @@ -0,0 +1,6 @@ +class Repository + def initialize(baseurl, id) + @id = id + @baseurl = baseurl + end +end diff --git a/src/config/image_descriptor_package_repositories.yml b/src/config/image_descriptor_package_repositories.yml index 40335ea..884ce17 100644 --- a/src/config/image_descriptor_package_repositories.yml +++ b/src/config/image_descriptor_package_repositories.yml @@ -1,6 +1,12 @@ fedora: name: Fedora baseurl: http://download.fedoraproject.org/pub/fedora/linux/releases/11/Everything/x8... + type: xml +#jboss: +# name: JBoss +# baseurl: http://repo.oddthesis.org/cirras/packages/fedora/11/RPMS/noarch/ +# type: xml jboss: name: JBoss - baseurl: http://repo.oddthesis.org/cirras/packages/fedora/11/RPMS/noarch/ + baseurl: https://localhost:8811/ + type: pulp