vanagon 0.15.9 → 0.15.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d495893440327f099e0b318c1d7e5966a7c186e6
4
- data.tar.gz: c626b8ca9a1e48dbe0d08d6bc3857e7226223233
3
+ metadata.gz: c881a94010be196e7f3ca83630dcd5992942e05e
4
+ data.tar.gz: aa92f93959346079d3860751d901319a5b94c86d
5
5
  SHA512:
6
- metadata.gz: 78aee1207d6b21ac432bf07bda73f9491d1b19ae80271b545fad51e1cffcf27e8b3f5adba2a3b70bf1713c555feb5000a6b8f50a0f40b0fc184d9e49b3c21127
7
- data.tar.gz: b81d5f2cf49c8de57cbbc4d5b952eaecaed7af319a03b500c9aaa1c001b91cff03584e20976470caf84dccae6858cf1572dad59e2f26553ee5c1c1939b00a51f
6
+ metadata.gz: 614fb484ead28a97271a5de18fa03a2772b6026a2af72c64666afbb01fb06d0e866528c0ae3dc623ab2b51ad87e0b3a63bd29807be2b019424143c46785c5397
7
+ data.tar.gz: a330ed57d45a948ab45d8949e078f9d9efbefa0a33d1c0b21c8a96993a076b3c5e1487e83def372b66f074b603bc0962de22e4c4ee6232ed4c9ca4a8cef96dcc
@@ -144,6 +144,7 @@ class Vanagon
144
144
  @engine.ship_workdir(workdir)
145
145
  @engine.dispatch("(cd #{@engine.remote_workdir}; #{@platform.make} #{make_target})")
146
146
  @engine.retrieve_built_artifact(@project.artifacts_to_fetch, @project.no_packaging)
147
+ @project.publish_yaml_settings(@platform)
147
148
 
148
149
  if %i[never on-failure].include? @preserve
149
150
  @engine.teardown
@@ -61,6 +61,9 @@ class Vanagon
61
61
  # !refactor
62
62
  attr_accessor :version_file
63
63
 
64
+ # Store whether Vanagon should write the project's settings to a yaml file during builds
65
+ attr_accessor :yaml_settings
66
+
64
67
  # Stores the location for the bill-of-materials (a receipt of all
65
68
  # files written during) project package assembly
66
69
  attr_accessor :bill_of_materials
@@ -145,6 +148,7 @@ class Vanagon
145
148
  @source_artifacts = false
146
149
  @compiled_archive = false
147
150
  @generate_packages = true
151
+ @yaml_settings = false
148
152
  @no_packaging = false
149
153
  @artifacts_to_fetch = []
150
154
  end
@@ -665,6 +669,28 @@ class Vanagon
665
669
  end
666
670
  end
667
671
 
672
+ # Writes a yaml file at `output/<name>-<version>.<platform>.settings.yaml`
673
+ # containing settings used to build the current project on the platform
674
+ # provided (and a corresponding sha1sum file) if `yaml_settings` has been
675
+ # set in the project definition.
676
+ #
677
+ # @param [Vanagon::Platform] the platform to publish settings for
678
+ def publish_yaml_settings(platform)
679
+ return unless yaml_settings
680
+ raise(Vanagon::Error, "You must specify a project version") unless version
681
+
682
+ filename = "#{name}-#{version}.#{platform.name}.settings.yaml"
683
+ filepath = File.join('output', filename)
684
+
685
+ File.open(filepath, 'w') do |f|
686
+ f.write(@settings.to_yaml)
687
+ end
688
+
689
+ File.open("#{filepath}.sha1", 'w') do |f|
690
+ f.write(system("#{platform.shasum} #{filepath}", err: File::NULL))
691
+ end
692
+ end
693
+
668
694
  # Load the settings hash from an upstream vanagon project.
669
695
  # This will clone a git repo at a specified branch and load the specified
670
696
  # vanagon project (with no components). The settings hash of the upstream
