fission 0.4.0 → 0.5.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.ruby-gemset +1 -0
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +7 -0
  4. data/CHANGELOG.md +12 -3
  5. data/README.md +45 -19
  6. data/bin/fission +1 -1
  7. data/fission.gemspec +3 -2
  8. data/lib/fission.rb +15 -0
  9. data/lib/fission/action/shell_executor.rb +37 -0
  10. data/lib/fission/action/snapshot/creator.rb +81 -0
  11. data/lib/fission/action/snapshot/deleter.rb +85 -0
  12. data/lib/fission/action/snapshot/lister.rb +90 -0
  13. data/lib/fission/action/snapshot/reverter.rb +81 -0
  14. data/lib/fission/action/vm/cloner.rb +191 -0
  15. data/lib/fission/action/vm/deleter.rb +73 -0
  16. data/lib/fission/action/vm/lister.rb +138 -0
  17. data/lib/fission/action/vm/starter.rb +88 -0
  18. data/lib/fission/action/vm/stopper.rb +79 -0
  19. data/lib/fission/action/vm/suspender.rb +68 -0
  20. data/lib/fission/cli.rb +21 -117
  21. data/lib/fission/command.rb +39 -0
  22. data/lib/fission/command/clone.rb +11 -6
  23. data/lib/fission/command/delete.rb +11 -6
  24. data/lib/fission/command/info.rb +62 -0
  25. data/lib/fission/command/snapshot_create.rb +9 -3
  26. data/lib/fission/command/snapshot_delete.rb +38 -0
  27. data/lib/fission/command/snapshot_list.rb +9 -3
  28. data/lib/fission/command/snapshot_revert.rb +9 -3
  29. data/lib/fission/command/start.rb +11 -6
  30. data/lib/fission/command/status.rb +9 -1
  31. data/lib/fission/command/stop.rb +9 -3
  32. data/lib/fission/command/suspend.rb +11 -6
  33. data/lib/fission/command_helpers.rb +18 -4
  34. data/lib/fission/command_line_parser.rb +189 -0
  35. data/lib/fission/config.rb +1 -1
  36. data/lib/fission/fusion.rb +3 -4
  37. data/lib/fission/lease.rb +2 -1
  38. data/lib/fission/metadata.rb +6 -1
  39. data/lib/fission/response.rb +17 -9
  40. data/lib/fission/version.rb +1 -1
  41. data/lib/fission/vm.rb +142 -382
  42. data/lib/fission/vm_configuration.rb +79 -0
  43. data/spec/fission/action/execute_shell_command_spec.rb +25 -0
  44. data/spec/fission/action/snapshot/creator_spec.rb +77 -0
  45. data/spec/fission/action/snapshot/deleter_spec.rb +84 -0
  46. data/spec/fission/action/snapshot/lister_spec.rb +67 -0
  47. data/spec/fission/action/snapshot/reverter_spec.rb +76 -0
  48. data/spec/fission/action/vm/cloner_spec.rb +198 -0
  49. data/spec/fission/action/vm/deleter_spec.rb +79 -0
  50. data/spec/fission/action/vm/lister_spec.rb +164 -0
  51. data/spec/fission/action/vm/starter_spec.rb +88 -0
  52. data/spec/fission/action/vm/stopper_spec.rb +71 -0
  53. data/spec/fission/action/vm/suspender_spec.rb +59 -0
  54. data/spec/fission/cli_spec.rb +32 -157
  55. data/spec/fission/command/clone_spec.rb +9 -3
  56. data/spec/fission/command/delete_spec.rb +11 -3
  57. data/spec/fission/command/info_spec.rb +130 -0
  58. data/spec/fission/command/snapshot_create_spec.rb +11 -3
  59. data/spec/fission/command/snapshot_delete_spec.rb +74 -0
  60. data/spec/fission/command/snapshot_list_spec.rb +11 -3
  61. data/spec/fission/command/snapshot_revert_spec.rb +11 -3
  62. data/spec/fission/command/start_spec.rb +11 -3
  63. data/spec/fission/command/status_spec.rb +16 -5
  64. data/spec/fission/command/stop_spec.rb +11 -3
  65. data/spec/fission/command/suspend_spec.rb +11 -3
  66. data/spec/fission/command_helpers_spec.rb +27 -5
  67. data/spec/fission/command_line_parser_spec.rb +267 -0
  68. data/spec/fission/command_spec.rb +16 -1
  69. data/spec/fission/config_spec.rb +3 -3
  70. data/spec/fission/fusion_spec.rb +11 -6
  71. data/spec/fission/lease_spec.rb +81 -45
  72. data/spec/fission/metadata_spec.rb +29 -6
  73. data/spec/fission/response_spec.rb +20 -9
  74. data/spec/fission/ui_spec.rb +1 -1
  75. data/spec/fission/vm_configuration_spec.rb +132 -0
  76. data/spec/fission/vm_spec.rb +393 -750
  77. data/spec/helpers/command_helpers.rb +1 -1
  78. metadata +93 -15
  79. data/.rvmrc +0 -1
@@ -1,175 +1,50 @@
1
- require File.expand_path('../../spec_helper.rb', __FILE__)
1
+ require 'spec_helper'
2
2
 
3
3
  describe Fission::CLI do
4
4
  before do
5
5
  @string_io = StringIO.new
6
- Fission::CLI.stub!(:ui).and_return(Fission::UI.new(@string_io))
6
+ Fission::CLI.any_instance.stub(:ui).and_return(Fission::UI.new(@string_io))
7
+ @parser = mock 'parser'
8
+ @parser.stub :parse
9
+ @parser.stub :command
7
10
  end
8
11
 
9
- describe 'self.commands' do
10
- it 'should return the list of commands' do
11
- Fission::CLI.commands.should == ['clone', 'delete', 'snapshot create',
12
- 'snapshot list', 'snapshot revert',
13
- 'start', 'status', 'stop', 'suspend']
14
- end
15
- end
16
-
17
- describe 'execute' do
18
- describe 'with no arguments' do
19
- it 'should output the usage info' do
20
- lambda { Fission::CLI.execute [] }.should raise_error SystemExit
12
+ describe 'initialize' do
13
+ it 'should create a parse object using ARGV' do
14
+ Fission::CommandLineParser.should_receive(:new).with(ARGV).
15
+ and_return(@parser)
21
16
 
22
- @string_io.string.should match /Usage/
23
- end
17
+ Fission::CLI.new
24
18
  end
25
19
 
26
- describe '-v or --version' do
27
- ['-v', '--version'].each do |arg|
28
- it "should output the version with #{arg}" do
29
- lambda { Fission::CLI.execute [arg] }.should raise_error SystemExit
30
-
31
- @string_io.string.should match /#{Fission::VERSION}/
32
- end
33
- end
34
- end
20
+ it 'should create a parse object with the provided args' do
21
+ Fission::CommandLineParser.should_receive(:new).with(['foo']).
22
+ and_return(@parser)
35
23
 
36
- describe '-h or --help' do
37
- ['-h', '--help'].each do |arg|
38
- it "should output the usage info with #{arg}" do
39
- lambda { Fission::CLI.execute [arg] }.should raise_error SystemExit
24
+ Fission::CLI.new ['foo']
40
25
 
41
- @string_io.string.should match /Usage/
42
- end
43
- end
44
26
  end
45
27
 
