vagrant-vbox-snapshot 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/CHANGELOG.md +13 -0
- data/DEVNOTES.md +40 -0
- data/Gemfile +2 -0
- data/README.md +27 -11
- data/Vagrantfile +28 -0
- data/lib/vagrant-vbox-snapshot/commands/back.rb +2 -2
- data/lib/vagrant-vbox-snapshot/commands/delete.rb +8 -7
- data/lib/vagrant-vbox-snapshot/commands/go.rb +54 -9
- data/lib/vagrant-vbox-snapshot/commands/list.rb +1 -1
- data/lib/vagrant-vbox-snapshot/commands/multi_vm_args.rb +20 -0
- data/lib/vagrant-vbox-snapshot/commands/take.rb +8 -7
- data/lib/vagrant-vbox-snapshot/version.rb +1 -1
- metadata +11 -8
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NDU4ZmZkMTdlMjVjNzc5ZWMxNTIzZDYzNTViNDRkYThkODYzMmUyN2NkMzcx
|
10
|
-
NzBhNWI5ZGY5ZWExYTE5NGNmMWQ3NTY0YTY1YzJkN2I3MGJkMmMzMGY3NzZl
|
11
|
-
NTllMGU4M2Q2NGQwZWI1YTlmNDk1NzA5NDYyOTlhYjM2MWFlNTA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MTU2ZDY1NzgxOWM5YmUxNzYyZDg5Y2RhNmVhYTUxYTlhYTIzOGI5YjhiYzBj
|
14
|
-
NmQzNjE4Yjc5NzRmNDgxMWQ1OWRlZDExMGZiNTFjNDJkNzA4NjlhYmFiNWI4
|
15
|
-
NWMzMjdmZTgwNGM0MTMxZTkxYjUwZjYzMTEwYjMwMWY5MzNjZDE=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 59803a44c1dfd4762ad171ac328e8281b5b0798c
|
4
|
+
data.tar.gz: 8ff585dcf406ac9c1932310283c695dabc0a5a68
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2ff4aea7a11ac98f5f934c259e66723b3041fe3a57dd131873e6edda4f3a6da9c36f47d08458c391be3dd5bd914d36ebca5b3a47114644ea446e156cc37a3669
|
7
|
+
data.tar.gz: 35c4d93a36cb0c04e3074ce272ddfde3ec260105d15893cde898b372f5af0f979c5eb7117cf3703d7b0f92291c99ab8a76edaeaa08d201120b8c95424837842e
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
## [0.0.3](https://github.com/dergachev/vagrant-vbox-snapshot/compare/v0.0.2...v0.0.3) (Sep 3, 2013)
|
2
|
+
|
3
|
+
BACKWARDS INCOMPATIBILITIES:
|
4
|
+
|
5
|
+
- none
|
6
|
+
|
7
|
+
FEATURES:
|
8
|
+
|
9
|
+
- Add multi-vm support [#6](https://github.com/dergachev/vagrant-vbox-snapshot/pull/6)
|
10
|
+
|
11
|
+
IMPROVEMENTS:
|
12
|
+
|
13
|
+
- Run `vagrant reload` when restoring snapshots with changed config [#2](https://github.com/dergachev/vagrant-vbox-snapshot/issues/2)
|
data/DEVNOTES.md
CHANGED
@@ -26,3 +26,43 @@ Vagrant source code:
|
|
26
26
|
## other ideas related to snapshots
|
27
27
|
|
28
28
|
* http://code.chrisroberts.org/blog/2012/05/09/cooking-up-partial-run-lists-with-chef/
|
29
|
+
|
30
|
+
## Reviewing a pull request
|
31
|
+
|
32
|
+
```
|
33
|
+
git clone https://github.com/dergachev/vagrant-vbox-snapshot.git
|
34
|
+
cd vagrant-vbox-snapshot
|
35
|
+
# consider branching if you aren't sure about merging it (not the case here, of course!)
|
36
|
+
# git checkout dubious-pull-request
|
37
|
+
git pull https://github.com/fgrehm/vagrant-vbox-snapshot multi-vm-environments-support
|
38
|
+
# test, fix stuff, etc
|
39
|
+
git push -u origin master
|
40
|
+
```
|
41
|
+
|
42
|
+
## Pushing out a new release of the gem
|
43
|
+
|
44
|
+
```
|
45
|
+
# make commits
|
46
|
+
# consider creating/updating CHANGELOG.txt
|
47
|
+
vim lib/vagrant-vbox-snapshot/version.rb +/VERSION # increment version counter, eg to 0.0.3
|
48
|
+
gem build vagrant-vbox-snapshot.gemspec # creates vagrant-vbox-snapshot-0.0.3.gem
|
49
|
+
|
50
|
+
# test the gem locally, in a random vagrant project
|
51
|
+
cd ~/code/screengif
|
52
|
+
vagrant plugin uninstall vagrant-vbox-snapshot
|
53
|
+
vagrant plugin install ~/code/vagrant-vbox-snapshot/vagrant-vbox-snapshot-0.0.3.gem
|
54
|
+
# test it out, ensure basic sanity, eg for 0.0.3:
|
55
|
+
vagrant snapshot list -h
|
56
|
+
# cleanup
|
57
|
+
vagrant plugin uninstall
|
58
|
+
|
59
|
+
cd ~/code/vagrant-vbox-snapshot/
|
60
|
+
gem push vagrant-vbox-snapshot-0.0.3.gem
|
61
|
+
git tag 0.0.3
|
62
|
+
git push --tags
|
63
|
+
|
64
|
+
# test installing from rubygems
|
65
|
+
cd ~/code/screengif
|
66
|
+
vagrant plugin install vagrant-vbox-snapshot
|
67
|
+
vagrant plugin list
|
68
|
+
```
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,31 +12,47 @@ Ensure you have Vagrant 1.1+ installed, then run:
|
|
12
12
|
|
13
13
|
The following commands are added by this plugin:
|
14
14
|
|
15
|
-
vagrant snapshot take [NAME] # take snapshot, labeled by NAME
|
16
|
-
vagrant snapshot list # list snapshots
|
17
|
-
vagrant snapshot back # restore last taken snapshot
|
18
|
-
vagrant snapshot delete
|
19
|
-
vagrant snapshot go
|
15
|
+
vagrant snapshot take [vm-name] [NAME] # take snapshot, labeled by NAME
|
16
|
+
vagrant snapshot list [vm-name] # list snapshots
|
17
|
+
vagrant snapshot back [vm-name] # restore last taken snapshot
|
18
|
+
vagrant snapshot delete [vm-name] [NAME] # delete specified snapshot
|
19
|
+
vagrant snapshot go [vm-name] [NAME] # restore specified snapshot
|
20
20
|
|
21
21
|
## Caveats
|
22
22
|
|
23
23
|
* Not compatible with Vagrant <1.1. If you need this, try [another solution](#other-solutions).
|
24
|
-
* Does not support multiple VMs. (Pull requests encouraged).
|
25
24
|
* Only minimally tested.
|
26
25
|
|
27
26
|
## Other solutions
|
28
27
|
|
29
|
-
|
28
|
+
This plugin is primarily a port of vagrant-snap to Vagrant 1.1.
|
30
29
|
|
31
30
|
* [vagrant-snap](https://github.com/t9md/vagrant-snap)
|
32
|
-
-
|
33
|
-
- fork of above gist, with Vagrant 1.0.6 compatibility: https://gist.github.com/tombh/5142237
|
34
|
-
- [source](https://github.com/mitchellh/vagrant/issues/143#issuecomment-14781762)
|
35
|
-
- primary inspiration for vagrant-vbox-snapshot
|
31
|
+
- fork with Vagrant 1.0.4-1.0.7 compatibility: https://gist.github.com/tombh/5142237 [source](https://github.com/mitchellh/vagrant/issues/143#issuecomment-14781762)
|
36
32
|
* [sahara](https://github.com/jedi4ever/sahara)
|
37
33
|
- fork exists with 1.1 functionality: https://github.com/ryuzee/sahara
|
38
34
|
|
39
35
|
## Development
|
40
36
|
|
37
|
+
To develop on this plugin, do the following:
|
38
|
+
|
39
|
+
```
|
40
|
+
# get the repo, and then make a feature branch (REPLACE WITH YOUR FORK)
|
41
|
+
git clone https://github.com/dergachev/vagrant-vbox-snapshot.git
|
42
|
+
cd vagrant-vbox-snapshot
|
43
|
+
git checkout -b MY-NEW-FEATURE
|
44
|
+
|
45
|
+
# installs the vagrant gem, which is a dev dependency
|
46
|
+
bundle install
|
47
|
+
|
48
|
+
# hack on the plugin
|
49
|
+
vim lib/vagrant-vbox-snapshot.rb # or any other file
|
50
|
+
|
51
|
+
# test out your changes, in the context provided by the development vagrant gem, and the local Vagrantfile.
|
52
|
+
bundle exec vagrant snapshot ...
|
53
|
+
|
54
|
+
# commit, push, and do a pull-request
|
55
|
+
```
|
56
|
+
|
41
57
|
See [DEVNOTES.md](https://github.com/dergachev/vagrant-vbox-snapshot/blob/master/DEVNOTES.md)
|
42
58
|
for the notes I compiled while developing this plugin.
|
data/Vagrantfile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- mode: ruby -*-
|
3
|
+
# vi: set ft=ruby :
|
4
|
+
|
5
|
+
require_relative 'lib/vagrant-vbox-snapshot.rb'
|
6
|
+
|
7
|
+
Vagrant.configure("2") do |config|
|
8
|
+
|
9
|
+
TEST_MULTI_VM = false
|
10
|
+
TEST_SHARED_FOLDERS = false
|
11
|
+
|
12
|
+
if TEST_MULTI_VM
|
13
|
+
config.vm.define :web do |web|
|
14
|
+
web.vm.box = "precise64"
|
15
|
+
end
|
16
|
+
config.vm.define :db do |web|
|
17
|
+
web.vm.box = "precise64"
|
18
|
+
end
|
19
|
+
else
|
20
|
+
config.vm.box = "precise64"
|
21
|
+
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
|
22
|
+
end
|
23
|
+
|
24
|
+
if TEST_SHARED_FOLDERS
|
25
|
+
config.vm.synced_folder "/tmp", "/tmp/host-tmp"
|
26
|
+
config.vm.synced_folder "/tmp", "/tmp/host-tmp2"
|
27
|
+
end
|
28
|
+
end
|
@@ -8,13 +8,13 @@ module VagrantPlugins
|
|
8
8
|
opts = OptionParser.new do |opts|
|
9
9
|
opts.banner = "Back to current snapshot"
|
10
10
|
opts.separator ""
|
11
|
-
opts.separator "Usage: vagrant snapshot back"
|
11
|
+
opts.separator "Usage: vagrant snapshot back [vm-name]"
|
12
12
|
end
|
13
13
|
# Parse the options
|
14
14
|
argv = parse_options(opts)
|
15
15
|
return if !argv
|
16
16
|
|
17
|
-
with_target_vms do |machine|
|
17
|
+
with_target_vms(argv, single_target: true) do |machine|
|
18
18
|
vm_id = machine.id
|
19
19
|
system "VBoxManage snapshot #{vm_id} list --details"
|
20
20
|
system "VBoxManage controlvm #{vm_id} poweroff"
|
@@ -1,27 +1,28 @@
|
|
1
|
+
require_relative 'multi_vm_args'
|
2
|
+
|
1
3
|
module VagrantPlugins
|
2
4
|
module VBoxSnapshot
|
3
5
|
module Command
|
4
6
|
class Delete < Vagrant.plugin(2, :command)
|
7
|
+
include MultiVmArgs
|
8
|
+
|
5
9
|
def execute
|
6
10
|
options = {}
|
7
11
|
|
8
12
|
opts = OptionParser.new do |opts|
|
9
13
|
opts.banner = "Delete snapshot"
|
10
14
|
opts.separator ""
|
11
|
-
opts.separator "Usage: vagrant snapshot delete <SNAPSHOT_NAME>"
|
15
|
+
opts.separator "Usage: vagrant snapshot delete [vm-name] <SNAPSHOT_NAME>"
|
12
16
|
end
|
13
17
|
# Parse the options
|
14
18
|
argv = parse_options(opts)
|
15
19
|
return if !argv
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
return
|
20
|
-
end
|
21
|
+
vm_name, snapshot_name = parse_vm_and_snapshot_options(argv, opts)
|
22
|
+
return if !snapshot_name
|
21
23
|
|
22
|
-
with_target_vms do |machine|
|
24
|
+
with_target_vms(vm_name, single_target: true) do |machine|
|
23
25
|
vm_id = machine.id
|
24
|
-
snapshot_name = argv[0]
|
25
26
|
system "VBoxManage snapshot #{vm_id} delete #{snapshot_name}"
|
26
27
|
end
|
27
28
|
end
|
@@ -1,30 +1,75 @@
|
|
1
|
+
require_relative 'multi_vm_args'
|
2
|
+
|
1
3
|
module VagrantPlugins
|
2
4
|
module VBoxSnapshot
|
3
5
|
module Command
|
4
6
|
class Go < Vagrant.plugin(2, :command)
|
7
|
+
include MultiVmArgs
|
8
|
+
|
9
|
+
def get_shared_folders(vm_id)
|
10
|
+
shared_folders = []
|
11
|
+
info = `VBoxManage showvminfo #{vm_id} --machinereadable`
|
12
|
+
info.split("\n").each do |line|
|
13
|
+
if line =~ /^SharedFolderNameMachineMapping\d+="(.+?)"$/
|
14
|
+
shared_folders << $1.to_s
|
15
|
+
end
|
16
|
+
end
|
17
|
+
return shared_folders
|
18
|
+
end
|
19
|
+
|
20
|
+
def before_restore(vm_id)
|
21
|
+
@shared_folders_before = get_shared_folders(vm_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def after_restore(vm_id)
|
25
|
+
@shared_folders_after = get_shared_folders(vm_id)
|
26
|
+
if @shared_folders_before != @shared_folders_after
|
27
|
+
missing_folders = @shared_folders_before - @shared_folders_after
|
28
|
+
@env.ui.warn("Synced folders have changed after restoring snapshot. Consider running 'vagrant reload'.")
|
29
|
+
@env.ui.warn(" Before restore: #{@shared_folders_before}")
|
30
|
+
@env.ui.warn(" After restore: #{@shared_folders_after}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
5
34
|
def execute
|
6
35
|
options = {}
|
36
|
+
options[:reload] = false
|
7
37
|
|
8
38
|
opts = OptionParser.new do |opts|
|
9
39
|
opts.banner = "Go to specified snapshot"
|
10
40
|
opts.separator ""
|
11
|
-
opts.separator "Usage: vagrant snapshot go <SNAPSHOT_NAME>"
|
41
|
+
opts.separator "Usage: vagrant snapshot go [vm-name] <SNAPSHOT_NAME>"
|
42
|
+
|
43
|
+
opts.on("-r", "--reload", "Runs 'vagrant reload --no-provision' after restoring snapshot to ensure Vagrantfile config is applied.") do |reload|
|
44
|
+
options[:reload] = reload
|
45
|
+
end
|
46
|
+
|
12
47
|
end
|
13
48
|
# Parse the options
|
14
49
|
argv = parse_options(opts)
|
15
50
|
return if !argv
|
16
51
|
|
17
|
-
|
18
|
-
|
19
|
-
return
|
20
|
-
end
|
52
|
+
vm_name, snapshot_name = parse_vm_and_snapshot_options(argv, opts)
|
53
|
+
return if !snapshot_name
|
21
54
|
|
22
|
-
with_target_vms do |machine|
|
55
|
+
with_target_vms(vm_name, single_target: true) do |machine|
|
23
56
|
vm_id = machine.id
|
24
|
-
|
57
|
+
|
58
|
+
before_restore(vm_id)
|
59
|
+
|
25
60
|
system "VBoxManage controlvm #{vm_id} poweroff"
|
26
|
-
system "VBoxManage snapshot
|
27
|
-
|
61
|
+
system "VBoxManage snapshot #{vm_id} restore #{snapshot_name}"
|
62
|
+
|
63
|
+
if options[:reload]
|
64
|
+
@env.ui.info("Reloading VM")
|
65
|
+
machine.action(:reload, :provision_enabled => false)
|
66
|
+
else
|
67
|
+
@env.ui.info("Starting VM from restored snapshot (#{snapshot_name})")
|
68
|
+
@logger.info("starting VM")
|
69
|
+
system "VBoxManage startvm #{vm_id} --type headless"
|
70
|
+
end
|
71
|
+
|
72
|
+
after_restore(vm_id)
|
28
73
|
end
|
29
74
|
end
|
30
75
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VBoxSnapshot
|
3
|
+
module Command
|
4
|
+
module MultiVmArgs
|
5
|
+
def parse_vm_and_snapshot_options(argv, opts)
|
6
|
+
unless [1, 2].include?(argv.size)
|
7
|
+
@env.ui.info(opts.help, :prefix => false)
|
8
|
+
return
|
9
|
+
end
|
10
|
+
|
11
|
+
if argv.size == 1
|
12
|
+
[nil, argv[0]]
|
13
|
+
else
|
14
|
+
[argv[0], argv[1]]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,27 +1,28 @@
|
|
1
|
+
require_relative 'multi_vm_args'
|
2
|
+
|
1
3
|
module VagrantPlugins
|
2
4
|
module VBoxSnapshot
|
3
5
|
module Command
|
4
6
|
class Take < Vagrant.plugin(2, :command)
|
7
|
+
include MultiVmArgs
|
8
|
+
|
5
9
|
def execute
|
6
10
|
options = {}
|
7
11
|
|
8
12
|
opts = OptionParser.new do |opts|
|
9
13
|
opts.banner = "Take snapshot"
|
10
14
|
opts.separator ""
|
11
|
-
opts.separator "Usage: vagrant snapshot take <SNAPSHOT_NAME>"
|
15
|
+
opts.separator "Usage: vagrant snapshot take [vm-name] <SNAPSHOT_NAME>"
|
12
16
|
end
|
13
17
|
# Parse the options
|
14
18
|
argv = parse_options(opts)
|
15
19
|
return if !argv
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
return
|
20
|
-
end
|
21
|
+
vm_name, snapshot_name = parse_vm_and_snapshot_options(argv, opts)
|
22
|
+
return if !snapshot_name
|
21
23
|
|
22
|
-
with_target_vms do |machine|
|
24
|
+
with_target_vms(vm_name, single_target: true) do |machine|
|
23
25
|
vm_id = machine.id
|
24
|
-
snapshot_name = argv[0]
|
25
26
|
system "VBoxManage snapshot #{vm_id} take #{snapshot_name} --pause"
|
26
27
|
end
|
27
28
|
end
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-vbox-snapshot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Dergachev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: Vagrant plugin that exposes the `VBoxManage snapshot` command.
|
@@ -45,15 +45,18 @@ extensions: []
|
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
47
|
- .gitignore
|
48
|
+
- CHANGELOG.md
|
48
49
|
- DEVNOTES.md
|
49
50
|
- Gemfile
|
50
51
|
- README.md
|
51
52
|
- Rakefile
|
53
|
+
- Vagrantfile
|
52
54
|
- lib/vagrant-vbox-snapshot.rb
|
53
55
|
- lib/vagrant-vbox-snapshot/commands/back.rb
|
54
56
|
- lib/vagrant-vbox-snapshot/commands/delete.rb
|
55
57
|
- lib/vagrant-vbox-snapshot/commands/go.rb
|
56
58
|
- lib/vagrant-vbox-snapshot/commands/list.rb
|
59
|
+
- lib/vagrant-vbox-snapshot/commands/multi_vm_args.rb
|
57
60
|
- lib/vagrant-vbox-snapshot/commands/root.rb
|
58
61
|
- lib/vagrant-vbox-snapshot/commands/take.rb
|
59
62
|
- lib/vagrant-vbox-snapshot/plugin.rb
|
@@ -69,12 +72,12 @@ require_paths:
|
|
69
72
|
- lib
|
70
73
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
74
|
requirements:
|
72
|
-
- -
|
75
|
+
- - '>='
|
73
76
|
- !ruby/object:Gem::Version
|
74
77
|
version: '0'
|
75
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
79
|
requirements:
|
77
|
-
- -
|
80
|
+
- - '>='
|
78
81
|
- !ruby/object:Gem::Version
|
79
82
|
version: '0'
|
80
83
|
requirements: []
|