fission 0.3.0 → 0.4.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.
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