fission 0.3.0 → 0.4.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +1 -1
  4. data/lib/fission.rb +5 -6
  5. data/lib/fission/cli.rb +77 -7
  6. data/lib/fission/command.rb +43 -1
  7. data/lib/fission/command/clone.rb +19 -20
  8. data/lib/fission/command/delete.rb +29 -25
  9. data/lib/fission/command/snapshot_create.rb +11 -26
  10. data/lib/fission/command/snapshot_list.rb +13 -19
  11. data/lib/fission/command/snapshot_revert.rb +11 -26
  12. data/lib/fission/command/start.rb +11 -25
  13. data/lib/fission/command/status.rb +26 -10
  14. data/lib/fission/command/stop.rb +10 -21
  15. data/lib/fission/command/suspend.rb +21 -21
  16. data/lib/fission/command_helpers.rb +21 -0
  17. data/lib/fission/config.rb +35 -0
  18. data/lib/fission/fusion.rb +11 -3
  19. data/lib/fission/lease.rb +148 -0
  20. data/lib/fission/metadata.rb +55 -2
  21. data/lib/fission/response.rb +76 -0
  22. data/lib/fission/ui.rb +49 -0
  23. data/lib/fission/version.rb +1 -1
  24. data/lib/fission/vm.rb +653 -75
  25. data/spec/contexts/command.rb +12 -0
  26. data/spec/fission/cli_spec.rb +4 -11
  27. data/spec/fission/command/clone_spec.rb +45 -45
  28. data/spec/fission/command/delete_spec.rb +56 -43
  29. data/spec/fission/command/snapshot_create_spec.rb +29 -51
  30. data/spec/fission/command/snapshot_list_spec.rb +25 -26
  31. data/spec/fission/command/snapshot_revert_spec.rb +27 -53
  32. data/spec/fission/command/start_spec.rb +25 -69
  33. data/spec/fission/command/status_spec.rb +48 -13
  34. data/spec/fission/command/stop_spec.rb +25 -42
  35. data/spec/fission/command/suspend_spec.rb +54 -49
  36. data/spec/fission/command_helpers_spec.rb +30 -0
  37. data/spec/fission/command_spec.rb +19 -0
  38. data/spec/fission/config_spec.rb +24 -0
  39. data/spec/fission/fusion_spec.rb +6 -6
  40. data/spec/fission/lease_spec.rb +176 -0
  41. data/spec/fission/metadata_spec.rb +8 -8
  42. data/spec/fission/response_spec.rb +81 -0
  43. data/spec/fission/vm_spec.rb +869 -193
  44. data/spec/fission_spec.rb +0 -6
  45. data/spec/helpers/command_helpers.rb +12 -0
  46. data/spec/helpers/response_helpers.rb +21 -0
  47. data/spec/matchers/be_a_successful_response.rb +7 -0
  48. data/spec/matchers/be_an_unsuccessful_response.rb +10 -0
  49. data/spec/spec_helper.rb +7 -0
  50. metadata +24 -5
@@ -0,0 +1,12 @@
1
+ shared_context 'command_setup' do
2
+ before do
3
+ @string_io = StringIO.new
4
+ ui_stub = Fission::UI.new(@string_io)
5
+ Fission::UI.stub!(:new).and_return(ui_stub)
6
+
7
+ @all_running_response_mock = mock('all_running_response')
8
+ @state_response_mock = mock('state_response')
9
+ @vm_mock = mock('vm_mock')
10
+ end
11
+
12
+ end
@@ -3,7 +3,7 @@ require File.expand_path('../../spec_helper.rb', __FILE__)
3
3
  describe Fission::CLI do
4
4
  before do
5
5
  @string_io = StringIO.new
6
- Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
6
+ Fission::CLI.stub!(:ui).and_return(Fission::UI.new(@string_io))
7
7
  end
8
8
 
9
9
  describe 'self.commands' do
