vagrant-foodtaster-server 0.0.2 → 0.0.3

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.
data/.gitignore CHANGED
@@ -1,5 +1,7 @@
1
1
  *.gem
2
2
  *.rbc
3
+ *.swp
4
+ *.swo
3
5
  .bundle
4
6
  .config
5
7
  .yardoc
data/README.md CHANGED
@@ -1,11 +1,8 @@
1
1
  # Vagrant Foodtaster Server
2
2
 
3
- Foodtaster is a tool for testing Chef cookbooks using RSpec and
4
- Vagrant. This plugin allows Foodtaster to interact with Vagrant via
5
- simple DRb protocol.
6
-
7
- Foodtaster is in early development stage, so don't expect too much
8
- from code and functionality.
3
+ [Foodtaster](http://github.com/mlapshin/foodtaster) is a tool for
4
+ testing Chef cookbooks using RSpec and Vagrant. This Vagrant plugin
5
+ allows Foodtaster to interact with Vagrant via simple DRb protocol.
9
6
 
10
7
  ## Installation
11
8
 
@@ -1,3 +1,4 @@
1
1
  require "vagrant"
2
2
  require "vagrant-foodtaster-server/plugin"
3
3
  require "vagrant-foodtaster-server/version"
4
+ require "vagrant-foodtaster-server/string_ext"
@@ -4,7 +4,21 @@ class VagrantFoodtasterServer
4
4
  @env = env
5
5
  @app = app
6
6
 
7
- @sahara = Sahara::Session::Command.new(@app, @env)
7
+ begin
8
+ require 'sahara/session/virtualbox'
9
+ rescue LoadError
10
+ raise RuntimeError, <<-EOT.strip_heredoc
11
+ Cannot find `sahara' plugin. Please, make sure that `sahara' plugin is installed using command:
12
+ $ vagrant plugin list
13
+
14
+ If `sahara' plugin is not installed, install it:
15
+ $ vagrant plugin install sahara
16
+ EOT
17
+ end
18
+ end
19
+
20
+ def version
21
+ VagrantFoodtasterServer::VERSION
8
22
  end
9
23
 
10
24
  def redirect_stdstreams(stdout, stderr)
@@ -16,19 +30,35 @@ class VagrantFoodtasterServer
16
30
  vm = get_vm(vm_name)
17
31
 
18
32
  if vm.state.id.to_s != 'running'
19
- vm.action(:up, provision_enabled: false)
33
+ chef_run_list = get_chef_solo_run_list(vm)
34
+ provision_types = [:shell, :puppet]
35
+
36
+ unless chef_run_list.empty?
37
+ provision_types << :chef_solo
38
+ end
39
+
40
+ vm.action(:up,
41
+ provision_types: provision_types,
42
+ provision_enabled: true)
20
43
  end
21
44
 
22
- unless @sahara.is_snapshot_mode_on?(vm)
23
- @sahara.on(vm)
45
+ sahara = sahara_for(vm)
46
+
47
+ unless sahara.is_snapshot_mode_on?
48
+ sahara.on
24
49
  end
25
50
  end
26
51
 
27
52
  def rollback_vm(vm_name)
28
53
  vm = get_vm(vm_name)
29
- @env.ui.info "[FT] rollback #{vm_name}"
30
54
 
31
- @sahara.rollback(vm)
55
+ sahara_for(vm).rollback
56
+ end
57
+
58
+ def shutdown_vm(vm_name)
59
+ vm = get_vm(vm_name)
60
+
61
+ vm.action(:halt)
32
62
  end
33
63
 
34
64
  def vm_defined?(vm_name)
@@ -37,18 +67,10 @@ class VagrantFoodtasterServer
37
67
 
38
68
  def run_chef_on_vm(vm_name, current_run_config)
39
69
  vm = get_vm(vm_name)
40
- chef_solo_config = vm.config.vm.provisioners.find { |p| p.name == :chef_solo }
41
70
 
42
- unless chef_solo_config
43
- raise RuntimeError, <<-EOT
44
- VM '#{vm_name}' doesn't have a configured chef-solo provisioner, which is requied by Foodtaster to run specs on this VM.
45
- Please, add dummy chef-solo provisioner to your Vagrantfile, like this:
71
+ validate_vm!(vm)
46
72
 
47
- config.vm.provision :chef_solo do |chef|
48
- chef.cookbooks_path = %w[site-cookbooks]
49
- end
50
- EOT
51
- end
73
+ chef_solo_config = vm.config.vm.provisioners.find { |p| p.name == :chef_solo }
52
74
 
53
75
  provisioner_klass = Vagrant.plugin("2").manager.provisioners[:chef_solo]
54
76
  provisioner = provisioner_klass.new(vm, chef_solo_config.config)
@@ -56,7 +78,11 @@ class VagrantFoodtasterServer
56
78
  current_run_chef_solo_config = apply_current_run_config(vm.config, current_run_config)
57
79
  provisioner.configure(current_run_chef_solo_config)
58
80
 
59
- provisioner.provision
81
+ begin
82
+ provisioner.provision
83
+ rescue Exception
84
+ raise RuntimeError, "Chef Run failed on #{vm_name} with config #{current_run_config.inspect}"
85
+ end
60
86
  end
61
87
 
62
88
  def execute_command_on_vm(vm_name, command)
@@ -72,14 +98,47 @@ class VagrantFoodtasterServer
72
98
 
73
99
  private
74
100
 
101
+ def sahara_for(vm)
102
+ Sahara::Session::Virtualbox.new(vm)
103
+ end
104
+
105
+ def get_chef_solo_run_list(vm)
106
+ vm.config.vm.provisioners.map do |c|
107
+ if c.name == :chef_solo
108
+ c.config.run_list
109
+ else
110
+ nil
111
+ end
112
+ end.compact.flatten
113
+ end
114
+
75
115
  def get_vm(vm_name)
76
116
  @env.machine(vm_name, :virtualbox)
77
117
  end
78
118
 
119
+ def validate_vm!(vm)
120
+ chef_solo_config = vm.config.vm.provisioners.find { |p| p.name == :chef_solo }
121
+
122
+ unless chef_solo_config
123
+ raise RuntimeError, <<-EOT.strip_heredoc
124
+ VM '#{vm.name}' doesn't have a configured chef-solo provisioner, which is requied by Foodtaster to run specs on this VM.
125
+ Please, add dummy chef-solo provisioner to your Vagrantfile, like this:
126
+ config.vm.provision :chef_solo do |chef|
127
+ chef.cookbooks_path = %w[site-cookbooks]
128
+ end
129
+ EOT
130
+ end
131
+ end
132
+
79
133
  def apply_current_run_config(vm_config, current_run_config)
80
134
  modified_config = vm_config.dup
81
- modified_config.vm.provisioners[0].config.run_list = current_run_config[:run_list]
82
- modified_config.vm.provisioners[0].config.json = current_run_config[:json]
135
+
136
+ provisioner_index = modified_config.vm.provisioners.find_index do |prov|
137
+ prov.name == :chef_solo
138
+ end
139
+
140
+ modified_config.vm.provisioners[provisioner_index].config.run_list = current_run_config[:run_list]
141
+ modified_config.vm.provisioners[provisioner_index].config.json = current_run_config[:json]
83
142
 
84
143
  modified_config
85
144
  end
@@ -8,12 +8,19 @@ class VagrantFoodtasterServer
8
8
 
9
9
  port_number = argv.size == 0 ? 35672 : argv[0].to_i
10
10
  DRb.start_service "druby://localhost:#{port_number}", VagrantFoodtasterServer::Server.new(@app, @env)
11
+ DRb.thread.join
11
12
 
12
- begin
13
- DRb.thread.join
14
- rescue Interrupt
15
- DRb.stop_service
16
- end
13
+ rescue RuntimeError, Errno::EADDRINUSE => e
14
+ write_formatted_exception_message(e)
15
+ rescue Interrupt
16
+ DRb.stop_service
17
+ end
18
+
19
+ private
20
+
21
+ def write_formatted_exception_message(e)
22
+ error = "#{e.message}\n\nServer Error Backtrace:\n #{e.backtrace.join("\n ")}"
23
+ @env.ui.error(error)
17
24
  end
18
25
  end
19
26
  end
@@ -0,0 +1,7 @@
1
+ class String
2
+ def strip_heredoc
3
+ indent = scan(/^[ \t]*(?=\S)/).min.try(:size) || 0
4
+ gsub(/^[ \t]{#{indent}}/, '')
5
+ end
6
+ end
7
+
@@ -1,3 +1,3 @@
1
1
  class VagrantFoodtasterServer
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -11,6 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.description = %q{A Foodtaster DRb server.}
12
12
  gem.summary = %q{Foodtaster is a tool for testing Chef cookbooks using RSpec and Vagrant. This plugin allows Foodtaster to interact with Vagrant via simple DRb protocol. }
13
13
  gem.homepage = ""
14
+ gem.license = 'MIT'
14
15
 
15
16
  gem.files = `git ls-files`.split($/)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-foodtaster-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
4
  prerelease:
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Mike Lapshin
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-24 00:00:00.000000000 Z
12
+ date: 2013-11-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A Foodtaster DRb server.
15
15
  email:
@@ -27,10 +27,12 @@ files:
27
27
  - lib/vagrant-foodtaster-server/plugin.rb
28
28
  - lib/vagrant-foodtaster-server/server.rb
29
29
  - lib/vagrant-foodtaster-server/server_command.rb
30
+ - lib/vagrant-foodtaster-server/string_ext.rb
30
31
  - lib/vagrant-foodtaster-server/version.rb
31
32
  - vagrant-foodtaster-server.gemspec
32
33
  homepage: ''
33
- licenses: []
34
+ licenses:
35
+ - MIT
34
36
  post_install_message:
35
37
  rdoc_options: []
36
38
  require_paths:
@@ -49,9 +51,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
51
  version: '0'
50
52
  requirements: []
51
53
  rubyforge_project:
52
- rubygems_version: 1.8.24
54
+ rubygems_version: 1.8.25
53
55
  signing_key:
54
56
  specification_version: 3
55
57
  summary: Foodtaster is a tool for testing Chef cookbooks using RSpec and Vagrant.
56
58
  This plugin allows Foodtaster to interact with Vagrant via simple DRb protocol.
57
59
  test_files: []
60
+ has_rdoc: