chef-metal-lxc 0.4 → 0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99c02b50b618cb09fbab3b0dd350e97428669196
4
- data.tar.gz: a4bfc8a2a18d5dc37b83397d414b8563cd6dfe5b
3
+ metadata.gz: 222f247414cedb23359fd5b9925b15a4264c8571
4
+ data.tar.gz: 3b857d0edcb88781b6106b467622d125d8d9c524
5
5
  SHA512:
6
- metadata.gz: 28e9b881dc2782e2061b70d55a5f97cb68734f57bee784a08110c4c40a05fca05730534ff8bd273cc9add141111e08084b310cdee055798a4ce8e78acb0c02e2
7
- data.tar.gz: 0cff384fcab3645a5b2d86f9b16eddea3af5552273d8c209e0594b2d46726c45c90693f9ad6c5560582bcf1464e22f1c001c1b85281a9e0e92360c5a39adac53
6
+ metadata.gz: 25cb466ac9b171b94dd9c13502000616298a7293557f6f4666ab06f0612b14647fac06c79b8e1650577b090ac9e70ff471972450022f400204562192e6126151
7
+ data.tar.gz: 6c43f9e2d61768220c81d9c74f0215a86b51eaf24c9ac0f26478eea35f259d892fcab0bca7552124b0d71cfb9c8bb1078cc31c456d54c3a4d37b52cad9280cb5
@@ -0,0 +1,3 @@
1
+ require 'chef_metal_lxc/lxc_driver'
2
+
3
+ ChefMetal.register_driver_class('lxc', ChefMetalLXC::LXCDriver)
@@ -1,2 +1,2 @@
1
1
  require 'chef_metal'
