tenderloin 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|