chef-provisioning 0.19 → 0.20

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -32
  3. data/lib/chef/provider/load_balancer.rb +18 -8
  4. data/lib/chef/provider/machine.rb +11 -7
  5. data/lib/chef/provider/machine_batch.rb +8 -4
  6. data/lib/chef/provider/machine_execute.rb +1 -1
  7. data/lib/chef/provider/machine_image.rb +46 -14
  8. data/lib/chef/provisioning.rb +9 -1
  9. data/lib/chef/provisioning/chef_managed_entry_store.rb +128 -0
  10. data/lib/chef/provisioning/chef_run_data.rb +9 -16
  11. data/lib/chef/provisioning/convergence_strategy/install_cached.rb +25 -7
  12. data/lib/chef/provisioning/convergence_strategy/install_msi.rb +26 -8
  13. data/lib/chef/provisioning/convergence_strategy/install_sh.rb +28 -6
  14. data/lib/chef/provisioning/driver.rb +28 -21
  15. data/lib/chef/provisioning/load_balancer_spec.rb +6 -71
  16. data/lib/chef/provisioning/machine_image_spec.rb +34 -0
  17. data/lib/chef/provisioning/machine_spec.rb +23 -47
  18. data/lib/chef/provisioning/managed_entry.rb +121 -0
  19. data/lib/chef/provisioning/managed_entry_store.rb +136 -0
  20. data/lib/chef/provisioning/recipe_dsl.rb +0 -4
  21. data/lib/chef/provisioning/version.rb +1 -1
  22. data/lib/chef/resource/chef_data_bag_resource.rb +1 -2
  23. data/lib/chef/resource/load_balancer.rb +1 -0
  24. data/lib/chef/resource/machine.rb +1 -1
  25. data/lib/chef/resource/machine_batch.rb +2 -2
  26. data/lib/chef/resource/machine_execute.rb +2 -1
  27. metadata +7 -8
  28. data/lib/chef/provisioning/chef_image_spec.rb +0 -111
  29. data/lib/chef/provisioning/chef_load_balancer_spec.rb +0 -108
  30. data/lib/chef/provisioning/chef_machine_spec.rb +0 -83
  31. data/lib/chef/provisioning/image_spec.rb +0 -72
@@ -3,6 +3,7 @@ require 'chef/provisioning/recipe_dsl'
3
3
  require 'chef/server_api'
4
4
  require 'cheffish/basic_chef_client'
5
5
  require 'cheffish/merged_config'
6
+ require 'chef/provisioning/chef_managed_entry_store'
6
7
 
7
8
  class Chef
8
9
  module Provisioning
@@ -53,6 +54,9 @@ module Provisioning
53
54
  end
54
55
  end
55
56
  driver_class = @@registered_driver_classes[scheme]
57
+ if !driver_class
58
+ raise "chef/provisioning/driver_init/#{scheme} did not register a driver class for #{scheme.inspect}! Perhaps you have the case (uppercase or lowercase) wrong?"
59
+ end
56
60
 
57
61
  #
58
62
  # Merge in any driver-specific config
@@ -82,7 +86,7 @@ module Provisioning
82
86
  def self.connect_to_machine(machine_spec, config = Cheffish.profiled_config)
83
87
  chef_server = Cheffish.default_chef_server(config)
84
88
  if machine_spec.is_a?(String)
85
- machine_spec = ChefMachineSpec.get(machine_spec, chef_server)
89
+ machine_spec = chef_managed_entry_store(chef_server).get(:machine, machine_spec)
86
90
  end
87
91
  driver = driver_for_url(machine_spec.driver_url, config)
88
92
  if driver
@@ -93,6 +97,10 @@ module Provisioning
93
97
  nil
94
98
  end
95
99
  end
100
+
101
+ def self.chef_managed_entry_store(chef_server = Cheffish.default_chef_server)
102
+ Provisioning::ChefManagedEntryStore.new(chef_server)
103
+ end
96
104
  end
97
105
  end
98
106
 