@@ -17,9 +17,7 @@ describe Fission::CLI do
17
17
  describe 'execute' do
18
18
  describe 'with no arguments' do
19
19
  it 'should output the usage info' do
20
- lambda {
21
- Fission::CLI.execute []
22
- }.should raise_error SystemExit
20
+ lambda { Fission::CLI.execute [] }.should raise_error SystemExit
23
21
 
24
22
  @string_io.string.should match /Usage/
25
23
  end
@@ -28,12 +26,9 @@ describe Fission::CLI do
28
26
  describe '-v or --version' do
29
27
  ['-v', '--version'].each do |arg|
30
28
  it "should output the version with #{arg}" do
31
- lambda {
32
- Fission::CLI.execute [arg]
33
- }.should raise_error SystemExit
29
+ lambda { Fission::CLI.execute [arg] }.should raise_error SystemExit
34
30
 
35
31
  @string_io.string.should match /#{Fission::VERSION}/
36
-
37
32
  end
38
33
  end
39
34
  end
@@ -41,9 +36,7 @@ describe Fission::CLI do
41
36
  describe '-h or --help' do
42
37
  ['-h', '--help'].each do |arg|
43
38
  it "should output the usage info with #{arg}" do
44
- lambda {
45
- Fission::CLI.execute [arg]
46
- }.should raise_error SystemExit
39
+ lambda { Fission::CLI.execute [arg] }.should raise_error SystemExit
47
40
 
48
41
  @string_io.string.should match /Usage/
49
42
  end
@@ -1,76 +1,76 @@
1
1
  require File.expand_path('../../../spec_helper.rb', __FILE__)
2
2
 
3
3
  describe Fission::Command::Clone do
4
+ include_context 'command_setup'
5
+
4
6
  before do
5
7
  @vm_info = ['foo', 'bar']
6
- @string_io = StringIO.new
7
- Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
8
- end
8
+ @source_vm_mock = mock('source_vm')
9
+ @target_vm_mock = mock('target_vm')
9
10
 
10
- describe 'execute' do
11
- [ [], ['foo'] ].each do |args|
12
- it "should output an error and the help when #{args.count} arguments are passed in" do
13
- Fission::Command::Clone.should_receive(:help)
11
+ @clone_response_mock = mock('clone_reponse')
12
+ @start_response_mock = mock('start_reponse')
14
13
 
15
- lambda {
16
- command = Fission::Command::Clone.new args
17
- command.execute
18
- }.should raise_error SystemExit
19
-
20
- @string_io.string.should match /Incorrect arguments for clone command/
21
- end
22
- end
14
+ @source_vm_mock.stub(:name).and_return('foo')
15
+ @target_vm_mock.stub(:name).and_return('bar')
23
16
 
24
- it "should output an error and exit if it can't find the source vm" do
25
- Fission::VM.should_receive(:exists?).with(@vm_info.first).and_return(false)
26
- Fission::VM.should_not_receive(:exists?).with(@vm_info[1])
17
+ Fission::VM.stub(:new).with('foo').and_return(@source_vm_mock)
18
+ Fission::VM.stub(:new).with('bar').and_return(@target_vm_mock)
19
+ Fission::VM.stub(:clone).with(@vm_info.first, @vm_info[1]).
20
+ and_return(@clone_response_mock)
21
+ end
27
22
 
28
- lambda {
29
- command = Fission::Command::Clone.new @vm_info
30
- command.execute
31
- }.should raise_error SystemExit
23
+ describe 'execute' do
24
+ subject { Fission::Command::Clone }
32
25
 
33
- @string_io.string.should match /Unable to find the source vm #{@vm_info.first}/
26
+ [ [], ['foo'] ].each do |args|
27
+ it_should_not_accept_arguments_of args, 'clone'
34
28
  end
35
29
 
