beaker 1.10.0 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|