barking_iguana-compound 0.1.11 → 0.1.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0faf126b34f58aaef3ff3b4797468dc507884046
4
- data.tar.gz: e7f0193c33253537b31c49b5a610295792043a34
3
+ metadata.gz: a4102d07d853b0631a982911f35b114ba5efd7cc
4
+ data.tar.gz: 83af11d838771d6f83056556f37d74a8ab4345f0
5
5
  SHA512:
6
- metadata.gz: 88e9707c4ff7b76b9382654ee111b88bbe09d2ad2963bae7c11a423a77a7cc6e64256e85785816c71f836d60897272ea6e3fcd86a715d6e9f3a0f9804f844e8f
7
- data.tar.gz: a7c28a7290f1463dd9baa20fa23f195148bbde93bc6c6019dfbc29ae2986dc5886284a157dfe65782fe9ce7e31609bcdce3307c5231d1d4b1c66c8babf745b0e
6
+ metadata.gz: 01055224b326b78a45d016547f9644f7f1d82b2db2b9245b1e3813372df67194bb699a9354b622f3f631c51f2d6cbcd3e754bd960b0c75b20c4d5df6e16175d3
7
+ data.tar.gz: 29539c1a69fa7a4006818855d357e5aa6ed568bcb93c834f5ae0cddca7adff749205ba9a1b2cbfc2f890fb271b04ca9b3f256bab77f178bf31c4a44722b78c56
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
35
35
 
36
36
  spec.add_dependency 'barking_iguana-logging'
37
37
  spec.add_dependency 'barking_iguana-benchmark'
38
+ spec.add_dependency 'barking_iguana-fork_calls'
38
39
  spec.add_dependency 'mixlib-shellout'
39
40
  spec.add_dependency 'rspec-wait'
40
41
  spec.add_dependency 'ansible_spec'
data/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,9 @@ Entries are in reverse chronological order.
4
4
 
5
5
  ## *0.1.12* (Current Development)
6
6
 
7
+ * Initial support for testing the results of the playbook run, to check for
8
+ number of changes applied by `ansible-playbook`.
9
+
7
10
  ## *0.1.11* (2017-01-17)
8
11
 
9
12
  * Increase wait time for Ansible Playbook run to 1 hour instead of teh default
data/docs/TODO.md CHANGED
@@ -1,14 +1,20 @@
1
1
  # TODO
2
2
 
3
3
  * We can add machines to different networks because even though we require
4
- `10.8.*`, the networks created are `/24`'s. These should either be `/16` to
5
- avoid surprises, or we should make the CIDR configurable, or we should give an
6
- example showing this behaviour.
4
+ `10.8.*`, the networks created are `/24`'s. These should either be `/16`
5
+ to avoid surprises, or we should make the CIDR configurable, or we should
6
+ give an example showing this behaviour.
7
7
 
8
- * Tests. So ironic that a testing tool has no tests. For release 1.0.0 we need tests.
8
+ * Tests. So ironic that a testing tool has no tests. For release 1.0.0 we
9
+ need tests.
9
10
 
10
- * We should support the ansible remote user attributes in the inventory, for each host.
11
+ * We should support the ansible remote user attributes in the inventory, for
12
+ each host.
11
13
 
12
14
  * Rewrite the InventoryParser so it's understandable!
13
15
 
14
16
  * Make command timeouts customiseable.
17
+
18
+ * Stop paying attention to `~/.ssh/known_hosts` inside the tests. If these
19
+ host keys exist we end up with test failures, even though we _do_ expected
20
+ these to change.
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: ../../
3
3
  specs:
4
- barking_iguana-compound (0.1.9)
4
+ barking_iguana-compound (0.1.11)
5
5
  ansible_spec
6
6
  barking_iguana-benchmark
7
+ barking_iguana-fork_calls
7
8
  barking_iguana-logging
8
9
  colorize
9
10
  hostlist_expression
@@ -20,13 +21,14 @@ GEM
20
21
  serverspec (>= 2.0.0)
21
22
  winrm
22
23
  barking_iguana-benchmark (0.1.1)
24
+ barking_iguana-fork_calls (0.1.0)
23
25
  barking_iguana-logging (0.1.7)
24
26
  barking_iguana-otk
25
27
  term-ansicolor
26
28
  barking_iguana-otk (0.1.0)
27
29
  builder (3.2.3)
28
30
  colorize (0.8.1)
29
- diff-lcs (1.2.5)
31
+ diff-lcs (1.3)
30
32
  erubis (2.7.0)
31
33
  ffi (1.9.17)
32
34
  gssapi (1.2.0)
@@ -73,7 +75,7 @@ GEM
73
75
  rspec-its
74
76
  specinfra (~> 2.53)
75
77
  sfl (2.3)
76
- specinfra (2.66.4)
78
+ specinfra (2.66.5)
77
79
  net-scp
78
80
  net-ssh (>= 2.7, < 5.0)
79
81
  net-telnet
@@ -1,5 +1,5 @@
1
1
  ---
2
- - name: Example Playbook
2
+ - name: Example Playbook 1
3
3
  hosts: example-host
4
4
  tasks:
5
5
  - name: Create a file
@@ -0,0 +1,7 @@
1
+ describe 'ansible-playbook' do
2
+ subject { BarkingIguana::Compound::Ansible::ResultsParser.new(ENV['ANSIBLE_RESULTS_FILE']) }
3
+
4
+ it "did not change anything" do
5
+ expect(subject.recap.total_changes).to eq 0
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ describe file('/tmp/example-file') do
2
+ it "exists" do
3
+ expect(subject).to exist
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ ---
2
+ - name: Example Playbook 2
3
+ hosts: example-host
4
+ tasks:
5
+ - name: Ensure file ownership
6
+ become: yes
7
+ file:
8
+ path: /tmp/example-file
9
+ owner: root
10
+ group: root
@@ -48,13 +48,8 @@ module BarkingIguana
48
48
  end
49
49
 
50
50
  def run
51
- options = {}
52
- options[:cwd] = run_from if run_from
53
- options[:live_stream] = io if io
54
- options[:timeout] = 3600
55
- c = Mixlib::ShellOut.new(command, options)
56
- c.run_command
57
- c.error!
51
+ command.run_command
52
+ command.error!
58
53
  self
59
54
  ensure
60
55
  clean_up
@@ -62,6 +57,18 @@ module BarkingIguana
62
57
 
63
58
  private
64
59
 
60
+ def command
61
+ @command ||= Mixlib::ShellOut.new(command_line, command_options)
62
+ end
63
+
64
+ def command_options
65
+ options = {}
66
+ options[:cwd] = run_from if run_from
67
+ options[:live_stream] = io if io
68
+ options[:timeout] = 3600
69
+ options
70
+ end
71
+
65
72
  def clean_up
66
73
  return unless run_from
67
74
  FileUtils.remove_file wrapper_playbook, true
@@ -86,7 +93,7 @@ module BarkingIguana
86
93
  end
87
94
  end
88
95
 
89
- def command
96
+ def command_line
90
97
  c = ["env ANSIBLE_RETRY_FILES_ENABLED=no ansible-playbook #{playbook_paths}"]
91
98
  inventory_paths.each do |i|
92
99
  c << "-i #{i}"
@@ -0,0 +1,26 @@
1
+ module BarkingIguana
2
+ module Compound
3
+ module Ansible
4
+ class ResultsParser
5
+ attr_accessor :file
6
+ private :file=, :file
7
+
8
+ def initialize file
9
+ self.file = file
10
+ end
11
+
12
+ def recap
13
+ OpenStruct.new total_changes: total_changes
14
+ end
15
+
16
+ private
17
+
18
+ def total_changes
19
+ recap_text = File.read(file).split(/^PLAY RECAP \**$/)[-1].strip
20
+ matches = recap_text.scan(/ changed=(\d+) /)
21
+ matches[0].map(&:to_i).inject(&:+)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,56 @@
1
+ module BarkingIguana
2
+ module Compound
3
+ class AnsibleSpec
4
+ extend Forwardable
5
+ attr_accessor :stage
6
+
7
+ def initialize stage
8
+ self.stage = stage
9
+ end
10
+
11
+ include BarkingIguana::Logging::Helper
12
+ include BarkingIguana::Benchmark
13
+
14
+ def run
15
+ unless File.exists? ansible_test_directory
16
+ logger.debug { "#{ansible_test_directory} doesn't exist, assuming no ansible tests for this stage" }
17
+ return
18
+ end
19
+
20
+ command = "bundle exec ruby -S rspec -r #{spec_helper} #{test_files.join(' ')}"
21
+ c = Mixlib::ShellOut.new command, live_stream: logger, cwd: control_repo_dir, env: env
22
+ benchmark command do
23
+ c.run_command
24
+ end
25
+ logger.info { "ansible tests exited with status #{c.exitstatus}" }
26
+ c.error!
27
+ end
28
+
29
+ private
30
+
31
+ def test_files
32
+ Dir.glob File.expand_path '**/*_spec.rb', ansible_test_directory
33
+ end
34
+
35
+ def env
36
+ {
37
+ ANSIBLE_RESULTS_FILE: ansible_results_file
38
+ }
39
+ end
40
+
41
+ def spec_helper
42
+ File.expand_path '../../../../resources/ansible_spec_helper.rb', __FILE__
43
+ end
44
+
45
+ def ansible_test_directory
46
+ File.expand_path '_ansible', root_dir
47
+ end
48
+
49
+ def_delegator :stage, :test
50
+ def_delegator :stage, :stage_directory, :root_dir
51
+ def_delegator :stage, :results_file, :ansible_results_file
52
+ def_delegator :test, :suite
53
+ def_delegator :suite, :control_directory, :control_repo_dir
54
+ end
55
+ end
56
+ end
@@ -35,7 +35,7 @@ module BarkingIguana
35
35
  def host_tests
36
36
  hosts.inject({}) do |a,e|
37
37
  name = e.name
38
- glob = "#{root_dir}/{#{name}/**/*_,}spec.rb"
38
+ glob = "#{root_dir}/#{name}/**/*_spec.rb"
39
39
  logger.debug { "Host glob for #{name.inspect} = #{glob.inspect}" }
40
40
  tests = Dir.glob glob
41
41
  logger.debug { "Host tests for #{name.inspect} = #{tests.inspect}" }
@@ -50,7 +50,7 @@ module BarkingIguana
50
50
  end
51
51
 
52
52
  def spec_helper
53
- File.expand_path '../../../../resources/spec_helper.rb', __FILE__
53
+ File.expand_path '../../../../resources/server_spec_helper.rb', __FILE__
54
54
  end
55
55
 
56
56
  def_delegator :stage, :test
@@ -68,9 +68,17 @@ module BarkingIguana
68
68
  @generated_inventory ||= generate_inventory
69
69
  end
70
70
 
71
+ def tmp_dir *sub_path
72
+ @tmp_dir ||= Dir.mktmpdir
73
+ return @tmp_dir if sub_path.empty?
74
+ full_path = File.expand_path File.join(sub_path), @tmp_dir
75
+ FileUtils.mkdir_p full_path
76
+ full_path
77
+ end
78
+
71
79
  def generate_inventory
72
80
  benchmark "#{name}: generating inventory for test stage" do
73
- Dir.mktmpdir('inventory').tap do |d|
81
+ tmp_dir('inventory').tap do |d|
74
82
  logger.debug { "#{name}: inventory directory is #{d.inspect}" }
75
83
  connection_file = File.expand_path 'connection', d
76
84
  Ansible::InventoryWriter.new(connection_file).tap do |i|
@@ -96,7 +104,11 @@ module BarkingIguana
96
104
  end
97
105
 
98
106
  def playbook
99
- Ansible.playbook(playbook_path, run_from: control_directory).inventory(generated_inventory).stream_to(logger).verbosity(ansible_verbosity).diff
107
+ Ansible.playbook(playbook_path, run_from: control_directory).inventory(generated_inventory).stream_to(playbook_logger).verbosity(ansible_verbosity).diff
108
+ end
109
+
110
+ def playbook_logger
111
+ @playbook_logger ||= BarkingIguana::ForkCalls.fork_to(logger, results_logger)
100
112
  end
101
113
 
102
114
  def setup
@@ -123,15 +135,41 @@ module BarkingIguana
123
135
  FileUtils.rm_r generated_inventory
124
136
  end
125
137
 
126
- def server_spec
127
- @server_spec ||= ServerSpec.new(self)
138
+ def clean_up
139
+ logger.debug { "Removing temporary directory for stage #{name} from #{tmp_dir}" }
140
+ FileUtils.rm_r tmp_dir
128
141
  end
129
142
 
130
143
  def_delegator :original_inventory, :hosts
131
144
  def_delegator :test, :suite
132
145
  def_delegator :test, :host_manager
133
146
  def_delegator :suite, :control_directory
134
- def_delegator :server_spec, :run, :verify
147
+
148
+ def verify
149
+ server_spec.run
150
+ ansible_spec.run
151
+ end
152
+
153
+ def results_file
154
+ @results_file ||= File.expand_path('playbook.out', tmp_dir('results', 'ansible'))
155
+ end
156
+
157
+ private
158
+
159
+ def server_spec
160
+ @server_spec ||= ServerSpec.new(self)
161
+ end
162
+
163
+ def ansible_spec
164
+ @ansible_spec ||= AnsibleSpec.new(self)
165
+ end
166
+
167
+ def results_logger
168
+ @results_logger ||= ::Logger.new(results_file).tap do |l|
169
+ l.level = ::Logger::DEBUG
170
+ l.formatter = lambda { |_, _, _, message| message }
171
+ end
172
+ end
135
173
  end
