$: << File.dirname(File.expand_path(__FILE__)) gem 'reststop', '~> 0.2' require 'yaml' require 'fileutils' require 'rubygems' require 'picnic' require 'reststop' require 'everest' require 'restr' require 'xmlrpc/client' Camping.goes :Cloudmasterd Cloudmasterd.picnic! module Cloudmasterd::Model end module Cloudmasterd::Helpers class Cobblerd def initialize(repo) @repo = repo @xmlrpc = XMLRPC::Client.new2("http://#{@repo}:25152") @token = @xmlrpc.call2("login", "cobbler", "password")[1] end def _call(method, *args) return @xmlrpc.call2(method, *args)[1] end def distros _call("get_distros", @token) end def profiles _call("get_profiles", @token) end def systems _call("get_systems", @token) end def repos _call("get_repos", @token) end def distro(name) _call("get_distro", name, @token) end def distro_for_koan(name) _call("get_distro_for_koan", name, @token) end def profile(name) _call("get_profile", name, @token) end def profile_for_koan(name) _call("get_profile_for_koan", name, @token) end def system(name) _call("get_system", name, @token) end def system_for_koan(name) _call("get_system_for_koan", name, @token) end def repo(name) _call("get_repo", name, @token) end def repo_for_koan(name) _call("get_repo_for_koan", name, @token) end end end module Cloudmasterd::Controllers class Koan < REST 'koan' # Retrieve the cobbler profile for the given profile name def _get_cobbler_profile(system_name, repo) cobblerd = Cloudmasterd::Helpers::Cobblerd.new(repo) cobbler_system = cobblerd.system(system_name) return cobblerd.profile(cobbler_system["profile"]) end # Find the best host on which to create a VM that requires # the given "disk_size" and "ram" def _get_best_host(disk_size, ram) return `func-find-resources -m #{ram} -d #{disk_size}`.split(':')[0] end # run the appropriate koan command to create the given "fqdn" # on the given "host" and "vol_group" def _koan(host, fqdn, repo) # Run the koan process func_cmd = "func \"#{host}\" call virt install #{repo} #{fqdn} True #{fqdn} /images" puts `#{func_cmd}` # Make the new host autostart func_cmd = "func \"#{host}\" call command run \"ln -s /etc/xen/#{fqdn.split('.')[0]} /etc/xen/auto/\"" puts `#{func_cmd}` end # POST /koan def create machine_fqdn = input.machine_fqdn repo = input.repo cobbler_profile = _get_cobbler_profile(machine_fqdn, repo) @host = _get_best_host(cobbler_profile["virt_file_size"], cobbler_profile["virt_ram"]) _koan(@host, machine_fqdn, repo) render :_koan end end end module Cloudmasterd::Views def initialize(*args) super(*args) @x = Builder::XmlMarkup.new(:indent => 1) end module HTML def layout html do head do title 'Everest Cloud Master Controller' #link :rel => 'stylesheet', :type => 'text/css', #:href => self/'/styles.css', :media => 'screen' end body do div.content do self << yield end end end end def _koan @host end end default_format :HTML module YAML CONTENT_TYPE = 'text/plain' def layout yield end end module XML def layout yield end end end # Required by picnic def Cloudmasterd.create; end Cloudmasterd.start_picnic