@@ -692,5 +718,37 @@ class Vanagon
692
718
  upstream_project.cleanup
693
719
  end
694
720
  end
721
+
722
+ # Load the settings hash for the current project/platform combination from a
723
+ # yaml file as produced by `publish_yaml_settings`. file:// and http:// URIs
724
+ # are accepted. If the URI uses http://, a sha1 URI is also required.
725
+ #
726
+ # @param settings_uri [String] A URI to a yaml settings file
727
+ # @param settings_sha1_uri [String] A URI to a sha1sum file for the yaml settings file
728
+ # @raise [Vanagon::Error] when the settings file can't be found
729
+ def load_yaml_settings(settings_uri, settings_sha1_uri = nil) # rubocop:disable Metrics/AbcSize
730
+ source_type = Vanagon::Component::Source.determine_source_type(settings_uri)
731
+
732
+ if %i[unknown git].include?(source_type)
733
+ message = "Can't inherit settings from '#{settings_uri}'. Only http and file URIs are valid."
734
+ if settings_uri =~ /^file/
735
+ message = "Tried to load YAML settings from '#{settings_uri}', but the file doesn't exist."
736
+ end
737
+ raise Vanagon::Error, message
738
+ end
739
+
740
+ if (source_type == :http) && !settings_sha1_uri
741
+ raise Vanagon::Error, "You must provide a sha1sum URI for the YAML file when inheriting YAML settings over http"
742
+ end
743
+
744
+ Dir.mktmpdir do |working_directory|
745
+ source = Vanagon::Component::Source.source(settings_uri,
746
+ workdir: working_directory,
747
+ sum: settings_sha1_uri,
748
+ sum_type: 'sha1')
749
+ source.fetch
750
+ @settings.merge!(YAML.safe_load(File.read(File.join(working_directory, source.file)), [Symbol]))
751
+ end
752
+ end
695
753
  end
696
754
  end
@@ -1,8 +1,10 @@
1
+ require 'vanagon/errors'
1
2
  require 'vanagon/project'
2
3
  require 'vanagon/utilities'
3
4
  require 'vanagon/component/source'
4
- require 'set'
5
5
  require 'git/rev_list'
6
+ require 'set'
7
+ require 'yaml'
6
8
 
7
9
  class Vanagon
8
10
  class Project
@@ -302,6 +304,11 @@ class Vanagon
302
304
  @project.version_file = Vanagon::Common::Pathname.file(target)
303
305
  end
304
306
 
307
+ # This method will write the project's settings (per-platform) to the output directory as yaml after building
308
+ def publish_yaml_settings
309
+ @project.yaml_settings = true
310
+ end
311
+
305
312
  # This method will write the project's bill-of-materials to a designated directory during package creation.
306
313
  # @param target [String] a full path to the directory for the bill-of-materials for the project
307
314
  def bill_of_materials(target)
@@ -322,6 +329,15 @@ class Vanagon
322
329
  @project.load_upstream_settings(upstream_project_name, upstream_git_url, upstream_git_branch)
323
330
  end
324
331
 
332
+ # Inherit the settings hash for the current project and platform from a
333
+ # yaml file as generated by `publish_yaml_settings`
334
+ #
335
+ # @param yaml_settings_uri [String] URI (file://... or http://...) to a file containing a yaml representation of vanagon settings
336
+ # @param yaml_settings_sha1_uri [String] URI (file://... or http://...) to a file the sha1sum for the settings file
337
+ def inherit_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri = nil)
338
+ @project.load_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri)
339
+ end
340
+
325
341
  # Set a package override. Will call the platform-specific implementation
326
342
  # This will get set in the spec file, deb rules, etc.
327
343
  #
@@ -161,7 +161,7 @@ install -d %{buildroot}
161
161
  # Here we turn all dirs in the file-list into %dir entries to avoid duplicate files
162
162
  while read entry; do
