kitchen-habitat-config 0.7.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5d827805ebbab6bc3db302384f92bff7c1a1610dc7dd32a6a6f52f27505a4aa7
4
+ data.tar.gz: cc8957e1f7fd71f75504e62fd3ff671ade16e2c14437e55908c9f25007d3e305
5
+ SHA512:
6
+ metadata.gz: abef29edd561dbe7442dd923be831c38eec7e1220bc48171478fabf416d967b3688708a0517f2b0afa317d62ee4941ee169c481cc2ce922b8e89937e4c513d8c
7
+ data.tar.gz: c04c5fcea8007b1d6d61b2ab2d55a9a59a32c48c3d3a230d195cf542862906e708678eb788e54746562605b918623e0222c042e6989274a9aaaa8e990eadfdfa
data/README.md ADDED
@@ -0,0 +1,153 @@
1
+ [![Gem Version](https://badge.fury.io/rb/kitchen-habitat.svg)](http://badge.fury.io/rb/kitchen-habitat)
2
+
3
+ # kitchen-habitat
4
+ A Test Kitchen Provisioner for [Habitat](https://habitat.sh)
5
+
6
+ ## Requirements
7
+
8
+
9
+ ## Installation & Setup
10
+ You'll need the test-kitchen & kitchen-habitat gems installed in your system, along with kitchen-vagrant or some other suitable driver for test-kitchen.
11
+
12
+ ## Configuration Settings
13
+
14
+ ### Depot settings
15
+
16
+ * `depot_url`
17
+ * Target Habitat Depot to use to install packages.
18
+ * Defaults to `nil` (which will use the default depot settings for the `hab` CLI from ~/.hab/etc/cli.toml).
19
+
20
+ ### Supervisor Settings
21
+
22
+ * `hab_sup_origin`
23
+ * Package identification for the supervisor to use.
24
+ * Defaults to `core`, or, if `hab_sup_artifact_name` is supplied, the `hab_sup_origin` will be parsed from the filename of the hart file.
25
+ * `hab_sup_name`
26
+ * Name of the supervisor package
27
+ * Defaults to `hab-sup`, or, if `hab_sup_artifact_name` is supplied, the `hab_sup_name` will be parsed from the filename of the hart file.
28
+ * `hab_sup_version`
29
+ * Version number of `hab-sup` to run
30
+ * Defaults to `nil`, or, if `hab_sup_artifact_name` is supplied, the `hab_sup_version` will be parsed from the filename of the hart file.
31
+ * `hab_sup_release`
32
+ * Release of the `hab-sup` package to run
33
+ * Defaults to `nil`, or, if `hab_sup_artifact_name` is supplied, the `hab_sup_release` will be parsed from the filename of the hart file.
34
+ * `hab_sup_artifact_name`
35
+ * Artifact package name for a custom supervisor to run
36
+ * Used to upload and test a local supervisor.
37
+ * Package should be located in the `results_directory`
38
+ * Defaults to `nil
39
+ * `hab_sup_listen_http`
40
+ * Port for the supervisor's sidecar to listen on.
41
+ * Defaults to `nil`
42
+ * `hab_sup_listen_gossip`
43
+ * Port for the supervisor's gossip communication
44
+ * Defaults to `nil`
45
+ * `hab_sup_group`
46
+ * Service group for the supervisor to belong do.
47
+ * Default is `default`
48
+ * `hab_sup_bind`
49
+ * Service group for the supervisor to bind to.
50
+ * Default is `[]`
51
+ * `hab_sup_peer`
52
+ * IP and port (e.g. `192.168.1.86:9010`) of the supervisor of which to connect to join the ring.
53
+ * Default is `[]`
54
+
55
+ ### Package Settings
56
+
57
+ * `artifact_name`
58
+ * Artifact package filename to install and run.
59
+ * Used to upload and test a local artifact.
60
+ * Package should be located in the `results_directory`
61
+ * Example - `core-jq-static-1.5-20170127185151-x86_64-linux.hart`
62
+ * Defaults to `nil`
63
+ * `results_directory`
64
+ * Directory (relative to the location of the .kitchen.yml) containing package artifacts (harts) to copy to the remote system
65
+ * Defaults to checking the local directory for a `results` directory, then its parent (`../results`) and grandparent (`../../results`), which should accomodate most studio layouts.
66
+ * `package_origin`
67
+ * Origin for the package to run.
68
+ * Defaults to `core`, or, if `artifact_name` is supplied, the `package_origin` will be parsed from the filename of the hart file.
69
+ * `package_name`
70
+ * Package name for the supervisor to run.
71
+ * Defaults to the suite name or, if `artifact_name` is supplied, the `package_name` will be parsed from the filename of the hart file.
72
+ * `package_version`
73
+ * Package version of the package to be run.
74
+ * Defaults to `nil` or if `artifact_name` is supplied, the `package_version` will be parsed from the filename of the hart file.
75
+ * `package_release`
76
+ * Package release of the package to be run.
77
+ * Defaults to `nil` or if `artifact_name` is supplied, the `package_release` will be parsed from the filename of the hart file.
78
+ * `service_topology`
79
+ * The topology for the service to run in. Valid values are `nil`, `standalone`, `leader`
80
+ * Defaults to `nil` which is `standalone`
81
+ * `service_update_strategy`
82
+ * Describes how package updates are to be applied. Valid values are `nil`, `at-once`, `rolling`.
83
+ * Default is `nil`, which does not check for package updates.
84
+ * `config_directory`
85
+ * Directory containing a user.toml or/and a default.toml, hooks, and configuration files to be passed to the service under test.
86
+ * Defaults to `nil`
87
+ * `override_package_config`
88
+ * Tell the supervisor to load the the configuration files and hooks from `config_directory` instead of what was packaged with the service. (Uses `--config-from` via the `hab-sup` CLI.)
89
+ * `user_toml_name`
90
+ * Name of the file to be used as the user.toml for the service under test.
91
+ * Defaults to `user.toml`
92
+ * `install_latest_artifact`
93
+ * Choose to install latest artifact.
94
+ * Must specify `artifact_name` or `package_origin` and `package_name`
95
+ * `package_version` and `package_release` will be ignored
96
+ * Defaults to `false`
97
+
98
+ ## Examples
99
+
100
+ Run the core-redis package
101
+
102
+ ```yaml
103
+ driver:
104
+ name: vagrant
105
+
106
+ provisioner:
107
+ name: habitat
108
+ hab_sup_origin: core
109
+ hab_sup_name: sup
110
+ package_origin: core
111
+ package_name: redis
112
+
113
+ platforms:
114
+ - name: ubuntu-16.04
115
+
116
+ suites:
117
+ - name: default
118
+ ```
119
+
120
+ Two node: elasticsearch and kibana
121
+
122
+ ```yaml
123
+ driver:
124
+ name: docker
125
+
126
+ provisioner:
127
+ name: habitat
128
+ hab_sup_origin: core
129
+ hab_sup_name: sup
130
+
131
+ platforms:
132
+ - name: ubuntu-16.04
133
+
134
+ suites:
135
+ - name: elasticsearch
136
+ provisioner:
137
+ package_origin: core
138
+ package_name: elasticsearch
139
+ driver:
140
+ instance_name: elastic
141
+
142
+ - name: kibana
143
+ provisioner:
144
+ package_origin: core
145
+ package_name: kibana
146
+ hab_sup_peer:
147
+ - elastic
148
+ hab_sup_bind:
149
+ - elasticsearch:elasticsearch.default
150
+ driver:
151
+ instance_name: kibana
152
+ links: elastic:elastic
153
+ ```
@@ -0,0 +1,38 @@
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
+ require "kitchen-habitat/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "kitchen-habitat-config"
6
+ s.version = Kitchen::Habitat::VERSION
7
+ s.authors = ["Steven Murawski"]
8
+ s.email = ["smurawski@chef.io"]
9
+ s.homepage = "https://github.com/test-kitchen/kitchen-habitat"
10
+ s.summary = "Habitat provisioner for test-kitchen"
11
+ candidates = Dir.glob("lib/**/*") + ["README.md", "kitchen-habitat.gemspec"]
12
+ s.files = candidates.sort
13
+ s.platform = Gem::Platform::RUBY
14
+ s.require_paths = ["lib"]
15
+ s.rubyforge_project = "[none]"
16
+ s.license = "Apache 2"
17
+ s.description = <<-EOF
18
+ == DESCRIPTION:
19
+
20
+ Habitat Provisioner for Test Kitchen
21
+
22
+ == FEATURES:
23
+
24
+ TBD
25
+
26
+ EOF
27
+ s.add_dependency "test-kitchen", "~> 1.4"
28
+
29
+ s.add_development_dependency "countloc", "~> 0.4"
30
+ s.add_development_dependency "rake"
31
+ s.add_development_dependency "rspec", "~> 3.2"
32
+ s.add_development_dependency "simplecov", "~> 0.9"
33
+
34
+ # style and complexity libraries are tightly version pinned as newer releases
35
+ # may introduce new and undesireable style choices which would be immediately
36
+ # enforced in CI
37
+ s.add_development_dependency "chefstyle"
38
+ end
@@ -0,0 +1,5 @@
1
+ module Kitchen
2
+ module Habitat
3
+ VERSION = '0.7.2'.freeze
4
+ end
5
+ end
@@ -0,0 +1,337 @@
1
+ #
2
+ # Author:: Steven Murawski (<steven.murawski@gmail.com>)
3
+ #
4
+ # Copyright (C) 2017 Steven Murawski
5
+ #
6
+ # Licensed under the MIT License.
7
+ # See LICENSE for more details
8
+
9
+ require 'fileutils'
10
+ require 'pathname'
11
+ require 'kitchen/provisioner/base'
12
+ require 'kitchen/util'
13
+
14
+ module Kitchen
15
+ module Provisioner
16
+ class Habitat < Base
17
+ kitchen_provisioner_api_version 2
18
+
19
+ default_config :depot_url, nil
20
+ default_config :hab_sup_origin, 'core'
21
+ default_config :hab_sup_name, 'hab-sup'
22
+ default_config :hab_sup_version, nil
23
+ default_config :hab_sup_release, nil
24
+ default_config :hab_sup_artifact_name, nil
25
+
26
+ # hab-sup manager options
27
+ default_config :hab_sup_listen_http, nil
28
+ default_config :hab_sup_listen_gossip, nil
29
+ default_config :hab_sup_peer, []
30
+ default_config :hab_sup_bind, []
31
+ default_config :hab_sup_group, nil
32
+
33
+ # hab-sup service options
34
+ default_config :install_latest_artifact, false
35
+ default_config :artifact_name, nil
36
+ default_config :package_origin, 'core'
37
+ default_config :package_name
38
+ default_config :package_version, nil
39
+ default_config :package_release, nil
40
+ default_config :service_topology, nil
41
+ default_config :service_update_strategy, nil
42
+ default_config :channel, 'stable'
43
+
44
+ # local stuffs to copy
45
+ default_config :results_directory, nil
46
+ default_config :config_directory, nil
47
+ default_config :user_toml_name, 'user.toml'
48
+ default_config :override_package_config, false
49
+
50
+ # experimental
51
+ default_config :use_screen, false
52
+
53
+ def finalize_config!(instance)
54
+ # Check to see if a package ident was specified for package name and be helpful
55
+ unless config[:package_name].nil? || (config[:package_name] =~ /\//).nil?
56
+ config[:package_origin], config[:package_name], config[:package_version], config[:package_release] = config[:package_name].split('/')
57
+ end
58
+
59
+ unless config[:hab_sup_artifact_name].nil?
60
+ ident = artifact_name_to_package_ident_regex.match(config[:hab_sup_artifact_name])
61
+ config[:hab_sup_origin] = ident['origin']
62
+ config[:hab_sup_name] = ident['name']
63
+ config[:hab_sup_version] = ident['version']
64
+ config[:hab_sup_release] = ident['release']
65
+ end
66
+
67
+ unless config[:artifact_name].nil?
68
+ ident = artifact_name_to_package_ident_regex.match(config[:artifact_name])
69
+ config[:package_origin] = ident['origin']
70
+ config[:package_name] = ident['name']
71
+ config[:package_version] = ident['version']
72
+ config[:package_release] = ident['release']
73
+ end
74
+ super(instance)
75
+ end
76
+
77
+ def install_command
78
+ raise "Need to fill in some implementation here." if instance.platform == "windows"
79
+ wrap_shell_code <<-BASH
80
+ #{export_hab_origin}
81
+ if command -v hab >/dev/null 2>&1
82
+ then
83
+ echo "Habitat CLI already installed."
84
+ else
85
+ curl 'https://raw.githubusercontent.com/habitat-sh/habitat/master/components/hab/install.sh' | sudo bash
86
+ fi
87
+ BASH
88
+ end
89
+
90
+ def init_command
91
+ wrap_shell_code <<-EOH
92
+ id -u hab >/dev/null 2>&1 || sudo useradd hab >/dev/null 2>&1
93
+ rm -rf /tmp/kitchen
94
+ mkdir -p /tmp/kitchen/results
95
+ #{'mkdir -p /tmp/kitchen/config' unless config[:override_package_config]}
96
+ EOH
97
+ end
98
+
99
+ def create_sandbox
100
+ super
101
+ copy_results_to_sandbox
102
+ copy_user_toml_to_sandbox
103
+ copy_package_config_from_override_to_sandbox
104
+ end
105
+
106
+ def prepare_command
107
+ wrap_shell_code <<-EOH
108
+ #{export_hab_origin}
109
+ #{install_supervisor_command}
110
+ #{binlink_supervisor_command}
111
+ #{install_service_package}
112
+ #{remove_previous_user_toml}
113
+ #{copy_user_toml_to_service_directory}
114
+ EOH
115
+ end
116
+
117
+ def run_command
118
+ run = <<-RUN
119
+ #{export_hab_origin}
120
+ #{clean_up_screen_sessions}
121
+ #{clean_up_previous_supervisor}
122
+ echo "Running #{package_ident}."
123
+ sudo hab pkg install #{package_ident}
124
+ #{run_package_in_background}
125
+ RUN
126
+
127
+ wrap_shell_code run
128
+ end
129
+
130
+ private
131
+
132
+ def clean_up_screen_sessions
133
+ return unless config[:use_screen]
134
+ <<-CLEAN
135
+ if sudo screen -ls | grep -q #{clean_package_name}
136
+ then
137
+ echo "Killing previous supervisor session."
138
+ sudo screen -S \"#{clean_package_name}\" -X quit > /dev/null
139
+ echo "Removing dead session."
140
+ sudo screen -wipe > /dev/null
141
+ fi
142
+ CLEAN
143
+ end
144
+
145
+ def clean_up_previous_supervisor
146
+ return if config[:use_screen]
147
+ <<-EOH
148
+ [ -f ./run.pid ] && echo "Removing previous supervisor. "
149
+ [ -f ./run.pid ] && sudo kill $(cat run.pid)
150
+ [ -f ./run.pid ] && sleep 5
151
+ EOH
152
+ end
153
+
154
+ def run_package_in_background
155
+ if config[:use_screen]
156
+ "sudo screen -mdS \"#{clean_package_name}\" hab start #{package_ident} #{supervisor_options}"
157
+ else
158
+ <<-RUN
159
+ [ -f ./run.pid ] && rm -f run.pid
160
+ [ -f ./nohup.out ] && rm -f nohup.out
161
+ nohup sudo hab sup run #{sup_run_options} & echo $! > run.pid
162
+
163
+ until sudo hab svc status
164
+ do
165
+ sleep 1
166
+ done
167
+
168
+ sudo hab svc load #{package_ident} #{supervisor_options}
169
+
170
+ until sudo hab svc status | grep #{package_ident}
171
+ do
172
+ sleep 1
173
+ done
174
+
175
+ [ -f ./nohup.out ] && cat nohup.out || (echo "Failed to start the supervisor." && exit 1)
176
+ RUN
177
+ end
178
+ end
179
+
180
+ def resolve_results_directory
181
+ return config[:results_directory] unless config[:results_directory].nil?
182
+
183
+ results_in_current = File.join(config[:kitchen_root], "results")
184
+ results_in_parent = File.join(config[:kitchen_root], "../results")
185
+ results_in_grandparent = File.join(config[:kitchen_root], "../../results")
186
+
187
+ if Dir.exist?(results_in_current)
188
+ results_in_current
189
+ elsif Dir.exist?(results_in_parent)
190
+ results_in_parent
191
+ elsif Dir.exist?(results_in_grandparent)
192
+ results_in_grandparent
193
+ end
194
+ end
195
+
196
+ def copy_package_config_from_override_to_sandbox
197
+ return if config[:config_directory].nil?
198
+ return unless config[:override_package_config]
199
+ local_config_dir = File.join(config[:kitchen_root], config[:config_directory])
200
+ return unless Dir.exist?(local_config_dir)
201
+
202
+ sandbox_config_dir = File.join(sandbox_path, "config")
203
+ FileUtils.copy_entry(local_config_dir, sandbox_config_dir)
204
+ end
205
+
206
+ def copy_results_to_sandbox
207
+ return if config[:artifact_name].nil? && !config[:install_latest_artifact]
208
+ results_dir = resolve_results_directory
209
+ return if results_dir.nil?
210
+ FileUtils.mkdir_p(File.join(sandbox_path, "results"))
211
+ FileUtils.cp(
212
+ File.join(results_dir, config[:install_latest_artifact] ? latest_artifact_name : config[:artifact_name]),
213
+ File.join(sandbox_path, "results"),
214
+ preserve: true
215
+ )
216
+ end
217
+
218
+ def full_user_toml_path
219
+ File.join(File.join(config[:kitchen_root], config[:config_directory]), config[:user_toml_name])
220
+ end
221
+
222
+ def sandbox_user_toml_path
223
+ File.join(File.join(sandbox_path, "config"), "user.toml")
224
+ end
225
+
226
+ def copy_user_toml_to_sandbox
227
+ return if config[:config_directory].nil?
228
+ return unless File.exist?(full_user_toml_path)
229
+ FileUtils.mkdir_p(File.join(sandbox_path, "config"))
230
+ debug("Copying user.toml from #{full_user_toml_path} to #{sandbox_user_toml_path}")
231
+ FileUtils.cp(full_user_toml_path, sandbox_user_toml_path)
232
+ end
233
+
234
+ def install_service_package
235
+ return unless config[:install_latest_artifact] || !config[:artifact_name].nil?
236
+
237
+ artifact_name = ""
238
+ if config[:install_latest_artifact]
239
+ artifact_name = latest_artifact_name
240
+ elsif !config[:install_latest_artifact] && !config[:artifact_name].nil?
241
+ artifact_name = config[:artifact_name]
242
+ else
243
+ return
244
+ end
245
+
246
+ artifact_path = File.join(File.join(config[:root_path], "results"), artifact_name)
247
+ "sudo hab pkg install #{artifact_path}"
248
+ end
249
+
250
+ def latest_artifact_name
251
+ results_dir = resolve_results_directory
252
+ return if results_dir.nil?
253
+
254
+ artifact_path = Dir.glob(File.join(results_dir, "#{config[:package_origin]}-#{config[:package_name]}-*.hart")).max_by { |f| File.mtime(f) }
255
+
256
+ File.basename(artifact_path)
257
+ end
258
+
259
+ def copy_user_toml_to_service_directory
260
+ return unless !config[:config_directory].nil? && File.exist?(full_user_toml_path)
261
+ <<-EOH
262
+ sudo mkdir -p /hab/svc/#{config[:package_name]}
263
+ sudo cp #{File.join(File.join(config[:root_path], 'config'), 'user.toml')} /hab/svc/#{config[:package_name]}/user.toml
264
+ EOH
265
+ end
266
+
267
+ def remove_previous_user_toml
268
+ <<-REMOVE
269
+ if [ -d "/hab/svc/#{config[:package_name]}" ]; then
270
+ sudo find /hab/svc/#{config[:package_name]} -name user.toml -delete
271
+ fi
272
+ REMOVE
273
+ end
274
+
275
+ def export_hab_origin
276
+ return if config[:depot_url].nil?
277
+ "export HAB_ORIGIN=#{config[:depot_url]}"
278
+ end
279
+
280
+ def install_supervisor_command
281
+ "sudo hab pkg install #{hab_sup_ident}"
282
+ end
283
+
284
+ def binlink_supervisor_command
285
+ "sudo hab pkg binlink #{hab_sup_ident} hab-sup"
286
+ end
287
+
288
+ def artifact_name_to_package_ident_regex
289
+ /(?<origin>\w+)-(?<name>.*)-(?<version>(\d+)?(\.\d+)?(\.\d+)?(\.\d+)?)-(?<release>\d+)-(?<target>.*)\.hart$/
290
+ end
291
+
292
+ def hab_sup_ident
293
+ ident = "#{config[:hab_sup_origin]}/" \
294
+ "#{config[:hab_sup_name]}/" \
295
+ "#{config[:hab_sup_version]}/" \
296
+ "#{config[:hab_sup_release]}".chomp("/").chomp("/")
297
+ @sup_ident ||= ident
298
+ end
299
+
300
+ def package_ident
301
+ ident = "#{config[:package_origin]}/" \
302
+ "#{config[:package_name]}/" \
303
+ "#{config[:package_version]}/" \
304
+ "#{config[:package_release]}".chomp("/").chomp("/")
305
+ @pkg_ident ||= ident
306
+ end
307
+
308
+ def clean_package_name
309
+ @clean_name ||= "#{config[:package_origin]}-#{config[:package_name]}"
310
+ end
311
+
312
+ def sup_run_options
313
+ options = ''
314
+ options += " --listen-gossip #{config[:hab_sup_listen_gossip]}" unless config[:hab_sup_listen_gossip].nil?
315
+ options += " --config-from #{File.join(config[:root_path], 'config/')}" if config[:override_package_config]
316
+ options += config[:hab_sup_bind].map { |b| " --bind #{b}" }.join(" ") if config[:hab_sup_bind].any?
317
+ options += config[:hab_sup_peer].map { |p| " --peer #{p}" }.join(" ") if config[:hab_sup_peer].any?
318
+
319
+ options
320
+ end
321
+
322
+ def supervisor_options
323
+ options = ''
324
+ options += " --listen-gossip #{config[:hab_sup_listen_gossip]}" unless config[:hab_sup_listen_gossip].nil?
325
+ options += " --config-from #{File.join(config[:root_path], 'config/')}" if config[:override_package_config]
326
+ options += config[:hab_sup_bind].map { |b| " --bind #{b}" }.join(" ") if config[:hab_sup_bind].any?
327
+ # options += config[:hab_sup_peer].map { |p| " --peer #{p}" }.join(" ") if config[:hab_sup_peer].any?
328
+ options += " --group #{config[:hab_sup_group]}" unless config[:hab_sup_group].nil?
329
+ options += " --topology #{config[:service_topology]}" unless config[:service_topology].nil?
330
+ options += " --strategy #{config[:service_update_strategy]}" unless config[:service_update_strategy].nil?
331
+ options += " --channel #{config[:channel]}" unless config[:channel].nil?
332
+
333
+ options
334
+ end
335
+ end
336
+ end
337
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-habitat-config
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.2
5
+ platform: ruby
6
+ authors:
7
+ - Steven Murawski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-20 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.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: countloc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: chefstyle
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: |+
98
+ == DESCRIPTION:
99
+
100
+ Habitat Provisioner for Test Kitchen
101
+
102
+ == FEATURES:
103
+
104
+ TBD
105
+
106
+ email:
107
+ - smurawski@chef.io
108
+ executables: []
109
+ extensions: []
110
+ extra_rdoc_files: []
111
+ files:
112
+ - README.md
113
+ - kitchen-habitat.gemspec
114
+ - lib/kitchen-habitat/version.rb
115
+ - lib/kitchen/provisioner/habitat.rb
116
+ homepage: https://github.com/test-kitchen/kitchen-habitat
117
+ licenses:
118
+ - Apache 2
119
+ metadata: {}
120
+ post_install_message:
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project: "[none]"
136
+ rubygems_version: 2.7.3
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Habitat provisioner for test-kitchen
140
+ test_files: []