vanagon 0.13.1 → 0.14.1
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 +4 -4
- data/README.md +0 -45
- data/bin/ship +13 -0
- data/lib/vanagon/component.rb +26 -3
- data/lib/vanagon/component/dsl.rb +51 -10
- data/lib/vanagon/component/rules.rb +26 -10
- data/lib/vanagon/component/source/http.rb +17 -2
- data/lib/vanagon/driver.rb +17 -32
- data/lib/vanagon/engine/pooler.rb +43 -21
- data/lib/vanagon/optparse.rb +70 -24
- data/lib/vanagon/platform.rb +30 -0
- data/lib/vanagon/platform/deb.rb +6 -1
- data/lib/vanagon/platform/dsl.rb +4 -0
- data/lib/vanagon/platform/osx.rb +3 -1
- data/lib/vanagon/platform/rpm.rb +2 -1
- data/lib/vanagon/platform/rpm/aix.rb +1 -0
- data/lib/vanagon/platform/solaris_10.rb +3 -2
- data/lib/vanagon/platform/solaris_11.rb +2 -1
- data/lib/vanagon/platform/windows.rb +11 -1
- data/lib/vanagon/project.rb +152 -27
- data/lib/vanagon/project/dsl.rb +23 -0
- data/lib/vanagon/utilities.rb +5 -2
- data/resources/deb/postinst.erb +17 -0
- data/resources/deb/triggers.erb +11 -0
- data/resources/rpm/project.spec.erb +18 -2
- data/spec/lib/vanagon/component/dsl_spec.rb +92 -2
- data/spec/lib/vanagon/component/rules_spec.rb +84 -0
- data/spec/lib/vanagon/component/source/http_spec.rb +1 -1
- data/spec/lib/vanagon/component/source/rewrite_spec.rb +6 -4
- data/spec/lib/vanagon/component/source_spec.rb +10 -5
- data/spec/lib/vanagon/component_spec.rb +4 -0
- data/spec/lib/vanagon/optparse_spec.rb +30 -6
- data/spec/lib/vanagon/platform/windows_spec.rb +28 -0
- data/spec/lib/vanagon/project_spec.rb +179 -0
- metadata +3 -4
- data/bin/devkit +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 072c1ccfd65eb990500787ebd5cfa03d25a4ae09
|
4
|
+
data.tar.gz: 7e3a2687a3e8a8b367fe195d1d853ce782d46005
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d015eede00d49017508043fd1f235b46b2ef61b4e608abd75cb8fec863fafe4d5b0f63a4dbe1a26c6a32cae47424f8ec63ae33603cb943a960b8588b9126982f
|
7
|
+
data.tar.gz: 86c8a5b9ea8dce5c3d0b3fb83f0c1280e8dc94ce37f1256f5c0707bc229e570e4570f6a83fae8b0138655e270a3711c80a91ff27f33f07f34a3979aeb3dda3a6
|
data/README.md
CHANGED
@@ -11,7 +11,6 @@
|
|
11
11
|
- [Configuration and Usage](#configuration-and-usage)
|
12
12
|
- [`build` usage](#build-usage)
|
13
13
|
- [`inspect` usage](#inspect-usage)
|
14
|
-
- [`devkit` usage](#devkit-usage)
|
15
14
|
- [Engines](#engines)
|
16
15
|
- [Amazon Ec2](#amazon-ec2)
|
17
16
|
- [Contributing](#contributing)
|
@@ -33,13 +32,6 @@ Vanagon builds up a Makefile and packaging files (specfile for RPM,
|
|
33
32
|
control/rules/etc for DEB) and copies them to a remote host, where make can be
|
34
33
|
invoked to build all of the components and make a package of the contents.
|
35
34
|
|
36
|
-
Vanagon also provides a devkit command that will prepare a machine as a
|
37
|
-
development environment for the entire project, or restricted to individual
|
38
|
-
components of the project. The devkit command installs all required build tools,
|
39
|
-
creates a master makefile for the project, and configures, builds, and installs
|
40
|
-
all components. The result is an environment where you can work on individual
|
41
|
-
components, then rebuild the project and test the installed artifacts.
|
42
|
-
|
43
35
|
### How is it pronounced?
|
44
36
|
|
45
37
|
Vanagon (/ˈvænəgɪn/) sounds like "van again." It does not sound like "van wagon" or "van and gone."
|
@@ -255,43 +247,6 @@ build-time configuration, environment variables, and expected artifacts.
|
|
255
247
|
|
256
248
|
---
|
257
249
|
|
258
|
-
### `devkit` usage
|
259
|
-
|
260
|
-
The devkit command has positional arguments and position independent flagged
|
261
|
-
arguments.
|
262
|
-
|
263
|
-
#### Arguments (position dependent)
|
264
|
-
|
265
|
-
##### project name
|
266
|
-
As in `build` arguments.
|
267
|
-
|
268
|
-
##### platform name
|
269
|
-
As in `build` arguments.
|
270
|
-
|
271
|
-
##### component names <optional>
|
272
|
-
Specifies specific components that should be built. If components are not
|
273
|
-
specified, then all components in the project will be built. If components
|
274
|
-
are specified as arguments, then any in the project that aren't specified
|
275
|
-
as arguments will be retrieved from packages rather than built from source.
|
276
|
-
|
277
|
-
#### Flagged arguments
|
278
|
-
|
279
|
-
**Note:** command flags can be used anywhere in the command.
|
280
|
-
|
281
|
-
Supports all flagged arguments from the `build` command.
|
282
|
-
|
283
|
-
##### -t HOST, --target HOST
|
284
|
-
As in the `build` target host optional argument.
|
285
|
-
|
286
|
-
#### Flags
|
287
|
-
|
288
|
-
**Note:** command flags can be used anywhere in the command.
|
289
|
-
|
290
|
-
##### -h, --help
|
291
|
-
Display command-line help.
|
292
|
-
|
293
|
-
---
|
294
|
-
|
295
250
|
Engines
|
296
251
|
---
|
297
252
|
|
data/bin/ship
CHANGED
@@ -12,4 +12,17 @@ else
|
|
12
12
|
require 'packaging'
|
13
13
|
Pkg::Util::RakeUtils.load_packaging_tasks
|
14
14
|
Pkg::Util::RakeUtils.invoke_task('pl:jenkins:ship', 'artifacts', 'output')
|
15
|
+
begin
|
16
|
+
Pkg::Util::RakeUtils.invoke_task('pl:jenkins:ship_to_artifactory', 'output')
|
17
|
+
rescue
|
18
|
+
warn <<-DOC
|
19
|
+
Unable to ship packages to artifactory. Please make sure you are pointing to a
|
20
|
+
recent version of packaging in your Gemfile. Please also make sure you include
|
21
|
+
the artifactory gem in your Gemfile.
|
22
|
+
|
23
|
+
i.e.,
|
24
|
+
gem 'packaging', :github => 'puppetlabs/packaging', branch: '1.0.x'
|
25
|
+
gem 'artifactory'
|
26
|
+
DOC
|
27
|
+
end
|
15
28
|
end
|
data/lib/vanagon/component.rb
CHANGED
@@ -92,6 +92,15 @@ class Vanagon
|
|
92
92
|
# preinstall_actions is a two-dimensional Array, describing scripts that
|
93
93
|
# should be executed before a given component is installed.
|
94
94
|
attr_accessor :preinstall_actions
|
95
|
+
# install_triggers is a one-dimensional Array of OpenStructs, describing scripts that
|
96
|
+
# should be executed when a package is installed or upgraded
|
97
|
+
attr_accessor :install_triggers
|
98
|
+
# interest_triggers is a one-dimensional Array of OpenStructs, describing scripts that
|
99
|
+
# should be executed when a package identifies an interest trigger
|
100
|
+
attr_accessor :interest_triggers
|
101
|
+
# activate_triggers is a one-dimentional Array of Strings, describing scripts that
|
102
|
+
# should be executed when a package identifies an activate trigger
|
103
|
+
attr_accessor :activate_triggers
|
95
104
|
# postinstall_actions is a two-dimensional Array, describing scripts that
|
96
105
|
# should be executed after a given component is installed.
|
97
106
|
attr_accessor :postinstall_actions
|
@@ -106,6 +115,12 @@ class Vanagon
|
|
106
115
|
# usually a String, but not required to be.
|
107
116
|
attr_accessor :cleanup_source
|
108
117
|
|
118
|
+
# When dealing with compiled artifacts generated by setting
|
119
|
+
# `project.generate_archives true`, you only need to install the component.
|
120
|
+
# By setting install_only to true the component 'build' will exclude the
|
121
|
+
# unpack, patch, configure, build, and check steps.
|
122
|
+
attr_accessor :install_only
|
123
|
+
|
109
124
|
# Loads a given component from the configdir
|
110
125
|
#
|
111
126
|
# @param name [String] the name of the component
|
@@ -152,9 +167,13 @@ class Vanagon
|
|
152
167
|
@environment = Vanagon::Environment.new
|
153
168
|
@sources = []
|
154
169
|
@preinstall_actions = []
|
170
|
+
@install_triggers = []
|
171
|
+
@interest_triggers = []
|
172
|
+
@activate_triggers = []
|
155
173
|
@postinstall_actions = []
|
156
174
|
@preremove_actions = []
|
157
175
|
@postremove_actions = []
|
176
|
+
@install_only = false
|
158
177
|
end
|
159
178
|
|
160
179
|
# Adds the given file to the list of files and returns @files.
|
@@ -193,7 +212,9 @@ class Vanagon
|
|
193
212
|
|
194
213
|
# @return [Set] a list of unique mirror URIs that should be used to
|
195
214
|
# retrieve the upstream source before attempting to retrieve from
|
196
|
-
# whatever URI was defined for #uri.
|
215
|
+
# whatever URI was defined for #uri. If no mirrors are set and the
|
216
|
+
# deprecated rewrite system has been configured, this will return
|
217
|
+
# rewritten URIs
|
197
218
|
def mirrors
|
198
219
|
@mirrors ||= Set.new [deprecated_rewrite_url].compact
|
199
220
|
end
|
@@ -243,10 +264,12 @@ class Vanagon
|
|
243
264
|
end
|
244
265
|
|
245
266
|
# This method is deprecated and private. It will return
|
246
|
-
# a rewritten URL if there's any value for #url
|
267
|
+
# a rewritten URL if there's any value for #url and a
|
268
|
+
# rewrite rule for that URL has been set
|
247
269
|
def deprecated_rewrite_url
|
248
270
|
return nil unless url
|
249
|
-
Vanagon::Component::Source::Rewrite.parse_and_rewrite(url)
|
271
|
+
rewritten_url = Vanagon::Component::Source::Rewrite.parse_and_rewrite(url)
|
272
|
+
url == rewritten_url ? nil : rewritten_url
|
250
273
|
end
|
251
274
|
private :deprecated_rewrite_url
|
252
275
|
|
@@ -416,21 +416,61 @@ class Vanagon
|
|
416
416
|
eos
|
417
417
|
end
|
418
418
|
|
419
|
+
# Checks that the array of pkg_state is valid (install AND/OR upgrade).
|
420
|
+
# Returns vanagon error if invalid
|
421
|
+
#
|
422
|
+
# @param pkg_state [Array] array of pkg_state input to test
|
423
|
+
def check_pkg_state_array(pkg_state)
|
424
|
+
if pkg_state.empty? || (pkg_state - ["install", "upgrade"]).any?
|
425
|
+
raise Vanagon::Error, "#{pkg_state} should be an array containing one or more of ['install', 'upgrade']"
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
419
429
|
# Adds action to run during the preinstall phase of packaging
|
420
430
|
#
|
421
|
-
# @param pkg_state [Array] the state
|
422
|
-
#
|
431
|
+
# @param pkg_state [String, Array] the package state during which the scripts should execute.
|
432
|
+
# Accepts either a single string ("install" or "upgrade"), or an Array of Strings (["install", "upgrade"]).
|
423
433
|
# @param scripts [Array] the Bourne shell compatible scriptlet(s) to execute
|
424
434
|
def add_preinstall_action(pkg_state, scripts)
|
425
435
|
pkg_state = Array(pkg_state)
|
426
436
|
scripts = Array(scripts)
|
427
|
-
|
428
|
-
if pkg_state.empty? || !(pkg_state - ["install", "upgrade"]).empty?
|
429
|
-
raise Vanagon::Error, "#{pkg_state} should be an array containing one or more of ['install', 'upgrade']"
|
430
|
-
end
|
437
|
+
check_pkg_state_array(pkg_state)
|
431
438
|
@component.preinstall_actions << OpenStruct.new(:pkg_state => pkg_state, :scripts => scripts)
|
432
439
|
end
|
433
440
|
|
441
|
+
# Adds trigger for scripts to be run on specified pkg_state.
|
442
|
+
#
|
443
|
+
# @param pkg_state [String, Array] the package state during which the scripts should execute.
|
444
|
+
# Accepts either a single string ("install" or "upgrade"), or an Array of Strings (["install", "upgrade"]).
|
445
|
+
# @param scripts [Array] the rpm pkg scriptlet(s) to execute
|
446
|
+
# @param pkg [String] the package the trigger will be set in
|
447
|
+
def add_rpm_install_triggers(pkg_state, scripts, pkg)
|
448
|
+
pkg_state = Array(pkg_state)
|
449
|
+
scripts = Array(scripts)
|
450
|
+
check_pkg_state_array(pkg_state)
|
451
|
+
@component.install_triggers << OpenStruct.new(:pkg_state => pkg_state, :scripts => scripts, :pkg => pkg)
|
452
|
+
end
|
453
|
+
|
454
|
+
# Adds interest trigger based on the specified packaging state and interest name.
|
455
|
+
#
|
456
|
+
# @param pkg_state [String, Array] the package state during which the scripts should execute.
|
457
|
+
# Accepts either a single string ("install" or "upgrade"), or an Array of Strings (["install", "upgrade"]).
|
458
|
+
# @param scripts [Array] the scripts to run for the interest trigger
|
459
|
+
# @param interest_name [String] the name of the interest trigger
|
460
|
+
def add_debian_interest_triggers(pkg_state, scripts, interest_name)
|
461
|
+
pkg_state = Array(pkg_state)
|
462
|
+
scripts = Array(scripts)
|
463
|
+
check_pkg_state_array(pkg_state)
|
464
|
+
@component.interest_triggers << OpenStruct.new(:pkg_state => pkg_state, :scripts => scripts, :interest_name => interest_name)
|
465
|
+
end
|
466
|
+
|
467
|
+
# Adds activate trigger name to be watched
|
468
|
+
#
|
469
|
+
# @param activate_name [String] the activate trigger name
|
470
|
+
def add_debian_activate_triggers(activate_name)
|
471
|
+
@component.activate_triggers << OpenStruct.new(:activate_name => activate_name)
|
472
|
+
end
|
473
|
+
|
434
474
|
# Adds action to run during the postinstall phase of packaging
|
435
475
|
#
|
436
476
|
# @param pkg_state [Array] the state in which the scripts should execute. Can be
|
@@ -439,10 +479,7 @@ class Vanagon
|
|
439
479
|
def add_postinstall_action(pkg_state, scripts)
|
440
480
|
pkg_state = Array(pkg_state)
|
441
481
|
scripts = Array(scripts)
|
442
|
-
|
443
|
-
if pkg_state.empty? || !(pkg_state - ["install", "upgrade"]).empty?
|
444
|
-
raise Vanagon::Error, "#{pkg_state} should be an array containing one or more of ['install', 'upgrade']"
|
445
|
-
end
|
482
|
+
check_pkg_state_array(pkg_state)
|
446
483
|
@component.postinstall_actions << OpenStruct.new(:pkg_state => pkg_state, :scripts => scripts)
|
447
484
|
end
|
448
485
|
|
@@ -479,6 +516,10 @@ class Vanagon
|
|
479
516
|
def license(license)
|
480
517
|
@component.license = license
|
481
518
|
end
|
519
|
+
|
520
|
+
def install_only(install_only)
|
521
|
+
@component.install_only = install_only
|
522
|
+
end
|
482
523
|
end
|
483
524
|
end
|
484
525
|
end
|
@@ -47,8 +47,8 @@ class Vanagon
|
|
47
47
|
# in the returned rules.
|
48
48
|
#
|
49
49
|
# @return [Array<Makefile::Rule>]
|
50
|
-
def rules
|
51
|
-
|
50
|
+
def rules # rubocop:disable Metrics/AbcSize
|
51
|
+
list_of_rules = [
|
52
52
|
component_rule,
|
53
53
|
unpack_rule,
|
54
54
|
patch_rule,
|
@@ -59,11 +59,20 @@ class Vanagon
|
|
59
59
|
clean_rule,
|
60
60
|
clobber_rule,
|
61
61
|
]
|
62
|
+
|
63
|
+
if component.install_only
|
64
|
+
list_of_rules = [
|
65
|
+
component_rule,
|
66
|
+
install_rule,
|
67
|
+
clean_rule,
|
68
|
+
clobber_rule,
|
69
|
+
]
|
70
|
+
end
|
62
71
|
if project.cleanup
|
63
|
-
|
72
|
+
list_of_rules << cleanup_rule
|
64
73
|
end
|
65
74
|
|
66
|
-
|
75
|
+
list_of_rules
|
67
76
|
end
|
68
77
|
|
69
78
|
# Generate a top level rule to build this component.
|
@@ -148,13 +157,20 @@ class Vanagon
|
|
148
157
|
|
149
158
|
# Install this component.
|
150
159
|
rule("install") do |r|
|
151
|
-
r.dependencies = ["#{component.name}-check"]
|
160
|
+
r.dependencies = ["#{component.name}-check"] unless component.install_only
|
152
161
|
unless component.install.empty?
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
162
|
+
if component.install_only
|
163
|
+
r.recipe << andand_multiline(
|
164
|
+
component.environment_variables,
|
165
|
+
component.install
|
166
|
+
)
|
167
|
+
else
|
168
|
+
r.recipe << andand_multiline(
|
169
|
+
component.environment_variables,
|
170
|
+
"cd #{component.get_build_dir}",
|
171
|
+
component.install
|
172
|
+
)
|
173
|
+
end
|
158
174
|
end
|
159
175
|
|
160
176
|
after_install_patches = component.patches.select { |patch| patch.after == "install" }
|
@@ -43,11 +43,12 @@ class Vanagon
|
|
43
43
|
# Constructor for the Http source type
|
44
44
|
#
|
45
45
|
# @param url [String] url of the http source to fetch
|
46
|
-
# @param sum [String] sum to verify the download against
|
46
|
+
# @param sum [String] sum to verify the download against or URL to fetch
|
47
|
+
# sum from
|
47
48
|
# @param workdir [String] working directory to download into
|
48
49
|
# @param sum_type [String] type of sum we are verifying
|
49
50
|
# @raise [RuntimeError] an exception is raised is sum is nil
|
50
|
-
def initialize(url, sum:, workdir:, sum_type:, **options)
|
51
|
+
def initialize(url, sum:, workdir:, sum_type:, **options) # rubocop:disable Metrics/AbcSize
|
51
52
|
unless sum
|
52
53
|
fail "sum is required to validate the http source"
|
53
54
|
end
|
@@ -62,6 +63,20 @@ class Vanagon
|
|
62
63
|
@sum = sum
|
63
64
|
@workdir = workdir
|
64
65
|
@sum_type = sum_type
|
66
|
+
|
67
|
+
if Vanagon::Component::Source::Http.valid_url?(@sum)
|
68
|
+
sum_file = download(@sum)
|
69
|
+
File.open(File.join(@workdir, sum_file)) do |file|
|
70
|
+
# the sha1 files generated during archive creation are formatted
|
71
|
+
# "<sha1sum> <filename>". This will also work for sources that
|
72
|
+
# only contain the checksum.
|
73
|
+
remote_sum = file.read.split.first
|
74
|
+
unless remote_sum
|
75
|
+
fail "Downloaded checksum file seems to be empty, make sure you have the correct URL"
|
76
|
+
end
|
77
|
+
@sum = remote_sum
|
78
|
+
end
|
79
|
+
end
|
65
80
|
end
|
66
81
|
|
67
82
|
# Download the source from the url specified. Sets the full path to the
|
data/lib/vanagon/driver.rb
CHANGED
@@ -77,7 +77,7 @@ class Vanagon
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def cleanup_workdir
|
80
|
-
FileUtils.rm_rf(
|
80
|
+
FileUtils.rm_rf(workdir)
|
81
81
|
end
|
82
82
|
|
83
83
|
def self.configdir
|
@@ -115,25 +115,29 @@ class Vanagon
|
|
115
115
|
raise Vanagon::Error, "Project requires a version set, all is lost."
|
116
116
|
end
|
117
117
|
|
118
|
-
@engine.startup(
|
118
|
+
@engine.startup(workdir)
|
119
119
|
|
120
120
|
$stderr.puts "Target is #{@engine.target}"
|
121
121
|
retry_task { install_build_dependencies }
|
122
|
-
retry_task { @project.fetch_sources(
|
122
|
+
retry_task { @project.fetch_sources(workdir) }
|
123
123
|
|
124
|
-
@project.make_makefile(
|
125
|
-
@project.make_bill_of_materials(
|
126
|
-
@project.generate_packaging_artifacts(
|
124
|
+
@project.make_makefile(workdir)
|
125
|
+
@project.make_bill_of_materials(workdir)
|
126
|
+
@project.generate_packaging_artifacts(workdir)
|
127
127
|
@project.save_manifest_json
|
128
|
-
@engine.ship_workdir(
|
128
|
+
@engine.ship_workdir(workdir)
|
129
129
|
@engine.dispatch("(cd #{@engine.remote_workdir}; #{@platform.make})")
|
130
130
|
@engine.retrieve_built_artifact
|
131
131
|
|
132
|
-
|
132
|
+
if %i[never on-failure].include? @preserve
|
133
133
|
@engine.teardown
|
134
134
|
cleanup_workdir
|
135
135
|
end
|
136
136
|
rescue => e
|
137
|
+
if [:never].include? @preserve
|
138
|
+
@engine.teardown
|
139
|
+
cleanup_workdir
|
140
|
+
end
|
137
141
|
$stderr.puts e
|
138
142
|
$stderr.puts e.backtrace.join("\n")
|
139
143
|
raise e
|
@@ -143,36 +147,17 @@ class Vanagon
|
|
143
147
|
end
|
144
148
|
end
|
145
149
|
|
146
|
-
def render
|
150
|
+
def render # rubocop:disable Metrics/AbcSize
|
147
151
|
# Simple sanity check for the project
|
148
152
|
if @project.version.nil? or @project.version.empty?
|
149
153
|
raise Vanagon::Error, "Project requires a version set, all is lost."
|
150
154
|
end
|
151
155
|
|
152
156
|
$stderr.puts "rendering Makefile"
|
153
|
-
retry_task { @project.fetch_sources(
|
154
|
-
@project.make_bill_of_materials(
|
155
|
-
@project.generate_packaging_artifacts(
|
156
|
-
@project.make_makefile(
|
157
|
-
end
|
158
|
-
|
159
|
-
def prepare(workdir = nil) # rubocop:disable Metrics/AbcSize
|
160
|
-
@workdir = workdir ? FileUtils.mkdir_p(workdir).first : Dir.mktmpdir
|
161
|
-
@engine.startup(@workdir)
|
162
|
-
|
163
|
-
$stderr.puts "Devkit on #{@engine.target}"
|
164
|
-
|
165
|
-
install_build_dependencies
|
166
|
-
@project.fetch_sources(@workdir)
|
167
|
-
@project.make_makefile(@workdir)
|
168
|
-
@project.make_bill_of_materials(@workdir)
|
169
|
-
# Builds only the project, skipping packaging into an artifact.
|
170
|
-
@engine.ship_workdir(@workdir)
|
171
|
-
@engine.dispatch("(cd #{@engine.remote_workdir}; #{@platform.make} #{@project.name}-project)")
|
172
|
-
rescue => e
|
173
|
-
$stderr.puts e
|
174
|
-
$stderr.puts e.backtrace.join("\n")
|
175
|
-
raise e
|
157
|
+
retry_task { @project.fetch_sources(workdir) }
|
158
|
+
@project.make_bill_of_materials(workdir)
|
159
|
+
@project.generate_packaging_artifacts(workdir)
|
160
|
+
@project.make_makefile(workdir)
|
176
161
|
end
|
177
162
|
|
178
163
|
# Retry the provided block, use the retry count and timeout
|
@@ -10,7 +10,7 @@ class Vanagon
|
|
10
10
|
def initialize(platform, target = nil, **opts)
|
11
11
|
super
|
12
12
|
|
13
|
-
@
|
13
|
+
@available_poolers = ["http://vmpooler.delivery.puppetlabs.net", "https://nspooler-service-prod-1.delivery.puppetlabs.net"]
|
14
14
|
@token = load_token
|
15
15
|
@required_attributes << "vmpooler_template"
|
16
16
|
end
|
@@ -76,36 +76,58 @@ class Vanagon
|
|
76
76
|
private :read_vmfloaty_token
|
77
77
|
|
78
78
|
# This method is used to obtain a vm to build upon using the Puppet Labs'
|
79
|
-
# vmpooler (https://github.com/puppetlabs/vmpooler)
|
79
|
+
# vmpooler (https://github.com/puppetlabs/vmpooler) or other pooler technologies
|
80
|
+
# leveraging the same API
|
80
81
|
# @raise [Vanagon::Error] if a target cannot be obtained
|
81
|
-
def select_target
|
82
|
+
def select_target
|
83
|
+
@available_poolers.each do |current_pooler|
|
84
|
+
@pooler = select_target_from(current_pooler)
|
85
|
+
break unless @pooler.empty?
|
86
|
+
end
|
87
|
+
raise Vanagon::Error, "Something went wrong getting a target vm to build on, maybe the pool for #{build_host_name} is empty?" if @pooler.empty?
|
88
|
+
end
|
89
|
+
|
90
|
+
# Attempt to provision a host from a specific pooler.
|
91
|
+
#
|
92
|
+
def select_target_from(pooler) # rubocop:disable Metrics/AbcSize
|
82
93
|
response = Vanagon::Utilities.http_request(
|
83
|
-
"#{
|
94
|
+
"#{pooler}/vm",
|
84
95
|
'POST',
|
85
96
|
'{"' + build_host_name + '":"1"}',
|
86
97
|
{ 'X-AUTH-TOKEN' => @token }
|
87
98
|
)
|
88
99
|
if response["ok"]
|
89
|
-
@target = response[build_host_name]['hostname']
|
100
|
+
@target = response[build_host_name]['hostname']
|
101
|
+
# The nspooler does not use 'domain' in the response: 'hostname' just returns the fqdn.
|
102
|
+
# in the future we should make the two APIs the same in this sense, but for now, just check
|
103
|
+
# if 'domain' is a thing and use it if so.
|
104
|
+
if response['domain']
|
105
|
+
@target += '.' + response['domain']
|
106
|
+
end
|
90
107
|
Vanagon::Driver.logger.info "Reserving #{@target} (#{build_host_name}) [#{@token ? 'token used' : 'no token used'}]"
|
91
|
-
|
92
|
-
tags = {
|
93
|
-
'tags' => {
|
94
|
-
'jenkins_build_url' => ENV['BUILD_URL'],
|
95
|
-
'project' => ENV['JOB_NAME'] || 'vanagon',
|
96
|
-
'created_by' => ENV['USER'] || ENV['USERNAME'] || 'unknown'
|
97
|
-
}
|
98
|
-
}
|
99
|
-
|
100
|
-
Vanagon::Utilities.http_request(
|
101
|
-
"#{@pooler}/vm/#{response[build_host_name]['hostname']}",
|
102
|
-
'PUT',
|
103
|
-
tags.to_json,
|
104
|
-
{ 'X-AUTH-TOKEN' => @token }
|
105
|
-
)
|
108
|
+
add_tags_to_target(pooler, response[build_host_name]['hostname'])
|
106
109
|
else
|
107
|
-
|
110
|
+
pooler = ''
|
108
111
|
end
|
112
|
+
pooler
|
113
|
+
end
|
114
|
+
|
115
|
+
# Add tags to a provisioned target using the pooler API
|
116
|
+
#
|
117
|
+
def add_tags_to_target(pooler, hostname)
|
118
|
+
tags = {
|
119
|
+
'tags' => {
|
120
|
+
'jenkins_build_url' => ENV['BUILD_URL'],
|
121
|
+
'project' => ENV['JOB_NAME'] || 'vanagon',
|
122
|
+
'created_by' => ENV['USER'] || ENV['USERNAME'] || 'unknown'
|
123
|
+
}
|
124
|
+
}
|
125
|
+
Vanagon::Utilities.http_request(
|
126
|
+
"#{pooler}/vm/#{hostname}",
|
127
|
+
'PUT',
|
128
|
+
tags.to_json,
|
129
|
+
{ 'X-AUTH-TOKEN' => @token }
|
130
|
+
)
|
109
131
|
end
|
110
132
|
|
111
133
|
# This method is used to tell the vmpooler to delete the instance of the
|