vanagon 0.15.0 → 0.15.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29674503cd814cb61b44c6077a9f92b921e0a3a9
4
- data.tar.gz: 41bc417df34897e2f7b934c7a2dc8015d150c020
3
+ metadata.gz: 6191c02ed1d220d7d947a37b906e82e60b5bba38
4
+ data.tar.gz: a64bae317e40b8ac61dc189d062c86b52a26c2a3
5
5
  SHA512:
6
- metadata.gz: 7f56c460a3243eef19ccf1344e1e02e6cf0d746f9f7358f0457fb6e08be08c8e07aef31d9494792d7c0340c11c4506f148b78d0608b4edcc7d52397f069800b2
7
- data.tar.gz: 2f910455c317ab05665d70561207d251c1fd29dc942797b9fa4e57b5ac617a4f40314ad83d7af377011eaafe2ebe26152bc3d9486f897e6be09b34ffbb4183f5
6
+ metadata.gz: cd1df71b5c97763d2316fc244ab0972ba5187a412cbe6c44cc77af95d82ebb102fa74327f1f1bbdc7ee0c3e66a5f63b581fe2a797d3acf9fc27e31195e101958
7
+ data.tar.gz: c03ff705b67c8688fe4dbfdc0d303600614030c2710d576aa4d9142f005002ba1e3ce33afc95b42d6ec55c43cc535af00c605380b42db4b933f0264a9fc0a356
@@ -15,17 +15,30 @@ class Vanagon
15
15
  # @param options [Hash] hash of the options needed for the subtype
16
16
  # @param workdir [String] working directory to fetch the source into
17
17
  # @return [Vanagon::Component::Source] the correct subtype for the given source
18
- def source(uri, **options)
19
- # First we try git
20
- if Vanagon::Component::Source::Git.valid_remote?(uri)
18
+ def source(uri, **options) # rubocop:disable Metrics/AbcSize
19
+ # Sometimes the uri comes in as a string, but sometimes it's already been
20
+ # coerced into a URI object. The individual source providers will turn
21
+ # the passed uri into a URI object if needed, but for this method we
22
+ # want to work with the uri as a string.
23
+ uri = uri.to_s
24
+ if uri.start_with?('git')
25
+ source_type = :git
26
+ # when using an http(s) source for a git repo, you should prefix the
27
+ # url with `git:`, so something like `git:https://github.com/puppetlabs/vanagon`
28
+ # strip the leading `git:` so we have a valid uri
29
+ uri.sub!(/^git:http/, 'http')
30
+ else
31
+ source_type = determine_source_type(uri)
32
+ end
33
+
34
+ if source_type == :git
21
35
  return Vanagon::Component::Source::Git.new uri,
22
36
  sum: options[:sum],
23
37
  ref: options[:ref],
24
38
  workdir: options[:workdir]
25
39
  end
26
40
 
27
- # Then we try HTTP
28
- if Vanagon::Component::Source::Http.valid_url?(uri)
41
+ if source_type == :http
29
42
  return Vanagon::Component::Source::Http.new uri,
30
43
  sum: options[:sum],
31
44
  workdir: options[:workdir],
@@ -33,16 +46,40 @@ class Vanagon
33
46
  sum_type: options[:sum_type] || "md5"
34
47
  end
35
48
 
36
- # Then we try local
37
- if Vanagon::Component::Source::Local.valid_file?(uri)
49
+ if source_type == :local
38
50
  return Vanagon::Component::Source::Local.new uri,
39
51
  workdir: options[:workdir]
40
52
  end
41
53
 
42
- # Failing all of that, we give up
54
+ # Unknown source type!
43
55
  raise Vanagon::Error,
44
56
  "Unknown file type: '#{uri}'; cannot continue"
45
57
  end
58
+
59
+ def determine_source_type(uri)
60
+ # if source_type isn't specified, let's try to figure out what we have
61
+ # order of precedence for this is git, then http, then local
62
+
63
+ # Add a 5 second timeout for the `git remote-ls` execution to deal with
64
+ # URLs that incorrectly respond to git queries
65
+ timeout = 5
66
+ if Vanagon::Component::Source::Git.valid_remote?(uri, timeout)
67
+ if uri =~ /^http/
68
+ warn "Passing git URLs as http(s) addresses is deprecated! Please prefix your source URL with `git:`"
69
+ end
70
+ return :git
71
+ end
72
+
73
+ if Vanagon::Component::Source::Http.valid_url?(uri)
74
+ return :http
75
+ end
76
+
77
+ if Vanagon::Component::Source::Local.valid_file?(uri)
78
+ return :local
79
+ end
80
+
81
+ return :unknown
82
+ end
46
83
  end
47
84
  end
48
85
  end
