beaker 1.11.0 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +8 -8
  2. data/lib/beaker/answers/version30.rb +1 -1
  3. data/lib/beaker/cli.rb +13 -2
  4. data/lib/beaker/dsl/helpers.rb +6 -6
  5. data/lib/beaker/dsl/install_utils.rb +18 -5
  6. data/lib/beaker/host/unix.rb +1 -1
  7. data/lib/beaker/host/unix/pkg.rb +1 -1
  8. data/lib/beaker/host/windows/pkg.rb +3 -3
  9. data/lib/beaker/host_prebuilt_steps.rb +6 -6
  10. data/lib/beaker/hypervisor.rb +3 -3
  11. data/lib/beaker/hypervisor/blimper.rb +3 -3
  12. data/lib/beaker/hypervisor/docker.rb +4 -8
  13. data/lib/beaker/hypervisor/fusion.rb +3 -3
  14. data/lib/beaker/hypervisor/google_compute.rb +17 -7
  15. data/lib/beaker/hypervisor/google_compute_helper.rb +1 -1
  16. data/lib/beaker/hypervisor/solaris.rb +1 -1
  17. data/lib/beaker/hypervisor/vagrant.rb +1 -1
  18. data/lib/beaker/hypervisor/vcloud.rb +1 -1
  19. data/lib/beaker/hypervisor/vcloud_pooled.rb +3 -3
  20. data/lib/beaker/hypervisor/vsphere.rb +1 -1
  21. data/lib/beaker/logger.rb +14 -14
  22. data/lib/beaker/network_manager.rb +5 -5
  23. data/lib/beaker/options/command_line_parser.rb +12 -13
  24. data/lib/beaker/options/hosts_file_parser.rb +1 -1
  25. data/lib/beaker/options/options_file_parser.rb +4 -4
  26. data/lib/beaker/options/parser.rb +11 -5
  27. data/lib/beaker/options/pe_version_scraper.rb +2 -2
  28. data/lib/beaker/platform.rb +4 -4
  29. data/lib/beaker/shared/error_handler.rb +2 -2
  30. data/lib/beaker/shared/host_role_parser.rb +7 -7
  31. data/lib/beaker/ssh_connection.rb +2 -2
  32. data/lib/beaker/test_suite.rb +1 -1
  33. data/lib/beaker/version.rb +1 -1
  34. data/spec/beaker/hypervisor/docker_spec.rb +19 -13
  35. data/spec/beaker/options/command_line_parser_spec.rb +2 -2
  36. data/spec/beaker/options/parser_spec.rb +108 -85
  37. metadata +2 -2
@@ -131,7 +131,7 @@ module Beaker
131
131
  @logger.notify 'Spent %.2f seconds deploying VMs' % (Time.now - start)
132
132
 
133
133
  try = (Time.now - start) / 5
134
- duration = run_and_report_duration do
134
+ duration = run_and_report_duration do
135
135
  @hosts.each_with_index do |h, i|
136
136
  booting_host(h, try, attempts)
137
137
  end
@@ -2,7 +2,7 @@ require 'yaml' unless defined?(YAML)
2
2
  require 'json'
3
3
  require 'net/http'
4
4
 
5
- module Beaker
5
+ module Beaker
6
6
  class VcloudPooled < Beaker::Hypervisor
7
7
  SSH_EXCEPTIONS = [
8
8
  SocketError,
@@ -75,7 +75,7 @@ module Beaker
75
75
  attempts = @options[:timeout].to_i / 5
76
76
  response = http.request(request)
77
77
  parsed_response = JSON.parse(response.body)
78
- if parsed_response[h['template']] && parsed_response[h['template']]['ok'] && parsed_response[h['template']]['hostname']
78
+ if parsed_response[h['template']] && parsed_response[h['template']]['ok'] && parsed_response[h['template']]['hostname']
79
79
  h['vmhostname'] = parsed_response[h['template']]['hostname']
80
80
  else
81
81
  raise "VcloudPooled.provision - no vCloud host free for #{h.name} in pool"
@@ -115,7 +115,7 @@ module Beaker
115
115
  rescue *SSH_EXCEPTIONS => e
116
116
  report_and_raise(@logger, e, 'vCloudPooled.cleanup (http.request)')
117
117
  end
118
- end
118
+ end
119
119
 
120
120
  @logger.notify "Spent %.2f seconds cleaning up" % (Time.now - start)
121
121
  end
@@ -1,6 +1,6 @@
1
1
  require 'yaml' unless defined?(YAML)
2
2
 
3
- module Beaker
3
+ module Beaker
4
4
  class Vsphere < Beaker::Hypervisor
5
5
 
6
6
  def initialize(vsphere_hosts, options)
data/lib/beaker/logger.rb CHANGED
@@ -42,7 +42,7 @@ module Beaker
42
42
  # Initialize a Logger object that reports to the provided destinations, use options from provided option hash
43
43
  # @param [Array<String, IO>] Array of IO and strings (assumed to be file paths) to be reported to
44
44
  # @param [Hash] options Hash of options
45
- # @option options [Boolean] :color (true) Print color code before log messages
45
+ # @option options [Boolean] :color (true) Print color code before log messages
46
46
  # @option options [Boolean] :quiet (false) Do not log messages to STDOUT
47
47
  # @option options [String] :log_level ("info") Log level (one of "debug" - highest level, "verbose", "info",
48
48
  # "notify" and "warn" - lowest level (see {LOG_LEVELS})) The log level indicates that messages at that
@@ -128,8 +128,8 @@ module Beaker
128
128
  LOG_LEVELS[@log_level] >= LOG_LEVELS[:notify]
129
129
  end
130
130
 
131
- # Custom reporting for messages generated by host SUTs.
132
- # Will not print unless we are at {LOG_LEVELS} 'verbose' or higher.
131
+ # Custom reporting for messages generated by host SUTs.
132
+ # Will not print unless we are at {LOG_LEVELS} 'verbose' or higher.
133
133
  # Strips any color codes already in the provided messages, then adds logger color codes before reporting
134
134
  # @param args[Array<String>] Strings to be reported
135
135
  def host_output *args
@@ -139,7 +139,7 @@ module Beaker
139
139
  optionally_color GREY, string, false
140
140
  end
141
141
 
142
- # Report a debug message.
142
+ # Report a debug message.
143
143
  # Will not print unless we are at {LOG_LEVELS} 'debug' or higher.
144
144
  # @param args[Array<String>] Strings to be reported
145
145
  def debug *args
@@ -148,8 +148,8 @@ module Beaker
148
148
  end
149
149
 
150
150
  # Report a warning message.
151
- # Will not print unless we are at {LOG_LEVELS} 'warn' or higher.
152
- # Will pre-pend the message with "Warning: ".
151
+ # Will not print unless we are at {LOG_LEVELS} 'warn' or higher.
152
+ # Will pre-pend the message with "Warning: ".
153
153
  # @param args[Array<String>] Strings to be reported
154
154
  def warn *args
155
155
  return unless is_warn?
@@ -157,31 +157,31 @@ module Beaker
157
157
  optionally_color YELLOW, strings
158
158
  end
159
159
 
160
- # Report an info message.
161
- # Will not print unless we are at {LOG_LEVELS} 'info' or higher.
160
+ # Report an info message.
161
+ # Will not print unless we are at {LOG_LEVELS} 'info' or higher.
162
162
  # @param args[Array<String>] Strings to be reported
163
163
  def info *args
164
164
  return unless is_info?
165
165
  optionally_color BLUE, args
166
166
  end
167
167
 
168
- # Report a success message.
169
- # Will always be reported.
168
+ # Report a success message.
169
+ # Will always be reported.
170
170
  # @param args[Array<String>] Strings to be reported
171
171
  def success *args
172
172
  optionally_color GREEN, args
173
173
  end
174
174
 
175
- # Report a notify message.
176
- # Will not print unless we are at {LOG_LEVELS} 'notify' or higher.
175
+ # Report a notify message.
176
+ # Will not print unless we are at {LOG_LEVELS} 'notify' or higher.
177
177
  # @param args[Array<String>] Strings to be reported
178
178
  def notify *args
179
179
  return unless is_notify?
180
180
  optionally_color BRIGHT_WHITE, args
181
181
  end
182
182
 
183
- # Report an error message.
184
- # Will always be reported.
183
+ # Report an error message.
184
+ # Will always be reported.
185
185
  # @param args[Array<String>] Strings to be reported
186
186
  def error *args
187
187
  optionally_color BRIGHT_RED, args
@@ -17,9 +17,9 @@ module Beaker
17
17
  # - only if we have a hypervisor
18
18
  # - only if either the specific hosts has no specification or has 'provision' in its config
19
19
  # - always if it is a vagrant box (vagrant boxes are always provisioned as they always need ssh key hacking)
20
- def provision? options, host
21
- command_line_says = options[:provision]
22
- host_says = host['hypervisor'] && (host.has_key?('provision') ? host['provision'] : true)
20
+ def provision? options, host
21
+ command_line_says = options[:provision]
22
+ host_says = host['hypervisor'] && (host.has_key?('provision') ? host['provision'] : true)
23
23
  (command_line_says && host_says) or (host['hypervisor'] =~/vagrant/)
24
24
  end
25
25
 
@@ -38,10 +38,10 @@ module Beaker
38
38
  cleanup
39
39
  end
40
40
  @hypervisors = {}
41
- #sort hosts by their hypervisor, use hypervisor 'none' if no hypervisor is specified
41
+ #sort hosts by their hypervisor, use hypervisor 'none' if no hypervisor is specified
42
42
  @options['HOSTS'].each_key do |name|
43
43
  host = @options['HOSTS'][name]
44
- hypervisor = host['hypervisor']
44
+ hypervisor = host['hypervisor']
45
45
  hypervisor = provision?(@options, host) ? host['hypervisor'] : 'none'
46
46
  @logger.debug "Hypervisor for #{name} is #{hypervisor}"
47
47
  @machines[hypervisor] = [] unless @machines[hypervisor]
@@ -4,8 +4,8 @@ module Beaker
4
4
  class CommandLineParser
5
5
 
6
6
  # @example Create a CommanLineParser
7
- # a = CommandLineParser.new
8
- #
7
+ # a = CommandLineParser.new
8
+ #
9
9
  # @note All of Beaker's supported command line options are defined here
10
10
  def initialize
11
11
  @cmd_options = Beaker::Options::OptionsHash.new
@@ -95,7 +95,7 @@ module Beaker
95
95
  end
96
96
 
97
97
  opts.on '-i URI', '--install URI',
98
- 'Install a project repo/app on the SUTs',
98
+ 'Install a project repo/app on the SUTs',
99
99
  'Provide full git URI or use short form KEYWORD/name',
100
100
  'supported keywords: PUPPET, FACTER, HIERA, HIERA-PUPPET' do |value|
101
101
  @cmd_options[:install] = value
@@ -176,15 +176,15 @@ module Beaker
176
176
  @cmd_options[:validate] = bool
177
177
  end
178
178
 
179
- opts.on('--version', 'Report currently running version of beaker' ) do
179
+ opts.on('--version', 'Report currently running version of beaker' ) do
180
180
  @cmd_options[:version] = true
181
181
  end
182
182
 
183
- opts.on('--parse-only', 'Display beaker parsed options and exit' ) do
183
+ opts.on('--parse-only', 'Display beaker parsed options and exit' ) do
184
184
  @cmd_options[:parse_only] = true
185
185
  end
186
186
 
187
- opts.on('--help', 'Display this screen' ) do
187
+ opts.on('--help', 'Display this screen' ) do
188
188
  @cmd_options[:help] = true
189
189
  end
190
190
 
@@ -208,25 +208,24 @@ module Beaker
208
208
  # @example
209
209
  # args = ['--option', 'value', '--option2', 'value2', '--switch']
210
210
  # parser = CommandLineParser.new
211
- # parser.parse!(args) == {:option => 'value, :options2 => value, :switch => true}
211
+ # parser.parse(args) == {:option => 'value, :options2 => value, :switch => true}
212
212
  #
213
213
  # @return [Hash] Return the Hash of options
214
- def parse!( args = ARGV )
215
- @optparse.parse!(args)
214
+ def parse( args = ARGV )
215
+ @optparse.parse(args)
216
216
  @cmd_options
217
217
  end
218
218
 
219
219
  # Generate a string representing the supported arguments
220
220
  #
221
- # @example
222
- # parser = CommandLineParser.new
223
- # parser.usage = "Options: ..."
221
+ # @example
222
+ # parser = CommandLineParser.new
223
+ # parser.usage = "Options: ..."
224
224
  #
225
225
  # @return [String] Return a string representing the available arguments
226
226
  def usage
227
227
  @optparse.help
228
228
  end
229
-
230
229
  end
231
230
  end
232
231
  end
@@ -6,7 +6,7 @@ module Beaker
6
6
  # Read the contents of the hosts.cfg into an OptionsHash, merge the 'CONFIG' section into the OptionsHash, return OptionsHash
7
7
  # @param [String] hosts_file_path The path to the hosts file
8
8
  #
9
- # @example
9
+ # @example
10
10
  # hosts_hash = HostsFileParser.parse_hosts_file('sample.cfg')
11
11
  # hosts_hash == {:HOSTS=>{:"pe-ubuntu-lucid"=>{:roles=>["agent", "dashboard", "database", "master"], ... }
12
12
  #
@@ -8,22 +8,22 @@ module Beaker
8
8
  #
9
9
  # Options file is assumed to contain extra options stored in a Hash
10
10
  #
11
- # ie,
11
+ # ie,
12
12
  # {
13
13
  # :debug => true,
14
14
  # :tests => "test.rb",
15
15
  # }
16
- #
16
+ #
17
17
  # @param [String] options_file_path The path to the options file
18
18
  #
19
- # @example
19
+ # @example
20
20
  # options_hash = OptionsFileParser.parse_options_file('sample.cfg')
21
21
  # options_hash == {:debug=>true, :tests=>"test.rb", :pre_suite=>["pre-suite.rb"], :post_suite=>"post_suite1.rb,post_suite2.rb"}
22
22
  #
23
23
  # @return [OptionsHash] The contents of the options file as an OptionsHash
24
24
  # @raise [ArgumentError] Raises if options_file_path is not a path to a file
25
25
  # @note Since the options_file is Eval'ed, any other Ruby commands will also be executed, this can be used
26
- # to set additional environment variables
26
+ # to set additional environment variables
27
27
  def self.parse_options_file(options_file_path)
28
28
  result = Beaker::Options::OptionsHash.new
29
29
  if options_file_path
@@ -5,7 +5,7 @@ module Beaker
5
5
  #An Object that parses, merges and normalizes all supported Beaker options and arguments
6
6
  class Parser
7
7
  GITREPO = 'git://github.com/puppetlabs'
8
- #These options can have the form of arg1,arg2 or [arg] or just arg,
8
+ #These options can have the form of arg1,arg2 or [arg] or just arg,
9
9
  #should default to []
10
10
  LONG_OPTS = [:helper, :load_path, :tests, :pre_suite, :post_suite, :install, :modules]
11
11
  #These options expand out into an array of .rb files
@@ -139,29 +139,35 @@ module Beaker
139
139
  # @param [Array] args ARGV or a provided arguments array
140
140
  # @raise [ArgumentError] Raises error on bad input
141
141
  def parse_args(args = ARGV)
142
- #NOTE on argument precedence:
143
- #
142
+ # NOTE on argument precedence:
144
143
  # Will use env, then hosts/config file, then command line, then file options
145
- #
144
+
145
+
146
146
  @options = Beaker::Options::Presets.presets
147
- cmd_line_options = @command_line_parser.parse!(args)
147
+ cmd_line_options = @command_line_parser.parse(args)
148
148
  file_options = Beaker::Options::OptionsFileParser.parse_options_file(cmd_line_options[:options_file])
149
+
149
150
  # merge together command line and file_options
150
151
  # overwrite file options with command line options
151
152
  cmd_line_and_file_options = file_options.merge(cmd_line_options)
153
+
152
154
  # merge command line and file options with defaults
153
155
  # overwrite defaults with command line and file options
154
156
  @options = @options.merge(cmd_line_and_file_options)
157
+ @options[:command_line] = ([$0] + args).join(' ')
155
158
 
156
159
  if not @options[:help] and not @options[:version]
157
160
  #read the hosts file that contains the node configuration and hypervisor info
158
161
  hosts_options = Beaker::Options::HostsFileParser.parse_hosts_file(@options[:hosts_file])
162
+
159
163
  # merge in host file vars
160
164
  # overwrite options (default, file options, command line, env) with host file options
161
165
  @options = @options.merge(hosts_options)
166
+
162
167
  # merge in env vars
163
168
  # overwrite options (default, file options, command line, hosts file) with env
164
169
  env_vars = Beaker::Options::Presets.env_vars
170
+
165
171
  @options = @options.merge(env_vars)
166
172
 
167
173
  normalize_args
@@ -8,11 +8,11 @@ module Beaker
8
8
  # Version file is of the format
9
9
  #
10
10
  # 3.0.1-3-g57b669e
11
- #
11
+ #
12
12
  # @param [String] dist_dir The directory containing the version_file
13
13
  # @param [String] version_file The file to scrape
14
14
  #
15
- # @return [String, nil] The PE version in the version_file or nil if not found
15
+ # @return [String, nil] The PE version in the version_file or nil if not found
16
16
  # @raise [ArgumentError] Raises if version_file does not exist or cannot be opened
17
17
  def self.load_pe_version dist_dir, version_file
18
18
  version = nil
@@ -1,15 +1,15 @@
1
1
  module Beaker
2
- #This class create a Platform object inheriting from String. It supports all String methods while adding
2
+ #This class create a Platform object inheriting from String. It supports all String methods while adding
3
3
  #several platform-specific use cases.
4
4
  class Platform < String
5
5
  #Supported platforms
6
- PLATFORMS = /^(centos|fedora|debian|oracle|redhat|scientific|sles|ubuntu|windows|solaris|aix|el)\-.+\-.+$/
6
+ PLATFORMS = /^(osx|centos|fedora|debian|oracle|redhat|scientific|sles|ubuntu|windows|solaris|aix|el)\-.+\-.+$/
7
7
  #Platform version numbers vs. codenames conversion hash
8
- PLATFORM_VERSION_CODES =
8
+ PLATFORM_VERSION_CODES =
9
9
  { :debian => { "wheezy" => "7",
10
10
  "squeeze" => "6",
11
11
  },
12
- :ubuntu => { "trusty" => "1404",
12
+ :ubuntu => { "trusty" => "1404",
13
13
  "saucy" => "1310",
14
14
  "raring" => "1304",
15
15
  "quantal" => "1210",
@@ -1,4 +1,4 @@
1
- module Beaker
1
+ module Beaker
2
2
  module Shared
3
3
  module ErrorHandler
4
4
 
@@ -8,7 +8,7 @@ module Beaker
8
8
  bt = e.backtrace
9
9
  logger.pretty_backtrace(bt).each_line do |line|
10
10
  logger.error(line)
11
- end
11
+ end
12
12
  raise e
13
13
  end
14
14
 
@@ -1,4 +1,4 @@
1
- module Beaker
1
+ module Beaker
2
2
  module Shared
3
3
  #Methods for selecting host or hosts that match roles.
4
4
  module HostRoleParser
@@ -11,25 +11,25 @@ module Beaker
11
11
  hosts.select do |host|
12
12
  desired_role.nil? or host['roles'].include?(desired_role.to_s)
13
13
  end
14
- end
14
+ end
15
15
 
16
- #Find a single host with the role provided. Raise an error if more than one host is found to have the
16
+ #Find a single host with the role provided. Raise an error if more than one host is found to have the
17
17
  #provided role.
18
18
  #@param [Array<Host>] hosts The hosts to examine
19
19
  #@param [String] role The host returned will have this role in its role list
20
20
  #@return [Host] The single host with the desired role in its roles list
21
- #@raise [ArgumentError] Raised if more than one host has the given role defined, or if no host has the
21
+ #@raise [ArgumentError] Raised if more than one host has the given role defined, or if no host has the
22
22
  # role defined.
23
23
  def only_host_with_role(hosts, role)
24
24
  a_host = hosts_with_role(hosts, role)
25
- case
25
+ case
26
26
  when a_host.length == 0
27
27
  raise ArgumentError, "There should be one host with #{role} defined!"
28
28
  when a_host.length > 1
29
29
  host_string = ( a_host.map { |host| host.name } ).join( ', ')
30
- raise ArgumentError, "There should be only one host with #{role} defined, but I found #{a_host.length} (#{host_string})"
30
+ raise ArgumentError, "There should be only one host with #{role} defined, but I found #{a_host.length} (#{host_string})"
31
31
  end
32
- a_host.first
32
+ a_host.first
33
33
  end
34
34
  end
35
35
  end
@@ -57,7 +57,7 @@ module Beaker
57
57
  begin
58
58
  @ssh.close if @ssh
59
59
  rescue
60
- @ssh.shutdown!
60
+ @ssh.shutdown!
61
61
  end
62
62
  @ssh = nil
63
63
  end
@@ -103,7 +103,7 @@ module Beaker
103
103
  attempt = false
104
104
  puts "Command execution failed, attempting to reconnect to #{@hostname}"
105
105
  close
106
- connect
106
+ connect
107
107
  retry
108
108
  else
109
109
  raise
@@ -38,7 +38,7 @@ module Beaker
38
38
  @run = true
39
39
  @start_time = Time.now
40
40
 
41
- configure_logging
41
+ configure_logging
42
42
 
43
43
  @test_files.each do |test_file|
44
44
  @logger.notify
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '1.11.0'
3
+ STRING = '1.11.1'
4
4
  end
5
5
  end
@@ -116,21 +116,10 @@ module Beaker
116
116
  docker.provision
117
117
  end
118
118
 
119
- it 'should tag the Image with the host.name' do
120
- hosts.each do |host|
121
- image.should_receive(:tag).with({
122
- :repo => host.name,
123
- :force => true,
124
- })
125
- end
126
-
127
- docker.provision
128
- end
129
-
130
- it 'should create a container based on the Image (identified by host.name)' do
119
+ it 'should create a container based on the Image (identified by image.id)' do
131
120
  hosts.each do |host|
132
121
  ::Docker::Container.should_receive(:create).with({
133
- 'Image' => host.name,
122
+ 'Image' => image.id,
134
123
  'Hostname' => host.name,
135
124
  })
136
125
  end
@@ -180,6 +169,23 @@ module Beaker
180
169
  image.should_receive(:delete)
181
170
  docker.cleanup
182
171
  end
172
+
173
+ it 'should not delete the image if docker_preserve_image is set to true' do
174
+ hosts.each do |host|
175
+ host['docker_preserve_image']=true
176
+ end
177
+ image.should_not_receive(:delete)
178
+ docker.cleanup
179
+ end
180
+
181
+ it 'should delete the image if docker_preserve_image is set to false' do
182
+ hosts.each do |host|
183
+ host['docker_preserve_image']=false
184
+ end
185
+ image.should_receive(:delete)
186
+ docker.cleanup
187
+ end
188
+
183
189
  end
184
190
 
185
191
  describe '#dockerfile_for' do