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
@@ -0,0 +1 @@
1
+ fission
@@ -0,0 +1 @@
1
+ 1.9.3-p429
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ script: rake spec
@@ -1,10 +1,19 @@
1
- # changes
2
-
3
1
  ## head
4
2
 
3
+ ## 0.5.0.beta.1 (06/22/2013)
4
+ * add 'info' command
5
+ * add 'snapshot delete' command
6
+ * add ability to get all VM config values (related to #14)
7
+ * fix issue #16 (returning incorrect mac address)
8
+ * fix issue #18 (1.8.7 compatibility)
9
+ * fix issue #19 (duplicate config entires when cloning)
10
+ * internal cleanup of how command strings are handled (props to @patdowney)
11
+ * bump dependency on CFproperList to avoid libxml-ruby dependency (#24)
12
+
5
13
  ## 0.4.0 (01/17/2012)
6
14
  * major internal refactoring for usage as a lib
7
- * add fix for loading a custom vmrun_bin in ~/.fissionrc (issue #8 )
15
+ * add fix for loading a custom vmrun_bin in ~/.fissionrc (issue #8)
16
+ * add guestos and uuid methods to VM (@ody)
8
17
 
9
18
  ## 0.3.0 (09/16/2011)
10
19
  * add ability to suspend all running VMs ('--all')
data/README.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # Fission
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/thbishop/fission.png)](http://travis-ci.org/thbishop/fission)
4
+
3
5
  ## Intro
4
- Fission is a simple command line tool for managing VMware Fusion VMs. Only Fusion 3.x is currently supported.
6
+ Fission is a simple command line tool for managing VMware Fusion VMs. Only Fusion 3.x is currently
7
+ supported. See [Fusion Version Support](#fusion-version-support) for more info.
5
8
 
6
9
 
7
10
  ## Install
@@ -15,6 +18,28 @@ Fission is a simple command line tool for managing VMware Fusion VMs. Only Fusi
15
18
  If you provide '--start', then the new VM will be powered on after cloning
16
19
 
17
20
 
21
+ ### Delete
22
+ fission delete my_vm [--force]
23
+
24
+ Deletes the VM. This will delete the files from disk and remove the related metadata in Fusion.
25
+
26
+ By default, the VM will not be deleted if:
27
+
28
+ * The VM is running
29
+ * The Fusion GUI is running (as the metadata cannot be cleanly removed)
30
+
31
+ Providing '--force' will:
32
+
33
+ * Stop the VM if it's running
34
+ * Delete the VM even if the Fusion GUI is running
35
+
36
+
37
+ ### Info
38
+ fission info my_vm
39
+
40
+ Outputs information about the VM
41
+
42
+
18
43
  ### Snapshot Create
19
44
  fission snapshot create my_vm snapshot_name
20
45
 
@@ -26,6 +51,14 @@ In order to create the snapshot:
26
51
  * The snapshot name must be unique
27
52
 
28
53
 
54
+ ### Snapshot Delete
55
+ fission snapshot delete my_vm snapshot_name
56
+
57
+ Deletes a snapshot for the VM
58
+
59
+ If you have the Fusion GUI running, the VM must be running in order to delete the snapshot.
60
+
61
+
29
62
  ### Snapshot List
30
63
  fission snapshot list my_vm
31
64
 
@@ -70,22 +103,6 @@ Stops the VM
70
103
  Suspends the VM or all running VMs
71
104
 
72
105
 
73
- ### Delete
74
- fission delete my_vm [--force]
75
-
76
- Deletes the VM. This will delete the files from disk and remove the related metadata in Fusion.
77
-
78
- By default, the VM will not be deleted if:
79
-
80
- * The VM is running
81
- * The Fusion GUI is running (as the metadata cannot be cleanly removed)
82
-
83
- Providing '--force' will:
84
-
85
- * Stop the VM if it's running
86
- * Delete the VM even if the Fusion GUI is running
87
-
88
-
89
106
  ### Help
90
107
  fission -h
91
108
 
@@ -94,17 +111,26 @@ or just
94
111
  fission
95
112
 
96
113
 
97
- ## Config
114
+ ## Configuration
98
115
  By default, fission will use the default VMware Fusion VM directory
99
116
  (~/Documents/Virtual Machines.localized/) when cloning. If you want to use a
100
117
  different directory, you can set this in a config file.
101
118
 
102
- The config file needs to be in yaml format and live at '~/.fissionrc'
119
+ The config file needs to be in YAML format and live at '~/.fissionrc'
103
120
 
104
121
  $cat ~/.fissionrc
105
122
  ---
106
123
  vm_dir: "/vm"
107
124
 
125
+ ## Fusion Version Support
126
+ As of now, only Fusion 3.x is supported (that's what I have available to test).
127
+ It's my understanding that some folks are currently using fission with Fusion
128
+ 4.x as well. In order to have fission work with Fusion 4.x, you will need to
129
+ tell fission where the Fusion 4.x vmrun file is. You can do so with the
130
+ following item placed in your ~/.fissionrc (remember, YAML format):
131
+
132
+ vmrun_bin: /Applications/VMware Fusion.app/Contents/Library/vmrun
133
+
108
134
 
109
135
  ## Other Notable Info
110
136
  The name of the VM used in the previous examples should be the directory name
@@ -4,4 +4,4 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
4
 
5
5
  require 'fission'
6
6
 
7
- Fission::CLI.execute
7
+ Fission::CLI.new.execute
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
- s.add_dependency 'CFPropertyList', '~> 2.0.17'
22
- s.add_development_dependency 'rspec', '~> 2.6.0'
21
+ s.add_dependency 'CFPropertyList', '~> 2.1.1'
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'rspec', '~> 2.8.0'
23
24
  s.add_development_dependency 'fakefs', '~> 0.3.2'
24
25
  end
@@ -5,12 +5,26 @@ require 'yaml'
5
5
 
6
6
  $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
7
7
 
8
+ require 'fission/action/shell_executor'
9
+ require 'fission/action/snapshot/creator'
10
+ require 'fission/action/snapshot/deleter'
11
+ require 'fission/action/snapshot/lister'
12
+ require 'fission/action/snapshot/reverter'
13
+ require 'fission/action/vm/cloner'
14
+ require 'fission/action/vm/deleter'
15
+ require 'fission/action/vm/lister'
16
+ require 'fission/action/vm/starter'
17
+ require 'fission/action/vm/stopper'
18
+ require 'fission/action/vm/suspender'
8
19
  require 'fission/cli'
9
20
  require 'fission/command'
10
21
  require 'fission/command_helpers'
22
+ require 'fission/command_line_parser'
11
23
  require 'fission/command/clone'
12
24
  require 'fission/command/delete'
25
+ require 'fission/command/info'
13
26
  require 'fission/command/snapshot_create'
27
+ require 'fission/command/snapshot_delete'
14
28
  require 'fission/command/snapshot_list'
15
29
  require 'fission/command/snapshot_revert'
16
30
  require 'fission/command/start'
@@ -27,6 +41,7 @@ require 'fission/metadata'
27
41
  require 'fission/response'
28
42
  require 'fission/ui'
29
43
  require 'fission/vm'
44
+ require 'fission/vm_configuration'
30
45
  require 'fission/version'
31
46
 
32
47
  module Fission
@@ -0,0 +1,37 @@
1
+ module Fission
2
+ module Action
3
+
4
+ class ShellExecutor
5
+
6
+ # Internal: Create a new ShellExecutor object.
7
+ #
8
+ # cmd - Command to execute as a String
9
+ #
10
+ # Examples:
11
+ #
12
+ # Fission::Action::ShellExecutor.new 'ls /var/log'
13
+ #
14
+ # Returns a new Fission::Action::ShellExecutor object.
15
+ def initialize(cmd)
16
+ @cmd = cmd
17
+ end
18
+
19
+ # Internal: Executes the command in the shell. The command will be
20
+ # executed using the ruby '`' method.
21
+ #
22
+ # Examples:
23
+ #
24
+ # @executor.execute
25
+ #
26
+ # Returns a Hash with two keys.
27
+ # The key 'output' will contain the output from the command.
28
+ # The key 'process_status' will conatian a standard ruby Process::Status
29
+ # object.
30
+ def execute
31
+ { 'output' => `#{@cmd}`, 'process_status' => $? }
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,81 @@
1
+ module Fission
2
+ module Action
3
+ module Snapshot
4
+
5
+ class Creator
6
+
7
+ # Internal: Creates a new SnapshotCreator object. This accepts a VM
8
+ # object.
9
+ #
10
+ # vm - An instance of VM
11
+ #
12
+ # Examples:
13
+ #
14
+ # Fission::Action::SnapshotCreator.new @my_vm
15
+ #
16
+ # Returns a new SnapshotCreator object
17
+ def initialize(vm)
18
+ @vm = vm
19
+ end
20
+
21
+ # Public: Creates a snapshot for a VM. The VM must be running in order
22
+ # to create a snapshot. Snapshot names must be unique.
23
+ #
24
+ # name - The desired name of the snapshot. The name must be unique.
25
+ #
26
+ # Examples
27
+ #
28
+ # @creator.create_snapshot('foo_snap_1')
29
+ #
30
+ # Returns a Response with the result.
31
+ # If successful, the Response's data attribute will be nil.
32
+ # If there is an error, an unsuccessful Response will be returned.
33
+ def create_snapshot(name)
34
+ unless @vm.exists?
35
+ return Response.new :code => 1, :message => 'VM does not exist'
36
+ end
37
+
38
+ running_response = @vm.running?
39
+ return running_response unless running_response.successful?
40
+
41
+ unless running_response.data
42
+ message = 'The VM must be running in order to take a snapshot.'
43
+ return Response.new :code => 1, :message => message
44
+ end
45
+
46
+ conf_file_response = @vm.conf_file
47
+ return conf_file_response unless conf_file_response.successful?
48
+
49
+ snapshots_response = @vm.snapshots
50
+ return snapshots_response unless snapshots_response.successful?
51
+
52
+ if snapshots_response.data.include? name
53
+ message = "There is already a snapshot named '#{name}'."
54
+ return Response.new :code => 1, :message => message
55
+ end
56
+
57
+ command = "#{vmrun_cmd} snapshot "
58
+ command << "'#{conf_file_response.data}' \"#{name}\" 2>&1"
59
+
60
+ command_exec = Fission::Action::ShellExecutor.new command
61
+ Response.from_shell_executor command_exec.execute
62
+ end
63
+
64
+ private
65
+ # Internal: Helper for getting the configured vmrun_cmd value.
66
+ #
67
+ # Examples
68
+ #
69
+ # @creator.vmrun_cmd
70
+ # # => "/foo/bar/vmrun -T fusion"
71
+ #
72
+ # Returns a String for the configured value of Fission.config['vmrun_cmd'].
73
+ def vmrun_cmd
74
+ Fission.config['vmrun_cmd']
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,85 @@
1
+ module Fission
2
+ module Action
3
+ module Snapshot
4
+
5
+ class Deleter
6
+
7
+ # Internal: Creates a new SnapshotDeleter object. This accepts a VM
8
+ # object.
9
+ #
10
+ # vm - An instance of VM
11
+ #
12
+ # Examples:
13
+ #
14
+ # Fission::Action::SnapshotDeleter.new @my_vm
15
+ #
16
+ # Returns a new SnapshotDeleter object
17
+ def initialize(vm)
18
+ @vm = vm
19
+ end
20
+
21
+ # Public: Deletes a snapshot for a VM. The snapshot to delete must
22
+ # exist. If the Fusion GUI is running, then the VM must also be running.
23
+ #
24
+ # name - The name of the snapshot to delete.
25
+ #
26
+ # Examples
27
+ #
28
+ # @deleter.delete_snapshot('foo_snap_1')
29
+ #
30
+ # Returns a Response with the result.
31
+ # If successful, the Response's data attribute will be nil.
32
+ # If there is an error, an unsuccessful Response will be returned.
33
+ def delete_snapshot(name)
34
+ unless @vm.exists?
35
+ return Response.new :code => 1, :message => 'VM does not exist'
36
+ end
37
+
38
+ if Fusion.running?
39
+ running_response = @vm.running?
40
+ return running_response unless running_response.successful?
41
+
42
+ unless running_response.data
43
+ message = 'A snapshot cannot be deleted when the GUI is running '
44
+ message << 'and the VM is not running.'
45
+ return Response.new :code => 1, :message => message
46
+ end
47
+ end
48
+
49
+ conf_file_response = @vm.conf_file
50
+ return conf_file_response unless conf_file_response.successful?
51
+
52
+ snapshots_response = @vm.snapshots
53
+ return snapshots_response unless snapshots_response.successful?
54
+
55
+ unless snapshots_response.data.include? name
56
+ message = "Unable to find a snapshot named '#{name}'."
57
+ return Response.new :code => 1, :message => message
58
+ end
59
+
60
+ command = "#{vmrun_cmd} deleteSnapshot "
61
+ command << "'#{conf_file_response.data}' \"#{name}\" 2>&1"
62
+
63
+ command_exec = Fission::Action::ShellExecutor.new command
64
+ Response.from_shell_executor command_exec.execute
65
+ end
66
+
67
+ private
68
+ # Internal: Helper for getting the configured vmrun_cmd value.
69
+ #
70
+ # Examples
71
+ #
72
+ # @deleter.vmrun_cmd
73
+ # # => "/foo/bar/vmrun -T fusion"
74
+ #
75
+ # Returns a String for the configured value of
76
+ # Fission.config['vmrun_cmd'].
77
+ def vmrun_cmd
78
+ Fission.config['vmrun_cmd']
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,90 @@
1
+ module Fission
2
+ module Action
3
+ module Snapshot
4
+
5
+ class Lister
6
+
7
+ # Internal: Creates a new SnapshotLister object. This accepts a VM
8
+ # object.
9
+ #
10
+ # vm - An instance of VM
11
+ #
12
+ # Examples:
13
+ #
14
+ # Fission::Action::SnapshotLister.new @my_vm
15
+ #
16
+ # Returns a new SnapshotLister object
17
+ def initialize(vm)
18
+ @vm = vm
19
+ end
20
+
21
+ # Internal: List the snapshots for a VM.
22
+ #
23
+ # Examples
24
+ #
25
+ # @lister.snapshots.data
26
+ # # => ['snap 1', 'snap 2']
27
+ #
28
+ # Returns a Response with the result.
29
+ # If successful, the Repsonse's data attribute will be an Array of the
30
+ # snapshot names (String).
31
+ # If there is an error, an unsuccessful Response will be returned.
32
+ def snapshots
33
+ unless @vm.exists?
34
+ return Response.new :code => 1, :message => 'VM does not exist'
35
+ end
36
+
37
+ conf_file_response = @vm.conf_file
38
+ return conf_file_response unless conf_file_response.successful?
39
+
40
+ command = "#{vmrun_cmd} listSnapshots "
41
+ command << "'#{conf_file_response.data}' 2>&1"
42
+
43
+ command_exec = Fission::Action::ShellExecutor.new command
44
+ result = command_exec.execute
45
+
46
+ response = Response.new :code => result['process_status'].exitstatus
47
+
48
+ if response.successful?
49
+ response.data = parse_snapshot_names_from_output result['output']
50
+ else
51
+ response.message = result['output']
52
+ end
53
+
54
+ response
55
+ end
56
+
57
+ private
58
+ # Internal: Helper for getting the configured vmrun_cmd value.
59
+ #
60
+ # Examples
61
+ #
62
+ # @lister.vmrun_cmd
63
+ # # => "/foo/bar/vmrun -T fusion"
64
+ #
65
+ # Returns a String for the configured value of
66
+ # Fission.config['vmrun_cmd'].
67
+ def vmrun_cmd
68
+ Fission.config['vmrun_cmd']
69
+ end
70
+
71
+ # Internal: Parses the output of the listSnapshot command.
72
+ #
73
+ # output - The output of the vmrun listSnapshot command.
74
+ #
75
+ # Examples:
76
+ # @lister.parse_snapshot_names_from_output cmd_output
77
+ # # => ['snap_1', 'snap_2']
78
+ #
79
+ # Returns an Array with the list of snapshot names.
80
+ def parse_snapshot_names_from_output(cmd_output)
81
+ header_text = 'Total snapshots:'
82
+ snaps = cmd_output.split("\n").select { |s| !s.include? header_text }
83
+ snaps.map { |s| s.strip }
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+ end
90
+ end