beaker 2.2.0 → 2.3.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/HISTORY.md +222 -4
- data/ext/completion/beaker-completion.bash +53 -0
- data/lib/beaker/answers/version30.rb +98 -93
- data/lib/beaker/answers/version32.rb +3 -0
- data/lib/beaker/answers/version34.rb +4 -1
- data/lib/beaker/dsl/helpers.rb +42 -1
- data/lib/beaker/dsl/install_utils.rb +76 -35
- data/lib/beaker/dsl/roles.rb +43 -15
- data/lib/beaker/host.rb +1 -0
- data/lib/beaker/host_prebuilt_steps.rb +10 -4
- data/lib/beaker/hypervisor/aws_sdk.rb +24 -9
- data/lib/beaker/hypervisor/openstack.rb +26 -1
- data/lib/beaker/hypervisor/vagrant.rb +8 -2
- data/lib/beaker/hypervisor/vagrant_virtualbox.rb +2 -0
- data/lib/beaker/options/presets.rb +1 -0
- data/lib/beaker/shared/host_manager.rb +21 -0
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/answers_spec.rb +38 -0
- data/spec/beaker/dsl/helpers_spec.rb +52 -0
- data/spec/beaker/dsl/install_utils_spec.rb +58 -1
- data/spec/beaker/dsl/roles_spec.rb +27 -2
- data/spec/beaker/host_spec.rb +18 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +11 -0
- data/spec/beaker/shared/host_manager_spec.rb +20 -0
- metadata +3 -2
@@ -10,6 +10,9 @@ module Beaker
|
|
10
10
|
# @return [Hash] A hash (keyed from hosts) containing hashes of answer file
|
11
11
|
# data.
|
12
12
|
def generate_answers
|
13
|
+
masterless = @options[:masterless]
|
14
|
+
return super if masterless
|
15
|
+
|
13
16
|
dashboard = only_host_with_role(@hosts, 'dashboard')
|
14
17
|
database = only_host_with_role(@hosts, 'database')
|
15
18
|
master = only_host_with_role(@hosts, 'master')
|
@@ -6,6 +6,9 @@ module Beaker
|
|
6
6
|
# @api private
|
7
7
|
class Version34 < Version32
|
8
8
|
def generate_answers
|
9
|
+
masterless = @options[:masterless]
|
10
|
+
return super if masterless
|
11
|
+
|
9
12
|
dashboard = only_host_with_role(@hosts, 'dashboard')
|
10
13
|
database = only_host_with_role(@hosts, 'database')
|
11
14
|
|
@@ -35,7 +38,7 @@ module Beaker
|
|
35
38
|
|
36
39
|
# If we're installing or upgrading from a non-RBAC version, set the 'admin' password
|
37
40
|
if @options[:type] == :upgrade && @options[:HOSTS][dashboard.name][:pe_ver] < "3.4.0"
|
38
|
-
dashboard_password = "'#{options[:answers][:q_puppet_enterpriseconsole_auth_password]}'"
|
41
|
+
dashboard_password = "'#{@options[:answers][:q_puppet_enterpriseconsole_auth_password]}'"
|
39
42
|
the_answers[dashboard.name][:q_puppet_enterpriseconsole_auth_password] = dashboard_password
|
40
43
|
end
|
41
44
|
|
data/lib/beaker/dsl/helpers.rb
CHANGED
@@ -1256,7 +1256,8 @@ module Beaker
|
|
1256
1256
|
avoid_puppet_at_all_costs ||= agent['pe_ver'] && version_is_less(agent['pe_ver'], '3.2') && agent['platform'] =~ /sles/
|
1257
1257
|
|
1258
1258
|
if avoid_puppet_at_all_costs
|
1259
|
-
|
1259
|
+
# When upgrading, puppet is already stopped. On EL4, this causes an exit code of '1'
|
1260
|
+
on agent, "/etc/init.d/#{agent_service} stop", :acceptable_exit_codes => [0, 1]
|
1260
1261
|
else
|
1261
1262
|
on agent, puppet_resource('service', agent_service, 'ensure=stopped')
|
1262
1263
|
end
|
@@ -1354,6 +1355,46 @@ module Beaker
|
|
1354
1355
|
on host, "curl %s" % cmd, opts, &block
|
1355
1356
|
end
|
1356
1357
|
end
|
1358
|
+
|
1359
|
+
# Write hiera config file on one or more provided hosts
|
1360
|
+
#
|
1361
|
+
# @param[Host, Array<Host>, String, Symbol] host One or more hosts to act upon,
|
1362
|
+
# or a role (String or Symbol) that identifies one or more hosts.
|
1363
|
+
# @param[Array] One or more hierarchy paths
|
1364
|
+
def write_hiera_config_on(host, hierarchy)
|
1365
|
+
|
1366
|
+
block_on host do |host|
|
1367
|
+
hiera_config=Hash.new
|
1368
|
+
hiera_config[:backends] = 'yaml'
|
1369
|
+
hiera_config[:yaml] = {}
|
1370
|
+
hiera_config[:yaml][:datadir] = host[:hieradatadir]
|
1371
|
+
hiera_config[:hierarchy] = hierarchy
|
1372
|
+
hiera_config[:logger] = 'console'
|
1373
|
+
create_remote_file host, host[:hieraconf], hiera_config.to_yaml
|
1374
|
+
end
|
1375
|
+
end
|
1376
|
+
|
1377
|
+
# Write hiera config file for the default host
|
1378
|
+
# @see #write_hiera_config_on
|
1379
|
+
def write_hiera_config(hierarchy)
|
1380
|
+
write_hiera_config_on(default, hierarchy)
|
1381
|
+
end
|
1382
|
+
|
1383
|
+
# Copy hiera data files to one or more provided hosts
|
1384
|
+
#
|
1385
|
+
# @param[Host, Array<Host>, String, Symbol] host One or more hosts to act upon,
|
1386
|
+
# or a role (String or Symbol) that identifies one or more hosts.
|
1387
|
+
# @param[String] Directory containing the hiera data files.
|
1388
|
+
def copy_hiera_data_to(host, source)
|
1389
|
+
scp_to host, File.expand_path(source), host[:hieradatadir]
|
1390
|
+
end
|
1391
|
+
|
1392
|
+
# Copy hiera data files to the default host
|
1393
|
+
# @see #copy_hiera_data_to
|
1394
|
+
def copy_hiera_data(source)
|
1395
|
+
copy_hiera_data_to(default, source)
|
1396
|
+
end
|
1397
|
+
|
1357
1398
|
end
|
1358
1399
|
end
|
1359
1400
|
end
|
@@ -453,12 +453,16 @@ module Beaker
|
|
453
453
|
# @api private
|
454
454
|
#
|
455
455
|
def do_install hosts, opts = {}
|
456
|
+
masterless = (defined? options) ? options[:masterless] : false
|
457
|
+
opts[:masterless] = masterless # has to pass masterless down for answer generation awareness
|
456
458
|
opts[:type] = opts[:type] || :install
|
457
|
-
|
458
|
-
|
459
|
+
unless masterless
|
460
|
+
pre30database = version_is_less(opts[:pe_ver] || database['pe_ver'], '3.0')
|
461
|
+
pre30master = version_is_less(opts[:pe_ver] || master['pe_ver'], '3.0')
|
459
462
|
|
460
|
-
|
461
|
-
|
463
|
+
unless version_is_less(opts[:pe_ver] || master['pe_ver'], '3.4')
|
464
|
+
master['puppetservice'] = 'pe-puppetserver'
|
465
|
+
end
|
462
466
|
end
|
463
467
|
|
464
468
|
# Set PE distribution for all the hosts, create working dir
|
@@ -489,9 +493,11 @@ module Beaker
|
|
489
493
|
|
490
494
|
fetch_puppet(hosts, opts)
|
491
495
|
|
492
|
-
# If we're installing a database version less than 3.0, ignore the database host
|
493
496
|
install_hosts = hosts.dup
|
494
|
-
|
497
|
+
unless masterless
|
498
|
+
# If we're installing a database version less than 3.0, ignore the database host
|
499
|
+
install_hosts.delete(database) if pre30database and database != master and database != dashboard
|
500
|
+
end
|
495
501
|
|
496
502
|
install_hosts.each do |host|
|
497
503
|
if host['platform'] =~ /windows/
|
@@ -511,7 +517,8 @@ module Beaker
|
|
511
517
|
on host, puppet("config set server #{master}")
|
512
518
|
on host, puppet("config set certname #{host}")
|
513
519
|
#run once to request cert
|
514
|
-
|
520
|
+
acceptable_codes = host['platform'] =~ /osx/ ? [1] : [0, 1]
|
521
|
+
on host, puppet_agent('-t'), :acceptable_exit_codes => acceptable_codes
|
515
522
|
else
|
516
523
|
answers = Beaker::Answers.create(opts[:pe_ver] || host['pe_ver'], hosts, opts)
|
517
524
|
create_remote_file host, "#{host['working_dir']}/answers", answers.answer_string(host)
|
@@ -520,41 +527,43 @@ module Beaker
|
|
520
527
|
end
|
521
528
|
|
522
529
|
# On each agent, we ensure the certificate is signed then shut down the agent
|
523
|
-
sign_certificate_for(host)
|
530
|
+
sign_certificate_for(host) unless masterless
|
524
531
|
stop_agent_on(host)
|
525
532
|
end
|
526
533
|
|
527
|
-
|
528
|
-
|
534
|
+
unless masterless
|
535
|
+
# Wait for PuppetDB to be totally up and running (post 3.0 version of pe only)
|
536
|
+
sleep_until_puppetdb_started(database) unless pre30database
|
537
|
+
|
538
|
+
# Run the agent once to ensure everything is in the dashboard
|
539
|
+
install_hosts.each do |host|
|
540
|
+
on host, puppet_agent('-t'), :acceptable_exit_codes => [0,2]
|
541
|
+
|
542
|
+
# Workaround for PE-1105 when deploying 3.0.0
|
543
|
+
# The installer did not respect our database host answers in 3.0.0,
|
544
|
+
# and would cause puppetdb to be bounced by the agent run. By sleeping
|
545
|
+
# again here, we ensure that if that bounce happens during an upgrade
|
546
|
+
# test we won't fail early in the install process.
|
547
|
+
if host['pe_ver'] == '3.0.0' and host == database
|
548
|
+
sleep_until_puppetdb_started(database)
|
549
|
+
end
|
550
|
+
end
|
529
551
|
|
530
|
-
|
531
|
-
|
532
|
-
on host, puppet_agent('-t'), :acceptable_exit_codes => [0,2]
|
533
|
-
|
534
|
-
# Workaround for PE-1105 when deploying 3.0.0
|
535
|
-
# The installer did not respect our database host answers in 3.0.0,
|
536
|
-
# and would cause puppetdb to be bounced by the agent run. By sleeping
|
537
|
-
# again here, we ensure that if that bounce happens during an upgrade
|
538
|
-
# test we won't fail early in the install process.
|
539
|
-
if host['pe_ver'] == '3.0.0' and host == database
|
540
|
-
sleep_until_puppetdb_started(database)
|
552
|
+
install_hosts.each do |host|
|
553
|
+
wait_for_host_in_dashboard(host)
|
541
554
|
end
|
542
|
-
end
|
543
555
|
|
544
|
-
|
545
|
-
|
546
|
-
|
556
|
+
if pre30master
|
557
|
+
task = 'nodegroup:add_all_nodes group=default'
|
558
|
+
else
|
559
|
+
task = 'defaultgroup:ensure_default_group'
|
560
|
+
end
|
561
|
+
on dashboard, "/opt/puppet/bin/rake -sf /opt/puppet/share/puppet-dashboard/Rakefile #{task} RAILS_ENV=production"
|
547
562
|
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
task = 'defaultgroup:ensure_default_group'
|
563
|
+
# Now that all hosts are in the dashbaord, run puppet one more
|
564
|
+
# time to configure mcollective
|
565
|
+
on install_hosts, puppet_agent('-t'), :acceptable_exit_codes => [0,2]
|
552
566
|
end
|
553
|
-
on dashboard, "/opt/puppet/bin/rake -sf /opt/puppet/share/puppet-dashboard/Rakefile #{task} RAILS_ENV=production"
|
554
|
-
|
555
|
-
# Now that all hosts are in the dashbaord, run puppet one more
|
556
|
-
# time to configure mcollective
|
557
|
-
on install_hosts, puppet_agent('-t'), :acceptable_exit_codes => [0,2]
|
558
567
|
end
|
559
568
|
|
560
569
|
#Perform a Puppet Enterprise Higgs install up until web browser interaction is required, runs on linux hosts only.
|
@@ -620,7 +629,10 @@ module Beaker
|
|
620
629
|
#
|
621
630
|
# @!visibility private
|
622
631
|
def sorted_hosts
|
623
|
-
special_nodes = [
|
632
|
+
special_nodes = []
|
633
|
+
[master, database, dashboard].uniq.each do |host|
|
634
|
+
special_nodes << host if host != nil
|
635
|
+
end
|
624
636
|
real_agents = agents - special_nodes
|
625
637
|
special_nodes + real_agents
|
626
638
|
end
|
@@ -815,10 +827,15 @@ module Beaker
|
|
815
827
|
# @return nil
|
816
828
|
# @api private
|
817
829
|
def install_puppet_from_dmg( host, opts )
|
830
|
+
|
818
831
|
puppet_ver = opts[:version]
|
819
832
|
facter_ver = opts[:facter_version]
|
820
833
|
hiera_ver = opts[:hiera_version]
|
821
834
|
|
835
|
+
if [puppet_ver, facter_ver, hiera_ver].include?(nil)
|
836
|
+
raise "You need to specify versions for OSX host\n eg. install_puppet({:version => '3.6.2',:facter_version => '2.1.0',:hiera_version => '1.3.4',})"
|
837
|
+
end
|
838
|
+
|
822
839
|
on host, "curl -O #{opts[:mac_download_url]}/puppet-#{puppet_ver}.dmg"
|
823
840
|
on host, "curl -O #{opts[:mac_download_url]}/facter-#{facter_ver}.dmg"
|
824
841
|
on host, "curl -O #{opts[:mac_download_url]}/hiera-#{hiera_ver}.dmg"
|
@@ -1113,6 +1130,30 @@ module Beaker
|
|
1113
1130
|
end
|
1114
1131
|
end
|
1115
1132
|
|
1133
|
+
# Installs packages from the local development repository on the given host
|
1134
|
+
#
|
1135
|
+
# @param [Host] host An object implementing {Beaker::Hosts}'s
|
1136
|
+
# interface.
|
1137
|
+
# @param [Regexp] package_name The name of the package whose repository is
|
1138
|
+
# being installed.
|
1139
|
+
#
|
1140
|
+
# @note This method only works on redhat-like and debian-like hosts.
|
1141
|
+
# @note This method is paired to be run directly after {#install_puppetlabs_dev_repo}
|
1142
|
+
#
|
1143
|
+
def install_packages_from_local_dev_repo( host, package_name )
|
1144
|
+
if host['platform'] =~ /debian|ubuntu|cumulus/
|
1145
|
+
find_filename = '*.deb'
|
1146
|
+
find_command = 'dpkg -i'
|
1147
|
+
elsif host['platform'] =~ /fedora|el|centos/
|
1148
|
+
find_filename = '*.rpm'
|
1149
|
+
find_command = 'rpm -ivh'
|
1150
|
+
else
|
1151
|
+
raise "No repository installation step for #{host['platform']} yet..."
|
1152
|
+
end
|
1153
|
+
find_command = "find /root/#{package_name} -type f -name '#{find_filename}' -exec #{find_command} {} \\;"
|
1154
|
+
on host, find_command
|
1155
|
+
end
|
1156
|
+
|
1116
1157
|
# Install development repo of the puppet-agent on the given host
|
1117
1158
|
#
|
1118
1159
|
# @param [Host] host An object implementing {Beaker::Hosts}'s interface
|
data/lib/beaker/dsl/roles.rb
CHANGED
@@ -31,10 +31,11 @@ module Beaker
|
|
31
31
|
|
32
32
|
# The host for which ['roles'] include 'master'.
|
33
33
|
# If no host has the 'master' role, then use the host defined as 'default'.
|
34
|
-
# If no host is defined as a 'master' and there is no 'default' host defined
|
35
|
-
#
|
34
|
+
# If no host is defined as a 'master' and there is no 'default' host defined
|
35
|
+
# then it either raises an error (has a master),
|
36
|
+
# or it returns nil (masterless)
|
36
37
|
#
|
37
|
-
# @return [
|
38
|
+
# @return [Host] Returns the host, or nil if not found & masterless
|
38
39
|
# @raise [Beaker::DSL::Outcomes::FailTest] if there are less
|
39
40
|
# or more than 1 master is found.
|
40
41
|
#
|
@@ -42,33 +43,33 @@ module Beaker
|
|
42
43
|
# on, master, 'cat /etc/puppet/puppet.conf'
|
43
44
|
#
|
44
45
|
def master
|
45
|
-
|
46
|
+
find_host_with_role :master
|
46
47
|
end
|
47
48
|
|
48
49
|
# The host for which ['roles'] include 'database'
|
49
50
|
#
|
50
|
-
# @return [
|
51
|
-
# @raise [Beaker::DSL::Outcomes::FailTest] if there are
|
52
|
-
#
|
51
|
+
# @return [Host] Returns the host, or nil if not found & masterless
|
52
|
+
# @raise [Beaker::DSL::Outcomes::FailTest] if there are an inappropriate
|
53
|
+
# number of hosts found (depends on masterless option)
|
53
54
|
#
|
54
55
|
# @example Basic usage
|
55
56
|
# on, agent, "curl -k http://#{database}:8080"
|
56
57
|
#
|
57
58
|
def database
|
58
|
-
|
59
|
+
find_host_with_role :database
|
59
60
|
end
|
60
61
|
|
61
62
|
# The host for which ['roles'] include 'dashboard'
|
62
63
|
#
|
63
|
-
# @return [
|
64
|
-
# @raise [Beaker::DSL::Outcomes::FailTest] if there are
|
65
|
-
#
|
64
|
+
# @return [Host] Returns the host, or nil if not found & masterless
|
65
|
+
# @raise [Beaker::DSL::Outcomes::FailTest] if there are an inappropriate
|
66
|
+
# number of hosts found (depends on masterless option)
|
66
67
|
#
|
67
68
|
# @example Basic usage
|
68
69
|
# on, agent, "curl https://#{database}/nodes/#{agent}"
|
69
70
|
#
|
70
71
|
def dashboard
|
71
|
-
|
72
|
+
find_host_with_role :dashboard
|
72
73
|
end
|
73
74
|
|
74
75
|
# The default host
|
@@ -78,14 +79,15 @@ module Beaker
|
|
78
79
|
# OR
|
79
80
|
# - host with 'master' as a role
|
80
81
|
#
|
81
|
-
# @return [
|
82
|
-
# @raise [Beaker::DSL::Outcomes::FailTest] if
|
82
|
+
# @return [Host] Returns the host, or nil if not found & masterless
|
83
|
+
# @raise [Beaker::DSL::Outcomes::FailTest] if there are an inappropriate
|
84
|
+
# number of hosts found (depends on masterless option)
|
83
85
|
#
|
84
86
|
# @example Basic usage
|
85
87
|
# on, default, "curl https://#{database}/nodes/#{agent}"
|
86
88
|
#
|
87
89
|
def default
|
88
|
-
|
90
|
+
find_host_with_role :default
|
89
91
|
end
|
90
92
|
|
91
93
|
#Create a new role method for a given arbitrary role name. Makes it possible to be able to run
|
@@ -147,6 +149,22 @@ module Beaker
|
|
147
149
|
hosts_with_role(hosts, desired_role)
|
148
150
|
end
|
149
151
|
|
152
|
+
# finds the appropriate number of hosts for a given role
|
153
|
+
# determines whether to allow no server using the masterless option
|
154
|
+
#
|
155
|
+
# @param [Symbol, String] role The role to find a host for
|
156
|
+
# @return [Host] Returns the host, or nil if masterless and none are found
|
157
|
+
# for that role
|
158
|
+
# @raise Throws an exception if an inappropriate number of hosts are found
|
159
|
+
# for that role
|
160
|
+
def find_host_with_role role
|
161
|
+
if (defined? options) && options[:masterless]
|
162
|
+
find_at_most_one role
|
163
|
+
else
|
164
|
+
find_only_one role
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
150
168
|
# @param [Symbol, String] role The role to find a host for
|
151
169
|
# @return [Host] Returns the host, if one and only one is found
|
152
170
|
# @raise Raises a failure exception if one and only one host that matches
|
@@ -156,6 +174,16 @@ module Beaker
|
|
156
174
|
rescue ArgumentError => e
|
157
175
|
raise DSL::Outcomes::FailTest, e.to_s
|
158
176
|
end
|
177
|
+
|
178
|
+
# @param [Symbol, String] role The role to find a host for
|
179
|
+
# @return [Host] Returns the host, or nil if not found
|
180
|
+
# @raise Raises a failure exception if more than one host that matches
|
181
|
+
# the specified role is found.
|
182
|
+
def find_at_most_one role
|
183
|
+
find_at_most_one_host_with_role(hosts, role)
|
184
|
+
rescue ArgumentError => e
|
185
|
+
raise DSL::Outcomes::FailTest, e.to_s
|
186
|
+
end
|
159
187
|
end
|
160
188
|
end
|
161
189
|
end
|
data/lib/beaker/host.rb
CHANGED
@@ -49,6 +49,7 @@ module Beaker
|
|
49
49
|
# related through 'type' and the differences between the assumption of our two
|
50
50
|
# configurations we have for many of our products
|
51
51
|
type = @options.get_type
|
52
|
+
type = :foss if type == :aio && !@options['HOSTS'][@name]['roles'].include?('agent')
|
52
53
|
@defaults = merge_defaults_for_type @options, type
|
53
54
|
pkg_initialize
|
54
55
|
end
|
@@ -227,7 +227,7 @@ module Beaker
|
|
227
227
|
# @param [Hash{Symbol=>String}] opts Options to alter execution.
|
228
228
|
# @option opts [Boolean] :debug If true, print verbose rpm information when installing EPEL
|
229
229
|
# @option opts [Beaker::Logger] :logger A {Beaker::Logger} object
|
230
|
-
# @option opts [String] :epel_url Link to download from
|
230
|
+
# @option opts [String] :epel_url Link to download from
|
231
231
|
# @option opts [String] :epel_arch Architecture of epel to download (i386, x86_64, etc)
|
232
232
|
# @option opts [String] :epel_6_pkg Package to download from provided link for el-6
|
233
233
|
# @option opts [String] :epel_5_pkg Package to download from provided link for el-5
|
@@ -299,6 +299,8 @@ module Beaker
|
|
299
299
|
if host['platform'] =~ /windows/
|
300
300
|
host.exec(Command.new('cp -r .ssh /cygdrive/c/Users/Administrator/.'))
|
301
301
|
host.exec(Command.new('chown -R Administrator /cygdrive/c/Users/Administrator/.ssh'))
|
302
|
+
elsif host['platform'] =~ /osx/
|
303
|
+
host.exec(Command.new('sudo cp -r .ssh /var/root/.'), {:pty => true})
|
302
304
|
else
|
303
305
|
host.exec(Command.new('sudo su -c "cp -r .ssh /root/."'), {:pty => true})
|
304
306
|
end
|
@@ -332,13 +334,17 @@ module Beaker
|
|
332
334
|
block_on host do |host|
|
333
335
|
logger.debug "Update /etc/ssh/sshd_config to allow root login"
|
334
336
|
# note: this sed command only works on gnu sed
|
335
|
-
host
|
336
|
-
|
337
|
+
if host['platform'] =~ /osx/
|
338
|
+
host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /etc/sshd_config"))
|
339
|
+
host.exec(Command.new("sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /etc/sshd_config"))
|
340
|
+
else
|
341
|
+
host.exec(Command.new("sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\""), {:pty => true})
|
342
|
+
end
|
337
343
|
#restart sshd
|
338
344
|
if host['platform'] =~ /debian|ubuntu|cumulus/
|
339
345
|
host.exec(Command.new("sudo su -c \"service ssh restart\""), {:pty => true})
|
340
346
|
elsif host['platform'] =~ /centos|el-|redhat|fedora|eos/
|
341
|
-
host.exec(Command.new("sudo -E /sbin/service sshd restart"))
|
347
|
+
host.exec(Command.new("sudo -E /sbin/service sshd restart"), {:pty => true})
|
342
348
|
else
|
343
349
|
@logger.warn("Attempting to update ssh on non-supported platform: #{host.name}: #{host['platform']}")
|
344
350
|
end
|
@@ -238,8 +238,8 @@ module Beaker
|
|
238
238
|
@hosts.each do |host|
|
239
239
|
amitype = host['vmname'] || host['platform']
|
240
240
|
amisize = host['amisize'] || 'm1.small'
|
241
|
-
subnet_id = host['subnet_id'] || nil
|
242
|
-
vpc_id = host['vpc_id'] || nil
|
241
|
+
subnet_id = host['subnet_id'] || @options['subnet_id'] || nil
|
242
|
+
vpc_id = host['vpc_id'] || @options['vpc_id'] || nil
|
243
243
|
|
244
244
|
if vpc_id and !subnet_id
|
245
245
|
raise RuntimeError, "A subnet_id must be provided with a vpc_id"
|
@@ -256,7 +256,18 @@ module Beaker
|
|
256
256
|
# Main region object for ec2 operations
|
257
257
|
region = @ec2.regions[ami_region]
|
258
258
|
|
259
|
-
#
|
259
|
+
# If we haven't defined a vpc_id then we use the default vpc for the provided region
|
260
|
+
if !vpc_id
|
261
|
+
@logger.notify("aws-sdk: filtering available vpcs in region by 'isDefault")
|
262
|
+
filtered_vpcs = region.client.describe_vpcs(:filters => [{:name => 'isDefault', :values => ['true']}])
|
263
|
+
if !filtered_vpcs[:vpc_set].empty?
|
264
|
+
vpc_id = filtered_vpcs[:vpc_set].first[:vpc_id]
|
265
|
+
else #there's no default vpc, use nil
|
266
|
+
vpc_id = nil
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# Grab the vpc object based upon provided id
|
260
271
|
vpc = vpc_id ? region.vpcs[vpc_id] : nil
|
261
272
|
|
262
273
|
# Grab image object
|
@@ -276,6 +287,8 @@ module Beaker
|
|
276
287
|
block_device_mappings << {
|
277
288
|
:device_name => device_name,
|
278
289
|
:ebs => {
|
290
|
+
# Change the default size of the root volume.
|
291
|
+
:volume_size => host['volume_size'] || rest[:volume_size],
|
279
292
|
# This is required to override the images default for
|
280
293
|
# delete_on_termination, forcing all volumes to be deleted once the
|
281
294
|
# instance is terminated.
|
@@ -284,6 +297,8 @@ module Beaker
|
|
284
297
|
}
|
285
298
|
end
|
286
299
|
|
300
|
+
security_group = ensure_group(vpc || region, Beaker::EC2Helper.amiports(host))
|
301
|
+
|
287
302
|
# Launch the node, filling in the blanks from previous work.
|
288
303
|
@logger.notify("aws-sdk: Launch instance")
|
289
304
|
config = {
|
@@ -291,7 +306,7 @@ module Beaker
|
|
291
306
|
:image_id => image_id,
|
292
307
|
:monitoring_enabled => true,
|
293
308
|
:key_pair => ensure_key_pair(region),
|
294
|
-
:security_groups => [
|
309
|
+
:security_groups => [security_group],
|
295
310
|
:instance_type => amisize,
|
296
311
|
:disable_api_termination => false,
|
297
312
|
:instance_initiated_shutdown_behavior => "terminate",
|
@@ -527,20 +542,20 @@ module Beaker
|
|
527
542
|
|
528
543
|
# Return an existing group, or create new one
|
529
544
|
#
|
530
|
-
# Accepts a
|
545
|
+
# Accepts a VPC as input for checking & creation.
|
531
546
|
#
|
532
|
-
# @param
|
547
|
+
# @param vpc [AWS::EC2::VPC] the AWS vpc control object
|
533
548
|
# @param ports [Array<Number>] an array of port numbers
|
534
549
|
# @return [AWS::EC2::SecurityGroup] created security group
|
535
550
|
# @api private
|
536
|
-
def ensure_group(
|
551
|
+
def ensure_group(vpc, ports)
|
537
552
|
@logger.notify("aws-sdk: Ensure security group exists for ports #{ports.to_s}, create if not")
|
538
553
|
name = group_id(ports)
|
539
554
|
|
540
|
-
group =
|
555
|
+
group = vpc.security_groups.filter('group-name', name).first
|
541
556
|
|
542
557
|
if group.nil?
|
543
|
-
group = create_group(
|
558
|
+
group = create_group(vpc, ports)
|
544
559
|
end
|
545
560
|
|
546
561
|
group
|