163
163
  if [ -n "$entry" -a -d "$entry" -a ! -L "$entry" ]; then
164
- PATH=/opt/freeware/bin:$PATH <%= @platform.sed %> -i "s|^\($entry\)\$|%dir \1|g" %{SOURCE1}
164
+ <%= @platform.sed %> -i "\|^$entry\$|s|^|%dir |" %{SOURCE1}
165
165
  fi
166
166
  done < %{SOURCE1}
167
167
 
@@ -1,5 +1,6 @@
1
1
  require 'vanagon/project'
2
2
  require 'vanagon/driver'
3
+ require 'vanagon/errors'
3
4
 
4
5
  describe 'Vanagon::Project' do
5
6
  let(:component) { double(Vanagon::Component) }
@@ -126,6 +127,75 @@ describe 'Vanagon::Project' do
126
127
  end
127
128
  end
128
129
 
130
+ describe "#load_yaml_settings" do
131
+ subject(:project) do
132
+ project = Vanagon::Project.new('yaml-inheritance-test', Vanagon::Platform.new('aix-7.2-ppc'))
133
+ project.settings = { merged: 'nope', original: 'original' }
134
+ project
135
+ end
136
+
137
+ let(:yaml_filename) { 'settings.yaml' }
138
+ let(:sha1_filename) { "#{yaml_filename}.sha1" }
139
+
140
+ let(:yaml_path) { "/path/to/#{yaml_filename}" }
141
+ let(:sha1_path) { "/path/to/#{sha1_filename}" }
142
+
143
+ let(:yaml_content) { { other: 'other', merged: 'yup' }.to_yaml }
144
+
145
+ let(:local_yaml_uri) { "file://#{yaml_path}" }
146
+ let(:http_yaml_uri) { "http:/#{yaml_path}" }
147
+
148
+ before(:each) do
149
+ allow(Dir).to receive(:mktmpdir) { |&block| block.yield '' }
150
+ end
151
+
152
+ it "fails for a local source if the settings file doesn't exist" do
153
+ expect { project.load_yaml_settings(local_yaml_uri) }.to raise_error(Vanagon::Error)
154
+ end
155
+
156
+ it "fails if given a git source" do
157
+ expect { project.load_yaml_settings('git://some/repo.uri') }.to raise_error(Vanagon::Error)
158
+ end
159
+
160
+ it "fails when given an unknown source" do
161
+ expect { project.load_yaml_settings("fake://source.uri") }.to raise_error(Vanagon::Error)
162
+ end
163
+
164
+ it "fails if downloading over HTTP without a valid sha1sum URI" do
165
+ allow(Vanagon::Component::Source::Http).to receive(:valid_url?).with(http_yaml_uri).and_return(true)
166
+ http_source = instance_double(Vanagon::Component::Source::Http)
167
+ allow(Vanagon::Component::Source).to receive(:source).and_return(http_source)
168
+
169
+ expect { project.load_yaml_settings(http_yaml_uri) }.to raise_error(Vanagon::Error)
170
+ end
171
+
172
+ context "given a valid source" do
173
+ before(:each) do
174
+ local_source = instance_double(Vanagon::Component::Source::Local)
175
+ allow(local_source).to receive(:fetch)
176
+ allow(local_source).to receive(:file).and_return(yaml_path)
177
+
178
+ allow(Vanagon::Component::Source).to receive(:determine_source_type).and_return(:local)
179
+ allow(Vanagon::Component::Source).to receive(:source).and_return(local_source)
180
+ allow(File).to receive(:read).with(yaml_path).and_return(yaml_content)
181
+
182
+ expect { project.load_yaml_settings(local_yaml_uri) }.not_to raise_exception
183
+ end
184
+
185
+ it "overwrites the current project's settings when they conflict" do
186
+ expect(project.settings[:merged]).to eq('yup')
187
+ end
188
+
189
+ it "adopts new settings found in the other project" do
190
+ expect(project.settings[:other]).to eq('other')
191
+ end
192
+
193
+ it "keeps its own settings when there are no conflicts" do
194
+ expect(project.settings[:original]).to eq('original')
195
+ end
196
+ end
197
+ end
198
+
129
199
  describe "#filter_component" do