2
- require 'chef_metal_lxc/lxc_provisioner'
2
+ require 'chef_metal_lxc/lxc_driver'
@@ -0,0 +1,166 @@
1
+ require 'chef/mixin/shell_out'
2
+ require 'chef_metal/driver'
3
+ require 'chef_metal/machine/unix_machine'
4
+ require 'chef_metal/convergence_strategy/install_cached'
5
+ require 'chef_metal_lxc/lxc_transport'
6
+ require 'chef_metal_lxc/version'
7
+ require 'lxc'
8
+ require 'shellwords'
9
+
10
+ module ChefMetalLXC
11
+ # Provisions machines in lxc.
12
+ class LXCDriver < ChefMetal::Driver
13
+
14
+ include Chef::Mixin::ShellOut
15
+
16
+ # URL scheme:
17
+ # lxc:<path>
18
+ # <path> defaults to LXC config 'lxc.lxcpath'
19
+ # canonical URL calls realpath on <path>
20
+ def self.from_url(driver_url, config)
21
+ LXCDriver.new(driver_url, config)
22
+ end
23
+
24
+ def self.canonicalize_url(driver_url, config)
25
+ scheme, lxc_path = driver_url.split(':', 2)
26
+ if lxc_path.nil? || lxc_path == ':'
27
+ lxc_path = LXC.global_config_item('lxc.lxcpath')
28
+ end
29
+ lxc_path = File.realpath(lxc_path)
30
+ [ "lxc:#{lxc_path}", config ]
31
+ end
32
+
33
+ def initialize(driver_url, config)
34
+ super
35
+ end
36
+
37
+ def lxc_path
38
+ scheme, lxc_path = driver_url.split(':', 2)
39
+ lxc_path
40
+ end
41
+
42
+ # Valid machine options:
43
+ # :template - template name
44
+ # :template_options - additional arguments for templates
45
+ # :backingstore - backing storage (lvm, thinpools, btrfs etc)
46
+ # :config_file - <path> path to LXC file a la https://wiki.archlinux.org/index.php/Linux_Containers#Configuration_file
47
+ # :extra_config - { 'key' => 'value', ... } a set of LXC config key/value pairs to individually set. Merges with, and overrides any values in config_file.
48
+ def allocate_machine(action_handler, machine_spec, machine_options)
49
+ # Create the container if it does not exist
50
+ if machine_spec.location
51
+ ct = LXC::Container.new(machine_spec.location['name'], lxc_path)
52
+ else
53
+ ct = LXC::Container.new(machine_spec.name, lxc_path)
54
+ if ct.defined?
55
+ # Should this be a warning? Configurable, at least.
56
+ raise "container #{machine_spec.name} already exists and is not managed by this LXC driver."
57
+ end
58
+ end
59
+
60
+ unless ct.defined?
61
+ action_handler.perform_action "create lxc container #{ct.name}" do
62
+ #
63
+ # Set config
64
+ #
65
+ # TODO if config file changes, reload container?
66
+ if machine_options[:config_file]
67
+ ct.load_config(machine_options[:config_file])
68
+ end
69
+ if machine_options[:extra_config]
70
+ machine_options[:extra_config].each_pair do |key, value|
71
+ ct.set_config_item(key, value)
72
+ end
73
+ end
74
+
75
+ #
76
+ # Create the machine
77
+ #
78
+ ct.create(machine_options[:template], machine_options[:backingstore], machine_options[:devspecs], 0, machine_options[:template_options])
79
+
80
+ machine_spec.location = {
81
+ 'driver_url' => driver_url,
82
+ 'driver_version' => ChefMetalLXC::VERSION,
83
+ 'name' => machine_spec.name,
84
+ 'host_node' => action_handler.host_node,
85
+ 'allocated_at' => Time.now.utc.to_s
86
+ }
87
+ end
88
+ end
89
+ end
90
+
91
+ def ready_machine(action_handler, machine_spec, machine_options)
92
+ ct = LXC::Container.new(machine_spec.location['name'], lxc_path)
93
+
94
+ # Unfreeze the frozen
95
+ if ct.state == :frozen
96
+ action_handler.perform_action "unfreeze lxc container #{machine_spec.location['name']} (state is #{ct.state})" do
97
+ ct.unfreeze
98
+ end
99
+ end
100
+
101
+ # Get stopped containers running
102
+ unless ct.running?
103
+ action_handler.perform_action "start lxc container #{machine_spec.location['name']} (state is #{ct.state})" do
104
+ # Have to shell out to lxc-start for now, ct.start holds server sockets open!
105
+ lxc_start = "lxc-start -d -n #{Shellwords.escape(machine_spec.location['name'])}"
106
+ # TODO add ability to change options on start
107
+ # if machine_options[:config_file]
108
+ # lxc_start << " -f #{Shellwords.escape(machine_options[:config_file])}"
109
+ # end
110
+ # if machine_options[:extra_config]
111
+ # machine_options[:extra_config].each_pair do |key,value|
112
+ # lxc_start << " -s #{Shellwords.escape("#{key}=#{value}")}"
113
+ # end
114
+ # end
115
+ shell_out!(lxc_start)
116
+ # ct.start
117
+ end
118
+ end
119
+
120
+ # Create machine object for callers to use
121
+ machine_for(machine_spec, machine_options)
122
+ end
123
+
124
+ # Connect to machine without acquiring it
125
+ def connect_to_machine(machine_spec, machine_options)
126
+ machine_for(machine_spec, machine_options)
127
+ end
128
+
129
+ def destroy_machine(action_handler, machine_spec, machine_options)
130
+ if machine_spec.location
131
+ ct = LXC::Container.new(machine_spec.location['name'], lxc_path)
132
+ if ct.defined?
133
+ action_handler.perform_action "delete lxc container #{machine_spec.location['name']}" do
134
+ ct.destroy
135
+ end
136
+ end
137
+ end
138
+ convergence_strategy_for(machine_spec, machine_options).cleanup_convergence(action_handler, machine_spec)
139
+ end
140
+
141
+ def stop_machine(action_handler, node)
142
+ if machine_spec.location
143
+ ct = LXC::Container.new(machine_spec.location['name'], lxc_path)
144
+ if ct.running?
145
+ action_handler.perform_action "delete lxc container #{machine_spec.location['name']}" do
146
+ ct.stop
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ protected
153
+
154
+ def machine_for(machine_spec, machine_options)
155
+ ChefMetal::Machine::UnixMachine.new(machine_spec, transport_for(machine_spec), convergence_strategy_for(machine_spec, machine_options))
156
+ end
157
+
158
+ def convergence_strategy_for(machine_spec, machine_options)
159
+ ChefMetal::ConvergenceStrategy::InstallCached.new(machine_options[:convergence_options], config)
160
+ end
161
+
162
+ def transport_for(machine_spec)
163
+ ChefMetalLXC::LXCTransport.new(machine_spec.location['name'], lxc_path)
164
+ end
165
+ end
166
+ end
@@ -25,7 +25,7 @@ module ChefMetalLXC
25
25
  @options = options
