vagrant 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +11 -0
- data/Gemfile +17 -0
- data/README.md +45 -0
- data/Rakefile +41 -0
- data/VERSION +1 -0
- data/bin/.gitignore +0 -0
- data/bin/vagrant +15 -0
- data/bin/vagrant-box +35 -0
- data/bin/vagrant-down +28 -0
- data/bin/vagrant-halt +29 -0
- data/bin/vagrant-init +28 -0
- data/bin/vagrant-package +30 -0
- data/bin/vagrant-reload +30 -0
- data/bin/vagrant-resume +28 -0
- data/bin/vagrant-ssh +28 -0
- data/bin/vagrant-suspend +28 -0
- data/bin/vagrant-up +30 -0
- data/config/default.rb +29 -0
- data/lib/vagrant.rb +14 -0
- data/lib/vagrant/actions/base.rb +93 -0
- data/lib/vagrant/actions/box/add.rb +22 -0
- data/lib/vagrant/actions/box/destroy.rb +14 -0
- data/lib/vagrant/actions/box/download.rb +63 -0
- data/lib/vagrant/actions/box/unpackage.rb +49 -0
- data/lib/vagrant/actions/runner.rb +128 -0
- data/lib/vagrant/actions/vm/destroy.rb +14 -0
- data/lib/vagrant/actions/vm/down.rb +12 -0
- data/lib/vagrant/actions/vm/export.rb +41 -0
- data/lib/vagrant/actions/vm/forward_ports.rb +32 -0
- data/lib/vagrant/actions/vm/halt.rb +14 -0
- data/lib/vagrant/actions/vm/import.rb +17 -0
- data/lib/vagrant/actions/vm/move_hard_drive.rb +53 -0
- data/lib/vagrant/actions/vm/package.rb +61 -0
- data/lib/vagrant/actions/vm/provision.rb +71 -0
- data/lib/vagrant/actions/vm/reload.rb +17 -0
- data/lib/vagrant/actions/vm/resume.rb +16 -0
- data/lib/vagrant/actions/vm/shared_folders.rb +69 -0
- data/lib/vagrant/actions/vm/start.rb +50 -0
- data/lib/vagrant/actions/vm/suspend.rb +16 -0
- data/lib/vagrant/actions/vm/up.rb +35 -0
- data/lib/vagrant/box.rb +129 -0
- data/lib/vagrant/busy.rb +73 -0
- data/lib/vagrant/commands.rb +174 -0
- data/lib/vagrant/config.rb +156 -0
- data/lib/vagrant/downloaders/base.rb +13 -0
- data/lib/vagrant/downloaders/file.rb +21 -0
- data/lib/vagrant/downloaders/http.rb +47 -0
- data/lib/vagrant/env.rb +140 -0
- data/lib/vagrant/ssh.rb +43 -0
- data/lib/vagrant/util.rb +45 -0
- data/lib/vagrant/vm.rb +57 -0
- data/script/vagrant-ssh-expect.sh +22 -0
- data/templates/Vagrantfile +8 -0
- data/test/test_helper.rb +91 -0
- data/test/vagrant/actions/base_test.rb +32 -0
- data/test/vagrant/actions/box/add_test.rb +37 -0
- data/test/vagrant/actions/box/destroy_test.rb +18 -0
- data/test/vagrant/actions/box/download_test.rb +118 -0
- data/test/vagrant/actions/box/unpackage_test.rb +101 -0
- data/test/vagrant/actions/runner_test.rb +236 -0
- data/test/vagrant/actions/vm/destroy_test.rb +24 -0
- data/test/vagrant/actions/vm/down_test.rb +32 -0
- data/test/vagrant/actions/vm/export_test.rb +88 -0
- data/test/vagrant/actions/vm/forward_ports_test.rb +50 -0
- data/test/vagrant/actions/vm/halt_test.rb +27 -0
- data/test/vagrant/actions/vm/import_test.rb +36 -0
- data/test/vagrant/actions/vm/move_hard_drive_test.rb +108 -0
- data/test/vagrant/actions/vm/package_test.rb +155 -0
- data/test/vagrant/actions/vm/provision_test.rb +103 -0
- data/test/vagrant/actions/vm/reload_test.rb +44 -0
- data/test/vagrant/actions/vm/resume_test.rb +27 -0
- data/test/vagrant/actions/vm/shared_folders_test.rb +117 -0
- data/test/vagrant/actions/vm/start_test.rb +55 -0
- data/test/vagrant/actions/vm/suspend_test.rb +27 -0
- data/test/vagrant/actions/vm/up_test.rb +76 -0
- data/test/vagrant/box_test.rb +92 -0
- data/test/vagrant/busy_test.rb +81 -0
- data/test/vagrant/commands_test.rb +252 -0
- data/test/vagrant/config_test.rb +123 -0
- data/test/vagrant/downloaders/base_test.rb +20 -0
- data/test/vagrant/downloaders/file_test.rb +32 -0
- data/test/vagrant/downloaders/http_test.rb +40 -0
- data/test/vagrant/env_test.rb +293 -0
- data/test/vagrant/ssh_test.rb +95 -0
- data/test/vagrant/util_test.rb +64 -0
- data/test/vagrant/vm_test.rb +96 -0
- metadata +275 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Actions
|
3
|
+
module VM
|
4
|
+
class Suspend < Base
|
5
|
+
def execute!
|
6
|
+
if !@runner.vm.running?
|
7
|
+
raise ActionException.new("The vagrant virtual environment you are trying to suspend must be running to be suspended.")
|
8
|
+
end
|
9
|
+
|
10
|
+
logger.info "Saving VM state and suspending execution..."
|
11
|
+
@runner.vm.save_state(true)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Actions
|
3
|
+
module VM
|
4
|
+
class Up < Base
|
5
|
+
def prepare
|
6
|
+
# Up is a "meta-action" so it really just queues up a bunch
|
7
|
+
# of other actions in its place:
|
8
|
+
steps = [Import, ForwardPorts, SharedFolders, Start]
|
9
|
+
steps << Provision if Vagrant.config.chef.enabled
|
10
|
+
steps.insert(0, MoveHardDrive) if Vagrant.config.vm.hd_location
|
11
|
+
|
12
|
+
steps.each do |action_klass|
|
13
|
+
@runner.add_action(action_klass)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def after_import
|
18
|
+
persist
|
19
|
+
setup_mac_address
|
20
|
+
end
|
21
|
+
|
22
|
+
def persist
|
23
|
+
logger.info "Persisting the VM UUID (#{@runner.vm.uuid})..."
|
24
|
+
Env.persist_vm(@runner.vm)
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup_mac_address
|
28
|
+
logger.info "Matching MAC addresses..."
|
29
|
+
@runner.vm.nics.first.macaddress = Vagrant.config[:vm][:base_mac]
|
30
|
+
@runner.vm.save(true)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/vagrant/box.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
module Vagrant
|
2
|
+
# Represents a "box," which is simply a packaged vagrant environment.
|
3
|
+
# Boxes are simply `tar` files which contain an exported VirtualBox
|
4
|
+
# virtual machine, at the least. They are created with `vagrant package`
|
5
|
+
# and may contain additional files if specified by the creator. This
|
6
|
+
# class serves to help manage these boxes, although most of the logic
|
7
|
+
# is kicked out to actions.
|
8
|
+
#
|
9
|
+
# What can the {Box} class do?
|
10
|
+
#
|
11
|
+
# * Find boxes
|
12
|
+
# * Add existing boxes (from some URI)
|
13
|
+
# * Delete existing boxes
|
14
|
+
#
|
15
|
+
# # Finding Boxes
|
16
|
+
#
|
17
|
+
# Using the {Box.find} method, you can search for existing boxes. This
|
18
|
+
# method will return `nil` if none is found or an instance of {Box}
|
19
|
+
# otherwise.
|
20
|
+
#
|
21
|
+
# box = Vagrant::Box.find("base")
|
22
|
+
# if box.nil?
|
23
|
+
# puts "Box not found!"
|
24
|
+
# else
|
25
|
+
# puts "Box exists at #{box.directory}"
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# # Adding a Box
|
29
|
+
#
|
30
|
+
# Boxes can be added from any URI. Some schemas aren't supported; if this
|
31
|
+
# is the case, the error will output to the logger.
|
32
|
+
#
|
33
|
+
# Vagrant::Box.add("foo", "http://myfiles.com/foo.box")
|
34
|
+
#
|
35
|
+
# # Destroying a box
|
36
|
+
#
|
37
|
+
# Boxes can be deleted as well. This method is _final_ and there is no way
|
38
|
+
# to undo this action once it is completed.
|
39
|
+
#
|
40
|
+
# box = Vagrant::Box.find("foo")
|
41
|
+
# box.destroy
|
42
|
+
#
|
43
|
+
class Box < Actions::Runner
|
44
|
+
# The name of the box.
|
45
|
+
attr_accessor :name
|
46
|
+
|
47
|
+
# The URI for a new box. This is not available for existing boxes.
|
48
|
+
attr_accessor :uri
|
49
|
+
|
50
|
+
# The temporary path to the downloaded or copied box. This should
|
51
|
+
# only be used internally.
|
52
|
+
attr_accessor :temp_path
|
53
|
+
|
54
|
+
class <<self
|
55
|
+
# Finds a box with the given name. This method searches for a box
|
56
|
+
# with the given name, returning `nil` if none is found or returning
|
57
|
+
# a {Box} instance otherwise.
|
58
|
+
#
|
59
|
+
# @param [String] name The name of the box
|
60
|
+
# @return [Box] Instance of {Box} representing the box found
|
61
|
+
def find(name)
|
62
|
+
return nil unless File.directory?(directory(name))
|
63
|
+
new(name)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Adds a new box with given name from the given URI. This method
|
67
|
+
# begins the process of adding a box from a given URI by setting up
|
68
|
+
# the {Box} instance and calling {#add}.
|
69
|
+
#
|
70
|
+
# @param [String] name The name of the box
|
71
|
+
# @param [String] uri URI to the box file
|
72
|
+
def add(name, uri)
|
73
|
+
box = new
|
74
|
+
box.name = name
|
75
|
+
box.uri = uri
|
76
|
+
box.add
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns the directory to a box of the given name. The name given
|
80
|
+
# as a parameter is not checked for existence; this method simply
|
81
|
+
# returns the directory which would be used if the box did exist.
|
82
|
+
#
|
83
|
+
# @param [String] name Name of the box whose directory you're interested in.
|
84
|
+
# @return [String] Full path to the box directory.
|
85
|
+
def directory(name)
|
86
|
+
File.join(Env.boxes_path, name)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Creates a new box instance. Given an optional `name` parameter,
|
91
|
+
# newly created instance will have that name, otherwise it defaults
|
92
|
+
# to `nil`.
|
93
|
+
#
|
94
|
+
# **Note:** This method does not actually _create_ the box, but merely
|
95
|
+
# returns a new, abstract representation of it. To add a box, see {#add}.
|
96
|
+
def initialize(name=nil)
|
97
|
+
@name = name
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns path to the OVF file of the box. The OVF file is an open
|
101
|
+
# virtual machine file which contains specifications of the exported
|
102
|
+
# virtual machine this box contains.
|
103
|
+
#
|
104
|
+
# @return [String]
|
105
|
+
def ovf_file
|
106
|
+
File.join(directory, Vagrant.config.vm.box_ovf)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Begins the process of adding a box to the vagrant installation. This
|
110
|
+
# method requires that `name` and `uri` be set. The logic of this method
|
111
|
+
# is kicked out to the {Actions::Box::Add add box} action.
|
112
|
+
def add
|
113
|
+
execute!(Actions::Box::Add)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Beings the process of destroying this box.
|
117
|
+
def destroy
|
118
|
+
execute!(Actions::Box::Destroy)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns the directory to the location of this boxes content in the local
|
122
|
+
# filesystem.
|
123
|
+
#
|
124
|
+
# @return [String]
|
125
|
+
def directory
|
126
|
+
self.class.directory(self.name)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
data/lib/vagrant/busy.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
module Vagrant
|
2
|
+
def self.busy?
|
3
|
+
Busy.busy?
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.busy(&block)
|
7
|
+
Busy.busy(&block)
|
8
|
+
end
|
9
|
+
|
10
|
+
class Busy
|
11
|
+
extend Vagrant::Util
|
12
|
+
|
13
|
+
@@busy = false
|
14
|
+
@@mutex = Mutex.new
|
15
|
+
@@trap_thread = nil
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def busy?
|
19
|
+
@@busy
|
20
|
+
end
|
21
|
+
|
22
|
+
def busy=(val)
|
23
|
+
@@busy = val
|
24
|
+
end
|
25
|
+
|
26
|
+
def busy(&block)
|
27
|
+
@@mutex.synchronize do
|
28
|
+
begin
|
29
|
+
Signal.trap("INT") { wait_for_not_busy }
|
30
|
+
Busy.busy = true
|
31
|
+
runner = Thread.new(block) { block.call }
|
32
|
+
runner.join
|
33
|
+
ensure
|
34
|
+
# In the case an exception is thrown, make sure we restore
|
35
|
+
# busy back to some sane state.
|
36
|
+
Busy.busy = false
|
37
|
+
|
38
|
+
# Make sure that the trap thread completes, if it is running
|
39
|
+
trap_thread.join if trap_thread
|
40
|
+
|
41
|
+
# And restore the INT trap to the default
|
42
|
+
Signal.trap("INT", "DEFAULT")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def wait_for_not_busy(sleeptime=5)
|
48
|
+
@@trap_thread ||= Thread.new do
|
49
|
+
# Wait while the app is busy
|
50
|
+
loop do
|
51
|
+
break unless busy?
|
52
|
+
logger.info "Waiting for vagrant to clean itself up..."
|
53
|
+
sleep sleeptime
|
54
|
+
end
|
55
|
+
|
56
|
+
# Exit out of the entire script
|
57
|
+
logger.info "Exiting vagrant..."
|
58
|
+
exit
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Used for testing
|
63
|
+
def reset_trap_thread!
|
64
|
+
@@trap_thread = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns the trap thread
|
68
|
+
def trap_thread
|
69
|
+
@@trap_thread
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module Vagrant
|
2
|
+
# Contains all the command-line commands invoked by the
|
3
|
+
# binaries. Having them all in one location assists with
|
4
|
+
# documentation and also takes the commands out of some of
|
5
|
+
# the other classes.
|
6
|
+
class Commands
|
7
|
+
extend Vagrant::Util
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# Initializes a directory for use with vagrant. This command copies an
|
11
|
+
# initial `Vagrantfile` into the current working directory so you can
|
12
|
+
# begin using vagrant. The configuration file contains some documentation
|
13
|
+
# to get you started.
|
14
|
+
def init
|
15
|
+
rootfile_path = File.join(Dir.pwd, Env::ROOTFILE_NAME)
|
16
|
+
if File.exist?(rootfile_path)
|
17
|
+
error_and_exit(<<-error)
|
18
|
+
It looks like this directory is already setup for vagrant! (A #{Env::ROOTFILE_NAME}
|
19
|
+
already exists.)
|
20
|
+
error
|
21
|
+
end
|
22
|
+
|
23
|
+
# Copy over the rootfile template into this directory
|
24
|
+
File.copy(File.join(PROJECT_ROOT, "templates", Env::ROOTFILE_NAME), rootfile_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Bring up a vagrant instance. This handles everything from importing
|
28
|
+
# the base VM, setting up shared folders, forwarded ports, etc to
|
29
|
+
# provisioning the instance with chef. {up} also starts the instance,
|
30
|
+
# running it in the background.
|
31
|
+
def up
|
32
|
+
Env.load!
|
33
|
+
|
34
|
+
if Env.persisted_vm
|
35
|
+
logger.info "VM already created. Starting VM if its not already running..."
|
36
|
+
Env.persisted_vm.start
|
37
|
+
else
|
38
|
+
Env.require_box
|
39
|
+
VM.execute!(Actions::VM::Up)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Tear down a vagrant instance. This not only shuts down the instance
|
44
|
+
# (if its running), but also deletes it from the system, including the
|
45
|
+
# hard disks associated with it.
|
46
|
+
#
|
47
|
+
# This command requires that an instance already be brought up with
|
48
|
+
# `vagrant up`.
|
49
|
+
def down
|
50
|
+
Env.load!
|
51
|
+
Env.require_persisted_vm
|
52
|
+
Env.persisted_vm.destroy
|
53
|
+
end
|
54
|
+
|
55
|
+
# Reload the environment. This is almost equivalent to the {up} command
|
56
|
+
# except that it doesn't import the VM and do the initialize bootstrapping
|
57
|
+
# of the instance. Instead, it forces a shutdown (if its running) of the
|
58
|
+
# VM, updates the metadata (shared folders, forwarded ports), restarts
|
59
|
+
# the VM, and then reruns the provisioning if enabled.
|
60
|
+
def reload
|
61
|
+
Env.load!
|
62
|
+
Env.require_persisted_vm
|
63
|
+
Env.persisted_vm.execute!(Actions::VM::Reload)
|
64
|
+
end
|
65
|
+
|
66
|
+
# SSH into the vagrant instance. This will setup an SSH connection into
|
67
|
+
# the vagrant instance, replacing the running ruby process with the SSH
|
68
|
+
# connection.
|
69
|
+
#
|
70
|
+
# This command requires that an instance already be brought up with
|
71
|
+
# `vagrant up`.
|
72
|
+
def ssh
|
73
|
+
Env.load!
|
74
|
+
Env.require_persisted_vm
|
75
|
+
SSH.connect
|
76
|
+
end
|
77
|
+
|
78
|
+
# Halts a running vagrant instance. This forcibly halts the instance;
|
79
|
+
# it is the equivalent of pulling the power on a machine. The instance
|
80
|
+
# can be restarted again with {up}.
|
81
|
+
#
|
82
|
+
# This command requires than an instance already be brought up with
|
83
|
+
# `vagrant up`.
|
84
|
+
def halt
|
85
|
+
Env.load!
|
86
|
+
Env.require_persisted_vm
|
87
|
+
Env.persisted_vm.execute!(Actions::VM::Halt)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Suspend a running vagrant instance. This suspends the instance, saving
|
91
|
+
# the state of the VM and "pausing" it. The instance can be resumed
|
92
|
+
# again with {resume}.
|
93
|
+
#
|
94
|
+
# This command requires that an instance already be brought up with
|
95
|
+
# `vagrant up`.
|
96
|
+
def suspend
|
97
|
+
Env.load!
|
98
|
+
Env.require_persisted_vm
|
99
|
+
Env.persisted_vm.suspend
|
100
|
+
end
|
101
|
+
|
102
|
+
# Resume a running vagrant instance. This resumes an already suspended
|
103
|
+
# instance (from {suspend}).
|
104
|
+
#
|
105
|
+
# This command requires that an instance already be brought up with
|
106
|
+
# `vagrant up`.
|
107
|
+
def resume
|
108
|
+
Env.load!
|
109
|
+
Env.require_persisted_vm
|
110
|
+
Env.persisted_vm.resume
|
111
|
+
end
|
112
|
+
|
113
|
+
# Export and package the current vm
|
114
|
+
#
|
115
|
+
# This command requires that an instance be powered off
|
116
|
+
def package(out_path=nil, include_files=[])
|
117
|
+
Env.load!
|
118
|
+
Env.require_persisted_vm
|
119
|
+
error_and_exit(<<-error) unless Env.persisted_vm.powered_off?
|
120
|
+
The vagrant virtual environment you are trying to package must be powered off
|
121
|
+
error
|
122
|
+
|
123
|
+
Env.persisted_vm.package(out_path, include_files)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Manages the `vagrant box` command, allowing the user to add
|
127
|
+
# and remove boxes. This single command, given an array, determines
|
128
|
+
# which action to take and calls the respective action method
|
129
|
+
# (see {box_add} and {box_remove})
|
130
|
+
def box(argv)
|
131
|
+
Env.load!(:suppress_errors => true)
|
132
|
+
|
133
|
+
sub_commands = ["add", "remove"]
|
134
|
+
|
135
|
+
if !sub_commands.include?(argv[0])
|
136
|
+
error_and_exit(<<-error)
|
137
|
+
Please specify a valid action to take on the boxes, either
|
138
|
+
`add` or `remove`. Examples:
|
139
|
+
|
140
|
+
vagrant box add name uri
|
141
|
+
vagrant box remove name
|
142
|
+
error
|
143
|
+
end
|
144
|
+
|
145
|
+
send("box_#{argv[0]}", *argv[1..-1])
|
146
|
+
end
|
147
|
+
|
148
|
+
# Adds a box to the local filesystem, given a URI.
|
149
|
+
def box_add(name, path)
|
150
|
+
Box.add(name, path)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Removes a box.
|
154
|
+
def box_remove(name)
|
155
|
+
box = Box.find(name)
|
156
|
+
if box.nil?
|
157
|
+
error_and_exit(<<-error)
|
158
|
+
The box you're attempting to remove does not exist!
|
159
|
+
error
|
160
|
+
return # for tests
|
161
|
+
end
|
162
|
+
|
163
|
+
box.destroy
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def act_on_vm(&block)
|
169
|
+
yield Env.persisted_vm
|
170
|
+
Env.persisted_vm.execute!
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
module Vagrant
|
2
|
+
def self.config
|
3
|
+
Config.config
|
4
|
+
end
|
5
|
+
|
6
|
+
class Config
|
7
|
+
@config = nil
|
8
|
+
@config_runners = []
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def reset!
|
12
|
+
@config = nil
|
13
|
+
config_runners.clear
|
14
|
+
end
|
15
|
+
|
16
|
+
def config
|
17
|
+
@config ||= Config::Top.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def config_runners
|
21
|
+
@config_runners ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
def run(&block)
|
25
|
+
config_runners << block
|
26
|
+
end
|
27
|
+
|
28
|
+
def execute!
|
29
|
+
config_runners.each do |block|
|
30
|
+
block.call(config)
|
31
|
+
end
|
32
|
+
|
33
|
+
config.loaded!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Config
|
39
|
+
class Base
|
40
|
+
def [](key)
|
41
|
+
send(key)
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_json
|
45
|
+
instance_variables_hash.to_json
|
46
|
+
end
|
47
|
+
|
48
|
+
def instance_variables_hash
|
49
|
+
instance_variables.inject({}) do |acc, iv|
|
50
|
+
acc[iv.to_s[1..-1].to_sym] = instance_variable_get(iv)
|
51
|
+
acc
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class SSHConfig < Base
|
57
|
+
attr_accessor :username
|
58
|
+
attr_accessor :password
|
59
|
+
attr_accessor :host
|
60
|
+
attr_accessor :forwarded_port_key
|
61
|
+
attr_accessor :max_tries
|
62
|
+
end
|
63
|
+
|
64
|
+
class VMConfig < Base
|
65
|
+
attr_accessor :box
|
66
|
+
attr_accessor :box_ovf
|
67
|
+
attr_accessor :base_mac
|
68
|
+
attr_accessor :project_directory
|
69
|
+
attr_reader :forwarded_ports
|
70
|
+
attr_accessor :hd_location
|
71
|
+
attr_accessor :disk_image_format
|
72
|
+
|
73
|
+
|
74
|
+
def initialize
|
75
|
+
@forwarded_ports = {}
|
76
|
+
end
|
77
|
+
|
78
|
+
def forward_port(name, guestport, hostport, protocol="TCP")
|
79
|
+
forwarded_ports[name] = {
|
80
|
+
:guestport => guestport,
|
81
|
+
:hostport => hostport,
|
82
|
+
:protocol => protocol
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
def hd_location=(val)
|
87
|
+
raise Exception.new "disk_storage must be set to a directory" unless File.directory?(val)
|
88
|
+
@hd_location=val
|
89
|
+
end
|
90
|
+
|
91
|
+
def base
|
92
|
+
File.expand_path(@base)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class PackageConfig < Base
|
97
|
+
attr_accessor :name
|
98
|
+
attr_accessor :extension
|
99
|
+
end
|
100
|
+
|
101
|
+
class ChefConfig < Base
|
102
|
+
attr_accessor :cookbooks_path
|
103
|
+
attr_accessor :provisioning_path
|
104
|
+
attr_accessor :json
|
105
|
+
attr_accessor :enabled
|
106
|
+
|
107
|
+
def initialize
|
108
|
+
@enabled = false
|
109
|
+
end
|
110
|
+
|
111
|
+
def to_json
|
112
|
+
# Overridden so that the 'json' key could be removed, since its just
|
113
|
+
# merged into the config anyways
|
114
|
+
data = instance_variables_hash
|
115
|
+
data.delete(:json)
|
116
|
+
data.to_json
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class VagrantConfig < Base
|
121
|
+
attr_accessor :dotfile_name
|
122
|
+
attr_accessor :log_output
|
123
|
+
attr_accessor :home
|
124
|
+
|
125
|
+
def home
|
126
|
+
File.expand_path(@home)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class Top < Base
|
131
|
+
attr_reader :package
|
132
|
+
attr_reader :ssh
|
133
|
+
attr_reader :vm
|
134
|
+
attr_reader :chef
|
135
|
+
attr_reader :vagrant
|
136
|
+
|
137
|
+
def initialize
|
138
|
+
@ssh = SSHConfig.new
|
139
|
+
@vm = VMConfig.new
|
140
|
+
@chef = ChefConfig.new
|
141
|
+
@vagrant = VagrantConfig.new
|
142
|
+
@package = PackageConfig.new
|
143
|
+
|
144
|
+
@loaded = false
|
145
|
+
end
|
146
|
+
|
147
|
+
def loaded?
|
148
|
+
@loaded
|
149
|
+
end
|
150
|
+
|
151
|
+
def loaded!
|
152
|
+
@loaded = true
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|