46
- describe 'with the sub command' do
47
- before do
48
- @cmd_mock = mock('cmd')
49
- @cmd_mock.should_receive(:execute)
50
- end
51
-
52
- describe 'clone' do
53
- it "should try to clone the vm" do
54
- Fission::Command::Clone.stub!(:help).and_return('')
55
- Fission::Command::Clone.should_receive(:new).with(['foo', 'bar']).
56
- and_return(@cmd_mock)
57
- Fission::CLI.execute ['clone', 'foo', 'bar']
58
- end
59
-
60
- it 'should try to clone the vm and start it' do
61
- Fission::Command::Clone.stub!(:help).and_return('')
62
- Fission::Command::Clone.should_receive(:new).with(['foo', 'bar', '--start']).
63
- and_return(@cmd_mock)
64
- Fission::CLI.execute ['clone', 'foo', 'bar', '--start']
65
- end
66
- end
67
-
68
- describe 'snapshot create' do
69
- it "should create a snapshot" do
70
- Fission::Command::SnapshotCreate.stub!(:help).and_return('')
71
- Fission::Command::SnapshotCreate.should_receive(:new).
72
- with(['foo', 'snap1']).
73
- and_return(@cmd_mock)
74
- Fission::CLI.execute ['snapshot', 'create', 'foo', 'snap1']
75
- end
76
- end
77
-
78
- describe 'snapshot list' do
79
- it "should list the snapshots" do
80
- Fission::Command::SnapshotList.stub!(:help).and_return('')
81
- Fission::Command::SnapshotList.should_receive(:new).
82
- with([]).
83
- and_return(@cmd_mock)
84
- Fission::CLI.execute ['snapshot', 'list']
85
- end
86
- end
87
-
88
- describe 'snapshot revert' do
89
- it "should revert to the snapshots" do
90
- Fission::Command::SnapshotRevert.stub!(:help).and_return('')
91
- Fission::Command::SnapshotRevert.should_receive(:new).
92
- with(['foo', 'snap1']).
93
- and_return(@cmd_mock)
94
- Fission::CLI.execute ['snapshot', 'revert', 'foo', 'snap1']
95
- end
96
- end
97
-
98
- describe 'start' do
99
- it "should try to start the vm" do
100
- Fission::Command::Start.stub!(:help).and_return('')
101
- Fission::Command::Start.should_receive(:new).
102
- with(['foo']).
103
- and_return(@cmd_mock)
104
- Fission::CLI.execute ['start', 'foo']
105
- end
106
-
107
- it 'should try to start the vm headless' do
108
- Fission::Command::Start.stub!(:help).and_return('')
109
- Fission::Command::Start.should_receive(:new).
110
- with(['foo', '--headless']).
111
- and_return(@cmd_mock)
112
- Fission::CLI.execute ['start', 'foo', '--headless']
113
-
114
- end
115
- end
116
-
117
- describe 'status' do
118
- it "should try to get the status for all VMs" do
119
- Fission::Command::Status.stub!(:help).and_return('')
120
- Fission::Command::Status.should_receive(:new).
121
- with([]).
122
- and_return(@cmd_mock)
123
- Fission::CLI.execute ['status']
124
- end
125
- end
126
-
127
- describe 'stop' do
128
- it "should try to stop the vm" do
129
- Fission::Command::Stop.stub!(:help).and_return('')
130
- Fission::Command::Stop.should_receive(:new).
131
- with(['foo']).
132
- and_return(@cmd_mock)
133
- Fission::CLI.execute ['stop', 'foo']
134
- end
135
- end
136
-
137
- describe 'suspend' do
138
- it "should try to suspend the vm" do
139
- Fission::Command::Suspend.stub!(:help).and_return('')
140
- Fission::Command::Suspend.should_receive(:new).
141
- with(['foo']).
142
- and_return(@cmd_mock)
143
- Fission::CLI.execute ['suspend', 'foo']
144
- end
145
-
146
- it 'should try to suspend all of vms' do
147
- Fission::Command::Suspend.stub!(:help).and_return('')
148
- Fission::Command::Suspend.should_receive(:new).
149
- with(['--all']).
150
- and_return(@cmd_mock)
151
- Fission::CLI.execute ['suspend', '--all']
152
- end
153
- end
154
-
155
- describe 'delete' do
156
- it "should try to delete the vm" do
157
- Fission::Command::Delete.stub!(:help).and_return('')
158
- Fission::Command::Delete.should_receive(:new).
159
- with(['foo']).
160
- and_return(@cmd_mock)
161
- Fission::CLI.execute ['delete', 'foo']
162
- end
28
+ it 'should create a parse object using our parser' do
29
+ @parser.should_receive(:new).with(ARGV).and_return(@parser)
30
+ Fission::CLI.new nil, @parser
31
+ end
163
32
 
164
- it 'should try to force delete the vm' do
165
- Fission::Command::Delete.stub!(:help).and_return('')
166
- Fission::Command::Delete.should_receive(:new).
167
- with(['foo', '--force']).
168
- and_return(@cmd_mock)
169
- Fission::CLI.execute ['delete', 'foo', '--force']
170
- end
171
- end
33
+ it 'should parse the arguments using the parser' do
34
+ @parser.should_receive(:new).with(ARGV).and_return(@parser)
35
+ @parser.should_receive :parse
36
+ Fission::CLI.new nil, @parser
172
37
  end
