vagrant-vsphere 0.5.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.
Files changed (40) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE.txt +24 -0
  4. data/README.md +151 -0
  5. data/Rakefile +17 -0
  6. data/example_box/metadata.json +3 -0
  7. data/lib/vSphere/action/clone.rb +83 -0
  8. data/lib/vSphere/action/close_vsphere.rb +24 -0
  9. data/lib/vSphere/action/connect_vsphere.rb +25 -0
  10. data/lib/vSphere/action/destroy.rb +38 -0
  11. data/lib/vSphere/action/get_ssh_info.rb +38 -0
  12. data/lib/vSphere/action/get_state.rb +46 -0
  13. data/lib/vSphere/action/is_created.rb +16 -0
  14. data/lib/vSphere/action/is_running.rb +20 -0
  15. data/lib/vSphere/action/message_already_created.rb +18 -0
  16. data/lib/vSphere/action/message_not_created.rb +18 -0
  17. data/lib/vSphere/action/message_not_running.rb +18 -0
  18. data/lib/vSphere/action/power_off.rb +28 -0
  19. data/lib/vSphere/action/power_on.rb +31 -0
  20. data/lib/vSphere/action/sync_folders.rb +65 -0
  21. data/lib/vSphere/action.rb +151 -0
  22. data/lib/vSphere/config.rb +37 -0
  23. data/lib/vSphere/errors.rb +11 -0
  24. data/lib/vSphere/plugin.rb +30 -0
  25. data/lib/vSphere/provider.rb +39 -0
  26. data/lib/vSphere/util/machine_helpers.rb +15 -0
  27. data/lib/vSphere/util/vim_helpers.rb +37 -0
  28. data/lib/vSphere/version.rb +5 -0
  29. data/lib/vagrant-vsphere.rb +18 -0
  30. data/locales/en.yml +61 -0
  31. data/spec/action_spec.rb +116 -0
  32. data/spec/clone_spec.rb +32 -0
  33. data/spec/connect_vsphere_spec.rb +24 -0
  34. data/spec/destroy_spec.rb +31 -0
  35. data/spec/get_ssh_info_spec.rb +31 -0
  36. data/spec/get_state_spec.rb +54 -0
  37. data/spec/is_created_spec.rb +29 -0
  38. data/spec/spec_helper.rb +97 -0
  39. data/vSphere.gemspec +28 -0
  40. metadata +205 -0