136
174
  end
137
175
  end
@@ -1,5 +1,5 @@
1
1
  module BarkingIguana
2
2
  module Compound
3
- VERSION = "0.1.11"
3
+ VERSION = "0.1.12"
4
4
  end
5
5
  end
@@ -1,5 +1,6 @@
1
1
  require 'barking_iguana/logging'
2
2
  require 'barking_iguana/benchmark'
3
+ require 'barking_iguana/fork_calls'
3
4
 
4
5
  require 'erb'
5
6
  require 'forwardable'
@@ -13,11 +14,13 @@ require 'barking_iguana/compound/ansible'
13
14
  require 'barking_iguana/compound/ansible/inventory'
14
15
  require 'barking_iguana/compound/ansible/inventory_parser'
15
16
  require 'barking_iguana/compound/ansible/inventory_writer'
17
+ require 'barking_iguana/compound/ansible/results_parser'
16
18
  require 'barking_iguana/compound/ansible/playbook'
17
19
  require 'barking_iguana/compound/command_line_client'
18
20
  require 'barking_iguana/compound/environment'
19
21
  require 'barking_iguana/compound/host_manager'
20
22
  require 'barking_iguana/compound/host'
23
+ require 'barking_iguana/compound/ansible_spec'
21
24
  require 'barking_iguana/compound/server_spec'
22
25
  require 'barking_iguana/compound/test_stage'
23
26
  require 'barking_iguana/compound/test'
@@ -0,0 +1 @@
1
+ require 'barking_iguana/compound'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: barking_iguana-compound
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig R Webster
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-17 00:00:00.000000000 Z
11
+ date: 2017-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: barking_iguana-fork_calls
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: mixlib-shellout
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -189,6 +203,9 @@ files:
189
203
  - examples/simple/Rakefile
190
204
  - examples/simple/test/compound/simple/000-setup/example-host/example_spec.rb
191
205
  - examples/simple/test/compound/simple/000-setup/playbook.yml
206
+ - examples/simple/test/compound/simple/001-replay/_ansible/play_spec.rb
207
+ - examples/simple/test/compound/simple/001-replay/example-host/example_spec.rb
208
+ - examples/simple/test/compound/simple/001-replay/playbook.yml
192
209
  - examples/simple/test/compound/simple/Vagrantfile
193
210
  - examples/simple/test/compound/simple/inventory
194
211
  - exe/compound
@@ -198,19 +215,21 @@ files:
198
215
  - lib/barking_iguana/compound/ansible/inventory_parser.rb
199
216
  - lib/barking_iguana/compound/ansible/inventory_writer.rb
200
217
  - lib/barking_iguana/compound/ansible/playbook.rb
218
+ - lib/barking_iguana/compound/ansible/results_parser.rb
219
+ - lib/barking_iguana/compound/ansible_spec.rb
201
220
  - lib/barking_iguana/compound/command_line_client.rb
202
221
  - lib/barking_iguana/compound/environment.rb
203
222
  - lib/barking_iguana/compound/host.rb
204
223
  - lib/barking_iguana/compound/host_manager.rb
205
224
  - lib/barking_iguana/compound/server_spec.rb
206
- - lib/barking_iguana/compound/spec_helper.rb
207
225
  - lib/barking_iguana/compound/test.rb
208
226
  - lib/barking_iguana/compound/test_stage.rb
209
227
  - lib/barking_iguana/compound/test_suite.rb
210
228
  - lib/barking_iguana/compound/vagrant.rb
211
229
  - lib/barking_iguana/compound/version.rb
212
230
  - resources/Vagrantfile.erb
213
- - resources/spec_helper.rb
231
+ - resources/ansible_spec_helper.rb
232
+ - resources/server_spec_helper.rb
214
233
  homepage: https://github.com/barkingiguana/compound
215
234
  licenses: []
216
235
  metadata:
@@ -1,6 +0,0 @@
1
- require 'serverspec'
2
- require 'rspec/wait'
3
-
4
- set :backend, :ssh
5
- set :host, ENV['TARGET_HOST']
6
- set :ssh_options, user: ENV['TARGET_SSH_USER'], keys: [ENV['TARGET_SSH_KEY']]