kitchen-chefzero-nodes 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 44ac7594d4c8c6f1337e404aafa2e32aec4a7faa
4
+ data.tar.gz: cec1c8f38ddd069ccf23be174eb17e3d89d25448
5
+ SHA512:
6
+ metadata.gz: 57186d05037fe12095c9004335ea302ea3c4c6bd496f45075f6e2f834c26e7ebc956a9174ed626b70ffe7ee968b79588cb65e3b1d98b5dd7dd188cf73de19594
7
+ data.tar.gz: 95c486a953f785d2171c67dd8f35a0e59b0b2cf3974232684c5ff47a34eed44db10eb506deb30f1d746334200987599d19355b024275c371ffce708948a64a82
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ # Editors etc
2
+ *~
3
+ *#
4
+ .#*
5
+ \#*#
6
+ .*.sw[a-z]
7
+ *.un~
8
+
9
+ *.gem
10
+ .bundle/
11
+ .config/
12
+ .kitchen/
13
+ Gemfile.lock
14
+ Policyfile.lock.json
15
+ pkg/
16
+ test/integration/nodes
17
+ .kitchen.local.yml
data/.kitchen.yml ADDED
@@ -0,0 +1,46 @@
1
+ ---
2
+ driver:
3
+ name: vagrant
4
+ provider: parallels
5
+
6
+ provisioner:
7
+ name: chef_zero_nodes
8
+ nodes_path: test/integration/nodes
9
+ policyfile: test/integration/cookbooks/test/Policyfile.rb
10
+
11
+ platforms:
12
+ - name: el6
13
+ driver:
14
+ box: bento/centos-6.8
15
+
16
+ - name: win2012R2
17
+ driver:
18
+ box: win-2012r2-base
19
+ customize:
20
+ memsize: 2048
21
+ cpus: 2
22
+
23
+ suites:
24
+ - name: sftp
25
+ transport:
26
+ name: sftp
27
+ provisioner:
28
+ named_run_list: sftp
29
+ excludes:
30
+ - win2012R2
31
+
32
+ - name: winrm
33
+ transport:
34
+ name: winrm
35
+ provisioner:
36
+ named_run_list: win
37
+ excludes:
38
+ - el6
39
+
40
+ - name: ssh
41
+ transport:
42
+ name: ssh
43
+ provisioner:
44
+ named_run_list: ssh
45
+ excludes:
46
+ - win2012R2
data/.rubocop.yml ADDED
@@ -0,0 +1,30 @@
1
+ AllCops:
2
+ Exclude:
3
+ - vendor/**/*
4
+
5
+ AlignParameters:
6
+ Enabled: false
7
+ ClassLength:
8
+ Enabled: false
9
+ CyclomaticComplexity:
10
+ Enabled: false
11
+ Documentation:
12
+ Enabled: false
13
+ Encoding:
14
+ Enabled: false
15
+ Style/FileName:
16
+ Enabled: false
17
+ LineLength:
18
+ Enabled: false
19
+ MethodLength:
20
+ Enabled: false
21
+ Metrics/AbcSize:
22
+ Enabled: false
23
+ PerceivedComplexity:
24
+ Enabled: false
25
+ Style/SpaceBeforeFirstArg:
26
+ Enabled: false
27
+ Style/ClassAndModuleChildren:
28
+ Enabled: false
29
+ Style/FileName:
30
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,2 @@
1
+ ## 1.0.0 (Sep 17, 2016)
2
+ - Initial release of kitchen-chefzero-nodes
data/Gemfile ADDED
@@ -0,0 +1,23 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :rake do
6
+ gem 'rake'
7
+ end
8
+
9
+ group :lint do
10
+ gem 'rubocop', '~> 0.37'
11
+ end
12
+
13
+ group :unit do
14
+ gem 'chefspec', '~> 4.5'
15
+ gem 'rspec', '~> 3.0'
16
+ end
17
+
18
+ group :kitchen do
19
+ gem 'chef-dk', '~> 0.10'
20
+ gem 'test-kitchen', '~> 1.5'
21
+ gem 'kitchen-sync', '~> 2.0'
22
+ gem 'kitchen-vagrant', '~> 0.19'
23
+ end
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Kitchen::ChefZeroNodes
2
+
3
+ Provisioner `chef_zero_nodes` extends `chef_zero` by adding one more step in the end of converge - it downloads the resulted node
4
+ JSON object to the `nodes_path` on the host machine after successful converge. It allows you to use this node object for searches while converging another
5
+ Test Kitchen suites. So, you can use actual node attributes like ipaddress/fqdn to communicate nodes with each other.
6
+
7
+ For example, 'web' node need to search 'db' node ip.
8
+ In `chef_zero` we have to create mock in node_path for this search. `chef_zero_nodes` will save mock automatically after 'db' successful converge.
9
+
10
+ ## Requirements
11
+
12
+ * ChefDK 0.12.0+
13
+ * Test Kitchen 1.10+
14
+
15
+ ## Supports
16
+
17
+ * Linux
18
+ * Windows 2012 RC2
19
+
20
+ ## Installation
21
+
22
+ ```
23
+ gem install kitchen-chefzero-nodes
24
+ ```
25
+
26
+ ## Configuration
27
+
28
+ Use `chef_zero_nodes` instead of `chef_zero` for the kitchen provisioner name.
29
+
30
+ ```
31
+ provisioner:
32
+ name: chef_zero_nodes
33
+ ```
34
+
35
+ ## Development
36
+
37
+ * Source hosted at [GitHub](https://github.com/scopenco/kitchen-chefzero-nodes)
38
+ * Report issues/questions/feature requests on [GitHub Issues](https://github.com/scopenco/kitchen-chefzero-nodes/issues)
39
+
40
+ Pull requests are very welcome! Make sure your patches are well tested.
41
+ Ideally create a topic branch for every separate change you make. For
42
+ example:
43
+
44
+ 1. Fork the repo
45
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
46
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
47
+ 4. Push to the branch (`git push origin my-new-feature`)
48
+ 5. Create new Pull Request
49
+
50
+ ## Testing
51
+
52
+ 1. Run `bundle install`
53
+ 2. Run `rake` for unit testing
54
+
55
+ ## Authors
56
+
57
+ Created and maintained by [Andrei Skopenko][author] (<andrei@skopenko.net>)
58
+
59
+ ## License
60
+
61
+ Apache 2.0
62
+
63
+
64
+ [author]: https://github.com/scopenco
65
+ [issues]: https://github.com/scopenco/kitchen-policyfile-nodes/issues
66
+ [license]: https://github.com/scopenco/kitchen-policyfile-nodes/blob/master/LICENSE
67
+ [repo]: https://github.com/scopenco/kitchen-policyfile-nodes
68
+ [driver_usage]: http://docs.kitchen-ci.org/drivers/usage
69
+ [chef_omnibus_dl]: http://www.getchef.com/chef/install/
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+ require 'kitchen'
7
+ require 'chef-dk/cli'
8
+
9
+ # Rubocop
10
+ desc 'Run Ruby style checks'
11
+ RuboCop::RakeTask.new(:rubocop)
12
+
13
+ # Rspec
14
+ desc 'Run ChefSpec examples'
15
+ RSpec::Core::RakeTask.new(:spec)
16
+
17
+ # Integration tests. Kitchen.ci
18
+ namespace :integration do
19
+ desc 'Run Test Kitchen with Vagrant'
20
+ task :vagrant do
21
+ Kitchen.logger = Kitchen.default_file_logger
22
+ Kitchen::Config.new.instances.each do |instance|
23
+ instance.test(:verify)
24
+ end
25
+ end
26
+ end
27
+
28
+ namespace :policyfile do
29
+ desc 'Run "chef update" for Policyfile.rb'
30
+ task :update do
31
+ Dir.glob('test/integration/cookbooks/test/Policyfile.rb').each do |file|
32
+ cli = ChefDK::CLI.new(['update', file])
33
+ subcommand_name, *subcommand_params = cli.argv
34
+ subcommand = cli.instantiate_subcommand(subcommand_name)
35
+ subcommand.run_with_default_options(subcommand_params)
36
+ end
37
+ end
38
+ end
39
+
40
+ # Default
41
+ task default: ['rubocop', 'spec', 'policyfile:update', 'integration:vagrant']
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'kitchen/provisioner/chef_zero_nodes_version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'kitchen-chefzero-nodes'
8
+ spec.version = Kitchen::Provisioner::CHEF_ZERO_NODES_VERSION
9
+ spec.authors = ['Andrei Skopenko']
10
+ spec.email = ['andrei@skopenko.net']
11
+ spec.description = 'Test Kitchen provisioner based on chef_zero that generates searchable nodes'
12
+ spec.summary = spec.description
13
+ spec.homepage = 'https://github.com/Parallels/kitchen-chefzero-nodes'
14
+ spec.license = 'Apache 2.0'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = []
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'test-kitchen', '~> 1.7'
22
+ spec.add_dependency 'chef-dk', '~> 0.12'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.3'
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'rspec', '~> 3.2'
27
+ spec.add_development_dependency 'rubocop', '~> 0.37', '>= 0.37.1'
28
+ end
@@ -0,0 +1,175 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Andrei Skopenko (<andrei@skopenko.net>)
4
+ #
5
+ # Copyright 2015 Andrei Skopenko
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'kitchen/provisioner/chef_zero'
20
+ require 'kitchen/provisioner/base'
21
+ require 'kitchen/driver/ssh_base'
22
+ require 'kitchen/transport/ssh'
23
+ require 'kitchen/transport/winrm'
24
+
25
+ # continue loading if kitchen-sync not installed
26
+ begin
27
+ require 'kitchen/transport/sftp'
28
+ rescue LoadError
29
+ puts 'Ignoring sftp transport...'
30
+ end
31
+
32
+ module Kitchen
33
+ module Driver
34
+ class SSHBase
35
+ # ChefZeroNodes needs to access to legacy_ssh_base_converge method
36
+ # used by some drivers like kithen-vz. This method
37
+ # add additional command after chef_client run complete.
38
+ #
39
+ # @param state [Hash] mutable instance state
40
+ # @raise [ActionFailed] if the action could not be completed
41
+ def converge(state)
42
+ provisioner = instance.provisioner
43
+ provisioner.create_sandbox
44
+ sandbox_dirs = Dir.glob("#{provisioner.sandbox_path}/*")
45
+ instance.transport.connection(backcompat_merged_state(state)) do |conn|
46
+ conn.execute(env_cmd(provisioner.install_command))
47
+ conn.execute(env_cmd(provisioner.init_command))
48
+ info("Transferring files to #{instance.to_str}")
49
+ conn.upload(sandbox_dirs, provisioner[:root_path])
50
+ debug('Transfer complete')
51
+ conn.execute(env_cmd(provisioner.prepare_command))
52
+ conn.execute(env_cmd(provisioner.run_command))
53
+ # Download node json object generated by chef_client
54
+ info("Transferring #{provisioner.unix_int_node_file} " \
55
+ "from instance to #{provisioner.ext_node_file}")
56
+ conn.execute(env_cmd(conn.download(provisioner.unix_int_node_file,
57
+ provisioner.ext_node_file)))
58
+ debug('Transfer complete')
59
+ end
60
+ rescue Kitchen::Transport::TransportFailed => ex
61
+ raise ActionFailed, ex.message
62
+ ensure
63
+ instance.provisioner.cleanup_sandbox
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ module Kitchen
70
+ module Transport
71
+ class Ssh
72
+ class Connection
73
+ # Download JSON node file from instance to
74
+ # node_path over SCP
75
+ #
76
+ # @param remote [String] file path on instance
77
+ # @param local [String] file path on host
78
+ def download(remote, local)
79
+ FileUtils.mkdir_p(File.dirname(local))
80
+ session.scp.download!(remote, local, {})
81
+ logger.debug("Downloaded #{remote} to #{local}")
82
+ rescue Net::SSH::Exception => ex
83
+ raise SshFailed, "SCP download failed (#{ex.message})"
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ module Kitchen
91
+ module Transport
92
+ class Winrm
93
+ class Connection
94
+ # Download JSON node file from instance to
95
+ # node_path over Winrm
96
+ #
97
+ # @param remote [String] file path on instance
98
+ # @param local [String] file path on host
99
+ # TODO need to fix scheme
100
+ def download(remote, local)
101
+ FileUtils.mkdir_p(File.dirname(local))
102
+ file_manager ||= WinRM::FS::FileManager.new(service)
103
+ file_manager.download(remote, local)
104
+ logger.debug("Downloaded #{remote} to #{local}")
105
+ rescue Kitchen::Transport::WinrmFailed => ex
106
+ raise WinrmFailed, "Winrm download failed (#{ex.message})"
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ module Kitchen
114
+ module Provisioner
115
+ class Base
116
+ # ChefZeroNodes needs to access to provision of the instance
117
+ # without invoking the behavior of Base#call because we need to
118
+ # add additional command after chef_client run complete.
119
+ #
120
+ # @param state [Hash] mutable instance state
121
+ # @raise [ActionFailed] if the action could not be completed
122
+ def call(state)
123
+ create_sandbox
124
+ sandbox_dirs = Dir.glob(File.join(sandbox_path, '*'))
125
+
126
+ instance.transport.connection(state) do |conn|
127
+ conn.execute(install_command)
128
+ conn.execute(init_command)
129
+ info("Transferring files to #{instance.to_str}")
130
+ conn.upload(sandbox_dirs, config[:root_path])
131
+ debug('Transfer complete')
132
+ conn.execute(prepare_command)
133
+ conn.execute(run_command)
134
+ # Download node json object generated by chef_client
135
+ int_node_file = windows_os? ? win_int_node_file : unix_int_node_file
136
+ info("Transferring #{int_node_file} " \
137
+ "from instance to #{ext_node_file}")
138
+ conn.download(int_node_file, ext_node_file)
139
+ debug('Transfer complete')
140
+ end
141
+ rescue Kitchen::Transport::TransportFailed => ex
142
+ raise ActionFailed, ex.message
143
+ ensure
144
+ cleanup_sandbox
145
+ end
146
+ end
147
+
148
+ class ChefZero
149
+ # ChefZeroNodes needs to access the base behavior of creating the
150
+ # sandbox directory without invoking the behavior of
151
+ # ChefZero#create_sandbox, we need to override json node.
152
+ alias create_chefzero_sandbox create_sandbox
153
+ end
154
+
155
+ class ChefZeroNodes < ChefZero
156
+ # (see ChefZero#create_sandbox)
157
+ def create_sandbox
158
+ FileUtils.rm(ext_node_file) if File.exist?(ext_node_file)
159
+ create_chefzero_sandbox
160
+ end
161
+
162
+ def ext_node_file
163
+ File.join(config[:nodes_path], "#{instance.name}.json")
164
+ end
165
+
166
+ def unix_int_node_file
167
+ File.join(config[:root_path], 'nodes', "#{instance.name}.json")
168
+ end
169
+
170
+ def win_int_node_file
171
+ File.join(config[:root_path], 'nodes', "#{instance.name}.json").tr('/', '\\')
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Andrei Skopenko (<andrei@skopenko.net>)
4
+ #
5
+ # Copyright 2015 Andrei Skopenko
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ module Kitchen
20
+ # Version string for chefzero_nodes Kitchen driver
21
+ module Provisioner
22
+ CHEF_ZERO_NODES_VERSION = '1.0.0'.freeze
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ name 'test'
2
+ default_source :supermarket
3
+ cookbook 'test', path: './'
4
+ run_list 'test::default'
5
+ named_run_list 'sftp', 'test::default'
6
+ named_run_list 'win', 'test::default'
7
+ named_run_list 'ssh', 'test::search'
@@ -0,0 +1 @@
1
+ name 'test'
@@ -0,0 +1,17 @@
1
+ #
2
+ # Cookbook Name:: test
3
+ # Resource:: default
4
+ #
5
+ # Copyright 2015 Andrei Skopenko
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
@@ -0,0 +1,33 @@
1
+ #
2
+ # Cookbook Name:: test
3
+ # Resource:: search
4
+ #
5
+ # Copyright 2015 Andrei Skopenko
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ sftp_node = search(:node, "name:sftp-* AND platform:#{node['platform']}")
20
+ ruby_block 'save sftp attributes' do
21
+ block do
22
+ parent = File.join(ENV['TEMP'] || '/tmp', 'kitchen')
23
+ IO.write(File.join(parent, 'sftp.json'), sftp_node[0].to_json)
24
+ end
25
+ end
26
+
27
+ win_node = search(:node, 'platform:windows')
28
+ ruby_block 'save win attributes' do
29
+ block do
30
+ parent = File.join(ENV['TEMP'] || '/tmp', 'kitchen')
31
+ IO.write(File.join(parent, 'win.json'), win_node[0].to_json)
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ require 'serverspec'
2
+ require 'json'
3
+
4
+ set :backend, :exec
5
+
6
+ describe 'sftp node' do
7
+ let(:node) do
8
+ JSON.parse(
9
+ IO.read(File.join(ENV['TEMP'] || '/tmp', 'kitchen/sftp.json'))
10
+ )
11
+ end
12
+
13
+ it 'has ip' do
14
+ expect(node['automatic'].key?('ipaddress')).to eq(true)
15
+ end
16
+
17
+ it 'has fqdn' do
18
+ expect(node['automatic'].key?('fqdn')).to eq(true)
19
+ end
20
+ end
21
+
22
+ describe 'win node' do
23
+ let(:node) do
24
+ JSON.parse(
25
+ IO.read(File.join(ENV['TEMP'] || '/tmp', 'kitchen/win.json'))
26
+ )
27
+ end
28
+
29
+ it 'has ip' do
30
+ expect(node['automatic'].key?('ipaddress')).to eq(true)
31
+ end
32
+
33
+ it 'has fqdn' do
34
+ expect(node['automatic'].key?('fqdn')).to eq(true)
35
+ end
36
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-chefzero-nodes
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrei Skopenko
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: test-kitchen
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chef-dk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.12'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.12'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.37'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 0.37.1
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.37'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.37.1
103
+ description: Test Kitchen provisioner based on chef_zero that generates searchable
104
+ nodes
105
+ email:
106
+ - andrei@skopenko.net
107
+ executables: []
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - ".gitignore"
112
+ - ".kitchen.yml"
113
+ - ".rubocop.yml"
114
+ - CHANGELOG.md
115
+ - Gemfile
116
+ - README.md
117
+ - Rakefile
118
+ - kitchen-chefzero-nodes.gemspec
119
+ - lib/kitchen/provisioner/chef_zero_nodes.rb
120
+ - lib/kitchen/provisioner/chef_zero_nodes_version.rb
121
+ - test/integration/cookbooks/test/Policyfile.rb
122
+ - test/integration/cookbooks/test/metadata.rb
123
+ - test/integration/cookbooks/test/recipes/default.rb
124
+ - test/integration/cookbooks/test/recipes/search.rb
125
+ - test/integration/ssh/serverspec/default_spec.rb
126
+ homepage: https://github.com/Parallels/kitchen-chefzero-nodes
127
+ licenses:
128
+ - Apache 2.0
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.6.4
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Test Kitchen provisioner based on chef_zero that generates searchable nodes
150
+ test_files:
151
+ - test/integration/cookbooks/test/Policyfile.rb
152
+ - test/integration/cookbooks/test/metadata.rb
153
+ - test/integration/cookbooks/test/recipes/default.rb
154
+ - test/integration/cookbooks/test/recipes/search.rb
155
+ - test/integration/ssh/serverspec/default_spec.rb
156
+ has_rdoc: