chef-metal 0.14.2 → 0.15
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 +4 -4
- data/CHANGELOG.md +5 -1
- data/README.md +2 -257
- data/Rakefile +0 -4
- data/lib/chef_metal.rb +1 -87
- data/lib/chef_metal/action_handler.rb +1 -66
- data/lib/chef_metal/add_prefix_action_handler.rb +1 -29
- data/lib/chef_metal/chef_image_spec.rb +1 -106
- data/lib/chef_metal/chef_machine_spec.rb +1 -82
- data/lib/chef_metal/chef_provider_action_handler.rb +1 -72
- data/lib/chef_metal/chef_run_data.rb +1 -125
- data/lib/chef_metal/convergence_strategy.rb +1 -26
- data/lib/chef_metal/convergence_strategy/install_cached.rb +1 -157
- data/lib/chef_metal/convergence_strategy/install_msi.rb +1 -56
- data/lib/chef_metal/convergence_strategy/install_sh.rb +1 -53
- data/lib/chef_metal/convergence_strategy/no_converge.rb +1 -37
- data/lib/chef_metal/convergence_strategy/precreate_chef_objects.rb +1 -181
- data/lib/chef_metal/driver.rb +1 -288
- data/lib/chef_metal/image_spec.rb +1 -70
- data/lib/chef_metal/machine.rb +1 -110
- data/lib/chef_metal/machine/basic_machine.rb +1 -82
- data/lib/chef_metal/machine/unix_machine.rb +1 -276
- data/lib/chef_metal/machine/windows_machine.rb +1 -102
- data/lib/chef_metal/machine_spec.rb +1 -78
- data/lib/chef_metal/recipe_dsl.rb +1 -94
- data/lib/chef_metal/transport.rb +1 -87
- data/lib/chef_metal/transport/ssh.rb +1 -288
- data/lib/chef_metal/transport/winrm.rb +1 -134
- data/lib/chef_metal/version.rb +1 -3
- metadata +19 -145
- data/bin/metal +0 -275
- data/lib/chef/provider/machine.rb +0 -171
- data/lib/chef/provider/machine_batch.rb +0 -186
- data/lib/chef/provider/machine_execute.rb +0 -30
- data/lib/chef/provider/machine_file.rb +0 -49
- data/lib/chef/provider/machine_image.rb +0 -54
- data/lib/chef/resource/machine.rb +0 -116
- data/lib/chef/resource/machine_batch.rb +0 -72
- data/lib/chef/resource/machine_execute.rb +0 -22
- data/lib/chef/resource/machine_file.rb +0 -28
- data/lib/chef/resource/machine_image.rb +0 -29
@@ -1,29 +1 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
module ChefMetal
|
4
|
-
class AddPrefixActionHandler
|
5
|
-
extend Forwardable
|
6
|
-
|
7
|
-
def initialize(action_handler, prefix)
|
8
|
-
@action_handler = action_handler
|
9
|
-
@prefix = prefix
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :action_handler
|
13
|
-
attr_reader :prefix
|
14
|
-
|
15
|
-
def_delegators :@action_handler, :should_perform_actions, :updated!, :open_stream, :host_node
|
16
|
-
|
17
|
-
def report_progress(description)
|
18
|
-
action_handler.report_progress(Array(description).flatten.map { |d| "#{prefix}#{d}" })
|
19
|
-
end
|
20
|
-
|
21
|
-
def performed_action(description)
|
22
|
-
action_handler.performed_action(Array(description).flatten.map { |d| "#{prefix}#{d}" })
|
23
|
-
end
|
24
|
-
|
25
|
-
def perform_action(description, &block)
|
26
|
-
action_handler.perform_action(Array(description).flatten.map { |d| "#{prefix}#{d}" }, &block)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
1
|
+
require "chef/provisioning/add_prefix_action_handler"
|
@@ -1,106 +1 @@
|
|
1
|
-
require
|
2
|
-
require 'cheffish'
|
3
|
-
require 'chef_metal/image_spec'
|
4
|
-
|
5
|
-
module ChefMetal
|
6
|
-
#
|
7
|
-
# Specification for a image. Sufficient information to find and contact it
|
8
|
-
# after it has been set up.
|
9
|
-
#
|
10
|
-
class ChefImageSpec < ImageSpec
|
11
|
-
def initialize(node, chef_server)
|
12
|
-
super(node)
|
13
|
-
@chef_server = chef_server
|
14
|
-
end
|
15
|
-
|
16
|
-
#
|
17
|
-
# Get a ImageSpec from the chef server. If the node does not exist on the
|
18
|
-
# server, it returns nil.
|
19
|
-
#
|
20
|
-
def self.get(name, chef_server = Cheffish.default_chef_server)
|
21
|
-
chef_api = Cheffish.chef_server_api(chef_server)
|
22
|
-
begin
|
23
|
-
data = chef_api.get("/data/images/#{name}")
|
24
|
-
data['machine_options'] = strings_to_symbols(data['machine_options'])
|
25
|
-
ChefImageSpec.new(data, chef_server)
|
26
|
-
rescue Net::HTTPServerException => e
|
27
|
-
if e.response.code == '404'
|
28
|
-
nil
|
29
|
-
else
|
30
|
-
raise
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# Creates a new empty ImageSpec with the given name.
|
36
|
-
def self.empty(id, chef_server = Cheffish.default_chef_server)
|
37
|
-
ChefImageSpec.new({ 'id' => id }, chef_server)
|
38
|
-
end
|
39
|
-
|
40
|
-
#
|
41
|
-
# Globally unique identifier for this image. Does not depend on the image's
|
42
|
-
# location or existence.
|
43
|
-
#
|
44
|
-
def id
|
45
|
-
ChefImageSpec.id_from(chef_server, name)
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.id_from(chef_server, name)
|
49
|
-
"#{chef_server[:chef_server_url]}/data/images/#{name}"
|
50
|
-
end
|
51
|
-
|
52
|
-
#
|
53
|
-
# Save this node to the server. If you have significant information that
|
54
|
-
# could be lost, you should do this as quickly as possible. Data will be
|
55
|
-
# saved automatically for you after allocate_image and ready_image.
|
56
|
-
#
|
57
|
-
def save(action_handler)
|
58
|
-
# Save the node to the server.
|
59
|
-
_self = self
|
60
|
-
_chef_server = _self.chef_server
|
61
|
-
ChefMetal.inline_resource(action_handler) do
|
62
|
-
chef_data_bag_item _self.name do
|
63
|
-
data_bag 'images'
|
64
|
-
chef_server _chef_server
|
65
|
-
raw_data _self.image_data
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def delete(action_handler)
|
71
|
-
# Save the node to the server.
|
72
|
-
_self = self
|
73
|
-
_chef_server = _self.chef_server
|
74
|
-
ChefMetal.inline_resource(action_handler) do
|
75
|
-
chef_data_bag_item _self.name do
|
76
|
-
data_bag 'images'
|
77
|
-
chef_server _chef_server
|
78
|
-
action :destroy
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
protected
|
84
|
-
|
85
|
-
attr_reader :chef_server
|
86
|
-
|
87
|
-
#
|
88
|
-
# Chef API object for the given Chef server
|
89
|
-
#
|
90
|
-
def chef_api
|
91
|
-
Cheffish.server_api_for(chef_server)
|
92
|
-
end
|
93
|
-
|
94
|
-
def self.strings_to_symbols(data)
|
95
|
-
if data.is_a?(Hash)
|
96
|
-
result = {}
|
97
|
-
data.each_pair do |key, value|
|
98
|
-
result[key.to_sym] = strings_to_symbols(value)
|
99
|
-
end
|
100
|
-
result
|
101
|
-
else
|
102
|
-
data
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
1
|
+
require "chef/provisioning/chef_image_spec"
|
@@ -1,82 +1 @@
|
|
1
|
-
require
|
2
|
-
require 'chef_metal'
|
3
|
-
require 'cheffish'
|
4
|
-
require 'chef_metal/machine_spec'
|
5
|
-
|
6
|
-
module ChefMetal
|
7
|
-
#
|
8
|
-
# Specification for a machine. Sufficient information to find and contact it
|
9
|
-
# after it has been set up.
|
10
|
-
#
|
11
|
-
class ChefMachineSpec < MachineSpec
|
12
|
-
def initialize(node, chef_server)
|
13
|
-
super(node)
|
14
|
-
@chef_server = chef_server
|
15
|
-
end
|
16
|
-
|
17
|
-
#
|
18
|
-
# Get a MachineSpec from the chef server. If the node does not exist on the
|
19
|
-
# server, it returns nil.
|
20
|
-
#
|
21
|
-
def self.get(name, chef_server = Cheffish.default_chef_server)
|
22
|
-
chef_api = Cheffish.chef_server_api(chef_server)
|
23
|
-
begin
|
24
|
-
ChefMachineSpec.new(chef_api.get("/nodes/#{name}"), chef_server)
|
25
|
-
rescue Net::HTTPServerException => e
|
26
|
-
if e.response.code == '404'
|
27
|
-
nil
|
28
|
-
else
|
29
|
-
raise
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# Creates a new empty MachineSpec with the given name.
|
35
|
-
def self.empty(name, chef_server = Cheffish.default_chef_server)
|
36
|
-
ChefMachineSpec.new({ 'name' => name, 'normal' => {} }, chef_server)
|
37
|
-
end
|
38
|
-
|
39
|
-
#
|
40
|
-
# Globally unique identifier for this machine. Does not depend on the machine's
|
41
|
-
# location or existence.
|
42
|
-
#
|
43
|
-
def id
|
44
|
-
ChefMachineSpec.id_from(chef_server, name)
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.id_from(chef_server, name)
|
48
|
-
"#{chef_server[:chef_server_url]}/nodes/#{name}"
|
49
|
-
end
|
50
|
-
|
51
|
-
#
|
52
|
-
# Save this node to the server. If you have significant information that
|
53
|
-
# could be lost, you should do this as quickly as possible. Data will be
|
54
|
-
# saved automatically for you after allocate_machine and ready_machine.
|
55
|
-
#
|
56
|
-
def save(action_handler)
|
57
|
-
if location && (!location.is_a?(Hash) || !location['driver_url'])
|
58
|
-
raise "Drivers must specify a canonical driver_url in machine_spec.location. Contact your driver's author."
|
59
|
-
end
|
60
|
-
# Save the node to the server.
|
61
|
-
_self = self
|
62
|
-
_chef_server = _self.chef_server
|
63
|
-
ChefMetal.inline_resource(action_handler) do
|
64
|
-
chef_node _self.name do
|
65
|
-
chef_server _chef_server
|
66
|
-
raw_json _self.node
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
protected
|
72
|
-
|
73
|
-
attr_reader :chef_server
|
74
|
-
|
75
|
-
#
|
76
|
-
# Chef API object for the given Chef server
|
77
|
-
#
|
78
|
-
def chef_api
|
79
|
-
Cheffish.server_api_for(chef_server)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
1
|
+
require "chef/provisioning/chef_machine_spec"
|
@@ -1,72 +1 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# Author:: Douglas Triggs (<doug@getchef.com>)
|
4
|
-
#
|
5
|
-
# Copyright (C) 2014, Chef, Inc.
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
|
19
|
-
require 'chef_metal/action_handler'
|
20
|
-
|
21
|
-
# This is included in the metal drivers to proxy from generic requests needed
|
22
|
-
# to specific driver actions
|
23
|
-
module ChefMetal
|
24
|
-
class ChefProviderActionHandler < ActionHandler
|
25
|
-
def initialize(provider)
|
26
|
-
@provider = provider
|
27
|
-
end
|
28
|
-
|
29
|
-
attr_reader :provider
|
30
|
-
|
31
|
-
def updated!
|
32
|
-
provider.new_resource.updated_by_last_action(true)
|
33
|
-
end
|
34
|
-
|
35
|
-
def should_perform_actions
|
36
|
-
!provider.run_context.config.why_run
|
37
|
-
end
|
38
|
-
|
39
|
-
def report_progress(description)
|
40
|
-
# TODO this seems wrong but Chef doesn't have another thing
|
41
|
-
provider.converge_by description do
|
42
|
-
# We already did the action, but we trust whoever told us that they did it.
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def performed_action(description)
|
47
|
-
provider.converge_by description do
|
48
|
-
# We already did the action, but we trust whoever told us that they did it.
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def perform_action(description, &block)
|
53
|
-
provider.converge_by(description, &block)
|
54
|
-
end
|
55
|
-
|
56
|
-
def open_stream(name, &block)
|
57
|
-
if provider.run_context.respond_to?(:open_stream)
|
58
|
-
provider.run_context.open_stream({ :name => name }, &block)
|
59
|
-
else
|
60
|
-
if block_given?
|
61
|
-
yield STDOUT
|
62
|
-
else
|
63
|
-
STDOUT
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def host_node
|
69
|
-
"#{provider.run_context.config[:chef_server_url]}/nodes/#{provider.run_context.node['name']}"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
1
|
+
require "chef/provisioning/chef_provider_action_handler"
|
@@ -1,125 +1 @@
|
|
1
|
-
require
|
2
|
-
require 'cheffish/merged_config'
|
3
|
-
require 'chef_metal/chef_machine_spec'
|
4
|
-
|
5
|
-
module ChefMetal
|
6
|
-
class ChefRunData
|
7
|
-
|
8
|
-
def initialize(config)
|
9
|
-
@config = config
|
10
|
-
@drivers = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
attr_reader :config
|
14
|
-
attr_reader :drivers
|
15
|
-
attr_reader :current_driver
|
16
|
-
attr_accessor :current_machine_options
|
17
|
-
attr_accessor :current_image_options
|
18
|
-
|
19
|
-
|
20
|
-
def with_machine_options(value)
|
21
|
-
old_value = self.current_machine_options
|
22
|
-
self.current_machine_options = value
|
23
|
-
if block_given?
|
24
|
-
begin
|
25
|
-
yield
|
26
|
-
ensure
|
27
|
-
self.current_machine_options = old_value
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def with_image_options(value)
|
33
|
-
old_value = self.current_image_options
|
34
|
-
self.current_image_options = value
|
35
|
-
if block_given?
|
36
|
-
begin
|
37
|
-
yield
|
38
|
-
ensure
|
39
|
-
self.current_image_options = old_value
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def with_driver(driver, options = nil, &block)
|
46
|
-
if drivers[driver] && options
|
47
|
-
raise "Driver #{driver} has already been created, options #{options} would be ignored!"
|
48
|
-
end
|
49
|
-
@current_driver = driver
|
50
|
-
@current_driver_options = options
|
51
|
-
end
|
52
|
-
|
53
|
-
def current_driver
|
54
|
-
@current_driver || config[:driver]
|
55
|
-
end
|
56
|
-
|
57
|
-
def current_machine_options
|
58
|
-
if @current_machine_options
|
59
|
-
@current_machine_options
|
60
|
-
else
|
61
|
-
{}
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def current_image_options
|
66
|
-
if @current_image_options
|
67
|
-
@current_image_options
|
68
|
-
else
|
69
|
-
{}
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def add_machine_options(options, &block)
|
74
|
-
with_machine_options(Chef::Mixin::DeepMerge.hash_only_merge(current_machine_options, options), &block)
|
75
|
-
end
|
76
|
-
|
77
|
-
def driver_for(driver)
|
78
|
-
driver.is_a?(String) ? driver_for_url(driver) : driver
|
79
|
-
end
|
80
|
-
|
81
|
-
def connect_to_machine(name, chef_server = nil)
|
82
|
-
if name.is_a?(MachineSpec)
|
83
|
-
machine_spec = name
|
84
|
-
else
|
85
|
-
machine_spec = ChefMetal::ChefMachineSpec.get(name, chef_server)
|
86
|
-
end
|
87
|
-
ChefMetal.connect_to_machine(machine_spec, config)
|
88
|
-
end
|
89
|
-
|
90
|
-
private
|
91
|
-
|
92
|
-
def driver_for_url(driver_url)
|
93
|
-
drivers[driver_url] ||= begin
|
94
|
-
if driver_url == @current_driver && @current_driver_options
|
95
|
-
# Use the driver options if available
|
96
|
-
merged_config = Cheffish::MergedConfig.new({ :driver_options => @current_driver_options }, config)
|
97
|
-
driver = ChefMetal.driver_for_url(driver_url, merged_config)
|
98
|
-
else
|
99
|
-
driver = ChefMetal.driver_for_url(driver_url, config)
|
100
|
-
end
|
101
|
-
# Check the canonicalized driver_url from the driver
|
102
|
-
if driver.driver_url != driver_url
|
103
|
-
if drivers[driver.driver_url] && @current_driver_options
|
104
|
-
raise "Canonical driver #{driver.driver_url} for #{driver_url} has already been created! Current options #{@current_driver_options} would be ignored."
|
105
|
-
end
|
106
|
-
drivers[driver.driver_url] ||= driver
|
107
|
-
else
|
108
|
-
driver
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def keys
|
114
|
-
result = (config.keys || {}).dup
|
115
|
-
Array(config.key_path) do |key_path|
|
116
|
-
Dir.entries(key_path).each do |key|
|
117
|
-
if File.extname(key) == '.pem'
|
118
|
-
result[File.basename(key)[0..-5]] ||= key
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
result
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
1
|
+
require "chef/provisioning/chef_run_data"
|
@@ -1,26 +1 @@
|
|
1
|
-
|
2
|
-
class ConvergenceStrategy
|
3
|
-
# convergence_options - a freeform hash of options to the converger.
|
4
|
-
# config - a Chef::Config-like object with global config like :log_level
|
5
|
-
def initialize(convergence_options, config)
|
6
|
-
@convergence_options = convergence_options || {}
|
7
|
-
@config = config
|
8
|
-
end
|
9
|
-
|
10
|
-
attr_reader :convergence_options
|
11
|
-
attr_reader :config
|
12
|
-
|
13
|
-
# Get the machine ready to converge, but do not converge.
|
14
|
-
def setup_convergence(action_handler, machine)
|
15
|
-
raise "setup_convergence not overridden on #{self.class}"
|
16
|
-
end
|
17
|
-
|
18
|
-
def converge(action_handler, machine)
|
19
|
-
raise "converge not overridden on #{self.class}"
|
20
|
-
end
|
21
|
-
|
22
|
-
def cleanup_convergence(action_handler, machine_spec)
|
23
|
-
raise "cleanup_convergence not overridden on #{self.class}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
1
|
+
require "chef/provisioning/convergence_strategy"
|