summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--everest-bootstrap/bin/everest-bootstrap118
-rw-r--r--everest-bootstrap/lib/everest-bootstrap/core.rb15
-rw-r--r--everest-bootstrap/lib/everest-bootstrap/version.rb2
-rw-r--r--everestd/config.example.yml2
-rw-r--r--everestd/lib/everestd.rb42
-rw-r--r--everestd/lib/everestd/version.rb2
6 files changed, 178 insertions, 3 deletions
diff --git a/everest-bootstrap/bin/everest-bootstrap b/everest-bootstrap/bin/everest-bootstrap
index f76bd5a..7c00de7 100644
--- a/everest-bootstrap/bin/everest-bootstrap
+++ b/everest-bootstrap/bin/everest-bootstrap
@@ -178,4 +178,122 @@ Main {
e.koan(params['virt-path'].value) if params["virt-path"].given?
end
end
+
+ mode 'cloud' do
+ def collect_input
+ unless ENV['USER'] == 'root' || params["config-only"].given?
+ raise "You must run this command as root unless " +
+ "you specify the '--config-only' option"
+ end
+
+ @facts = Hash.new
+
+ @repo = ask("Enter your Everest repo machine name (leave off the '-repo'): ")
+ @user = ask("Enter your kerberos username: ")
+
+ say_red("Your machine name is the part right before the Everest type.")
+ say_red("For example, 'sso1-build.usersys.redhat.com' has a machine name of 'sso1'.")
+ say_red("If you do not specify a machine name it will default to your kerberos name.")
+
+ if agree("Enter machine name? (y/n)", true)
+ @machine_name = ask("Machine name: ")
+ else
+ @machine_name = @user
+ end
+
+ # Once we know the repo we can fetch the supported machines
+ @everest_repo = EverestRepo.new(@repo)
+ say_red("To see a description of these machine types visit: " +
+ "#{@everest_repo.machine_types_url}")
+
+ @machine_type = choose do |menu|
+ menu.prompt = "Select your machine type: "
+ menu.choices(*@everest_repo.machines.map{|m| m.name})
+ end
+
+ # This might be useful is we stop using DDNS
+ @facts["everest_machine_type"] = @machine_type
+
+ if agree("Configure this machine with Red Hat DDNS? (y/n)", true)
+ # Our naming convention
+ hostname = @machine_name + "-" + @machine_type
+ @fqdn = hostname + ".usersys.redhat.com"
+
+ if agree("Do you know the DDNS hash for this machine? (y/n)", true)
+ @facts["rh_ddns_hash"] = ask("Enter Red Hat DDNS hash: ")
+ else
+ @password = ask("Enter your kerberos password to setup DDNS: ") { |q| q.echo = "*" }
+ @facts["rh_ddns_hash"] = RedHatDDNS::DDNS.new(@user, @password, hostname).ddns_hash
+ end
+ else
+ @fqdn = ask("Enter fully qualified domain name for this machine: ")
+ end
+
+ @facts["cobbler_profile"] = choose do |menu|
+ menu.prompt = "Select your cobbler profile (This determines the OS): "
+ menu.choices(*@everest_repo.cobbler_profiles)
+ end
+
+ say_red("Now you need to enter some parameters what will be used to configure this machine.")
+ say_red("Most of the defaults will work out fine for development.")
+
+ @everest_repo.facts_for(@machine_type, @machine_name).each do |f|
+ say_red("Description: #{f.desc}") unless f.desc.empty?
+ @facts[f.name] = ask("Enter value for #{f.name}: ") do |q|
+ q.default = f.default
+ end
+ end
+
+ if agree("Enter addition facts? (y/n)", true)
+ begin
+ name = ask("Enter fact name: ")
+ value = ask("Enter fact value: ")
+ @facts[name] = value
+ end while agree("Enter another? ", true)
+ end
+
+ say_red("The Koan process will start on the repo you selected.")
+ end
+
+ def run
+ collect_input
+
+ classes = @everest_repo.classes_for(@machine_type)
+ config = {"classes" => classes, "parameters" => @facts}
+
+ @everest_repo.create_machine(@fqdn, config)
+ end
+ end
+
+ mode 'cloud-advanced' do
+ option('fqdn', 'f'){
+ required
+ description "Fully qualified domain name of machine to be provisioned"
+ argument_required
+ }
+
+ option('repo', '-r'){
+ required
+ description "Fully qualified domain name for the Everest repo machine to use for provisioning"
+ argument_required
+ }
+
+ option('yaml', 'y'){
+ description "YAML configuration for this machine"
+ argument_required
+ validate {|f| File.exist?(f)}
+ }
+
+ def run
+ config = if params['yaml'].given?
+ YAML.load(File.read(params['yaml'].value))
+ else
+ YAML.load($stdin.read)
+ end
+
+ everest_repo = EverestRepo.new(params['repo'].value)
+ everest_repo.create_machine(params['fqdn'].value, config)
+ end
+
+ end
}
diff --git a/everest-bootstrap/lib/everest-bootstrap/core.rb b/everest-bootstrap/lib/everest-bootstrap/core.rb
index 6b380c8..c3f4c7c 100644
--- a/everest-bootstrap/lib/everest-bootstrap/core.rb
+++ b/everest-bootstrap/lib/everest-bootstrap/core.rb
@@ -88,6 +88,21 @@ module EverestBootstrap
@cobblerd.call2('modify_system', system_id, 'ksmeta', ksmeta, @token)
@cobblerd.call2('save_system', system_id, @token)
end
+
+ def koan(machine_fqdn)
+ Restr.post("#{@everestd}/koan", :machine_fqdn => machine_fqdn)
+ end
+
+ def create_machine(machine_fqdn, config)
+ # 1. post the configuration
+ # 2. add system to cobbler
+ # 3. ask everestd to koan the machine
+
+ machine_type = config["parameters"]["everest_machine_type"]
+ post_yaml(machine_fqdn, machine_type, YAML.dump(config))
+ add_system_to_cobbler(machine_fqdn, config["parameters"])
+ koan(machine_fqdn)
+ end
end
class EverestMachine
diff --git a/everest-bootstrap/lib/everest-bootstrap/version.rb b/everest-bootstrap/lib/everest-bootstrap/version.rb
index 95162e1..31f0f85 100644
--- a/everest-bootstrap/lib/everest-bootstrap/version.rb
+++ b/everest-bootstrap/lib/everest-bootstrap/version.rb
@@ -2,7 +2,7 @@ module EverestBootstrap
module Version
MAJOR = 0
MINOR = 4
- BUILD = 1
+ BUILD = 2
STRING = [MAJOR, MINOR, BUILD].join(".")
end
diff --git a/everestd/config.example.yml b/everestd/config.example.yml
index c03d8bb..e8287ae 100644
--- a/everestd/config.example.yml
+++ b/everestd/config.example.yml
@@ -84,5 +84,5 @@ port: 8106
log:
level: DEBUG
- file: /var/log/blog.log
+ file: /var/log/everestd.log
# level: INFO
diff --git a/everestd/lib/everestd.rb b/everestd/lib/everestd.rb
index a357cc2..d763445 100644
--- a/everestd/lib/everestd.rb
+++ b/everestd/lib/everestd.rb
@@ -8,6 +8,7 @@ require 'rubygems'
require 'picnic'
require 'reststop'
require 'everest'
+require 'xmlrpc/client'
Camping.goes :Everestd
Everestd.picnic!
@@ -105,6 +106,47 @@ module Everestd::Controllers
redirect R(Nodes)
end
end
+
+ class Koan < REST 'koan'
+ def _get_repo_fqdn
+ ENV['HOSTNAME']
+ end
+
+ # Retrieve the cobbler profile for the given profile name
+ def _get_cobbler_profile(name)
+ repo = _get_repo_fqdn
+ cobblerd = XMLRPC::Client.new2("http://#{repo}:25152")
+ token = cobblerd.call2("login", "cobbler", "password")[1]
+ return cobblerd.call2("get_profile", name, token)[1]
+ 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 `cloud-inventory -m #{ram} -d #{disk_size}`.split(':')
+ end
+
+ def _get_machine_yaml(fqdn)
+ YAML.load_file("/etc/everest/nodes/#{fqdn}/node.yaml")
+ end
+
+ # run the appropriate koan command to create the given "fqdn"
+ # on the given "host" and "vol_group"
+ def _koan(host, vol_group, fqdn)
+ repo = _get_repo_fqdn
+ `func \"#{host}\" call virt install #{repo} #{fqdn} True #{fqdn.split('.')[0]} #{vol_group}`
+ end
+
+ # POST /koan
+ def create
+ machine_fqdn = input.machine_fqdn
+ yaml = _get_machine_yaml(machine_fqdn)
+ cobbler_profile = _get_cobbler_profile(yaml["parameters"]["cobbler_profile"])
+
+ host, vol_group = _get_best_host(cobbler_profile["virt_file_size"], cobbler_profile["virt_ram"])
+ _koan(host, vol_group, machine_fqdn)
+ end
+ end
end
module Everestd::Views
diff --git a/everestd/lib/everestd/version.rb b/everestd/lib/everestd/version.rb
index e7a6c3a..9f493ff 100644
--- a/everestd/lib/everestd/version.rb
+++ b/everestd/lib/everestd/version.rb
@@ -2,7 +2,7 @@ module Everestd #:nodoc:
module VERSION #:nodoc:
MAJOR = 0
MINOR = 1
- TINY = 0
+ TINY = 1
STRING = [MAJOR, MINOR, TINY].join('.')
end