kitchen-verifier-serverspec 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ebc99abf783948176f30b6938dcd298a74a4ace
4
- data.tar.gz: 05f588ddbd0119ecebf5b29a0534052122a09991
3
+ metadata.gz: 0c6714cf2d0e9650191e995f574f04e41d82a93f
4
+ data.tar.gz: ff945273b667c74be626404334d7e84ec67b140a
5
5
  SHA512:
6
- metadata.gz: ef57b1eeb3b051359b865c77ecf65f2bd2145b0bfea07198410fa19f5d7dd99f5278b718c5ba6707c2f547078fb695a8cfc1c149e35ceda568ad96ff47c9efdb
7
- data.tar.gz: 485b3b455ae5840f0dab7e740b9090991a1bc2958cf6fc13725e1ea890290345152c31309679380b83e847787b778babc990e8bd6dd21bbb2e0dfa08013cea95
6
+ metadata.gz: dff14d247fda8eb4f815aef042f94f4403f9b9cfeb6d797184d39f768d8c43f660b996163847a857cc8cdc8c6179e1d9a30536b7ec1cbbd65bd4235632fbba6f
7
+ data.tar.gz: 566bc642fc3b9e9f6fb147f0dab6136162bfe6853c364e310d9860c75b8c7ebb30a20bac74c18af97c8684eb5cbecd82c945481cf57b7b1aea0d8f408058f6b8
data/README.md CHANGED
@@ -1,156 +1,175 @@
1
- [![Gem Version](https://badge.fury.io/rb/kitchen-verifier-serverspec.svg)](http://badge.fury.io/rb/kitchen-verifier-serverspec)
2
- [![Gem Downloads](http://ruby-gem-downloads-badge.herokuapp.com/kitchen-verifier-serverspec?type=total&color=brightgreen)](https://rubygems.org/gems/kitchen-verifier-serverspec)
3
- [![Build Status](https://travis-ci.org/neillturner/kitchen-verifier-serverspec.png)](https://travis-ci.org/neillturner/kitchen-verifier-serverspec)
4
-
5
- # Kitchen::Verifier::Serverspec
6
-
7
- A Test Kitchen Serverspec Verifer without having to transit the Busser layer.
8
-
9
- This supports running supports running serverspec but remotely on the server and locally on your workstation.
10
- In the next version runners will be supported to provide logic to run serverspec initially supporting ansiblespec.
11
-
12
-
13
- ## Installation
14
-
15
- On your workstation add this line to your Gemfile:
16
-
17
- gem 'kitchen-verifier-serverspec'
18
-
19
- And then execute:
20
-
21
- $ bundle
22
-
23
- Or install it yourself as:
24
-
25
- $ gem install kitchen-verifier-serverspec
26
-
27
- When it runs it install serverspec on the remote server or the workstation if remote_exec set to false.
28
- This can be configured by passing a Gemfile like this:
29
-
30
- ```
31
- source 'https://rubygems.org'
32
-
33
- gem 'net-ssh','~> 2.9'
34
- gem 'serverspec'
35
- ```
36
-
37
- this allows extra dependencies to be specified and the version of serverspec specified.
38
-
39
- ## Usage
40
-
41
-
42
- An example of the verifier serverspec options in your `.kitchen.yml` file:
43
-
44
- ```yaml
45
- verifier:
46
- name: serverspec
47
-
48
- suites:
49
- - name: base
50
- verifier:
51
- patterns:
52
- - modules/mycompany_base/spec/acceptance/base_spec.rb
53
- ```
54
-
55
- See example [https://github.com/neillturner/puppet_repo](https://github.com/neillturner/puppet_repo)
56
-
57
- or with environment variables
58
-
59
- ```yaml
60
- verifier:
61
- name: serverspec
62
-
63
- suites:
64
- - name: base
65
- verifier:
66
- patterns:
67
- - roles/tomcat/spec/tomcat_spec.rb
68
- bundler_path: '/usr/local/bin'
69
- rspec_path: '/home/vagrant/bin'
70
- env_vars:
71
- TARGET_HOST: 172.28.128.7
72
- LOGIN_USER: vagrant
73
- SSH_KEY: 'spec/tomcat_private_key.pem'
74
- ```
75
-
76
- or run on your workstation
77
-
78
- ```yaml
79
- verifier:
80
- name: serverspec
81
- remote_exec: false
82
-
83
- suites:
84
- - name: base
85
- provisioner:
86
- custom_facts:
87
- role_name1: base
88
- verifier:
89
- patterns:
90
- - modules_mycompany/mycompany_base/spec/acceptance/base_local_spec.rb
91
- env_vars:
92
- TARGET_HOST: 127.0.0.1
93
- TARGET_PORT: 2222
94
- LOGIN_USER: vagrant
95
- SSH_KEY: 'c:/repository/puppet_repo/private_key.pem'
96
- ```
97
-
98
- # Custom Runners
99
-
100
- Custon runners can be defined and run to provide further customization.
101
- There is a runner that automatically runs the ansiblespec files for all the hosts from the
102
- ansible provisioner.
103
-
104
- This can be run by specifying in the kitchen yml file:
105
-
106
- ```yaml
107
- verifier:
108
- name: serverspec
109
-
110
- suites:
111
- - name: base
112
- verifier:
113
- runner_url: https://raw.githubusercontent.com/neillturner/serverspec-runners/master/ansiblespec_runner.rb
114
- require_runner: true
115
- bundler_path: '/usr/local/bin'
116
- rspec_path: '/home/vagrant/bin'
117
- env_vars:
118
- TARGET_HOST: 172.28.128.7
119
- LOGIN_USER: vagrant
120
- SSH_KEY: 'spec/tomcat_private_key.pem'
121
- ```
122
-
123
-
124
- # Serverspec Verifier Options
125
-
126
- key | default value | Notes
127
- ----|---------------|--------
128
- sleep | 0 |
129
- remote_exec | true | specify false to run serverspec on workstation
130
- serverspec_command | nil | custom command to run serverspec
131
- format | 'documentation' | format of serverspec output
132
- color | true | enable color in the output
133
- default_path | '/tmp/kitchen' | Set the default path where serverspec looks for patterns
134
- patterns | [] | array of patterns for spec test files
135
- gemfile | nil | custom gemfile to use to install serverspec
136
- install_commmand | 'bundle install' | command to install serverspec
137
- test_serverspec_installed | true | only run install_command if serverspec not installed
138
- extra_flags | nil | extra flags to add to ther serverspec command
139
- remove_default_path | false | remove the default_path after successful serverspec run
140
- http_proxy | nil | use http proxy when installing ruby, serverspec and running serverspec
141
- https_proxy | nil | use https proxy when installing puppet, ruby, serverspec and running serverspec
142
- sudo | nil | use sudo to run commands
143
- env_vars | {} | environment variable to set for rspec
144
- bundle_path | nil | path for bundler command
145
- rspec_path | nil | path for rspec command
146
- runner_url | https://raw.githubusercontent.com /neillturner/serverspec-runners/ master/ansiblespec_runner.rb | url for custom runner
147
- require_runner | false | run the custom runner instead of rspec directly
148
-
149
- ## Contributing
150
-
151
- 1. Fork it
152
- 2. Create your feature branch (`git checkout -b my-new-feature`)
153
- 3. Run style checks and RSpec tests (`bundle exec rake`)
154
- 4. Commit your changes (`git commit -am 'Add some feature'`)
155
- 5. Push to the branch (`git push origin my-new-feature`)
156
- 6. Create new Pull Request
1
+ [![Gem Version](https://badge.fury.io/rb/kitchen-verifier-serverspec.svg)](http://badge.fury.io/rb/kitchen-verifier-serverspec)
2
+ [![Gem Downloads](http://ruby-gem-downloads-badge.herokuapp.com/kitchen-verifier-serverspec?type=total&color=brightgreen)](https://rubygems.org/gems/kitchen-verifier-serverspec)
3
+ [![Build Status](https://travis-ci.org/neillturner/kitchen-verifier-serverspec.png)](https://travis-ci.org/neillturner/kitchen-verifier-serverspec)
4
+
5
+ # Kitchen::Verifier::Serverspec
6
+
7
+ A Test Kitchen Serverspec Verifer without having to transit the Busser layer.
8
+
9
+ This supports running serverspec both remotely on the server and locally on your workstation.
10
+ Runners are supported to provide logic to run serverspec initially supporting ansiblespec.
11
+
12
+
13
+ ## Installation
14
+
15
+ On your workstation add this line to your Gemfile:
16
+
17
+ gem 'kitchen-verifier-serverspec'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install kitchen-verifier-serverspec
26
+
27
+ When it runs it install serverspec on the remote server or the workstation if remote_exec set to false.
28
+ This can be configured by passing a Gemfile like this:
29
+
30
+ ```
31
+ source 'https://rubygems.org'
32
+
33
+ gem 'net-ssh','~> 2.9'
34
+ gem 'serverspec'
35
+ ```
36
+
37
+ this allows extra dependencies to be specified and the version of serverspec specified.
38
+
39
+ ## Usage
40
+
41
+
42
+ An example of the verifier serverspec options in your `.kitchen.yml` file:
43
+
44
+ ```yaml
45
+ verifier:
46
+ name: serverspec
47
+
48
+ suites:
49
+ - name: base
50
+ verifier:
51
+ patterns:
52
+ - modules/mycompany_base/spec/acceptance/base_spec.rb
53
+ ```
54
+
55
+ See example [https://github.com/neillturner/puppet_repo](https://github.com/neillturner/puppet_repo)
56
+
57
+ or with environment variables
58
+
59
+ ```yaml
60
+ verifier:
61
+ name: serverspec
62
+
63
+ suites:
64
+ - name: base
65
+ verifier:
66
+ patterns:
67
+ - roles/tomcat/spec/tomcat_spec.rb
68
+ bundler_path: '/usr/local/bin'
69
+ rspec_path: '/home/vagrant/bin'
70
+ env_vars:
71
+ TARGET_HOST: 172.28.128.7
72
+ LOGIN_USER: vagrant
73
+ SSH_KEY: 'spec/tomcat_private_key.pem'
74
+ ```
75
+
76
+ or run on your workstation
77
+
78
+ ```yaml
79
+ verifier:
80
+ name: serverspec
81
+ remote_exec: false
82
+
83
+ suites:
84
+ - name: base
85
+ provisioner:
86
+ custom_facts:
87
+ role_name1: base
88
+ verifier:
89
+ patterns:
90
+ - modules_mycompany/mycompany_base/spec/acceptance/base_local_spec.rb
91
+ env_vars:
92
+ TARGET_HOST: 127.0.0.1
93
+ TARGET_PORT: 2222
94
+ LOGIN_USER: vagrant
95
+ SSH_KEY: 'c:/repository/puppet_repo/private_key.pem'
96
+ ```
97
+
98
+ # Custom Runners
99
+
100
+ Custon runners can be defined and run to provide further customization.
101
+ There is a runner that automatically runs the ansiblespec files for all the hosts from the
102
+ ansible provisioner.
103
+
104
+ This can be run by specifying in the kitchen yml file:
105
+
106
+ ```yaml
107
+ verifier:
108
+ name: serverspec
109
+
110
+ suites:
111
+ - name: base
112
+ verifier:
113
+ runner_url: https://raw.githubusercontent.com/neillturner/serverspec-runners/master/ansiblespec_runner.rb
114
+ require_runner: true
115
+ bundler_path: '/usr/local/bin'
116
+ rspec_path: '/home/vagrant/bin'
117
+ env_vars:
118
+ TARGET_HOST: 172.28.128.7
119
+ LOGIN_USER: vagrant
120
+ SSH_KEY: 'spec/tomcat_private_key.pem'
121
+ ```
122
+
123
+
124
+ # Serverspec Verifier Options
125
+
126
+ key | default value | Notes
127
+ ----|---------------|--------
128
+ sleep | 0 |
129
+ remote_exec | true | specify false to run serverspec on workstation
130
+ serverspec_command | nil | custom command to run serverspec
131
+ format | 'documentation' | format of serverspec output
132
+ color | true | enable color in the output
133
+ default_path | '/tmp/kitchen' | Set the default path where serverspec looks for patterns
134
+ patterns | [] | array of patterns for spec test files
135
+ gemfile | nil | custom gemfile to use to install serverspec
136
+ custom_install_commmand | nil | Custom shell command to be used at install stage. Can be multiline. See examples below.
137
+ test_serverspec_installed | true | only run install_command if serverspec not installed
138
+ extra_flags | nil | extra flags to add to ther serverspec command
139
+ remove_default_path | false | remove the default_path after successful serverspec run
140
+ http_proxy | nil | use http proxy when installing ruby, serverspec and running serverspec
141
+ https_proxy | nil | use https proxy when installing puppet, ruby, serverspec and running serverspec
142
+ sudo | nil | use sudo to run commands
143
+ env_vars | {} | environment variable to set for rspec
144
+ bundler_path | nil | path for bundler command
145
+ rspec_path | nil | path for rspec command
146
+ runner_url | https://raw.githubusercontent.com /neillturner/serverspec-runners/ master/ansiblespec_runner.rb | url for custom runner
147
+ require_runner | false | run the custom runner instead of rspec directly
148
+
149
+ #### custom_install_command example usage
150
+
151
+ * One liner
152
+ ```yaml
153
+ custom_install_command: yum install -y git
154
+ ```
155
+ * Multiple lines, a.k.a embed shell script
156
+ ```yaml
157
+ custom_install_command: |
158
+ command1
159
+ command2
160
+ ```
161
+ * Multiple lines join without new line
162
+ ```yaml
163
+ custom_install_command: >
164
+ command1 &&
165
+ command2
166
+ ```
167
+
168
+ ## Contributing
169
+
170
+ 1. Fork it
171
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
172
+ 3. Run style checks and RSpec tests (`bundle exec rake`)
173
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
174
+ 5. Push to the branch (`git push origin my-new-feature`)
175
+ 6. Create new Pull Request
@@ -1,25 +1,25 @@
1
- # encoding: utf-8
2
-
3
- $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
4
-
5
- require 'kitchen/verifier/serverspec_version'
6
-
7
- Gem::Specification.new do |s|
8
- s.name = 'kitchen-verifier-serverspec'
9
- s.license = 'Apache-2.0'
10
- s.version = Kitchen::Verifier::SERVERSPEC_VERSION
11
- s.authors = ['Neill Turner']
12
- s.email = ['neillwturner@gmail.com']
13
- s.homepage = 'https://github.com/neillturner/kitchen-verifier-serverspec'
14
- s.summary = 'Serverspec verifier for Test-Kitchen without having to transit the Busser layer. '
15
- candidates = Dir.glob('{lib}/**/*') + ['README.md', 'kitchen-verifier-serverspec.gemspec']
16
- s.files = candidates.sort
17
- s.platform = Gem::Platform::RUBY
18
- s.require_paths = ['lib']
19
- s.rubyforge_project = '[none]'
20
- s.add_dependency 'test-kitchen', '~> 1.4'
21
- s.add_dependency 'net-ssh', '~> 2.0'
22
- s.description = <<-EOF
23
- Serverspec verifier for Test-Kitchen without having to transit the Busser layer.
24
- EOF
25
- end
1
+ # encoding: utf-8
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
4
+
5
+ require 'kitchen/verifier/serverspec_version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'kitchen-verifier-serverspec'
9
+ s.license = 'Apache-2.0'
10
+ s.version = Kitchen::Verifier::SERVERSPEC_VERSION
11
+ s.authors = ['Neill Turner']
12
+ s.email = ['neillwturner@gmail.com']
13
+ s.homepage = 'https://github.com/neillturner/kitchen-verifier-serverspec'
14
+ s.summary = 'Serverspec verifier for Test-Kitchen without having to transit the Busser layer. '
15
+ candidates = Dir.glob('{lib}/**/*') + ['README.md', 'kitchen-verifier-serverspec.gemspec']
16
+ s.files = candidates.sort
17
+ s.platform = Gem::Platform::RUBY
18
+ s.require_paths = ['lib']
19
+ s.rubyforge_project = '[none]'
20
+ s.add_dependency 'test-kitchen', '~> 1.4'
21
+ s.add_dependency 'net-ssh', '~> 2.0'
22
+ s.description = <<-EOF
23
+ Serverspec verifier for Test-Kitchen without having to transit the Busser layer.
24
+ EOF
25
+ end
@@ -1,347 +1,349 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require 'kitchen/verifier/base'
16
-
17
- module Kitchen
18
- module Verifier
19
- # Serverspec verifier for Kitchen.
20
- class Serverspec < Kitchen::Verifier::Base
21
- require 'mixlib/shellout'
22
-
23
- kitchen_verifier_api_version 1
24
-
25
- plugin_version Kitchen::VERSION
26
-
27
- default_config :sleep, 0
28
- default_config :serverspec_command, nil
29
- default_config :shellout_opts, {}
30
- default_config :live_stream, $stdout
31
- default_config :remote_exec, true
32
- default_config :format, 'documentation'
33
- default_config :color, true
34
- default_config :default_path, '/tmp/kitchen'
35
- default_config :patterns, []
36
- default_config :gemfile, nil
37
- default_config :install_commmand, 'bundle install'
38
- default_config :test_serverspec_installed, true
39
- default_config :extra_flags, nil
40
- default_config :remove_default_path, false
41
- default_config :env_vars, {}
42
- default_config :bundle_path, nil
43
- default_config :rspec_path, nil
44
- default_config :require_runner, false
45
- default_config :runner_url, 'https://raw.githubusercontent.com/neillturner/serverspec-runners/master/ansiblespec_runner.rb'
46
-
47
- # (see Base#call)
48
- def call(state)
49
- info("[#{name}] Verify on instance=#{instance} with state=#{state}")
50
- sleep_if_set
51
- merge_state_to_env(state)
52
- if config[:remote_exec]
53
- instance.transport.connection(state) do |conn|
54
- conn.execute(install_command)
55
- conn.execute(serverspec_commands)
56
- end
57
- else
58
- config[:default_path] = Dir.pwd if config[:default_path] == '/tmp/kitchen'
59
- install_command
60
- serverspec_commands
61
- end
62
- debug("[#{name}] Verify completed.")
63
- end
64
-
65
- ## for legacy drivers.
66
- def run_command
67
- sleep_if_set
68
- serverspec_commands
69
- end
70
-
71
- def setup_cmd
72
- sleep_if_set
73
- install_command
74
- end
75
-
76
- private
77
-
78
- def serverspec_commands
79
- if config[:remote_exec]
80
- if config[:serverspec_command]
81
- <<-INSTALL
82
- #{config[:serverspec_command]}
83
- INSTALL
84
- else
85
- <<-INSTALL
86
- if [ -d #{config[:default_path]} ]; then
87
- cd #{config[:default_path]}
88
- #{rspec_commands}
89
- #{remove_default_path}
90
- else
91
- echo "ERROR: Default path '#{config[:default_path]}' does not exist"
92
- exit 1
93
- fi
94
- INSTALL
95
- end
96
- elsif config[:serverspec_command]
97
- info("Running command: #{config[:serverspec_command]}")
98
- system config[:serverspec_command]
99
- else
100
- c = rspec_commands
101
- info("Running command: #{c}")
102
- system c
103
- end
104
- end
105
-
106
- def install_command
107
- if config[:remote_exec]
108
- info('Installing ruby, bundler and serverspec')
109
- <<-INSTALL
110
- if [ ! $(which ruby) ]; then
111
- echo '-----> Installing ruby, will try to determine platform os'
112
- if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ] || [ -f /etc/oracle-release ]; then
113
- #{sudo_env('yum')} -y install ruby
114
- else
115
- if [ -f /etc/system-release ] || [ grep -q 'Amazon Linux' /etc/system-release ]; then
116
- #{sudo_env('yum')} -y install ruby
117
- else
118
- #{sudo_env('apt-get')} -y install ruby
119
- fi
120
- fi
121
- fi
122
- #{install_bundler}
123
- if [ -d #{config[:default_path]} ]; then
124
- #{install_serverspec}
125
- #{install_runner}
126
- else
127
- echo "ERROR: Default path '#{config[:default_path]}' does not exist"
128
- exit 1
129
- fi
130
- INSTALL
131
- else
132
- info('Installing bundler and serverspec')
133
- install_bundler
134
- install_serverspec
135
- install_runner
136
- end
137
- end
138
-
139
- def install_bundler
140
- if config[:remote_exec]
141
- <<-INSTALL
142
- if [ $(#{sudo('gem')} list bundler -i) == 'false' ]; then
143
- #{sudo_env('gem')} install #{gem_proxy_parm} --no-ri --no-rdoc bundler
144
- fi
145
- INSTALL
146
- else
147
- begin
148
- require 'bundler'
149
- rescue LoadError
150
- system `gem install --no-ri --no-rdoc bundler`
151
- end
152
- end
153
- end
154
-
155
- def install_runner
156
- if config[:require_runner]
157
- if config[:remote_exec]
158
- <<-INSTALL
159
- if [ ! -f #{config[:default_path]}/#{runner_filename} ]; then
160
- #{sudo_env('curl')} -o #{config[:default_path]}/#{runner_filename} #{config[:runner_url]}
161
- fi
162
- INSTALL
163
- else
164
- raise ActionFailed, 'Serverspec Runners only for remote execution'
165
- end
166
- end
167
- end
168
-
169
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
170
- def install_serverspec
171
- if config[:remote_exec]
172
- bundler_cmd = "#{bundler_path}bundler"
173
- <<-INSTALL
174
- #{test_serverspec_installed}
175
- #{install_gemfile}
176
- #{sudo_env(bundler_cmd)} install --gemfile=#{config[:default_path]}/Gemfile
177
- #{fi_test_serverspec_installed}
178
- INSTALL
179
- else
180
- if config[:test_serverspec_installed]
181
- begin
182
- require 'serverspec'
183
- return
184
- rescue LoadError
185
- info('serverspec not installed installing ...')
186
- end
187
- end
188
- unless config[:gemfile]
189
- gemfile = "#{config[:default_path]}/Gemfile"
190
- File.open(gemfile, 'w') do |f|
191
- f.write("source 'https://rubygems.org'\ngem 'net-ssh','~> 2.9.4'\ngem 'serverspec'")
192
- end
193
- end
194
- gemfile = config[:gemfile] if config[:gemfile]
195
- begin
196
- system "bundler install --gemfile=#{gemfile}"
197
- rescue
198
- raise ActionFailed, 'Serverspec install failed'
199
- end
200
- nil
201
- end
202
- end
203
-
204
- def install_gemfile
205
- if config[:gemfile]
206
- <<-INSTALL
207
- #{read_gemfile}
208
- INSTALL
209
- else
210
- <<-INSTALL
211
- #{sudo('rm')} -f #{config[:default_path]}/Gemfile
212
- #{sudo('echo')} "source 'https://rubygems.org'" >> #{config[:default_path]}/Gemfile
213
- #{sudo('echo')} "gem 'net-ssh','~> 2.9'" >> #{config[:default_path]}/Gemfile
214
- #{sudo('echo')} "gem 'serverspec'" >> #{config[:default_path]}/Gemfile
215
- INSTALL
216
- end
217
- end
218
-
219
- def read_gemfile
220
- data = "#{sudo('rm')} -f #{config[:default_path]}/Gemfile\n"
221
- f = File.open(config[:gemfile], 'r')
222
- f.each_line do |line|
223
- data = "#{data}#{sudo('echo')} \"#{line}\" >> #{config[:default_path]}/Gemfile\n"
224
- end
225
- f.close
226
- data
227
- end
228
-
229
- def remove_default_path
230
- info('Removing default path') if config[:remove_default_path]
231
- config[:remove_default_path] ? "rm -rf #{config[:default_path]}" : nil
232
- end
233
-
234
- def test_serverspec_installed
235
- config[:test_serverspec_installed] ? "if [ $(#{sudo('gem')} list serverspec -i) == 'false' ]; then" : nil
236
- end
237
-
238
- def fi_test_serverspec_installed
239
- config[:test_serverspec_installed] ? 'fi' : nil
240
- end
241
-
242
- def rspec_commands
243
- info('Running Serverspec')
244
- if config[:require_runner]
245
- "#{env_vars} #{sudo_env(rspec_cmd)} #{color} -f #{config[:format]} --default-path #{config[:default_path]} #{rspec_path_option} #{config[:extra_flags]}"
246
- else
247
- config[:patterns].map { |s| "#{env_vars} #{sudo_env(rspec_cmd)} #{color} -f #{config[:format]} --default-path #{config[:default_path]} #{config[:extra_flags]} -P #{s}" }.join('\n')
248
- end
249
- end
250
-
251
- def rspec_cmd
252
- config[:require_runner] ? "ruby #{config[:default_path]}/#{runner_filename}" : "#{rspec_path}rspec"
253
- end
254
-
255
- def env_vars
256
- return nil if config[:env_vars].none?
257
- cmd = nil
258
- if !config[:remote_exec]
259
- config[:env_vars].map do |k, v|
260
- info("Environment variable #{k} value #{v}")
261
- ENV[k.to_s] = v.to_s
262
- end
263
- else
264
- cmd = config[:env_vars].map { |k, v| "#{k}=#{v}" }.join(' ')
265
- debug(cmd)
266
- end
267
- cmd
268
- end
269
-
270
- def sudo_env(pm)
271
- if config[:remote_exec]
272
- s = https_proxy ? "https_proxy=#{https_proxy}" : nil
273
- p = http_proxy ? "http_proxy=#{http_proxy}" : nil
274
- p || s ? "#{sudo('env')} #{p} #{s} #{pm}" : sudo(pm).to_s
275
- else
276
- # TODO: handle proxies
277
- pm
278
- end
279
- end
280
-
281
- def bundler_path
282
- config[:bundler_path] ? "#{config[:bundler_path]}/" : nil
283
- end
284
-
285
- def rspec_path
286
- config[:rspec_path] ? "#{config[:rspec_path]}/" : nil
287
- end
288
-
289
- def rspec_path_option
290
- config[:rspec_path] ? "--rspec-path #{config[:rspec_path]}/" : nil
291
- end
292
-
293
- def runner_filename
294
- File.basename(config[:runner_url])
295
- end
296
-
297
- def http_proxy
298
- config[:http_proxy]
299
- end
300
-
301
- def https_proxy
302
- config[:https_proxy]
303
- end
304
-
305
- def gem_proxy_parm
306
- http_proxy ? "--http-proxy #{http_proxy}" : nil
307
- end
308
-
309
- def color
310
- config[:color] ? '-c' : nil
311
- end
312
-
313
- # Sleep for a period of time, if a value is set in the config.
314
- #
315
- # @api private
316
- def sleep_if_set
317
- config[:sleep].to_i.times do
318
- print '.'
319
- sleep 1
320
- end
321
- end
322
-
323
- def shellout(command)
324
- info("Running command: #{command}")
325
- cmd = Mixlib::ShellOut.new(command, config[:shellout_opts])
326
- cmd.live_stream = config[:live_stream]
327
- cmd.run_command
328
- begin
329
- cmd.error!
330
- rescue Mixlib::ShellOut::ShellCommandFailed
331
- raise ActionFailed, "Action #verify failed for #{instance.to_str}."
332
- end
333
- end
334
-
335
- def merge_state_to_env(state)
336
- env_state = { :environment => {} }
337
- env_state[:environment]['KITCHEN_INSTANCE'] = instance.name
338
- env_state[:environment]['KITCHEN_PLATFORM'] = instance.platform.name
339
- env_state[:environment]['KITCHEN_SUITE'] = instance.suite.name
340
- state.each_pair do |key, value|
341
- env_state[:environment]['KITCHEN_' + key.to_s.upcase] = value
342
- end
343
- config[:shellout_opts].merge!(env_state)
344
- end
345
- end
346
- end
347
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'kitchen/verifier/base'
16
+
17
+ module Kitchen
18
+ module Verifier
19
+ # Serverspec verifier for Kitchen.
20
+ class Serverspec < Kitchen::Verifier::Base
21
+ require 'mixlib/shellout'
22
+
23
+ kitchen_verifier_api_version 1
24
+
25
+ plugin_version Kitchen::VERSION
26
+
27
+ default_config :sleep, 0
28
+ default_config :serverspec_command, nil
29
+ default_config :shellout_opts, {}
30
+ default_config :live_stream, $stdout
31
+ default_config :remote_exec, true
32
+ default_config :format, 'documentation'
33
+ default_config :color, true
34
+ default_config :default_path, '/tmp/kitchen'
35
+ default_config :patterns, []
36
+ default_config :gemfile, nil
37
+ default_config :custom_install_command, nil
38
+ default_config :test_serverspec_installed, true
39
+ default_config :extra_flags, nil
40
+ default_config :remove_default_path, false
41
+ default_config :env_vars, {}
42
+ default_config :bundler_path, nil
43
+ default_config :rspec_path, nil
44
+ default_config :require_runner, false
45
+ default_config :runner_url, 'https://raw.githubusercontent.com/neillturner/serverspec-runners/master/ansiblespec_runner.rb'
46
+
47
+ # (see Base#call)
48
+ def call(state)
49
+ info("[#{name}] Verify on instance=#{instance} with state=#{state}")
50
+ sleep_if_set
51
+ merge_state_to_env(state)
52
+ if config[:remote_exec]
53
+ instance.transport.connection(state) do |conn|
54
+ conn.execute(install_command)
55
+ conn.execute(serverspec_commands)
56
+ end
57
+ else
58
+ config[:default_path] = Dir.pwd if config[:default_path] == '/tmp/kitchen'
59
+ install_command
60
+ serverspec_commands
61
+ end
62
+ debug("[#{name}] Verify completed.")
63
+ end
64
+
65
+ ## for legacy drivers.
66
+ def run_command
67
+ sleep_if_set
68
+ serverspec_commands
69
+ end
70
+
71
+ def setup_cmd
72
+ sleep_if_set
73
+ install_command
74
+ end
75
+
76
+ def serverspec_commands
77
+ if config[:remote_exec]
78
+ if config[:serverspec_command]
79
+ <<-INSTALL
80
+ #{config[:serverspec_command]}
81
+ INSTALL
82
+ else
83
+ <<-INSTALL
84
+ if [ -d #{config[:default_path]} ]; then
85
+ cd #{config[:default_path]}
86
+ #{rspec_commands}
87
+ #{remove_default_path}
88
+ else
89
+ echo "ERROR: Default path '#{config[:default_path]}' does not exist"
90
+ exit 1
91
+ fi
92
+ INSTALL
93
+ end
94
+ elsif config[:serverspec_command]
95
+ info("Running command: #{config[:serverspec_command]}")
96
+ system config[:serverspec_command]
97
+ else
98
+ c = rspec_commands
99
+ info("Running command: #{c}")
100
+ system c
101
+ end
102
+ end
103
+
104
+ def install_command
105
+ info('Installing with custom install command') if config[:custom_install_command]
106
+ return config[:custom_install_command] if config[:custom_install_command]
107
+ if config[:remote_exec]
108
+ info('Installing ruby, bundler and serverspec remotely on server')
109
+ <<-INSTALL
110
+ if [ ! $(which ruby) ]; then
111
+ echo '-----> Installing ruby, will try to determine platform os'
112
+ if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ] || [ -f /etc/oracle-release ]; then
113
+ #{sudo_env('yum')} -y install ruby
114
+ else
115
+ if [ -f /etc/system-release ] || [ grep -q 'Amazon Linux' /etc/system-release ]; then
116
+ #{sudo_env('yum')} -y install ruby
117
+ else
118
+ #{sudo_env('apt-get')} -y install ruby
119
+ fi
120
+ fi
121
+ fi
122
+ #{install_bundler}
123
+ if [ -d #{config[:default_path]} ]; then
124
+ #{install_serverspec}
125
+ #{install_runner}
126
+ else
127
+ echo "ERROR: Default path '#{config[:default_path]}' does not exist"
128
+ exit 1
129
+ fi
130
+ INSTALL
131
+ else
132
+ info('Installing bundler and serverspec locally on workstation')
133
+ install_bundler
134
+ install_serverspec
135
+ install_runner
136
+ end
137
+ end
138
+
139
+ # private
140
+
141
+ def install_bundler
142
+ if config[:remote_exec]
143
+ <<-INSTALL
144
+ if [ $(#{sudo('gem')} list bundler -i) == 'false' ]; then
145
+ #{sudo_env('gem')} install #{gem_proxy_parm} --no-ri --no-rdoc bundler
146
+ fi
147
+ INSTALL
148
+ else
149
+ begin
150
+ require 'bundler'
151
+ rescue LoadError
152
+ system `gem install --no-ri --no-rdoc bundler`
153
+ end
154
+ end
155
+ end
156
+
157
+ def install_runner
158
+ if config[:require_runner]
159
+ if config[:remote_exec]
160
+ <<-INSTALL
161
+ if [ ! -f #{config[:default_path]}/#{runner_filename} ]; then
162
+ #{sudo_env('curl')} -o #{config[:default_path]}/#{runner_filename} #{config[:runner_url]}
163
+ fi
164
+ INSTALL
165
+ else
166
+ raise ActionFailed, 'Serverspec Runners only for remote execution'
167
+ end
168
+ end
169
+ end
170
+
171
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
172
+ def install_serverspec
173
+ bundler_cmd = "#{bundler_path}bundler"
174
+ if config[:remote_exec]
175
+ <<-INSTALL
176
+ #{test_serverspec_installed}
177
+ #{install_gemfile}
178
+ #{sudo_env(bundler_cmd)} install --gemfile=#{config[:default_path]}/Gemfile
179
+ #{fi_test_serverspec_installed}
180
+ INSTALL
181
+ else
182
+ if config[:test_serverspec_installed]
183
+ begin
184
+ require 'serverspec'
185
+ return
186
+ rescue LoadError
187
+ info('serverspec not installed installing ...')
188
+ end
189
+ end
190
+ unless config[:gemfile]
191
+ gemfile = "#{config[:default_path]}/Gemfile"
192
+ File.open(gemfile, 'w') do |f|
193
+ f.write("source 'https://rubygems.org'\ngem 'net-ssh','~> 2.9.4'\ngem 'serverspec'")
194
+ end
195
+ end
196
+ gemfile = config[:gemfile] if config[:gemfile]
197
+ begin
198
+ system "#{bundler_cmd} install --gemfile=#{gemfile}"
199
+ rescue
200
+ raise ActionFailed, 'Serverspec install failed'
201
+ end
202
+ nil
203
+ end
204
+ end
205
+
206
+ def install_gemfile
207
+ if config[:gemfile]
208
+ <<-INSTALL
209
+ #{read_gemfile}
210
+ INSTALL
211
+ else
212
+ <<-INSTALL
213
+ #{sudo('rm')} -f #{config[:default_path]}/Gemfile
214
+ #{sudo('echo')} "source 'https://rubygems.org'" >> #{config[:default_path]}/Gemfile
215
+ #{sudo('echo')} "gem 'net-ssh','~> 2.9'" >> #{config[:default_path]}/Gemfile
216
+ #{sudo('echo')} "gem 'serverspec'" >> #{config[:default_path]}/Gemfile
217
+ INSTALL
218
+ end
219
+ end
220
+
221
+ def read_gemfile
222
+ data = "#{sudo('rm')} -f #{config[:default_path]}/Gemfile\n"
223
+ f = File.open(config[:gemfile], 'r')
224
+ f.each_line do |line|
225
+ data = "#{data}#{sudo('echo')} \"#{line}\" >> #{config[:default_path]}/Gemfile\n"
226
+ end
227
+ f.close
228
+ data
229
+ end
230
+
231
+ def remove_default_path
232
+ info('Removing default path') if config[:remove_default_path]
233
+ config[:remove_default_path] ? "rm -rf #{config[:default_path]}" : nil
234
+ end
235
+
236
+ def test_serverspec_installed
237
+ config[:test_serverspec_installed] ? "if [ $(#{sudo('gem')} list serverspec -i) == 'false' ]; then" : nil
238
+ end
239
+
240
+ def fi_test_serverspec_installed
241
+ config[:test_serverspec_installed] ? 'fi' : nil
242
+ end
243
+
244
+ def rspec_commands
245
+ info('Running Serverspec')
246
+ if config[:require_runner]
247
+ "#{env_vars} #{sudo_env(rspec_cmd)} #{color} -f #{config[:format]} --default-path #{config[:default_path]} #{rspec_path_option} #{config[:extra_flags]}"
248
+ else
249
+ config[:patterns].map { |s| "#{env_vars} #{sudo_env(rspec_cmd)} #{color} -f #{config[:format]} --default-path #{config[:default_path]} #{config[:extra_flags]} -P #{s}" }.join('\n')
250
+ end
251
+ end
252
+
253
+ def rspec_cmd
254
+ config[:require_runner] ? "ruby #{config[:default_path]}/#{runner_filename}" : "#{rspec_path}rspec"
255
+ end
256
+
257
+ def env_vars
258
+ return nil if config[:env_vars].none?
259
+ cmd = nil
260
+ if !config[:remote_exec]
261
+ config[:env_vars].map do |k, v|
262
+ info("Environment variable #{k} value #{v}")
263
+ ENV[k.to_s] = v.to_s
264
+ end
265
+ else
266
+ cmd = config[:env_vars].map { |k, v| "#{k}=#{v}" }.join(' ')
267
+ debug(cmd)
268
+ end
269
+ cmd
270
+ end
271
+
272
+ def sudo_env(pm)
273
+ if config[:remote_exec]
274
+ s = https_proxy ? "https_proxy=#{https_proxy}" : nil
275
+ p = http_proxy ? "http_proxy=#{http_proxy}" : nil
276
+ p || s ? "#{sudo('env')} #{p} #{s} #{pm}" : sudo(pm).to_s
277
+ else
278
+ # TODO: handle proxies
279
+ pm
280
+ end
281
+ end
282
+
283
+ def bundler_path
284
+ config[:bundler_path] ? "#{config[:bundler_path]}/" : nil
285
+ end
286
+
287
+ def rspec_path
288
+ config[:rspec_path] ? "#{config[:rspec_path]}/" : nil
289
+ end
290
+
291
+ def rspec_path_option
292
+ config[:rspec_path] ? "--rspec-path #{config[:rspec_path]}/" : nil
293
+ end
294
+
295
+ def runner_filename
296
+ File.basename(config[:runner_url])
297
+ end
298
+
299
+ def http_proxy
300
+ config[:http_proxy]
301
+ end
302
+
303
+ def https_proxy
304
+ config[:https_proxy]
305
+ end
306
+
307
+ def gem_proxy_parm
308
+ http_proxy ? "--http-proxy #{http_proxy}" : nil
309
+ end
310
+
311
+ def color
312
+ config[:color] ? '-c' : nil
313
+ end
314
+
315
+ # Sleep for a period of time, if a value is set in the config.
316
+ #
317
+ # @api private
318
+ def sleep_if_set
319
+ config[:sleep].to_i.times do
320
+ print '.'
321
+ sleep 1
322
+ end
323
+ end
324
+
325
+ def shellout(command)
326
+ info("Running command: #{command}")
327
+ cmd = Mixlib::ShellOut.new(command, config[:shellout_opts])
328
+ cmd.live_stream = config[:live_stream]
329
+ cmd.run_command
330
+ begin
331
+ cmd.error!
332
+ rescue Mixlib::ShellOut::ShellCommandFailed
333
+ raise ActionFailed, "Action #verify failed for #{instance.to_str}."
334
+ end
335
+ end
336
+
337
+ def merge_state_to_env(state)
338
+ env_state = { :environment => {} }
339
+ env_state[:environment]['KITCHEN_INSTANCE'] = instance.name
340
+ env_state[:environment]['KITCHEN_PLATFORM'] = instance.platform.name
341
+ env_state[:environment]['KITCHEN_SUITE'] = instance.suite.name
342
+ state.each_pair do |key, value|
343
+ env_state[:environment]['KITCHEN_' + key.to_s.upcase] = value
344
+ end
345
+ config[:shellout_opts].merge!(env_state)
346
+ end
347
+ end
348
+ end
349
+ end
@@ -1,7 +1,7 @@
1
- # encoding: UTF-8
2
-
3
- module Kitchen
4
- module Verifier
5
- SERVERSPEC_VERSION = '0.3.0'.freeze
6
- end
7
- end
1
+ # encoding: UTF-8
2
+
3
+ module Kitchen
4
+ module Verifier
5
+ SERVERSPEC_VERSION = '0.3.1'.freeze
6
+ end
7
+ end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-verifier-serverspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neill Turner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-10 00:00:00.000000000 Z
11
+ date: 2016-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: net-ssh
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.0'
41
41
  description: |
@@ -60,17 +60,17 @@ require_paths:
60
60
  - lib
61
61
  required_ruby_version: !ruby/object:Gem::Requirement
62
62
  requirements:
63
- - - '>='
63
+ - - ">="
64
64
  - !ruby/object:Gem::Version
65
65
  version: '0'
66
66
  required_rubygems_version: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - '>='
68
+ - - ">="
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  requirements: []
72
- rubyforge_project: '[none]'
73
- rubygems_version: 2.0.14
72
+ rubyforge_project: "[none]"
73
+ rubygems_version: 2.2.2
74
74
  signing_key:
75
75
  specification_version: 4
76
76
  summary: Serverspec verifier for Test-Kitchen without having to transit the Busser