36
- it "should output an error and exit if the target vm already exists" do
37
- @vm_info.each do |vm|
38
- Fission::VM.should_receive(:exists?).with(vm).and_return(true)
39
- end
30
+ it 'should clone the vm' do
31
+ @clone_response_mock.stub_as_successful
40
32
 
41
- lambda {
42
- command = Fission::Command::Clone.new @vm_info
43
- command.execute
44
- }.should raise_error SystemExit
33
+ command = Fission::Command::Clone.new @vm_info
34
+ command.execute
45
35
 
46
- @string_io.string.should match /The target vm #{@vm_info[1]} already exists/
36
+ @string_io.string.should match /Clone complete/
47
37
  end
48
38
 
49
- it 'should try to clone the vm if the source vm exists and the target vm does not' do
50
- Fission::VM.should_receive(:exists?).with(@vm_info.first).and_return(true)
51
- Fission::VM.should_receive(:exists?).with(@vm_info[1]).and_return(false)
52
- Fission::VM.should_receive(:clone).with(@vm_info.first, @vm_info[1])
39
+ it 'should output an error and exit if there is an error cloning' do
40
+ @clone_response_mock.stub_as_unsuccessful
41
+
53
42
  command = Fission::Command::Clone.new @vm_info
54
- command.execute
43
+ lambda { command.execute }.should raise_error SystemExit
55
44
 
56
- @string_io.string.should match /Clone complete/
45
+ @string_io.string.should match /There was an error cloning the VM.+it blew up/m
57
46
  end
58
47
 
59
48
  describe 'with --start' do
60
- it 'should try to clone the vm and start it' do
61
- @vm_mock = mock('vm_mock')
62
- Fission::VM.should_receive(:exists?).with(@vm_info.first).and_return(true)
63
- Fission::VM.should_receive(:exists?).with(@vm_info[1]).and_return(false)
64
- Fission::VM.should_receive(:clone).with(@vm_info.first, @vm_info[1])
49
+ before do
50
+ @clone_response_mock.stub_as_successful true
51
+ @target_vm_mock.should_receive(:start).and_return(@start_response_mock)
52
+ end
65
53
 
66
- @vm_mock.should_receive(:start)
67
- Fission::VM.should_receive(:new).with(@vm_info[1]).and_return(@vm_mock)
54
+ it 'should clone the vm and start it' do
55
+ @start_response_mock.stub_as_successful
68
56
 
69
57
  command = Fission::Command::Clone.new @vm_info << '--start'
70
58
  command.execute
71
59
 
72
60
  @string_io.string.should match /Clone complete/
73
61
  @string_io.string.should match /Starting '#{@vm_info[1]}'/
62
+ @string_io.string.should match /VM '#{@vm_info[1]}' started/
63
+ end
64
+
65
+ it 'should output an error and exit if there is an error starting the VM after cloning it' do
66
+ @start_response_mock.stub_as_unsuccessful
67
+
68
+ command = Fission::Command::Clone.new @vm_info << '--start'
69
+ lambda { command.execute }.should raise_error SystemExit
70
+
71
+ @string_io.string.should match /Clone complete/
72
+ @string_io.string.should match /Starting '#{@vm_info[1]}'/
73
+ @string_io.string.should match /There was an error starting the VM.+it blew up/m
74
74
  end
75
75
  end
76
76
 
@@ -1,65 +1,74 @@
1
1
  require File.expand_path('../../../spec_helper.rb', __FILE__)
2
2
 
3
3
  describe Fission::Command::Delete do
4
+ include_context 'command_setup'
5
+
4
6
  before do
5
7
  @target_vm = ['foo']
6
- @string_io = StringIO.new
7
- Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
8
+ Fission::VM.stub(:new).and_return(@vm_mock)
9
+
10
+ @delete_response_mock = mock('delete_response')
11
+ @running_response_mock = mock('running?')
12
+
13
+ @vm_mock.stub(:name).and_return(@target_vm.first)
14
+ @vm_mock.stub(:running?).and_return(@running_response_mock)
15
+ @running_response_mock.stub_as_successful false
16
+ Fission::Fusion.stub(:running?).and_return(false)
8
17
  end