130
200
 
131
201
  # All of the following tests should be run with one project level
@@ -308,6 +378,50 @@ describe 'Vanagon::Project' do
308
378
  end
309
379
  end
310
380
 
381
+ describe '#publish_yaml_settings' do
382
+ let(:platform_name) { 'aix-7.2-ppc' }
383
+ let(:platform) { Vanagon::Platform.new(platform_name) }
384
+
385
+ subject(:project) do
386
+ project = Vanagon::Project.new('test-project', platform)
387
+ project.settings = { key: 'value' }
388
+ project.version = 'version'
389
+ project.yaml_settings = true
390
+ project
391
+ end
392
+
393
+ let(:yaml_output_path) { "output/test-project-version.#{platform_name}.settings.yaml" }
394
+ let(:sha1_output_path) { "output/test-project-version.#{platform_name}.settings.yaml.sha1" }
395
+
396
+ let(:yaml_file) { double('yaml_file') }
397
+ let(:sha1_file) { double('sha1_file') }
398
+
399
+ it 'writes project settings as yaml and a sha1sum for the settings to the output directory' do
400
+ expect(File).to receive(:open).with(yaml_output_path, "w").and_yield(yaml_file)
401
+ expect(File).to receive(:open).with(sha1_output_path, "w").and_yield(sha1_file)
402
+ expect(yaml_file).to receive(:write).with({key: 'value'}.to_yaml)
403
+ expect(sha1_file).to receive(:write)
404
+ expect { project.publish_yaml_settings(platform) }.not_to raise_error
405
+ end
406
+
407
+ it 'does not write yaml settings or a sha1sum unless told to' do
408
+ project.yaml_settings = false
409
+ expect(File).not_to receive(:open)
410
+ expect { project.publish_yaml_settings(platform) }.not_to raise_error
411
+ end
412
+
413
+ it "fails if the output directory doesn't exist" do
414
+ allow_any_instance_of(File).to receive(:open).with(yaml_output_path).and_raise(Errno::ENOENT)
415
+ allow_any_instance_of(File).to receive(:open).with(sha1_output_path).and_raise(Errno::ENOENT)
416
+ expect { project.publish_yaml_settings(platform) }.to raise_error(Errno::ENOENT)
417
+ end
418
+
419
+ it "fails unless the project has a version" do
420
+ project.version = nil
421
+ expect { project.publish_yaml_settings(platform) }.to raise_error(Vanagon::Error)
422
+ end
423
+ end
424
+
311
425
  describe '#generate_package' do
312
426
  it "builds packages by default" do
313
427
  platform = Vanagon::Platform::DSL.new('el-7-x86_64')
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.9
4
+ version: 0.15.10
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-05-09 00:00:00.000000000 Z
11
+ date: 2018-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -264,41 +264,41 @@ signing_key:
264
264
  specification_version: 3
265
265
  summary: All of your packages will fit into this van with this one simple trick.
266
266
  test_files:
267
- - spec/lib/git/rev_list_spec.rb
268
- - spec/lib/makefile_spec.rb
269
- - spec/lib/vanagon/common/pathname_spec.rb
270
- - spec/lib/vanagon/common/user_spec.rb
271
- - spec/lib/vanagon/component/dsl_spec.rb
272
- - spec/lib/vanagon/component/rules_spec.rb
273
- - spec/lib/vanagon/component/source/git_spec.rb
274
- - spec/lib/vanagon/component/source/http_spec.rb
275
- - spec/lib/vanagon/component/source/local_spec.rb
276
- - spec/lib/vanagon/component/source/rewrite_spec.rb
277
- - spec/lib/vanagon/component/source_spec.rb
278
267
  - spec/lib/vanagon/component_spec.rb
