From: Jan Provaznik <[email protected]>

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:da...@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:da...@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/x86_64/os/
+  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
-- 
1.7.0.1

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to