9
18
 
10
19
  describe "execute" do
11
- it "should output an error and the help when no VM argument is passed in" do
12
- Fission::Command::Delete.should_receive(:help)
20
+ subject { Fission::Command::Delete }
13
21
 
14
- lambda {
15
- command = Fission::Command::Delete.new
16
- command.execute
17
- }.should raise_error SystemExit
22
+ it_should_not_accept_arguments_of [], 'delete'
18
23
 
19
- @string_io.string.should match /Incorrect arguments for delete command/
24
+ it "should try to delete the vm" do
25
+ @delete_response_mock.stub_as_successful
26
+
27
+ @vm_mock.should_receive(:delete).and_return(@delete_response_mock)
28
+
29
+ Fission::Fusion.should_receive(:running?).and_return(false)
30
+
31
+ command = Fission::Command::Delete.new @target_vm
32
+ command.execute
33
+
34
+ @string_io.string.should match /Deletion complete/
20
35
  end
21
36
 
22
- it "should output an error and exit if it can't find the target vm" do
23
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(false)
37
+ it "should output an error and exit if unable to determine if it's running" do
38
+ @running_response_mock.stub_as_unsuccessful
24
39
 
25
- lambda {
26
- command = Fission::Command::Delete.new @target_vm
27
- command.execute
28
- }.should raise_error SystemExit
40
+ command = Fission::Command::Delete.new @target_vm
41
+ lambda { command.execute }.should raise_error SystemExit
29
42
 
30
- @string_io.string.should match /Unable to find target vm #{@target_vm}/
43
+ @string_io.string.should match /There was an error determining if the VM is running.+it blew up.+/m
31
44
  end
32
45
 
33
- it "should try to delete the vm if it exists" do
34
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
35
- Fission::Fusion.should_receive(:is_running?).and_return(false)
36
- Fission::VM.should_receive(:delete).with(@target_vm.first)
46
+ it 'should output an error and exit if there was an error deleting the VM' do
47
+ @delete_response_mock.stub_as_unsuccessful
48
+
49
+ @vm_mock.should_receive(:delete).and_return(@delete_response_mock)
50
+
37
51
  command = Fission::Command::Delete.new @target_vm
38
- command.execute
39
- @string_io.string.should match /Deletion complete/
52
+ lambda { command.execute }.should raise_error SystemExit
53
+
54
+ @string_io.string.should match /There was an error deleting the VM.+it blew up/m
40
55
  end
41
56
 
42
57
  it 'should output an error and exit if the VM is running' do
43
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
44
- Fission::VM.should_receive(:all_running).and_return(['foo', 'bar'])
45
- lambda {
46
- command = Fission::Command::Delete.new @target_vm
47
- command.execute
48
- }.should raise_error SystemExit
58
+ @running_response_mock.stub_as_successful true
59
+
60
+ command = Fission::Command::Delete.new @target_vm
61
+ lambda { command.execute }.should raise_error SystemExit
49
62
 
50
63
  @string_io.string.should match /VM is currently running/
51
64
  @string_io.string.should match /Either stop\/suspend the VM or use '--force' and try again/
52
65
  end
53
66
 
54
67
  it 'should output an error and exit if the fusion app is running' do
55
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
56
- Fission::VM.should_receive(:all_running).and_return(['bar'])
57
- Fission::Fusion.should_receive(:is_running?).and_return(true)
68
+ Fission::Fusion.stub(:running?).and_return(true)
58
69
 
59
- lambda {
60
- command = Fission::Command::Delete.new @target_vm
61
- command.execute
62
- }.should raise_error SystemExit
70
+ command = Fission::Command::Delete.new @target_vm
71
+ lambda { command.execute }.should raise_error SystemExit
63
72
 