38
+ end
173
39
 
40
+ describe 'execute' do
41
+ it 'should execute the parsed command' do
42
+ @cmd_mock = mock ('cmd')
43
+ @cmd_mock.should_receive :execute
44
+ @parser.stub(:new).and_return(@parser)
45
+ @parser.stub(:command).and_return(@cmd_mock)
46
+ Fission::CLI.new(nil, @parser).execute
47
+ end
174
48
  end
49
+
175
50
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path('../../../spec_helper.rb', __FILE__)
1
+ require 'spec_helper'
2
2
 
3
3
  describe Fission::Command::Clone do
4
4
  include_context 'command_setup'
@@ -20,10 +20,16 @@ describe Fission::Command::Clone do
20
20
  and_return(@clone_response_mock)
21
21
  end
22
22
 
23
+ describe 'command_name' do
24
+ it 'should return the pretty command name' do
25
+ Fission::Command::Clone.new.command_name.should == 'clone'
26
+ end
27
+ end
28
+
23
29
  describe 'execute' do
24
30
  subject { Fission::Command::Clone }
25
31
 
26
- [ [], ['foo'] ].each do |args|
32
+ [ [], ['foo'], ['--bar'] ].each do |args|
27
33
  it_should_not_accept_arguments_of args, 'clone'
28
34
  end
29
35
 
@@ -80,7 +86,7 @@ describe Fission::Command::Clone do
80
86
  it 'should output info for this command' do
81
87
  output = Fission::Command::Clone.help
82
88
 
83
- output.should match /clone source_vm target_vm.+--start/m
89
+ output.should match /fission clone SOURCE_VM TARGET_VM.+OPTIONS/m
84
90
  end
85
91
  end
86
92
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path('../../../spec_helper.rb', __FILE__)
1
+ require 'spec_helper'
2
2
 
3
3
  describe Fission::Command::Delete do
4
4
  include_context 'command_setup'
@@ -16,10 +16,18 @@ describe Fission::Command::Delete do
16
16
  Fission::Fusion.stub(:running?).and_return(false)
17
17
  end
18
18
 
19
+ describe 'command_name' do
20
+ it 'should return the pretty command name' do
21
+ Fission::Command::Delete.new.command_name.should == 'delete'
22
+ end
23
+ end
24
+
19
25
  describe "execute" do
20
26
  subject { Fission::Command::Delete }
21
27
 
22
- it_should_not_accept_arguments_of [], 'delete'
28
+ [ [], ['--bar'] ].each do |args|
29
+ it_should_not_accept_arguments_of args, 'delete'
30
+ end
23
31
 
24
32
  it "should try to delete the vm" do
25
33
  @delete_response_mock.stub_as_successful
@@ -115,7 +123,7 @@ describe Fission::Command::Delete do
115
123
  it 'should output info for this command' do
116
124
  output = Fission::Command::Delete.help
117
125
 
118
- output.should match /delete vm_name \[--force\]/
126
+ output.should match /fission delete TARGET_VM \[OPTIONS\]/
119
127
  output.should match /--force/
120
128
  end
121
129
  end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fission::Command::Info do
