fission 0.2.0 → 0.3.0.beta.1
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/CHANGELOG.md +9 -0
- data/README.md +44 -3
- data/fission.gemspec +3 -2
- data/lib/fission.rb +6 -0
- data/lib/fission/cli.rb +12 -6
- data/lib/fission/command/clone.rb +3 -4
- data/lib/fission/command/delete.rb +65 -0
- data/lib/fission/command/snapshot_create.rb +47 -0
- data/lib/fission/command/snapshot_list.rb +42 -0
- data/lib/fission/command/snapshot_revert.rb +47 -0
- data/lib/fission/command/start.rb +22 -4
- data/lib/fission/command/stop.rb +2 -2
- data/lib/fission/command/suspend.rb +29 -13
- data/lib/fission/config.rb +2 -0
- data/lib/fission/fusion.rb +13 -0
- data/lib/fission/metadata.rb +39 -0
- data/lib/fission/version.rb +1 -1
- data/lib/fission/vm.rb +100 -15
- data/spec/fission/cli_spec.rb +91 -11
- data/spec/fission/command/clone_spec.rb +2 -6
- data/spec/fission/command/delete_spec.rb +109 -0
- data/spec/fission/command/snapshot_create_spec.rb +88 -0
- data/spec/fission/command/snapshot_list_spec.rb +61 -0
- data/spec/fission/command/snapshot_revert_spec.rb +90 -0
- data/spec/fission/command/start_spec.rb +35 -6
- data/spec/fission/command/status_spec.rb +2 -2
- data/spec/fission/command/stop_spec.rb +1 -4
- data/spec/fission/command/suspend_spec.rb +27 -6
- data/spec/fission/command_spec.rb +0 -1
- data/spec/fission/config_spec.rb +10 -0
- data/spec/fission/fusion_spec.rb +22 -0
- data/spec/fission/metadata_spec.rb +100 -0
- data/spec/fission/ui_spec.rb +8 -12
- data/spec/fission/vm_spec.rb +268 -44
- data/spec/spec_helper.rb +0 -17
- metadata +40 -11
@@ -1,13 +1,13 @@
|
|
1
1
|
require File.expand_path('../../../spec_helper.rb', __FILE__)
|
2
2
|
|
3
3
|
describe Fission::Command::Status do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@string_io = StringIO.new
|
6
6
|
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
7
7
|
end
|
8
8
|
|
9
9
|
describe 'execute' do
|
10
|
-
before
|
10
|
+
before do
|
11
11
|
Fission::VM.stub!(:all).and_return(['foo', 'bar', 'baz'])
|
12
12
|
Fission::VM.stub!(:all_running).and_return(['foo', 'baz'])
|
13
13
|
end
|
@@ -1,11 +1,8 @@
|
|
1
1
|
require File.expand_path('../../../spec_helper.rb', __FILE__)
|
2
2
|
|
3
3
|
describe Fission::Command::Stop do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@vm_info = ['foo']
|
6
|
-
end
|
7
|
-
|
8
|
-
before :each do
|
9
6
|
@string_io = StringIO.new
|
10
7
|
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
11
8
|
end
|
@@ -1,11 +1,8 @@
|
|
1
1
|
require File.expand_path('../../../spec_helper.rb', __FILE__)
|
2
2
|
|
3
3
|
describe Fission::Command::Suspend do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@vm_info = ['foo']
|
6
|
-
end
|
7
|
-
|
8
|
-
before :each do
|
9
6
|
@string_io = StringIO.new
|
10
7
|
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
11
8
|
end
|
@@ -56,7 +53,31 @@ describe Fission::Command::Suspend do
|
|
56
53
|
command = Fission::Command::Suspend.new @vm_info
|
57
54
|
command.execute
|
58
55
|
|
59
|
-
@string_io.string.should match /
|
56
|
+
@string_io.string.should match /Suspending '#{@vm_info.first}'/
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'with --all' do
|
60
|
+
it 'should suspend all running VMs' do
|
61
|
+
@vm_mock_1 = mock('vm_mock_1')
|
62
|
+
@vm_mock_2 = mock('vm_mock_2')
|
63
|
+
|
64
|
+
vm_items = {'vm_1' => @vm_mock_1,
|
65
|
+
'vm_2' => @vm_mock_2
|
66
|
+
}
|
67
|
+
|
68
|
+
Fission::VM.should_receive(:all_running).and_return(vm_items.keys)
|
69
|
+
|
70
|
+
vm_items.each_pair do |name, mock|
|
71
|
+
Fission::VM.should_receive(:new).with(name).and_return(mock)
|
72
|
+
mock.should_receive(:suspend)
|
73
|
+
end
|
74
|
+
|
75
|
+
command = Fission::Command::Suspend.new ['--all']
|
76
|
+
command.execute
|
77
|
+
|
78
|
+
@string_io.string.should match /Suspending 'vm_1'/
|
79
|
+
@string_io.string.should match /Suspending 'vm_2'/
|
80
|
+
end
|
60
81
|
end
|
61
82
|
|
62
83
|
end
|
@@ -65,7 +86,7 @@ describe Fission::Command::Suspend do
|
|
65
86
|
it 'should output info for this command' do
|
66
87
|
output = Fission::Command::Suspend.help
|
67
88
|
|
68
|
-
output.should match /suspend vm/
|
89
|
+
output.should match /suspend \[vm \| --all\]/
|
69
90
|
end
|
70
91
|
end
|
71
92
|
end
|
data/spec/fission/config_spec.rb
CHANGED
@@ -16,6 +16,16 @@ describe Fission::Config do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'should use the fusion default for plist_file' do
|
20
|
+
@config = Fission::Config.new
|
21
|
+
@config.attributes['plist_file'].should == File.expand_path('~/Library/Preferences/com.vmware.fusion.plist')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should use the fusion default for the gui bin' do
|
25
|
+
@config = Fission::Config.new
|
26
|
+
@config.attributes['gui_bin'].should == File.expand_path('/Applications/VMware Fusion.app/Contents/MacOS/vmware')
|
27
|
+
end
|
28
|
+
|
19
29
|
it "should use the user specified dir in ~/.fissionrc" do
|
20
30
|
FakeFS do
|
21
31
|
File.open('~/.fissionrc', 'w') { |f| f.puts YAML.dump({ 'vm_dir' => '/var/tmp/foo' })}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path('../../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
describe Fission::Fusion do
|
4
|
+
describe 'self.is_running?' do
|
5
|
+
before do
|
6
|
+
@cmd = "ps -ef | grep -v grep | "
|
7
|
+
@cmd << "grep -c #{Fission.config.attributes['gui_bin'].gsub(' ', '\ ')} 2>&1"
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should return true if the fusion app is running' do
|
11
|
+
Fission::Fusion.should_receive(:`).with(@cmd).
|
12
|
+
and_return("1\n")
|
13
|
+
Fission::Fusion.is_running?.should == true
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should return false if the fusion app is not running' do
|
17
|
+
Fission::Fusion.should_receive(:`).with(@cmd).
|
18
|
+
and_return("0\n")
|
19
|
+
Fission::Fusion.is_running?.should == false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.expand_path('../../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
describe Fission::Metadata do
|
4
|
+
before do
|
5
|
+
@plist_mock = mock('plist_mock')
|
6
|
+
@plist_file_path = Fission.config.attributes['plist_file']
|
7
|
+
@metadata = Fission::Metadata.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'load' do
|
11
|
+
it 'should load the existing data' do
|
12
|
+
plist = {'vm_list' => ['1', '2', '3']}
|
13
|
+
CFPropertyList::List.should_receive(:new).
|
14
|
+
with(:file => @plist_file_path).
|
15
|
+
and_return(@plist_mock)
|
16
|
+
@plist_mock.stub!(:value).and_return(plist)
|
17
|
+
CFPropertyList.should_receive(:native_types).with(plist).
|
18
|
+
and_return([1, 2, 3])
|
19
|
+
@metadata.load
|
20
|
+
@metadata.content.should == [1, 2, 3]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'delete_vm_restart_document' do
|
25
|
+
before do
|
26
|
+
@data = { 'PLRestartDocumentPaths' => ['/vm/foo.vmwarevm', '/vm/bar.vmwarevm']}
|
27
|
+
@metadata.content = @data
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should remove the vm item from the list if the vm path is in the list' do
|
31
|
+
@metadata.delete_vm_restart_document(Fission::VM.path('foo'))
|
32
|
+
@metadata.content.should == { 'PLRestartDocumentPaths' => ['/vm/bar.vmwarevm']}
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should not doing anything if the vm is not in the list' do
|
36
|
+
@metadata.delete_vm_restart_document(Fission::VM.path('baz'))
|
37
|
+
@metadata.content.should == @data
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should not do anything if the restart document list does not exist' do
|
41
|
+
other_data = { 'OtherConfigItem' => ['foo', 'bar']}
|
42
|
+
@metadata.content = other_data
|
43
|
+
@metadata.delete_vm_restart_document(Fission::VM.path('foo'))
|
44
|
+
@metadata.content.should == other_data
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'delete_vm_favorite_entry' do
|
49
|
+
before do
|
50
|
+
@data = { 'VMFavoritesListDefaults2' => [{'path' => '/vm/foo.vmwarevm'}] }
|
51
|
+
@metadata.content = @data
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should remove the vm item from the list' do
|
55
|
+
@metadata.delete_vm_favorite_entry(Fission::VM.path('foo'))
|
56
|
+
@metadata.content.should == { 'VMFavoritesListDefaults2' => [] }
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should not do anything if the vm is not in the list' do
|
60
|
+
@metadata.delete_vm_favorite_entry(Fission::VM.path('bar'))
|
61
|
+
@metadata.content.should == @data
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe 'self.delete_vm_info' do
|
66
|
+
before do
|
67
|
+
@md_mock = mock('metadata_mock')
|
68
|
+
@md_mock.should_receive(:load)
|
69
|
+
@md_mock.should_receive(:save)
|
70
|
+
Fission::Metadata.stub!(:new).and_return(@md_mock)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should remove the vm from the restart document list' do
|
74
|
+
@md_mock.should_receive(:delete_vm_restart_document).with('/vm/foo.vmwarevm')
|
75
|
+
@md_mock.stub!(:delete_vm_favorite_entry)
|
76
|
+
Fission::Metadata.delete_vm_info(Fission::VM.path('foo'))
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should remove the vm from the favorite list' do
|
80
|
+
@md_mock.should_receive(:delete_vm_favorite_entry).with('/vm/foo.vmwarevm')
|
81
|
+
@md_mock.stub!(:delete_vm_restart_document)
|
82
|
+
Fission::Metadata.delete_vm_info(Fission::VM.path('foo'))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'save' do
|
87
|
+
it 'should save the data' do
|
88
|
+
CFPropertyList::List.should_receive(:new).and_return(@plist_mock)
|
89
|
+
CFPropertyList.should_receive(:guess).with([1, 2, 3]).
|
90
|
+
and_return(['1', '2', '3'])
|
91
|
+
|
92
|
+
@plist_mock.should_receive(:value=).with(['1', '2', '3'])
|
93
|
+
@plist_mock.should_receive(:save).
|
94
|
+
with(@plist_file_path, CFPropertyList::List::FORMAT_BINARY)
|
95
|
+
|
96
|
+
@metadata.content = [1, 2, 3]
|
97
|
+
@metadata.save
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/spec/fission/ui_spec.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require File.expand_path('../../spec_helper.rb', __FILE__)
|
2
2
|
|
3
3
|
describe Fission::UI do
|
4
|
+
before do
|
5
|
+
@string_io = StringIO.new
|
6
|
+
end
|
7
|
+
|
4
8
|
describe 'output' do
|
5
9
|
it 'should show the desired text' do
|
6
|
-
output
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
output.should == "foo bar\nbaz blah\n"
|
10
|
+
Fission::UI.new(@string_io).output "foo bar\nbaz blah"
|
11
|
+
@string_io.string.should == "foo bar\nbaz blah\n"
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
@@ -22,13 +23,8 @@ describe Fission::UI do
|
|
22
23
|
describe 'output_and_exit' do
|
23
24
|
it 'should show the desired text and exit with the desired exit code' do
|
24
25
|
Fission::UI.any_instance.should_receive(:exit).and_return(1)
|
25
|
-
|
26
|
-
|
27
|
-
Fission::UI.new.output_and_exit "foo bar\nbaz blah", 1
|
28
|
-
end
|
29
|
-
|
30
|
-
output.should == "foo bar\nbaz blah\n"
|
26
|
+
Fission::UI.new(@string_io).output_and_exit "foo bar\nbaz blah", 1
|
27
|
+
@string_io.string.should == "foo bar\nbaz blah\n"
|
31
28
|
end
|
32
|
-
|
33
29
|
end
|
34
30
|
end
|
data/spec/fission/vm_spec.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
require File.expand_path('../../spec_helper.rb', __FILE__)
|
2
2
|
|
3
3
|
describe Fission::VM do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@string_io = StringIO.new
|
6
|
+
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
7
|
+
@vm = Fission::VM.new('foo')
|
8
|
+
@vm.stub!(:conf_file).and_return(File.join(Fission::VM.path('foo'), 'foo.vmx'))
|
9
|
+
@vmrun_cmd = Fission.config.attributes['vmrun_cmd']
|
6
10
|
end
|
7
11
|
|
8
12
|
describe 'new' do
|
@@ -14,36 +18,41 @@ describe Fission::VM do
|
|
14
18
|
describe 'start' do
|
15
19
|
it 'should output that it was successful' do
|
16
20
|
$?.should_receive(:exitstatus).and_return(0)
|
17
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
18
|
-
@vm = Fission::VM.new('foo')
|
19
21
|
@vm.should_receive(:`).
|
20
|
-
with("#{
|
22
|
+
with("#{@vmrun_cmd} start #{@vm.conf_file.gsub(' ', '\ ')} gui 2>&1").
|
21
23
|
and_return("it's all good")
|
22
24
|
@vm.start
|
23
25
|
|
24
26
|
@string_io.string.should match /VM started/
|
25
27
|
end
|
26
28
|
|
27
|
-
it '
|
29
|
+
it 'should start the vm headless' do
|
30
|
+
$?.should_receive(:exitstatus).and_return(0)
|
31
|
+
@vm.should_receive(:`).
|
32
|
+
with("#{@vmrun_cmd} start #{@vm.conf_file.gsub(' ', '\ ')} nogui 2>&1").
|
33
|
+
and_return("it's all good")
|
34
|
+
@vm.start(:headless => true)
|
35
|
+
|
36
|
+
@string_io.string.should match /VM started/
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should output that it was unsuccessful' do
|
28
40
|
$?.should_receive(:exitstatus).and_return(1)
|
29
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
30
|
-
@vm = Fission::VM.new('foo')
|
31
41
|
@vm.should_receive(:`).
|
32
|
-
with("#{
|
42
|
+
with("#{@vmrun_cmd} start #{@vm.conf_file.gsub(' ', '\ ')} gui 2>&1").
|
33
43
|
and_return("it blew up")
|
34
44
|
@vm.start
|
35
45
|
|
36
46
|
@string_io.string.should match /There was a problem starting the VM.+it blew up.+/m
|
37
47
|
end
|
48
|
+
|
38
49
|
end
|
39
50
|
|
40
51
|
describe 'stop' do
|
41
52
|
it 'should output that it was successful' do
|
42
53
|
$?.should_receive(:exitstatus).and_return(0)
|
43
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
44
|
-
@vm = Fission::VM.new('foo')
|
45
54
|
@vm.should_receive(:`).
|
46
|
-
with("#{
|
55
|
+
with("#{@vmrun_cmd} stop #{@vm.conf_file.gsub ' ', '\ '} 2>&1").
|
47
56
|
and_return("it's all good")
|
48
57
|
@vm.stop
|
49
58
|
|
@@ -52,10 +61,8 @@ describe Fission::VM do
|
|
52
61
|
|
53
62
|
it 'it should output that it was unsuccessful' do
|
54
63
|
$?.should_receive(:exitstatus).and_return(1)
|
55
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
56
|
-
@vm = Fission::VM.new('foo')
|
57
64
|
@vm.should_receive(:`).
|
58
|
-
with("#{
|
65
|
+
with("#{@vmrun_cmd} stop #{@vm.conf_file.gsub ' ', '\ '} 2>&1").
|
59
66
|
and_return("it blew up")
|
60
67
|
@vm.stop
|
61
68
|
|
@@ -66,10 +73,8 @@ describe Fission::VM do
|
|
66
73
|
describe 'suspend' do
|
67
74
|
it 'should output that it was successful' do
|
68
75
|
$?.should_receive(:exitstatus).and_return(0)
|
69
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
70
|
-
@vm = Fission::VM.new('foo')
|
71
76
|
@vm.should_receive(:`).
|
72
|
-
with("#{
|
77
|
+
with("#{@vmrun_cmd} suspend #{@vm.conf_file.gsub ' ', '\ '} 2>&1").
|
73
78
|
and_return("it's all good")
|
74
79
|
@vm.suspend
|
75
80
|
|
@@ -78,10 +83,8 @@ describe Fission::VM do
|
|
78
83
|
|
79
84
|
it 'it should output that it was unsuccessful' do
|
80
85
|
$?.should_receive(:exitstatus).and_return(1)
|
81
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
82
|
-
@vm = Fission::VM.new('foo')
|
83
86
|
@vm.should_receive(:`).
|
84
|
-
with("#{
|
87
|
+
with("#{@vmrun_cmd} suspend #{@vm.conf_file.gsub ' ', '\ '} 2>&1").
|
85
88
|
and_return("it blew up")
|
86
89
|
@vm.suspend
|
87
90
|
|
@@ -89,55 +92,203 @@ describe Fission::VM do
|
|
89
92
|
end
|
90
93
|
end
|
91
94
|
|
95
|
+
describe 'snapshots' do
|
96
|
+
it 'should return the list of snapshots' do
|
97
|
+
$?.should_receive(:exitstatus).and_return(0)
|
98
|
+
@vm.should_receive(:`).
|
99
|
+
with("#{@vmrun_cmd} listSnapshots #{@vm.conf_file.gsub ' ', '\ '} 2>&1").
|
100
|
+
and_return("Total snapshots: 3\nsnap foo\nsnap bar\nsnap baz\n")
|
101
|
+
@vm.snapshots.should == ['snap foo', 'snap bar', 'snap baz']
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should print an error and exit if there was a problem getting the list of snapshots' do
|
105
|
+
$?.should_receive(:exitstatus).and_return(1)
|
106
|
+
@vm.should_receive(:`).
|
107
|
+
with("#{@vmrun_cmd} listSnapshots #{@vm.conf_file.gsub ' ', '\ '} 2>&1").
|
108
|
+
and_return("it blew up\n")
|
109
|
+
lambda { @vm.snapshots }.should raise_error SystemExit
|
110
|
+
@string_io.string.should match /error getting the list of snapshots/
|
111
|
+
@string_io.string.should match /error was.+it blew up/m
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe 'create_snapshot' do
|
116
|
+
it 'should create a snapshot' do
|
117
|
+
$?.should_receive(:exitstatus).and_return(0)
|
118
|
+
@vm.should_receive(:`).
|
119
|
+
with("#{@vmrun_cmd} snapshot #{@vm.conf_file.gsub ' ', '\ '} \"bar\" 2>&1").
|
120
|
+
and_return("")
|
121
|
+
@vm.create_snapshot('bar')
|
122
|
+
@string_io.string.should match /Snapshot 'bar' created/
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should print an error and exit if there was a problem creating the snapshot' do
|
126
|
+
$?.should_receive(:exitstatus).and_return(1)
|
127
|
+
@vm.should_receive(:`).
|
128
|
+
with("#{@vmrun_cmd} snapshot #{@vm.conf_file.gsub ' ', '\ '} \"bar\" 2>&1").
|
129
|
+
and_return("it blew up")
|
130
|
+
lambda { @vm.create_snapshot('bar') }.should raise_error SystemExit
|
131
|
+
@string_io.string.should match /error creating the snapshot/
|
132
|
+
@string_io.string.should match /error was.+it blew up/m
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'revert_to_snapshot' do
|
137
|
+
it 'should revert to the provided snapshot' do
|
138
|
+
$?.should_receive(:exitstatus).and_return(0)
|
139
|
+
@vm.should_receive(:`).
|
140
|
+
with("#{@vmrun_cmd} revertToSnapshot #{@vm.conf_file.gsub ' ', '\ '} \"bar\" 2>&1").
|
141
|
+
and_return("")
|
142
|
+
@vm.revert_to_snapshot('bar')
|
143
|
+
@string_io.string.should match /Reverted to snapshot 'bar'/
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should print an error and exit if the snapshot doesn't exist" do
|
147
|
+
$?.should_receive(:exitstatus).and_return(1)
|
148
|
+
@vm.should_receive(:`).
|
149
|
+
with("#{@vmrun_cmd} revertToSnapshot #{@vm.conf_file.gsub ' ', '\ '} \"bar\" 2>&1").
|
150
|
+
and_return("it blew up")
|
151
|
+
lambda { @vm.revert_to_snapshot('bar') }.should raise_error SystemExit
|
152
|
+
@string_io.string.should match /error reverting to the snapshot/
|
153
|
+
@string_io.string.should match /error was.+it blew up/m
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
92
157
|
describe 'conf_file' do
|
158
|
+
before do
|
159
|
+
FakeFS.activate!
|
160
|
+
@vm_root_dir = Fission::VM.path('foo')
|
161
|
+
FileUtils.mkdir_p(@vm_root_dir)
|
162
|
+
end
|
163
|
+
|
164
|
+
after do
|
165
|
+
FakeFS.deactivate!
|
166
|
+
FakeFS::FileSystem.clear
|
167
|
+
end
|
168
|
+
|
93
169
|
it 'should return the path to the conf file' do
|
94
|
-
|
170
|
+
file_path = File.join(@vm_root_dir, 'foo.vmx')
|
171
|
+
FileUtils.touch(file_path)
|
172
|
+
Fission::VM.new('foo').conf_file.should == file_path
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should output an error and exit if no vmx file was found' do
|
176
|
+
lambda {
|
177
|
+
FileUtils.mkdir_p(@vm_root_dir)
|
178
|
+
Fission::VM.new('foo').conf_file
|
179
|
+
}.should raise_error SystemExit
|
180
|
+
|
181
|
+
@string_io.string.should match /Unable to find a config file for VM 'foo' \(in '#{File.join(@vm_root_dir, '\*\.vmx')}'\)/m
|
182
|
+
end
|
183
|
+
|
184
|
+
describe 'when the VM name and conf file name do not match' do
|
185
|
+
it 'should return the path to the conf file' do
|
186
|
+
file_path = File.join(@vm_root_dir, 'bar.vmx')
|
187
|
+
FileUtils.touch(file_path)
|
188
|
+
Fission::VM.new('foo').conf_file.should == file_path
|
189
|
+
end
|
95
190
|
end
|
191
|
+
|
192
|
+
describe 'if multiple vmx files are found' do
|
193
|
+
before do
|
194
|
+
FileUtils.mkdir_p(@vm_root_dir)
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'should use the conf file which matches the VM name if it exists' do
|
198
|
+
['foo.vmx', 'bar.vmx'].each do |file|
|
199
|
+
FileUtils.touch(File.join(@vm_root_dir, file))
|
200
|
+
end
|
201
|
+
Fission::VM.new('foo').conf_file.should == File.join(@vm_root_dir, 'foo.vmx')
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'should output an error and exit' do
|
205
|
+
lambda {
|
206
|
+
['bar.vmx', 'baz.vmx'].each do |file|
|
207
|
+
FileUtils.touch(File.join(@vm_root_dir, file))
|
208
|
+
end
|
209
|
+
Fission::VM.new('foo').conf_file
|
210
|
+
}.should raise_error SystemExit
|
211
|
+
|
212
|
+
@string_io.string.should match /Multiple config files found for VM 'foo' \('bar\.vmx', 'baz\.vmx' in '#{@vm_root_dir}'/m
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
96
216
|
end
|
97
217
|
|
98
218
|
describe "self.all" do
|
99
219
|
it "should return the list of VMs" do
|
100
220
|
vm_root = Fission.config.attributes['vm_dir']
|
101
|
-
Dir.should_receive(:[]).
|
221
|
+
Dir.should_receive(:[]).
|
222
|
+
and_return(["#{File.join vm_root, 'foo.vmwarevm' }", "#{File.join vm_root, 'bar.vmwarevm' }"])
|
102
223
|
|
103
224
|
vm_root = Fission.config.attributes['vm_dir']
|
104
|
-
File.should_receive(:directory?).with("#{File.join vm_root, 'foo.vmwarevm'}").
|
105
|
-
|
225
|
+
File.should_receive(:directory?).with("#{File.join vm_root, 'foo.vmwarevm'}").
|
226
|
+
and_return(true)
|
227
|
+
File.should_receive(:directory?).with("#{File.join vm_root, 'bar.vmwarevm'}").
|
228
|
+
and_return(true)
|
106
229
|
Fission::VM.all.should == ['foo', 'bar']
|
107
230
|
end
|
108
231
|
|
109
232
|
it "should not return an item in the list if it isn't a directory" do
|
110
233
|
vm_root = Fission.config.attributes['vm_dir']
|
111
|
-
Dir.should_receive(:[]).
|
112
|
-
|
113
|
-
File.should_receive(:directory?).
|
114
|
-
|
234
|
+
Dir.should_receive(:[]).
|
235
|
+
and_return((['foo', 'bar', 'baz'].map { |i| File.join vm_root, "#{i}.vmwarevm"}))
|
236
|
+
File.should_receive(:directory?).
|
237
|
+
with("#{File.join vm_root, 'foo.vmwarevm'}").and_return(true)
|
238
|
+
File.should_receive(:directory?).
|
239
|
+
with("#{File.join vm_root, 'bar.vmwarevm'}").and_return(true)
|
240
|
+
File.should_receive(:directory?).
|
241
|
+
with("#{File.join vm_root, 'baz.vmwarevm'}").and_return(false)
|
115
242
|
Fission::VM.all.should == ['foo', 'bar']
|
116
243
|
end
|
117
244
|
|
118
245
|
it "should only query for items with an extension of .vmwarevm" do
|
119
246
|
dir_arg = File.join Fission.config.attributes['vm_dir'], '*.vmwarevm'
|
120
|
-
Dir.should_receive(:[]).with(dir_arg).
|
247
|
+
Dir.should_receive(:[]).with(dir_arg).
|
248
|
+
and_return(['foo.vmwarevm', 'bar.vmwarevm'])
|
121
249
|
Fission::VM.all
|
122
250
|
end
|
123
251
|
end
|
124
252
|
|
125
253
|
describe 'self.all_running' do
|
126
254
|
it 'should list the running vms' do
|
127
|
-
list_output = "Total running VMs: 2\n/vm/foo.vmwarevm/foo.vmx\n
|
255
|
+
list_output = "Total running VMs: 2\n/vm/foo.vmwarevm/foo.vmx\n"
|
256
|
+
list_output << "/vm/bar.vmwarevm/bar.vmx\n/vm/baz.vmwarevm/baz.vmx\n"
|
128
257
|
|
129
258
|
$?.should_receive(:exitstatus).and_return(0)
|
130
|
-
Fission::VM.should_receive(:`).
|
259
|
+
Fission::VM.should_receive(:`).
|
260
|
+
with("#{@vmrun_cmd} list").
|
261
|
+
and_return(list_output)
|
131
262
|
[ 'foo', 'bar', 'baz'].each do |vm|
|
132
|
-
File.should_receive(:exists?).with("/vm/#{vm}.vmwarevm/#{vm}.vmx").
|
263
|
+
File.should_receive(:exists?).with("/vm/#{vm}.vmwarevm/#{vm}.vmx").
|
264
|
+
and_return(true)
|
133
265
|
end
|
134
266
|
|
135
267
|
Fission::VM.all_running.should == ['foo', 'bar', 'baz']
|
136
268
|
end
|
137
269
|
|
270
|
+
it 'should output the VM dir name if it differs from the .vmx file name' do
|
271
|
+
vm_dir_file = { 'foo' => 'foo', 'bar' => 'diff', 'baz' => 'baz'}
|
272
|
+
list_output = "Total running VMs: 3\n"
|
273
|
+
vm_dir_file.each_pair do |dir, file|
|
274
|
+
list_output << "/vm/#{dir}.vmwarevm/#{file}.vmx\n"
|
275
|
+
File.should_receive(:exists?).with("/vm/#{dir}.vmwarevm/#{file}.vmx").
|
276
|
+
and_return(true)
|
277
|
+
end
|
278
|
+
|
279
|
+
$?.should_receive(:exitstatus).and_return(0)
|
280
|
+
Fission::VM.should_receive(:`).
|
281
|
+
with("#{@vmrun_cmd} list").
|
282
|
+
and_return(list_output)
|
283
|
+
|
284
|
+
Fission::VM.all_running.should == ['foo', 'bar', 'baz']
|
285
|
+
end
|
286
|
+
|
138
287
|
it 'should output an error and exit if unable to get the list of running vms' do
|
139
288
|
$?.should_receive(:exitstatus).and_return(1)
|
140
|
-
Fission::VM.should_receive(:`).
|
289
|
+
Fission::VM.should_receive(:`).
|
290
|
+
with("#{@vmrun_cmd} list").
|
291
|
+
and_return("it blew up")
|
141
292
|
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
142
293
|
|
143
294
|
lambda {
|
@@ -172,8 +323,7 @@ describe Fission::VM do
|
|
172
323
|
end
|
173
324
|
|
174
325
|
describe "self.clone" do
|
175
|
-
before
|
176
|
-
Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
|
326
|
+
before do
|
177
327
|
@source_vm = 'foo'
|
178
328
|
@target_vm = 'bar'
|
179
329
|
@vm_files = ['.vmx', '.vmxf', '.vmdk', '-s001.vmdk', '-s002.vmdk', '.vmsd']
|
@@ -191,16 +341,35 @@ describe Fission::VM do
|
|
191
341
|
end
|
192
342
|
|
193
343
|
['.vmx', '.vmxf'].each do |ext|
|
194
|
-
File.should_receive(:binary?).
|
344
|
+
File.should_receive(:binary?).
|
345
|
+
with(File.join(Fission::VM.path('bar'), "bar#{ext}")).
|
346
|
+
and_return(false)
|
195
347
|
end
|
196
348
|
end
|
197
349
|
|
198
|
-
after
|
350
|
+
after do
|
199
351
|
FakeFS.deactivate!
|
352
|
+
FakeFS::FileSystem.clear
|
200
353
|
end
|
201
354
|
|
202
355
|
it 'should copy the vm files to the target' do
|
203
|
-
File.should_receive(:binary?).
|
356
|
+
File.should_receive(:binary?).
|
357
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).
|
358
|
+
and_return(true)
|
359
|
+
Fission::VM.clone @source_vm, @target_vm
|
360
|
+
|
361
|
+
File.directory?(Fission::VM.path('bar')).should == true
|
362
|
+
|
363
|
+
@vm_files.each do |file|
|
364
|
+
File.file?(File.join(Fission::VM.path('bar'), "#{@target_vm}#{file}")).should == true
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
it "should copy the vm files to the target if a file name doesn't match the directory" do
|
369
|
+
FileUtils.touch File.join(Fission::VM.path('foo'), 'other_name.nvram')
|
370
|
+
File.should_receive(:binary?).
|
371
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).
|
372
|
+
and_return(true)
|
204
373
|
Fission::VM.clone @source_vm, @target_vm
|
205
374
|
|
206
375
|
File.directory?(Fission::VM.path('bar')).should == true
|
@@ -208,10 +377,31 @@ describe Fission::VM do
|
|
208
377
|
@vm_files.each do |file|
|
209
378
|
File.file?(File.join(Fission::VM.path('bar'), "#{@target_vm}#{file}")).should == true
|
210
379
|
end
|
380
|
+
|
381
|
+
File.file?(File.join(Fission::VM.path('bar'), "bar.nvram")).should == true
|
382
|
+
end
|
383
|
+
|
384
|
+
|
385
|
+
it "should copy the vm files to the target if a sparse disk file name doesn't match the directory" do
|
386
|
+
FileUtils.touch File.join(Fission::VM.path('foo'), 'other_name-s003.vmdk')
|
387
|
+
File.should_receive(:binary?).
|
388
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).
|
389
|
+
and_return(true)
|
390
|
+
Fission::VM.clone @source_vm, @target_vm
|
391
|
+
|
392
|
+
File.directory?(Fission::VM.path('bar')).should == true
|
393
|
+
|
394
|
+
@vm_files.each do |file|
|
395
|
+
File.file?(File.join(Fission::VM.path('bar'), "#{@target_vm}#{file}")).should == true
|
396
|
+
end
|
397
|
+
|
398
|
+
File.file?(File.join(Fission::VM.path('bar'), "bar-s003.vmdk")).should == true
|
211
399
|
end
|
212
400
|
|
213
401
|
it 'should update the target vm config files' do
|
214
|
-
File.should_receive(:binary?).
|
402
|
+
File.should_receive(:binary?).
|
403
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).
|
404
|
+
and_return(true)
|
215
405
|
Fission::VM.clone @source_vm, @target_vm
|
216
406
|
|
217
407
|
['.vmx', '.vmxf'].each do |ext|
|
@@ -221,27 +411,61 @@ describe Fission::VM do
|
|
221
411
|
end
|
222
412
|
|
223
413
|
it "should not try to update the vmdk file if it's not a sparse disk" do
|
224
|
-
File.should_receive(:binary?).
|
414
|
+
File.should_receive(:binary?).
|
415
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).and_return(true)
|
225
416
|
Fission::VM.clone @source_vm, @target_vm
|
226
417
|
|
227
418
|
File.read(File.join(Fission::VM.path('bar'), 'bar.vmdk')).should match /foo/
|
228
419
|
end
|
229
420
|
|
230
421
|
it "should update the vmdk when a sparse disk is found" do
|
231
|
-
File.should_receive(:binary?).
|
422
|
+
File.should_receive(:binary?).
|
423
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).and_return(false)
|
232
424
|
Fission::VM.clone @source_vm, @target_vm
|
233
425
|
|
234
426
|
File.read(File.join(Fission::VM.path('bar'), 'bar.vmdk')).should match /bar/
|
235
427
|
end
|
236
428
|
|
237
429
|
it 'should output that the clone was successful' do
|
238
|
-
File.should_receive(:binary?).
|
430
|
+
File.should_receive(:binary?).
|
431
|
+
with(File.join(Fission::VM.path('bar'), "bar.vmdk")).and_return(true)
|
239
432
|
Fission::VM.clone @source_vm, @target_vm
|
240
433
|
|
241
434
|
@string_io.string.should match /Cloning #{@source_vm} to #{@target_vm}/
|
242
|
-
|
435
|
+
@string_io.string.should match /Configuring #{@target_vm}/
|
243
436
|
end
|
244
|
-
|
245
437
|
end
|
246
438
|
|
439
|
+
describe "self.delete" do
|
440
|
+
before do
|
441
|
+
@target_vm = 'foo'
|
442
|
+
@vm_files = %w{ .vmx .vmxf .vmdk -s001.vmdk -s002.vmdk .vmsd }
|
443
|
+
FakeFS.activate!
|
444
|
+
|
445
|
+
FileUtils.mkdir_p Fission::VM.path(@target_vm)
|
446
|
+
|
447
|
+
@vm_files.each do |file|
|
448
|
+
FileUtils.touch File.join(Fission::VM.path(@target_vm), "#{@target_vm}#{file}")
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
after do
|
453
|
+
FakeFS.deactivate!
|
454
|
+
end
|
455
|
+
|
456
|
+
it "should delete the target vm files" do
|
457
|
+
Fission::Metadata.stub!(:delete_vm_info)
|
458
|
+
Fission::VM.delete @target_vm
|
459
|
+
@vm_files.each do |file|
|
460
|
+
File.exists?(File.join(Fission::VM.path(@target_vm), "#{@target_vm}#{file}")).should == false
|
461
|
+
end
|
462
|
+
@string_io.string.should match /Deleting vm #{@target_vm}/
|
463
|
+
end
|
464
|
+
|
465
|
+
it 'should delete the target vm metadata' do
|
466
|
+
Fission::Metadata.should_receive(:delete_vm_info)
|
467
|
+
Fission::VM.delete @target_vm
|
468
|
+
end
|
469
|
+
|
470
|
+
end
|
247
471
|
end
|