Add snapshots to Hyper-V driver
This commit is contained in:
parent
c4fab86752
commit
df4caf0757
|
@ -207,6 +207,58 @@ module VagrantPlugins
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.action_snapshot_delete
|
||||||
|
Vagrant::Action::Builder.new.tap do |b|
|
||||||
|
b.use ConfigValidate
|
||||||
|
b.use Call, IsState, :not_created do |env, b2|
|
||||||
|
if env[:result]
|
||||||
|
b2.use Message, I18n.t("vagrant_hyperv.message_not_created")
|
||||||
|
next
|
||||||
|
end
|
||||||
|
|
||||||
|
b2.use SnapshotDelete
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.action_snapshot_restore
|
||||||
|
Vagrant::Action::Builder.new.tap do |b|
|
||||||
|
b.use ConfigValidate
|
||||||
|
b.use Call, IsState, :not_created do |env, b2|
|
||||||
|
if env[:result]
|
||||||
|
b2.use Message, I18n.t("vagrant_hyperv.message_not_created")
|
||||||
|
next
|
||||||
|
end
|
||||||
|
|
||||||
|
b2.use action_halt
|
||||||
|
b2.use SnapshotRestore
|
||||||
|
|
||||||
|
b2.use Call, IsEnvSet, :snapshot_delete do |env2, b3|
|
||||||
|
if env2[:result]
|
||||||
|
b3.use action_snapshot_delete
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
b2.use action_start
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.action_snapshot_save
|
||||||
|
Vagrant::Action::Builder.new.tap do |b|
|
||||||
|
b.use ConfigValidate
|
||||||
|
b.use Call, IsState, :not_created do |env, b2|
|
||||||
|
if env[:result]
|
||||||
|
b2.use Message, I18n.t("vagrant_hyperv.message_not_created")
|
||||||
|
next
|
||||||
|
end
|
||||||
|
b2.use SnapshotSave
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# The autoload farm
|
# The autoload farm
|
||||||
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
||||||
autoload :CheckEnabled, action_root.join("check_enabled")
|
autoload :CheckEnabled, action_root.join("check_enabled")
|
||||||
|
@ -222,6 +274,9 @@ module VagrantPlugins
|
||||||
autoload :NetSetVLan, action_root.join("net_set_vlan")
|
autoload :NetSetVLan, action_root.join("net_set_vlan")
|
||||||
autoload :NetSetMac, action_root.join("net_set_mac")
|
autoload :NetSetMac, action_root.join("net_set_mac")
|
||||||
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
|
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
|
||||||
|
autoload :SnapshotDelete, action_root.join("snapshot_delete")
|
||||||
|
autoload :SnapshotRestore, action_root.join("snapshot_restore")
|
||||||
|
autoload :SnapshotSave, action_root.join("snapshot_save")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module HyperV
|
||||||
|
module Action
|
||||||
|
class SnapshotDelete
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
|
||||||
|
env[:ui].info(I18n.t(
|
||||||
|
"vagrant.actions.vm.snapshot.deleting",
|
||||||
|
name: env[:snapshot_name]))
|
||||||
|
|
||||||
|
env[:machine].provider.driver.delete_snapshot(env[:snapshot_name])
|
||||||
|
|
||||||
|
env[:ui].success(I18n.t(
|
||||||
|
"vagrant.actions.vm.snapshot.deleted",
|
||||||
|
name: env[:snapshot_name]))
|
||||||
|
|
||||||
|
@app.call(env)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,23 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module HyperV
|
||||||
|
module Action
|
||||||
|
class SnapshotRestore
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
|
||||||
|
env[:ui].info(I18n.t(
|
||||||
|
"vagrant.actions.vm.snapshot.restoring",
|
||||||
|
name: env[:snapshot_name]))
|
||||||
|
|
||||||
|
env[:machine].provider.driver.restore_snapshot(env[:snapshot_name])
|
||||||
|
|
||||||
|
@app.call(env)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,27 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module HyperV
|
||||||
|
module Action
|
||||||
|
class SnapshotSave
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
|
||||||
|
env[:ui].info(I18n.t(
|
||||||
|
"vagrant.actions.vm.snapshot.saving",
|
||||||
|
name: env[:snapshot_name]))
|
||||||
|
|
||||||
|
env[:machine].provider.driver.create_snapshot(env[:snapshot_name])
|
||||||
|
|
||||||
|
env[:ui].success(I18n.t(
|
||||||
|
"vagrant.actions.vm.snapshot.saved",
|
||||||
|
name: env[:snapshot_name]))
|
||||||
|
|
||||||
|
@app.call(env)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,11 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module HyperV
|
||||||
|
module Cap
|
||||||
|
module SnapshotList
|
||||||
|
def self.snapshot_list(machine)
|
||||||
|
machine.provider.driver.list_snapshots
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -85,6 +85,23 @@ module VagrantPlugins
|
||||||
execute("set_network_mac.ps1", { VmId: vm_id, Mac: mac_addr })
|
execute("set_network_mac.ps1", { VmId: vm_id, Mac: mac_addr })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_snapshot(snapshot_name)
|
||||||
|
execute("create_snapshot.ps1", { VmId: vm_id, SnapName: (snapshot_name) } )
|
||||||
|
end
|
||||||
|
|
||||||
|
def restore_snapshot(snapshot_name)
|
||||||
|
execute("restore_snapshot.ps1", { VmId: vm_id, SnapName: (snapshot_name) } )
|
||||||
|
end
|
||||||
|
|
||||||
|
def list_snapshots()
|
||||||
|
snaps = execute("list_snapshots.ps1", { VmID: vm_id } )
|
||||||
|
snaps.map { |s| s['Name'] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_snapshot(snapshot_name)
|
||||||
|
execute("delete_snapshot.ps1", {VmID: vm_id, SnapName: snapshot_name})
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def execute_powershell(path, options, &block)
|
def execute_powershell(path, options, &block)
|
||||||
|
|
|
@ -27,6 +27,11 @@ module VagrantPlugins
|
||||||
Cap::PublicAddress
|
Cap::PublicAddress
|
||||||
end
|
end
|
||||||
|
|
||||||
|
provider_capability("hyperv", "snapshot_list") do
|
||||||
|
require_relative "cap/snapshot_list"
|
||||||
|
Cap::SnapshotList
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def self.init!
|
def self.init!
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
Param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$VmId,
|
||||||
|
[string]$SnapName
|
||||||
|
)
|
||||||
|
|
||||||
|
$VM = Get-VM -Id $VmId -ErrorAction "Stop"
|
||||||
|
Checkpoint-VM $VM -SnapshotName $SnapName
|
|
@ -0,0 +1,8 @@
|
||||||
|
Param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$VmId,
|
||||||
|
[string]$SnapName
|
||||||
|
)
|
||||||
|
|
||||||
|
$VM = Get-VM -Id $VmId -ErrorAction "Stop"
|
||||||
|
Remove-VMSnapshot $VM -Name $SnapName
|
|
@ -0,0 +1,12 @@
|
||||||
|
Param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$VmId
|
||||||
|
)
|
||||||
|
|
||||||
|
$VM = Get-VM -Id $VmId -ErrorAction "Stop"
|
||||||
|
$Snapshots = @(Get-VMSnapshot $VM | Select-Object Name)
|
||||||
|
$result = ConvertTo-json $Snapshots
|
||||||
|
|
||||||
|
Write-Host "===Begin-Output==="
|
||||||
|
Write-Host $result
|
||||||
|
Write-Host "===End-Output==="
|
|
@ -0,0 +1,8 @@
|
||||||
|
Param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$VmId,
|
||||||
|
[string]$SnapName
|
||||||
|
)
|
||||||
|
|
||||||
|
$VM = Get-VM -Id $VmId -ErrorAction "Stop"
|
||||||
|
Restore-VMSnapshot $VM -Name $SnapName -Confirm:$false
|
Loading…
Reference in New Issue