@@ -0,0 +1,128 @@
1
+ require 'chef/provisioning/managed_entry_store'
2
+ require 'cheffish'
3
+
4
+ class Chef
5
+ module Provisioning
6
+ class ChefManagedEntryStore < ManagedEntryStore
7
+ def initialize(chef_server = Cheffish.default_chef_server)
8
+ @chef_server = chef_server
9
+ end
10
+
11
+ attr_reader :chef_server
12
+
13
+ def chef_api
14
+ @chef_api ||= Cheffish.chef_server_api(chef_server)
15
+ end
16
+
17
+ #
18
+ # Get the given data
19
+ #
20
+ # @param resource_type [Symbol] The type of thing to retrieve (:machine, :machine_image, :load_balancer, :aws_vpc, :aws_subnet, ...)
21
+ # @param name [String] The unique identifier of the thing to retrieve
22
+ #
23
+ # @return [Hash,Array] The data, or `nil` if the data does not exist. Will be JSON- and YAML-compatible (Hash, Array, String, Integer, Boolean, Nil)
24
+ #
25
+ def get_data(resource_type, name)
26
+ begin
27
+ if resource_type == :machine
28
+ chef_api.get("nodes/#{name}")
29
+ else
30
+ chef_api.get("data/#{resource_type}/#{name}")
31
+ end
32
+ rescue Net::HTTPServerException => e
33
+ if e.response.code == '404'
34
+ backcompat_type = ChefManagedEntryStore.type_names_for_backcompat[resource_type]
35
+ if backcompat_type && backcompat_type != resource_type
36
+ get_data(backcompat_type, name)
37
+ else
38
+ nil
39
+ end
40
+ else
41
+ raise
42
+ end
43
+ end
44
+ end
45
+
46
+ #
47
+ # Save the given data
48
+ #
49
+ # @param resource_type [Symbol] The type of thing to save (:machine, :machine_image, :load_balancer, :aws_vpc, :aws_subnet ...)
50
+ # @param name [String] The unique identifier of the thing to save
51
+ # @param data [Hash,Array] The data to save. Must be JSON- and YAML-compatible (Hash, Array, String, Integer, Boolean, Nil)
52
+ #
53
+ def save_data(resource_type, name, data, action_handler)
54
+ _chef_server = self.chef_server
55
+ Chef::Provisioning.inline_resource(action_handler) do
56
+ if resource_type == :machine
57
+ chef_node name do
58
+ chef_server _chef_server
59
+ raw_json data
60
+ end
61
+ else
62
+ chef_data_bag resource_type.to_s do
63
+ chef_server _chef_server
64
+ end
65
+ chef_data_bag_item name do
66
+ chef_server _chef_server
67
+ data_bag resource_type.to_s
68
+ raw_data data
69
+ end
70
+ end
71
+ end
72
+
73
+ backcompat_type = ChefManagedEntryStore.type_names_for_backcompat[resource_type]
74
+ if backcompat_type && backcompat_type != resource_type
75
+ delete_data(backcompat_type, name, action_handler)
76
+ end
77
+ end
78
+
79
+ #
80
+ # Delete the given data
81
+ #
82
+ # @param resource_type [Symbol] The type of thing to delete (:machine, :machine_image, :load_balancer, :aws_vpc, :aws_subnet, ...)
83
+ # @param name [String] The unique identifier of the thing to delete
84
+ #
85
+ # @return [Boolean] Whether anything was deleted or not.
86
+ #
87
+ def delete_data(resource_type, name, action_handler)
88
+ _chef_server = self.chef_server
89
+ Chef::Provisioning.inline_resource(action_handler) do
90
+ if resource_type == :machine
91
+ chef_node name do
92
+ chef_server _chef_server
93
+ action :delete
94
+ end
95
+ else
96
+ chef_data_bag_item name do
97
+ chef_server _chef_server
98
+ data_bag resource_type.to_s
99
+ action :delete
100
+ end
101
+ end
102
+ end
103
+
104
+ backcompat_type = ChefManagedEntryStore.type_names_for_backcompat[resource_type]
105
+ if backcompat_type && backcompat_type != resource_type
106
+ delete_data(backcompat_type, name, action_handler)
107
+ end
108
+ end
109
+
110
+ def identifier(resource_type, name)
111
+ if resource_type == :machine
112
+ File.join(chef_server[:chef_server_url], "nodes", name)
113
+ else
114
+ File.join(chef_server[:chef_server_url], "data", resource_type.to_s, name)
115
+ end
116
+ end
117
+
118
+ #
119
+ # A list of the name that we used to use to store a given type before we
120
+ # standardized on "just use the resource name so we don't create collisions."
121
+ # Will be used to look up the old data.
122
+ #
123
+ def self.type_names_for_backcompat
124
+ @@type_names_for_backcompat ||= {}
125
+ end
126
+ end
127
+ end
128
+ end
@@ -1,6 +1,5 @@
1
1
  require 'chef/mixin/deep_merge'