268
+ - spec/lib/vanagon/project_spec.rb
269
+ - spec/lib/vanagon/optparse_spec.rb
279
270
  - spec/lib/vanagon/driver_spec.rb
280
- - spec/lib/vanagon/engine/always_be_scheduling_spec.rb
281
- - spec/lib/vanagon/engine/base_spec.rb
282
- - spec/lib/vanagon/engine/docker_spec.rb
283
- - spec/lib/vanagon/engine/ec2_spec.rb
284
- - spec/lib/vanagon/engine/hardware_spec.rb
285
- - spec/lib/vanagon/engine/local_spec.rb
286
- - spec/lib/vanagon/engine/pooler_spec.rb
287
271
  - spec/lib/vanagon/environment_spec.rb
288
- - spec/lib/vanagon/extensions/ostruct/json_spec.rb
289
- - spec/lib/vanagon/extensions/set/json_spec.rb
290
- - spec/lib/vanagon/extensions/string_spec.rb
291
- - spec/lib/vanagon/optparse_spec.rb
292
- - spec/lib/vanagon/platform/deb_spec.rb
272
+ - spec/lib/vanagon/platform/windows_spec.rb
273
+ - spec/lib/vanagon/platform/solaris_11_spec.rb
274
+ - spec/lib/vanagon/platform/solaris_10_spec.rb
293
275
  - spec/lib/vanagon/platform/dsl_spec.rb
294
276
  - spec/lib/vanagon/platform/osx_spec.rb
295
- - spec/lib/vanagon/platform/rpm/aix_spec.rb
277
+ - spec/lib/vanagon/platform/deb_spec.rb
296
278
  - spec/lib/vanagon/platform/rpm_spec.rb
297
- - spec/lib/vanagon/platform/solaris_10_spec.rb
298
- - spec/lib/vanagon/platform/solaris_11_spec.rb
299
- - spec/lib/vanagon/platform/windows_spec.rb
300
- - spec/lib/vanagon/platform_spec.rb
279
+ - spec/lib/vanagon/platform/rpm/aix_spec.rb
280
+ - spec/lib/vanagon/component/source/rewrite_spec.rb
281
+ - spec/lib/vanagon/component/source/git_spec.rb
282
+ - spec/lib/vanagon/component/source/local_spec.rb
283
+ - spec/lib/vanagon/component/source/http_spec.rb
284
+ - spec/lib/vanagon/component/dsl_spec.rb
285
+ - spec/lib/vanagon/component/source_spec.rb
286
+ - spec/lib/vanagon/component/rules_spec.rb
287
+ - spec/lib/vanagon/extensions/string_spec.rb
288
+ - spec/lib/vanagon/extensions/set/json_spec.rb
289
+ - spec/lib/vanagon/extensions/ostruct/json_spec.rb
301
290
  - spec/lib/vanagon/project/dsl_spec.rb
302
- - spec/lib/vanagon/project_spec.rb
303
291
  - spec/lib/vanagon/utilities/shell_utilities_spec.rb
304
292
  - spec/lib/vanagon/utilities_spec.rb
293
+ - spec/lib/vanagon/common/pathname_spec.rb
294
+ - spec/lib/vanagon/common/user_spec.rb
295
+ - spec/lib/vanagon/platform_spec.rb
296
+ - spec/lib/vanagon/engine/always_be_scheduling_spec.rb
297
+ - spec/lib/vanagon/engine/docker_spec.rb
298
+ - spec/lib/vanagon/engine/ec2_spec.rb
299
+ - spec/lib/vanagon/engine/hardware_spec.rb
300
+ - spec/lib/vanagon/engine/local_spec.rb
301
+ - spec/lib/vanagon/engine/base_spec.rb
302
+ - spec/lib/vanagon/engine/pooler_spec.rb
303
+ - spec/lib/makefile_spec.rb
304
+ - spec/lib/git/rev_list_spec.rb