64
73
  @string_io.string.should match /Fusion GUI is currently running/
65
74
  @string_io.string.should match /Either exit the Fusion GUI or use '--force' and try again/
@@ -68,41 +77,45 @@ describe Fission::Command::Delete do
68
77
 
69
78
  describe 'with --force' do
70
79
  before do
71
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
80
+ @vm_mock.should_receive(:delete).and_return(@delete_response_mock)
81
+ @delete_response_mock.stub_as_successful true
72
82
  end
73
83
 
74
84
  it "should stop the VM if it's running and then delete it" do
75
85
  @stop_cmd_mock = mock('stop_cmd')
86
+
76
87
  @stop_cmd_mock.should_receive(:execute)
77
- Fission::VM.should_receive(:all_running).and_return(['foo', 'bar'])
78
- Fission::Fusion.should_receive(:is_running?).and_return(false)
88
+ @running_response_mock.stub_as_successful true
89
+
79
90
  Fission::Command::Stop.should_receive(:new).with(@target_vm).
80
- and_return(@stop_cmd_mock)
91
+ and_return(@stop_cmd_mock)
81
92
  command = Fission::Command::Delete.new @target_vm << '--force'
82
93
  command.execute
94
+
83
95
  @string_io.string.should match /VM is currently running/
84
96
  @string_io.string.should match /Going to stop it/
85
97
  @string_io.string.should match /Deletion complete/
86
98
  end
87
99
 
88
100
  it 'should output a warning about fusion metadata issue and then delete the VM' do
89
- Fission::VM.should_receive(:all_running).and_return(['bar'])
90
- Fission::Fusion.should_receive(:is_running?).and_return(true)
101
+
102
+ Fission::Fusion.should_receive(:running?).and_return(true)
91
103
  command = Fission::Command::Delete.new @target_vm << '--force'
92
104
  command.execute
105
+
93
106
  @string_io.string.should match /Fusion GUI is currently running/
94
107
  @string_io.string.should match /metadata for the VM may not be removed completely/
95
108
  @string_io.string.should match /Deletion complete/
96
109
  end
97
-
98
110
  end
111
+
99
112
  end
100
113
 
101
114
  describe 'help' do
102
115
  it 'should output info for this command' do
103
116
  output = Fission::Command::Delete.help
104
117
 
105
- output.should match /delete target_vm \[--force\]/
118
+ output.should match /delete vm_name \[--force\]/
106
119
  output.should match /--force/
107
120
  end
108
121
  end
@@ -1,88 +1,66 @@
1
1
  require File.expand_path('../../../spec_helper.rb', __FILE__)
2
2
 
3
3
  describe Fission::Command::SnapshotCreate do
4
+ include_context 'command_setup'
5
+
4
6
  before do
5
7
  @target_vm = ['foo']
6
- @vm_mock = mock('vm_mock')
7
8
  Fission::VM.stub!(:new).and_return(@vm_mock)
8
- @string_io = StringIO.new
9
- Fission.stub!(:ui).and_return(Fission::UI.new(@string_io))
9
+
10
+ @snap_create_response_mock = mock('snap_create_response')
11
+
12
+ @vm_mock.stub(:name).and_return(@target_vm.first)
10
13
  end
11
14
 
12
15
  describe 'execute' do
13
- it "should output an error and the help when no vm name is passed in" do
14
- Fission::Command::SnapshotCreate.should_receive(:help)
16
+ subject { Fission::Command::SnapshotCreate }
15
17
 
16
- lambda {
17
- command = Fission::Command::SnapshotCreate.new
18
- command.execute
19
- }.should raise_error SystemExit
20
-
21
- @string_io.string.should match /Incorrect arguments for snapshot create command/
22
- end
18
+ it_should_not_accept_arguments_of [], 'snapshot create'
23
19
 
