vanagon 0.17.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/extras/completions/vanagon.bash +38 -0
- data/extras/completions/vanagon.zsh +41 -0
- data/lib/vanagon/cli.rb +8 -0
- data/lib/vanagon/cli/build.rb +10 -2
- data/lib/vanagon/cli/build_host_info.rb +9 -1
- data/lib/vanagon/cli/build_requirements.rb +9 -1
- data/lib/vanagon/cli/completion.rb +43 -0
- data/lib/vanagon/cli/inspect.rb +9 -1
- data/lib/vanagon/cli/list.rb +75 -0
- data/lib/vanagon/cli/render.rb +9 -1
- data/lib/vanagon/driver.rb +31 -29
- data/lib/vanagon/platform/deb.rb +2 -0
- data/resources/osx/postinstall.erb +1 -1
- data/resources/solaris/10/postinstall.erb +1 -1
- data/spec/lib/vanagon/cli_spec.rb +146 -0
- data/spec/lib/vanagon/driver_spec.rb +1 -1
- metadata +33 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1c7459e4b7180a6b25de532c8ec598e9c3ea22449ad66c0c5a8c6088689bec6
|
4
|
+
data.tar.gz: 78c659f4a4b085aa4c6dd48a19f453ca12a32b6125c7f0b3967a0d94b0dece2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bea66bbff87c1f57578705241d52cad28a577a5a5cc7746b5d1d2c783deff7a746b57bd63844ae09e337b2f835b65fc7db98d74dde82d13aac6592c17aa53d3d
|
7
|
+
data.tar.gz: de64bd63b30d501ebc3f7d411a9e6c2da3736abb0b0d1242bd080ee7b43b4381a21a004b8205aae32675aa2e6c0f1bb3b88fc2ba3dd2f0f7d2ba5889b6e052bb
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
_vanagon()
|
4
|
+
{
|
5
|
+
local cur prev projects commands template_arg_commands
|
6
|
+
|
7
|
+
# COMREPLY is an array variable used to store completions
|
8
|
+
# the completion mechanism uses COMPRELY to display its contents as completions
|
9
|
+
# COMP_WORDS is an array of all the words typed after the name of the program
|
10
|
+
# COMP_CWORD is an index of the COMP_WORDS array pointing to the current word
|
11
|
+
COMPREPLY=()
|
12
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
13
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
14
|
+
projects=($({ vanagon list -r | sed 1d; } 2>/dev/null))
|
15
|
+
commands="build build_host_info build_requirements completion inspect list render sign ship help"
|
16
|
+
template_arg_commands="build build_host_info build_requirements inspect render "
|
17
|
+
|
18
|
+
# completes with a project if the previous word was a command in template_arg_commands
|
19
|
+
if [[ $template_arg_commands =~ (^| )$prev($| ) ]] ; then
|
20
|
+
_vanagon_avail_templates_projects=$({ vanagon list -r | sed 1d; } 2>/dev/null)
|
21
|
+
# compgen generates completions filtered based on what has been typed by the user
|
22
|
+
COMPREPLY=( $(compgen -W "${_vanagon_avail_templates_projects}" -- "${cur}") )
|
23
|
+
fi
|
24
|
+
|
25
|
+
# allows multiple platforms to be tab completed
|
26
|
+
if [[ ${#COMP_WORDS[@]} -gt 3 ]] ; then
|
27
|
+
_vanagon_avail_templates_platforms=$({ vanagon list -l | sed 1d; } 2>/dev/null)
|
28
|
+
COMPREPLY=( $(compgen -W "${_vanagon_avail_templates_platforms}" -- "${cur}") )
|
29
|
+
fi
|
30
|
+
|
31
|
+
if [[ $1 == $prev ]] ; then
|
32
|
+
# only show top level commands we are at root
|
33
|
+
COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
|
34
|
+
fi
|
35
|
+
}
|
36
|
+
|
37
|
+
# assign tab complete function `_vanagon ` to `vanagon` command
|
38
|
+
complete -F _vanagon vanagon
|
@@ -0,0 +1,41 @@
|
|
1
|
+
_vanagon()
|
2
|
+
{
|
3
|
+
local line commands template_arg_commands projects
|
4
|
+
|
5
|
+
commands="build build_host_info build_requirements completion inspect list render sign ship help"
|
6
|
+
template_arg_commands=("build" "build_host_info" "build_requirements" "inspect" "render")
|
7
|
+
projects=($({ vanagon list -r | sed 1d; } 2>/dev/null))
|
8
|
+
|
9
|
+
# '%p:globbed-files:' sets completion to only offer files matching a
|
10
|
+
# described pattern.
|
11
|
+
zstyle ':completion:*' file-patterns '%p:globbed-files:'
|
12
|
+
|
13
|
+
# arguments function provides potential completions to zsh
|
14
|
+
# specs are of the form n:message:action
|
15
|
+
_arguments -C \
|
16
|
+
": :(${commands})" \
|
17
|
+
"*::arg:->args"
|
18
|
+
|
19
|
+
# (Ie)prevents "invalid subscript"
|
20
|
+
if ((template_arg_commands[(Ie)$line[1]])); then
|
21
|
+
_vanagon_template_sub_projects
|
22
|
+
fi
|
23
|
+
if [[ $projects =~ (^| )$line[2]($| ) ]]; then
|
24
|
+
_vanagon_template_sub_platforms
|
25
|
+
fi
|
26
|
+
}
|
27
|
+
|
28
|
+
_vanagon_template_sub_projects()
|
29
|
+
{
|
30
|
+
# -W look in certain path but don't append path to tab compelte
|
31
|
+
# -g enables file matching pattern
|
32
|
+
# (:r) removes the file extension `.rb` from the completion
|
33
|
+
_arguments "1: :_files -W $(PWD)/configs/projects/ -g '*.rb(:r)'"
|
34
|
+
}
|
35
|
+
|
36
|
+
_vanagon_template_sub_platforms()
|
37
|
+
{
|
38
|
+
_arguments "*: :_files -W $(PWD)/configs/platforms/ -g '*.rb(:r)'"
|
39
|
+
}
|
40
|
+
# compdef registeres the completion function: compdef <function-name> <program>
|
41
|
+
compdef _vanagon vanagon
|
data/lib/vanagon/cli.rb
CHANGED
@@ -8,7 +8,9 @@ require 'vanagon/extensions/hashable'
|
|
8
8
|
require 'vanagon/cli/build'
|
9
9
|
require 'vanagon/cli/build_host_info'
|
10
10
|
require 'vanagon/cli/build_requirements'
|
11
|
+
require 'vanagon/cli/completion'
|
11
12
|
require 'vanagon/cli/inspect'
|
13
|
+
require 'vanagon/cli/list'
|
12
14
|
require 'vanagon/cli/render'
|
13
15
|
require 'vanagon/cli/ship'
|
14
16
|
require 'vanagon/cli/sign'
|
@@ -27,7 +29,9 @@ class Vanagon
|
|
27
29
|
build build a package given a project and platform
|
28
30
|
build_host_info print information about build hosts
|
29
31
|
build_requirements print external packages required to build project
|
32
|
+
completion outputs path to tab completion script
|
30
33
|
inspect a build dry-run, printing lots of information about the build
|
34
|
+
list shows a list of available projects and platforms
|
31
35
|
render create local versions of packaging artifacts for project
|
32
36
|
sign sign a package
|
33
37
|
ship upload a package to a distribution server
|
@@ -46,10 +50,14 @@ class Vanagon
|
|
46
50
|
@sub_parser = Vanagon::CLI::BuildHostInfo.new
|
47
51
|
when 'build_requirements'
|
48
52
|
@sub_parser = Vanagon::CLI::BuildRequirements.new
|
53
|
+
when 'completion'
|
54
|
+
@sub_parser = Vanagon::CLI::Completion.new
|
49
55
|
when 'inspect'
|
50
56
|
@sub_parser = Vanagon::CLI::Inspect.new
|
51
57
|
when 'render'
|
52
58
|
@sub_parser = Vanagon::CLI::Render.new
|
59
|
+
when 'list'
|
60
|
+
@sub_parser = Vanagon::CLI::List.new
|
53
61
|
when 'sign'
|
54
62
|
@sub_parser = Vanagon::CLI::Sign.new
|
55
63
|
when 'ship'
|
data/lib/vanagon/cli/build.rb
CHANGED
@@ -10,7 +10,7 @@ class Vanagon
|
|
10
10
|
Options:
|
11
11
|
-h, --help Display help
|
12
12
|
-c, --configdir DIRECTORY Configuration directory [default: #{Dir.pwd}/configs]
|
13
|
-
-e, --engine ENGINE Custom engine to use [
|
13
|
+
-e, --engine ENGINE Custom engine to use [default: always_be_scheduling]
|
14
14
|
-o, --only-build COMPONENT,COMPONENT,...
|
15
15
|
Only build listed COMPONENTs
|
16
16
|
-p, --preserve [RULE] Rule for VM preservation: never, on-failure, always
|
@@ -19,6 +19,14 @@ class Vanagon
|
|
19
19
|
-s, --skipcheck Skip the "check" stage when building components
|
20
20
|
-w, --workdir DIRECTORY Working directory on the local host
|
21
21
|
-v, --verbose Only here for backwards compatibility. Does nothing.
|
22
|
+
|
23
|
+
Engines:
|
24
|
+
always_be_scheduling: default engine using Puppet's ABS infrastructure
|
25
|
+
docker: a docker container on the local host
|
26
|
+
ec2: an Amazon EC2 instance
|
27
|
+
hardware: a dedicated hardware device
|
28
|
+
local: the local machine, cannot be used with a target
|
29
|
+
pooler: [deprecated] Puppet's vmpooler
|
22
30
|
DOCOPT
|
23
31
|
|
24
32
|
def parse(argv)
|
@@ -38,7 +46,7 @@ class Vanagon
|
|
38
46
|
|
39
47
|
platform_list.zip(target_list).each do |pair|
|
40
48
|
platform, target = pair
|
41
|
-
artifact = Vanagon::Driver.new(platform, project, options.merge({
|
49
|
+
artifact = Vanagon::Driver.new(platform, project, options.merge({ :target => target }))
|
42
50
|
artifact.run
|
43
51
|
end
|
44
52
|
end
|
@@ -10,9 +10,17 @@ class Vanagon
|
|
10
10
|
Options:
|
11
11
|
-h, --help Display help
|
12
12
|
-c, --configdir DIRECTORY Configuration directory [default: #{Dir.pwd}/configs]
|
13
|
-
-e, --engine ENGINE Custom engine to use [
|
13
|
+
-e, --engine ENGINE Custom engine to use [default: always_be_scheduling]
|
14
14
|
-w, --workdir DIRECTORY Working directory on the local host
|
15
15
|
-v, --verbose Only here for backwards compatibility. Does nothing.
|
16
|
+
|
17
|
+
Engines:
|
18
|
+
always_be_scheduling: default engine using Puppet's ABS infrastructure
|
19
|
+
docker: a docker container on the local host
|
20
|
+
ec2: an Amazon EC2 instance
|
21
|
+
hardware: a dedicated hardware device
|
22
|
+
local: the local machine, cannot be used with a target
|
23
|
+
pooler: [deprecated] Puppet's vmpooler
|
16
24
|
DOCOPT
|
17
25
|
|
18
26
|
def parse(argv)
|
@@ -11,9 +11,17 @@ class Vanagon
|
|
11
11
|
Options:
|
12
12
|
-h, --help Display help
|
13
13
|
-c, --configdir DIRECTORY Configuration directory [default: #{Dir.pwd}/configs]
|
14
|
-
-e, --engine ENGINE Custom engine to use [
|
14
|
+
-e, --engine ENGINE Custom engine to use [default: always_be_scheduling]
|
15
15
|
-w, --workdir DIRECTORY Working directory on the local host
|
16
16
|
-v, --verbose Only here for backwards compatibility. Does nothing.
|
17
|
+
|
18
|
+
Engines:
|
19
|
+
always_be_scheduling: default engine using Puppet's ABS infrastructure
|
20
|
+
docker: a docker container on the local host
|
21
|
+
ec2: an Amazon EC2 instance
|
22
|
+
hardware: a dedicated hardware device
|
23
|
+
local: the local machine, cannot be used with a target
|
24
|
+
pooler: [deprecated] Puppet's vmpooler
|
17
25
|
DOCOPT
|
18
26
|
|
19
27
|
def parse(argv)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'docopt'
|
2
|
+
|
3
|
+
class Vanagon
|
4
|
+
class CLI
|
5
|
+
class Completion < Vanagon::CLI
|
6
|
+
DOCUMENTATION = <<~DOCOPT.freeze
|
7
|
+
Usage:
|
8
|
+
completion [options]
|
9
|
+
|
10
|
+
Options:
|
11
|
+
-h, --help Display help
|
12
|
+
-s, --shell SHELL Specify shell for completion script [default: bash]
|
13
|
+
DOCOPT
|
14
|
+
|
15
|
+
def parse(argv)
|
16
|
+
Docopt.docopt(DOCUMENTATION, { argv: argv })
|
17
|
+
rescue Docopt::Exit => e
|
18
|
+
puts e.message
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
|
22
|
+
def run(options)
|
23
|
+
shell = options[:shell].downcase.strip
|
24
|
+
completion_file = File.expand_path(File.join('..', '..', '..', '..', 'extras', 'completions', "vanagon.#{shell}"), __FILE__)
|
25
|
+
|
26
|
+
if File.exist?(completion_file)
|
27
|
+
puts completion_file
|
28
|
+
exit 0
|
29
|
+
else
|
30
|
+
puts "Could not find completion file for '#{shell}': No such file #{completion_file}"
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def options_translate(docopt_options)
|
36
|
+
translations = {
|
37
|
+
'--shell' => :shell,
|
38
|
+
}
|
39
|
+
return docopt_options.map { |k, v| [translations[k], v] }.to_h
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/vanagon/cli/inspect.rb
CHANGED
@@ -11,12 +11,20 @@ class Vanagon
|
|
11
11
|
Options:
|
12
12
|
-h, --help Display help
|
13
13
|
-c, --configdir DIRECTORY Configuration directory [default: #{Dir.pwd}/configs]
|
14
|
-
-e, --engine ENGINE Custom engine to use [
|
14
|
+
-e, --engine ENGINE Custom engine to use [default: always_be_scheduling]
|
15
15
|
|
16
16
|
-p, --preserve [RULE] Rule for VM preservation: never, on-failure, always
|
17
17
|
[Default: on-failure]
|
18
18
|
-w, --workdir DIRECTORY Working directory on the local host
|
19
19
|
-v, --verbose Only here for backwards compatibility. Does nothing.
|
20
|
+
|
21
|
+
Engines:
|
22
|
+
always_be_scheduling: default engine using Puppet's ABS infrastructure
|
23
|
+
docker: a docker container on the local host
|
24
|
+
ec2: an Amazon EC2 instance
|
25
|
+
hardware: a dedicated hardware device
|
26
|
+
local: the local machine, cannot be used with a target
|
27
|
+
pooler: [deprecated] Puppet's vmpooler
|
20
28
|
DOCOPT
|
21
29
|
|
22
30
|
def parse(argv)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'docopt'
|
2
|
+
|
3
|
+
class Vanagon
|
4
|
+
class CLI
|
5
|
+
class List < Vanagon::CLI
|
6
|
+
DOCUMENTATION = <<~DOCOPT.freeze
|
7
|
+
Usage:
|
8
|
+
list [options]
|
9
|
+
|
10
|
+
Options:
|
11
|
+
-h, --help Display help
|
12
|
+
-c, --configdir DIRECTORY Configuration directory [default: #{Dir.pwd}/configs]
|
13
|
+
-l, --platforms Display a list of platforms
|
14
|
+
-r, --projects Display a list of projects
|
15
|
+
-s, --use-spaces Displays the list as space separated
|
16
|
+
DOCOPT
|
17
|
+
|
18
|
+
def parse(argv)
|
19
|
+
Docopt.docopt(DOCUMENTATION, { argv: argv })
|
20
|
+
rescue Docopt::Exit => e
|
21
|
+
puts e.message
|
22
|
+
exit 1
|
23
|
+
end
|
24
|
+
|
25
|
+
def output(list, use_spaces)
|
26
|
+
return list.join(' ') if use_spaces
|
27
|
+
return list
|
28
|
+
end
|
29
|
+
|
30
|
+
def run(options) # rubocop:disable Metrics/AbcSize
|
31
|
+
if Dir.exist?(File.join(options[:configdir], 'platforms')) == false ||
|
32
|
+
Dir.exist?(File.join(options[:configdir], 'projects')) == false
|
33
|
+
|
34
|
+
warn "Path to #{File.join(options[:configdir], 'platforms')} or #{File.join(options[:configdir], 'projects')} not found."
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
|
38
|
+
platform_list = Dir.children(File.join(options[:configdir], 'platforms')).map do |platform|
|
39
|
+
File.basename(platform, File.extname(platform))
|
40
|
+
end
|
41
|
+
|
42
|
+
project_list = Dir.children(File.join(options[:configdir], 'projects')).map do |project|
|
43
|
+
File.basename(project, File.extname(project))
|
44
|
+
end
|
45
|
+
|
46
|
+
if options[:projects] == options[:platforms]
|
47
|
+
puts "- Projects", output(project_list, options[:use_spaces]), "\n", "- Platforms", output(platform_list, options[:use_spaces])
|
48
|
+
return
|
49
|
+
end
|
50
|
+
|
51
|
+
if options[:projects]
|
52
|
+
puts "- Projects"
|
53
|
+
puts output(project_list, options[:use_spaces])
|
54
|
+
return
|
55
|
+
end
|
56
|
+
|
57
|
+
if options[:platforms]
|
58
|
+
puts "- Platforms"
|
59
|
+
puts output(platform_list, options[:use_spaces])
|
60
|
+
return
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def options_translate(docopt_options)
|
65
|
+
translations = {
|
66
|
+
'--configdir' => :configdir,
|
67
|
+
'--platforms' => :platforms,
|
68
|
+
'--projects' => :projects,
|
69
|
+
'--use-spaces' => :use_spaces,
|
70
|
+
}
|
71
|
+
return docopt_options.map { |k, v| [translations[k], v] }.to_h
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/vanagon/cli/render.rb
CHANGED
@@ -11,9 +11,17 @@ class Vanagon
|
|
11
11
|
Options:
|
12
12
|
-h, --help Display help
|
13
13
|
-c, --configdir DIRECTORY Configuration directory [default: #{Dir.pwd}/configs]
|
14
|
-
-e, --engine ENGINE Custom engine to use [
|
14
|
+
-e, --engine ENGINE Custom engine to use [default: always_be_scheduling]
|
15
15
|
-w, --workdir DIRECTORY Working directory on the local host
|
16
16
|
-v, --verbose Only here for backwards compatibility. Does nothing.
|
17
|
+
|
18
|
+
Engines:
|
19
|
+
always_be_scheduling: default engine using Puppet's ABS infrastructure
|
20
|
+
docker: a docker container on the local host
|
21
|
+
ec2: an Amazon EC2 instance
|
22
|
+
hardware: a dedicated hardware device
|
23
|
+
local: the local machine, cannot be used with a target
|
24
|
+
pooler: [deprecated] Puppet's vmpooler
|
17
25
|
DOCOPT
|
18
26
|
|
19
27
|
def parse(argv)
|
data/lib/vanagon/driver.rb
CHANGED
@@ -20,33 +20,29 @@ class Vanagon
|
|
20
20
|
@retry_count ||= @project.retry_count || ENV["VANAGON_RETRY_COUNT"] || 1
|
21
21
|
end
|
22
22
|
|
23
|
-
def initialize(platform, project, options = {
|
24
|
-
@
|
25
|
-
@
|
23
|
+
def initialize(platform, project, options = {}) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
|
24
|
+
@options = options
|
25
|
+
@verbose = options[:verbose] || false
|
26
|
+
@preserve = options[:preserve] || false
|
26
27
|
@workdir = options[:workdir] || Dir.mktmpdir
|
27
28
|
|
28
29
|
@@configdir = options[:configdir] || File.join(Dir.pwd, "configs")
|
29
30
|
components = options[:components] || []
|
30
31
|
only_build = options[:only_build]
|
31
|
-
target = options[:target]
|
32
32
|
|
33
33
|
@platform = Vanagon::Platform.load_platform(platform, File.join(@@configdir, "platforms"))
|
34
|
-
@project = Vanagon::Project.load_project(
|
34
|
+
@project = Vanagon::Project.load_project(
|
35
|
+
project, File.join(@@configdir, "projects"), @platform, components
|
36
|
+
)
|
35
37
|
@project.settings[:verbose] = options[:verbose]
|
36
|
-
@project.settings[:skipcheck] = options[:skipcheck]
|
38
|
+
@project.settings[:skipcheck] = options[:skipcheck] || false
|
37
39
|
filter_out_components(only_build) if only_build
|
38
40
|
loginit('vanagon_hosts.log')
|
39
41
|
|
40
42
|
@remote_workdir = options[:"remote-workdir"]
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
load_engine_object(options[:engine], @platform, target)
|
45
|
-
else
|
46
|
-
# Use 'pooler' as a default, but also apply selection logic that may
|
47
|
-
# choose something different based on platform configuration.
|
48
|
-
load_engine('pooler', @platform, target)
|
49
|
-
end
|
44
|
+
engine = pick_engine(options)
|
45
|
+
load_engine_object(engine, @platform, options[:target])
|
50
46
|
end
|
51
47
|
|
52
48
|
def filter_out_components(only_build)
|
@@ -59,24 +55,28 @@ class Vanagon
|
|
59
55
|
end
|
60
56
|
end
|
61
57
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
58
|
+
def pick_engine(options) # rubocop:disable Metrics/PerceivedComplexity
|
59
|
+
default_engine = 'always_be_scheduling'
|
60
|
+
|
61
|
+
# Use the explicitly configured engine if no target was provided.
|
62
|
+
return options[:engine] if options[:engine] && !options[:target]
|
63
|
+
|
64
|
+
# If the configured engine matches the default engine, use it
|
65
|
+
return options[:engine] if options[:engine] == default_engine
|
66
|
+
|
67
|
+
# Make some guesses about which engine to use
|
68
|
+
return 'hardware' if @platform.build_hosts
|
69
|
+
return 'ec2' if @platform.aws_ami
|
70
|
+
return 'docker' if @platform.docker_image
|
71
|
+
return 'base' if @options[:target]
|
72
|
+
|
73
|
+
return default_engine
|
75
74
|
end
|
76
75
|
|
77
76
|
def load_engine_object(engine_type, platform, target)
|
78
77
|
require "vanagon/engine/#{engine_type}"
|
79
|
-
@engine = Object::const_get("Vanagon::Engine::#{camelize(engine_type)}")
|
78
|
+
@engine = Object::const_get("Vanagon::Engine::#{camelize(engine_type)}")
|
79
|
+
.new(platform, target, remote_workdir: remote_workdir)
|
80
80
|
rescue StandardError, ScriptError => e
|
81
81
|
raise Vanagon::Error.wrap(e, "Could not load the desired engine '#{engine_type}'")
|
82
82
|
end
|
@@ -103,7 +103,9 @@ class Vanagon
|
|
103
103
|
{ "name" => @engine.build_host_name, "engine" => @engine.name }
|
104
104
|
end
|
105
105
|
|
106
|
-
# Returns the set difference between the build_requires and the
|
106
|
+
# Returns the set difference between the build_requires and the
|
107
|
+
# components to get a list of external dependencies that need to
|
108
|
+
# be installed.
|
107
109
|
def list_build_dependencies
|
108
110
|
@project.components.map(&:build_requires).flatten.uniq - @project.components.map(&:name)
|
109
111
|
end
|
data/lib/vanagon/platform/deb.rb
CHANGED
@@ -13,6 +13,8 @@ class Vanagon
|
|
13
13
|
copy_extensions = '*.deb'
|
14
14
|
end
|
15
15
|
pkg_arch_opt = project.noarch ? "" : "-a#{@architecture}"
|
16
|
+
pkg_arch_opt = '-aarm64' if pkg_arch_opt == '-aaarch64'
|
17
|
+
|
16
18
|
["mkdir -p output/#{target_dir}",
|
17
19
|
"mkdir -p $(tempdir)/#{project.name}-#{project.version}",
|
18
20
|
"cp #{project.name}-#{project.version}.tar.gz $(tempdir)/#{project.name}_#{project.version}.orig.tar.gz",
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<%- get_configfiles.each do |config|
|
6
6
|
dest_file = config.path.gsub(/\.pristine$/, '') -%>
|
7
7
|
|
8
|
-
if [ -f "<%= dest_file %>" ]; then
|
8
|
+
if [ -f "<%= dest_file %>" ] && ! diff "<%= config.path %>" "<%= dest_file %>" > /dev/null; then
|
9
9
|
echo "Detected file at '<%= dest_file %>'; updated file at '<%= config.path %>'."
|
10
10
|
else
|
11
11
|
mv '<%= config.path %>' '<%= dest_file %>'
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<%- get_configfiles.each do |config|
|
10
10
|
dest_file = config.path.gsub(/\.pristine$/, '') -%>
|
11
11
|
|
12
|
-
if [ -f "<%= dest_file %>" ]; then
|
12
|
+
if [ -f "<%= dest_file %>" ] && ! diff "<%= config.path %>" "<%= dest_file %>" > /dev/null; then
|
13
13
|
echo "Detected file at '<%= dest_file %>'; updated file at '<%= config.path %>'."
|
14
14
|
else
|
15
15
|
cp -pr '<%= config.path %>' '<%= dest_file %>'
|
@@ -78,3 +78,149 @@ describe Vanagon::CLI do
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
81
|
+
|
82
|
+
describe Vanagon::CLI::List do
|
83
|
+
let(:cli) { Vanagon::CLI::List.new }
|
84
|
+
|
85
|
+
describe "#output" do
|
86
|
+
let(:list) { ['a', 'b', 'c']}
|
87
|
+
it "returns an array if space is false" do
|
88
|
+
expect(cli.output(list, false)).to eq(list)
|
89
|
+
end
|
90
|
+
it "returns space separated if space is true" do
|
91
|
+
expect(cli.output(list, true)).to eq('a b c')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#run" do
|
96
|
+
let(:projects){ ['foo', 'bar', 'baz'] }
|
97
|
+
let(:platforms){ ['1', '2', '3'] }
|
98
|
+
let(:output_both){
|
99
|
+
"- Projects
|
100
|
+
foo
|
101
|
+
bar
|
102
|
+
baz
|
103
|
+
|
104
|
+
- Platforms
|
105
|
+
1
|
106
|
+
2
|
107
|
+
3
|
108
|
+
"
|
109
|
+
}
|
110
|
+
context "specs with standard config path" do
|
111
|
+
before(:each) do
|
112
|
+
expect(Dir).to receive(:exist?)
|
113
|
+
.with("#{File.join(Dir.pwd, 'configs', 'platforms')}")
|
114
|
+
.and_return(true)
|
115
|
+
expect(Dir).to receive(:exist?)
|
116
|
+
.with("#{File.join(Dir.pwd, 'configs', 'projects')}")
|
117
|
+
.and_return(true)
|
118
|
+
expect(Dir).to receive(:children)
|
119
|
+
.with("#{File.join(Dir.pwd, 'configs', 'projects')}")
|
120
|
+
.and_return(projects)
|
121
|
+
expect(Dir).to receive(:children)
|
122
|
+
.with("#{File.join(Dir.pwd, 'configs', 'platforms')}")
|
123
|
+
.and_return(platforms)
|
124
|
+
end
|
125
|
+
let(:options_empty) { {
|
126
|
+
nil=>false,
|
127
|
+
:configdir=>"#{Dir.pwd}/configs",
|
128
|
+
:platforms=>false,
|
129
|
+
:projects=>false,
|
130
|
+
:use_spaces=>false
|
131
|
+
} }
|
132
|
+
let(:options_platforms_only) { {
|
133
|
+
nil=>false,
|
134
|
+
:configdir=>"#{Dir.pwd}/configs",
|
135
|
+
:platforms=>true,
|
136
|
+
:projects=>false,
|
137
|
+
:use_spaces=>false
|
138
|
+
} }
|
139
|
+
let(:options_projects_only) { {
|
140
|
+
nil=>false,
|
141
|
+
:configdir=>"#{Dir.pwd}/configs",
|
142
|
+
:platforms=>false,
|
143
|
+
:projects=>true,
|
144
|
+
:use_spaces=>false
|
145
|
+
} }
|
146
|
+
let(:options_space_only) { {
|
147
|
+
nil=>false,
|
148
|
+
:configdir=>"#{Dir.pwd}/configs",
|
149
|
+
:platforms=>false,
|
150
|
+
:projects=>false,
|
151
|
+
:use_spaces=>true
|
152
|
+
} }
|
153
|
+
|
154
|
+
it "outputs projects and platforms with no options passed" do
|
155
|
+
expect do
|
156
|
+
cli.run(options_empty)
|
157
|
+
end.to output(output_both).to_stdout
|
158
|
+
end
|
159
|
+
|
160
|
+
let(:output_both_space){
|
161
|
+
"- Projects
|
162
|
+
foo bar baz
|
163
|
+
|
164
|
+
- Platforms
|
165
|
+
1 2 3
|
166
|
+
"
|
167
|
+
}
|
168
|
+
it "outputs projects and platforms space separated" do
|
169
|
+
expect do
|
170
|
+
cli.run(options_space_only)
|
171
|
+
end.to output(output_both_space).to_stdout
|
172
|
+
end
|
173
|
+
|
174
|
+
let(:output_platforms){
|
175
|
+
"- Platforms
|
176
|
+
1
|
177
|
+
2
|
178
|
+
3
|
179
|
+
"
|
180
|
+
}
|
181
|
+
it "outputs only platforms when platforms is passed" do
|
182
|
+
expect do
|
183
|
+
cli.run(options_platforms_only)
|
184
|
+
end.to output(output_platforms).to_stdout
|
185
|
+
end
|
186
|
+
|
187
|
+
let(:output_projects){
|
188
|
+
"- Projects
|
189
|
+
foo
|
190
|
+
bar
|
191
|
+
baz
|
192
|
+
"
|
193
|
+
}
|
194
|
+
it "outputs only projects when projects is passed" do
|
195
|
+
expect do
|
196
|
+
cli.run(options_projects_only)
|
197
|
+
end.to output(output_projects).to_stdout
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "spec with a configdir specified" do
|
202
|
+
let(:options_configdir) { {
|
203
|
+
nil=>false,
|
204
|
+
:configdir=> '/configs',
|
205
|
+
:platforms=>false,
|
206
|
+
:projects=>false,
|
207
|
+
:use_spaces=>false} }
|
208
|
+
it "it successfully takes the configs directory" do
|
209
|
+
expect(Dir).to receive(:exist?).with('/configs' + '/platforms')
|
210
|
+
.and_return(true)
|
211
|
+
expect(Dir).to receive(:exist?).with('/configs' + '/projects')
|
212
|
+
.and_return(true)
|
213
|
+
expect(Dir).to receive(:children).with('/configs' + '/projects')
|
214
|
+
.and_return(projects)
|
215
|
+
expect(Dir).to receive(:children).with('/configs' + '/platforms')
|
216
|
+
.and_return(platforms)
|
217
|
+
expect do
|
218
|
+
cli.run(options_configdir)
|
219
|
+
end.to output(output_both).to_stdout
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
|
226
|
+
|
@@ -50,7 +50,7 @@ describe 'Vanagon::Driver' do
|
|
50
50
|
info = create_driver(redhat).build_host_info
|
51
51
|
|
52
52
|
expect(info).to match({ 'name' => 'centos-7-x86_64',
|
53
|
-
'engine' => '
|
53
|
+
'engine' => 'always_be_scheduling' })
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'returns the vmpooler template with an explicit engine' do
|
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.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -107,6 +107,8 @@ files:
|
|
107
107
|
- bin/ship
|
108
108
|
- bin/sign
|
109
109
|
- bin/vanagon
|
110
|
+
- extras/completions/vanagon.bash
|
111
|
+
- extras/completions/vanagon.zsh
|
110
112
|
- lib/git/basic_submodules.rb
|
111
113
|
- lib/git/rev_list.rb
|
112
114
|
- lib/makefile.rb
|
@@ -115,7 +117,9 @@ files:
|
|
115
117
|
- lib/vanagon/cli/build.rb
|
116
118
|
- lib/vanagon/cli/build_host_info.rb
|
117
119
|
- lib/vanagon/cli/build_requirements.rb
|
120
|
+
- lib/vanagon/cli/completion.rb
|
118
121
|
- lib/vanagon/cli/inspect.rb
|
122
|
+
- lib/vanagon/cli/list.rb
|
119
123
|
- lib/vanagon/cli/render.rb
|
120
124
|
- lib/vanagon/cli/ship.rb
|
121
125
|
- lib/vanagon/cli/sign.rb
|
@@ -288,41 +292,41 @@ signing_key:
|
|
288
292
|
specification_version: 3
|
289
293
|
summary: All of your packages will fit into this van with this one simple trick.
|
290
294
|
test_files:
|
291
|
-
- spec/lib/
|
295
|
+
- spec/lib/git/rev_list_spec.rb
|
296
|
+
- spec/lib/makefile_spec.rb
|
297
|
+
- spec/lib/vanagon/environment_spec.rb
|
298
|
+
- spec/lib/vanagon/engine/pooler_spec.rb
|
299
|
+
- spec/lib/vanagon/engine/docker_spec.rb
|
300
|
+
- spec/lib/vanagon/engine/hardware_spec.rb
|
301
|
+
- spec/lib/vanagon/engine/always_be_scheduling_spec.rb
|
302
|
+
- spec/lib/vanagon/engine/base_spec.rb
|
303
|
+
- spec/lib/vanagon/engine/local_spec.rb
|
304
|
+
- spec/lib/vanagon/engine/ec2_spec.rb
|
292
305
|
- spec/lib/vanagon/extensions/string_spec.rb
|
293
|
-
- spec/lib/vanagon/extensions/ostruct/json_spec.rb
|
294
306
|
- spec/lib/vanagon/extensions/set/json_spec.rb
|
295
|
-
- spec/lib/vanagon/
|
296
|
-
- spec/lib/vanagon/platform/dsl_spec.rb
|
297
|
-
- spec/lib/vanagon/platform/rpm/aix_spec.rb
|
298
|
-
- spec/lib/vanagon/platform/windows_spec.rb
|
299
|
-
- spec/lib/vanagon/platform/osx_spec.rb
|
300
|
-
- spec/lib/vanagon/platform/solaris_10_spec.rb
|
301
|
-
- spec/lib/vanagon/platform/rpm_spec.rb
|
302
|
-
- spec/lib/vanagon/platform/deb_spec.rb
|
307
|
+
- spec/lib/vanagon/extensions/ostruct/json_spec.rb
|
303
308
|
- spec/lib/vanagon/project_spec.rb
|
304
|
-
- spec/lib/vanagon/
|
309
|
+
- spec/lib/vanagon/common/pathname_spec.rb
|
310
|
+
- spec/lib/vanagon/common/user_spec.rb
|
305
311
|
- spec/lib/vanagon/component/source/git_spec.rb
|
306
|
-
- spec/lib/vanagon/component/source/local_spec.rb
|
307
312
|
- spec/lib/vanagon/component/source/http_spec.rb
|
313
|
+
- spec/lib/vanagon/component/source/local_spec.rb
|
314
|
+
- spec/lib/vanagon/component/source/rewrite_spec.rb
|
315
|
+
- spec/lib/vanagon/component/source_spec.rb
|
308
316
|
- spec/lib/vanagon/component/rules_spec.rb
|
309
317
|
- spec/lib/vanagon/component/dsl_spec.rb
|
310
|
-
- spec/lib/vanagon/component/source_spec.rb
|
311
|
-
- spec/lib/vanagon/common/user_spec.rb
|
312
|
-
- spec/lib/vanagon/common/pathname_spec.rb
|
313
318
|
- spec/lib/vanagon/component_spec.rb
|
314
|
-
- spec/lib/vanagon/
|
315
|
-
- spec/lib/vanagon/
|
316
|
-
- spec/lib/vanagon/
|
317
|
-
- spec/lib/vanagon/
|
318
|
-
- spec/lib/vanagon/
|
319
|
-
- spec/lib/vanagon/
|
320
|
-
- spec/lib/vanagon/
|
321
|
-
- spec/lib/vanagon/
|
319
|
+
- spec/lib/vanagon/project/dsl_spec.rb
|
320
|
+
- spec/lib/vanagon/platform/rpm/aix_spec.rb
|
321
|
+
- spec/lib/vanagon/platform/deb_spec.rb
|
322
|
+
- spec/lib/vanagon/platform/rpm_spec.rb
|
323
|
+
- spec/lib/vanagon/platform/solaris_10_spec.rb
|
324
|
+
- spec/lib/vanagon/platform/osx_spec.rb
|
325
|
+
- spec/lib/vanagon/platform/windows_spec.rb
|
326
|
+
- spec/lib/vanagon/platform/solaris_11_spec.rb
|
327
|
+
- spec/lib/vanagon/platform/dsl_spec.rb
|
322
328
|
- spec/lib/vanagon/cli_spec.rb
|
323
|
-
- spec/lib/vanagon/driver_spec.rb
|
324
|
-
- spec/lib/vanagon/utilities_spec.rb
|
325
329
|
- spec/lib/vanagon/platform_spec.rb
|
326
330
|
- spec/lib/vanagon/utilities/shell_utilities_spec.rb
|
327
|
-
- spec/lib/
|
328
|
-
- spec/lib/
|
331
|
+
- spec/lib/vanagon/utilities_spec.rb
|
332
|
+
- spec/lib/vanagon/driver_spec.rb
|