summaryrefslogtreecommitdiffstats
path: root/cloudmasterd/lib
diff options
context:
space:
mode:
authorroot <root@hackathon1-repo.usersys.redhat.com>2008-06-19 15:36:54 -0400
committerroot <root@hackathon1-repo.usersys.redhat.com>2008-06-19 15:36:54 -0400
commitcf796141ac01c866e81663f20699ccd56ce2d50b (patch)
tree9061bb3c95d638bfed4d880db21e49f9f36cf1ec /cloudmasterd/lib
parent4f244d65c5c2e4ffb4b38e00baa5f83de89c20d8 (diff)
downloadtools-cf796141ac01c866e81663f20699ccd56ce2d50b.tar.gz
tools-cf796141ac01c866e81663f20699ccd56ce2d50b.tar.xz
tools-cf796141ac01c866e81663f20699ccd56ce2d50b.zip
Moved the cloud daemon to cloudmasterd to give it a better name
Diffstat (limited to 'cloudmasterd/lib')
-rw-r--r--cloudmasterd/lib/cloudmasterd.rb170
-rw-r--r--cloudmasterd/lib/cloudmasterd/version.rb9
2 files changed, 179 insertions, 0 deletions
diff --git a/cloudmasterd/lib/cloudmasterd.rb b/cloudmasterd/lib/cloudmasterd.rb
new file mode 100644
index 0000000..14f9fcd
--- /dev/null
+++ b/cloudmasterd/lib/cloudmasterd.rb
@@ -0,0 +1,170 @@
+$: << 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
diff --git a/cloudmasterd/lib/cloudmasterd/version.rb b/cloudmasterd/lib/cloudmasterd/version.rb
new file mode 100644
index 0000000..ec2eb9c
--- /dev/null
+++ b/cloudmasterd/lib/cloudmasterd/version.rb
@@ -0,0 +1,9 @@
+module Cloudmasterd #:nodoc:
+ module VERSION #:nodoc:
+ MAJOR = 0
+ MINOR = 1
+ TINY = 1
+
+ STRING = [MAJOR, MINOR, TINY].join('.')
+ end
+end