4
+ include_context 'command_setup'
5
+
6
+ before do
7
+ @target_vm = ['foo']
8
+ Fission::VM.stub!(:new).and_return(@vm_mock)
9
+
10
+ @network_info_response_mock = mock('network_info_response')
11
+ @hardware_info_response_mock = mock('hardware_info_response')
12
+ @guest_os_response_mock = mock('guest_os_response')
13
+
14
+ @vm_mock.stub(:name).and_return(@target_vm.first)
15
+ end
16
+
17
+ describe 'command_name' do
18
+ it 'should return the pretty command name' do
19
+ Fission::Command::Info.new.command_name.should == 'info'
20
+ end
21
+ end
22
+
23
+ describe 'execute' do
24
+ before do
25
+ @vm_mock.stub(:network_info).and_return(@network_info_response_mock)
26
+ @vm_mock.stub(:hardware_info).and_return(@hardware_info_response_mock)
27
+ @vm_mock.stub(:guestos).and_return(@guest_os_response_mock)
28
+ @network_info = { 'ethernet0' => { 'mac_address' => '00:11:22:33:AA:BB',
29
+ 'ip_address' => '192.168.1.10' },
30
+ 'ethernet1' => { 'mac_address' => '00:11:22:33:AA:BB',
31
+ 'ip_address' => '192.168.1.10' } }
32
+ @hardware_info_response_mock.stub_as_successful Hash.new
33
+ @network_info_response_mock.stub_as_successful Hash.new
34
+ @guest_os_response_mock.stub_as_successful 'debian5'
35
+ end
36
+
37
+ subject { Fission::Command::Info }
38
+
39
+ [ [], ['--bar'] ].each do |args|
40
+ it_should_not_accept_arguments_of args, 'info'
41
+ end
42
+
43
+ it 'should output the vm name' do
44
+ command = Fission::Command::Info.new @target_vm
45
+ command.execute
46
+
47
+ @string_io.string.should match /foo/
48
+ end
49
+
50
+ it 'should output the os' do
51
+ command = Fission::Command::Info.new @target_vm
52
+ command.execute
53
+
54
+ @string_io.string.should match /os: debian5/
55
+ end
56
+
57
+ it 'should output that the os is unknown if applicable' do
58
+ @guest_os_response_mock.stub_as_successful ''
59
+ command = Fission::Command::Info.new @target_vm
60
+ command.execute
61
+
62
+ @string_io.string.should match /os: unknown/
63
+ end
64
+
65
+ it 'should output an error and exit if there was an error getting the os info' do
66
+ @guest_os_response_mock.stub_as_unsuccessful
67
+
68
+ command = Fission::Command::Info.new @target_vm
69
+ lambda { command.execute }.should raise_error SystemExit
70
+
71
+ @string_io.string.should match /There was an error getting the OS info.+it blew up.+/m
72
+ end
73
+
74
+ it 'should output the number of cpus' do
75
+ hardware_info = { 'cpus' => 2}
76
+ @hardware_info_response_mock.stub_as_successful hardware_info
77
+
78
+ command = Fission::Command::Info.new @target_vm
79
+ command.execute
80
+
81
+ @string_io.string.should match /cpus\: 2/
82
+ end
83
+
84
+ it 'should output the amount of memory' do
85
+ hardware_info = { 'memory' => 2048}
86
+ @hardware_info_response_mock.stub_as_successful hardware_info
87
+
88
+ command = Fission::Command::Info.new @target_vm
89
+ command.execute
90
+
91
+ @string_io.string.should match /memory\: 2048/
92
+ end
93
+
94
+ it 'should output an error and exit if there was an error getting the hardware info' do
95
+ @hardware_info_response_mock.stub_as_unsuccessful
96
+
97
+ command = Fission::Command::Info.new @target_vm
98
+ lambda { command.execute }.should raise_error SystemExit
99
+
100
+ @string_io.string.should match /There was an error getting the hardware info.+it blew up.+/m
101
+ end
102
+
103
+ it 'should output the network info' do
104
+ @network_info_response_mock.stub_as_successful @network_info
105
+
106
+ command = Fission::Command::Info.new @target_vm
107
+ command.execute
108
+
109
+ @string_io.string.should match /ethernet0 mac address: 00:11:22:33:AA:BB/
110
+ @string_io.string.should match /ethernet0 ip address: 192\.168\.1\.10/
111
+ end
112
+
113
+ it 'should output an error and exit if there was an error getting the network info' do
114
+ @network_info_response_mock.stub_as_unsuccessful
115
+
116
+ command = Fission::Command::Info.new @target_vm
117
+ lambda { command.execute }.should raise_error SystemExit
118
+
119
+ @string_io.string.should match /There was an error getting the network info.+it blew up.+/m
120
+ end
121
+ end
122
+
123
+ describe 'help' do
124
+ it 'should output info for this command' do
125
+ output = Fission::Command::Info.help
126
+
127
+ output.should match /fission info TARGET_VM/
128
+ end
129
+ end
130
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path('../../../spec_helper.rb', __FILE__)
1
+ require 'spec_helper'
2
2
 
3
3
  describe Fission::Command::SnapshotCreate do