24
20
  it "should output an error and the help when no snapshot name is passed in" do
25
21
  Fission::Command::SnapshotCreate.should_receive(:help)
26
22
 
27
- lambda {
28
- command = Fission::Command::SnapshotCreate.new @target_vm
29
- command.execute
30
- }.should raise_error SystemExit
23
+ command = Fission::Command::SnapshotCreate.new @target_vm
24
+ lambda { command.execute }.should raise_error SystemExit
31
25
 
32
26
  @string_io.string.should match /Incorrect arguments for snapshot create command/
33
27
  end
34
28
 
35
- it "should output an error and exit if it can't find the target vm" do
36
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(false)
37
-
38
- lambda {
39
- command = Fission::Command::SnapshotCreate.new @target_vm << 'snap_1'
40
- command.execute
41
- }.should raise_error SystemExit
29
+ it 'should create a new snapshot with the provided name' do
30
+ @snap_create_response_mock.stub_as_successful []
42
31
 
43
- @string_io.string.should match /Unable to find the VM #{@target_vm.first}/
44
- end
32
+ @vm_mock.should_receive(:create_snapshot).
33
+ with('snap_1').
34
+ and_return(@snap_create_response_mock)
45
35
 
46
- it 'should output an error and exit if the VM is not running' do
47
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
48
- Fission::VM.should_receive(:all_running).and_return([])
49
- lambda {
50
- command = Fission::Command::SnapshotCreate.new @target_vm << 'snap_1'
51
- command.execute
52
- }.should raise_error SystemExit
36
+ command = Fission::Command::SnapshotCreate.new @target_vm << 'snap_1'
37
+ command.execute
53
38
 
54
- @string_io.string.should match /VM 'foo' is not running/
55
- @string_io.string.should match /A snapshot cannot be created unless the VM is running/
39
+ @string_io.string.should match /Creating snapshot/
40
+ @string_io.string.should match /Snapshot 'snap_1' created/
56
41
  end
57
42
 
58
- it "should output an error and exit if there is already a snapshot with the provided name" do
59
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
60
- Fission::VM.should_receive(:all_running).and_return(['foo'])
61
- @vm_mock.should_receive(:snapshots).and_return(['snap_1'])
62
- lambda {
63
- command = Fission::Command::SnapshotCreate.new @target_vm << 'snap_1'
64
- command.execute
65
- }.should raise_error SystemExit
43
+ it 'should output an error and exit if there was an error creating the snapshot' do
44
+ @snap_create_response_mock.stub_as_unsuccessful
66
45
 
67
- @string_io.string.should match /VM 'foo' already has a snapshot named 'snap_1'/
68
- end
46
+ @vm_mock.should_receive(:create_snapshot).
47
+ with('snap_1').
48
+ and_return(@snap_create_response_mock)
69
49
 
70
- it 'should create a new snapshot with the provided name' do
71
- Fission::VM.should_receive(:exists?).with(@target_vm.first).and_return(true)
72
- Fission::VM.should_receive(:all_running).and_return(['foo'])
73
- @vm_mock.should_receive(:snapshots).and_return([])
74
- @vm_mock.should_receive(:create_snapshot).with('snap_1')
75
50
  command = Fission::Command::SnapshotCreate.new @target_vm << 'snap_1'
76
- command.execute
51
+ lambda { command.execute }.should raise_error SystemExit
52
+
77
53
  @string_io.string.should match /Creating snapshot/
54
+ @string_io.string.should match /There was an error creating the snapshot.+it blew up.+/m
78
55
  end
56
+
79
57
  end
80
58
 
81
59
  describe 'help' do
82
60
  it 'should output info for this command' do
83
61
  output = Fission::Command::SnapshotCreate.help
84
62
 
85
- output.should match /snapshot create my_vm snapshot_1/
63
+ output.should match /snapshot create vm_name snapshot_1/
86
64
  end
87
65
  end
88
66
  end