kitchen-vagrant_sandbox 0.1.0

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
+ SHA1:
3
+ metadata.gz: 67a4eb87f37ca0f562f17c7286764f6fc53c448f
4
+ data.tar.gz: 04455b1a0b543b263b877b0bd657724c59246ce6
5
+ SHA512:
6
+ metadata.gz: 06ee0ccffd5b2191631e320318dc5af20ce488febdddd08bfff10a6996f17e9b6c3bbd1eb199d4639f28ca16f4d5dc7e0e0d3ae2dacd65683a1f7b228e7a1b76
7
+ data.tar.gz: f55026a89659badfff02b4087075a76829f28b4820abcfca321a66acc87d2f144096d511b3c40ece9219706a6a0a6e25545eef822e627414e85891b69e38e6ba
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/CHANGELOG.md ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kitchen-vagrant_sandbox.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem 'rake'
8
+ end
data/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ This is modified version by Ryota Arai (<ryota.arai@gmail.com>)
2
+
3
+ Author:: Fletcher Nichol (<fnichol@nichol.ca>), Ryota Arai (<ryota.arai@gmail.com>)
4
+
5
+ Copyright (C) 2012, Fletcher Nichol
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.
data/README.md ADDED
@@ -0,0 +1,315 @@
1
+ # <a name="title"></a> Kitchen::VagrantSandbox
2
+
3
+ A Test Kitchen Driver for Vagrant.
4
+
5
+ **This is a fork version of [Kitchen::Vagrant driver][original_repo].**
6
+
7
+ This driver works by generating a single Vagrantfile for each instance in a
8
+ sandboxed directory. Since the Vagrantfile is written out on disk, Vagrant
9
+ needs absolutely no knowledge of Test Kitchen. So no Vagrant plugin gem is
10
+ required.
11
+
12
+ ## <a name="requirements"></a> Requirements
13
+
14
+ ### <a name="dependencies-vagrant"></a> Vagrant
15
+
16
+ A Vagrant version of 1.1.0 or higher is required for this driver which means
17
+ that a [native package][vagrant_dl] must be installed on the system running
18
+ Test Kitchen.
19
+
20
+ **Note:** If you have previously installed Vagrant as a gem (a version prior
21
+ to 1.1.0), this version may be resolved first in your `PATH`. If you receive an
22
+ error message that Vagrant is too old despite having installed Vagrant as a
23
+ package, you may be required to uninstall the gem version or modify your `PATH`
24
+ environment. If you require the vagrant gem for older projects you should
25
+ consider the [vagrant-wrapper][vagrant_wrapper] gem which helps manage both
26
+ styles of Vagrant installations
27
+ ([background details][vagrant_wrapper_background]).
28
+
29
+ ### Vagrant Sandbox (Sahara) Plugin
30
+
31
+ This driver uses `vagrant sandbox status`, `vagrant sandbox on` and `vagrant sandbox rollback`.
32
+ To use sandbox features, you should install sahara plugin:
33
+
34
+ ```
35
+ $ vagrant plugin install sahara
36
+ ```
37
+
38
+ ### <a name="dependencies-berkshelf"></a> Vagrant Berkshelf Plugin
39
+
40
+ If a Berksfile is present in your project's root directory, then this driver
41
+ will check to ensure that the [vagrant-berkshelf][vagrant_berkshelf] plugin is
42
+ installed.
43
+
44
+ If your project doesn't use Berkshelf then this check will be skipped.
45
+
46
+ **Note:** Prior to release 1.2.0, then name of the vagrant-berkshelf gem was
47
+ berkshelf-vagrant. This driver no longer checks for the existance of
48
+ berkshelf-vagrant, so upgrading this Vagrant plugin is recommended.
49
+
50
+ ### <a name="dependencies-virtualization"></a> Virtualbox and/or VMware Fusion/Workstation
51
+
52
+ Currently this driver supports VirtualBox and VMware Fusion/Workstation.
53
+ Virtualbox is free and is the default provider for Vagrant.
54
+
55
+ [VirtualBox package][virtualbox_dl]
56
+
57
+ If you would like to use VMware Fusion/Workstation you must purchase the
58
+ software from VMware and then must also purchase the Vagrant VMware plugin.
59
+
60
+ [Vagrant VMware Plugin][vmware_plugin]
61
+
62
+ [VMware Fusion][fusion_dl]
63
+
64
+ [VMware Workstation][workstation_dl]
65
+
66
+ ## <a name="installation"></a> Installation and Setup
67
+
68
+ Please read the [Driver usage][driver_usage] page for more details.
69
+
70
+ ## Usage
71
+
72
+ ### Destroy Vagrant VM
73
+
74
+ With this plugin, `kitchen destroy` doesn't executes `vagrant destroy` but executes `vagrant sandbox rollback`.
75
+ If you would like to destroy vagrant VM, please set `KITCHEN_DESTROY_VM` env variable:
76
+ ```
77
+ KITCHEN_DESTROY_VM=1 kitchen destroy [(all|<REGEX>)] [opts]
78
+ ```
79
+
80
+ ## <a name="default-config"></a> Default Configuration
81
+
82
+ This driver can determine the Vagrant box name and download URL for a select
83
+ number of platforms. Currently, the following platform names are supported:
84
+
85
+ ```ruby
86
+ ---
87
+ platforms:
88
+ - name: ubuntu-10.04
89
+ - name: ubuntu-12.04
90
+ - name: ubuntu-12.10
91
+ - name: ubuntu-13.04
92
+ - name: centos-5.9
93
+ - name: centos-6.4
94
+ - name: debian-7.1.0
95
+ ```
96
+
97
+ This will effectively generate a configuration similar to:
98
+
99
+ ```ruby
100
+ ---
101
+ platforms:
102
+ - name: ubuntu-10.04
103
+ driver_config:
104
+ box: opscode-ubuntu-10.04
105
+ box_url: https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-10.04_provisionerless.box
106
+ - name: ubuntu-12.04
107
+ driver_config:
108
+ box: opscode-ubuntu-12.04
109
+ box_url: https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box
110
+ - name: ubuntu-12.10
111
+ driver_config:
112
+ box: opscode-ubuntu-12.10
113
+ box_url: ...
114
+ # ...
115
+ ```
116
+
117
+ ## <a name="config"></a> Configuration
118
+
119
+ ### <a name="config-box"></a> box
120
+
121
+ **Required** This determines which Vagrant box will be used. For more
122
+ details, please read the Vagrant [machine settings][vagrant_machine_settings]
123
+ page.
124
+
125
+ There is **no** default value set.
126
+
127
+ ### <a name="config-box-url"></a> box\_url
128
+
129
+ The URL that the configured box can be found at. If the box is not installed on
130
+ the system, it will be retrieved from this URL when the virtual machine is
131
+ started.
132
+
133
+ There is **no** default value set.
134
+
135
+ ### <a name="config-provider"></a> provider
136
+
137
+ This determines which Vagrant provider to use when testing and should match
138
+ the provider name in Vagrant. For example, to use VMware Fusion the provider
139
+ should be `vmware_fusion`. Please see the docs on [providers][vagrant_providers]
140
+ for further details.
141
+
142
+ By default the value is unset, or `nil`. In this case the driver will use the
143
+ Vagrant default provider which at this current time is **virtualbox**
144
+
145
+ ### <a name="config-customize"></a> customize
146
+
147
+ A **Hash** of customizations to a Vagrant virtual machine. Each key/value
148
+ pair will be passed to your providers customization block. For example, with
149
+ the default `virtualbox` provider:
150
+
151
+ ```ruby
152
+ driver_config:
153
+ customize:
154
+ memory: 1024
155
+ cpuexecutioncap: 50
156
+ ```
157
+
158
+ will generate a Vagrantfile configuration similar to:
159
+
160
+ ```ruby
161
+ Vagrant.configure("2") do |config|
162
+ # ...
163
+
164
+ config.vm.provider :virtualbox do |virtualbox|
165
+ virtualbox.customize ["modifyvm", :id, "--memory", "1024"]
166
+ virtualbox.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
167
+ end
168
+ end
169
+ ```
170
+
171
+ Please read the [Vagrantfile configuration][vagrantfile] page for
172
+ more details.
173
+
174
+ By default, each Vagrant virtual machine is configured with 256 MB of RAM. In
175
+ other words the default value for `customize` is `{:memory => '256'}`.
176
+
177
+ ### <a name="config-dry-run"></a> dry\_run
178
+
179
+ Useful when debugging Vagrant CLI commands. If set to `true`, all Vagrant CLI
180
+ commands will be displayed rather than executed.
181
+
182
+ The default is unset, or `nil`.
183
+
184
+ ### <a name="config-network"></a> network
185
+
186
+ An **Array** of network customizations for the virtual machine. Each Array
187
+ element is itself an Array of arguments to be passed to the `config.vm.netork`
188
+ method. For example:
189
+
190
+ ```ruby
191
+ driver_config:
192
+ network:
193
+ - ["forwarded_port", {guest: 80, host: 8080}]
194
+ - ["private_network", {ip: "192.168.33.33"}]
195
+ ```
196
+
197
+ will generate a Vagrantfile configuration similar to:
198
+
199
+ ```ruby
200
+ Vagrant.configure("2") do |config|
201
+ # ...
202
+
203
+ config.vm.network :forwarded_port, guest: 80, host: 8080
204
+ config.vm.network :private_network, ip: "192.168.33.33"
205
+ end
206
+ ```
207
+
208
+ Please read the Vagrant [networking basic usage][vagrant_networking] page for
209
+ more details.
210
+
211
+ There is **no** default value set.
212
+
213
+ ### <a name="config-use-vagrant-provision"></a> use_vagrant_provision
214
+
215
+ Determines whether or not this driver will use a `vagrant provision` shell out
216
+ in the **converge** action. If this value is falsey (`nil`, `false`) the
217
+ behavior from `Kitchen::Driver::SSHBase` will be used, bypassing the Vagrant
218
+ Chef solo provisioner. If this value is truthy, a `vagrant provision` will
219
+ be used.
220
+
221
+ The default is unset, or `nil`.
222
+
223
+ ### vagrant\_provision\_run\_list
224
+
225
+ ### do\_not\_vagrant\_provision\_in\_converge
226
+
227
+ ### <a name="config-use-vagrant-berkshelf-plugin"></a> use_vagrant_berkshelf_plugin
228
+
229
+ Determines whether or not this driver will use the vagrant-berkself Vagrant
230
+ plugin to assemble cookbook dependencies. If this value if falsey (`nil`,
231
+ `false`) then the driver will skip the vagrant-berkshelf dependency check
232
+ and not activate the plugin in the rendered Vagrantfile. If this value is
233
+ truthy the opposite behvior will be used.
234
+
235
+ The default is unset, or `nil`.
236
+
237
+ ### <a name="config-synced-folders"></a> synced_folders
238
+
239
+ Allow the user to specify a collection of synced folders for on each Vagrant
240
+ instance.
241
+
242
+ The default is an empty Hash, or `{}`.
243
+
244
+ ### <a name="config-require-chef-omnibus"></a> require\_chef\_omnibus
245
+
246
+ Determines whether or not a Chef [Omnibus package][chef_omnibus_dl] will be
247
+ installed. There are several different behaviors available:
248
+
249
+ * `true` - the latest release will be installed. Subsequent converges
250
+ will skip re-installing if chef is present.
251
+ * `latest` - the latest release will be installed. Subsequent converges
252
+ will always re-install even if chef is present.
253
+ * `<VERSION_STRING>` (ex: `10.24.0`) - the desired version string will
254
+ be passed the the install.sh script. Subsequent converges will skip if
255
+ the installed version and the desired version match.
256
+ * `false` or `nil` - no chef is installed.
257
+
258
+ The default value is unset, or `nil`.
259
+
260
+ ### <a name="config-username"></a> username
261
+
262
+ This is the username used for SSH authentication if you
263
+ would like to connect with a different account than Vagrant default user.
264
+
265
+ If this value is nil, then Vagrant parameter `config.ssh.default.username`
266
+ will be used (which is usually set to 'vagrant').
267
+
268
+ The default value is unset, or `nil`.
269
+
270
+ ## <a name="development"></a> Development
271
+
272
+ * Source hosted at [GitHub][repo]
273
+ * Report issues/questions/feature requests on [GitHub Issues][issues]
274
+
275
+ Pull requests are very welcome! Make sure your patches are well tested.
276
+ Ideally create a topic branch for every separate change you make. For
277
+ example:
278
+
279
+ 1. Fork the repo
280
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
281
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
282
+ 4. Push to the branch (`git push origin my-new-feature`)
283
+ 5. Create new Pull Request
284
+
285
+ ## <a name="authors"></a> Authors
286
+
287
+ Modified by [Ryota Arai][author] (<ryota.arai@gmail.com>)
288
+
289
+ Originally created and maintained by [Fletcher Nichol][author] (<fnichol@nichol.ca>)
290
+
291
+ ## <a name="license"></a> License
292
+
293
+ Apache 2.0 (see [LICENSE][license])
294
+
295
+
296
+ [author]: https://github.com/ryotarai
297
+ [issues]: https://github.com/ryotarai/kitchen-vagrant_sandbox/issues
298
+ [license]: https://github.com/ryotarai/kitchen-vagrant_sandbox/blob/master/LICENSE
299
+ [repo]: https://github.com/ryotarai/kitchen-vagrant_sandbox
300
+ [original_repo]: https://github.com/opscode/kitchen-vagrant
301
+ [driver_usage]: http://docs.kitchen-ci.org/drivers/usage
302
+ [chef_omnibus_dl]: http://www.opscode.com/chef/install/
303
+
304
+ [vagrant_berkshelf]: http://rubygems.org/gems/vagrant-berkshelf
305
+ [vagrant_dl]: http://downloads.vagrantup.com/
306
+ [vagrant_machine_settings]: http://docs.vagrantup.com/v2/vagrantfile/machine_settings.html
307
+ [vagrant_networking]: http://docs.vagrantup.com/v2/networking/basic_usage.html
308
+ [virtualbox_dl]: https://www.virtualbox.org/wiki/Downloads
309
+ [vagrantfile]: http://docs.vagrantup.com/v2/vagrantfile/index.html
310
+ [vagrant_providers]: http://docs.vagrantup.com/v2/providers/index.html
311
+ [vagrant_wrapper]: https://github.com/org-binbab/gem-vagrant-wrapper
312
+ [vagrant_wrapper_background]: https://github.com/org-binbab/gem-vagrant-wrapper#background---aka-the-vagrant-gem-enigma
313
+ [vmware_plugin]: http://www.vagrantup.com/vmware
314
+ [fusion_dl]: http://www.vmware.com/products/fusion/overview.html
315
+ [workstation_dl]: http://www.vmware.com/products/workstation/
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require "bundler/gem_tasks"
2
+ require 'cane/rake_task'
3
+ require 'tailor/rake_task'
4
+
5
+ desc "Run cane to check quality metrics"
6
+ Cane::RakeTask.new
7
+
8
+ Tailor::RakeTask.new do |task|
9
+ task.file_set('lib/**/*.rb', 'code')
10
+ end
11
+
12
+ desc "Display LOC stats"
13
+ task :stats do
14
+ puts "\n## Production Code Stats"
15
+ sh "countloc -r lib/kitchen"
16
+ end
17
+
18
+ desc "Run all quality tasks"
19
+ task :quality => [:cane, :tailor, :stats]
20
+
21
+ task :default => [ :quality ]
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'kitchen/driver/vagrant_sandbox_version.rb'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "kitchen-vagrant_sandbox"
8
+ gem.version = Kitchen::Driver::VAGRANT_VERSION
9
+ gem.license = 'Apache 2.0'
10
+ gem.authors = ["Ryota Arai"]
11
+ gem.email = ["ryota.arai@gmail.com"]
12
+ gem.description = "Kitchen::Driver::VagrantSandbox - A Vagrant Driver with sandbox for Test Kitchen. (Fork Version of Kitchen::Driver::Vagrant)"
13
+ gem.summary = gem.description
14
+ gem.homepage = "https://github.com/ryotarai/kitchen-vagrant_sandbox/"
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = []
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_dependency 'test-kitchen', '~> 1.0.0.beta.1'
22
+
23
+ gem.add_development_dependency 'cane'
24
+ gem.add_development_dependency 'tailor'
25
+ gem.add_development_dependency 'countloc'
26
+ end
@@ -0,0 +1,245 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Modified version by Ryota Arai (<ryota.arai@gmail.com>)
4
+ #
5
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
6
+ #
7
+ # Copyright (C) 2012, Fletcher Nichol
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+
21
+ require 'fileutils'
22
+ require 'rubygems/version'
23
+
24
+ require 'kitchen'
25
+ require 'kitchen/vagrant_sandbox/vagrantfile_creator'
26
+
27
+ module Kitchen
28
+
29
+ module Driver
30
+
31
+ # Vagrant driver for Kitchen. It communicates to Vagrant via the CLI.
32
+ #
33
+ # @author Fletcher Nichol <fnichol@nichol.ca>
34
+ #
35
+ # @todo Vagrant installation check and version will be placed into any
36
+ # dependency hook checks when feature is released
37
+ class VagrantSandbox < Kitchen::Driver::SSHBase
38
+
39
+ default_config :customize, { :memory => '256' }
40
+ default_config :synced_folders, {}
41
+ default_config :box do |driver|
42
+ driver.default_values("box")
43
+ end
44
+ default_config :box_url do |driver|
45
+ driver.default_values("box_url")
46
+ end
47
+
48
+ required_config :box
49
+
50
+ no_parallel_for :create, :destroy
51
+
52
+ def create(state)
53
+ create_vagrantfile
54
+ if sandbox_on?
55
+ sandbox_rollback
56
+ set_ssh_state(state)
57
+ info("Vagrant instance #{instance.to_str} created (by rollback).")
58
+ else
59
+ cmd = "vagrant up"
60
+ cmd += " --no-provision" unless config[:use_vagrant_provision]
61
+ cmd += " --provider=#{@config[:provider]}" if @config[:provider]
62
+ run cmd
63
+ set_ssh_state(state)
64
+ sandbox_on
65
+ info("Vagrant instance #{instance.to_str} created.")
66
+ end
67
+ end
68
+
69
+ def converge(state)
70
+ create_vagrantfile
71
+ if config[:use_vagrant_provision] && !config[:do_not_vagrant_provision_in_converge]
72
+ run "vagrant provision"
73
+ else
74
+ super
75
+ end
76
+ end
77
+
78
+ def setup(state)
79
+ create_vagrantfile
80
+ super
81
+ end
82
+
83
+ def verify(state)
84
+ create_vagrantfile
85
+ super
86
+ end
87
+
88
+ def destroy(state)
89
+ if ENV['KITCHEN_DESTROY_VM']
90
+ create_vagrantfile
91
+ @vagrantfile_created = false
92
+ run "vagrant destroy -f"
93
+ FileUtils.rm_rf(vagrant_root)
94
+ info("Vagrant instance #{instance.to_str} destroyed.")
95
+ state.delete(:hostname)
96
+ else
97
+ info "If you would like to destroy vagrant VM, run `KITCHEN_DESTROY_VM=1 kitchen destroy <REGEX>`"
98
+ # return if state[:hostname].nil?
99
+ #
100
+ # sandbox_rollback
101
+ # info("Vagrant instance #{instance.to_str} rollbacked.")
102
+ # state.delete(:hostname)
103
+ end
104
+ end
105
+
106
+ def verify_dependencies
107
+ check_vagrant_version
108
+ check_berkshelf_plugin if config[:use_vagrant_berkshelf_plugin]
109
+ end
110
+
111
+ def default_values(value)
112
+ (default_boxes[instance.platform.name] || Hash.new)[value]
113
+ end
114
+
115
+ protected
116
+
117
+ WEBSITE = "http://downloads.vagrantup.com/"
118
+ MIN_VER = "1.1.0"
119
+ OMNITRUCK_PREFIX = "https://opscode-vm-bento.s3.amazonaws.com/vagrant"
120
+ PLATFORMS = %w{
121
+ ubuntu-10.04 ubuntu-12.04 ubuntu-12.10 ubuntu-13.04
122
+ centos-6.4 centos-5.9 debian-7.1.0
123
+ }
124
+
125
+ def default_boxes
126
+ @default_boxes ||= begin
127
+ hash = Hash.new
128
+ PLATFORMS.each do |platform|
129
+ hash[platform] = Hash.new
130
+ hash[platform]["box"] = "opscode-#{platform}"
131
+ hash[platform]["box_url"] =
132
+ "#{OMNITRUCK_PREFIX}/opscode_#{platform}_provisionerless.box"
133
+ end
134
+ hash
135
+ end
136
+ end
137
+
138
+ def run(cmd, options = {})
139
+ cmd = "echo #{cmd}" if config[:dry_run]
140
+ run_command(cmd, { :cwd => vagrant_root }.merge(options))
141
+ end
142
+
143
+ def silently_run(cmd, options = {})
144
+ options = {
145
+ :live_stream => nil,
146
+ :quiet => logger.debug? ? false : true,
147
+ }.merge(options)
148
+ run_command(cmd, options)
149
+ end
150
+
151
+ def vagrant_root
152
+ @vagrant_root ||= File.join(
153
+ config[:kitchen_root], %w{.kitchen kitchen-vagrant}, instance.name
154
+ )
155
+ end
156
+
157
+ def create_vagrantfile
158
+ return if @vagrantfile_created
159
+
160
+ vagrantfile = File.join(vagrant_root, "Vagrantfile")
161
+ debug("Creating Vagrantfile for #{instance.to_str} (#{vagrantfile})")
162
+ FileUtils.mkdir_p(vagrant_root)
163
+ File.open(vagrantfile, "wb") { |f| f.write(creator.render) }
164
+ @vagrantfile_created = true
165
+ end
166
+
167
+ def creator
168
+ Kitchen::VagrantSandbox::VagrantfileCreator.new(instance, config)
169
+ end
170
+
171
+ def set_ssh_state(state)
172
+ hash = vagrant_ssh_config
173
+
174
+ state[:hostname] = hash["HostName"]
175
+ state[:username] = hash["User"]
176
+ state[:ssh_key] = hash["IdentityFile"]
177
+ state[:port] = hash["Port"]
178
+ end
179
+
180
+ def vagrant_ssh_config
181
+ output = run("vagrant ssh-config", :live_stream => nil)
182
+ lines = output.split("\n").map do |line|
183
+ tokens = line.strip.partition(" ")
184
+ [tokens.first, tokens.last.gsub(/"/, '')]
185
+ end
186
+ Hash[lines]
187
+ end
188
+
189
+ def vagrant_version
190
+ version_string = silently_run("vagrant --version")
191
+ version_string = version_string.chomp.split(" ").last
192
+ rescue Errno::ENOENT
193
+ raise UserError, "Vagrant #{MIN_VER} or higher is not installed." +
194
+ " Please download a package from #{WEBSITE}."
195
+ end
196
+
197
+ def check_vagrant_version
198
+ version = vagrant_version
199
+ if Gem::Version.new(version) < Gem::Version.new(MIN_VER)
200
+ raise UserError, "Detected an old version of Vagrant (#{version})." +
201
+ " Please upgrade to version #{MIN_VER} or higher from #{WEBSITE}."
202
+ end
203
+ end
204
+
205
+ def check_berkshelf_plugin
206
+ if File.exists?(File.join(config[:kitchen_root], "Berksfile"))
207
+ plugins = silently_run("vagrant plugin list").split("\n")
208
+ if ! plugins.find { |p| p =~ /^vagrant-berkshelf\b/ }
209
+ raise UserError, "Detected a Berksfile but the vagrant-berkshelf" +
210
+ " plugin was not found in Vagrant. Please run:" +
211
+ " `vagrant plugin install vagrant-berkshelf' and retry."
212
+ end
213
+ end
214
+ end
215
+
216
+ def check_sandbox_plugin_installed
217
+ unless silently_run('vagrant help', returns: 0..1) =~ /^\s{5}sandbox$/
218
+ raise UserError, <<-EOS
219
+ Vagrant sandbox plugin is not installed.
220
+ You can install the plugin by `vagrant plugin install sahara`.
221
+ EOS
222
+ end
223
+ end
224
+
225
+ def sandbox_on?
226
+ check_sandbox_plugin_installed
227
+ return true if run('vagrant sandbox status') =~ /Sandbox\ mode\ is\ on/
228
+ false
229
+ end
230
+
231
+ def sandbox_on
232
+ check_sandbox_plugin_installed
233
+ run 'vagrant sandbox on'
234
+ end
235
+
236
+ def sandbox_rollback
237
+ check_sandbox_plugin_installed
238
+ unless sandbox_on?
239
+ raise UserError, "sandbox mode is not on"
240
+ end
241
+ run 'vagrant sandbox rollback'
242
+ end
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Modified version by Ryota Arai (<ryota.arai@gmail.com>)
4
+ #
5
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
6
+ #
7
+ # Copyright (C) 2012, Fletcher Nichol
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+
21
+ module Kitchen
22
+
23
+ module Driver
24
+
25
+ # Version string for Vagrant Sandbox Kitchen driver
26
+ VAGRANT_VERSION = "0.1.0"
27
+ end
28
+ end
@@ -0,0 +1,185 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Modified version by Ryota Arai (<ryota.arai@gmail.com>)
4
+ #
5
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
6
+ #
7
+ # Copyright (C) 2013, Fletcher Nichol
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+
21
+ module Kitchen
22
+
23
+ module VagrantSandbox
24
+
25
+ # Class to render Vagrantfiles to be used by the Kitchen Vagrant driver.
26
+ #
27
+ # @author Fletcher Nichol <fnichol@nichol.ca>
28
+ class VagrantfileCreator
29
+
30
+ def initialize(instance, config)
31
+ @instance = instance
32
+ @config = config
33
+ end
34
+
35
+ def render
36
+ arr = []
37
+ arr << %{Vagrant.configure("2") do |c|}
38
+ common_block(arr)
39
+ guest_block(arr)
40
+ network_block(arr)
41
+ provider_block(arr)
42
+ chef_block(arr) if config[:use_vagrant_provision]
43
+ berkshelf_block(arr) if config[:use_vagrant_berkshelf_plugin]
44
+ synced_folders_block(arr)
45
+ arr << %{end}
46
+ arr.join("\n")
47
+ end
48
+
49
+ private
50
+
51
+ attr_reader :instance, :config
52
+
53
+ def common_block(arr)
54
+ arr << %{ c.vm.box = "#{config[:box]}"}
55
+ arr << %{ c.vm.box_url = "#{config[:box_url]}"} if config[:box_url]
56
+ arr << %{ c.vm.hostname = "#{instance.name}.vagrantup.com"}
57
+ arr << %{ c.ssh.username = "#{config[:username]}"} if config[:username]
58
+ end
59
+
60
+ def guest_block(arr)
61
+ if config[:guest]
62
+ arr << %{ c.vm.guest = #{config[:guest]}}
63
+ end
64
+ end
65
+
66
+ def network_block(arr)
67
+ Array(config[:network]).each do |network_options|
68
+ options = Array(network_options.dup)
69
+ type = options.shift
70
+ arr << %{ c.vm.network(:#{type}, #{options.join(", ")})}
71
+ end
72
+ end
73
+
74
+ def provider_block(arr)
75
+ arr << %{ c.vm.provider :#{provider} do |p|}
76
+ case provider
77
+ when 'virtualbox'
78
+ virtualbox_customize(arr)
79
+ when 'vmware_fusion', 'vmware_workstation'
80
+ vmware_customize(arr)
81
+ when 'rackspace'
82
+ rackspace_customize(arr)
83
+ end
84
+ arr << %{ end}
85
+ end
86
+
87
+ def chef_block(arr)
88
+ arr << %{ c.vm.provision :chef_solo do |chef|}
89
+ arr << %{ chef.log_level = #{vagrant_logger_level}}
90
+ if config[:vagrant_provision_run_list]
91
+ arr << %{ chef.run_list = #{config[:vagrant_provision_run_list].inspect}}
92
+ else
93
+ arr << %{ chef.run_list = #{instance.run_list.inspect}}
94
+ end
95
+ arr << %{ chef.json = #{instance.attributes.to_s}}
96
+ if instance.suite.data_bags_path
97
+ arr << %{ chef.data_bags_path = "#{instance.suite.data_bags_path}"}
98
+ end
99
+ if key_path
100
+ arr << %{ chef.encrypted_data_bag_secret_key_path = "#{key_path}"}
101
+ end
102
+ if instance.suite.roles_path
103
+ arr << %{ chef.roles_path = "#{instance.suite.roles_path}"}
104
+ end
105
+ arr << %{ end}
106
+ end
107
+
108
+ def berkshelf_block(arr)
109
+ if File.exists?(berksfile)
110
+ arr << %{ c.berkshelf.berksfile_path = "#{berksfile}"}
111
+ arr << %{ if c.berkshelf.respond_to?(:enabled)}
112
+ arr << %{ c.berkshelf.enabled = true}
113
+ arr << %{ end}
114
+ end
115
+ end
116
+
117
+ def synced_folders_block(arr)
118
+ config[:synced_folders].each do |source, destination|
119
+ arr << %{ c.vm.synced_folder "#{source}", "#{destination}" }
120
+ end
121
+ end
122
+
123
+ def vagrant_logger_level
124
+ if instance.logger.debug?
125
+ ":debug"
126
+ elsif instance.logger.info?
127
+ ":info"
128
+ elsif instance.logger.error?
129
+ ":error"
130
+ elsif instance.logger.fatal?
131
+ ":fatal"
132
+ else
133
+ ":info"
134
+ end
135
+ end
136
+
137
+ def berksfile
138
+ File.join(config[:kitchen_root], "Berksfile")
139
+ end
140
+
141
+ def provider
142
+ config[:provider] || ENV['VAGRANT_DEFAULT_PROVIDER'] || 'virtualbox'
143
+ end
144
+
145
+ def virtualbox_customize(arr)
146
+ config[:customize].each do |key, value|
147
+ arr << %{ p.customize ["modifyvm", :id, "--#{key}", "#{value}"]}
148
+ end
149
+ end
150
+
151
+ def vmware_customize(arr)
152
+ config[:customize].each do |key, value|
153
+ if key == :memory
154
+ # XXX: This is kind of a hack to address the fact that
155
+ # "memory" is a default attribute in our Vagrant driver.
156
+ #
157
+ # The VMware VMX format expects to see "memsize" instead of
158
+ # just "memory" like Virtualbox would. So if "memsize" has
159
+ # been specified we simply ignore the "memory" option.
160
+ unless config[:customize].include?(:memsize)
161
+ arr << %{ p.vmx["memsize"] = "#{value}"}
162
+ end
163
+ else
164
+ arr << %{ p.vmx["#{key}"] = "#{value}"}
165
+ end
166
+ end
167
+ end
168
+
169
+ def rackspace_customize(arr)
170
+ config[:customize].each do |key, value|
171
+ arr << %{ p.#{key} = "#{value}"}
172
+ end
173
+ end
174
+
175
+ def key_path
176
+ return nil if instance.suite.encrypted_data_bag_secret_key_path.nil?
177
+
178
+ File.join(
179
+ config[:kitchen_root],
180
+ instance.suite.encrypted_data_bag_secret_key_path
181
+ )
182
+ end
183
+ end
184
+ end
185
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-vagrant_sandbox
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryota Arai
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-02 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.0.0.beta.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0.beta.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: cane
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tailor
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: countloc
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
+ description: Kitchen::Driver::VagrantSandbox - A Vagrant Driver with sandbox for Test
70
+ Kitchen. (Fork Version of Kitchen::Driver::Vagrant)
71
+ email:
72
+ - ryota.arai@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - .travis.yml
79
+ - CHANGELOG.md
80
+ - Gemfile
81
+ - LICENSE
82
+ - README.md
83
+ - Rakefile
84
+ - kitchen-vagrant_sandbox.gemspec
85
+ - lib/kitchen/driver/vagrant_sandbox.rb
86
+ - lib/kitchen/driver/vagrant_sandbox_version.rb
87
+ - lib/kitchen/vagrant_sandbox/vagrantfile_creator.rb
88
+ homepage: https://github.com/ryotarai/kitchen-vagrant_sandbox/
89
+ licenses:
90
+ - Apache 2.0
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 2.0.2
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Kitchen::Driver::VagrantSandbox - A Vagrant Driver with sandbox for Test
112
+ Kitchen. (Fork Version of Kitchen::Driver::Vagrant)
113
+ test_files: []