26
26
  @name = name
27
27
  @lxc_path = lxc_path
28
- @port_forwards = []
28
+ @port_forwards = {}
29
29
  @@active_transports << self
30
30
  end
31
31
 
@@ -43,7 +43,7 @@ module ChefMetalLXC
43
43
 
44
44
  def execute(command, options = {})
45
45
  Chef::Log.info("Executing #{command} on #{name}")
46
- container.execute do
46
+ container.execute(:timeout => (execute_timeout(options) || 0)) do
47
47
  begin
48
48
  # TODO support streaming (shell out needs work)
49
49
  out = shell_out(command)
@@ -57,33 +57,37 @@ module ChefMetalLXC
57
57
  def make_url_available_to_remote(local_url)
58
58
  uri = URI(local_url)
59
59
  host = Socket.getaddrinfo(uri.host, uri.scheme, nil, :STREAM)[0][3]
60
- if host == '127.0.0.1' || host == '[::1]'
61
-
62
- Chef::Log.debug("Forwarding container port #{uri.port} to local port #{uri.port}")
63
- # Create the channel that will let the container and the host talk to each other
64
- channel = LXC::Extra::Channel.new
60
+ if host == '127.0.0.1' || host == '::1'
61
+ unless @port_forwards[uri.port]
62
+
63
+ Chef::Log.debug("Forwarding container port #{uri.port} to local port #{uri.port}")
64
+ # Create the channel that will let the container and the host talk to each other
65
+ channel = LXC::Extra::Channel.new
66
+
67
+ # Start the container side of the proxy, listening for client connections
68
+ pid = container.attach do
69
+ begin
70
+ server = TCPServer.new(host, uri.port)
71
+ proxy = LXC::Extra::ProxyClientSide.new(channel, server)
72
+ proxy.start
73
+ rescue
74
+ Chef::Log.error("ERROR in proxy (container side): #{$!}\n#{$!.backtrace.join("\n")}")
75
+ raise
76
+ end
77
+ end
65
78
 
66
- # Start the container side of the proxy, listening for client connections
67
- pid = container.attach do
68
- begin
69
- server = TCPServer.new('127.0.0.1', uri.port)
70
- proxy = LXC::Extra::ProxyClientSide.new(channel, server)
79
+ # Start the host side of the proxy, which contacts the real server
80
+ thread = Thread.new do
81
+ proxy = LXC::Extra::ProxyServerSide.new(channel) do
82
+ TCPSocket.new(host, uri.port)
83
+ end
71
84
  proxy.start
72
- rescue
73
- Chef::Log.error("ERROR in proxy (container side): #{$!}\n#{$!.backtrace.join("\n")}")
74
- raise
75
85
  end
76
- end
77
86
 
78
- # Start the host side of the proxy, which contacts the real server
79
- thread = Thread.new do
80
- proxy = LXC::Extra::ProxyServerSide.new(channel) do
81
- TCPSocket.new('127.0.0.1', uri.port)
82
- end
83
- proxy.start
84
- end
87
+ Chef::Log.debug("Forwarded #{uri.port} on container #{name} to local port #{uri.port}. Container listener id PID #{pid}")
85
88
 
86
- @port_forwards << [ pid, thread, channel ]
89
+ @port_forwards[uri.port] = [ pid, thread, channel ]
90
+ end
87
91
 
88
92
  end
89
93
  local_url
@@ -111,8 +115,10 @@ module ChefMetalLXC
111
115
  end
112
116
 
113
117
  def disconnect
114
- @port_forwards.each do |pid, thread, channel|
118
+ @port_forwards.each_pair do |port, (pid, thread, channel)|
119
+ Chef::Log.debug("stopping port forward #{port} for container #{name}")
115
120
  begin
121
+ Chef::Log.debug("Killing PID #{pid}")
116
122
  Process.kill('KILL', pid)
117
123
  rescue
118
124
  end
@@ -121,7 +127,7 @@ module ChefMetalLXC
121
127
  rescue
122
128
  end
123
129
  end
124
- @port_forwards = []
130
+ @port_forwards = {}
125
131
  @@active_transports.delete(self)
126
132
  end
127
133
 
@@ -1,3 +1,3 @@
1
1
  module ChefMetalLXC
2
- VERSION = '0.4'
2
+ VERSION = '0.5'
3
3
  end
metadata CHANGED
@@ -1,109 +1,103 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-metal-lxc
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ranjib Dey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-08 00:00:00.000000000 Z
11
+ date: 2014-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chef-metal
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.8'
33
+ version: '0.11'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.8'
40
+ version: '0.11'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ruby-lxc
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.0'
48
- - - '>='
49
- - !ruby/object:Gem::Version
50
- version: 1.0.2
47
+ version: '1.1'
51
48
  type: :runtime
52
49
  prerelease: false
53
50
  version_requirements: !ruby/object:Gem::Requirement
54
51
  requirements:
55
- - - ~>
56
- - !ruby/object:Gem::Version
57
- version: '1.0'
58
- - - '>='
52
+ - - "~>"
59
53
  - !ruby/object:Gem::Version
60
- version: 1.0.2
54
+ version: '1.1'
61
55
  - !ruby/object:Gem::Dependency
62
56
  name: lxc-extra
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
- - - ~>
59
+ - - "~>"
66
60
  - !ruby/object:Gem::Version
67
61
  version: '0.0'
68
- - - '>='
62
+ - - ">="
69
63
  - !ruby/object:Gem::Version
70
64
  version: 0.0.3
71
65
  type: :runtime
72
66
  prerelease: false
73
67
  version_requirements: !ruby/object:Gem::Requirement
74
68
  requirements:
75
- - - ~>
69
+ - - "~>"
76
70
  - !ruby/object:Gem::Version
77
71
  version: '0.0'
78
- - - '>='
72
+ - - ">="
79
73
  - !ruby/object:Gem::Version
80
74
  version: 0.0.3
81
75
  - !ruby/object:Gem::Dependency
82
76
  name: rspec
83
77
  requirement: !ruby/object:Gem::Requirement
84
78
  requirements:
85
- - - '>='
79
+ - - ">="
86
80
  - !ruby/object:Gem::Version
87
81
  version: '0'
88
82
  type: :development
89
83
  prerelease: false
90
84
  version_requirements: !ruby/object:Gem::Requirement
91
85
  requirements:
92
- - - '>='
86
+ - - ">="
93
87
  - !ruby/object:Gem::Version
94
88
  version: '0'
95
89
  - !ruby/object:Gem::Dependency
96
90
  name: rake
97
91
  requirement: !ruby/object:Gem::Requirement
98
92
  requirements:
99
- - - '>='
93
+ - - ">="
100
94
  - !ruby/object:Gem::Version
101
95
  version: '0'
102
96
  type: :development
103
97
  prerelease: false
104
98
  version_requirements: !ruby/object:Gem::Requirement
105
99
  requirements:
106
- - - '>='
100
+ - - ">="
107
101
  - !ruby/object:Gem::Version
108
102
  version: '0'
109
103
  description: Provisioner for creating LXC containers in Chef Metal.
@@ -114,13 +108,14 @@ extra_rdoc_files:
114
108
  - README.md
115
109
  - LICENSE
116
110
  files:
117
- - Rakefile
118
111
  - LICENSE
119
112
  - README.md
120
- - lib/chef_metal_lxc/lxc_provisioner.rb
113
+ - Rakefile
114
+ - lib/chef_metal/driver_init/lxc.rb
115
+ - lib/chef_metal_lxc.rb
116
+ - lib/chef_metal_lxc/lxc_driver.rb
121
117
  - lib/chef_metal_lxc/lxc_transport.rb
122
118
  - lib/chef_metal_lxc/version.rb
123
- - lib/chef_metal_lxc.rb
124
119
  homepage: https://github.com/opscode/chef-metal-lxc
125
120
  licenses: []
126
121
  metadata: {}
@@ -130,17 +125,17 @@ require_paths:
130
125
  - lib
131
126
  required_ruby_version: !ruby/object:Gem::Requirement
132
127
  requirements:
133
- - - '>='
128
+ - - ">="
134
129
  - !ruby/object:Gem::Version
135
130
  version: '0'
136
131
  required_rubygems_version: !ruby/object:Gem::Requirement
137
132
  requirements:
138
- - - '>='
133
+ - - ">="
139
134
  - !ruby/object:Gem::Version
140
135
  version: '0'
141
136
  requirements: []
142
137
  rubyforge_project:
143
- rubygems_version: 2.0.3
138
+ rubygems_version: 2.2.2
144
139
  signing_key:
145
140
  specification_version: 4
146
141
  summary: Provisioner for creating LXC containers in Chef Metal.