4
4
  include_context 'command_setup'
@@ -12,10 +12,18 @@ describe Fission::Command::SnapshotCreate do
12
12
  @vm_mock.stub(:name).and_return(@target_vm.first)
13
13
  end
14
14
 
15
+ describe 'command_name' do
16
+ it 'should return the pretty command name' do
17
+ Fission::Command::SnapshotCreate.new.command_name.should == 'snapshot create'
18
+ end
19
+ end
20
+
15
21
  describe 'execute' do
16
22
  subject { Fission::Command::SnapshotCreate }
17
23
 
18
- it_should_not_accept_arguments_of [], 'snapshot create'
24
+ [ [], ['foo'], ['--bar'] ].each do |args|
25
+ it_should_not_accept_arguments_of args, 'snapshot create'
26
+ end
19
27
 
20
28
  it "should output an error and the help when no snapshot name is passed in" do
21
29
  Fission::Command::SnapshotCreate.should_receive(:help)
@@ -60,7 +68,7 @@ describe Fission::Command::SnapshotCreate do
60
68
  it 'should output info for this command' do
61
69
  output = Fission::Command::SnapshotCreate.help
62
70
 
63
- output.should match /snapshot create vm_name snapshot_1/
71
+ output.should match /fission snapshot create TARGET_VM SNAPSHOT_NAME/
64
72
  end
65
73
  end
66
74
  end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fission::Command::SnapshotDelete do
4
+ include_context 'command_setup'
5
+
6
+ before do
7
+ @target_vm = ['foo']
8
+ Fission::VM.stub!(:new).and_return(@vm_mock)
9
+
10
+ @snap_delete_response_mock = mock('snap_delete_response')
11
+
12
+ @vm_mock.stub(:name).and_return(@target_vm.first)
13
+ end
14
+
15
+ describe 'command_name' do
16
+ it 'should return the pretty command name' do
17
+ Fission::Command::SnapshotDelete.new.command_name.should == 'snapshot delete'
18
+ end
19
+ end
20
+
21
+ describe 'execute' do
22
+ subject { Fission::Command::SnapshotDelete }
23
+
24
+ [ [], ['foo'], ['--bar'] ].each do |args|
25
+ it_should_not_accept_arguments_of args, 'snapshot delete'
26
+ end
27
+
28
+ it "should output an error and the help when no snapshot name is passed in" do
29
+ Fission::Command::SnapshotDelete.should_receive(:help)
30
+
31
+ command = Fission::Command::SnapshotDelete.new @target_vm
32
+ lambda { command.execute }.should raise_error SystemExit
33
+
34
+ @string_io.string.should match /Incorrect arguments for snapshot delete command/
35
+ end
36
+
37
+ it 'should delete a new snapshot with the provided name' do
38
+ @snap_delete_response_mock.stub_as_successful []
39
+
40
+ @vm_mock.should_receive(:delete_snapshot).
41
+ with('snap_1').
42
+ and_return(@snap_delete_response_mock)
43
+
44
+ command = Fission::Command::SnapshotDelete.new @target_vm << 'snap_1'
45
+ command.execute
46
+
47
+ @string_io.string.should match /Deleting snapshot/
48
+ @string_io.string.should match /Snapshot 'snap_1' deleted/
49
+ end
50
+
51
+ it 'should output an error and exit if there was an error creating the snapshot' do
52
+ @snap_delete_response_mock.stub_as_unsuccessful
53
+
54
+ @vm_mock.should_receive(:delete_snapshot).
55
+ with('snap_1').
56
+ and_return(@snap_delete_response_mock)
57
+
58
+ command = Fission::Command::SnapshotDelete.new @target_vm << 'snap_1'
59
+ lambda { command.execute }.should raise_error SystemExit
60
+
61
+ @string_io.string.should match /Deleting snapshot/
62
+ @string_io.string.should match /There was an error deleting the snapshot.+it blew up.+/m
63
+ end
64
+
65
+ end
66
+
67
+ describe 'help' do
68
+ it 'should output info for this command' do
69
+ output = Fission::Command::SnapshotDelete.help
70
+
71
+ output.should match /fission snapshot delete TARGET_VM SNAPSHOT_NAME/
72
+ end
73
+ end
74
+ end