vagrant 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -0
- data/config/default.rb +6 -6
- data/lib/vagrant.rb +6 -3
- data/lib/vagrant/action.rb +77 -0
- data/lib/vagrant/action/action_exception.rb +16 -0
- data/lib/vagrant/action/box/destroy.rb +19 -0
- data/lib/vagrant/action/box/download.rb +78 -0
- data/lib/vagrant/action/box/unpackage.rb +58 -0
- data/lib/vagrant/action/box/verify.rb +23 -0
- data/lib/vagrant/action/builder.rb +151 -0
- data/lib/vagrant/action/builtin.rb +114 -0
- data/lib/vagrant/action/env/error_halt.rb +16 -0
- data/lib/vagrant/action/env/set.rb +18 -0
- data/lib/vagrant/action/environment.rb +98 -0
- data/lib/vagrant/action/exception_catcher.rb +14 -0
- data/lib/vagrant/action/vm/boot.rb +54 -0
- data/lib/vagrant/action/vm/check_box.rb +27 -0
- data/lib/vagrant/action/vm/check_guest_additions.rb +32 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +39 -0
- data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +32 -0
- data/lib/vagrant/action/vm/customize.rb +21 -0
- data/lib/vagrant/action/vm/destroy.rb +20 -0
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +35 -0
- data/lib/vagrant/action/vm/disable_networks.rb +26 -0
- data/lib/vagrant/action/vm/export.rb +53 -0
- data/lib/vagrant/action/vm/forward_ports.rb +121 -0
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
- data/lib/vagrant/action/vm/halt.rb +34 -0
- data/lib/vagrant/action/vm/import.rb +33 -0
- data/lib/vagrant/action/vm/match_mac_address.rb +19 -0
- data/lib/vagrant/{actions → action}/vm/network.rb +47 -55
- data/lib/vagrant/action/vm/nfs.rb +161 -0
- data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
- data/lib/vagrant/action/vm/package.rb +99 -0
- data/lib/vagrant/action/vm/persist.rb +22 -0
- data/lib/vagrant/action/vm/provision.rb +50 -0
- data/lib/vagrant/action/vm/resume.rb +20 -0
- data/lib/vagrant/{actions/vm/shared_folders.rb → action/vm/share_folders.rb} +48 -45
- data/lib/vagrant/action/vm/suspend.rb +20 -0
- data/lib/vagrant/box.rb +3 -7
- data/lib/vagrant/commands/base.rb +1 -3
- data/lib/vagrant/commands/package.rb +4 -9
- data/lib/vagrant/commands/up.rb +0 -2
- data/lib/vagrant/config.rb +15 -1
- data/lib/vagrant/downloaders/file.rb +1 -1
- data/lib/vagrant/downloaders/http.rb +2 -1
- data/lib/vagrant/environment.rb +18 -14
- data/lib/vagrant/hosts/base.rb +77 -0
- data/lib/vagrant/hosts/bsd.rb +53 -0
- data/lib/vagrant/hosts/linux.rb +52 -0
- data/lib/vagrant/provisioners/base.rb +17 -9
- data/lib/vagrant/provisioners/chef.rb +1 -1
- data/lib/vagrant/provisioners/chef_server.rb +4 -8
- data/lib/vagrant/provisioners/chef_solo.rb +1 -2
- data/lib/vagrant/ssh.rb +12 -4
- data/lib/vagrant/systems/base.rb +4 -0
- data/lib/vagrant/systems/linux.rb +12 -1
- data/lib/vagrant/util.rb +16 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/plain_logger.rb +11 -0
- data/lib/vagrant/util/platform.rb +18 -0
- data/lib/vagrant/util/resource_logger.rb +128 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant/vm.rb +10 -12
- data/templates/chef_solo_solo.erb +2 -1
- data/templates/nfs/exports.erb +3 -0
- data/templates/nfs/exports_linux.erb +3 -0
- data/templates/strings.yml +23 -3
- metadata +128 -198
- data/.gitignore +0 -11
- data/Gemfile +0 -18
- data/Rakefile +0 -41
- data/VERSION +0 -1
- data/bin/.gitignore +0 -0
- data/lib/vagrant/actions/base.rb +0 -130
- data/lib/vagrant/actions/box/add.rb +0 -23
- data/lib/vagrant/actions/box/destroy.rb +0 -14
- data/lib/vagrant/actions/box/download.rb +0 -67
- data/lib/vagrant/actions/box/unpackage.rb +0 -42
- data/lib/vagrant/actions/box/verify.rb +0 -32
- data/lib/vagrant/actions/collection.rb +0 -36
- data/lib/vagrant/actions/runner.rb +0 -131
- data/lib/vagrant/actions/vm/boot.rb +0 -43
- data/lib/vagrant/actions/vm/customize.rb +0 -19
- data/lib/vagrant/actions/vm/destroy.rb +0 -24
- data/lib/vagrant/actions/vm/down.rb +0 -22
- data/lib/vagrant/actions/vm/export.rb +0 -45
- data/lib/vagrant/actions/vm/forward_ports.rb +0 -134
- data/lib/vagrant/actions/vm/halt.rb +0 -24
- data/lib/vagrant/actions/vm/import.rb +0 -23
- data/lib/vagrant/actions/vm/move_hard_drive.rb +0 -51
- data/lib/vagrant/actions/vm/package.rb +0 -94
- data/lib/vagrant/actions/vm/provision.rb +0 -49
- data/lib/vagrant/actions/vm/reload.rb +0 -17
- data/lib/vagrant/actions/vm/resume.rb +0 -16
- data/lib/vagrant/actions/vm/start.rb +0 -26
- data/lib/vagrant/actions/vm/suspend.rb +0 -16
- data/lib/vagrant/actions/vm/up.rb +0 -53
- data/lib/vagrant/busy.rb +0 -79
- data/lib/vagrant/resource_logger.rb +0 -126
- data/lib/vagrant/util/error_helper.rb +0 -13
- data/lib/vagrant/util/output_helper.rb +0 -9
- data/test/test_helper.rb +0 -149
- data/test/vagrant/actions/base_test.rb +0 -32
- data/test/vagrant/actions/box/add_test.rb +0 -36
- data/test/vagrant/actions/box/destroy_test.rb +0 -17
- data/test/vagrant/actions/box/download_test.rb +0 -137
- data/test/vagrant/actions/box/unpackage_test.rb +0 -99
- data/test/vagrant/actions/box/verify_test.rb +0 -44
- data/test/vagrant/actions/collection_test.rb +0 -113
- data/test/vagrant/actions/runner_test.rb +0 -268
- data/test/vagrant/actions/vm/boot_test.rb +0 -49
- data/test/vagrant/actions/vm/customize_test.rb +0 -21
- data/test/vagrant/actions/vm/destroy_test.rb +0 -37
- data/test/vagrant/actions/vm/down_test.rb +0 -39
- data/test/vagrant/actions/vm/export_test.rb +0 -88
- data/test/vagrant/actions/vm/forward_ports_test.rb +0 -253
- data/test/vagrant/actions/vm/halt_test.rb +0 -65
- data/test/vagrant/actions/vm/import_test.rb +0 -45
- data/test/vagrant/actions/vm/move_hard_drive_test.rb +0 -106
- data/test/vagrant/actions/vm/network_test.rb +0 -291
- data/test/vagrant/actions/vm/package_test.rb +0 -254
- data/test/vagrant/actions/vm/provision_test.rb +0 -99
- data/test/vagrant/actions/vm/reload_test.rb +0 -46
- data/test/vagrant/actions/vm/resume_test.rb +0 -26
- data/test/vagrant/actions/vm/shared_folders_test.rb +0 -211
- data/test/vagrant/actions/vm/start_test.rb +0 -73
- data/test/vagrant/actions/vm/suspend_test.rb +0 -26
- data/test/vagrant/actions/vm/up_test.rb +0 -96
- data/test/vagrant/active_list_test.rb +0 -173
- data/test/vagrant/box_test.rb +0 -154
- data/test/vagrant/busy_test.rb +0 -78
- data/test/vagrant/command_test.rb +0 -53
- data/test/vagrant/commands/base_test.rb +0 -139
- data/test/vagrant/commands/box/add_test.rb +0 -34
- data/test/vagrant/commands/box/list_test.rb +0 -32
- data/test/vagrant/commands/box/remove_test.rb +0 -41
- data/test/vagrant/commands/destroy_test.rb +0 -44
- data/test/vagrant/commands/halt_test.rb +0 -50
- data/test/vagrant/commands/init_test.rb +0 -55
- data/test/vagrant/commands/package_test.rb +0 -104
- data/test/vagrant/commands/provision_test.rb +0 -60
- data/test/vagrant/commands/reload_test.rb +0 -44
- data/test/vagrant/commands/resume_test.rb +0 -44
- data/test/vagrant/commands/ssh_config_test.rb +0 -77
- data/test/vagrant/commands/ssh_test.rb +0 -129
- data/test/vagrant/commands/status_test.rb +0 -40
- data/test/vagrant/commands/suspend_test.rb +0 -44
- data/test/vagrant/commands/up_test.rb +0 -47
- data/test/vagrant/config_test.rb +0 -287
- data/test/vagrant/downloaders/base_test.rb +0 -28
- data/test/vagrant/downloaders/file_test.rb +0 -33
- data/test/vagrant/downloaders/http_test.rb +0 -62
- data/test/vagrant/environment_test.rb +0 -770
- data/test/vagrant/provisioners/base_test.rb +0 -33
- data/test/vagrant/provisioners/chef_server_test.rb +0 -176
- data/test/vagrant/provisioners/chef_solo_test.rb +0 -183
- data/test/vagrant/provisioners/chef_test.rb +0 -175
- data/test/vagrant/resource_logger_test.rb +0 -145
- data/test/vagrant/ssh_session_test.rb +0 -46
- data/test/vagrant/ssh_test.rb +0 -296
- data/test/vagrant/systems/linux_test.rb +0 -179
- data/test/vagrant/util/error_helper_test.rb +0 -5
- data/test/vagrant/util/output_helper_test.rb +0 -5
- data/test/vagrant/util/plain_logger_test.rb +0 -17
- data/test/vagrant/util/platform_test.rb +0 -18
- data/test/vagrant/util/stacked_proc_runner_test.rb +0 -43
- data/test/vagrant/util/template_renderer_test.rb +0 -144
- data/test/vagrant/util/translator_test.rb +0 -61
- data/test/vagrant/util_test.rb +0 -27
- data/test/vagrant/vm_test.rb +0 -235
- data/vagrant.gemspec +0 -291
data/.gitignore
DELETED
data/Gemfile
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
source "http://rubygems.org"
|
2
|
-
|
3
|
-
# Gems required for the lib to even run
|
4
|
-
gem "virtualbox", :git => "git://github.com/mitchellh/virtualbox.git"
|
5
|
-
gem "net-ssh", ">= 2.0.19"
|
6
|
-
gem "net-scp", ">= 1.0.2"
|
7
|
-
gem "json", ">= 1.2.4"
|
8
|
-
gem "archive-tar-minitar", "= 0.5.2"
|
9
|
-
gem "mario", "~> 0.0.6"
|
10
|
-
|
11
|
-
# Gems required for testing only. To install run
|
12
|
-
# gem bundle test
|
13
|
-
group :test do
|
14
|
-
gem "contest", ">= 0.1.2"
|
15
|
-
gem "mocha"
|
16
|
-
gem "ruby-debug", ">= 0.10.3" if RUBY_VERSION < '1.9'
|
17
|
-
gem "jeweler", "~> 1.4.0"
|
18
|
-
end
|
data/Rakefile
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'rake/testtask'
|
2
|
-
|
3
|
-
begin
|
4
|
-
require 'jeweler'
|
5
|
-
Jeweler::Tasks.new do |gemspec|
|
6
|
-
gemspec.name = "vagrant"
|
7
|
-
gemspec.summary = "Vagrant is a tool for building and distributing virtualized development environments."
|
8
|
-
gemspec.description = "Vagrant is a tool for building and distributing virtualized development environments."
|
9
|
-
gemspec.email = ["mitchell.hashimoto@gmail.com", "john.m.bender@gmail.com"]
|
10
|
-
gemspec.homepage = "http://github.com/mitchellh/vagrant"
|
11
|
-
gemspec.authors = ["Mitchell Hashimoto", "John Bender"]
|
12
|
-
|
13
|
-
gemspec.add_dependency('virtualbox', '~> 0.7.3')
|
14
|
-
gemspec.add_dependency('net-ssh', '>= 2.0.19')
|
15
|
-
gemspec.add_dependency('net-scp', '>= 1.0.2')
|
16
|
-
gemspec.add_dependency('json', '>= 1.2.0')
|
17
|
-
gemspec.add_dependency('archive-tar-minitar', '= 0.5.2')
|
18
|
-
gemspec.add_dependency('mario', '~> 0.0.6')
|
19
|
-
end
|
20
|
-
Jeweler::GemcutterTasks.new
|
21
|
-
rescue LoadError
|
22
|
-
puts "Jeweler not available. Install it with: gem install jeweler"
|
23
|
-
end
|
24
|
-
|
25
|
-
task :default => :test
|
26
|
-
|
27
|
-
Rake::TestTask.new do |t|
|
28
|
-
t.libs << "test"
|
29
|
-
t.pattern = 'test/**/*_test.rb'
|
30
|
-
end
|
31
|
-
|
32
|
-
begin
|
33
|
-
require 'yard'
|
34
|
-
YARD::Rake::YardocTask.new do |t|
|
35
|
-
t.options = ['--main', 'README.md', '--markup', 'markdown']
|
36
|
-
t.options += ['--title', 'Vagrant Developer Documentation']
|
37
|
-
end
|
38
|
-
rescue LoadError
|
39
|
-
puts "Yard not available. Install it with: gem install yard"
|
40
|
-
puts "if you wish to be able to generate developer documentation."
|
41
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.4.2
|
data/bin/.gitignore
DELETED
File without changes
|
data/lib/vagrant/actions/base.rb
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
# Base class for any command actions.
|
4
|
-
#
|
5
|
-
# Actions are the smallest unit of functionality found within
|
6
|
-
# Vagrant. Vagrant composes many actions together to execute
|
7
|
-
# its complex tasks while keeping the individual pieces of a
|
8
|
-
# task as discrete reusable actions. Actions are ran exclusively
|
9
|
-
# by an {Runner action runner} which is simply a subclass of {Runner}.
|
10
|
-
#
|
11
|
-
# Actions work by implementing any or all of the following methods
|
12
|
-
# which a {Runner} executes:
|
13
|
-
#
|
14
|
-
# * `prepare` - Called once for each action before any action has `execute!`
|
15
|
-
# called. This is meant for basic setup.
|
16
|
-
# * `execute!` - This is where the meat of the action typically goes;
|
17
|
-
# the main code which executes the action.
|
18
|
-
# * `cleanup` - This is called exactly once for each action after every
|
19
|
-
# other action is completed. It is meant for cleaning up any resources.
|
20
|
-
# * `rescue` - This is called if an exception occurs in _any action_. This
|
21
|
-
# gives every other action a chance to clean itself up.
|
22
|
-
#
|
23
|
-
# For details of each step of an action, read the specific function call
|
24
|
-
# documentation below.
|
25
|
-
class Base
|
26
|
-
# The {Runner runner} which is executing the action
|
27
|
-
attr_reader :runner
|
28
|
-
|
29
|
-
# Any options which are passed into the initializer as a hash.
|
30
|
-
attr_reader :options
|
31
|
-
|
32
|
-
# Included so subclasses don't need to include it themselves.
|
33
|
-
include Vagrant::Util
|
34
|
-
|
35
|
-
# A helper method for logging which simply gets the logger from
|
36
|
-
# the runner. Since actions tend to log quite a bit, this
|
37
|
-
# removes the need to prefix `logger` with `@runner` over and
|
38
|
-
# over.
|
39
|
-
def logger
|
40
|
-
runner.env.logger
|
41
|
-
end
|
42
|
-
|
43
|
-
# Initialization of the action, passing any arguments which may have
|
44
|
-
# been given to the {Runner runner}. This method can be used by subclasses
|
45
|
-
# to save any of the configuration options which are passed in.
|
46
|
-
def initialize(runner, options=nil)
|
47
|
-
@runner = runner
|
48
|
-
@options = options || {}
|
49
|
-
end
|
50
|
-
|
51
|
-
# This method is called once per action, allowing the action
|
52
|
-
# to setup any callbacks, add more events, etc. Prepare is
|
53
|
-
# called in the order the actions are defined, and the action
|
54
|
-
# itself has no control over this.
|
55
|
-
#
|
56
|
-
# Examples of its usage:
|
57
|
-
#
|
58
|
-
# Perhaps we need an additional action only if a configuration is set:
|
59
|
-
#
|
60
|
-
# def prepare
|
61
|
-
# @vm.actions << FooAction if Vagrant.config[:foo] == :bar
|
62
|
-
# end
|
63
|
-
#
|
64
|
-
def prepare; end
|
65
|
-
|
66
|
-
# This method is called once, after preparing, to execute the
|
67
|
-
# actual task. This method is responsible for calling any
|
68
|
-
# callbacks. Adding new actions here will have unpredictable
|
69
|
-
# effects and should never be done.
|
70
|
-
#
|
71
|
-
# Examples of its usage:
|
72
|
-
#
|
73
|
-
# def execute!
|
74
|
-
# @vm.invoke_callback(:before_oven, "cookies")
|
75
|
-
# # Do lots of stuff here
|
76
|
-
# @vm.invoke_callback(:after_oven, "more", "than", "one", "option")
|
77
|
-
# end
|
78
|
-
#
|
79
|
-
def execute!; end
|
80
|
-
|
81
|
-
# This method is called after all actions have finished executing.
|
82
|
-
# It is meant as a place where final cleanup code can be done, knowing
|
83
|
-
# that all other actions are finished using your data.
|
84
|
-
def cleanup; end
|
85
|
-
|
86
|
-
# This method is only called if some exception occurs in the chain
|
87
|
-
# of actions. If an exception is raised in any action in the current
|
88
|
-
# chain, then every action part of that chain has {#rescue} called
|
89
|
-
# before raising the exception further. This method should be used to
|
90
|
-
# perform any cleanup necessary in the face of errors.
|
91
|
-
#
|
92
|
-
# **Warning:** Since this method is called when an exception is already
|
93
|
-
# raised, be _extra careful_ when implementing this method to handle
|
94
|
-
# all your own exceptions, otherwise it'll mask the initially raised
|
95
|
-
# exception.
|
96
|
-
def rescue(exception); end
|
97
|
-
|
98
|
-
# The following two methods are used for declaring action dependencies.
|
99
|
-
# For example, you require that the reload action be in place before
|
100
|
-
# a your new FooAction you might do the following
|
101
|
-
#
|
102
|
-
# def follows; [Reload] end
|
103
|
-
|
104
|
-
# This method is called when the runner is determining the actions that
|
105
|
-
# must precede a given action. You would say "This action follows [Action1, Action2]"
|
106
|
-
def follows; [] end
|
107
|
-
|
108
|
-
# This method is called when the runner is determining the actions that
|
109
|
-
# must follow a given action. You would say "This action precedes [Action3, Action4]
|
110
|
-
def precedes; [] end
|
111
|
-
end
|
112
|
-
|
113
|
-
# An exception which occured within an action. This should be used instead of
|
114
|
-
# {Vagrant::Util#error_and_exit error_and_exit}, since it allows the {Runner} to call
|
115
|
-
# {Base#rescue rescue} on all the actions and properly exit. Any message
|
116
|
-
# passed into the {ActionException} is then shown and and vagrant exits.
|
117
|
-
class ActionException < Exception
|
118
|
-
attr_reader :key
|
119
|
-
attr_reader :data
|
120
|
-
|
121
|
-
def initialize(key, data = {})
|
122
|
-
@key = key
|
123
|
-
@data = data
|
124
|
-
|
125
|
-
message = Vagrant::Util::Translator.t(key, data)
|
126
|
-
super(message)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
module Box
|
4
|
-
# A meta-action which adds a box by downloading and unpackaging it.
|
5
|
-
# This action downloads and unpackages a box with a given URI. This
|
6
|
-
# is a _meta action_, meaning it simply adds more actions to the
|
7
|
-
# action chain, and those actions do the work.
|
8
|
-
#
|
9
|
-
# This is the action called by {Box#add}.
|
10
|
-
class Add < Base
|
11
|
-
def prepare
|
12
|
-
if File.exists?(@runner.directory)
|
13
|
-
raise ActionException.new(:box_add_already_exists, :box_name => @runner.name)
|
14
|
-
end
|
15
|
-
|
16
|
-
@runner.add_action(Download)
|
17
|
-
@runner.add_action(Unpackage)
|
18
|
-
@runner.add_action(Verify)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
module Box
|
4
|
-
# Action to destroy a box. This action is not reversible and expects
|
5
|
-
# to be called by a {Box} object.
|
6
|
-
class Destroy < Base
|
7
|
-
def execute!
|
8
|
-
logger.info "Deleting box directory..."
|
9
|
-
FileUtils.rm_rf(@runner.directory)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
module Box
|
4
|
-
# An action which acts on a box by downloading the box file from
|
5
|
-
# the given URI into a temporary location. This action parses a
|
6
|
-
# given URI and handles downloading it via one of the many Vagrant
|
7
|
-
# downloads (such as {Vagrant::Downloaders::File}).
|
8
|
-
#
|
9
|
-
# This action cleans itself up by removing the downloaded box file.
|
10
|
-
class Download < Base
|
11
|
-
BASENAME = "box"
|
12
|
-
BUFFERSIZE = 1048576 # 1 MB
|
13
|
-
|
14
|
-
attr_reader :downloader
|
15
|
-
|
16
|
-
def prepare
|
17
|
-
# Check the URI given and prepare a downloader
|
18
|
-
[Downloaders::HTTP, Downloaders::File].each do |dler|
|
19
|
-
if dler.match?(@runner.uri)
|
20
|
-
logger.info "Downloading via #{dler}..."
|
21
|
-
@downloader = dler.new(@runner.env)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
raise ActionException.new(:box_download_unknown_type) unless @downloader
|
26
|
-
|
27
|
-
# Prepare the downloader
|
28
|
-
@downloader.prepare(@runner.uri)
|
29
|
-
end
|
30
|
-
|
31
|
-
def execute!
|
32
|
-
with_tempfile do |tempfile|
|
33
|
-
download_to(tempfile)
|
34
|
-
@runner.temp_path = tempfile.path
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def cleanup
|
39
|
-
if @runner.temp_path && File.exist?(@runner.temp_path)
|
40
|
-
logger.info "Cleaning up downloaded box..."
|
41
|
-
File.unlink(@runner.temp_path)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def rescue(exception)
|
46
|
-
cleanup
|
47
|
-
end
|
48
|
-
|
49
|
-
def with_tempfile
|
50
|
-
logger.info "Creating tempfile for storing box file..."
|
51
|
-
File.open(box_temp_path, Platform.tar_file_options) do |tempfile|
|
52
|
-
yield tempfile
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def box_temp_path
|
57
|
-
File.join(@runner.env.tmp_path, BASENAME + Time.now.to_i.to_s)
|
58
|
-
end
|
59
|
-
|
60
|
-
def download_to(f)
|
61
|
-
logger.info "Copying box to temporary location..."
|
62
|
-
downloader.download!(@runner.uri, f)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
module Box
|
4
|
-
# This action unpackages a downloaded box file into its final
|
5
|
-
# box destination within the vagrant home folder.
|
6
|
-
class Unpackage < Base
|
7
|
-
def execute!
|
8
|
-
@runner.invoke_around_callback(:unpackage) do
|
9
|
-
setup_box_dir
|
10
|
-
decompress
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def rescue(exception)
|
15
|
-
if File.directory?(box_dir)
|
16
|
-
logger.info "An error occurred, rolling back box unpackaging..."
|
17
|
-
FileUtils.rm_rf(box_dir)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def setup_box_dir
|
22
|
-
if File.directory?(box_dir)
|
23
|
-
error_and_exit(:box_already_exists, :box_name => @runner.name)
|
24
|
-
end
|
25
|
-
|
26
|
-
FileUtils.mkdir_p(box_dir)
|
27
|
-
end
|
28
|
-
|
29
|
-
def box_dir
|
30
|
-
@runner.directory
|
31
|
-
end
|
32
|
-
|
33
|
-
def decompress
|
34
|
-
Dir.chdir(box_dir) do
|
35
|
-
logger.info "Extracting box to #{box_dir}..."
|
36
|
-
Archive::Tar::Minitar.unpack(@runner.temp_path, box_dir)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
module Box
|
4
|
-
# This action verifies that a given box is valid. This works by attempting
|
5
|
-
# to read/interpret the appliance file (OVF). If the reading succeeds, then
|
6
|
-
# the box is assumed to be valid.
|
7
|
-
class Verify < Base
|
8
|
-
def execute!
|
9
|
-
logger.info "Verifying box..."
|
10
|
-
reload_configuration
|
11
|
-
verify_appliance
|
12
|
-
end
|
13
|
-
|
14
|
-
def reload_configuration
|
15
|
-
# We have to reload the environment config since we _just_ added the
|
16
|
-
# box. We do this by setting the current box to the recently added box,
|
17
|
-
# then reloading
|
18
|
-
@runner.env.config.vm.box = @runner.name
|
19
|
-
@runner.env.load_box!
|
20
|
-
@runner.env.load_config!
|
21
|
-
end
|
22
|
-
|
23
|
-
def verify_appliance
|
24
|
-
# We now try to read the applince. If it succeeds, we return true.
|
25
|
-
VirtualBox::Appliance.new(@runner.ovf_file)
|
26
|
-
rescue Exception
|
27
|
-
raise ActionException.new(:box_verification_failed)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
class Collection < Array
|
4
|
-
def dependencies!
|
5
|
-
each_with_index do |action, i|
|
6
|
-
action.follows.each do |klass|
|
7
|
-
unless self[0..i].klasses.include?(klass)
|
8
|
-
raise DependencyNotSatisfiedException.new("#{action.class} action must follow #{klass}")
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
action.precedes.each do |klass|
|
13
|
-
unless self[i..length].klasses.include?(klass)
|
14
|
-
raise DependencyNotSatisfiedException.new("#{action.class} action must precede #{klass}")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def duplicates?
|
21
|
-
klasses.uniq.size != size
|
22
|
-
end
|
23
|
-
|
24
|
-
def duplicates!
|
25
|
-
raise DuplicateActionException.new if duplicates?
|
26
|
-
end
|
27
|
-
|
28
|
-
def klasses
|
29
|
-
map { |o| o.class }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class DuplicateActionException < Exception; end
|
34
|
-
class DependencyNotSatisfiedException < Exception; end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
module Vagrant
|
2
|
-
module Actions
|
3
|
-
# Base class for any class which will act as a runner
|
4
|
-
# for actions. A runner handles queueing up and executing actions,
|
5
|
-
# and executing the methods of an action in the proper order. The
|
6
|
-
# action runner also handles invoking callbacks that actions may
|
7
|
-
# request.
|
8
|
-
#
|
9
|
-
# # Executing Actions
|
10
|
-
#
|
11
|
-
# Actions can be executed by adding them and executing them all
|
12
|
-
# at once:
|
13
|
-
#
|
14
|
-
# runner = Vagrant::Actions::Runner.new
|
15
|
-
# runner.add_action(FooAction)
|
16
|
-
# runner.add_action(BarAction)
|
17
|
-
# runner.add_action(BazAction)
|
18
|
-
# runner.execute!
|
19
|
-
#
|
20
|
-
# Single actions have a shorthand to be executed:
|
21
|
-
#
|
22
|
-
# Vagrant::Actions::Runner.execute!(FooAction)
|
23
|
-
#
|
24
|
-
# Arguments may be passed into added actions by adding them after
|
25
|
-
# the action class:
|
26
|
-
#
|
27
|
-
# runner.add_action(FooAction, "many", "arguments", "may", "follow")
|
28
|
-
#
|
29
|
-
class Runner
|
30
|
-
include Vagrant::Util
|
31
|
-
|
32
|
-
class << self
|
33
|
-
# Executes a specific action, optionally passing in any arguments to that
|
34
|
-
# action. This method is shorthand to initializing a runner, adding a single
|
35
|
-
# action, and executing it.
|
36
|
-
def execute!(action_klass, *args)
|
37
|
-
runner = new
|
38
|
-
runner.add_action(action_klass, *args)
|
39
|
-
runner.execute!
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# Returns an array of all the actions in queue. Because this
|
44
|
-
# will persist accross calls (calling {#actions} twice will yield
|
45
|
-
# exactly the same object), to clear or modify it, use the ruby
|
46
|
-
# array methods which act on `self`, such as `Array#clear`.
|
47
|
-
#
|
48
|
-
# @return [Array]
|
49
|
-
def actions
|
50
|
-
@actions ||= Actions::Collection.new
|
51
|
-
end
|
52
|
-
|
53
|
-
# Returns the first action instance which matches the given class.
|
54
|
-
#
|
55
|
-
# @param [Class] action_klass The action to search for in the queue
|
56
|
-
# @return [Object]
|
57
|
-
def find_action(action_klass)
|
58
|
-
actions.find { |a| a.is_a?(action_klass) }
|
59
|
-
end
|
60
|
-
|
61
|
-
# Add an action to the list of queued actions to execute. This method
|
62
|
-
# appends the given action class to the end of the queue. Any arguments
|
63
|
-
# given after the class are passed into the class constructor.
|
64
|
-
def add_action(action_klass, *args)
|
65
|
-
actions << action_klass.new(self, *args)
|
66
|
-
end
|
67
|
-
|
68
|
-
# Execute the actions in queue. This method can also optionally be used
|
69
|
-
# to execute a single action on an instance. The syntax for executing a
|
70
|
-
# single method on an instance is the same as the {execute!} class method.
|
71
|
-
def execute!(single_action=nil, *args)
|
72
|
-
if single_action
|
73
|
-
actions.clear
|
74
|
-
add_action(single_action, *args)
|
75
|
-
end
|
76
|
-
|
77
|
-
actions.duplicates!
|
78
|
-
actions.dependencies!
|
79
|
-
|
80
|
-
# Call the prepare method on each once its
|
81
|
-
# initialized, then call the execute! method
|
82
|
-
begin
|
83
|
-
[:prepare, :execute!, :cleanup].each do |method|
|
84
|
-
actions.each do |action|
|
85
|
-
action.send(method)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
rescue Exception => e
|
89
|
-
# Run the rescue code to do any emergency cleanup
|
90
|
-
actions.each do |action|
|
91
|
-
action.rescue(e)
|
92
|
-
end
|
93
|
-
|
94
|
-
# If its an ActionException, error and exit the message
|
95
|
-
if e.is_a?(ActionException)
|
96
|
-
error_and_exit(e.key, e.data)
|
97
|
-
return
|
98
|
-
end
|
99
|
-
|
100
|
-
# Finally, reraise the exception
|
101
|
-
raise
|
102
|
-
end
|
103
|
-
|
104
|
-
# Clear the actions
|
105
|
-
actions.clear
|
106
|
-
end
|
107
|
-
|
108
|
-
# Invokes an "around callback" which invokes before_name and
|
109
|
-
# after_name for the given callback name, yielding a block between
|
110
|
-
# callback invokations.
|
111
|
-
def invoke_around_callback(name, *args)
|
112
|
-
invoke_callback("before_#{name}".to_sym, *args)
|
113
|
-
yield
|
114
|
-
invoke_callback("after_#{name}".to_sym, *args)
|
115
|
-
end
|
116
|
-
|
117
|
-
# Invokes a single callback. This method will go through each action
|
118
|
-
# and call the method given in the parameter `name` if the action
|
119
|
-
# responds to it.
|
120
|
-
def invoke_callback(name, *args)
|
121
|
-
# Attempt to call the method for the callback on each of the
|
122
|
-
# actions
|
123
|
-
results = []
|
124
|
-
actions.each do |action|
|
125
|
-
results << action.send(name, *args) if action.respond_to?(name)
|
126
|
-
end
|
127
|
-
results
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|