2
2
  require 'cheffish/merged_config'
3
- require 'chef/provisioning/chef_machine_spec'
4
3
 
5
4
  class Chef
6
5
  module Provisioning
@@ -17,7 +16,6 @@ module Provisioning
17
16
  attr_accessor :current_machine_options
18
17
  attr_accessor :current_load_balancer_options
19
18
  attr_accessor :current_image_options
20
- attr_accessor :current_data_center
21
19
 
22
20
  def with_machine_options(value)
23
21
  old_value = self.current_machine_options
@@ -43,26 +41,21 @@ module Provisioning
43
41
  end
44
42
  end
45
43
 
46
- def with_data_center(value)
47
- old_value = self.current_data_center
48
- self.current_data_center = value
44
+ def with_driver(driver, options = nil, &block)
45
+ if drivers[driver] && options
46
+ raise "Driver #{driver} has already been created, options #{options} would be ignored!"
47
+ end
48
+ old_driver, old_options = @current_driver, @current_driver_options
49
+ @current_driver, @current_driver_options = driver, options
49
50
  if block_given?
50
51
  begin
51
52
  yield
52
53
  ensure
53
- self.current_data_center = old_value
54
+ @current_driver, @current_driver_options = old_driver, old_options
54
55
  end
55
56
  end
56
57
  end
57
58
 
58
- def with_driver(driver, options = nil, &block)
59
- if drivers[driver] && options
60
- raise "Driver #{driver} has already been created, options #{options} would be ignored!"
61
- end
62
- @current_driver = driver
63
- @current_driver_options = options
64
- end
65
-
66
59
  def current_driver
67
60
  @current_driver || config[:driver]
68
61
  end
@@ -92,10 +85,10 @@ module Provisioning
92
85
  end
93
86
 
94
87
  def connect_to_machine(name, chef_server = nil)
95
- if name.is_a?(MachineSpec)
88
+ if name.is_a?(ManagedEntry)
96
89
  machine_spec = name
97
90
  else
98
- machine_spec = Chef::Provisioning::ChefMachineSpec.get(name, chef_server)
91
+ machine_spec = Provisioning.chef_managed_entry_store(chef_server).get(:machine, name)
99
92
  end
100
93
  Chef::Provisioning.connect_to_machine(machine_spec, config)
101
94
  end
@@ -42,14 +42,32 @@ module Provisioning
42
42
  def setup_convergence(action_handler, machine)
43
43
  super
44
44
 
45
- # Install chef-client. TODO check and update version if not latest / not desired
46
- if machine.execute_always('chef-client -v').exitstatus != 0
47
- platform, platform_version, machine_architecture = machine.detect_os(action_handler)
48
- package_file = download_package_for_platform(action_handler, machine, platform, platform_version, machine_architecture)
49
- remote_package_file = "#{@tmp_dir}/#{File.basename(package_file)}"
50
- machine.upload_file(action_handler, package_file, remote_package_file)
51
- install_package(action_handler, machine, remote_package_file)
45
+ # Check for existing chef client.
46
+ version = machine.execute_always('chef-client -v')
47
+
48
+ # Don't do install/upgrade if a chef client exists and
49
+ # no chef version is defined by user configs or
50
+ # the chef client's version already matches user config
51
+ if version.exitstatus == 0
52
+ version = version.stdout.strip
53
+ if !chef_version
54
+ return
55
+ elsif version =~ /Chef: #{chef_version}$/
56
+ Chef::Log.debug "Already installed chef version #{version}"
57
+ return
58
+ elsif version.include?(chef_version)
59
+ Chef::Log.warn "Installed chef version #{version} contains desired version #{chef_version}. " +
60
+ "If you see this message on consecutive chef runs tighten your desired version constraint to prevent " +
61
+ "multiple convergence."
62
+ end
52
63
  end
64
+
65
+ # Install chef client
66
+ platform, platform_version, machine_architecture = machine.detect_os(action_handler)
67
+ package_file = download_package_for_platform(action_handler, machine, platform, platform_version, machine_architecture)
68
+ remote_package_file = "#{@tmp_dir}/#{File.basename(package_file)}"
69
+ machine.upload_file(action_handler, package_file, remote_package_file)
70
+ install_package(action_handler, machine, remote_package_file)
53
71
  end
54
72
 
55
73
  def converge(action_handler, machine)
@@ -28,15 +28,33 @@ module Provisioning
28
28
 
29
29
  super
30
30
 
31
- # Install chef-client. TODO check and update version if not latest / not desired
32
- if machine.execute_always('chef-client -v').exitstatus != 0
33
- # TODO ssh verification of install.msi before running arbtrary code would be nice?
34
- # TODO find a way to cache this on the host like with the Unix stuff.
35
- # Limiter is we don't know how to efficiently upload large files to
36
- # the remote machine with WMI.
37
- machine.execute(action_handler, "(New-Object System.Net.WebClient).DownloadFile(#{machine.escape(install_msi_url)}, #{machine.escape(install_msi_path)})")
38
- machine.execute(action_handler, "msiexec /qn /i #{machine.escape(install_msi_path)}")
31
+ # Check for existing chef client.
32
+ version = machine.execute_always('chef-client -v')
33
+
34
+ # Don't do install/upgrade if a chef client exists and
35
+ # no chef version is defined by user configs or
36
+ # the chef client's version already matches user config
37
+ if version.exitstatus == 0
38
+ version = version.stdout.strip
39
+ if !chef_version
40
+ return
41
+ elsif version =~ /Chef: #{chef_version}$/
42
+ Chef::Log.debug "Already installed chef version #{version}"
43
+ return
44
+ elsif version.include?(chef_version)
45
+ Chef::Log.warn "Installed chef version #{version} contains desired version #{chef_version}. " +
46
+ "If you see this message on consecutive chef runs tighten your desired version constraint to prevent " +
47
+ "multiple convergence."
48
+ end
39
49
  end
50
+
51
+ # Install chef client
52
+ # TODO ssh verification of install.msi before running arbtrary code would be nice?
53
+ # TODO find a way to cache this on the host like with the Unix stuff.
54
+ # Limiter is we don't know how to efficiently upload large files to
55
+ # the remote machine with WMI.
56
+ machine.execute(action_handler, "(New-Object System.Net.WebClient).DownloadFile(#{machine.escape(install_msi_url)}, #{machine.escape(install_msi_path)})")
57
+ machine.execute(action_handler, "msiexec /qn /i #{machine.escape(install_msi_path)}")
40
58
  end
41
59
 
42
60
  def converge(action_handler, machine)
@@ -39,13 +39,35 @@ module Provisioning
39
39
  def setup_convergence(action_handler, machine)
40
40
  super
41
41
 
42
- # Install chef-client. TODO check and update version if not latest / not desired
43
- if machine.execute_always('chef-client -v').exitstatus != 0
44
- # TODO ssh verification of install.sh before running arbtrary code would be nice?
45
- @@install_sh_cache[install_sh_url] ||= Net::HTTP.get(URI(install_sh_url))
46
- machine.write_file(action_handler, install_sh_path, @@install_sh_cache[install_sh_url], :ensure_dir => true)
47
- machine.execute(action_handler, install_sh_command_line)
42
+ # Check for existing chef client.
43
+ version = machine.execute_always('chef-client -v')
44
+
45
+ # Don't do install/upgrade if a chef client exists and
46
+ # no chef version is defined by user configs or
47
+ # the chef client's version already matches user config
48
+ if version.exitstatus == 0
49
+ version = version.stdout.strip
50
+ if !chef_version
51
+ return
52
+ # This logic doesn't cover the case for a client with 12.0.1.dev.0 => 12.0.1
53
+ # so we decided to just use exact version for the time being (see comments in PR 303)
54
+ #elsif version.stdout.strip =~ /Chef: #{chef_version}([^0-9]|$)/
55
+ elsif version =~ /Chef: #{chef_version}$/
56
+ Chef::Log.debug "Already installed chef version #{version}"
57
+ return
58
+ elsif version.include?(chef_version)
59
+ Chef::Log.warn "Installed chef version #{version} contains desired version #{chef_version}. " +
60
+ "If you see this message on consecutive chef runs tighten your desired version constraint to prevent " +
61
+ "multiple convergence."
62
+ end
48
63
  end
