Fix plugins repositories pins generation

Generate apt pins for repositories. Had to change plugin related
functions as repo uri is slightly different - there is no 'dists'
directory

cherry-picked from https://review.openstack.org/#/c/370222/

Change-Id: If24633d4b438b1884d18bd83e70ff413ab4e8e30
Depends-On: I4d4ccbd43fb9ccff13196ff92671f07d143905a5
Closes-bug: #1602719
This commit is contained in:
Vladimir Kuklin 2016-09-14 18:25:05 +03:00
parent 84f109e243
commit 2b8ef6b89d
4 changed files with 93 additions and 13 deletions

View File

@ -0,0 +1,51 @@
require 'net/http'
require 'uri'
module Puppet::Parser::Functions
newfunction(
:generate_plugins_pins,
:type => :rvalue,
:arity => -1,
:doc => <<-EOS
Takes an array of repositories (in form used in astute.yaml) as argument.
Returns a hash compatible with the apt::pin type provided by puppetlabs/apt
module. It requires working connectivity to given repositories - the function
parses repositories' Release files to obtain fields like Origin, Label, Suite
and Codename. Repositories with no or empty priority are skipped.
EOS
) do |args|
repositories = args[0]
raise Puppet::ParseError, "generate_plugins_pins(): Requires hash to work with" unless repositories.is_a? Hash
result = {}
repositories.each do |name, repo|
next unless repo['priority']
uri = URI.parse "#{repo['location']}/#{repo['suite']}/Release"
response = Net::HTTP.get_response uri
unless response.kind_of? Net::HTTPSuccess
fail "GET HTTP request to: '#{uri.to_s}' have failed! (#{response.code} #{response.message})"
end
value_map = {
'originator' => /^Origin: (.*)/,
'label' => /^Label: (.*)/,
'release' => /^Suite: (.*)/,
'codename' => /^Codename: (.*)/,
}
repo_data = {
'priority' => repo['priority'],
}
value_map.each do |key, regexp|
repo_data[key] = $1 if response.body =~ regexp
end
result.store name, repo_data
end
p result
result
end
end

View File

@ -2,13 +2,14 @@ module Puppet::Parser::Functions
newfunction(
:generate_plugins_repos,
:type => :rvalue,
:arity => 1,
:arity => -1,
:docs => <<-EOS
Transforms plugins array provided by astute.yaml to a form easily
usable with create_resources and the puppetlabs/apt's apt::source type.
EOS
) do |args|
plugins = args[0]
addprios = args[1]
raise(Puppet::ParseError, "generate_plugins_repos(): Requires array to " +
"work with") unless plugins.is_a?(Array)
@ -22,6 +23,9 @@ usable with create_resources and the puppetlabs/apt's apt::source type.
'release' => repo['suite'],
'location' => repo['uri'],
}
if addprios
result[repo['name']]['priority'] = repo['priority']
end
end
end

View File

@ -8,11 +8,18 @@ class osnailyfacter::plugins::plugins_setup_repositories {
include ::apt
$repositories = generate_plugins_repos($plugins)
$repositories_w_prios = generate_plugins_repos($plugins, true)
$pins = generate_plugins_pins($repositories_w_prios)
if ! empty($repositories) {
create_resources(apt::source, $repositories)
}
if !empty($pins)
{
create_resources(apt::pin, $pins)
}
}
}

View File

@ -1,20 +1,38 @@
# ROLE: virt
# ROLE: primary-mongo
# ROLE: primary-controller
# ROLE: mongo
# ROLE: ironic
# ROLE: controller
# ROLE: compute-vmware
# ROLE: compute
# ROLE: cinder-vmware
# ROLE: cinder-block-device
# ROLE: cinder
# ROLE: ceph-osd
# ROLE: base-os
require 'spec_helper'
require 'shared-examples'
manifest = 'plugins/plugins_setup_repositories.pp'
describe manifest do
shared_examples 'catalog' do
plugins_params = Noop.hiera_array 'plugins'
let(:plugin_repo_response) do
"Label: contrail
Version: 5.0"
end
before(:each) do
if plugins_params
plugins_params.each do |plugin|
if plugin['repositories']
plugin['repositories'].each do
|repo| stub_request(:get, "#{repo['uri']}#{repo['suite']}/Release").to_return(:status => 200, :body => plugin_repo_response, :headers =>{})
end
end
Thread.stubs(:abort_on_exception=)
end
end
end
it 'plugin repositories should be configured' do
if !plugins_params.empty?
should contain_apt__pin('contrail-5.0.0').with(
'priority' => 1100
)
should contain_apt__source('contrail-5.0.0')
end
end
end
test_ubuntu manifest
end