@@ -1,164 +0,0 @@
1
- require 'chef/mixin/shell_out'
2
- require 'chef_metal/provisioner'
3
- require 'chef_metal/machine/unix_machine'
4
- require 'chef_metal/convergence_strategy/install_cached'
5
- require 'chef_metal_lxc/lxc_transport'
6
- require 'lxc'
7
- require 'shellwords'
8
-
9
- module ChefMetalLXC
10
- # Provisions machines in lxc.
11
- class LXCProvisioner < ChefMetal::Provisioner
12
-
13
- include Chef::Mixin::ShellOut
14
-
15
- def initialize(lxc_path = nil)
16
- @lxc_path = lxc_path || LXC.global_config_item('lxc.lxcpath')
17
- end
18
-
19
- attr_reader :lxc_path
20
-
21
- #
22
- # Acquire a machine, generally by provisioning it. Returns a Machine
23
- # object pointing at the machine, allowing useful actions like setup,
24
- # converge, execute, file and directory. The Machine object will have a
25
- # "node" property which must be saved to the server (if it is any
26
- # different from the original node object).
27
- #
28
- # ## Parameters
29
- # action_handler - the action_handler object that provides context.
30
- # node - node object (deserialized json) representing this machine. If
31
- # the node has a provisioner_options hash in it, these will be used
32
- # instead of options provided by the provisioner. TODO compare and
33
- # fail if different?
34
- # node will have node['normal']['provisioner_options'] in it with any options.
35
- # It is a hash with this format:
36
- #
37
- # -- provisioner_url: lxc:<lxc_path>
38
- # -- template: template name
39
- # -- template_options: additional arguments for templates
40
- # -- backingstore: backing storage (lvm, thinpools, btrfs etc)
41
- # -- config_file: <path> path to LXC file a la https://wiki.archlinux.org/index.php/Linux_Containers#Configuration_file
42
- # -- extra_config: { 'key' => 'value', ... } a set of LXC config key/value pairs to individually set. Merges with, and overrides any values in config_file.
43
- #
44
- # node['normal']['provisioner_output'] will be populated with information
45
- # about the created machine. For lxc, it is a hash with this
46
- # format:
47
- #
48
- # -- provisioner_url: lxc:<lxc_path>
49
- # -- name: container name
50
- #
51
- def acquire_machine(action_handler, node)
52
- # TODO verify that the existing provisioner_url in the node is the same as ours
53
-
54
- # Set up the modified node data
55
- provisioner_options = node['normal']['provisioner_options']
56
- provisioner_output = node['normal']['provisioner_output'] || {
57
- 'provisioner_url' => "lxc:#{lxc_path}",
58
- 'name' => node['name']
59
- }
60
-
61
- # Create the container if it does not exist
62
- ct = LXC::Container.new(provisioner_output['name'], lxc_path)
63
- unless ct.defined?
64
- action_handler.perform_action "create lxc container #{provisioner_output['name']}" do
65
- #
66
- # Set config
67
- #
68
- # TODO if config file changes, reload container?
69
- if provisioner_options['config_file']
70
- ct.load_config(provisioner_options['config_file'])
71
- end
72
- if provisioner_options['extra_config']
73
- provisioner_options['extra_config'].each_pair do |key, value|
74
- ct.set_config_item(key, value)
75
- end
76
- end
77
-
78
- #
79
- # Create the machine
80
- #
81
- ct.create(provisioner_options['template'], provisioner_options['backingstore'], 0, provisioner_options['template_options'])
82
- end
83
- end
84
-
85
- # Unfreeze the frozen
86
- if ct.state == :frozen
87
- action_handler.perform_action "unfreeze lxc container #{provisioner_output['name']} (state is #{ct.state})" do
88
- ct.unfreeze
89
- end
90
- end
91
-
92
- # Get stopped containers running
93
- unless ct.running?
94
- action_handler.perform_action "start lxc container #{provisioner_output['name']} (state is #{ct.state})" do
95
- # Have to shell out to lxc-start for now, ct.start holds server sockets open!
96
- lxc_start = "lxc-start -d -n #{Shellwords.escape(provisioner_output['name'])}"
97
- # TODO add ability to change options on start
98
- # if provisioner_options['config_file']
99
- # lxc_start << " -f #{Shellwords.escape(provisioner_options['config_file'])}"
100
- # end
101
- # if provisioner_options['extra_config']
102
- # provisioner_options['extra_config'].each_pair do |key,value|
103
- # lxc_start << " -s #{Shellwords.escape("#{key}=#{value}")}"
104
- # end
105
- # end
106
- shell_out!(lxc_start)
107
- # ct.start
108
- end
109
- end
110
-
111
- node['normal']['provisioner_output'] = provisioner_output
112
- # Create machine object for callers to use
113
- machine_for(node)
114
- end
115
-
116
- # Connect to machine without acquiring it
117
- def connect_to_machine(node)
118
- machine_for(node)
119
- end
120
-
121
- def delete_machine(action_handler, node)
122
- if node['normal'] && node['normal']['provisioner_output']
123
- provisioner_output = node['normal']['provisioner_output']
124
- ct = LXC::Container.new(provisioner_output['name'], lxc_path)
125
- if ct.defined?
126
- action_handler.perform_action "delete lxc container #{provisioner_output['name']}" do
127
- ct.destroy
128
- end
129
- end
130
- end
131
- convergence_strategy_for(node).delete_chef_objects(action_handler, node)
132
- end
133
-
134
- def stop_machine(action_handler, node)
135
- provisioner_options = node['normal']['provisioner_options']
136
- if node['normal'] && node['normal']['provisioner_output']
137
- provisioner_output = node['normal']['provisioner_output']
138
- ct = LXC::Container.new(provisioner_output['name'], lxc_path)
139
- if ct.running?
140
- action_handler.perform_action "delete lxc container #{provisioner_output['name']}" do
141
- ct.stop
142
- end
143
- end
144
- end
145
- end
146
-
147
- protected
148
-
149
- def machine_for(node)
150
- ChefMetal::Machine::UnixMachine.new(node, transport_for(node), convergence_strategy_for(node))
151
- end
152
-
153
- def convergence_strategy_for(node)
154
- @convergence_strategy ||= begin
155
- ChefMetal::ConvergenceStrategy::InstallCached.new
156
- end
157
- end
158
-
159
- def transport_for(node)
160
- provisioner_output = node['normal']['provisioner_output']
161
- ChefMetalLXC::LXCTransport.new(provisioner_output['name'], lxc_path)
162
- end
163
- end
164
- end