class Server
require 'json'
require 'nanite'
require 'chef'
@@servers = Hash.new
@@packages = Hash.new
@@installed_packages = Hash.new
@@job_data = Hash.new
@@resources = Hash.new
@@recipes = Hash.new
def self.send_pkg_resource(server_name, pkg, action)
resource = Chef::Resource::Package.new(pkg)
resource.action(action)
resource.provider(Chef::Provider::Package::Apt)
payload = {
:resource => resource
}
@@job_data[server_name] ||= Hash.new
@@job_data[server_name][pkg] = :running
r = Nanite.mapper.request('/control/resource', payload, :target => @@servers[server_name]) do |response_full|
response = response_full[@@servers[server_name]]
@@job_data[server_name] ||= Hash.new
if action == :install
@@job_data[server_name][response[:resource].name] = :updated
@@installed_packages[server_name][response[:resource].name] = 1
else
@@job_data[server_name][response[:resource].name] = :updated
@@installed_packages[server_name].delete(response[:resource].name)
end
end
@@job_data[server_name]
end
def self.resources(server_name)
@@resources[server_name]
end
def self.job_data(server_name, pkg)
@@job_data[server_name][pkg]
end
def self.wipe_job_data(server_name, pkg)
if @@job_data.has_key?(server_name) && @@job_data[server_name].has_key?(pkg)
@@job_data[server_name].delete(pkg)
end
end
def self.recipe_check(server_name, payload)
@@job_data[server_name] ||= Hash.new
@@job_data[server_name]['recipe'] = :running
r = Nanite.mapper.request('/control/check_recipe', payload, :target => @@servers[server_name]) do |response_full|
response = response_full[@@servers[server_name]]
@@job_data[server_name] ||= Hash.new
@@job_data[server_name]['recipe'] = :updated
@@resources[server_name] = response
end
@@job_data[server_name]
end
def self.recipe_run(server_name, payload)
@@job_data[server_name] ||= Hash.new
@@job_data[server_name]['recipe'] = :running
r = Nanite.mapper.request('/control/recipe', payload, :target => @@servers[server_name]) do |response_full|
response = response_full[@@servers[server_name]]
@@job_data[server_name] ||= Hash.new
@@job_data[server_name]['recipe'] = :updated
@@resources[server_name] = response
Merb.logger.warn(response.inspect)
response[:resources].each do |r|
if r.action == 'install'
@@installed_packages[server_name][r.name] = 1
else
@@installed_packages[server_name].delete(r.name)
end
end
end
@@job_data[server_name]
end
def self.install_package(server_name, pkg)
self.send_pkg_resource(server_name, pkg, :install)
end
def self.uninstall_package(server_name, pkg)
self.send_pkg_resource(server_name, pkg, :remove)
end
def self.list
r = Nanite.mapper.request('/state/index', '[ "/hostname" ]', :selector => 'all') do |response|
response.each do |k,v|
v['/hostname'].gsub!(/"/, '')
@@servers[v['/hostname']] = k
end
end
end
def self.servers
@@servers
end
def self.packages
@@packages
end
def self.installed_packages
@@installed_packages
end
def self.node_packages(name)
packages = {}
count = 0
@@packages[name].sort.each do |k, v|
packages[k] = v if count <= 100
count += 1
end
packages
end
def self.node_installed_packages(name)
@@installed_packages[name]
packages = {}
count = 0
@@installed_packages[name].sort.each do |k, v|
packages[k] = v if count <= 100
count += 1
end
packages
end
def self.get_all_packages()
@@servers.each_key do |server_name|
Nanite.mapper.request('/state/packages_available', "", :target => @@servers[server_name]) do |response|
response.each do |k,v|
@@packages[server_name] = v
end
end
end
end
def self.get_all_packages_installed()
@@servers.each_key do |server_name|
Nanite.mapper.request('/state/packages_installed', "", :target => @@servers[server_name]) do |response|
response.each do |k,v|
@@installed_packages[server_name] = v
end
end
end
end
end