64
+
65
+ # Install chef client
66
+ # TODO ssh verification of install.sh before running arbtrary code would be nice?
67
+ @@install_sh_cache[install_sh_url] ||= Net::HTTP.get(URI(install_sh_url))
68
+ machine.write_file(action_handler, install_sh_path, @@install_sh_cache[install_sh_url], :ensure_dir => true)
69
+ # TODO handle bad version case better
70
+ machine.execute(action_handler, install_sh_command_line)
49
71
  end
50
72
 
51
73
  def converge(action_handler, machine)
@@ -59,7 +59,7 @@ module Provisioning
59
59
 
60
60
  #
61
61
  # A URL representing the driver and the place where machines come from.
62
- # This will be stuffed in machine_spec.location['driver_url'] so that the
62
+ # This will be stuffed in machine_spec.reference['driver_url'] so that the
63
63
  # machine can be re-inflated. URLs must have a unique scheme identifying the
64
64
  # driver class, and enough information to identify the place where created
65
65
  # machines can be found. For AWS, this is the account number; for lxc and
@@ -94,7 +94,7 @@ module Provisioning
94
94
 
95
95
  # Allocate a machine from the underlying service. This method
96
96
  # does not need to wait for the machine to boot or have an IP, but it must
97
- # store enough information in machine_spec.location to find the machine
97
+ # store enough information in machine_spec.reference to find the machine
98
98
  # later in ready_machine.
99
99
  #
100
100
  # If a machine is powered off or otherwise unusable, this method may start
@@ -102,11 +102,11 @@ module Provisioning
102
102
  # gears moving, but the job doesn't need to be done :)
103
103
  #
104
104
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
105
- # @param [Chef::Provisioning::MachineSpec] machine_spec A machine specification representing this machine.
105
+ # @param [Chef::Provisioning::ManagedEntry] machine_spec A machine specification representing this machine.
106
106
  # @param [Hash] machine_options A set of options representing the desired options when
107
107
  # constructing the machine
108
108
  #
109
- # @return [Chef::Provisioning::MachineSpec] Modifies the passed-in machine_spec. Anything in here will be saved
109
+ # @return [Chef::Provisioning::ManagedEntry] Modifies the passed-in machine_spec. Anything in here will be saved
110
110
  # back after allocate_machine completes.
111
111
  #
112
112
  def allocate_machine(action_handler, machine_spec, machine_options)
@@ -121,7 +121,7 @@ module Provisioning
121
121
  #
122
122
  #
123
123
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
124
- # @param [Chef::Provisioning::MachineSpec] machine_spec A machine specification representing this machine.
124
+ # @param [Chef::Provisioning::ManagedEntry] machine_spec A machine specification representing this machine.
125
125
  # @param [Hash] machine_options A set of options representing the desired state of the machine
126
126
  #
127
127
  # @return [Machine] A machine object pointing at the machine, allowing useful actions like setup,
@@ -134,7 +134,7 @@ module Provisioning
134
134
  # Connect to a machine without allocating or readying it. This method will
135
135
  # NOT make any changes to anything, or attempt to wait.
136
136
  #
137
- # @param [Chef::Provisioning::MachineSpec] machine_spec MachineSpec representing this machine.
137
+ # @param [Chef::Provisioning::ManagedEntry] machine_spec ManagedEntry representing this machine.
138
138
  # @param [Hash] machine_options
139
139
  # @return [Machine] A machine object pointing at the machine, allowing useful actions like setup,
140
140
  # converge, execute, file and directory.
@@ -148,7 +148,7 @@ module Provisioning
148
148
  # returning things to the state before allocate_machine was called.
149
149
  #
150
150
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
151
- # @param [Chef::Provisioning::MachineSpec] machine_spec A machine specification representing this machine.
151
+ # @param [Chef::Provisioning::ManagedEntry] machine_spec A machine specification representing this machine.
152
152
  # @param [Hash] machine_options A set of options representing the desired state of the machine
153
153
  def destroy_machine(action_handler, machine_spec, machine_options)
154
154
  raise "#{self.class} does not implement destroy_machine"
@@ -157,7 +157,7 @@ module Provisioning
157
157
  # Stop the given machine.
158
158
  #
159
159
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
160
- # @param [Chef::Provisioning::MachineSpec] machine_spec A machine specification representing this machine.
160
+ # @param [Chef::Provisioning::ManagedEntry] machine_spec A machine specification representing this machine.
161
161
  # @param [Hash] machine_options A set of options representing the desired state of the machine
