From: Jan Provaznik <jprovazn(a)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}/#{(a)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}/#{(a)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/#{(a)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/#{(a)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...
+ 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