@@ -6,6 +6,7 @@ require 'English'
6
6
  require 'fustigit'
7
7
  require 'git/basic_submodules'
8
8
  require 'logger'
9
+ require 'timeout'
9
10
 
10
11
  class Vanagon
11
12
  class Component
@@ -19,11 +20,19 @@ class Vanagon
19
20
  # return True or False depending on whether or not
20
21
  # `git` thinks it's a valid Git repo.
21
22
  #
23
+ # @param url
24
+ # @param timeout Time (in seconds) to wait before assuming the
25
+ # git command has failed. Useful in instances where a URL
26
+ # prompts for credentials despite not being a git remote
22
27
  # @return [Boolean] whether #url is a valid Git repo or not
23
- def valid_remote?(url)
24
- !!::Git.ls_remote(url)
28
+ def valid_remote?(url, timeout = 0)
29
+ Timeout.timeout(timeout) do
30
+ !!::Git.ls_remote(url)
31
+ end
25
32
  rescue ::Git::GitExecuteError
26
33
  false
34
+ rescue Timeout::Error
35
+ false
27
36
  end
28
37
  end
29
38
 
@@ -11,7 +11,14 @@ class Vanagon
11
11
  class Driver
12
12
  include Vanagon::Utilities
13
13
  attr_accessor :platform, :project, :target, :workdir, :remote_workdir, :verbose, :preserve
14
- attr_accessor :timeout, :retry_count
14
+
15
+ def timeout
16
+ @timeout ||= @project.timeout || ENV["VANAGON_TIMEOUT"] || 7200
17
+ end
18
+
19
+ def retry_count
20
+ @retry_count ||= @project.retry_count || ENV["VANAGON_RETRY_COUNT"] || 1
21
+ end
15
22
 
16
23
  def initialize(platform, project, options = { workdir: nil, configdir: nil, target: nil, engine: nil, components: nil, skipcheck: false, verbose: false, preserve: false, only_build: nil, remote_workdir: nil }) # rubocop:disable Metrics/AbcSize
17
24
  @verbose = options[:verbose]
@@ -118,8 +125,10 @@ class Vanagon
118
125
  @engine.startup(workdir)
119
126
 
120
127
  warn "Target is #{@engine.target}"
121
- retry_task { install_build_dependencies }
122
- retry_task { @project.fetch_sources(workdir) }
128
+ Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do
129
+ install_build_dependencies
130
+ end
131
+ @project.fetch_sources(workdir, retry_count, timeout)
123
132
 
124
133
  @project.make_makefile(workdir)
125
134
  @project.make_bill_of_materials(workdir)
@@ -154,22 +163,12 @@ class Vanagon
154
163
  end
155
164
 
156
165
  warn "rendering Makefile"
157
- retry_task { @project.fetch_sources(workdir) }
166
+ @project.fetch_sources(workdir, retry_count, timeout)
158
167
  @project.make_bill_of_materials(workdir)
159
168
  @project.generate_packaging_artifacts(workdir)
160
169
  @project.make_makefile(workdir)
161
170
  end
162
171
 
163
- # Retry the provided block, use the retry count and timeout
164
- # values from the project, if available, otherwise use some
165
- # sane defaults.
166
- def retry_task(&block)
167
- @timeout = @project.timeout || ENV["VANAGON_TIMEOUT"] || 7200
168
- @retry_count = @project.retry_count || ENV["VANAGON_RETRY_COUNT"] || 1
169
- Vanagon::Utilities.retry_with_timeout(@retry_count, @timeout) { yield }
170
- end
171
- private :retry_task
172
-
173
172
  # Initialize the logging instance
174
173
  def loginit(logfile)
175
174
  @@logger = Logger.new(logfile)
@@ -30,7 +30,7 @@ class Vanagon
30
30
  @platform = case platform_name
31
31
  when /^aix-/
32
32
  Vanagon::Platform::RPM::AIX.new(@name)
33
- when /^(cisco-wrlinux|el|fedora)-/
33
+ when /^(cisco-wrlinux|el|fedora|redhat)-/
34
34
  Vanagon::Platform::RPM.new(@name)
35
35
  when /^sles-/
36
36
  Vanagon::Platform::RPM::SLES.new(@name)
@@ -162,12 +162,21 @@ class Vanagon
162
162
  # Collects all sources and patches into the provided workdir
163
163
  #
164
164
  # @param workdir [String] directory to stage sources into
165
- def fetch_sources(workdir)
165
+ # @param retry_count [Integer] number of times to retry each fetch
166
+ # @param timeout [Integer] How long to wait (in seconds) for each
167
+ # fetch before aborting
168
+ def fetch_sources(workdir, retry_count = 1, timeout = 7200)
166
169
  @components.each do |component|
167
- component.get_source(workdir)
170
+ Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do
171
+ component.get_source(workdir)
172
+ end
168
173
  # Fetch secondary sources
169
- component.get_sources(workdir)
170
- component.get_patches(workdir)
174
+ Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do
175
+ component.get_sources(workdir)
176
+ end
177
+ Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do
178
+ component.get_patches(workdir)
179
+ end
171
180
  end
172
181
  end
173
182
 
@@ -12,6 +12,7 @@ describe "Vanagon::Component::Source" do
12
12
  let(:private_git) { "git@github.com:abcd/things" }
13
13
  let(:http_git) { "http://github.com/abcd/things" }
14
14
  let(:https_git) { "https://github.com/abcd/things" }
15
+ let(:git_prefixed_http) { "git:http://github.com/abcd/things" }
15
16
 
16
17
  let(:http_url) { "http://abcd/things" }
17
18
  let(:https_url) { "https://abcd/things" }
@@ -53,8 +54,9 @@ describe "Vanagon::Component::Source" do
53
54
  end
54
55
 
55
56
  it "returns a Git object for git:// repositories" do
56
- expect(klass.source(public_git, ref: ref, workdir: workdir).class)
57
- .to eq Vanagon::Component::Source::Git
57
+ component_source = klass.source(public_git, ref: ref, workdir: workdir)
58
+ expect(component_source.url.to_s).to eq public_git
59
+ expect(component_source.class).to eq Vanagon::Component::Source::Git
58
60
  end
59
61
 
60
62
  it "returns a Git object for http:// repositories" do
@@ -66,6 +68,13 @@ describe "Vanagon::Component::Source" do
66
68
  expect(klass.source(https_git, ref: ref, workdir: workdir).class)
67
69
  .to eq Vanagon::Component::Source::Git
68
70
  end
71
+
72
+ it "returns a Git object for git:http:// repositories" do
73
+ component_source = klass.source(git_prefixed_http, ref: ref, workdir: workdir)
74
+ expect(component_source.url.to_s).to eq 'http://github.com/abcd/things'
75
+ expect(component_source.class).to eq Vanagon::Component::Source::Git
76
+ end
77
+
69
78
  end
70
79
 
71
80
  context "takes a HTTP/HTTPS file" do
@@ -3,7 +3,7 @@ require 'vanagon/project'
3
3
  require 'vanagon/platform'
4
4
 
5
5
  describe 'Vanagon::Driver' do
6
- let (:project) { double(:project, :settings => {} ) }
6
+ let (:project) { double(:project, :settings => {}, :timeout => 9001, :retry_count => 42 ) }
7
7
 
8
8
  let (:redhat) do
9
9
  eval_platform('el-7-x86_64', <<-END)
@@ -4,6 +4,7 @@ describe 'Vanagon::Platform::DSL' do
4
4
  let (:deb_platform_block) { "platform 'debian-test-fixture' do |plat| end" }
5
5
  let (:el_5_platform_block) { "platform 'el-5-fixture' do |plat| end" }
6
6
  let (:el_6_platform_block) { "platform 'el-6-fixture' do |plat| end" }
7
+ let (:redhat_7_platform_block) { "platform 'redhat-7-fixture' do |plat| end" }
7
8
  let (:sles_platform_block) { "platform 'sles-test-fixture' do |plat| end" }
8
9
  let (:cicso_wrlinux_platform_block) { "platform 'cisco-wrlinux-fixture' do |plat| end" }
9
10
  let (:solaris_10_platform_block) { "platform 'solaris-10-fixture' do |plat| end" }
@@ -60,6 +61,14 @@ describe 'Vanagon::Platform::DSL' do
60
61
  expect(plat._platform.provisioning).to include("curl -o '/etc/yum.repos.d/#{hex_value}-pl-puppet-agent-0.2.1-el-7-x86_64.repo' '#{el_definition}'")
61
62
  end
62
63
 
64
+ it "works for specifically redhat platforms" do
65
+ plat = Vanagon::Platform::DSL.new('redhat-7-fixture')
66
+ expect(SecureRandom).to receive(:hex).and_return(hex_value)
67
+ plat.instance_eval(redhat_7_platform_block)
68
+ plat.yum_repo(el_definition)
69
+ expect(plat._platform.provisioning).to include("curl -o '/etc/yum.repos.d/#{hex_value}-pl-puppet-agent-0.2.1-el-7-x86_64.repo' '#{el_definition}'")
70
+ end
71
+
63
72
  # This test currently covers wrlinux 5 and 7
64
73
  it "downloads the repo file to the correct yum location for wrlinux" do
65
74
  plat = Vanagon::Platform::DSL.new('cisco-wrlinux-fixture')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanagon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet Labs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-09 00:00:00.000000000 Z
11
+ date: 2018-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git