From 6aff0ce1f4b0108e31421c1e6f0940724915e0b6 Mon Sep 17 00:00:00 2001 From: Vladimir Kuklin Date: Wed, 14 Sep 2016 18:25:05 +0300 Subject: [PATCH] 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 Change-Id: I064a145d07cd482c0f9602b3e87a07340c4bab8c Depends-On: I4d4ccbd43fb9ccff13196ff92671f07d143905a5 Closes-bug: #1602719 --- .../parser/functions/generate_plugins_pins.rb | 50 +++++++++++++++++++ .../functions/generate_plugins_repos.rb | 6 ++- .../plugins/plugins_setup_repositories.pp | 7 +++ .../plugins_setup_repositories_spec.rb | 42 +++++++++++----- 4 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_pins.rb diff --git a/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_pins.rb b/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_pins.rb new file mode 100644 index 0000000000..1ce51ec8b3 --- /dev/null +++ b/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_pins.rb @@ -0,0 +1,50 @@ +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 + + result + end +end diff --git a/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_repos.rb b/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_repos.rb index 4e26a12115..0199eae5d5 100644 --- a/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_repos.rb +++ b/deployment/puppet/osnailyfacter/lib/puppet/parser/functions/generate_plugins_repos.rb @@ -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 diff --git a/deployment/puppet/osnailyfacter/manifests/plugins/plugins_setup_repositories.pp b/deployment/puppet/osnailyfacter/manifests/plugins/plugins_setup_repositories.pp index b31e11913c..695f73fdc2 100644 --- a/deployment/puppet/osnailyfacter/manifests/plugins/plugins_setup_repositories.pp +++ b/deployment/puppet/osnailyfacter/manifests/plugins/plugins_setup_repositories.pp @@ -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) + } + } } diff --git a/tests/noop/spec/hosts/plugins/plugins_setup_repositories_spec.rb b/tests/noop/spec/hosts/plugins/plugins_setup_repositories_spec.rb index 4f8ff09e2d..c471702b23 100644 --- a/tests/noop/spec/hosts/plugins/plugins_setup_repositories_spec.rb +++ b/tests/noop/spec/hosts/plugins/plugins_setup_repositories_spec.rb @@ -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