Parent

Files

Class/Module Index [+]

Quicksearch

Chef::ApiClient::Registration

Chef::ApiClient::Registration

Manages the process of creating or updating a Chef::ApiClient on the server and writing the resulting private key to disk. Registration uses the validator credentials for its API calls. This allows it to bootstrap a new client/node identity by borrowing the validator client identity when creating a new client.

Attributes

destination[R]
name[R]
private_key[R]

Public Class Methods

new(name, destination) click to toggle source
# File lib/chef/api_client/registration.rb, line 37
def initialize(name, destination)
  @name = name
  @destination = destination
  @private_key = nil
end

Public Instance Methods

assert_destination_writable!() click to toggle source
# File lib/chef/api_client/registration.rb, line 69
def assert_destination_writable!
  if (File.exists?(destination) && !File.writable?(destination)) or !File.writable?(File.dirname(destination))
    raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination} - check permissions?"
  end
end
create() click to toggle source
# File lib/chef/api_client/registration.rb, line 92
def create
  response = http_api.post("clients", :name => name, :admin => false)
  @private_key = response["private_key"]
  response
end
create_or_update() click to toggle source
# File lib/chef/api_client/registration.rb, line 83
def create_or_update
  create
rescue Net::HTTPServerException => e
  # If create fails because the client exists, attempt to update. This
  # requires admin privileges.
  raise unless e.response.code == "409"
  update
end
file_flags() click to toggle source
# File lib/chef/api_client/registration.rb, line 116
def file_flags
  base_flags = File::CREAT|File::TRUNC|File::RDWR
  # Windows doesn't have symlinks, so it doesn't have NOFOLLOW
  base_flags |= File::NOFOLLOW if defined?(File::NOFOLLOW)
  base_flags
end
http_api() click to toggle source
# File lib/chef/api_client/registration.rb, line 110
def http_api
  @http_api_as_validator ||= Chef::REST.new(Chef::Config[:chef_server_url],
                                            Chef::Config[:validation_client_name],
                                            Chef::Config[:validation_key])
end
run() click to toggle source

Runs the client registration process, including creating the client on the chef-server and writing its private key to disk.

# File lib/chef/api_client/registration.rb, line 53
def run
  assert_destination_writable!
  retries = Config[:client_registration_retries] || 5
  begin
    create_or_update
  rescue Net::HTTPFatalError => e
    # HTTPFatalError implies 5xx.
    raise if retries <= 0
    retries -= 1
    Chef::Log.warn("Failed to register new client, #{retries} tries remaining")
    Chef::Log.warn("Response: HTTP #{e.response.code} - #{e}")
    retry
  end
  write_key
end
update() click to toggle source
# File lib/chef/api_client/registration.rb, line 98
def update
  response = http_api.put("clients/#{name}", :name => name,
                                               :admin => false,
                                               :private_key => true)
  if response.respond_to?(:private_key) # Chef 11
    @private_key = response.private_key
  else # Chef 10
    @private_key = response["private_key"]
  end
  response
end
write_key() click to toggle source
# File lib/chef/api_client/registration.rb, line 75
def write_key
  ::File.open(destination, file_flags, 0600) do |f|
    f.print(private_key)
  end
rescue IOError => e
  raise Chef::Exceptions::CannotWritePrivateKey, "Error writing private key to #{destination}: #{e}"
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.