tenderloin 0.4.3 → 0.4.4

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.
@@ -24,7 +24,8 @@ module Tenderloin
24
24
  # documentation below.
25
25
  class Base
26
26
  # The {Runner runner} which is executing the action
27
- attr_reader :runner
27
+ # The {Array arguments} which are passed when executing the action
28
+ attr_reader :runner, :run_args
28
29
 
29
30
  # Included so subclasses don't need to include it themselves.
30
31
  include Tenderloin::Util
@@ -33,7 +34,8 @@ module Tenderloin
33
34
  # been given to the {Runner runner}. This method can be used by subclasses
34
35
  # to save any of the configuration options which are passed in.
35
36
  def initialize(runner, *args)
36
- @runner = runner
37
+ @runner = runner
38
+ @run_args = args
37
39
  end
38
40
 
39
41
  # This method is called once per action, allowing the action
@@ -30,12 +30,16 @@ module Tenderloin
30
30
  if Tenderloin.config.shared_folders.enabled
31
31
  logger.info "Creating shared folders metadata..."
32
32
 
33
+ # Enable Shared Folders. It fails if it's already enabled.
34
+ # If it's a real error the command to add a shared folder will fail,
35
+ # so we can ignore this one.
36
+ @runner.fusion_vm.enable_shared_folders rescue nil
37
+
33
38
  shared_folders.each do |name, hostpath, guestpath|
34
- for i in 0..3
39
+ 4.times do
35
40
  begin
36
- status = Timeout::timeout(10) {
41
+ Timeout::timeout(10) {
37
42
  @runner.fusion_vm.share_folder(name, File.expand_path(hostpath))
38
- @runner.fusion_vm.enable_shared_folders
39
43
  break
40
44
  }
41
45
  rescue Timeout::Error
@@ -18,7 +18,7 @@ msg
18
18
  # of other actions in its place:
19
19
  Tenderloin::Box.add(Tenderloin.config.vm.box, Tenderloin.config.vm.box_url) unless Tenderloin::Env.box
20
20
  steps = [Import, SharedFolders, Boot]
21
- steps << Provision if Tenderloin.config.provisioning.enabled
21
+ steps << Provision if provision_enabled?
22
22
  steps.insert(0, MoveHardDrive) if Tenderloin.config.vm.hd_location
23
23
 
24
24
  steps.each do |action_klass|
@@ -51,6 +51,10 @@ msg
51
51
  data['displayName'] = "tenderloin-" + @runner.vm_id
52
52
  end
53
53
  end
54
+
55
+ def provision_enabled?
56
+ Tenderloin.config.provisioning.enabled && !run_args.include?(:no_provision)
57
+ end
54
58
  end
55
59
  end
56
60
  end
@@ -12,10 +12,16 @@ module Tenderloin
12
12
  end
13
13
  end
14
14
 
15
- desc "up [--file <tenderfile>]", "Boots the VM"
15
+ desc "up [--file <tenderfile> --no-provision]", "Boots the VM"
16
+ method_option :provision, :default => true
16
17
  def up()
17
18
  setup
18
- Tenderloin::Commands.up
19
+
20
+ if !options[:provision]
21
+ Tenderloin::Commands.up(:no_provision)
22
+ else
23
+ Tenderloin::Commands.up
24
+ end
19
25
  end
20
26
 
21
27
  desc "halt [--file <tenderfile>]", "Force shuts down the running VM"
@@ -55,10 +61,11 @@ module Tenderloin
55
61
  Tenderloin::Commands.provision
56
62
  end
57
63
 
58
- desc "ssh [--file <tenderfile>]", "SSH's in to the VM"
64
+ desc "ssh [--file <tenderfile> --command <ssh command>]", "SSH's in to the VM"
65
+ method_option :command, :aliases => "-c"
59
66
  def ssh()
60
67
  setup
61
- Tenderloin::Commands.ssh
68
+ Tenderloin::Commands.ssh(options[:command])
62
69
  end
63
70
 
64
71
  desc "ip [--file <tenderfile>]", "Shows the IP to access the VM"
@@ -28,7 +28,7 @@ error
28
28
  # the base VM, setting up shared folders, forwarded ports, etc to
29
29
  # provisioning the instance with chef. {up} also starts the instance,
30
30
  # running it in the background.
31
- def up
31
+ def up(provision = nil)
32
32
  Env.load!
33
33
 
34
34
  if Env.persisted_vm
@@ -36,7 +36,7 @@ error
36
36
  Env.persisted_vm.start
37
37
  else
38
38
  Env.require_box
39
- VM.execute!(Actions::VM::Up)
39
+ VM.execute!(Actions::VM::Up, provision)
40
40
  end
41
41
  end
42
42
 
@@ -69,10 +69,12 @@ error
69
69
  #
70
70
  # This command requires that an instance already be brought up with
71
71
  # `tenderloin up`.
72
- def ssh
72
+ #
73
+ # Command: shell command to run on the remote host
74
+ def ssh(command)
73
75
  Env.load!
74
76
  Env.require_persisted_vm
75
- SSH.connect Env.persisted_vm.fusion_vm.ip
77
+ SSH.connect Env.persisted_vm.fusion_vm.ip, command
76
78
  end
77
79
 
78
80
  # Halts a running tenderloin instance. This forcibly halts the instance;
@@ -3,7 +3,33 @@ module Tenderloin
3
3
  SCRIPT = File.join(File.dirname(__FILE__), '..', '..', 'script', 'tenderloin-ssh-expect.sh')
4
4
 
5
5
  class << self
6
- def connect(ip)
6
+ def connect(ip, command = nil)
7
+ if command
8
+ remote_exec(ip, command)
9
+ else
10
+ ssh_connect(ip)
11
+ end
12
+ end
13
+
14
+ def remote_exec(ip, command)
15
+ execute(ip) do |ssh|
16
+ ssh.open_channel do |channel|
17
+ channel.exec command do |ch, success|
18
+ raise "could not execute remote command: #{command}" unless success
19
+
20
+ ch.on_data do |c, data|
21
+ STDOUT.print data
22
+ end
23
+
24
+ ch.on_extended_data do |c, type, data|
25
+ STDERR.print data
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def ssh_connect(ip)
7
33
  if options.keys
8
34
  Kernel.exec "#{cmd_ssh_opts} #{options.username}@#{ip}"
9
35
  else
@@ -95,4 +95,16 @@ class UpActionTest < Test::Unit::TestCase
95
95
  @action.setup_mac_address
96
96
  end
97
97
  end
98
+
99
+ context "booting without provisioning" do
100
+ should "not add the provision task to the expected sequence" do
101
+ mock_vm, vm, action = mock_action(Tenderloin::Actions::VM::Up, :no_provision)
102
+
103
+ mock_config do |config|
104
+ config.chef.enabled = true
105
+ end
106
+
107
+ action.should_not be_provision_enabled
108
+ end
109
+ end
98
110
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tenderloin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: