beaker 0.0.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +8 -0
  3. data/README.md +6 -6
  4. data/beaker.gemspec +6 -2
  5. data/lib/beaker.rb +1 -1
  6. data/lib/beaker/answers.rb +34 -7
  7. data/lib/beaker/answers/version20.rb +124 -0
  8. data/lib/beaker/answers/version28.rb +21 -0
  9. data/lib/beaker/answers/version30.rb +24 -5
  10. data/lib/beaker/cli.rb +55 -41
  11. data/lib/beaker/command.rb +2 -2
  12. data/lib/beaker/dsl/helpers.rb +320 -106
  13. data/lib/beaker/dsl/install_utils.rb +202 -81
  14. data/lib/beaker/dsl/roles.rb +40 -0
  15. data/lib/beaker/host.rb +28 -20
  16. data/lib/beaker/host/unix.rb +7 -4
  17. data/lib/beaker/host/unix/pkg.rb +42 -12
  18. data/lib/beaker/host/windows.rb +9 -5
  19. data/lib/beaker/host/windows/group.rb +1 -1
  20. data/lib/beaker/host/windows/pkg.rb +41 -8
  21. data/lib/beaker/hypervisor.rb +23 -10
  22. data/lib/beaker/hypervisor/aixer.rb +15 -19
  23. data/lib/beaker/hypervisor/blimper.rb +71 -72
  24. data/lib/beaker/hypervisor/fusion.rb +11 -10
  25. data/lib/beaker/hypervisor/solaris.rb +17 -23
  26. data/lib/beaker/hypervisor/vagrant.rb +27 -12
  27. data/lib/beaker/hypervisor/vcloud.rb +154 -138
  28. data/lib/beaker/hypervisor/vcloud_pooled.rb +97 -0
  29. data/lib/beaker/hypervisor/vsphere.rb +8 -5
  30. data/lib/beaker/hypervisor/vsphere_helper.rb +43 -33
  31. data/lib/beaker/network_manager.rb +16 -12
  32. data/lib/beaker/options/command_line_parser.rb +199 -0
  33. data/lib/beaker/options/hosts_file_parser.rb +39 -0
  34. data/lib/beaker/options/options_file_parser.rb +45 -0
  35. data/lib/beaker/options/options_hash.rb +294 -0
  36. data/lib/beaker/options/parser.rb +288 -0
  37. data/lib/beaker/options/pe_version_scraper.rb +35 -0
  38. data/lib/beaker/options/presets.rb +70 -0
  39. data/lib/beaker/shared.rb +2 -1
  40. data/lib/beaker/shared/host_handler.rb +7 -2
  41. data/lib/beaker/shared/repetition.rb +1 -0
  42. data/lib/beaker/shared/timed.rb +14 -0
  43. data/lib/beaker/test_case.rb +2 -38
  44. data/lib/beaker/test_suite.rb +11 -25
  45. data/lib/beaker/utils/repo_control.rb +6 -8
  46. data/lib/beaker/utils/setup_helper.rb +9 -20
  47. data/spec/beaker/answers_spec.rb +109 -0
  48. data/spec/beaker/command_spec.rb +2 -2
  49. data/spec/beaker/dsl/assertions_spec.rb +1 -3
  50. data/spec/beaker/dsl/helpers_spec.rb +519 -84
  51. data/spec/beaker/dsl/install_utils_spec.rb +265 -16
  52. data/spec/beaker/dsl/roles_spec.rb +31 -10
  53. data/spec/beaker/host/windows/group_spec.rb +55 -0
  54. data/spec/beaker/host_spec.rb +130 -40
  55. data/spec/beaker/hypervisor/aixer_spec.rb +34 -0
  56. data/spec/beaker/hypervisor/blimper_spec.rb +77 -0
  57. data/spec/beaker/hypervisor/fusion_spec.rb +26 -0
  58. data/spec/beaker/hypervisor/hypervisor_spec.rb +66 -0
  59. data/spec/beaker/hypervisor/solaris_spec.rb +39 -0
  60. data/spec/beaker/hypervisor/vagrant_spec.rb +105 -0
  61. data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +60 -0
  62. data/spec/beaker/hypervisor/vcloud_spec.rb +70 -0
  63. data/spec/beaker/hypervisor/vsphere_helper_spec.rb +162 -0
  64. data/spec/beaker/hypervisor/vsphere_spec.rb +76 -0
  65. data/spec/beaker/options/command_line_parser_spec.rb +25 -0
  66. data/spec/beaker/options/data/LATEST +1 -0
  67. data/spec/beaker/options/data/badyaml.cfg +21 -0
  68. data/spec/beaker/options/data/hosts.cfg +21 -0
  69. data/spec/beaker/options/data/opts.txt +6 -0
  70. data/spec/beaker/options/hosts_file_parser_spec.rb +30 -0
  71. data/spec/beaker/options/options_file_parser_spec.rb +23 -0
  72. data/spec/beaker/options/options_hash_spec.rb +111 -0
  73. data/spec/beaker/options/parser_spec.rb +172 -0
  74. data/spec/beaker/options/pe_version_scaper_spec.rb +15 -0
  75. data/spec/beaker/options/presets_spec.rb +24 -0
  76. data/spec/beaker/puppet_command_spec.rb +54 -21
  77. data/spec/beaker/shared/error_handler_spec.rb +40 -0
  78. data/spec/beaker/shared/host_handler_spec.rb +104 -0
  79. data/spec/beaker/shared/repetition_spec.rb +72 -0
  80. data/spec/beaker/test_suite_spec.rb +3 -16
  81. data/spec/beaker/utils/ntp_control_spec.rb +42 -0
  82. data/spec/beaker/utils/repo_control_spec.rb +168 -0
  83. data/spec/beaker/utils/setup_helper_spec.rb +82 -0
  84. data/spec/beaker/utils/validator_spec.rb +58 -0
  85. data/spec/helpers.rb +97 -0
  86. data/spec/matchers.rb +39 -0
  87. data/spec/mock_blimpy.rb +48 -0
  88. data/spec/mock_fission.rb +60 -0
  89. data/spec/mock_vsphere.rb +310 -0
  90. data/spec/mock_vsphere_helper.rb +183 -0
  91. data/spec/mocks.rb +83 -0
  92. data/spec/spec_helper.rb +8 -1
  93. metadata +106 -13
  94. data/beaker.rb +0 -10
  95. data/lib/beaker/options_parsing.rb +0 -323
  96. data/lib/beaker/test_config.rb +0 -148
  97. data/spec/beaker/options_parsing_spec.rb +0 -37
  98. data/spec/mocks_and_helpers.rb +0 -34