162
162
  def stop_machine(action_handler, machine_spec, machine_options)
163
163
  raise "#{self.class} does not implement stop_machine"
@@ -166,17 +166,19 @@ module Provisioning
166
166
  # Allocate an image. Returns quickly with an ID that tracks the image.
167
167
  #
168
168
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
169
- # @param [Chef::Provisioning::ImageSpec] image_spec A machine specification representing this machine.
170
- # @param [Hash] image_options A set of options representing the desired state of the machine
171
- def allocate_image(action_handler, image_spec, image_options, machine_spec)
169
+ # @param [Chef::Provisioning::ManagedEntry] image_spec An image specification representing this image.
170
+ # @param [Hash] image_options A set of options representing the desired state of the image
171
+ # @param [Chef::Provisioning::ManagedEntry] machine_spec A machine specification representing this machine.
172
+ # @param [Hash] machine_options A set of options representing the desired state of the machine used to create the image
173
+ def allocate_image(action_handler, image_spec, image_options, machine_spec, machine_options)
172
174
  raise "#{self.class} does not implement create_image"
173
175
  end
174
176
 
175
177
  # Ready an image, waiting till the point where it is ready to be used.
176
178
  #
177
179
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
178
- # @param [Chef::Provisioning::ImageSpec] image_spec A machine specification representing this machine.
179
- # @param [Hash] image_options A set of options representing the desired state of the machine
180
+ # @param [Chef::Provisioning::ManagedEntry] image_spec An image specification representing this image.
181
+ # @param [Hash] image_options A set of options representing the desired state of the image
180
182
  def ready_image(action_handler, image_spec, image_options)
181
183
  raise "#{self.class} does not implement ready_image"
182
184
  end
@@ -184,9 +186,10 @@ module Provisioning
184
186
  # Destroy an image using this service.
185
187
  #
186
188
  # @param [Chef::Provisioning::ActionHandler] action_handler The action_handler object that is calling this method
187
- # @param [Chef::Provisioning::ImageSpec] image_spec A machine specification representing this machine.
188
- # @param [Hash] image_options A set of options representing the desired state of the machine
189
- def destroy_image(action_handler, image_spec, image_options)
189
+ # @param [Chef::Provisioning::ManagedEntry] image_spec An image specification representing this image.
190
+ # @param [Hash] image_options A set of options representing the desired state of the image
191
+ # @param [Hash] machine_options A set of options representing the desired state of the machine used to create the image
192
+ def destroy_image(action_handler, image_spec, image_options, machine_options)
190
193
  raise "#{self.class} does not implement destroy_image"
191
194
  end
192
195
 
@@ -267,18 +270,22 @@ module Provisioning
267
270
  end
268
271
 
269
272
  # Allocate a load balancer
270
- # @param [ChefMetal::ActionHandler] action_handler The action handler
271
- # @param [ChefMetal::LoadBalancerSpec] lb_spec Frozen LB specification
273
+ # @param [Chef::Provisioning::ActionHandler] action_handler The action handler
274
+ # @param [Chef::Provisioning::ManagedEntry] lb_spec Frozen LB specification
272
275
  # @param [Hash] lb_options A hash of options to pass the LB
273
276
  # @param [Array[ChefMetal::MachineSpec]] machine_specs An array of machine specs
274
- # the load balancer should have
277
+ # the load balancer should have. `nil` indicates "leave the set of machines
278
+ # alone," or for new LBs, it means "no machines."
275
279
  def allocate_load_balancer(action_handler, lb_spec, lb_options, machine_specs)
276
280
  end
277
281
 
278
282
  # Make the load balancer ready
279
- # @param [ChefMetal::ActionHandler] action_handler The action handler
280
- # @param [ChefMetal::LoadBalancerSpec] lb_spec Frozen LB specification
283
+ # @param [Chef::Provisioning::ActionHandler] action_handler The action handler
284
+ # @param [Chef::Provisioning::ManagedEntry] lb_spec Frozen LB specification
281
285
  # @param [Hash] lb_options A hash of options to pass the LB
286
+ # @param [Array[ChefMetal::MachineSpec]] machine_specs An array of machine specs
287
+ # the load balancer should have. `nil` indicates "leave the set of machines
288
+ # alone," or for new LBs, it means "no machines."
282
289
  def ready_load_balancer(action_handler, lb_spec, lb_options, machine_specs)
283
290
  end
284
291