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/spec/helpers.rb ADDED
@@ -0,0 +1,97 @@
1
+ module TestFileHelpers
2
+ def create_files file_array
3
+ file_array.each do |f|
4
+ FileUtils.mkdir_p File.dirname(f)
5
+ FileUtils.touch f
6
+ end
7
+ end
8
+
9
+ def fog_file_contents
10
+ { :default => { :aws_access_key_id => "IMANACCESSKEY",
11
+ :aws_secret_access_key => "supersekritkey",
12
+ :aix_hypervisor_server => "aix_hypervisor.labs.net",
13
+ :aix_hypervisor_username => "aixer",
14
+ :aix_hypervisor_keyfile => "/Users/user/.ssh/id_rsa-acceptance",
15
+ :solaris_hypervisor_server => "solaris_hypervisor.labs.net",
16
+ :solaris_hypervisor_username => "harness",
17
+ :solaris_hypervisor_keyfile => "/Users/user/.ssh/id_rsa-old.private",
18
+ :solaris_hypervisor_vmpath => "rpoooool/zs",
19
+ :solaris_hypervisor_snappaths => ["rpoooool/USER/z0"],
20
+ :vsphere_server => "vsphere.labs.net",
21
+ :vsphere_username => "vsphere@labs.com",
22
+ :vsphere_password => "supersekritpassword"} }
23
+ end
24
+
25
+ end
26
+
27
+ module HostHelpers
28
+ HOST_DEFAULTS = { :platform => 'unix',
29
+ :snapshot => 'pe',
30
+ :box => 'box_name',
31
+ :roles => ['agent'],
32
+ :snapshot => 'snap',
33
+ :ip => 'default.ip.address',
34
+ :box => 'default_box_name',
35
+ :box_url => 'http://default.box.url',
36
+ }
37
+
38
+ HOST_NAME = "vm%d"
39
+ HOST_SNAPSHOT = "snapshot%d"
40
+ HOST_IP = "ip.address.for.%s"
41
+ HOST_BOX = "%s_of_my_box"
42
+ HOST_BOX_URL = "http://address.for.my.box.%s"
43
+ HOST_TEMPLATE = "%s_has_a_template"
44
+
45
+ def logger
46
+ double( 'logger' ).as_null_object
47
+ end
48
+
49
+ def make_opts
50
+ Beaker::Options::Presets.presets.merge( { :logger => logger,
51
+ :host_config => 'sample.config',
52
+ :type => :foss,
53
+ :pooling_api => 'http://vcloud.delivery.puppetlabs.net/',
54
+ :datastore => 'instance0',
55
+ :folder => 'Delivery/Quality Assurance/Staging/Dynamic',
56
+ :resourcepool => 'delivery/Quality Assurance/Staging/Dynamic' } )
57
+ end
58
+
59
+ def generate_result (name, opts )
60
+ result = double( 'result' )
61
+ stdout = opts.has_key?(:stdout) ? opts[:stdout] : name
62
+ stderr = opts.has_key?(:stderr) ? opts[:stderr] : name
63
+ exit_code = opts.has_key?(:exit_code) ? opts[:exit_code] : 0
64
+ result.stub( :stdout ).and_return( stdout )
65
+ result.stub( :stderr ).and_return( stderr )
66
+ result.stub( :exit_code ).and_return( exit_code )
67
+ result
68
+ end
69
+
70
+ def make_host_opts name, opts
71
+ make_opts.merge( { 'HOSTS' => { name => opts } } ).merge( opts )
72
+ end
73
+
74
+ def make_host name, opts
75
+ opts = HOST_DEFAULTS.merge(opts)
76
+
77
+ host = Beaker::Host.create( name, make_host_opts(name, opts) )
78
+
79
+ host.stub( :exec ).and_return( generate_result( name, opts ) )
80
+ host
81
+ end
82
+
83
+ def make_hosts preset_opts = {}, amt = 3
84
+ hosts = []
85
+ (1..amt).each do |num|
86
+ name = HOST_NAME % num
87
+ opts = { :snapshot => HOST_SNAPSHOT % num,
88
+ :ip => HOST_IP % name,
89
+ :template => HOST_TEMPLATE % name,
90
+ :box => HOST_BOX % name,
91
+ :box_url => HOST_BOX_URL % name }.merge( preset_opts )
92
+ hosts << make_host(name, opts)
93
+ end
94
+ hosts
95
+ end
96
+
97
+ end
data/spec/matchers.rb ADDED
@@ -0,0 +1,39 @@
1
+ RSpec::Matchers.define :execute_commands_matching do |pattern|
2
+
3
+ match do |actual|
4
+ raise(RuntimeError, "Expected #{actual} to be a FakeHost") unless actual.kind_of?(FakeHost)
5
+ @found_count = actual.command_strings.grep(pattern).size
6
+ @times.nil? ?
7
+ @found_count > 0 :
8
+ @found_count == @times
9
+ end
10
+
11
+ chain :exactly do |times|
12
+ @times = times
13
+ end
14
+
15
+ chain :times do
16
+ # clarity only
17
+ end
18
+
19
+ chain :once do
20
+ @times = 1
21
+ # clarity only
22
+ end
23
+
24
+ def message(actual, pattern, times, found_count)
25
+ msg = times == 1 ?
26
+ "#{pattern} once" :
27
+ "#{pattern} #{times} times"
28
+ msg += " but instead found a count of #{found_count}" if found_count != times
29
+ msg + " in:\n #{actual.command_strings.pretty_inspect}"
30
+ end
31
+
32
+ failure_message_for_should do |actual|
33
+ "Expected to find #{message(actual, pattern, @times, @found_count)}"
34
+ end
35
+
36
+ failure_message_for_should_not do |actual|
37
+ "Unexpectedly found #{message(actual, pattern, @times, @found_count)}"
38
+ end
39
+ end
@@ -0,0 +1,48 @@
1
+ class MockShip
2
+ attr_accessor :name, :ports, :image_id, :flavor, :region, :username, :dns
3
+
4
+ def initialize
5
+ @dns = "my.ip.address"
6
+ end
7
+
8
+ def wait_for_sshd
9
+ @dns = "#{@name}.my.ip"
10
+ return true
11
+ end
12
+
13
+ end
14
+
15
+ class MockFleet
16
+ attr_accessor :ships
17
+ @@attempts = 0
18
+
19
+ def initialize
20
+ @ships = []
21
+ end
22
+
23
+ def add type
24
+ @ships << MockShip.new
25
+ yield(@ships[-1])
26
+ @ships[-1]
27
+ end
28
+
29
+ def start
30
+ if @@attempts < 1
31
+ @@attempts += 1
32
+ raise Fog::Errors::Error
33
+ end
34
+ end
35
+
36
+ def destroy
37
+ end
38
+
39
+ end
40
+
41
+ class MockBlimpy
42
+ @@fleet = nil
43
+ def self.fleet
44
+ yield(@@fleet = MockFleet.new)
45
+ @@fleet
46
+ end
47
+
48
+ end
@@ -0,0 +1,60 @@
1
+ class Response
2
+ attr_accessor :code, :message, :data
3
+ def initialize(code = 0, message = '', data = nil)
4
+ @code = code
5
+ @message = message
6
+ @data = data
7
+ end
8
+ end
9
+
10
+ class MockFissionVM
11
+ attr_accessor :name
12
+ @@snaps = []
13
+ def initialize name
14
+ @name = name
15
+ @running = true
16
+ end
17
+
18
+ def self.set_snapshots snaps
19
+ @@snaps = snaps
20
+ end
21
+
22
+ def snapshots
23
+ Response.new(0, '', @@snaps)
24
+ end
25
+
26
+ def revert_to_snapshot name
27
+ @running = false
28
+ end
29
+
30
+ def running?
31
+ Response.new(0, '', @running)
32
+ end
33
+
34
+ def start opt
35
+ @running = true
36
+ end
37
+
38
+ def exists?
39
+ true
40
+ end
41
+ end
42
+
43
+ class MockFission
44
+ @@vms = []
45
+ def self.presets hosts
46
+ snaps = []
47
+ hosts.each do |host|
48
+ @@vms << MockFissionVM.new( host.name )
49
+ snaps << host[ :snapshot ]
50
+ end
51
+ MockFissionVM.set_snapshots(snaps)
52
+ end
53
+
54
+ def self.all
55
+ Response.new(0, '', @@vms)
56
+ end
57
+ def self.new name
58
+ MockFissionVM.new(name)
59
+ end
60
+ end
@@ -0,0 +1,310 @@
1
+ class MockRbVmomiSnapshot
2
+ attr_accessor :name
3
+ attr_accessor :rootSnapshotList
4
+ attr_accessor :childSnapshotList
5
+
6
+ def initialize
7
+ @name = nil
8
+ @rootSnapshotList = []
9
+ @childSnapshotList = []
10
+ end
11
+
12
+ def print_nested_array arg
13
+ str = '[ '
14
+ arg.each do |arry|
15
+ if arry.is_a?(Array)
16
+ str += print_nested_array( arry )
17
+ elsif arry.is_a?(MockRbVmomiSnapshot)
18
+ str += arry.to_s + ", "
19
+ end
20
+ end
21
+ str + ' ]'
22
+ end
23
+
24
+ def to_s
25
+ "Snapshot(name: #{@name}, rootSnapshotlist: #{print_nested_array(@rootSnapshotList)}, childSnapshotList: #{print_nested_array(@childSnapshotList)})"
26
+ end
27
+
28
+ def snapshot
29
+ self
30
+ end
31
+
32
+ end
33
+
34
+ class MockRbVmomiVM
35
+ attr_accessor :snapshot, :name, :state
36
+
37
+ def info
38
+ self
39
+ end
40
+
41
+ def process_snaphash snaphash
42
+ shotlist = []
43
+ snaphash.each do | name, subsnaps |
44
+ new_snap = MockRbVmomiSnapshot.new
45
+ new_snap.name = name
46
+ if subsnaps.is_a?(Hash)
47
+ new_snap.childSnapshotList = process_snaphash( subsnaps )
48
+ end
49
+ shotlist << new_snap
50
+ end
51
+ shotlist
52
+ end
53
+
54
+ def get_snapshot name, snaplist = @snapshot.rootSnapshotList
55
+ snapshot = nil
56
+ snaplist.each do |snap|
57
+ if snap.is_a?(Array)
58
+ snapshot = get_snapshot(snap, name)
59
+ elsif snap.name == name
60
+ snapshot = snap.snapshot
61
+ end
62
+ end
63
+ snapshot
64
+ end
65
+
66
+ def initialize name, snaphash
67
+ @name = name
68
+ @snapshot = MockRbVmomiSnapshot.new
69
+ @snapshot.name = name
70
+ @snapshot.rootSnapshotList = process_snaphash( snaphash )
71
+ end
72
+
73
+ end
74
+
75
+ class MockRbVmomiConnection
76
+
77
+ class CustomizationSpecManager
78
+
79
+ class CustomizationSpec
80
+ def spec
81
+ true
82
+ end
83
+ end
84
+
85
+ def initialize
86
+ @customizationspec = CustomizationSpec.new
87
+ end
88
+
89
+ def GetCustomizationSpec arg
90
+ @customizationspec
91
+ end
92
+
93
+ end
94
+
95
+ class PropertyCollector
96
+ class Result
97
+ def initialize(name, object)
98
+ @name = name
99
+ @object = object
100
+ end
101
+
102
+ def val
103
+ @name
104
+ end
105
+
106
+ def obj
107
+ @object
108
+ end
109
+
110
+ def propSet
111
+ [self]
112
+ end
113
+
114
+ end
115
+
116
+ class ResultContainer
117
+ attr_accessor :token
118
+
119
+ def initialize
120
+ @results = []
121
+ end
122
+
123
+ def objects
124
+ @results
125
+ end
126
+
127
+ def add_object obj
128
+ @results << obj
129
+ end
130
+
131
+ end
132
+
133
+ def initialize
134
+ @results = ResultContainer.new
135
+ end
136
+
137
+
138
+ def RetrievePropertiesEx hash
139
+ @results.token = true
140
+ @results
141
+ end
142
+
143
+ def ContinueRetrievePropertiesEx token
144
+ @results.token = false
145
+ @results
146
+ end
147
+
148
+ def add_result name, object
149
+ @results.add_object( Result.new(name, object) )
150
+ end
151
+
152
+ def WaitForUpdates arg
153
+ result = OpenStruct.new
154
+ result.version = 'version'
155
+ result
156
+ end
157
+
158
+ def CreateFilter arg
159
+ filter = OpenStruct.new
160
+ filter.DestroyPropertyFilter = true
161
+ filter
162
+ end
163
+
164
+ end
165
+
166
+ class ServiceInstance
167
+ class Datacenter
168
+ attr_accessor :vmFolder
169
+ attr_accessor :hostFolder
170
+
171
+ def initialize
172
+ @vmFolder = MockRbVmomi::VIM::Folder.new
173
+ @vmFolder.name = "/root"
174
+ end
175
+
176
+ def find_datastore arg
177
+ true
178
+ end
179
+
180
+ end
181
+
182
+ def initialize
183
+ @datacenter = Datacenter.new
184
+ end
185
+
186
+ def find_datacenter
187
+ @datacenter
188
+ end
189
+
190
+ end
191
+
192
+ class ServiceManager
193
+ class ViewManager
194
+
195
+ def CreateContainerView hash
196
+ @view = hash
197
+ end
198
+
199
+ end
200
+
201
+ def initialize
202
+ @customizationspecmanager = CustomizationSpecManager.new
203
+ @viewmanager = ViewManager.new
204
+ end
205
+
206
+ def customizationSpecManager
207
+ @customizationspecmanager
208
+ end
209
+
210
+ def viewManager
211
+ @viewmanager
212
+ end
213
+
214
+ def rootFolder
215
+ "/root"
216
+ end
217
+
218
+ end
219
+
220
+ def initialize opts
221
+ @host = opts[ :host ]
222
+ @user = opts[ :user ]
223
+ @password = opts[ :password ]
224
+ @insecure = opts[ :insecure ]
225
+ @serviceinstance = ServiceInstance.new
226
+ @servicemanager = ServiceManager.new
227
+ @propertycollector = PropertyCollector.new
228
+
229
+ end
230
+
231
+ def serviceInstance
232
+ @serviceinstance
233
+ end
234
+
235
+ def serviceContent
236
+ @servicemanager
237
+ end
238
+
239
+ def propertyCollector
240
+ @propertycollector
241
+ end
242
+
243
+ def set_info vms
244
+ vms.each do |vm|
245
+ @propertycollector.add_result(vm.name, vm)
246
+ end
247
+ end
248
+ end
249
+
250
+
251
+ class MockRbVmomi
252
+
253
+ class VIM
254
+ class Folder
255
+ attr_accessor :name
256
+
257
+ def find
258
+ self
259
+ end
260
+
261
+ def childEntity
262
+ self
263
+ end
264
+
265
+ def resourcePool
266
+ self
267
+ end
268
+
269
+ end
270
+
271
+ class ResourcePool
272
+ attr_accessor :name
273
+
274
+ def find
275
+ self
276
+ end
277
+
278
+ def resourcePool
279
+ self
280
+ end
281
+
282
+ end
283
+
284
+ class ClusterComputeResource
285
+ attr_accessor :name
286
+
287
+ def find
288
+ self
289
+ end
290
+
291
+ def resourcePool
292
+ self
293
+ end
294
+
295
+ end
296
+
297
+ class TraversalSpec
298
+ def initialize hash
299
+
300
+ end
301
+
302
+ end
303
+
304
+ def self.connect opts
305
+ MockRbVmomiConnection.new( opts )
306
+ end
307
+
308
+ end
309
+
310
+ end