data/beaker.rb DELETED
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- if ENV['RUBYLIB']
4
- ENV['RUBYLIB'] += ':lib'
5
- else
6
- ENV['RUBYLIB'] = 'lib'
7
- end
8
-
9
- system('bin/beaker', *ARGV)
10
- exit $?.exitstatus
@@ -1,323 +0,0 @@
1
- module Beaker
2
- class Options
3
- GITREPO = 'git://github.com/puppetlabs'
4
-
5
- def self.options
6
- return @options
7
- end
8
-
9
- def self.repo?
10
- GITREPO
11
- end
12
-
13
- def self.parse_install_options(install_opts)
14
- install_opts.map! { |opt|
15
- case opt
16
- when /^PUPPET\//
17
- opt = "#{GITREPO}/puppet.git##{opt.split('/', 2)[1]}"
18
- when /^FACTER\//
19
- opt = "#{GITREPO}/facter.git##{opt.split('/', 2)[1]}"
20
- when /^HIERA\//
21
- opt = "#{GITREPO}/hiera.git##{opt.split('/', 2)[1]}"
22
- when /^HIERA-PUPPET\//
23
- opt = "#{GITREPO}/hiera-puppet.git##{opt.split('/', 2)[1]}"
24
- end
25
- opt
26
- }
27
- install_opts
28
- end
29
-
30
- def self.file_list(paths)
31
- files = []
32
- if not paths.empty?
33
- paths.each do |root|
34
- if File.file? root then
35
- files << root
36
- else
37
- discover_files = Dir.glob(
38
- File.join(root, "**/*.rb")
39
- ).select { |f| File.file?(f) }
40
- if discover_files.empty?
41
- raise ArgumentError, "Empty directory used as an option (#{root})!"
42
- end
43
- files += discover_files
44
- end
45
- end
46
- end
47
- files
48
- end
49
-
50
- def self.parse_args
51
- return @options if @options
52
-
53
- @no_args = ARGV.empty? ? true : false
54
-
55
- @defaults = {}
56
- @options = {}
57
- @options_from_file = {}
58
-
59
- optparse = OptionParser.new do|opts|
60
- # Set a banner
61
- opts.banner = "Usage: #{File.basename($0)} [options...]"
62
-
63
- @defaults[:config] = nil
64
- opts.on '-c', '--config FILE',
65
- 'Use configuration FILE' do |file|
66
- @options[:config] = file
67
- end
68
-
69
- @defaults[:options_file] = nil
70
- opts.on '-o', '--options-file FILE',
71
- 'Read options from FILE',
72
- 'This should evaluate to a ruby hash.',
73
- 'CLI optons are given precedence.' do |file|
74
- @options_from_file = parse_options_file file
75
- end
76
-
77
- @defaults[:type] = 'pe'
78
- opts.on '--type TYPE',
79
- 'one of git or pe',
80
- 'used to determine underlying path structure of puppet install',
81
- 'defaults to pe' do |type|
82
- @options[:type] = type
83
- end
84
-
85
- @defaults[:helper] = []
86
- opts.on '--helper PATH/TO/SCRIPT',
87
- 'Ruby file evaluated prior to tests',
88
- '(a la spec_helper)' do |script|
89
- @options[:helper] = []
90
- if script.is_a?(Array)
91
- @options[:helper] += script
92
- elsif script =~ /,/
93
- @options[:helper] += script.split(',')
94
- else
95
- @options[:helper] << script
96
- end
97
- end
98
-
99
- @defaults[:load_path] = []
100
- opts.on '--load-path /PATH/TO/DIR,/ADDITIONAL/DIR/PATHS',
101
- 'Add paths to LOAD_PATH' do |value|
102
- @options[:load_path] = []
103
- if value.is_a?(Array)
104
- @options[:load_path] += value
105
- elsif value =~ /,/
106
- @options[:load_path] += value.split(',')
107
- else
108
- @options[:load_path] << value
109
- end
110
- end
111
-
112
- @defaults[:tests] = []
113
- opts.on '-t', '--tests /PATH/TO/DIR,/ADDITIONA/DIR/PATHS,/PATH/TO/FILE.rb',
114
- 'Execute tests from paths and files' do |value|
115
- @options[:tests] = []
116
- if value.is_a?(Array)
117
- @options[:tests] += value
118
- elsif value =~ /,/
119
- @options[:tests] += value.split(',')
120
- else
121
- @options[:tests] << value
122
- end
123
- @options[:tests] = file_list(@options[:tests])
124
- if @options[:tests].empty?
125
- raise ArgumentError, "No tests to run!"
126
- end
127
- end
128
-
129
- @defaults[:pre_suite] = []
130
- opts.on '--pre-suite /PRE-SUITE/DIR/PATH,/ADDITIONAL/DIR/PATHS,/PATH/TO/FILE.rb',
131
- 'Path to project specific steps to be run BEFORE testing' do |value|
132
- @options[:pre_suite] = []
133
- if value.is_a?(Array)
134
- @options[:pre_suite] += value
135
- elsif value =~ /,/
136
- @options[:pre_suite] += value.split(',')
137
- else
138
- @options[:pre_suite] << value
139
- end
140
- @options[:pre_suite] = file_list(@options[:pre_suite])
141
- if @options[:pre_suite].empty?
142
- raise ArgumentError, "Empty pre-suite!"
143
- end
144
- end
145
-
146
- @defaults[:post_suite] = []
147
- opts.on '--post-suite /POST-SUITE/DIR/PATH,/OPTIONAL/ADDITONAL/DIR/PATHS,/PATH/TO/FILE.rb',
148
- 'Path to project specific steps to be run AFTER testing' do |value|
149
- @options[:post_suite] = []
150
- if value.is_a?(Array)
151
- @options[:post_suite] += value
152
- elsif value =~ /,/
153
- @options[:post_suite] += value.split(',')
154
- else
155
- @options[:post_suite] << value
156
- end
157
- @options[:post_suite] = file_list(@options[:post_suite])
158
- if @options[:post_suite].empty?
159
- raise ArgumentError, "Empty post-suite!"
160
- end
161
- end
162
-
163
- @defaults[:provision] = true
164
- opts.on '--[no-]provision',
165
- 'Do not provision vm images before testing',
166
- '(default: true)' do |bool|
167
- @options[:provision] = bool
168
- end
169
-
170
- @defaults[:preserve_hosts] = false
171
- opts.on '--[no-]preserve-hosts',
172
- 'Preserve cloud instances' do |value|
173
- @options[:preserve_hosts] = value
174
- end
175
-
176
- @defaults[:root_keys] = false
177
- opts.on '--root-keys',
178
- 'Install puppetlabs pubkeys for superuser',
179
- '(default: false)' do |bool|
180
- @options[:root_keys] = bool
181
- end
182
-
183
- @defaults[:keyfile] = "#{ENV['HOME']}/.ssh/id_rsa"
184
- opts.on '--keyfile /PATH/TO/SSH/KEY',
185
- 'Specify alternate SSH key',
186
- '(default: ~/.ssh/id_rsa)' do |key|
187
- @options[:keyfile] = key
188
- end
189
-
190
-
191
- @defaults[:install] = []
192
- opts.on '-i URI', '--install URI',
193
- 'Install a project repo/app on the SUTs',
194
- 'Provide full git URI or use short form KEYWORD/name',
195
- 'supported keywords: PUPPET, FACTER, HIERA, HIERA-PUPPET' do |value|
196
- @options[:install] = []
197
- if value.is_a?(Array)
198
- @options[:install] += value
199
- elsif value =~ /,/
200
- @options[:install] += value.split(',')
201
- else
202
- @options[:install] << value
203
- end
204
- @options[:install] = parse_install_options(@options[:install])
205
- end
206
-
207
- @defaults[:modules] = []
208
- opts.on('-m', '--modules URI', 'Select puppet module git install URI') do |value|
209
- @options[:modules] ||= []
210
- @options[:modules] << value
211
- end
212
-
213
- @defaults[:quiet] = false
214
- opts.on '-q', '--[no-]quiet',
215
- 'Do not log output to STDOUT',
216
- '(default: false)' do |bool|
217
- @options[:quiet] = bool
218
- end
219
-
220
- @defaults[:xml] = false
221
- opts.on '-x', '--[no-]xml',
222
- 'Emit JUnit XML reports on tests',
223
- '(default: false)' do |bool|
224
- @options[:xml] = bool
225
- end
226
-
227
- @defaults[:color] = true
228
- opts.on '--[no-]color',
229
- 'Do not display color in log output',
230
- '(default: true)' do |bool|
231
- @options[:color] = bool
232
- end
233
-
234
- @defaults[:debug] = false
235
- opts.on '--[no-]debug',
236
- 'Enable full debugging',
237
- '(default: false)' do |bool|
238
- @options[:debug] = bool
239
- end
240
-
241
- @defaults[:dry_run] = false
242
- opts.on '-d', '--[no-]dry-run',
243
- 'Report what would happen on targets',
244
- '(default: false)' do |bool|
245
- @options[:dry_run] = bool
246
- $dry_run = bool
247
- end
248
-
249
- @defaults[:fail_mode] = nil
250
- opts.on '--fail-mode [MODE]',
251
- 'How should the harness react to errors/failures',
252
- 'Possible values:',
253
- 'fast (skip all subsequent tests, cleanup, exit)',
254
- 'stop (skip all subsequent tests, do no cleanup, exit immediately)' do |mode|
255
- @options[:fail_mode] = mode
256
- end
257
-
258
- @defaults[:timesync] = false
259
- opts.on '--[no-]ntp',
260
- 'Sync time on SUTs before testing',
261
- '(default: false)' do |bool|
262
- @options[:timesync] = bool
263
- end
264
-
265
- @defaults[:repo_proxy] = false
266
- opts.on '--repo-proxy',
267
- 'Proxy packaging repositories on ubuntu, debian and solaris-11',
268
- '(default: false)' do
269
- @options[:repo_proxy] = true
270
- end
271
-
272
- @defaults[:add_el_extras] = false
273
- opts.on '--add-el-extras',
274
- 'Add Extra Packages for Enterprise Linux (EPEL) repository to el-* hosts',
275
- '(default: false)' do
276
- @options[:add_el_extras] = true
277
- end
278
-
279
- opts.on('--help', 'Display this screen' ) do |yes|
280
- puts opts
281
- exit
282
- end
283
- end
284
-
285
- optparse.parse!
286
-
287
- # We have use the @no_args var because OptParse consumes ARGV as it parses
288
- # so we have to check the value of ARGV at the begining of the method,
289
- # let the options be set, then output usage.
290
- puts optparse if @no_args
291
-
292
- # merge in the options that we read from the file
293
- @options = @options_from_file.merge(@options)
294
- # merge in defaults
295
- @options = @defaults.merge(@options)
296
-
297
- if @options[:type] !~ /(pe)|(git)/
298
- raise ArgumentError.new("--type must be one of pe or git, not '#{@options[:type]}'")
299
- end
300
-
301
- raise ArgumentError.new("--fail-mode must be one of fast, stop") unless ["fast", "stop", nil].include?(@options[:fail_mode])
302
-
303
- @options
304
- end
305
-
306
- def self.parse_options_file(options_file_path)
307
- options_file_path = File.expand_path(options_file_path)
308
- unless File.exists?(options_file_path)
309
- raise ArgumentError, "Specified options file '#{options_file_path}' does not exist!"
310
- end
311
- # This eval will allow the specified options file to have access to our
312
- # scope. It is important that the variable 'options_file_path' is
313
- # accessible, because some existing options files (e.g. puppetdb) rely on
314
- # that variable to determine their own location (for use in 'require's, etc.)
315
- result = eval(File.read(options_file_path))
316
- unless result.is_a? Hash
317
- raise ArgumentError, "Options file '#{options_file_path}' must return a hash!"
318
- end
319
-
320
- result
321
- end
322
- end
323
- end
@@ -1,148 +0,0 @@
1
- require 'open-uri'
2
- require 'yaml'
3
-
4
- module Beaker
5
- # Config was taken by Ruby.
6
- class TestConfig
7
-
8
- attr_accessor :logger
9
- def initialize(config_file, options)
10
- @options = options
11
- @logger = options[:logger]
12
- @config = load_file(config_file)
13
- end
14
-
15
- def [](key)
16
- @config[key]
17
- end
18
-
19
- def ssh_defaults
20
- {
21
- :config => false,
22
- :paranoid => false,
23
- :timeout => 300,
24
- :auth_methods => ["publickey"],
25
- :keys => [@options[:keyfile]],
26
- :port => 22,
27
- :user_known_hosts_file => "#{ENV['HOME']}/.ssh/known_hosts",
28
- :forward_agent => true
29
- }
30
- end
31
-
32
- def load_file(config_file)
33
- if config_file.is_a? Hash
34
- config = config_file
35
- else
36
- config = YAML.load_file(config_file)
37
-
38
- # Make sure the roles array is present for all hosts
39
- config['HOSTS'].each_key do |host|
40
- config['HOSTS'][host]['roles'] ||= []
41
- end
42
- end
43
-
44
- # Merge some useful date into the config hash
45
- config['CONFIG'] ||= {}
46
- consoleport = ENV['consoleport'] || config['CONFIG']['consoleport'] || 443
47
- config['CONFIG']['consoleport'] = consoleport.to_i
48
- config['CONFIG']['ssh'] = ssh_defaults.merge(config['CONFIG']['ssh'] || {})
49
- config['CONFIG']['modules'] = @options[:modules] || []
50
-
51
- if is_pe?
52
- config['CONFIG']['pe_dir'] = puppet_enterprise_dir
53
- config['CONFIG']['pe_ver'] = puppet_enterprise_version
54
- config['CONFIG']['pe_ver_win'] = puppet_enterprise_version_win
55
- else
56
- config['CONFIG']['puppet_ver'] = @options[:puppet]
57
- config['CONFIG']['facter_ver'] = @options[:facter]
58
- config['CONFIG']['hiera_ver'] = @options[:hiera]
59
- config['CONFIG']['hiera_puppet_ver'] = @options[:hiera_puppet]
60
- end
61
- # need to load expect versions of PE binaries
62
- config
63
- end
64
-
65
- def is_pe?
66
- @is_pe ||= @options[:type] =~ /pe/ ? true : false
67
- unless ENV['IS_PE'].nil?
68
- @is_pe ||= ENV['IS_PE'] == 'true'
69
- end
70
- @is_pe
71
- end
72
-
73
- def puppet_enterprise_dir
74
- @pe_dir ||= ENV['pe_dist_dir'] || '/opt/enterprise/dists'
75
- end
76
-
77
- def load_pe_version
78
- dist_dir = puppet_enterprise_dir
79
- version_file = ENV['pe_version_file'] || 'LATEST'
80
- version = ""
81
- begin
82
- open("#{dist_dir}/#{version_file}") do |file|
83
- while line = file.gets
84
- if /(\w.*)/ =~ line then
85
- version = $1.strip
86
- @logger.debug "Found LATEST: Puppet Enterprise Version #{version}"
87
- end
88
- end
89
- end
90
- rescue
91
- version = 'unknown'
92
- end
93
- return version
94
- end
95
-
96
- def puppet_enterprise_version
97
- @pe_ver ||= load_pe_version if is_pe?
98
- end
99
-
100
- def load_pe_version_win
101
- dist_dir = puppet_enterprise_dir
102
- version_file = ENV['pe_version_file'] || 'LATEST-win'
103
- version = ""
104
- begin
105
- open("#{dist_dir}/#{version_file}") do |file|
106
- while line = file.gets
107
- if /(\w.*)/ =~ line then
108
- version=$1.strip
109
- @logger.debug "Found LATEST: Puppet Enterprise Windows Version #{version}"
110
- end
111
- end
112
- end
113
- rescue
114
- version = 'unknown'
115
- end
116
- return version
117
- end
118
-
119
- def puppet_enterprise_version_win
120
- @pe_ver_win ||= load_pe_version_win if is_pe?
121
- end
122
-
123
- # Print out test configuration
124
- def dump
125
- # Access "platform" for each host
126
- @config["HOSTS"].each_key do|host|
127
- @logger.notify "Platform for #{host} #{@config["HOSTS"][host]['platform']}"
128
- end
129
-
130
- # Access "roles" for each host
131
- @config["HOSTS"].each_key do|host|
132
- @config["HOSTS"][host]['roles'].each do |role|
133
- @logger.notify "Role for #{host} #{role}"
134
- end
135
- end
136
-
137
- # Print out Ruby versions
138
- @config["HOSTS"].each_key do|host|
139
- @logger.notify "Ruby version for #{host} #{@config["HOSTS"][host][:ruby_ver]}"
140
- end
141
-
142
- # Access @config keys/values
143
- @config["CONFIG"].each_key do|cfg|
144
- @logger.notify "Config Key|Val: #{cfg} #{@config["CONFIG"][cfg].inspect}"
145
- end
146
- end
147
- end
148
- end