beaker 1.10.0 → 1.11.0
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 +8 -8
- data/.travis.yml +2 -2
- data/Rakefile +14 -1
- data/beaker.gemspec +2 -1
- data/lib/beaker/answers/version20.rb +7 -7
- data/lib/beaker/answers/version28.rb +7 -7
- data/lib/beaker/answers/version30.rb +10 -9
- data/lib/beaker/dsl/helpers.rb +137 -6
- data/lib/beaker/dsl/install_utils.rb +60 -45
- data/lib/beaker/host/unix/pkg.rb +7 -7
- data/lib/beaker/host/windows.rb +4 -0
- data/lib/beaker/host_prebuilt_steps.rb +9 -2
- data/lib/beaker/hypervisor.rb +3 -1
- data/lib/beaker/hypervisor/docker.rb +154 -0
- data/lib/beaker/hypervisor/ec2_helper.rb +1 -1
- data/lib/beaker/hypervisor/google_compute_helper.rb +1 -1
- data/lib/beaker/options/parser.rb +7 -0
- data/lib/beaker/options/presets.rb +72 -52
- data/lib/beaker/test_case.rb +1 -14
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/answers_spec.rb +40 -27
- data/spec/beaker/dsl/helpers_spec.rb +114 -7
- data/spec/beaker/dsl/install_utils_spec.rb +17 -15
- data/spec/beaker/hypervisor/docker_spec.rb +212 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
- data/spec/beaker/options/parser_spec.rb +2 -3
- data/spec/helpers.rb +1 -1
- metadata +21 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGI2MDZhMzFhYTIwNGMwNzViMzQ4MjU5NjczOWJhMmY3OGNmOWU2ZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MWM4MTYyNjdlYzM2NWNhYmU2OWFkMjc1NjhlZTZkNjI4MzRlOTNkNA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjY3ZDE5N2MwYjEzMzYxYzk0ZGE3YTA1MzE4NjBjY2UyMzU0OTA3YjFjNzYw
|
10
|
+
NWUxZDJlYWM1N2JjYWM2YWU5YjJlMzRjZTNiMGViNjQ3ZTUzNzI1MTUxNGVk
|
11
|
+
ZmRjYzIzMDZlOGU5M2M5NzEzNmI5MTM1NGEyN2VmMDc3MGM1M2U=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWU4NmVmN2I0MTQyMjgzZDk1YzI5NGZmOWJiZGEwMGU1MzZmMGI0OTg5NjI4
|
14
|
+
MzNiMTVhNWQ4M2JhMTIzM2E0YTM3MDI3YzFjMjU0NzRjNzI5MGYyN2U4MjNi
|
15
|
+
NjEzNWRiODVjY2UxNGVkOTA1MjU0MWM3OGY2YWY0Zjg3MGFmZjM=
|
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -5,6 +5,15 @@ task :spec do
|
|
5
5
|
Rake::Task['test:spec'].invoke
|
6
6
|
end
|
7
7
|
|
8
|
+
task :yard do
|
9
|
+
Rake::Task['docs:gen'].invoke
|
10
|
+
end
|
11
|
+
|
12
|
+
task :travis do
|
13
|
+
Rake::Task['yard'].invoke unless RUBY_VERSION < '1.9'
|
14
|
+
Rake::Task['spec'].invoke
|
15
|
+
end
|
16
|
+
|
8
17
|
namespace :test do
|
9
18
|
desc 'Run specs (with coverage on 1.9), alias `spec` & the default'
|
10
19
|
task :spec do
|
@@ -63,7 +72,11 @@ namespace :docs do
|
|
63
72
|
task :gen => 'docs:clear' do
|
64
73
|
original_dir = Dir.pwd
|
65
74
|
Dir.chdir( File.expand_path(File.dirname(__FILE__)) )
|
66
|
-
|
75
|
+
output = `bundle exec yard doc`
|
76
|
+
puts output
|
77
|
+
if output =~ /\[warn\]|\[error\]/
|
78
|
+
raise "Errors/Warnings during yard documentation generation"
|
79
|
+
end
|
67
80
|
Dir.chdir( original_dir )
|
68
81
|
end
|
69
82
|
|
data/beaker.gemspec
CHANGED
@@ -39,8 +39,9 @@ Gem::Specification.new do |s|
|
|
39
39
|
s.add_runtime_dependency 'rbvmomi', '1.8.1'
|
40
40
|
s.add_runtime_dependency 'blimpy', '~> 0.6'
|
41
41
|
s.add_runtime_dependency 'fission', '~> 0.4'
|
42
|
-
s.add_runtime_dependency 'google-api-client', '~> 0.
|
42
|
+
s.add_runtime_dependency 'google-api-client', '~> 0.7.1'
|
43
43
|
s.add_runtime_dependency 'aws-sdk', '~> 1.38'
|
44
|
+
s.add_runtime_dependency 'docker-api' unless RUBY_VERSION < '1.9'
|
44
45
|
|
45
46
|
# These are transitive dependencies that we include or pin to because...
|
46
47
|
# Ruby 1.8 compatibility
|
@@ -46,13 +46,13 @@ module Beaker
|
|
46
46
|
master_a[:q_puppetmaster_dnsaltnames]+=","+master['ip']
|
47
47
|
end
|
48
48
|
|
49
|
-
dashboard_user = "'#{
|
50
|
-
smtp_host = "'#{
|
51
|
-
dashboard_password =
|
52
|
-
smtp_port = "'#{
|
53
|
-
smtp_username =
|
54
|
-
smtp_password =
|
55
|
-
smtp_use_tls = "'#{
|
49
|
+
dashboard_user = "'#{options[:answers][:q_puppet_enterpriseconsole_auth_user_email]}'"
|
50
|
+
smtp_host = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_host] || dashboard}'"
|
51
|
+
dashboard_password = options[:answers][:q_puppet_enterpriseconsole_auth_password]
|
52
|
+
smtp_port = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_port]}'"
|
53
|
+
smtp_username = options[:answers][:q_puppet_enterpriseconsole_smtp_username]
|
54
|
+
smtp_password = options[:answers][:q_puppet_enterpriseconsole_smtp_password]
|
55
|
+
smtp_use_tls = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_use_tls]}'"
|
56
56
|
|
57
57
|
console_a = {
|
58
58
|
:q_puppet_enterpriseconsole_install => 'y',
|
@@ -47,13 +47,13 @@ module Beaker
|
|
47
47
|
master_a[:q_puppetmaster_dnsaltnames]+=","+master['ip']
|
48
48
|
end
|
49
49
|
|
50
|
-
dashboard_user = "'#{
|
51
|
-
smtp_host = "'#{
|
52
|
-
dashboard_password =
|
53
|
-
smtp_port = "'#{
|
54
|
-
smtp_username =
|
55
|
-
smtp_password =
|
56
|
-
smtp_use_tls = "'#{
|
50
|
+
dashboard_user = "'#{options[:answers][:q_puppet_enterpriseconsole_auth_user_email]}'"
|
51
|
+
smtp_host = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_host] || dashboard}'"
|
52
|
+
dashboard_password = options[:answers][:q_puppet_enterpriseconsole_auth_password]
|
53
|
+
smtp_port = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_port]}'"
|
54
|
+
smtp_username = options[:answers][:q_puppet_enterpriseconsole_smtp_username]
|
55
|
+
smtp_password = options[:answers][:q_puppet_enterpriseconsole_smtp_password]
|
56
|
+
smtp_use_tls = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_use_tls]}'"
|
57
57
|
|
58
58
|
console_a = {
|
59
59
|
:q_puppet_enterpriseconsole_install => 'y',
|
@@ -22,7 +22,7 @@ module Beaker
|
|
22
22
|
agent_a = {
|
23
23
|
:q_puppetagent_install => 'y',
|
24
24
|
:q_puppet_cloud_install => 'y',
|
25
|
-
:q_verify_packages =>
|
25
|
+
:q_verify_packages => options[:answers][:q_verify_packages],
|
26
26
|
:q_puppet_symlinks_install => 'y',
|
27
27
|
:q_puppetagent_certname => host,
|
28
28
|
:q_puppetagent_server => master_certname,
|
@@ -66,8 +66,8 @@ module Beaker
|
|
66
66
|
end
|
67
67
|
|
68
68
|
# Common answers for console and database
|
69
|
-
dashboard_password = "'#{
|
70
|
-
puppetdb_password = "'#{
|
69
|
+
dashboard_password = "'#{options[:answers][:q_puppet_enterpriseconsole_auth_password]}'"
|
70
|
+
puppetdb_password = "'#{options[:answers][:q_puppetdb_password]}'"
|
71
71
|
|
72
72
|
console_database_a = {
|
73
73
|
:q_puppetdb_database_name => 'pe-puppetdb',
|
@@ -85,13 +85,14 @@ module Beaker
|
|
85
85
|
}
|
86
86
|
|
87
87
|
# Console only answers
|
88
|
-
dashboard_user = "'#{
|
88
|
+
dashboard_user = "'#{options[:answers][:q_puppet_enterpriseconsole_auth_user_email]}'"
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
90
|
+
|
91
|
+
smtp_host = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_host] || dashboard}'"
|
92
|
+
smtp_port = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_port]}'"
|
93
|
+
smtp_username = options[:answers][:q_puppet_enterpriseconsole_smtp_username]
|
94
|
+
smtp_password = options[:answers][:q_puppet_enterpriseconsole_smtp_password]
|
95
|
+
smtp_use_tls = "'#{options[:answers][:q_puppet_enterpriseconsole_smtp_use_tls]}'"
|
95
96
|
|
96
97
|
console_a = {
|
97
98
|
:q_puppet_enterpriseconsole_install => 'y',
|
data/lib/beaker/dsl/helpers.rb
CHANGED
@@ -13,6 +13,7 @@ module Beaker
|
|
13
13
|
# To mix this is into a class you need the following:
|
14
14
|
# * a method *hosts* that yields any hosts implementing
|
15
15
|
# {Beaker::Host}'s interface to act upon.
|
16
|
+
# * a method *options* that provides an options hash, see {Beaker::Options::OptionsHash}
|
16
17
|
# * a method *logger* that yields a logger implementing
|
17
18
|
# {Beaker::Logger}'s interface.
|
18
19
|
# * the module {Beaker::DSL::Roles} that provides access to the various hosts implementing
|
@@ -245,7 +246,7 @@ module Beaker
|
|
245
246
|
# @param [String] path The path to the generated repository config
|
246
247
|
# files. ex: /myproject/pkg/repo_configs
|
247
248
|
# @param [String] name A human-readable name for the repository
|
248
|
-
# @param [String
|
249
|
+
# @param [String] version The version of the project, as used by the
|
249
250
|
# packaging tools. This can be determined with
|
250
251
|
# `rake pl:print_build_params` from the packaging
|
251
252
|
# repo.
|
@@ -667,7 +668,7 @@ module Beaker
|
|
667
668
|
# :expect_failures to create the full list of
|
668
669
|
# passing exit codes.
|
669
670
|
#
|
670
|
-
# @
|
671
|
+
# @option opts [Hash] :environment Additional environment variables to be
|
671
672
|
# passed to the 'puppet apply' command
|
672
673
|
#
|
673
674
|
# @option opts [Boolean] :catch_failures (false) By default `puppet
|
@@ -698,6 +699,11 @@ module Beaker
|
|
698
699
|
# from Puppet verion 3.2
|
699
700
|
# By default it will use the 'current' parser.
|
700
701
|
#
|
702
|
+
# @option opts [String] :modulepath The search path for modules, as
|
703
|
+
# a list of directories separated by the system
|
704
|
+
# path separator character. (The POSIX path separator
|
705
|
+
# is ‘:’, and the Windows path separator is ‘;’.)
|
706
|
+
#
|
701
707
|
# @param [Block] block This method will yield to a block of code passed
|
702
708
|
# by the caller; this can be used for additional
|
703
709
|
# validation, etc.
|
@@ -716,6 +722,7 @@ module Beaker
|
|
716
722
|
args << "--parseonly" if opts[:parseonly]
|
717
723
|
args << "--trace" if opts[:trace]
|
718
724
|
args << "--parser future" if opts[:future_parser]
|
725
|
+
args << "--modulepath #{opts[:modulepath]}" if opts[:modulepath]
|
719
726
|
|
720
727
|
# From puppet help:
|
721
728
|
# "... an exit code of '2' means there were changes, an exit code of
|
@@ -860,8 +867,12 @@ module Beaker
|
|
860
867
|
# forge api v3 canonical source is forgeapi.puppetlabs.com
|
861
868
|
#
|
862
869
|
# @param machine [String] the host to perform the stub on
|
863
|
-
|
864
|
-
|
870
|
+
# @param forge_host [String] The URL to use as the forge alias, will default to using :forge_host in the
|
871
|
+
# global options hash
|
872
|
+
def stub_forge_on(machine, forge_host = nil)
|
873
|
+
#use global options hash
|
874
|
+
forge_host ||= options[:forge_host]
|
875
|
+
@forge_ip ||= Resolv.getaddress(forge_host)
|
865
876
|
stub_hosts_on(machine, 'forge.puppetlabs.com' => @forge_ip)
|
866
877
|
stub_hosts_on(machine, 'forgeapi.puppetlabs.com' => @forge_ip)
|
867
878
|
end
|
@@ -870,8 +881,10 @@ module Beaker
|
|
870
881
|
# the forge alias.
|
871
882
|
#
|
872
883
|
# @see #stub_forge_on
|
873
|
-
def stub_forge
|
874
|
-
|
884
|
+
def stub_forge(forge_host = nil)
|
885
|
+
#use global options hash
|
886
|
+
forge_host ||= options[:forge_host]
|
887
|
+
stub_forge_on(default, forge_host)
|
875
888
|
end
|
876
889
|
|
877
890
|
def sleep_until_puppetdb_started(host)
|
@@ -1009,6 +1022,124 @@ module Beaker
|
|
1009
1022
|
end
|
1010
1023
|
|
1011
1024
|
|
1025
|
+
#Install local module for acceptance testing
|
1026
|
+
# should be used as a presuite to ensure local module is copied to the hosts you want, particularly masters
|
1027
|
+
# @api dsl
|
1028
|
+
# @param [Host, Array<Host>, String, Symbol] host
|
1029
|
+
# One or more hosts to act upon,
|
1030
|
+
# or a role (String or Symbol) that identifies one or more hosts.
|
1031
|
+
# @option opts [String] :source ('./')
|
1032
|
+
# The current directory where the module sits, otherwise will try
|
1033
|
+
# and walk the tree to figure out
|
1034
|
+
# @option opts [String] :module_name (nil)
|
1035
|
+
# Name which the module should be installed under, please do not include author,
|
1036
|
+
# if none is provided it will attempt to parse the metadata.json and then the Modulefile to determine
|
1037
|
+
# the name of the module
|
1038
|
+
# @option opts [String] :target_module_path (host['puppetpath']/modules)
|
1039
|
+
# Location where the module should be installed, will default
|
1040
|
+
# to host['puppetpath']/modules
|
1041
|
+
# @raise [ArgumentError] if not host is provided or module_name is not provided and can not be found in Modulefile
|
1042
|
+
#
|
1043
|
+
def copy_root_module_to(host, opts = {})
|
1044
|
+
if !host
|
1045
|
+
raise(ArgumentError, "Host must be defined")
|
1046
|
+
end
|
1047
|
+
source = opts[:source] || parse_for_moduleroot(Dir.getwd)
|
1048
|
+
target_module_path = opts[:target_module_path] || "#{host['puppetpath']}/modules"
|
1049
|
+
|
1050
|
+
module_name = opts[:module_name] || parse_for_modulename(source)
|
1051
|
+
if !module_name
|
1052
|
+
logger.debug('Still unable to determine the modulename')
|
1053
|
+
raise(ArgumentError, "Unable to determine the module name, please update your call of puppet_module_install")
|
1054
|
+
end
|
1055
|
+
|
1056
|
+
module_dir = File.join(target_module_path, module_name)
|
1057
|
+
on host, "mkdir -p #{target_module_path}"
|
1058
|
+
['manifests', 'lib', 'templates', 'metadata.json', 'Modulefile', 'files', 'Gemfile'].each do |item|
|
1059
|
+
item_source = File.join(source, item)
|
1060
|
+
if File.exists? item_source
|
1061
|
+
options = {}
|
1062
|
+
if File.directory? item_source
|
1063
|
+
on host, "mkdir -p #{File.join(module_dir, item)}"
|
1064
|
+
options = { :mkdir => true }
|
1065
|
+
end
|
1066
|
+
host.do_scp_to(item_source, module_dir, options)
|
1067
|
+
end
|
1068
|
+
end
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
|
1072
|
+
#Recursive method for finding the module root
|
1073
|
+
# Assumes that a Modulefile exists
|
1074
|
+
# @param [String] possible_module_directory
|
1075
|
+
# will look for Modulefile and if none found go up one level and try again until root is reached
|
1076
|
+
#
|
1077
|
+
# @return [String,nil]
|
1078
|
+
def parse_for_moduleroot(possible_module_directory)
|
1079
|
+
if File.exists?("#{possible_module_directory}/Modulefile")
|
1080
|
+
possible_module_directory
|
1081
|
+
elsif possible_module_directory === '/'
|
1082
|
+
logger.error "At root, can't parse for another directory"
|
1083
|
+
nil
|
1084
|
+
else
|
1085
|
+
logger.debug "No Modulefile found at #{possible_module_directory}, moving up"
|
1086
|
+
parse_for_moduleroot File.expand_path(File.join(possible_module_directory,'..'))
|
1087
|
+
end
|
1088
|
+
end
|
1089
|
+
|
1090
|
+
|
1091
|
+
#Parse root directory of a module for module name
|
1092
|
+
# Searches for metadata.json and then if none found, Modulefile and parses for the Name attribute
|
1093
|
+
# @param [String] root_module_dir
|
1094
|
+
# @return [String] module name
|
1095
|
+
def parse_for_modulename(root_module_dir)
|
1096
|
+
module_name = nil
|
1097
|
+
if File.exists?("#{root_module_dir}/metadata.json")
|
1098
|
+
logger.debug "Attempting to parse Modulename from metadata.json"
|
1099
|
+
module_json = JSON.parse (File.read "#{root_module_dir}/metadata.json")
|
1100
|
+
if(module_json.has_key?('name'))
|
1101
|
+
module_name = get_module_name(module_json['name'])
|
1102
|
+
end
|
1103
|
+
end
|
1104
|
+
if !module_name && File.exists?("#{root_module_dir}/Modulefile")
|
1105
|
+
logger.debug "Attempting to parse Modulename from Modulefile"
|
1106
|
+
if /^name\s+'?(\w+-\w+)'?\s*$/i.match(File.read("#{root_module_dir}/Modulefile"))
|
1107
|
+
module_name = get_module_name(Regexp.last_match[1])
|
1108
|
+
end
|
1109
|
+
end
|
1110
|
+
if !module_name
|
1111
|
+
logger.debug "Unable to determine name, returning null"
|
1112
|
+
end
|
1113
|
+
module_name
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
#Parse modulename from the pattern 'Auther-ModuleName'
|
1117
|
+
#
|
1118
|
+
# @param [String] author_module_name <Author>-<ModuleName> pattern
|
1119
|
+
#
|
1120
|
+
# @return [String,nil]
|
1121
|
+
#
|
1122
|
+
def get_module_name(author_module_name)
|
1123
|
+
split_name = split_author_modulename(author_module_name)
|
1124
|
+
if split_name
|
1125
|
+
split_name[:module]
|
1126
|
+
end
|
1127
|
+
end
|
1128
|
+
|
1129
|
+
#Split the Author-Name into a hash
|
1130
|
+
# @param [String] author_module_attr
|
1131
|
+
#
|
1132
|
+
# @return [Hash<Symbol,String>,nil] :author and :module symbols will be returned
|
1133
|
+
#
|
1134
|
+
def split_author_modulename(author_module_attr)
|
1135
|
+
result = /(\w+)-(\w+)/.match(author_module_attr)
|
1136
|
+
if result
|
1137
|
+
{:author => result[1], :module => result[2]}
|
1138
|
+
else
|
1139
|
+
nil
|
1140
|
+
end
|
1141
|
+
end
|
1142
|
+
|
1012
1143
|
end
|
1013
1144
|
end
|
1014
1145
|
end
|
@@ -6,6 +6,14 @@ module Beaker
|
|
6
6
|
# This module contains methods to help cloning, extracting git info,
|
7
7
|
# ordering of Puppet packages, and installing ruby projects that
|
8
8
|
# contain an `install.rb` script.
|
9
|
+
#
|
10
|
+
# To mix this is into a class you need the following:
|
11
|
+
# * a method *hosts* that yields any hosts implementing
|
12
|
+
# {Beaker::Host}'s interface to act upon.
|
13
|
+
# * a method *options* that provides an options hash, see {Beaker::Options::OptionsHash}
|
14
|
+
# * the module {Beaker::DSL::Roles} that provides access to the various hosts implementing
|
15
|
+
# {Beaker::Host}'s interface to act upon
|
16
|
+
# * the module {Beaker::DSL::Wrappers} the provides convenience methods for {Beaker::DSL::Command} creation
|
9
17
|
module InstallUtils
|
10
18
|
|
11
19
|
# The default install path
|
@@ -132,18 +140,18 @@ module Beaker
|
|
132
140
|
#Create the PE install command string based upon the host and options settings
|
133
141
|
# @param [Host] host The host that PE is to be installed on
|
134
142
|
# For UNIX machines using the full PE installer, the host object must have the 'pe_installer' field set correctly.
|
135
|
-
# @param [Hash{Symbol=>String}]
|
136
|
-
# @option
|
143
|
+
# @param [Hash{Symbol=>String}] opts The options
|
144
|
+
# @option opts [String] :pe_ver_win Default PE version to install or upgrade to on Windows hosts
|
137
145
|
# (Othersie uses individual Windows hosts pe_ver)
|
138
|
-
# @option
|
146
|
+
# @option opts [String :pe_ver Default PE version to install or upgrade to
|
139
147
|
# (Otherwise uses individual hosts pe_ver)
|
140
148
|
# @example
|
141
|
-
# on host, "#{installer_cmd(host,
|
149
|
+
# on host, "#{installer_cmd(host, opts)} -a #{host['working_dir']}/answers"
|
142
150
|
# @api private
|
143
|
-
def installer_cmd(host,
|
144
|
-
version =
|
151
|
+
def installer_cmd(host, opts)
|
152
|
+
version = opts[:pe_ver] || host['pe_ver']
|
145
153
|
if host['platform'] =~ /windows/
|
146
|
-
version =
|
154
|
+
version = opts[:pe_ver_win] || host['pe_ver']
|
147
155
|
"cd #{host['working_dir']} && cmd /C 'start /w msiexec.exe /qn /i puppet-enterprise-#{version}.msi PUPPET_MASTER_SERVER=#{master} PUPPET_AGENT_CERTNAME=#{host}'"
|
148
156
|
# Frictionless install didn't exist pre-3.2.0, so in that case we fall
|
149
157
|
# through and do a regular install.
|
@@ -174,18 +182,18 @@ module Beaker
|
|
174
182
|
|
175
183
|
#Determine the PE package to download/upload on a windows host, download/upload that package onto the host.
|
176
184
|
# @param [Host] host The windows host to download/upload and unpack PE onto
|
177
|
-
# @param [Hash{Symbol=>Symbol, String}]
|
178
|
-
# @option
|
185
|
+
# @param [Hash{Symbol=>Symbol, String}] opts The options
|
186
|
+
# @option opts [String] :pe_dir Default directory or URL to pull PE package from
|
179
187
|
# (Otherwise uses individual hosts pe_dir)
|
180
|
-
# @option
|
188
|
+
# @option opts [String] :pe_ver Default PE version to install or upgrade to
|
181
189
|
# (Otherwise uses individual hosts pe_ver)
|
182
|
-
# @option
|
190
|
+
# @option opts [String] :pe_ver_win Default PE version to install or upgrade to on Windows hosts
|
183
191
|
# (Otherwise uses individual Windows hosts pe_ver)
|
184
192
|
# @api private
|
185
|
-
def fetch_puppet_on_windows(host,
|
186
|
-
path =
|
193
|
+
def fetch_puppet_on_windows(host, opts)
|
194
|
+
path = opts[:pe_dir] || host['pe_dir']
|
187
195
|
local = File.directory?(path)
|
188
|
-
version =
|
196
|
+
version = opts[:pe_ver_win] || host['pe_ver']
|
189
197
|
filename = "puppet-enterprise-#{version}"
|
190
198
|
extension = ".msi"
|
191
199
|
if local
|
@@ -204,14 +212,14 @@ module Beaker
|
|
204
212
|
#Determine the PE package to download/upload on a unix style host, download/upload that package onto the host
|
205
213
|
#and unpack it.
|
206
214
|
# @param [Host] host The unix style host to download/upload and unpack PE onto
|
207
|
-
# @param [Hash{Symbol=>Symbol, String}]
|
208
|
-
# @option
|
215
|
+
# @param [Hash{Symbol=>Symbol, String}] opts The options
|
216
|
+
# @option opts [String] :pe_dir Default directory or URL to pull PE package from
|
209
217
|
# (Otherwise uses individual hosts pe_dir)
|
210
|
-
# @option
|
218
|
+
# @option opts [String] :pe_ver Default PE version to install or upgrade to
|
211
219
|
# (Otherwise uses individual hosts pe_ver)
|
212
220
|
# @api private
|
213
|
-
def fetch_puppet_on_unix(host,
|
214
|
-
path =
|
221
|
+
def fetch_puppet_on_unix(host, opts)
|
222
|
+
path = opts[:pe_dir] || host['pe_dir']
|
215
223
|
local = File.directory?(path)
|
216
224
|
filename = "#{host['dist']}"
|
217
225
|
if local
|
@@ -241,24 +249,24 @@ module Beaker
|
|
241
249
|
#Determine the PE package to download/upload per-host, download/upload that package onto the host
|
242
250
|
#and unpack it.
|
243
251
|
# @param [Array<Host>] hosts The hosts to download/upload and unpack PE onto
|
244
|
-
# @param [Hash{Symbol=>Symbol, String}]
|
245
|
-
# @option
|
252
|
+
# @param [Hash{Symbol=>Symbol, String}] opts The options
|
253
|
+
# @option opts [String] :pe_dir Default directory or URL to pull PE package from
|
246
254
|
# (Otherwise uses individual hosts pe_dir)
|
247
|
-
# @option
|
255
|
+
# @option opts [String] :pe_ver Default PE version to install or upgrade to
|
248
256
|
# (Otherwise uses individual hosts pe_ver)
|
249
|
-
# @option
|
257
|
+
# @option opts [String] :pe_ver_win Default PE version to install or upgrade to on Windows hosts
|
250
258
|
# (Otherwise uses individual Windows hosts pe_ver)
|
251
259
|
# @api private
|
252
|
-
def fetch_puppet(hosts,
|
260
|
+
def fetch_puppet(hosts, opts)
|
253
261
|
hosts.each do |host|
|
254
262
|
# We install Puppet from the master for frictionless installs, so we don't need to *fetch* anything
|
255
|
-
next if host['roles'].include? 'frictionless' and ! version_is_less(
|
263
|
+
next if host['roles'].include? 'frictionless' and ! version_is_less(opts[:pe_ver] || host['pe_ver'], '3.2.0')
|
256
264
|
|
257
265
|
windows = host['platform'] =~ /windows/
|
258
266
|
if windows
|
259
|
-
fetch_puppet_on_windows(host,
|
267
|
+
fetch_puppet_on_windows(host, opts)
|
260
268
|
else
|
261
|
-
fetch_puppet_on_unix(host,
|
269
|
+
fetch_puppet_on_unix(host, opts)
|
262
270
|
end
|
263
271
|
end
|
264
272
|
end
|
@@ -276,26 +284,28 @@ module Beaker
|
|
276
284
|
|
277
285
|
#Perform a Puppet Enterprise upgrade or install
|
278
286
|
# @param [Array<Host>] hosts The hosts to install or upgrade PE on
|
279
|
-
# @param [Hash{Symbol=>Symbol, String}]
|
280
|
-
# @option
|
287
|
+
# @param [Hash{Symbol=>Symbol, String}] opts The options
|
288
|
+
# @option opts [String] :pe_dir Default directory or URL to pull PE package from
|
281
289
|
# (Otherwise uses individual hosts pe_dir)
|
282
|
-
# @option
|
290
|
+
# @option opts [String] :pe_ver Default PE version to install or upgrade to
|
283
291
|
# (Otherwise uses individual hosts pe_ver)
|
284
|
-
# @option
|
292
|
+
# @option opts [String] :pe_ver_win Default PE version to install or upgrade to on Windows hosts
|
285
293
|
# (Otherwise uses individual Windows hosts pe_ver)
|
286
|
-
# @option
|
294
|
+
# @option opts [Symbol] :type (:install) One of :upgrade or :install
|
295
|
+
# @option opts [Hash<String>] :answers Pre-set answers based upon ENV vars and defaults
|
296
|
+
# (See {Beaker::Options::Presets.env_vars})
|
287
297
|
#
|
288
298
|
# @example
|
289
299
|
# do_install(hosts, {:type => :upgrade, :pe_dir => path, :pe_ver => version, :pe_ver_win => version_win})
|
290
300
|
#
|
291
301
|
# @api private
|
292
302
|
#
|
293
|
-
def do_install hosts,
|
294
|
-
|
303
|
+
def do_install hosts, opts = {}
|
304
|
+
opts[:type] = opts[:type] || :install
|
295
305
|
hostcert='uname | grep -i sunos > /dev/null && hostname || hostname -s'
|
296
306
|
master_certname = on(master, hostcert).stdout.strip
|
297
|
-
pre30database = version_is_less(
|
298
|
-
pre30master = version_is_less(
|
307
|
+
pre30database = version_is_less(opts[:pe_ver] || database['pe_ver'], '3.0')
|
308
|
+
pre30master = version_is_less(opts[:pe_ver] || master['pe_ver'], '3.0')
|
299
309
|
|
300
310
|
# Set PE distribution for all the hosts, create working dir
|
301
311
|
use_all_tar = ENV['PE_USE_ALL_TAR'] == 'true'
|
@@ -303,25 +313,25 @@ module Beaker
|
|
303
313
|
host['pe_installer'] ||= 'puppet-enterprise-installer'
|
304
314
|
if host['platform'] !~ /windows/
|
305
315
|
platform = use_all_tar ? 'all' : host['platform']
|
306
|
-
version =
|
316
|
+
version = opts[:pe_ver] || host['pe_ver']
|
307
317
|
host['dist'] = "puppet-enterprise-#{version}-#{platform}"
|
308
318
|
end
|
309
319
|
host['working_dir'] = "/tmp/" + Time.new.strftime("%Y-%m-%d_%H.%M.%S") #unique working dirs make me happy
|
310
320
|
on host, "mkdir #{host['working_dir']}"
|
311
321
|
end
|
312
322
|
|
313
|
-
fetch_puppet(hosts,
|
323
|
+
fetch_puppet(hosts, opts)
|
314
324
|
|
315
325
|
hosts.each do |host|
|
316
326
|
# Database host was added in 3.0. Skip it if installing an older version
|
317
327
|
next if host == database and host != master and host != dashboard and pre30database
|
318
328
|
if host['platform'] =~ /windows/
|
319
|
-
on host, installer_cmd(host,
|
329
|
+
on host, installer_cmd(host, opts)
|
320
330
|
else
|
321
331
|
# We only need answers if we're using the classic installer
|
322
|
-
version =
|
332
|
+
version = opts[:pe_ver] || host['pe_ver']
|
323
333
|
if (! host['roles'].include? 'frictionless') || version_is_less(version, '3.2.0')
|
324
|
-
answers = Beaker::Answers.answers(
|
334
|
+
answers = Beaker::Answers.answers(opts[:pe_ver] || host['pe_ver'], hosts, master_certname, opts)
|
325
335
|
create_remote_file host, "#{host['working_dir']}/answers", Beaker::Answers.answer_string(host, answers)
|
326
336
|
else
|
327
337
|
# If We're *not* running the classic installer, we want
|
@@ -329,7 +339,7 @@ module Beaker
|
|
329
339
|
deploy_frictionless_to_master(host)
|
330
340
|
end
|
331
341
|
|
332
|
-
on host, installer_cmd(host,
|
342
|
+
on host, installer_cmd(host, opts)
|
333
343
|
end
|
334
344
|
end
|
335
345
|
|
@@ -440,7 +450,7 @@ module Beaker
|
|
440
450
|
# @return nil
|
441
451
|
def install_puppet
|
442
452
|
hosts.each do |host|
|
443
|
-
if host['platform'] =~ /el-(5|6)/
|
453
|
+
if host['platform'] =~ /el-(5|6|7)/
|
444
454
|
relver = $1
|
445
455
|
on host, "rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-#{relver}.noarch.rpm"
|
446
456
|
on host, 'yum install -y puppet'
|
@@ -449,6 +459,9 @@ module Beaker
|
|
449
459
|
on host, "rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-fedora-#{relver}.noarch.rpm"
|
450
460
|
on host, 'yum install -y puppet'
|
451
461
|
elsif host['platform'] =~ /(ubuntu|debian)/
|
462
|
+
if ! host.check_for_package 'lsb-release'
|
463
|
+
host.install_package('lsb-release')
|
464
|
+
end
|
452
465
|
if ! host.check_for_package 'curl'
|
453
466
|
on host, 'apt-get install -y curl'
|
454
467
|
end
|
@@ -484,7 +497,8 @@ module Beaker
|
|
484
497
|
Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir] || options[:pe_dir], options[:pe_version_file])
|
485
498
|
end
|
486
499
|
end
|
487
|
-
|
500
|
+
#send in the global options hash
|
501
|
+
do_install sorted_hosts, options
|
488
502
|
end
|
489
503
|
|
490
504
|
#Upgrade PE based upon host configuration and options
|
@@ -512,7 +526,8 @@ module Beaker
|
|
512
526
|
host['pe_installer'] ||= 'puppet-enterprise-upgrader'
|
513
527
|
end
|
514
528
|
end
|
515
|
-
|
529
|
+
#send in the global options hash
|
530
|
+
do_install(sorted_hosts, options.merge({:type => :upgrade}))
|
516
531
|
end
|
517
532
|
end
|
518
533
|
end
|