vagrant-multiprovider-snap 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +5 -0
  4. data/lib/vagrant-multiprovider-snap/command/delete.rb +52 -0
  5. data/lib/vagrant-multiprovider-snap/command/root.rb +5 -0
  6. data/lib/vagrant-multiprovider-snap/plugin.rb +3 -0
  7. data/lib/vagrant-multiprovider-snap/providers/hyperv/action.rb +78 -0
  8. data/lib/vagrant-multiprovider-snap/providers/hyperv/action/has_snapshot.rb +31 -0
  9. data/lib/vagrant-multiprovider-snap/providers/hyperv/action/message_snapshot_not_created.rb +33 -0
  10. data/lib/vagrant-multiprovider-snap/providers/hyperv/action/message_snapshot_not_deleted.rb +27 -0
  11. data/lib/vagrant-multiprovider-snap/providers/hyperv/action/snapshot_delete.rb +31 -0
  12. data/lib/vagrant-multiprovider-snap/providers/hyperv/action/snapshot_rollback.rb +29 -0
  13. data/lib/vagrant-multiprovider-snap/providers/hyperv/action/snapshot_take.rb +28 -0
  14. data/lib/vagrant-multiprovider-snap/providers/hyperv/driver/base.rb +91 -0
  15. data/lib/vagrant-multiprovider-snap/providers/hyperv/driver/scripts/list_snapshots.ps1 +12 -0
  16. data/lib/vagrant-multiprovider-snap/providers/hyperv/driver/scripts/rollback_vm.ps1 +8 -0
  17. data/lib/vagrant-multiprovider-snap/providers/hyperv/driver/scripts/snapshot_delete.ps1 +8 -0
  18. data/lib/vagrant-multiprovider-snap/providers/hyperv/driver/scripts/snapshot_vm.ps1 +8 -0
  19. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action.rb +26 -0
  20. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action/has_snapshot.rb +5 -1
  21. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action/message_snapshot_not_created.rb +7 -1
  22. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action/message_snapshot_not_deleted.rb +29 -0
  23. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action/snapshot_delete.rb +31 -0
  24. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action/snapshot_rollback.rb +10 -2
  25. data/lib/vagrant-multiprovider-snap/providers/virtualbox/action/snapshot_take.rb +8 -1
  26. data/lib/vagrant-multiprovider-snap/providers/virtualbox/driver/base.rb +10 -2
  27. data/lib/vagrant-multiprovider-snap/providers/virtualbox/driver/meta.rb +1 -0
  28. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action.rb +26 -0
  29. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action/has_snapshot.rb +7 -1
  30. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action/message_snapshot_not_created.rb +7 -1
  31. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action/message_snapshot_not_deleted.rb +29 -0
  32. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action/snapshot_delete.rb +31 -0
  33. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action/snapshot_rollback.rb +17 -7
  34. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/action/snapshot_take.rb +8 -1
  35. data/lib/vagrant-multiprovider-snap/providers/vmware_fusion/driver/base.rb +12 -4
  36. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action.rb +20 -0
  37. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action/has_snapshot.rb +5 -1
  38. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action/message_snapshot_not_created.rb +7 -1
  39. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action/message_snapshot_not_deleted.rb +29 -0
  40. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action/snapshot_delete.rb +31 -0
  41. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action/snapshot_rollback.rb +15 -5
  42. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/action/snapshot_take.rb +8 -1
  43. data/lib/vagrant-multiprovider-snap/providers/vmware_workstation/driver/base.rb +10 -2
  44. data/lib/vagrant-multiprovider-snap/version.rb +1 -1
  45. data/locales/en.yml +23 -6
  46. metadata +21 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02da544bcb07fe508d365dc393528b7a7b656318
4
- data.tar.gz: c9d8a12e14ab03ebe0423f53fe947501044f4f9f
3
+ metadata.gz: b8535b4c78d8d27d50dc47ef1e24783f955a260c
4
+ data.tar.gz: f3818f62f0f5e6009a9b950714faf4c39039854f
5
5
  SHA512:
6
- metadata.gz: 2a21eed86cf3b8d3d3a3d487d9021d78f46d504694477ad37b56bec79d548c7e9b11d8039a23b1c67c752a169f4685f6b4f891e9c67f4b27e875ef303cf7eb4d
7
- data.tar.gz: 42954d9edf17c022c715ff5013b06fdfe5af9e762e6a292a981c7fde93916d6315498546cc6a75086c66aeae1a907fa28167d462ca8eb5de212475e54dd9315f
6
+ metadata.gz: 79356318a909944fff35bfa1517b325a0550030b4f5ee79da628532bd82c5a43de7301dc976ec27559bc5bf14ffdec2c6249e7236f3a044d6ffbdf85f6edaf8f
7
+ data.tar.gz: d2475efd23f11451b3218833f7cb8eef67a540b2a0b137c1328c6e980a3bfb8e1a38e496a11ac7ecfcf00996040c3dc9edabe976a52de1933c12abe86e511c50
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.0.13 (September 28, 2014)
2
+
3
+ - Support for Snapshot deletion
4
+ - Fix bug causing VMWare Fusion VMs to always open GUI on rollback
5
+ - Support for Hyper-V provider
6
+
1
7
  ## 0.0.12 (August 10, 2014)
2
8
 
3
9
  - Support named snapshots and arbitrary rollback
data/README.md CHANGED
@@ -10,6 +10,7 @@ running Vagrant boxes. It currently supports the following providers:
10
10
  * VirtualBox
11
11
  * VMWare Fusion (via the commercial VMWare plugin)
12
12
  * VMWare Workstation (via the commercial VMWare plugin)
13
+ * Hyper-V
13
14
 
14
15
 
15
16
  Installation
@@ -45,6 +46,10 @@ Roll back to a named snapshot:
45
46
 
46
47
  vagrant snap rollback [vm] --name=snap01
47
48
 
49
+ Delete a snapshot
50
+
51
+ vagrant snap delete [vm] --name=snap01
52
+
48
53
  Limitations
49
54
  -----------
50
55
 
@@ -0,0 +1,52 @@
1
+ require 'optparse'
2
+ require 'vagrant'
3
+
4
+ module VagrantSnap
5
+
6
+ module Command
7
+
8
+ class Delete < Vagrant.plugin("2", :command)
9
+
10
+ def execute
11
+
12
+ options = {}
13
+ options[:snap_name] = nil
14
+
15
+ opts = OptionParser.new do |o|
16
+
17
+ o.banner = "Usage: vagrant snap delete [vm-name] --name=<snapname>"
18
+ o.separator ""
19
+
20
+ o.on("--name SNAPNAME", "Snapshot to delete - mandatory option") do |n|
21
+ options[:snap_name] = n
22
+ end
23
+
24
+ end
25
+
26
+ begin
27
+
28
+ argv = parse_options(opts)
29
+ return if !argv
30
+ raise OptionParser::MissingArgument if options[:snap_name].nil?
31
+
32
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument
33
+ puts $!.to_s
34
+ puts opts
35
+ return false
36
+ end
37
+
38
+ with_target_vms(argv) do |vm|
39
+
40
+ vm.action(:snapshot_delete, :snap_name => options[:snap_name])
41
+
42
+ end
43
+
44
+ 0
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -19,6 +19,11 @@ module VagrantSnap
19
19
  Take
20
20
  end
21
21
 
22
+ @subcommands.register(:delete) do
23
+ require_relative "delete"
24
+ Delete
25
+ end
26
+
22
27
  @subcommands.register(:rollback) do
23
28
  require_relative "rollback"
24
29
  Rollback
@@ -9,6 +9,9 @@ module VagrantSnap
9
9
  require_relative "providers/virtualbox/driver/base"
10
10
  require_relative "providers/virtualbox/driver/meta"
11
11
 
12
+ require_relative "providers/hyperv/action"
13
+ require_relative "providers/hyperv/driver/base"
14
+
12
15
  begin
