lib/chef_metal.rb in chef-metal-0.10.2 vs lib/chef_metal.rb in chef-metal-0.11.beta
- old
+ new
@@ -1,17 +1,10 @@
# Include recipe basics so require 'chef_metal' will load everything
require 'chef_metal/recipe_dsl'
-require 'chef/resource/machine'
-require 'chef/provider/machine'
-require 'chef/resource/machine_batch'
-require 'chef/provider/machine_batch'
-require 'chef/resource/machine_file'
-require 'chef/provider/machine_file'
-require 'chef/resource/machine_execute'
-require 'chef/provider/machine_execute'
require 'chef/server_api'
require 'cheffish/basic_chef_client'
+require 'cheffish/merged_config'
module ChefMetal
def self.inline_resource(action_handler, &block)
events = ActionHandlerForward.new(action_handler)
Cheffish::BasicChefClient.converge_block(nil, events, &block)
@@ -24,37 +17,42 @@
attr_reader :action_handler
def resource_update_applied(resource, action, update)
prefix = action_handler.should_perform_actions ? "" : "Would "
- update = Array(update).map { |u| "#{prefix}#{u}"}
+ update = Array(update).flatten.map { |u| "#{prefix}#{u}"}
action_handler.performed_action(update)
end
end
+ # Helpers for driver inflation
+ @@registered_driver_classes = {}
+ def self.register_driver_class(name, driver)
+ @@registered_driver_classes[name] = driver
+ end
- # Helpers for provisioner inflation
- @@registered_provisioner_classes = {}
- def self.add_registered_provisioner_class(name, provisioner)
- @@registered_provisioner_classes[name] = provisioner
+ def self.config_for_url(driver_url, config = Chef::Config)
+ if config && config[:drivers] && config[:drivers][driver_url]
+ config = Cheffish::MergedConfig.new(config[:drivers][driver_url], config)
+ end
+ config || {}
end
- def self.provisioner_for_node(node)
- provisioner_url = node['normal']['provisioner_output']['provisioner_url']
- cluster_type = provisioner_url.split(':', 2)[0]
- require "chef_metal/provisioner_init/#{cluster_type}_init"
- provisioner_class = @@registered_provisioner_classes[cluster_type]
- provisioner_class.inflate(node)
+ def self.driver_for_url(driver_url, config = Chef::Config)
+ cluster_type = driver_url.split(':', 2)[0]
+ require "chef_metal/driver_init/#{cluster_type}"
+ driver_class = @@registered_driver_classes[cluster_type]
+ config = config_for_url(driver_url, config)
+ driver_class.from_url(driver_url, config || {})
end
- def self.connect_to_machine(name)
- rest = Chef::ServerAPI.new()
- node = rest.get("/nodes/#{name}")
- provisioner_output = node['normal']['provisioner_output']
- if !provisioner_output
- raise "Node #{name} was not provisioned with Metal."
+ def self.connect_to_machine(machine_spec, config = Chef::Config)
+ driver = driver_for_url(machine_spec.driver_url, config)
+ if driver
+ machine_options = { :convergence_options => { :chef_server => Cheffish.default_chef_server(config) } }
+ machine_options = Cheffish::MergedConfig.new(config[:machine_options], machine_options) if config[:machine_options]
+ driver.connect_to_machine(machine_spec, machine_options)
+ else
+ nil
end
- provisioner = provisioner_for_node(node)
- machine = provisioner.connect_to_machine(node)
- [ machine, provisioner ]
end
end