@@ -0,0 +1,65 @@
1
+ require 'i18n'
2
+ require "vagrant/util/subprocess"
3
+ require "vagrant/util/scoped_hash_override"
4
+
5
+ module VagrantPlugins
6
+ module VSphere
7
+ module Action
8
+ # This middleware uses `rsync` to sync the folders over to the vSphere instance
9
+ # Borrowed from the Vagrant AWS gem, see https://github.com/mitchellh/vagrant-aws/blob/master/lib/vagrant-aws/action/sync_folders.rb
10
+ class SyncFolders
11
+ include Vagrant::Util::ScopedHashOverride
12
+
13
+ def initialize(app, env)
14
+ @app = app
15
+ end
16
+
17
+ def call(env)
18
+ @app.call(env)
19
+
20
+ ssh_info = env[:machine].ssh_info
21
+
22
+ env[:machine].config.vm.synced_folders.each do |id, data|
23
+ data = scoped_hash_override(data, :vsphere)
24
+
25
+ # Ignore disabled shared folders
26
+ next if data[:disabled]
27
+
28
+ hostpath = File.expand_path(data[:hostpath], env[:root_path])
29
+ guestpath = data[:guestpath]
30
+
31
+ # Make sure there is a trailing slash on the host path to
32
+ # avoid creating an additional directory with rsync
33
+ hostpath = "#{hostpath}/" if hostpath !~ /\/$/
34
+
35
+ env[:ui].info(I18n.t("vsphere.rsync_folder",
36
+ :hostpath => hostpath,
37
+ :guestpath => guestpath))
38
+
39
+ # Create the guest path
40
+ env[:machine].communicate.sudo("mkdir -p '#{guestpath}'")
41
+ env[:machine].communicate.sudo(
42
+ "chown #{ssh_info[:username]} '#{guestpath}'")
43
+
44
+ # Rsync over to the guest path using the SSH info
45
+ command = [
46
+ "rsync", "--verbose", "--archive", "-z",
47
+ "--exclude", ".vagrant/",
48
+ "-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i '#{ssh_info[:private_key_path]}'",
49
+ hostpath,
50
+ "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
51
+
52
+
53
+ r = Vagrant::Util::Subprocess.execute(*command)
54
+ if r.exit_code != 0
55
+ raise Errors::RsyncError,
56
+ :guestpath => guestpath,
57
+ :hostpath => hostpath,
58
+ :stderr => r.stderr
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,151 @@
1
+ require 'vagrant'
2
+ require 'vagrant/action/builder'
3
+
4
+ module VagrantPlugins
5
+ module VSphere
6
+ module Action
7
+ include Vagrant::Action::Builtin
8
+
9
+ #Vagrant commands
10
+ def self.action_destroy
11
+ Vagrant::Action::Builder.new.tap do |b|
12
+ b.use ConfigValidate
13
+ b.use ConnectVSphere
14
+ b.use Call, IsRunning do |env, b2|
15
+ if [:result]
16
+ b2.use PowerOff
17
+ next
18
+ end
19
+ end
20
+ b.use Destroy
21
+ end
22
+ end
23
+
24
+ def self.action_provision
25
+ Vagrant::Action::Builder.new.tap do |b|
26
+ b.use ConfigValidate
27
+ b.use Call, IsCreated do |env, b2|
28
+ if !env[:result]
29
+ b2.use MessageNotCreated
30
+ next
31
+ end
32
+
33
+ b2.use Call, IsRunning do |env, b3|
34
+ if !env[:result]
35
+ b3.use MessageNotRunning
36
+ next
37
+ end
38
+
39
+ b3.use Provision
40
+ b3.use SyncFolders
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def self.action_ssh
47
+ Vagrant::Action::Builder.new.tap do |b|
48
+ b.use ConfigValidate
49
+ b.use Call, IsCreated do |env, b2|
50
+ if !env[:result]
51
+ b2.use MessageNotCreated
52
+ next
53
+ end
54
+
55
+ b2.use Call, IsRunning do |env, b3|
56
+ if !env[:result]
57
+ b3.use MessageNotRunning
58
+ next
59
+ end
60
+
61
+ b3.use SSHExec
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def self.action_up
68
+ Vagrant::Action::Builder.new.tap do |b|
69
+ b.use ConfigValidate
70
+ b.use ConnectVSphere
71
+ b.use Call, IsCreated do |env, b2|
72
+ if env[:result]
73
+ b2.use MessageAlreadyCreated
74
+ next
75
+ end
76
+
77
+ b2.use Clone
78
+ end
79
+ b.use Call, IsRunning do |env, b2|
80
+ if !env[:result]
81
+ b2.use PowerOn
82
+ end
83
+ end
84
+ b.use CloseVSphere
85
+ b.use Provision
86
+ b.use SyncFolders
87
+ end
88
+ end
89
+
90
+ def self.action_halt
91
+ Vagrant::Action::Builder.new.tap do |b|
92
+ b.use ConfigValidate
93
+ b.use ConnectVSphere
94
+ b.use Call, IsCreated do |env, b2|
95
+ if !env[:result]
96
+ b2.use MessageNotCreated
97
+ next
98
+ end
99
+
100
+ b2.use Call, IsRunning do |env, b3|
101
+ if !env[:result]
102
+ b3.use MessageNotRunning
103
+ next
104
+ end
105
+
106
+ b3.use PowerOff
107
+ end
108
+ end
109
+ b.use CloseVSphere
110
+ end
111
+ end
112
+
113
+ #vSphere specific actions
114
+ def self.action_get_state
115
+ Vagrant::Action::Builder.new.tap do |b|
116
+ b.use ConfigValidate
117
+ b.use ConnectVSphere
118
+ b.use GetState
119
+ b.use CloseVSphere
120
+ end
121
+ end
122
+
123
+ def self.action_get_ssh_info
124
+ Vagrant::Action::Builder.new.tap do |b|
125
+ b.use ConfigValidate
126
+ b.use ConnectVSphere
127
+ b.use GetSshInfo
128
+ b.use CloseVSphere
129
+ end
130
+ end
131
+
132
+ #autoload
133
+ action_root = Pathname.new(File.expand_path('../action', __FILE__))
134
+ autoload :Clone, action_root.join('clone')
135
+ autoload :CloseVSphere, action_root.join('close_vsphere')
136
+ autoload :ConnectVSphere, action_root.join('connect_vsphere')
137
+ autoload :Destroy, action_root.join('destroy')
138
+ autoload :GetSshInfo, action_root.join('get_ssh_info')
139
+ autoload :GetState, action_root.join('get_state')
140
+ autoload :IsCreated, action_root.join('is_created')
141
+ autoload :IsRunning, action_root.join('is_running')
142
+ autoload :MessageAlreadyCreated, action_root.join('message_already_created')
143
+ autoload :MessageNotCreated, action_root.join('message_not_created')
144
+ autoload :MessageNotRunning, action_root.join('message_not_running')
145
+ autoload :PowerOff, action_root.join('power_off')
146
+ autoload :PowerOn, action_root.join('power_on')
147
+ autoload :SyncFolders, action_root.join('sync_folders')
148
+ end
149
+ end
150
+ end
151
+
@@ -0,0 +1,37 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module VSphere
5
+ class Config < Vagrant.plugin('2', :config)
6
+ attr_accessor :host
7
+ attr_accessor :insecure
8
+ attr_accessor :user
9
+ attr_accessor :password
10
+ attr_accessor :data_center_name
11
+ attr_accessor :compute_resource_name
12
+ attr_accessor :resource_pool_name
13
+ attr_accessor :clone_from_vm
14
+ attr_accessor :template_name
15
+ attr_accessor :name
16
+ attr_accessor :customization_spec_name
17
+ attr_accessor :data_store_name
18
+
19
+ def validate(machine)
20
+ errors = _detected_errors
21
+
22
+ #TODO: add blank?
23
+ errors << I18n.t('config.host') if host.nil?
24
+ errors << I18n.t('config.user') if user.nil?
25
+ errors << I18n.t('config.password') if password.nil?
26
+ errors << I18n.t('config.name') if name.nil?
27
+ errors << I18n.t('config.template') if template_name.nil?
28
+
29
+ #These are only required if we're cloning from an actual template
30
+ errors << I18n.t('config.compute_resource') if compute_resource_name.nil? and not clone_from_vm
31
+ errors << I18n.t('config.resource_pool') if resource_pool_name.nil? and not clone_from_vm
32
+
33
+ { 'vSphere Provider' => errors }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module VSphere
5
+ module Errors
6
+ class VSphereError < Vagrant::Errors::VagrantError
7
+ error_namespace('vsphere.errors')
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module VSphere
5
+ class Plugin < Vagrant.plugin('2')
6
+ name 'vsphere'
7
+ description 'Allows Vagrant to manage machines with VMWare vSphere'
8
+
9
+ config(:vsphere, :provider) do
10
+ require_relative 'config'
11
+ Config
12
+ end
13
+
14
+ provider(:vsphere) do
15
+ # TODO: add logging
16
+ setup_i18n
17
+
18
+ # Return the provider
19
+ require_relative 'provider'
20
+ Provider
21
+ end
22
+
23
+
24
+ def self.setup_i18n
25
+ I18n.load_path << File.expand_path('locales/en.yml', VSphere.source_root)
26
+ I18n.reload!
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module VSphere
5
+ class Provider < Vagrant.plugin('2', :provider)
6
+ def initialize(machine)
7
+ @machine = machine
8
+ end
9
+
10
+ def action(name)
11
+ action_method = "action_#{name}"
12
+ return Action.send(action_method) if Action.respond_to?(action_method)
13
+ nil
14
+ end
15
+
16
+ def ssh_info
17
+ env = @machine.action('get_ssh_info')
18
+ env[:machine_ssh_info]
19
+ end
20
+
21
+ def state
22
+ env = @machine.action('get_state')
23
+
24
+ state_id = env[:machine_state_id]
25
+
26
+ short = "vagrant_vsphere.states.short_#{state_id}"
27
+ long = "vagrant_vsphere.states.long_#{state_id}"
28
+
29
+ # Return the MachineState object
30
+ Vagrant::MachineState.new(state_id, short, long)
31
+ end
32
+
33
+ def to_s
34
+ id = @machine.id.nil? ? 'new' : @machine.id
35
+ "vSphere (#{id})"
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,15 @@
1
+ module VagrantPlugins
2
+ module VSphere
3
+ module Util
4
+ module MachineHelpers
5
+ def wait_for_ssh(env)
6
+ env[:ui].info(I18n.t("vsphere.waiting_for_ssh"))
7
+ while true
8
+ break if env[:machine].communicate.ready?
9
+ sleep 5
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,37 @@
1
+ require 'rbvmomi'
2
+
3
+ module VagrantPlugins
4
+ module VSphere
5
+ module Util
6
+ module VimHelpers
7
+ def get_datacenter(connection, machine)
8
+ connection.serviceInstance.find_datacenter(machine.provider_config.data_center_name) or fail Errors::VSphereError, :message => I18n.t('errors.missing_datacenter')
9
+ end
10
+
11
+ def get_vm_by_uuid(connection, machine)
12
+ get_datacenter(connection, machine).vmFolder.findByUuid machine.id
13
+ end
14
+
15
+ def get_resource_pool(connection, machine)
16
+ cr = get_datacenter(connection, machine).find_compute_resource(machine.provider_config.compute_resource_name) or fail Errors::VSphereError, :message => I18n.t('errors.missing_compute_resource')
17
+ cr.resourcePool.find(machine.provider_config.resource_pool_name) or fail Errors::VSphereError, :message => I18n.t('errors.missing_resource_pool')
18
+ end
19
+
20
+ def get_customization_spec_info_by_name(connection, machine)
21
+ name = machine.provider_config.customization_spec_name
22
+ return if name.nil? || name.empty?
23
+
24
+ manager = connection.serviceContent.customizationSpecManager or fail Errors::VSphereError, :message => I18n.t('errors.null_configuration_spec_manager') if manager.nil?
25
+ spec = manager.GetCustomizationSpec(:name => name) or fail Errors::VSphereError, :message => I18n.t('errors.missing_configuration_spec') if spec.nil?
26
+ end
27
+
28
+ def get_datastore(connection, machine)
29
+ name = machine.provider_config.data_store_name
30
+ return if name.nil? || name.empty?
31
+
32
+ get_datacenter(connection, machine).find_datastore name or fail Errors::VSphereError, :message => I18n.t('errors.missing_datastore')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module VSphere
3
+ VERSION = '0.5.0'
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ require 'pathname'
2
+
3
+ require 'vSphere/plugin'
4
+
5
+ module VagrantPlugins
6
+ module VSphere
7
+ lib_path = Pathname.new(File.expand_path('../vSphere', __FILE__))
8
+ autoload :Action, lib_path.join('action')
9
+ autoload :Errors, lib_path.join('errors')
10
+
11
+ # This returns the path to the source of this plugin.
12
+ #
13
+ # @return [Pathname]
14
+ def self.source_root
15
+ @source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
16
+ end
17
+ end
18
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,61 @@
1
+ en:
2
+ vsphere:
3
+ creating_cloned_vm: |-
4
+ Calling vSphere CloneVM with the following settings:
5
+ vm_clone_success: |-
6
+ New virtual machine successfully cloned and started
7
+ destroy_vm: |-
8
+ Calling vShpere Destroy
9
+ power_off_vm: |-
10
+ Calling vSphere PowerOff
11
+ power_on_vm: |-
12
+ Calling vSphere PowerOn
13
+ vm_already_created: |-
14
+ The VM is already created
15
+ vm_not_created: |-
16
+ The VM has not been created
17
+ vm_not_running: |-
18
+ The VM is not running
19
+ waiting_for_ssh: |-
20
+ Waiting for SSH to become available...
21
+ rsync_folder: |-
22
+ Rsyncing folder: %{hostpath} => %{guestpath}
23
+ errors:
24
+ missing_template: |-
25
+ Configured template/source VM could not be found
26
+ missing_datacenter: |-
27
+ Configured data center not found
28
+ missing_compute_resource: |-
29
+ Configured compute resource not found
30
+ missing_resource_pool: |-
31
+ Configured resource pool not found
32
+ null_configuration_spec_manager: |-
33
+ Configuration spec manager not configured in the ServiceInstance
34
+ missing_configuration_spec: |-
35
+ Configured configuration spec not found
36
+ missing_datastore: |-
37
+ Configured data store not found
38
+ rsync_error: |-
39
+ There was an error when attemping to rsync a share folder.
40
+ Please inspect the error message below for more info.
41
+
42
+ Host path: %{hostpath}
43
+ Guest path: %{guestpath}
44
+ Error: %{stderr}
45
+ too_many_private_networks: |-
46
+ There a more private networks configured than can be assigned to the customization spec
47
+ config:
48
+ host: |-
49
+ Configuration must specify a vSphere host
50
+ user: |-
51
+ Configuration must specify a vSphere user
52
+ password: |-
53
+ Configuration must specify a vSphere password
54
+ name: |-
55
+ Configuration must specify a VM name
56
+ template: |-
57
+ Configuration must specify a template name
58
+ compute_resource: |-
59
+ Configuration must specify a compute resource name
60
+ resource_pool: |-
61
+ Configuration must specify a resource pool name
@@ -0,0 +1,116 @@
1
+ require 'spec_helper'
2
+ require 'vagrant'
3
+
4
+ describe VagrantPlugins::VSphere::Action do
5
+ def run(action)
6
+ Vagrant::Action::Runner.new.run described_class.send("action_#{action}"), @env
7
+ end
8
+
9
+ before :each do
10
+ @machine.stub(:id).and_return(EXISTING_UUID)
11
+ end
12
+
13
+ describe 'up' do
14
+ def run_up
15
+ run :up
16
+ end
17
+
18
+ it 'should connect to vSphere' do
19
+ VagrantPlugins::VSphere::Action::ConnectVSphere.any_instance.should_receive(:call)
20
+
21
+ run_up
22
+ end
23
+
24
+ it 'should check if the VM exits' do
25
+ VagrantPlugins::VSphere::Action::IsCreated.any_instance.should_receive(:call)
26
+
27
+ run_up
28
+ end
29
+
30
+ it 'should create the VM when the VM does already not exist' do
31
+ @machine.state.stub(:id).and_return(:not_created)
32
+
33
+ VagrantPlugins::VSphere::Action::Clone.any_instance.should_receive(:call)
34
+
35
+ run_up
36
+ end
37
+
38
+ it 'should not create the VM when the VM already exists' do
39
+ @machine.state.stub(:id).and_return(:running)
40
+
41
+ VagrantPlugins::VSphere::Action::Clone.any_instance.should_not_receive(:call)
42
+
43
+ run_up
44
+ end
45
+ end
46
+
47
+ describe 'destroy' do
48
+ def run_destroy
49
+ run :destroy
50
+ end
51
+
52
+ it 'should connect to vSphere' do
53
+ VagrantPlugins::VSphere::Action::ConnectVSphere.any_instance.should_receive(:call)
54
+
55
+ run_destroy
56
+ end
57
+
58
+ it 'should power off the VM' do
59
+ VagrantPlugins::VSphere::Action::PowerOff.any_instance.should_receive(:call)
60
+
61
+ run_destroy
62
+ end
63
+
64
+ it 'should destroy the VM' do
65
+ VagrantPlugins::VSphere::Action::Destroy.any_instance.should_receive(:call)
66
+
67
+ run_destroy
68
+ end
69
+ end
70
+
71
+ describe 'halt' do
72
+ it 'should power off the VM' do
73
+ @machine.state.stub(:id).and_return(:running)
74
+
75
+ VagrantPlugins::VSphere::Action::PowerOff.any_instance.should_receive(:call)
76
+
77
+ run :halt
78
+ end
79
+ end
80
+
81
+ describe 'get state' do
82
+ def run_get_state
83
+ run :get_state
84
+ end
85
+
86
+ it 'should connect to vSphere' do
87
+ VagrantPlugins::VSphere::Action::ConnectVSphere.any_instance.should_receive(:call)
88
+
89
+ run_get_state
90
+ end
91
+
92
+ it 'should get the power state' do
93
+ VagrantPlugins::VSphere::Action::GetState.any_instance.should_receive(:call)
94
+
95
+ run_get_state
96
+ end
97
+ end
98
+
99
+ describe 'get ssh info' do
100
+ def run_get_ssh_info
101
+ run :get_ssh_info
102
+ end
103
+
104
+ it 'should connect to vSphere' do
105
+ VagrantPlugins::VSphere::Action::ConnectVSphere.any_instance.should_receive(:call)
106
+
107
+ run_get_ssh_info
108
+ end
109
+
110
+ it 'should get the power state' do
111
+ VagrantPlugins::VSphere::Action::GetSshInfo.any_instance.should_receive(:call)
112
+
113
+ run_get_ssh_info
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantPlugins::VSphere::Action::Clone do
4
+ before :each do
5
+ @env[:vSphere_connection] = @vim
6
+ end
7
+
8
+ it 'should create a CloneVM task' do
9
+ call
10
+ @template.should have_received(:CloneVM_Task).with({
11
+ :folder => @data_center,
12
+ :name => NAME,
13
+ :spec => {}
14
+ })
15
+ end
16
+
17
+ it 'should set the machine id to be the new UUID' do
18
+ call
19
+ @machine.should have_received(:id=).with(NEW_UUID)
20
+ end
21
+
22
+ it 'should call the next item in the middleware stack' do
23
+ call
24
+ @app.should have_received :call
25
+ end
26
+
27
+ it 'should set static IP when given config spec' do
28
+ @machine.provider_config.stub(:customization_spec_name).and_return('spec')
29
+ call
30
+ @ip.should have_received(:ipAddress=).with('0.0.0.0')
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantPlugins::VSphere::Action::ConnectVSphere do
4
+ before :each do
5
+ described_class.new(@app, @env).call(@env)
6
+ end
7
+
8
+ it 'should connect to vSphere' do
9
+ VIM.should have_received(:connect).with({
10
+ :host => @env[:machine].provider_config.host,
11
+ :user => @env[:machine].provider_config.user,
12
+ :password => @env[:machine].provider_config.password,
13
+ :insecure => @env[:machine].provider_config.insecure,
14
+ })
15
+ end
16
+
17
+ it 'should add the vSphere connection to the environment' do
18
+ @env[:vSphere_connection].should be @vim
19
+ end
20
+
21
+ it 'should call the next item in the middleware stack' do
22
+ @app.should have_received :call
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantPlugins::VSphere::Action::Destroy do
4
+ before :each do
5
+ @env[:vSphere_connection] = @vim
6
+ end
7
+
8
+ it 'should set the machine id to nil' do
9
+ @env[:machine].stub(:id).and_return(MISSING_UUID)
10
+
11
+ call
12
+
13
+ @env[:machine].should have_received(:id=).with(nil)
14
+ end
15
+
16
+ it 'should not create a Destroy task if VM is not found' do
17
+ @env[:machine].stub(:id).and_return(MISSING_UUID)
18
+
19
+ call
20
+
21
+ @vm.should_not have_received :Destroy_Task
22
+ end
23
+
24
+ it 'should create a VM Destroy task if the VM exists' do
25
+ @env[:machine].stub(:id).and_return(EXISTING_UUID)
26
+
27
+ call
28
+
29
+ @vm.should have_received :Destroy_Task
30
+ end
31
+ end