vanagon 0.11.3 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/bin/build +1 -1
- data/bin/build_host_info +2 -2
- data/bin/devkit +1 -1
- data/bin/inspect +2 -2
- data/bin/render +1 -1
- data/lib/vanagon/component.rb +69 -10
- data/lib/vanagon/component/dsl.rb +13 -4
- data/lib/vanagon/component/source.rb +5 -64
- data/lib/vanagon/component/source/git.rb +6 -6
- data/lib/vanagon/component/source/http.rb +2 -2
- data/lib/vanagon/component/source/local.rb +1 -2
- data/lib/vanagon/component/source/rewrite.rb +85 -0
- data/lib/vanagon/driver.rb +9 -9
- data/lib/vanagon/engine/ec2.rb +4 -4
- data/lib/vanagon/engine/hardware.rb +3 -3
- data/lib/vanagon/engine/pooler.rb +3 -3
- data/lib/vanagon/optparse.rb +1 -1
- data/lib/vanagon/platform.rb +18 -5
- data/lib/vanagon/platform/deb.rb +6 -1
- data/lib/vanagon/platform/dsl.rb +4 -0
- data/lib/vanagon/platform/rpm.rb +19 -3
- data/lib/vanagon/project.rb +8 -5
- data/lib/vanagon/project/dsl.rb +11 -2
- data/lib/vanagon/utilities.rb +3 -3
- data/spec/lib/vanagon/component/source/rewrite_spec.rb +55 -0
- data/spec/lib/vanagon/component/source_spec.rb +0 -72
- data/spec/lib/vanagon/component_spec.rb +53 -3
- data/spec/lib/vanagon/platform/rpm_spec.rb +6 -0
- data/spec/lib/vanagon/platform_spec.rb +62 -25
- data/spec/lib/vanagon/project/dsl_spec.rb +22 -0
- metadata +6 -3
data/lib/vanagon/driver.rb
CHANGED
@@ -43,8 +43,8 @@ class Vanagon
|
|
43
43
|
# flatten all the results in to one array and set project.components to that.
|
44
44
|
@project.components = only_build.flat_map { |comp| @project.filter_component(comp) }.uniq
|
45
45
|
if @verbose
|
46
|
-
puts "Only building:"
|
47
|
-
@project.components.each { |comp| puts comp.name }
|
46
|
+
$stderr.puts "Only building:"
|
47
|
+
@project.components.each { |comp| $stderr.puts comp.name }
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -117,7 +117,7 @@ class Vanagon
|
|
117
117
|
|
118
118
|
@engine.startup(@workdir)
|
119
119
|
|
120
|
-
puts "Target is #{@engine.target}"
|
120
|
+
$stderr.puts "Target is #{@engine.target}"
|
121
121
|
retry_task { install_build_dependencies }
|
122
122
|
retry_task { @project.fetch_sources(@workdir) }
|
123
123
|
|
@@ -133,8 +133,8 @@ class Vanagon
|
|
133
133
|
cleanup_workdir
|
134
134
|
end
|
135
135
|
rescue => e
|
136
|
-
puts e
|
137
|
-
puts e.backtrace.join("\n")
|
136
|
+
$stderr.puts e
|
137
|
+
$stderr.puts e.backtrace.join("\n")
|
138
138
|
raise e
|
139
139
|
ensure
|
140
140
|
if ["hardware", "ec2"].include?(@engine.name)
|
@@ -148,7 +148,7 @@ class Vanagon
|
|
148
148
|
raise Vanagon::Error, "Project requires a version set, all is lost."
|
149
149
|
end
|
150
150
|
|
151
|
-
puts "rendering Makefile"
|
151
|
+
$stderr.puts "rendering Makefile"
|
152
152
|
retry_task { @project.fetch_sources(@workdir) }
|
153
153
|
@project.make_bill_of_materials(@workdir)
|
154
154
|
@project.generate_packaging_artifacts(@workdir)
|
@@ -159,7 +159,7 @@ class Vanagon
|
|
159
159
|
@workdir = workdir ? FileUtils.mkdir_p(workdir).first : Dir.mktmpdir
|
160
160
|
@engine.startup(@workdir)
|
161
161
|
|
162
|
-
puts "Devkit on #{@engine.target}"
|
162
|
+
$stderr.puts "Devkit on #{@engine.target}"
|
163
163
|
|
164
164
|
install_build_dependencies
|
165
165
|
@project.fetch_sources(@workdir)
|
@@ -169,8 +169,8 @@ class Vanagon
|
|
169
169
|
@engine.ship_workdir(@workdir)
|
170
170
|
@engine.dispatch("(cd #{@engine.remote_workdir}; #{@platform.make} #{@project.name}-project)")
|
171
171
|
rescue => e
|
172
|
-
puts e
|
173
|
-
puts e.backtrace.join("\n")
|
172
|
+
$stderr.puts e
|
173
|
+
$stderr.puts e.backtrace.join("\n")
|
174
174
|
raise e
|
175
175
|
end
|
176
176
|
|
data/lib/vanagon/engine/ec2.rb
CHANGED
@@ -57,17 +57,17 @@ class Vanagon
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def select_target
|
60
|
-
puts "Instance created id: #{instance.id}"
|
61
|
-
puts "Created instance waiting for status ok"
|
60
|
+
$stderr.puts "Instance created id: #{instance.id}"
|
61
|
+
$stderr.puts "Created instance waiting for status ok"
|
62
62
|
@ec2.wait_until(:instance_status_ok, instance_ids: [instance.id])
|
63
|
-
puts "Instance running"
|
63
|
+
$stderr.puts "Instance running"
|
64
64
|
@target = instance.private_ip_address
|
65
65
|
rescue ::Aws::Waiters::Errors::WaiterFailed => error
|
66
66
|
fail "Failed to wait for ec2 instance to start got error #{error}"
|
67
67
|
end
|
68
68
|
|
69
69
|
def teardown
|
70
|
-
puts "Destroying instance on AWS id: #{instance.id}"
|
70
|
+
$stderr.puts "Destroying instance on AWS id: #{instance.id}"
|
71
71
|
instances.batch_terminate!
|
72
72
|
end
|
73
73
|
end
|
@@ -23,7 +23,7 @@ class Vanagon
|
|
23
23
|
Vanagon::Driver.logger.info "Polling for a lock on #{host}."
|
24
24
|
@lockman.polling_lock(host, VANAGON_LOCK_USER, "Vanagon automated lock")
|
25
25
|
Vanagon::Driver.logger.info "Lock acquired on #{host}."
|
26
|
-
puts "Lock acquired on #{host} for #{VANAGON_LOCK_USER}."
|
26
|
+
$stderr.puts "Lock acquired on #{host} for #{VANAGON_LOCK_USER}."
|
27
27
|
host
|
28
28
|
end
|
29
29
|
|
@@ -33,7 +33,7 @@ class Vanagon
|
|
33
33
|
Vanagon::Driver.logger.info "Attempting to lock #{h}."
|
34
34
|
if @lockman.lock(h, VANAGON_LOCK_USER, "Vanagon automated lock")
|
35
35
|
Vanagon::Driver.logger.info "Lock acquired on #{h}."
|
36
|
-
puts "Lock acquired on #{h} for #{VANAGON_LOCK_USER}."
|
36
|
+
$stderr.puts "Lock acquired on #{h} for #{VANAGON_LOCK_USER}."
|
37
37
|
return h
|
38
38
|
end
|
39
39
|
end
|
@@ -45,7 +45,7 @@ class Vanagon
|
|
45
45
|
# complete. In this case, we'll attempt to unlock the hardware
|
46
46
|
def teardown
|
47
47
|
Vanagon::Driver.logger.info "Removing lock on #{@target}."
|
48
|
-
puts "Removing lock on #{@target}."
|
48
|
+
$stderr.puts "Removing lock on #{@target}."
|
49
49
|
@lockman.unlock(@target, VANAGON_LOCK_USER)
|
50
50
|
end
|
51
51
|
|
@@ -56,7 +56,7 @@ class Vanagon
|
|
56
56
|
absolute_path = File.expand_path(path)
|
57
57
|
return nil unless File.exist?(absolute_path)
|
58
58
|
|
59
|
-
puts "Reading vmpooler token from: #{path}"
|
59
|
+
$stderr.puts "Reading vmpooler token from: #{path}"
|
60
60
|
File.read(absolute_path).chomp
|
61
61
|
end
|
62
62
|
private :read_vanagon_token
|
@@ -70,7 +70,7 @@ class Vanagon
|
|
70
70
|
absolute_path = File.expand_path(path)
|
71
71
|
return nil unless File.exist?(absolute_path)
|
72
72
|
|
73
|
-
puts "Reading vmpooler token from: #{path}"
|
73
|
+
$stderr.puts "Reading vmpooler token from: #{path}"
|
74
74
|
YAML.load_file(absolute_path)['token']
|
75
75
|
end
|
76
76
|
private :read_vmfloaty_token
|
@@ -119,7 +119,7 @@ class Vanagon
|
|
119
119
|
)
|
120
120
|
if response and response["ok"]
|
121
121
|
Vanagon::Driver.logger.info "#{@target} has been destroyed"
|
122
|
-
puts "#{@target} has been destroyed"
|
122
|
+
$stderr.puts "#{@target} has been destroyed"
|
123
123
|
else
|
124
124
|
Vanagon::Driver.logger.info "#{@target} could not be destroyed"
|
125
125
|
warn "#{@target} could not be destroyed"
|
data/lib/vanagon/optparse.rb
CHANGED
data/lib/vanagon/platform.rb
CHANGED
@@ -60,6 +60,9 @@ class Vanagon
|
|
60
60
|
# Stores the local path where retrieved artifacts will be saved.
|
61
61
|
attr_accessor :output_dir
|
62
62
|
|
63
|
+
# Stores the local path where source artifacts will be saved.
|
64
|
+
attr_accessor :source_output_dir
|
65
|
+
|
63
66
|
# Username to use when connecting to a build target
|
64
67
|
attr_accessor :target_user
|
65
68
|
|
@@ -126,14 +129,13 @@ class Vanagon
|
|
126
129
|
# @raise if the instance_eval on Platform fails, the exception is reraised
|
127
130
|
def self.load_platform(name, configdir)
|
128
131
|
platfile = File.join(configdir, "#{name}.rb")
|
129
|
-
code = File.read(platfile)
|
130
132
|
dsl = Vanagon::Platform::DSL.new(name)
|
131
|
-
dsl.instance_eval(
|
133
|
+
dsl.instance_eval(File.read(platfile), platfile, 1)
|
132
134
|
dsl._platform
|
133
135
|
rescue => e
|
134
|
-
puts "Error loading platform '#{name}' using '#{platfile}':"
|
135
|
-
puts e
|
136
|
-
puts e.backtrace.join("\n")
|
136
|
+
$stderr.puts "Error loading platform '#{name}' using '#{platfile}':"
|
137
|
+
$stderr.puts e
|
138
|
+
$stderr.puts e.backtrace.join("\n")
|
137
139
|
raise e
|
138
140
|
end
|
139
141
|
|
@@ -239,6 +241,17 @@ class Vanagon
|
|
239
241
|
@output_dir ||= File.join(@os_name, @os_version, target_repo, @architecture)
|
240
242
|
end
|
241
243
|
|
244
|
+
# Get the source dir for packages. Don't change it if it was already defined
|
245
|
+
# by the platform config. Defaults to output_dir unless specified otherwise
|
246
|
+
# (RPM specifies this)
|
247
|
+
#
|
248
|
+
# @param target_repo [String] optional repo target for built source packages
|
249
|
+
# defined at the project level
|
250
|
+
# @return [String] relative path to where source packages should be output to
|
251
|
+
def source_output_dir(target_repo = "")
|
252
|
+
@source_output_dir ||= output_dir(target_repo)
|
253
|
+
end
|
254
|
+
|
242
255
|
# Get the value of @dist, or derive it from the value of @os_name and @os_version.
|
243
256
|
# This is relatively RPM specific but '#codename' is defined in Platform, and that's
|
244
257
|
# just as Deb/Ubuntu specific. All of the accessors in the top-level Platform
|
data/lib/vanagon/platform/deb.rb
CHANGED
@@ -7,6 +7,11 @@ class Vanagon
|
|
7
7
|
# @return [Array] list of commands required to build a debian package for the given project from a tarball
|
8
8
|
def generate_package(project) # rubocop:disable Metrics/AbcSize
|
9
9
|
target_dir = project.repo ? output_dir(project.repo) : output_dir
|
10
|
+
if project.source_artifacts
|
11
|
+
copy_extensions = '*.{deb,build,tar.gz,changes,dsc}'
|
12
|
+
else
|
13
|
+
copy_extensions = '*.deb'
|
14
|
+
end
|
10
15
|
pkg_arch_opt = project.noarch ? "" : "-a#{@architecture}"
|
11
16
|
["mkdir -p output/#{target_dir}",
|
12
17
|
"mkdir -p $(tempdir)/#{project.name}-#{project.version}",
|
@@ -16,7 +21,7 @@ class Vanagon
|
|
16
21
|
"gunzip -c #{project.name}-#{project.version}.tar.gz | '#{@tar}' -C '$(tempdir)/#{project.name}-#{project.version}' --strip-components 1 -xf -",
|
17
22
|
"sed -i 's/\ /?/g' $(tempdir)/#{project.name}-#{project.version}/debian/install",
|
18
23
|
"(cd $(tempdir)/#{project.name}-#{project.version}; debuild --no-lintian #{pkg_arch_opt} -uc -us)",
|
19
|
-
"cp $(tempdir)
|
24
|
+
"cp $(tempdir)/#{copy_extensions} ./output/#{target_dir}"]
|
20
25
|
end
|
21
26
|
|
22
27
|
# Method to generate the files required to build a debian package for the project
|
data/lib/vanagon/platform/dsl.rb
CHANGED
@@ -348,6 +348,10 @@ class Vanagon
|
|
348
348
|
@platform.output_dir = directory
|
349
349
|
end
|
350
350
|
|
351
|
+
def source_output_dir(directory)
|
352
|
+
@platform.source_output_dir = directory
|
353
|
+
end
|
354
|
+
|
351
355
|
# Helper to setup a apt repository on a target system
|
352
356
|
#
|
353
357
|
# @param definition [String] the repo setup file, must be a valid uri, fetched with curl
|
data/lib/vanagon/platform/rpm.rb
CHANGED
@@ -8,15 +8,24 @@ class Vanagon
|
|
8
8
|
#
|
9
9
|
# @param project [Vanagon::Project] project to build an rpm package of
|
10
10
|
# @return [Array] list of commands required to build an rpm package for the given project from a tarball
|
11
|
-
def generate_package(project)
|
11
|
+
def generate_package(project) # rubocop:disable Metrics/AbcSize
|
12
12
|
target_dir = project.repo ? output_dir(project.repo) : output_dir
|
13
|
+
target_source_output_dir = project.repo ? source_output_dir(project.repo) : source_output_dir
|
14
|
+
if project.source_artifacts
|
15
|
+
rpmbuild = "#{@rpmbuild} -ba"
|
16
|
+
artifact_copy = "mkdir -p output/#{target_source_output_dir}; cp $(tempdir)/rpmbuild/RPMS/**/*.rpm ./output/#{target_dir}; cp $(tempdir)/rpmbuild/SRPMS/*.rpm ./output/#{target_source_output_dir}"
|
17
|
+
else
|
18
|
+
rpmbuild = "#{@rpmbuild} -bb"
|
19
|
+
artifact_copy = "cp $(tempdir)/rpmbuild/*RPMS/**/*.rpm ./output/#{target_dir}"
|
20
|
+
end
|
21
|
+
|
13
22
|
["bash -c 'mkdir -p $(tempdir)/rpmbuild/{SOURCES,SPECS,BUILD,RPMS,SRPMS}'",
|
14
23
|
"cp #{project.name}-#{project.version}.tar.gz $(tempdir)/rpmbuild/SOURCES",
|
15
24
|
"cp file-list-for-rpm $(tempdir)/rpmbuild/SOURCES",
|
16
25
|
"cp #{project.name}.spec $(tempdir)/rpmbuild/SPECS",
|
17
|
-
"PATH=/opt/freeware/bin:$$PATH #{
|
26
|
+
"PATH=/opt/freeware/bin:$$PATH #{rpmbuild} --target #{@architecture} #{rpm_defines} $(tempdir)/rpmbuild/SPECS/#{project.name}.spec",
|
18
27
|
"mkdir -p output/#{target_dir}",
|
19
|
-
|
28
|
+
artifact_copy]
|
20
29
|
end
|
21
30
|
|
22
31
|
# Method to generate the files required to build an rpm package for the project
|
@@ -40,6 +49,13 @@ class Vanagon
|
|
40
49
|
super
|
41
50
|
end
|
42
51
|
|
52
|
+
# Method to derive the directory for source artifacts
|
53
|
+
#
|
54
|
+
# @param target_repo [String] repo the source artifacts are targeting
|
55
|
+
def source_output_dir(target_repo = "products")
|
56
|
+
@source_output_dir ||= File.join(@os_name, @os_version, target_repo, 'SRPMS')
|
57
|
+
end
|
58
|
+
|
43
59
|
def rpm_defines
|
44
60
|
defines = %(--define '_topdir $(tempdir)/rpmbuild' )
|
45
61
|
# RPM doesn't allow dashes in the os_name. This was added to
|
data/lib/vanagon/project.rb
CHANGED
@@ -80,6 +80,9 @@ class Vanagon
|
|
80
80
|
# them to appear in your spec/rules files!
|
81
81
|
attr_accessor :package_overrides
|
82
82
|
|
83
|
+
# Should we include source packages?
|
84
|
+
attr_accessor :source_artifacts
|
85
|
+
|
83
86
|
# Loads a given project from the configdir
|
84
87
|
#
|
85
88
|
# @param name [String] the name of the project
|
@@ -90,14 +93,13 @@ class Vanagon
|
|
90
93
|
# @raise if the instance_eval on Project fails, the exception is reraised
|
91
94
|
def self.load_project(name, configdir, platform, include_components = [])
|
92
95
|
projfile = File.join(configdir, "#{name}.rb")
|
93
|
-
code = File.read(projfile)
|
94
96
|
dsl = Vanagon::Project::DSL.new(name, platform, include_components)
|
95
|
-
dsl.instance_eval(
|
97
|
+
dsl.instance_eval(File.read(projfile), projfile, 1)
|
96
98
|
dsl._project
|
97
99
|
rescue => e
|
98
|
-
puts "Error loading project '#{name}' using '#{projfile}':"
|
99
|
-
puts e
|
100
|
-
puts e.backtrace.join("\n")
|
100
|
+
$stderr.puts "Error loading project '#{name}' using '#{projfile}':"
|
101
|
+
$stderr.puts e
|
102
|
+
$stderr.puts e.backtrace.join("\n")
|
101
103
|
raise e
|
102
104
|
end
|
103
105
|
|
@@ -122,6 +124,7 @@ class Vanagon
|
|
122
124
|
@provides = []
|
123
125
|
@conflicts = []
|
124
126
|
@package_overrides = []
|
127
|
+
@source_artifacts = false
|
125
128
|
end
|
126
129
|
|
127
130
|
# Magic getter to retrieve settings in the project
|
data/lib/vanagon/project/dsl.rb
CHANGED
@@ -148,6 +148,15 @@ class Vanagon
|
|
148
148
|
@project.release = rel
|
149
149
|
end
|
150
150
|
|
151
|
+
# Generate source packages in addition to binary packages.
|
152
|
+
# Currently only implemented for rpm/deb packages.
|
153
|
+
#
|
154
|
+
# @param source_artifacts [Boolean] whether or not to output
|
155
|
+
# source packages
|
156
|
+
def generate_source_artifacts(source_artifacts)
|
157
|
+
@project.source_artifacts = source_artifacts
|
158
|
+
end
|
159
|
+
|
151
160
|
# Sets the version for the project based on a git describe of the
|
152
161
|
# directory that holds the configs. Requires that a git tag be present
|
153
162
|
# and reachable from the current commit in that repository.
|
@@ -228,7 +237,7 @@ class Vanagon
|
|
228
237
|
#
|
229
238
|
# @param name [String] name of component to add. must be present in configdir/components and named $name.rb currently
|
230
239
|
def component(name)
|
231
|
-
puts "Loading #{name}" if @project.settings[:verbose]
|
240
|
+
$stderr.puts "Loading #{name}" if @project.settings[:verbose]
|
232
241
|
if @include_components.empty? or @include_components.include?(name)
|
233
242
|
component = Vanagon::Component.load_component(name, File.join(Vanagon::Driver.configdir, "components"), @project.settings, @project.platform)
|
234
243
|
@project.components << component
|
@@ -252,7 +261,7 @@ class Vanagon
|
|
252
261
|
# @param protocol [String] a supported component source type (Http, Git, ...)
|
253
262
|
# @param rule [String, Proc] a rule used to rewrite component source urls
|
254
263
|
def register_rewrite_rule(protocol, rule)
|
255
|
-
Vanagon::Component::Source.register_rewrite_rule(protocol, rule)
|
264
|
+
Vanagon::Component::Source::Rewrite.register_rewrite_rule(protocol, rule)
|
256
265
|
end
|
257
266
|
|
258
267
|
# Toggle to apply additional cleanup during the build for space constrained systems
|
data/lib/vanagon/utilities.rb
CHANGED
@@ -210,7 +210,7 @@ class Vanagon
|
|
210
210
|
# output of the command if return_command_output is true
|
211
211
|
# @raise [RuntimeError] If there is no target given or the command fails an exception is raised
|
212
212
|
def remote_ssh_command(target, command, port = 22, return_command_output: false)
|
213
|
-
puts "Executing '#{command}' on '#{target}'"
|
213
|
+
$stderr.puts "Executing '#{command}' on '#{target}'"
|
214
214
|
if return_command_output
|
215
215
|
ret = %x(#{ssh_command(port)} -T #{target} '#{command.gsub("'", "'\\\\''")}').chomp
|
216
216
|
if $CHILD_STATUS.success?
|
@@ -233,7 +233,7 @@ class Vanagon
|
|
233
233
|
# @raise [RuntimeError] If the command fails an exception is raised
|
234
234
|
def local_command(command, return_command_output: false)
|
235
235
|
clean_environment do
|
236
|
-
puts "Executing '#{command}' locally"
|
236
|
+
$stderr.puts "Executing '#{command}' locally"
|
237
237
|
if return_command_output
|
238
238
|
ret = %x(#{command}).chomp
|
239
239
|
if $CHILD_STATUS.success?
|
@@ -277,7 +277,7 @@ class Vanagon
|
|
277
277
|
outfile ||= File.join(Dir.mktmpdir, File.basename(erbfile).sub(File.extname(erbfile), ""))
|
278
278
|
output = erb_string(erbfile, opts[:binding])
|
279
279
|
File.open(outfile, 'w') { |f| f.write output }
|
280
|
-
puts "Generated: #{outfile}"
|
280
|
+
$stderr.puts "Generated: #{outfile}"
|
281
281
|
FileUtils.rm_rf erbfile if remove_orig
|
282
282
|
outfile
|
283
283
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'vanagon/component/source'
|
2
|
+
|
3
|
+
describe "Vanagon::Component::Source::Rewrite" do
|
4
|
+
let(:klass) { Vanagon::Component::Source::Rewrite }
|
5
|
+
before(:each) { klass.rewrite_rules.clear }
|
6
|
+
|
7
|
+
describe ".parse_and_rewrite" do
|
8
|
+
let(:simple_rule) { Proc.new {|url| url.gsub('a', 'e') } }
|
9
|
+
let(:complex_rule) do
|
10
|
+
Proc.new do |url|
|
11
|
+
match = url.match(/github.com\/(.*)$/)
|
12
|
+
"git://github.delivery.puppetlabs.net/#{match[1].gsub('/', '-')}" if match
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'replaces the first section of a url with a string if string is given' do
|
17
|
+
klass.register_rewrite_rule('http', 'http://buildsources.delivery.puppetlabs.net')
|
18
|
+
|
19
|
+
expect(klass.rewrite('http://things.and.stuff/foo.tar.gz', 'http'))
|
20
|
+
.to eq('http://buildsources.delivery.puppetlabs.net/foo.tar.gz')
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'applies the rule to the url if a proc is given as the rule' do
|
24
|
+
klass.register_rewrite_rule('http', simple_rule)
|
25
|
+
|
26
|
+
expect(klass.rewrite('http://things.and.stuff/foo.tar.gz', 'http'))
|
27
|
+
.to eq('http://things.end.stuff/foo.ter.gz')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'applies the rule to the url if a proc is given as the rule' do
|
31
|
+
klass.register_rewrite_rule('git', complex_rule)
|
32
|
+
|
33
|
+
expect(klass.rewrite('git://github.com/puppetlabs/facter', 'git'))
|
34
|
+
.to eq('git://github.delivery.puppetlabs.net/puppetlabs-facter')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe ".register_rewrite_rule" do
|
39
|
+
it 'only accepts Proc and String as rule types' do
|
40
|
+
expect { klass.register_rewrite_rule('http', 5) }
|
41
|
+
.to raise_error(Vanagon::Error)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'rejects invalid protocols' do
|
45
|
+
expect { klass.register_rewrite_rule('gopher', 'abcd') }
|
46
|
+
.to raise_error Vanagon::Error
|
47
|
+
end
|
48
|
+
|
49
|
+
before { klass.register_rewrite_rule('http', 'http://buildsources.delivery.puppetlabs.net') }
|
50
|
+
it 'registers the rule for the given protocol' do
|
51
|
+
expect(klass.rewrite_rules)
|
52
|
+
.to eq({'http' => 'http://buildsources.delivery.puppetlabs.net'})
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -2,7 +2,6 @@ require 'vanagon/component/source'
|
|
2
2
|
|
3
3
|
describe "Vanagon::Component::Source" do
|
4
4
|
let(:klass) { Vanagon::Component::Source }
|
5
|
-
before(:each) { klass.rewrite_rules.clear }
|
6
5
|
|
7
6
|
describe ".source" do
|
8
7
|
let(:unrecognized_uri) { "abcd://things" }
|
@@ -24,10 +23,8 @@ describe "Vanagon::Component::Source" do
|
|
24
23
|
let(:workdir) { Dir.mktmpdir }
|
25
24
|
|
26
25
|
let(:original_git_url) { "git://things.and.stuff/foo-bar.git" }
|
27
|
-
let(:rewritten_git_url) { "git://things.end.stuff/foo-ber.git" }
|
28
26
|
|
29
27
|
let(:original_http_url) { "http://things.and.stuff/foo.tar.gz" }
|
30
|
-
let(:rewritten_http_url) { "http://buildsources.delivery.puppetlabs.net/foo.tar.gz" }
|
31
28
|
|
32
29
|
it "fails on unrecognized URI schemes" do
|
33
30
|
expect { klass.source(unrecognized_uri, workdir: workdir) }
|
@@ -69,17 +66,6 @@ describe "Vanagon::Component::Source" do
|
|
69
66
|
expect(klass.source(https_git, ref: ref, workdir: workdir).class)
|
70
67
|
.to eq Vanagon::Component::Source::Git
|
71
68
|
end
|
72
|
-
|
73
|
-
it "rewrites git:// URLs" do
|
74
|
-
proc_rule = Proc.new { |url| url.gsub('a', 'e') }
|
75
|
-
klass.register_rewrite_rule('git', proc_rule)
|
76
|
-
# Vanagon::Component::Source::Git#url returns a URI object
|
77
|
-
# so to check its value, we cast it to a simple string. It's
|
78
|
-
# hacky for sure, but seems less diagreeable than mangling the
|
79
|
-
# return value in the class itself.
|
80
|
-
expect(klass.source(original_git_url, ref: ref, workdir: workdir).url.to_s)
|
81
|
-
.to eq rewritten_git_url
|
82
|
-
end
|
83
69
|
end
|
84
70
|
|
85
71
|
context "takes a HTTP/HTTPS file" do
|
@@ -102,15 +88,6 @@ describe "Vanagon::Component::Source" do
|
|
102
88
|
expect(klass.source(https_url, sum: sum, workdir: workdir, sum_type: "md5").class)
|
103
89
|
.to equal(Vanagon::Component::Source::Http)
|
104
90
|
end
|
105
|
-
|
106
|
-
before do
|
107
|
-
klass.register_rewrite_rule 'http',
|
108
|
-
'http://buildsources.delivery.puppetlabs.net'
|
109
|
-
end
|
110
|
-
it "applies rewrite rules to HTTP URLs" do
|
111
|
-
expect(klass.source(original_http_url, sum: sum, workdir: workdir, sum_type: "md5").url)
|
112
|
-
.to eq(rewritten_http_url)
|
113
|
-
end
|
114
91
|
end
|
115
92
|
|
116
93
|
context "takes a local file" do
|
@@ -130,53 +107,4 @@ describe "Vanagon::Component::Source" do
|
|
130
107
|
end
|
131
108
|
end
|
132
109
|
end
|
133
|
-
|
134
|
-
describe ".rewrite" do
|
135
|
-
let(:simple_rule) { Proc.new {|url| url.gsub('a', 'e') } }
|
136
|
-
let(:complex_rule) do
|
137
|
-
Proc.new do |url|
|
138
|
-
match = url.match(/github.com\/(.*)$/)
|
139
|
-
"git://github.delivery.puppetlabs.net/#{match[1].gsub('/', '-')}" if match
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'replaces the first section of a url with a string if string is given' do
|
144
|
-
klass.register_rewrite_rule('http', 'http://buildsources.delivery.puppetlabs.net')
|
145
|
-
|
146
|
-
expect(klass.rewrite('http://things.and.stuff/foo.tar.gz', 'http'))
|
147
|
-
.to eq('http://buildsources.delivery.puppetlabs.net/foo.tar.gz')
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'applies the rule to the url if a proc is given as the rule' do
|
151
|
-
klass.register_rewrite_rule('http', simple_rule)
|
152
|
-
|
153
|
-
expect(klass.rewrite('http://things.and.stuff/foo.tar.gz', 'http'))
|
154
|
-
.to eq('http://things.end.stuff/foo.ter.gz')
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'applies the rule to the url if a proc is given as the rule' do
|
158
|
-
klass.register_rewrite_rule('git', complex_rule)
|
159
|
-
|
160
|
-
expect(klass.rewrite('git://github.com/puppetlabs/facter', 'git'))
|
161
|
-
.to eq('git://github.delivery.puppetlabs.net/puppetlabs-facter')
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
describe ".register_rewrite_rule" do
|
166
|
-
it 'only accepts Proc and String as rule types' do
|
167
|
-
expect { klass.register_rewrite_rule('http', 5) }
|
168
|
-
.to raise_error(Vanagon::Error)
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'rejects invalid protocols' do
|
172
|
-
expect { klass.register_rewrite_rule('gopher', 'abcd') }
|
173
|
-
.to raise_error Vanagon::Error
|
174
|
-
end
|
175
|
-
|
176
|
-
before { klass.register_rewrite_rule('http', 'http://buildsources.delivery.puppetlabs.net') }
|
177
|
-
it 'registers the rule for the given protocol' do
|
178
|
-
expect(klass.rewrite_rules)
|
179
|
-
.to eq({'http' => 'http://buildsources.delivery.puppetlabs.net'})
|
180
|
-
end
|
181
|
-
end
|
182
110
|
end
|