13
16
 
14
17
  # Make sure the fusion plugin is installed (explicitly
@@ -0,0 +1,78 @@
1
+ require "vagrant/action/builder"
2
+
3
+ module VagrantPlugins
4
+
5
+ module HyperV
6
+
7
+ module Action
8
+
9
+ autoload :SnapshotTake, File.expand_path("../action/snapshot_take.rb", __FILE__)
10
+ autoload :SnapshotDelete, File.expand_path("../action/snapshot_delete.rb", __FILE__)
11
+ autoload :SnapshotRollback, File.expand_path("../action/snapshot_rollback.rb", __FILE__)
12
+ autoload :HasSnapshot, File.expand_path("../action/has_snapshot.rb", __FILE__)
13
+ autoload :MessageSnapshotNotDeleted, File.expand_path("../action/message_snapshot_not_deleted.rb", __FILE__)
14
+ autoload :MessageSnapshotNotCreated, File.expand_path("../action/message_snapshot_not_created.rb", __FILE__)
15
+
16
+ def self.action_snapshot_take
17
+ Vagrant::Action::Builder.new.tap do |b|
18
+ b.use HandleBox
19
+ b.use Call, IsState, :not_created do |env, b1|
20
+ if env[:result]
21
+ b1.use Message, I18n.t("vagrant_hyperv.message_not_created")
22
+ next
23
+ end
24
+
25
+ b1.use SnapshotTake
26
+ end
27
+ end
28
+ end
29
+
30
+ def self.action_snapshot_delete
31
+ Vagrant::Action::Builder.new.tap do |b|
32
+ b.use HandleBox
33
+ b.use Call, IsState, :not_created do |env, b1|
34
+
35
+ if env[:result]
36
+ b1.use Message, I18n.t("vagrant_hyperv.message_not_created")
37
+ next
38
+ end
39
+
40
+ b1.use Call, HasSnapshot do |env1, b2|
41
+ if env1[:result]
42
+ b2.use Call, SnapshotDelete do |env2,b3|
43
+ if env2[:result]
44
+ b3.use MessageSnapshotNotDeleted
45
+ end
46
+ end
47
+ else
48
+ b2.use MessageSnapshotNotCreated
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+
56
+ def self.action_snapshot_rollback
57
+ Vagrant::Action::Builder.new.tap do |b|
58
+ b.use HandleBox
59
+ b.use Call, IsState, :not_created do |env, b1|
60
+ if env[:result]
61
+ b1.use Message, I18n.t("vagrant_hyperv.message_not_created")
62
+ next
63
+ end
64
+
65
+ b1.use SnapshotRollback
66
+ b1.use WaitForIPAddress
67
+ b1.use WaitForCommunicator, [:running]
68
+ end
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+
@@ -0,0 +1,31 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ module Action
6
+
7
+ class HasSnapshot
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+
15
+ if env[:snap_name].nil?
16
+ env[:result] = env[:machine].provider.driver.has_snapshot?
17
+ else
18
+ env[:result] = env[:machine].provider.driver.has_snapshot?(env[:snap_name])
19
+ end
20
+
21
+ @app.call(env)
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,33 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ module Action
6
+
7
+ class MessageSnapshotNotCreated
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+
15
+ if env[:snap_name].nil?
16
+ env[:ui].info I18n.t("vagrant_snap.actions.vm.snapshot_not_created")
17
+ else
18
+ env[:ui].info I18n.t("vagrant_snap.actions.vm.snapshot_not_created.named_not_exist",
19
+ :snapshot => env[:snap_name]
20
+ )
21
+ end
22
+
23
+ @app.call(env)
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,27 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ module Action
6
+
7
+ class MessageSnapshotNotDeleted
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+
15
+ env[:ui].info I18n.t("vagrant_snap.actions.vm.snapshot_not_deleted")
16
+
17
+ @app.call(env)
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,31 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ module Action
6
+
7
+ class SnapshotDelete
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+
15
+ env[:ui].info(I18n.t("vagrant_snap.actions.vm.snapshot_delete.deleting",
16
+ :snapshot => env[:snap_name]),
17
+ )
18
+
19
+ env[:result] = env[:machine].provider.driver.snapshot_delete(env[:snap_name])
20
+
21
+ @app.call(env)
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,29 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ module Action
6
+
7
+ class SnapshotRollback
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+
15
+ env[:ui].info I18n.t("vagrant_snap.actions.vm.snapshot_rollback.rolling_back")
16
+
17
+ env[:machine].provider.driver.snapshot_rollback(env[:snap_name])
18
+
19
+ @app.call(env)
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,28 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ module Action
6
+
7
+ class SnapshotTake
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+
15
+ env[:ui].info I18n.t("vagrant_snap.actions.vm.snapshot_take.taking")
16
+ env[:machine].provider.driver.snapshot_take(env[:snap_name])
17
+
18
+ @app.call(env)
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,91 @@
1
+ module VagrantPlugins
2
+
3
+ module HyperV
4
+
5
+ class Driver
6
+
7
+ def snapshot_take(name)
8
+ execute_snap("snapshot_vm.ps1", { VmId: vm_id, SnapName: (name || "vagrant-snap-#{Time.now.to_i}") } )
9
+ end
10
+
11
+ def snapshot_rollback(name)
12
+ execute_snap("rollback_vm.ps1", { VmId: vm_id, SnapName: (name || snapshot_list.last) } )
13
+ end
14
+
15
+ def snapshot_list
16
+ snaps = execute_snap("list_snapshots.ps1", { VmID: vm_id } )
17
+ snaps.map { |s| s['Name'] }
18
+ end
19
+
20
+ def snapshot_delete(name)
21
+ execute_snap("snapshot_delete.ps1", {VmID: vm_id, SnapName: name})
22
+ end
23
+
24
+ def has_snapshot?(name=nil)
25
+ if name.nil?
26
+ snapshot_list.length > 0
27
+ else
28
+ snapshot_list.include?(name)
29
+ end
30
+ end
31
+
32
+ protected
33
+
34
+ # These methods copied and modified from existing hyperv driver
35
+ # TODO: think about how we might refactor upstream to support
36
+ # this properly.
37
+
38
+ def execute_snap(path, options)
39
+
40
+ r = execute_snap_powershell(path, options)
41
+ if r.exit_code != 0
42
+ raise Errors::PowerShellError,
43
+ script: path,
44
+ stderr: r.stderr
45
+ end
46
+
47
+ # We only want unix-style line endings within Vagrant
48
+ r.stdout.gsub!("\r\n", "\n")
49
+ r.stderr.gsub!("\r\n", "\n")
50
+
51
+ error_match = ERROR_REGEXP.match(r.stdout)
52
+ output_match = OUTPUT_REGEXP.match(r.stdout)
53
+
54
+ if error_match
55
+ data = JSON.parse(error_match[1])
56
+
57
+ # We have some error data.
58
+ raise Errors::PowerShellError,
59
+ script: path,
60
+ stderr: data["error"]
61
+ end
62
+
63
+ # Nothing
64
+ return nil if !output_match
65
+ return JSON.parse(output_match[1])
66
+
67
+ end
68
+
69
+ def execute_snap_powershell(path, options, &block)
70
+ lib_path = Pathname.new(File.expand_path("../scripts", __FILE__))
71
+ path = lib_path.join(path).to_s.gsub("/", "\\")
72
+ options = options || {}
73
+ ps_options = []
74
+ options.each do |key, value|
75
+ ps_options << "-#{key}"
76
+ ps_options << "'#{value}'"
77
+ end
78
+
79
+ # Always have a stop error action for failures
80
+ ps_options << "-ErrorAction" << "Stop"
81
+
82
+ opts = { notify: [:stdout, :stderr, :stdin] }
83
+ Vagrant::Util::PowerShell.execute(path, *ps_options, **opts, &block)
84
+ end
85
+
86
+
87
+ end
88
+
89
+ end
90
+
91
+ end