tenderloin 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/config/default.rb +5 -7
- data/lib/tenderloin/actions/vm/provision.rb +13 -49
- data/lib/tenderloin/actions/vm/reload.rb +2 -2
- data/lib/tenderloin/actions/vm/shared_folders.rb +16 -12
- data/lib/tenderloin/actions/vm/up.rb +1 -1
- data/lib/tenderloin/cli.rb +6 -0
- data/lib/tenderloin/commands.rb +7 -0
- data/lib/tenderloin/config.rb +17 -21
- data/lib/tenderloin/fusion_vm.rb +5 -0
- data/lib/tenderloin/ssh.rb +2 -2
- data/templates/Tenderfile +15 -0
- metadata +1 -1
data/config/default.rb
CHANGED
@@ -16,11 +16,9 @@ Tenderloin::Config.run do |config|
|
|
16
16
|
config.package.name = 'tenderloin'
|
17
17
|
config.package.extension = '.box'
|
18
18
|
|
19
|
-
config.
|
20
|
-
config.
|
21
|
-
|
22
|
-
config.
|
23
|
-
|
24
|
-
:recipes => ["tenderloin_main"]
|
25
|
-
}
|
19
|
+
config.provisioning.script = nil
|
20
|
+
config.provisioning.command = nil
|
21
|
+
|
22
|
+
config.shared_folders.enabled = true
|
23
|
+
config.shared_folders.folders = []
|
26
24
|
end
|
@@ -3,54 +3,25 @@ module Tenderloin
|
|
3
3
|
module VM
|
4
4
|
class Provision < Base
|
5
5
|
def execute!
|
6
|
-
|
7
|
-
|
8
|
-
setup_solo_config
|
9
|
-
run_chef_solo
|
6
|
+
setup_script if Tenderloin.config.provisioning.script
|
7
|
+
run_command if Tenderloin.config.provisioning.command
|
10
8
|
end
|
11
9
|
|
12
|
-
def
|
13
|
-
logger.info "
|
14
|
-
SSH.execute do |ssh|
|
15
|
-
ssh.exec!("sudo chown #{Tenderloin.config.ssh.username} #{Tenderloin.config.chef.provisioning_path}")
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def setup_json
|
20
|
-
logger.info "Generating JSON and uploading..."
|
21
|
-
|
22
|
-
# Set up initial configuration
|
23
|
-
data = {
|
24
|
-
:config => Tenderloin.config,
|
25
|
-
:directory => Tenderloin.config.vm.project_directory,
|
26
|
-
}
|
27
|
-
|
28
|
-
# And wrap it under the "tenderloin" namespace
|
29
|
-
data = { :tenderloin => data }
|
30
|
-
|
31
|
-
# Merge with the "extra data" which isn't put under the
|
32
|
-
# tenderloin namespace by default
|
33
|
-
data.merge!(Tenderloin.config.chef.json)
|
10
|
+
def setup_script
|
11
|
+
logger.info "Uploading provisioning script..."
|
34
12
|
|
35
|
-
|
13
|
+
SSH.upload!(@runner.fusion_vm.ip, StringIO.new(Tenderloin.config.provisioning.script), File.join('/tmp', "tenderloin_provision.sh"))
|
36
14
|
|
37
|
-
|
15
|
+
Tenderloin.config.provisioning.command = "/tmp/tenderloin_provision.sh"
|
38
16
|
end
|
39
17
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
SSH.upload!(StringIO.new(solo_file), File.join(Tenderloin.config.chef.provisioning_path, "solo.rb"))
|
48
|
-
end
|
49
|
-
|
50
|
-
def run_chef_solo
|
51
|
-
logger.info "Running chef recipes..."
|
52
|
-
SSH.execute do |ssh|
|
53
|
-
ssh.exec!("cd #{Tenderloin.config.chef.provisioning_path} && sudo chef-solo -c solo.rb -j dna.json") do |channel, data, stream|
|
18
|
+
def run_command
|
19
|
+
logger.info "Running Provisioning command..."
|
20
|
+
cmd = ""
|
21
|
+
cmd << "chmod +x /tmp/tenderloin_provision.sh && " if Tenderloin.config.provisioning.script
|
22
|
+
cmd << Tenderloin.config.provisioning.command
|
23
|
+
SSH.execute(@runner.fusion_vm.ip) do |ssh|
|
24
|
+
ssh.exec!(cmd) do |channel, data, stream|
|
54
25
|
# TODO: Very verbose. It would be easier to save the data and only show it during
|
55
26
|
# an error, or when verbosity level is set high
|
56
27
|
logger.info("#{stream}: #{data}")
|
@@ -58,13 +29,6 @@ solo
|
|
58
29
|
end
|
59
30
|
end
|
60
31
|
|
61
|
-
def cookbooks_path
|
62
|
-
File.join(Tenderloin.config.chef.provisioning_path, "cookbooks")
|
63
|
-
end
|
64
|
-
|
65
|
-
def collect_shared_folders
|
66
|
-
["tenderloin-provisioning", File.expand_path(Tenderloin.config.chef.cookbooks_path, Env.root_path), cookbooks_path]
|
67
|
-
end
|
68
32
|
end
|
69
33
|
end
|
70
34
|
end
|
@@ -4,8 +4,8 @@ module Tenderloin
|
|
4
4
|
class Reload < Base
|
5
5
|
def prepare
|
6
6
|
steps = [SharedFolders, Boot]
|
7
|
-
steps.unshift(Halt) if @runner.
|
8
|
-
steps << Provision if Tenderloin.config.
|
7
|
+
steps.unshift(Halt) if @runner.fusion_vm.running?
|
8
|
+
steps << Provision if Tenderloin.config.provisioning.enabled
|
9
9
|
|
10
10
|
steps.each do |action_klass|
|
11
11
|
@runner.add_action(action_klass)
|
@@ -5,6 +5,8 @@ module Tenderloin
|
|
5
5
|
def shared_folders
|
6
6
|
shared_folders = @runner.invoke_callback(:collect_shared_folders)
|
7
7
|
|
8
|
+
shared_folders = shared_folders + Tenderloin.config.shared_folders.folders
|
9
|
+
|
8
10
|
# Basic filtering of shared folders. Basically only verifies that
|
9
11
|
# the result is an array of 3 elements. In the future this should
|
10
12
|
# also verify that the host path exists, the name is valid,
|
@@ -15,7 +17,7 @@ module Tenderloin
|
|
15
17
|
else
|
16
18
|
nil
|
17
19
|
end
|
18
|
-
end
|
20
|
+
end#.compact
|
19
21
|
end
|
20
22
|
|
21
23
|
def before_boot
|
@@ -23,20 +25,22 @@ module Tenderloin
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def after_boot
|
26
|
-
|
28
|
+
if Tenderloin.config.shared_folders.enabled
|
29
|
+
logger.info "Creating shared folders metadata..."
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
shared_folders.each do |name, hostpath, guestpath|
|
32
|
+
@runner.fusion_vm.share_folder(name, File.expand_path(hostpath))
|
33
|
+
@runner.fusion_vm.enable_shared_folders
|
34
|
+
end
|
32
35
|
|
33
|
-
|
36
|
+
logger.info "Linking shared folders..."
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
Tenderloin::SSH.execute(@runner.fusion_vm.ip) do |ssh|
|
39
|
+
shared_folders.each do |name, hostpath, guestpath|
|
40
|
+
logger.info "-- #{name}: #{guestpath}"
|
41
|
+
ssh.exec!("sudo ln -s /mnt/hgfs/#{name} #{guestpath}")
|
42
|
+
ssh.exec!("sudo chown #{Tenderloin.config.ssh.username} #{guestpath}")
|
43
|
+
end
|
40
44
|
end
|
41
45
|
end
|
42
46
|
end
|
@@ -17,7 +17,7 @@ msg
|
|
17
17
|
# Up is a "meta-action" so it really just queues up a bunch
|
18
18
|
# of other actions in its place:
|
19
19
|
steps = [Import, SharedFolders, Boot]
|
20
|
-
steps << Provision if Tenderloin.config.
|
20
|
+
steps << Provision if Tenderloin.config.provisioning.enabled
|
21
21
|
steps.insert(0, MoveHardDrive) if Tenderloin.config.vm.hd_location
|
22
22
|
|
23
23
|
steps.each do |action_klass|
|
data/lib/tenderloin/cli.rb
CHANGED
@@ -49,6 +49,12 @@ module Tenderloin
|
|
49
49
|
Tenderloin::Commands.reload
|
50
50
|
end
|
51
51
|
|
52
|
+
desc "provision [--file <tenderfile>]", "Runs the provisioning script"
|
53
|
+
def provision()
|
54
|
+
setup
|
55
|
+
Tenderloin::Commands.provision
|
56
|
+
end
|
57
|
+
|
52
58
|
desc "ssh [--file <tenderfile>]", "SSH's in to the VM"
|
53
59
|
def ssh()
|
54
60
|
setup
|
data/lib/tenderloin/commands.rb
CHANGED
data/lib/tenderloin/config.rb
CHANGED
@@ -86,25 +86,6 @@ module Tenderloin
|
|
86
86
|
attr_accessor :extension
|
87
87
|
end
|
88
88
|
|
89
|
-
class ChefConfig < Base
|
90
|
-
attr_accessor :cookbooks_path
|
91
|
-
attr_accessor :provisioning_path
|
92
|
-
attr_accessor :json
|
93
|
-
attr_accessor :enabled
|
94
|
-
|
95
|
-
def initialize
|
96
|
-
@enabled = false
|
97
|
-
end
|
98
|
-
|
99
|
-
def to_json
|
100
|
-
# Overridden so that the 'json' key could be removed, since its just
|
101
|
-
# merged into the config anyways
|
102
|
-
data = instance_variables_hash
|
103
|
-
data.delete(:json)
|
104
|
-
data.to_json
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
89
|
class TenderloinConfig < Base
|
109
90
|
attr_accessor :dotfile_name
|
110
91
|
attr_accessor :log_output
|
@@ -115,19 +96,34 @@ module Tenderloin
|
|
115
96
|
end
|
116
97
|
end
|
117
98
|
|
99
|
+
class ProvisioningConfig
|
100
|
+
attr_accessor :script
|
101
|
+
attr_accessor :command
|
102
|
+
def enabled
|
103
|
+
script || command
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
class SharedFoldersConfig
|
108
|
+
attr_accessor :enabled
|
109
|
+
attr_accessor :folders
|
110
|
+
end
|
111
|
+
|
118
112
|
class Top < Base
|
119
113
|
attr_reader :package
|
120
114
|
attr_reader :ssh
|
121
115
|
attr_reader :vm
|
122
|
-
attr_reader :chef
|
123
116
|
attr_reader :tenderloin
|
117
|
+
attr_reader :provisioning
|
118
|
+
attr_reader :shared_folders
|
124
119
|
|
125
120
|
def initialize
|
126
121
|
@ssh = SSHConfig.new
|
127
122
|
@vm = VMConfig.new
|
128
|
-
@chef = ChefConfig.new
|
129
123
|
@tenderloin = TenderloinConfig.new
|
130
124
|
@package = PackageConfig.new
|
125
|
+
@provisioning = ProvisioningConfig.new
|
126
|
+
@shared_folders = SharedFoldersConfig.new
|
131
127
|
|
132
128
|
@loaded = false
|
133
129
|
end
|
data/lib/tenderloin/fusion_vm.rb
CHANGED
data/lib/tenderloin/ssh.rb
CHANGED
data/templates/Tenderfile
CHANGED
@@ -5,4 +5,19 @@ Tenderloin::Config.run do |config|
|
|
5
5
|
|
6
6
|
# Every Tenderloin virtual environment requires a box to build off of.
|
7
7
|
config.vm.box = "base"
|
8
|
+
|
9
|
+
## SSH username and password defaults to 'tenderloin'. You can change this.
|
10
|
+
# config.ssh.username = 'youruser'
|
11
|
+
# config.ssh.password = 'yourpass'
|
12
|
+
|
13
|
+
## Provisioning can either provide a shell script, or a command to execute
|
14
|
+
# config.provisioning.script = <<EOF
|
15
|
+
# ls /usr
|
16
|
+
# EOF
|
17
|
+
# config.provisioning.command = "apt-get install -y ruby"
|
18
|
+
|
19
|
+
## Shared folders are enabled by default, and the project dir is always shared
|
20
|
+
## You can turn this off, or add additional folders
|
21
|
+
# config.shared_folders.enabled = false
|
22
|
+
# config.shared_folders.folders = [[["my-files", "src", "/mnt/src"], ["bin-files", "bin", "/mnt/bin"]
|
8
23
|
end
|