Ian Main
2009-Nov-04 19:59 UTC
[Ovirt-devel] [PATCH server] Update daemons to use new QMF.
This patch updates dbomatic, taskomatic and host-register to use the new C++ wrapped ruby QMF bindings. It also fixes a couple of bugs along the way including the 0 cpu bug for host-register. This is a compilation of work done by myself and Arjun Roy. Signed-off-by: Ian Main <imain at redhat.com> --- src/db-omatic/db_omatic.rb | 111 ++++++------- src/host-browser/host-register.rb | 337 ++++++++++++++++++++----------------- src/libvirt-list.rb | 31 +++-- src/matahari-list.rb | 33 +++-- src/task-omatic/task_storage.rb | 10 +- src/task-omatic/taskomatic.rb | 81 +++++---- 6 files changed, 323 insertions(+), 280 deletions(-) diff --git a/src/db-omatic/db_omatic.rb b/src/db-omatic/db_omatic.rb index c400097..686ad71 100755 --- a/src/db-omatic/db_omatic.rb +++ b/src/db-omatic/db_omatic.rb @@ -3,18 +3,18 @@ $: << File.join(File.dirname(__FILE__), "../dutils") $: << File.join(File.dirname(__FILE__), ".") -require "rubygems" -require "qpid" +require 'rubygems' require 'monitor' require 'dutils' require 'daemons' require 'optparse' require 'logger' require 'vnc' +require 'qmf' +require 'socket' include Daemonize - # This sad and pathetic readjustment to ruby logger class is # required to fix the formatting because rails does the same # thing but overrides it to just the message. @@ -29,12 +29,9 @@ end $logfile = '/var/log/ovirt-server/db-omatic.log' - -class DbOmatic < Qpid::Qmf::Console - +class DbOmatic < Qmf::ConsoleHandler # Use monitor mixin for mutual exclusion around checks to heartbeats # and updates to objects/heartbeats. - include MonitorMixin def initialize() @@ -77,7 +74,6 @@ class DbOmatic < Qpid::Qmf::Console begin ensure_credentials - database_connect server, port = nil @@ -91,8 +87,17 @@ class DbOmatic < Qpid::Qmf::Console end @logger.info "Connecting to amqp://#{server}:#{port}" - @session = Qpid::Qmf::Session.new(:console => self, :manage_connections => true) - @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI') + @settings = Qmf::ConnectionSettings.new + @settings.host = server + @settings.port = port +# @settings.mechanism = 'GSSAPI' +# @settings.service = 'qpidd' + @settings.sendUserId = false + + @connection = Qmf::Connection.new(@settings) + @qmfc = Qmf::Console.new(self) + @broker = @qmfc.add_connection(@connection) + @broker.wait_for_stable db_init_cleanup rescue Exception => ex @@ -101,10 +106,8 @@ class DbOmatic < Qpid::Qmf::Console end end - def ensure_credentials() get_credentials('qpidd') - Thread.new do while true do sleep(3600) @@ -195,7 +198,7 @@ class DbOmatic < Qpid::Qmf::Console if state == Vm::STATE_STOPPED @logger.info "VM has moved to stopped, clearing VM attributes." - qmf_vm = @session.object(:class => "domain", 'uuid' => vm.uuid) + qmf_vm = @qmfc.object(Qmf::Query.new(:class => "domain", 'uuid' => vm.uuid)) if qmf_vm @logger.info "Deleting VM #{vm.description}." result = qmf_vm.undefine @@ -207,9 +210,9 @@ class DbOmatic < Qpid::Qmf::Console # If we are running, update the node that the domain is running on elsif state == Vm::STATE_RUNNING @logger.info "VM is running, determine the node it is running on" - qmf_vm = @session.object(:class => "domain", 'uuid' => vm.uuid) + qmf_vm = @qmfc.object(Qmf::Query.new(:class => "domain", 'uuid' => vm.uuid)) if qmf_vm - qmf_host = @session.object(:class => "node", :object_id => qmf_vm.node) + qmf_host = @qmfc.object(Qmf::Query.new(:class => "node", :object_id => qmf_vm.node)) db_host = Host.find(:first, :conditions => ['hostname = ?', qmf_host.hostname]) @logger.info "VM #{vm.description} is running on node #{db_host.hostname}" vm.host_id = db_host.id @@ -273,7 +276,7 @@ class DbOmatic < Qpid::Qmf::Console # Double check to make sure this host is still up. begin - qmf_host = @session.object(:class => 'node', 'hostname' => host_info['hostname']) + qmf_host = @qmfc.objects(Qmf::Query.new(:class => "node", 'hostname' => host_info['hostname'])) if !qmf_host @logger.info "Host #{host_info['hostname']} is not up after waiting 20 seconds, skipping dead VM check." else @@ -301,16 +304,23 @@ class DbOmatic < Qpid::Qmf::Console end end - def object_props(broker, obj) - target = obj.schema.klass_key.package + def object_update(obj, hasProps, hasStats) + target = obj.object_class.package_name + type = obj.object_class.class_name return if target != "com.redhat.libvirt" - type = obj.schema.klass_key.klass_name + if hasProps + update_props(obj, type) + end + if hasStats + update_stats(obj, type) + end + end + def update_props(obj, type) # I just sync this whole thing because there shouldn't be a lot of contention here.. synchronize do values = @cached_objects[obj.object_id.to_s] - new_object = false if values == nil @@ -318,8 +328,7 @@ class DbOmatic < Qpid::Qmf::Console # Save the agent and broker bank so that we can tell what objects # are expired when the heartbeat for them stops. - values[:broker_bank] = obj.object_id.broker_bank - values[:agent_bank] = obj.object_id.agent_bank + values[:agent_key] = obj.object_id.agent_key values[:obj_key] = obj.object_id.to_s values[:class_type] = type values[:timed_out] = false @@ -370,53 +379,48 @@ class DbOmatic < Qpid::Qmf::Console end end - def object_stats(broker, obj) - target = obj.schema.klass_key.package - return if target != "com.redhat.libvirt" - type = obj.schema.klass_key.klass_name - + def update_stats(obj, type) synchronize do values = @cached_objects[obj.object_id.to_s] - if !values + if values == nil values = {} @cached_objects[obj.object_id.to_s] = values - - values[:broker_bank] = obj.object_id.broker_bank - values[:agent_bank] = obj.object_id.agent_bank + values[:agent_key] = obj.object_id.agent_key values[:class_type] = type values[:timed_out] = false values[:synced] = false end + obj.statistics.each do |key, newval| if values[key.to_s] != newval values[key.to_s] = newval - #puts "new value for statistic #{key} : #{newval}" end end end end - def heartbeat(agent, timestamp) - puts "heartbeat from agent #{agent}" + def agent_heartbeat(agent, timestamp) + puts "heartbeat from agent #{agent.key}" return if agent == nil synchronize do - bank_key = "#{agent.agent_bank}.#{agent.broker.broker_bank}" - @heartbeats[bank_key] = [agent, timestamp] + @heartbeats[agent.key] = [agent, timestamp] end end + def agent_added(agent) + @logger.info("Agent connected: #{agent.key}") + end - def del_agent(agent) + def agent_deleted(agent) agent_disconnected(agent) end # This method marks objects associated with the given agent as timed out/invalid. Called either # when the agent heartbeats out, or we get a del_agent callback. def agent_disconnected(agent) + puts "agent_disconnected: #{agent.key}" @cached_objects.keys.each do |objkey| - if @cached_objects[objkey][:broker_bank] == agent.broker.broker_bank and - @cached_objects[objkey][:agent_bank] == agent.agent_bank - + if @cached_objects[objkey][:agent_key] == agent.key values = @cached_objects[objkey] if values[:timed_out] == false @logger.info "Marking object of type #{values[:class_type]} with key #{objkey} as timed out." @@ -430,8 +434,7 @@ class DbOmatic < Qpid::Qmf::Console values[:timed_out] = true end end - bank_key = "#{agent.agent_bank}.#{agent.broker.broker_bank}" - @heartbeats.delete(bank_key) + @heartbeats.delete(agent.key) end # The opposite of above, this is called when an agent is alive and well and makes sure @@ -439,9 +442,7 @@ class DbOmatic < Qpid::Qmf::Console def agent_connected(agent) @cached_objects.keys.each do |objkey| - if @cached_objects[objkey][:broker_bank] == agent.broker.broker_bank and - @cached_objects[objkey][:agent_bank] == agent.agent_bank - + if @cached_objects[objkey][:agent_key] == agent.key values = @cached_objects[objkey] if values[:timed_out] == true or values[:synced] == false if values[:class_type] == 'node' @@ -482,7 +483,7 @@ class DbOmatic < Qpid::Qmf::Console # them to stopped. VMs that exist as QMF objects will get set appropriately when the objects # appear on the bus. begin - qmf_vm = @session.object(:class => 'domain', 'uuid' => db_vm.uuid) + qmf_vm = @qmfc.object(Qmf::Query.new(:class => "domain", 'uuid' => db_vm.uuid)) if qmf_vm == nil set_stopped = true end @@ -498,15 +499,6 @@ class DbOmatic < Qpid::Qmf::Console end end - def broker_connected(broker) - @logger.info "Connected to broker." - end - - def broker_disconnected(broker) - @logger.error "Broker disconnected." - end - - # This is the mainloop that is called into as a separate thread. This just loops through # and makes sure all the agents are still reporting. If they aren't they get marked as # down. @@ -527,7 +519,7 @@ class DbOmatic < Qpid::Qmf::Console s = timestamp / 1000000000 delta = t - s - puts "Checking time delta for agent #{agent} - #{delta}" + puts "Checking time delta for agent #{agent.key} - #{delta}" if delta > 30 # No heartbeat for 30 seconds.. deal with dead/disconnected agent. @@ -545,15 +537,10 @@ class DbOmatic < Qpid::Qmf::Console end end - def main() - + Thread.abort_on_exception = true dbsync = DbOmatic.new() - - # Call into mainloop.. dbsync.check_heartbeats() - end main() - diff --git a/src/host-browser/host-register.rb b/src/host-browser/host-register.rb index 06d8553..e57b077 100755 --- a/src/host-browser/host-register.rb +++ b/src/host-browser/host-register.rb @@ -4,12 +4,13 @@ $: << File.join(File.dirname(__FILE__), "../dutils") $: << File.join(File.dirname(__FILE__), ".") require 'rubygems' -require 'qpid' require 'monitor' require 'dutils' require 'daemons' require 'optparse' require 'logger' +require 'qmf' +require 'socket' include Daemonize @@ -27,13 +28,17 @@ end $logfile = '/var/log/ovirt-server/host-register.log' -class HostRegister < Qpid::Qmf::Console +class HostRegister < Qmf::ConsoleHandler # Use monitor mixin for mutual exclusion around checks to heartbeats # and updates to objects/heartbeats. include MonitorMixin + # def initialize: Takes no parameters + # On initialize, we get a connection to the database. + # We then query the name and address of the qpidd server + # using dnsmasq records, and connect to qpidd. def initialize() super() @cached_hosts = {} @@ -78,7 +83,6 @@ class HostRegister < Qpid::Qmf::Console begin ensure_credentials - database_connect server, port = nil @@ -92,8 +96,17 @@ class HostRegister < Qpid::Qmf::Console end @logger.info "Connecting to amqp://#{server}:#{port}" - @session = Qpid::Qmf::Session.new(:console => self, :manage_connections => true) - @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI') + @settings = Qmf::ConnectionSettings.new + @settings.host = server + @settings.port = port + # @settings.mechanism = 'GSSAPI' + # @settings.service = 'qpidd' + @settings.sendUserId = false + + @connection = Qmf::Connection.new(@settings) + @qmfc = Qmf::Console.new(self) + @broker = @qmfc.add_connection(@connection) + @broker.wait_for_stable rescue Exception => ex @logger.error "Error in hostregister: #{ex}" @@ -101,6 +114,7 @@ class HostRegister < Qpid::Qmf::Console end end + ###### Utility Methods ###### def debugputs(msg) puts msg if @debug == true and @do_daemon == false end @@ -116,20 +130,66 @@ class HostRegister < Qpid::Qmf::Console end end - def broker_connected(broker) - @logger.info 'Connected to broker.' + ###### QMF Callbacks ###### + def agent_heartbeat(agent, timestamp) + return if agent == nil + synchronize do + bank_key = "#{agent.agent_bank}.#{agent.broker_bank}" + @heartbeats[bank_key] = [agent, timestamp] + end end - def broker_disconnected(broker) - @logger.error 'Broker disconnected.' + def agent_added(agent) + agent_bank = agent.agent_bank + broker_bank = agent.broker_bank + key = "#{agent_bank}.#{broker_bank}" + + puts "AGENT ADDED: #{key}" + debugputs "Agent #{agent_bank}.#{broker_bank} connected!" + agent_connected(agent_bank, broker_bank) + + host_list = @qmfc.objects(:package => 'com.redhat.matahari', :class => 'host') + puts "host_list length is #{host_list.length}" + host_list.each do |host| + if host.object_id.agent_bank == agent_bank + # Grab the cpus and nics associated before we take any locks + cpu_info = @qmfc.objects(:package => 'com.redhat.matahari', :class => 'cpu', 'host' => host.object_id) + nic_info = @qmfc.objects(:package => 'com.redhat.matahari', :class => 'nic', 'host' => host.object_id) + + # And pass it on to the real handler + update_host(host, cpu_info, nic_info) + end + end end - def agent_disconnected(agent) + def agent_deleted(agent) + agent_bank = agent.agent_bank + broker_bank = agent.broker_bank + key = "#{agent_bank}.#{broker_bank}" + + debugputs "Agent #{key} disconnected!" + @heartbeats.delete(key) + agent_disconnected(agent_bank, broker_bank) + end + + def object_update(obj, hasProps, hasStats) + target = obj.object_class.package_name + type = obj.object_class.class_name + return if target != 'com.redhat.matahari' or type != 'host' or hasProps == false + + # Fix a race where the properties of an object are published by a reconnecting + # host (thus marking it active) right before the heartbeat timer considers it dead + # (and marks it inactive) + @heartbeats.delete("#{obj.object_id.agent_bank}.#{obj.object_id.broker_bank}") + end # def object_props + + ###### Handlers for QMF Callbacks ###### + def agent_disconnected(agent_bank, broker_bank) synchronize do - debugputs "Marking objects for agent #{agent.broker.broker_bank}.#{agent.agent_bank} inactive" + debugputs "Marking objects for agent #{broker_bank}.#{agent_bank} inactive" @cached_hosts.keys.each do |objkey| - if @cached_hosts[objkey][:broker_bank] == agent.broker.broker_bank and - @cached_hosts[objkey][:agent_bank] == agent.agent_bank + if @cached_hosts[objkey][:broker_bank] == broker_bank and + @cached_hosts[objkey][:agent_bank] == agent_bank cached_host = @cached_hosts[objkey] cached_host[:active] = false @@ -139,12 +199,12 @@ class HostRegister < Qpid::Qmf::Console end # synchronize do end - def agent_connected(agent) + def agent_connected(agent_bank, broker_bank) synchronize do - debugputs "Marking objects for agent #{agent.broker.broker_bank}.#{agent.agent_bank} active" + debugputs "Marking objects for agent #{broker_bank}.#{agent_bank} active" @cached_hosts.keys.each do |objkey| - if @cached_hosts[objkey][:broker_bank] == agent.broker.broker_bank and - @cached_hosts[objkey][:agent_bank] == agent.agent_bank + if @cached_hosts[objkey][:broker_bank] == broker_bank and + @cached_hosts[objkey][:agent_bank] == agent_bank cached_host = @cached_hosts[objkey] cached_host[:active] = true @@ -154,123 +214,10 @@ class HostRegister < Qpid::Qmf::Console end # synchronize do end - def update_cpus(host_qmf, host_db, cpu_info) - - @logger.info "Updating CPU info for host #{host_qmf.hostname}" - debugputs "Broker reports #{cpu_info.length} cpus for host #{host_qmf.hostname}" - - # delete an existing CPUs and create new ones based on the data - @logger.info "Deleting any existing CPUs for host #{host_qmf.hostname}" - Cpu.delete_all(['host_id = ?', host_db.id]) - - @logger.info "Saving new CPU records for host #{host_qmf.hostname}" - cpu_info.each do |cpu| - flags = (cpu.flags.length > 255) ? "#{cpu.flags[0..251]}..." : cpu.flags - detail = Cpu.new( - 'cpu_number' => cpu.cpunum, - 'core_number' => cpu.corenum, - 'number_of_cores' => cpu.numcores, - 'vendor' => cpu.vendor, - 'model' => cpu.model.to_s, - 'family' => cpu.family.to_s, - 'cpuid_level' => cpu.cpuid_lvl, - 'speed' => cpu.speed.to_s, - 'cache' => cpu.cache.to_s, - 'flags' => flags) - - host_db.cpus << detail - - debugputs "Added new CPU for #{host_qmf.hostname}: " - debugputs "CPU # : #{cpu.cpunum}" - debugputs "Core # : #{cpu.corenum}" - debugputs "Total Cores : #{cpu.numcores}" - debugputs "Vendor : #{cpu.vendor}" - debugputs "Model : #{cpu.model}" - debugputs "Family : #{cpu.family}" - debugputs "Cpuid_lvl : #{cpu.cpuid_lvl}" - debugputs "Speed : #{cpu.speed}" - debugputs "Cache : #{cpu.cache}" - debugputs "Flags : #{flags}" - end - - @logger.info "Saved #{cpu_info.length} cpus for #{host_qmf.hostname}" - end - - def update_nics(host_qmf, host_db, nic_info) - - # Update the NIC details for this host: - # -if the NIC exists, then update the IP address - # -if the NIC does not exist, create it - # -any nic not in this list is deleted - - @logger.info "Updating NIC records for host #{host_qmf.hostname}" - debugputs "Broker reports #{nic_info.length} NICs for host" - - nics = Array.new - nics_to_delete = Array.new - - host_db.nics.each do |nic| - found = false - - nic_info.each do |detail| - # if we have a match, then update the database and remove - # the received data to avoid creating a dupe later - @logger.info "Searching for existing record for: #{detail.macaddr.upcase} in host #{host_qmf.hostname}" - if detail.macaddr.upcase == nic.mac - @logger.info "Updating details for: #{detail.interface} [#{nic.mac}]}" - nic.bandwidth = detail.bandwidth - nic.interface_name = detail.interface - nic.save! - found = true - nic_info.delete(detail) - end - end - - # if the record wasn't found, then remove it from the database - unless found - @logger.info "Marking NIC for removal: #{nic.interface_name} [#{nic.mac}]" - nics_to_delete << nic - end - end - - debugputs "Deleting #{nics_to_delete.length} NICs that are no longer part of host #{host_qmf.hostname}" - nics_to_delete.each do |nic| - @logger.info "Removing NIC: #{nic.interface_name} [#{nic.mac}]" - host_db.nics.delete(nic) - end - - # iterate over any nics left and create new records for them. - debugputs "Adding new records for #{nic_info.length} NICs to host #{host_qmf.hostname}" - nic_info.each do |nic| - detail = Nic.new( - 'mac' => nic.macaddr.upcase, - 'bandwidth' => nic.bandwidth, - 'interface_name' => nic.interface, - 'usage_type' => 1) - - host_db.nics << detail - - @logger.info "Added NIC #{nic.interface} with MAC #{nic.macaddr} to host #{host_qmf.hostname}" - end - end - - def object_props(broker, obj) - target = obj.schema.klass_key.package - type = obj.schema.klass_key.klass_name - return if target != 'com.redhat.matahari' or type != 'host' - - # Fix a race where the properties of an object are published by a reconnecting - # host (thus marking it active) right before the heartbeat timer considers it dead - # (and marks it inactive) - @heartbeats.delete("#{obj.object_id.agent_bank}.#{obj.object_id.broker_bank}") - + def update_host(obj, cpu_info, nic_info) already_cache = false already_in_db = false - # Grab the cpus and nics associated before we take any locks - cpu_info = @session.objects(:class => 'cpu', 'host' => obj.object_id) - nic_info = @session.objects(:class => 'nic', 'host' => obj.object_id) - synchronize do cached_host = @cached_hosts[obj.object_id.to_s] host = Host.find(:first, :conditions => ['hostname = ?', obj.hostname]) @@ -318,7 +265,7 @@ class HostRegister < Qpid::Qmf::Console 'memory' => obj.memory, 'is_disabled' => 0, 'hardware_pool' => HardwarePool.get_default_pool, - # Let host-status mark it available when it + # Let db-omatic mark it available when it # successfully connects to it via libvirt. 'state' => Host::STATE_UNAVAILABLE) @@ -330,10 +277,11 @@ class HostRegister < Qpid::Qmf::Console debugputs "memory: #{obj.memory}" rescue Exception => error - @logger.error "Error while creating record: #{error.message}" - # We haven't added the host to the db, and it isn't cached, so we just - # return without having done anything. To retry, the host will have to - # restart its agent. + @logger.error "Error when creating record: #{error.message}" + @logger.error "Restart matahari on host #{obj.hostname}" + # We haven't added the host to the db, and it isn't cached, + # so we just return without having done anything. To retry, + # the host will have to restart its agent. return end else @@ -394,27 +342,106 @@ class HostRegister < Qpid::Qmf::Console cached_host['hypervisor'] = obj.hypervisor cached_host['arch'] = obj.arch end # synchronize do - end # def object_props + end # end update_host - def heartbeat(agent, timestamp) - return if agent == nil - synchronize do - bank_key = "#{agent.agent_bank}.#{agent.broker.broker_bank}" - @heartbeats[bank_key] = [agent, timestamp] + def update_cpus(host_qmf, host_db, cpu_info) + + @logger.info "Updating CPU info for host #{host_qmf.hostname}" + debugputs "Broker reports #{cpu_info.length} cpus for host #{host_qmf.hostname}" + + # delete an existing CPUs and create new ones based on the data + @logger.info "Deleting any existing CPUs for host #{host_qmf.hostname}" + Cpu.delete_all(['host_id = ?', host_db.id]) + + @logger.info "Saving new CPU records for host #{host_qmf.hostname}" + cpu_info.each do |cpu| + flags = (cpu.flags.length > 255) ? "#{cpu.flags[0..251]}..." : cpu.flags + detail = Cpu.new( + 'cpu_number' => cpu.cpunum, + 'core_number' => cpu.corenum, + 'number_of_cores' => cpu.numcores, + 'vendor' => cpu.vendor, + 'model' => cpu.model.to_s, + 'family' => cpu.family.to_s, + 'cpuid_level' => cpu.cpuid_lvl, + 'speed' => cpu.speed.to_s, + 'cache' => cpu.cache.to_s, + 'flags' => flags) + + host_db.cpus << detail + + debugputs "Added new CPU for #{host_qmf.hostname}: " + debugputs "CPU # : #{cpu.cpunum}" + debugputs "Core # : #{cpu.corenum}" + debugputs "Total Cores : #{cpu.numcores}" + debugputs "Vendor : #{cpu.vendor}" + debugputs "Model : #{cpu.model}" + debugputs "Family : #{cpu.family}" + debugputs "Cpuid_lvl : #{cpu.cpuid_lvl}" + debugputs "Speed : #{cpu.speed}" + debugputs "Cache : #{cpu.cache}" + debugputs "Flags : #{flags}" end - end - def new_agent(agent) - key = "#{agent.agent_bank}.#{agent.broker.broker_bank}" - debugputs "Agent #{key} connected!" - agent_connected(agent) + @logger.info "Saved #{cpu_info.length} cpus for #{host_qmf.hostname}" end - def del_agent(agent) - key = "#{agent.agent_bank}.#{agent.broker.broker_bank}" - debugputs "Agent #{key} disconnected!" - @heartbeats.delete(key) - agent_disconnected(agent) + def update_nics(host_qmf, host_db, nic_info) + + # Update the NIC details for this host: + # -if the NIC exists, then update the IP address + # -if the NIC does not exist, create it + # -any nic not in this list is deleted + + @logger.info "Updating NIC records for host #{host_qmf.hostname}" + debugputs "Broker reports #{nic_info.length} NICs for host" + + nics = Array.new + nics_to_delete = Array.new + + host_db.nics.each do |nic| + found = false + + nic_info.each do |detail| + # if we have a match, then update the database and remove + # the received data to avoid creating a dupe later + @logger.info "Searching for existing record for: #{detail.macaddr.upcase} in host #{host_qmf.hostname}" + if detail.macaddr.upcase == nic.mac + @logger.info "Updating details for: #{detail.interface} [#{nic.mac}]}" + nic.bandwidth = detail.bandwidth + nic.interface_name = detail.interface + nic.save! + found = true + nic_info.delete(detail) + end + end + + # if the record wasn't found, then remove it from the database + unless found + @logger.info "Marking NIC for removal: #{nic.interface_name} [#{nic.mac}]" + nics_to_delete << nic + end + end + + debugputs "Deleting #{nics_to_delete.length} NICs that are no longer part of host #{host_qmf.hostname}" + nics_to_delete.each do |nic| + @logger.info "Removing NIC: #{nic.interface_name} [#{nic.mac}]" + host_db.nics.delete(nic) + end + + # iterate over any nics left and create new records for them. + debugputs "Adding new records for #{nic_info.length} NICs to host #{host_qmf.hostname}" + nic_info.each do |nic| + detail = Nic.new( + 'mac' => nic.macaddr.upcase, + 'bandwidth' => nic.bandwidth, + 'interface_name' => nic.interface, + 'usage_type' => 1) + + host_db.nics << detail + + @logger.info "Added NIC #{nic.interface} with MAC #{nic.macaddr} to host #{host_qmf.hostname}" + end end def check_heartbeats() @@ -436,7 +463,10 @@ class HostRegister < Qpid::Qmf::Console # No heartbeat for 30 seconds.. deal with dead/disconnected agent. debugputs "Agent #{key} timed out!" @heartbeats.delete(key) - agent_disconnected(agent) + + agent_bank = agent.agent_bank + broker_bank = agent.broker_bank + agent_disconnected(agent_bank, broker_bank) end end @@ -461,6 +491,7 @@ class HostRegister < Qpid::Qmf::Console end # Class HostRegister def main() + Thread.abort_on_exception = true hostreg = HostRegister.new() hostreg.check_heartbeats() end diff --git a/src/libvirt-list.rb b/src/libvirt-list.rb index 54e8b7e..c81926a 100755 --- a/src/libvirt-list.rb +++ b/src/libvirt-list.rb @@ -2,21 +2,30 @@ $: << File.join(File.dirname(__FILE__), "./dutils") -require "rubygems" -require "qpid" -require "dutils" +require 'rubygems' +require 'dutils' +require 'qmf' +require 'socket' get_credentials('qpidd') server, port = get_srv('qpidd', 'tcp') raise "Unable to determine qpid server from DNS SRV record" if not server -srv = "amqp://#{server}:#{port}" -puts "Connecting to #{srv}.." -s = Qpid::Qmf::Session.new() -b = s.add_broker(srv, :mechanism => 'GSSAPI') +puts "Connecting to #{server}, #{port}" -nodes = s.objects(:class => "node") +settings = Qmf::ConnectionSettings.new +settings.host = server +settings.port = port +# settings.mechanism = 'GSSAPI' +# settings.service = 'qpidd' + +connection = Qmf::Connection.new(settings) +qmfc = Qmf::Console.new +broker = qmfc.add_connection(connection) +broker.wait_for_stable + +nodes = qmfc.objects(Qmf::Query.new(:class => "node")) nodes.each do |node| puts "node: #{node.hostname}" for (key, val) in node.properties @@ -24,7 +33,7 @@ nodes.each do |node| end # Find any domains that on the current node. - domains = s.objects(:class => "domain", 'node' => node.object_id) + domains = qmfc.objects(Qmf::Query.new(:class => "domain", 'node' => node.object_id)) domains.each do |domain| r = domain.getXMLDesc() puts "getXMLDesc() status: #{r.status}" @@ -39,7 +48,7 @@ nodes.each do |node| end end - pools = s.objects(:class => "pool", 'node' => node.object_id) + pools = qmfc.objects(Qmf::Query.new(:class => "pool", 'node' => node.object_id)) pools.each do |pool| puts " pool: #{pool.name}" for (key, val) in pool.properties @@ -54,7 +63,7 @@ nodes.each do |node| end # Find volumes that are part of the pool. - volumes = s.objects(:class => "volume", 'pool' => pool.object_id) + volumes = qmfc.objects(Qmf::Query.new(:class => "volume", 'pool' => pool.object_id)) volumes.each do |volume| puts " volume: #{volume.name}" for (key, val) in volume.properties diff --git a/src/matahari-list.rb b/src/matahari-list.rb index ff714c5..8795019 100755 --- a/src/matahari-list.rb +++ b/src/matahari-list.rb @@ -2,21 +2,30 @@ $: << File.join(File.dirname(__FILE__), "./dutils") -require "rubygems" -require "qpid" -require "dutils" +require 'rubygems' +require 'dutils' +require 'qmf' +require 'socket' get_credentials('qpidd') server, port = get_srv('qpidd', 'tcp') raise "Unable to determine qpid server from DNS SRV record" if not server -srv = "amqp://#{server}:#{port}" -puts "Connecting to #{srv}.." -s = Qpid::Qmf::Session.new() -b = s.add_broker(srv, :mechanism => 'GSSAPI') +puts "Connecting to #{server}, #{port}" -hosts = s.objects(:class => "host") +settings = Qmf::ConnectionSettings.new +settings.host = server +settings.port = port +# settings.mechanism = 'GSSAPI' +# settings.service = 'qpidd' + +connection = Qmf::Connection.new(settings) +qmfc = Qmf::Console.new +broker = qmfc.add_connection(connection) +broker.wait_for_stable + +hosts = qmfc.objects(Qmf::Query.new(:class => 'host')) hosts.each do |host| puts "HOST: #{host.hostname}" for (key, val) in host.properties @@ -24,18 +33,18 @@ hosts.each do |host| end # List cpus for current host - cpus = s.objects(:class => "cpu", 'host' => host.object_id) + cpus = qmfc.objects(Qmf::Query.new(:class => 'cpu', 'host' => host.object_id)) cpus.each do |cpu| - puts " CPU:" + puts ' CPU:' for (key, val) in cpu.properties puts " property: #{key}, #{val}" end end # cpus.each # List nics for current host - nics = s.objects(:class => "nic", 'host' => host.object_id) + nics = qmfc.objects(Qmf::Query.new(:class => 'nic', 'host' => host.object_id)) nics.each do |nic| - puts " NIC: " + puts ' NIC: ' for (key, val) in nic.properties puts " property: #{key}, #{val}" end diff --git a/src/task-omatic/task_storage.rb b/src/task-omatic/task_storage.rb index 77b0166..d698777 100644 --- a/src/task-omatic/task_storage.rb +++ b/src/task-omatic/task_storage.rb @@ -73,7 +73,7 @@ def task_storage_cobbler_setup(db_vm) unless found # Create a new transient NFS storage volume # This volume is *not* persisted. - image_volume = StorageVolume.factory("NFS", :filename => filename) + image_volume = StorageVolume.factory("NFS", :filename => filename, :key => filename) image_volume.storage_pool image_pool = StoragePool.factory(StoragePool::NFS) @@ -116,13 +116,14 @@ class LibvirtPool @xml.root.elements["target"].add_element("path") end - def connect(session, node) - pools = session.objects(:class => 'pool', 'node' => node.object_id) + def connect(qmfc, node) + pools = qmfc.objects(:class => 'pool', 'node' => node.object_id) pools.each do |pool| result = pool.getXMLDesc raise "Error getting xml description of pool: #{result.text}" unless result.status == 0 xml_desc = result.description + if self.xmlequal?(Document.new(xml_desc).root) @remote_pool = pool @logger.debug("Found existing storage pool #{pool.name} on host: #{node.hostname}") @@ -134,7 +135,8 @@ class LibvirtPool @logger.debug("Defining new storage pool: #{@xml.to_s} on host: #{node.hostname}") result = node.storagePoolDefineXML(@xml.to_s, :timeout => 60 * 10) raise "Error creating pool: #{result.text}" unless result.status == 0 - @remote_pool = session.object(:object_id => result.pool) + @remote_pool = qmfc.object(:object_id => result.pool) + obj_list = qmfc.objects(:object_id => result.pool) raise "Error finding newly created remote pool." unless @remote_pool # we need this because we don't want to "build" LVM pools, which would diff --git a/src/task-omatic/taskomatic.rb b/src/task-omatic/taskomatic.rb index ece60dc..13cf5af 100755 --- a/src/task-omatic/taskomatic.rb +++ b/src/task-omatic/taskomatic.rb @@ -23,7 +23,7 @@ $: << File.join(File.dirname(__FILE__), "../dutils") $: << File.join(File.dirname(__FILE__), ".") require 'rubygems' -require 'qpid' +require 'qmf' require 'monitor' require 'dutils' require 'optparse' @@ -115,10 +115,15 @@ class TaskOmatic sleepy *= 2 if sleepy < 120 end - @session = Qpid::Qmf::Session.new(:manage_connections => true) - @logger.info "Connecting to amqp://#{server}:#{port}" - @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI') + settings = Qmf::ConnectionSettings.new + settings.host = server + settings.port = port + settings.sendUserId = false + @connection = Qmf::Connection.new(settings) + @qmfc = Qmf::Console.new + @broker = @qmfc.add_connection(@connection) + @broker.wait_for_stable end def ensure_credentials() @@ -141,13 +146,13 @@ class TaskOmatic # vm won't be returned. I think that's supposed to be for migration # but it could break creation of VMs in certain conditions.. - vm = @session.object(:class => "domain", 'uuid' => db_vm.uuid) + vm = @qmfc.object(:class => "domain", 'uuid' => db_vm.uuid) db_vm.vm_resource_pool.get_hardware_pool.hosts.each do |curr| # Now each of 'curr' is in the right hardware pool.. # now we check them out. - node = @session.object(:class => "node", 'hostname' => curr.hostname) + node = @qmfc.object(:class => "node", 'hostname' => curr.hostname) next unless node # So now we expect if the node was found it's alive and well, then @@ -205,12 +210,12 @@ class TaskOmatic # activate the underlying physical device, and then do the logical one if db_volume[:type] == "LvmStorageVolume" phys_libvirt_pool = get_libvirt_lvm_pool_from_volume(db_volume, @logger) - phys_libvirt_pool.connect(@session, node) + phys_libvirt_pool.connect(@qmfc, node) end @logger.debug "Verifying mount of pool #{db_pool.ip_addr}:#{db_pool.type}:#{db_pool.target}:#{db_pool.export_path}" libvirt_pool = LibvirtPool.factory(db_pool, @logger) - libvirt_pool.connect(@session, node) + libvirt_pool.connect(@qmfc, node) # OK, the pool should be all set. The last thing we need to do is get # the path based on the volume key @@ -220,12 +225,12 @@ class TaskOmatic @logger.debug "Pool mounted: #{pool.name}; state: #{pool.state}" - volume = @session.object(:class => 'volume', + volume = @qmfc.object(:class => 'volume', 'key' => volume_key, 'storagePool' => pool.object_id) if volume == nil @logger.info "Unable to find volume by key #{volume_key} attached to pool #{pool.name}, trying by filename..." - volume = @session.object(:class => 'volume', + volume = @qmfc.object(:class => 'volume', 'name' => db_volume.filename, 'storagePool' => pool.object_id) raise "Unable to find volume by key (#{volume_key}) or filename (#{db_volume.filename}), giving up." unless volume @@ -254,11 +259,11 @@ class TaskOmatic # This is rather silly because we only destroy pools if there are no # more vms on the node. We should be reference counting the pools # somehow so we know when they are no longer in use. - vms = @session.objects(:class => 'domain', 'node' => node.object_id) + vms = @qmfc.objects(:class => 'domain', 'node' => node.object_id) if vms.length > 0 return end - pools = @session.objects(:class => 'pool', 'node' => node.object_id) + pools = @qmfc.objects(:class => 'pool', 'node' => node.object_id) # We do this in two passes, first undefine/destroys LVM pools, then # we do physical pools. @@ -281,13 +286,13 @@ class TaskOmatic def task_shutdown_or_destroy_vm(task, action) @logger.info "starting task_shutdown_or_destroy_vm" db_vm = task.vm - vm = @session.object(:class => 'domain', 'uuid' => db_vm.uuid) + vm = @qmfc.object(:class => 'domain', 'uuid' => db_vm.uuid) if !vm @logger.error "VM already shut down?" return end - node = @session.object(:object_id => vm.node) + node = @qmfc.object(:object_id => vm.node) raise "Unable to get node that vm is on??" unless node if vm.state == "shutdown" or vm.state == "shutoff" @@ -337,7 +342,7 @@ class TaskOmatic @logger.info "starting task_start_vm" db_vm = find_vm(task, false) - vm = @session.object(:class => "domain", 'uuid' => db_vm.uuid) + vm = @qmfc.object(:class => "domain", 'uuid' => db_vm.uuid) if vm case vm.state @@ -351,7 +356,7 @@ class TaskOmatic end db_host = find_capable_host(db_vm) - node = @session.object(:class => "node", 'hostname' => db_host.hostname) + node = @qmfc.object(:class => "node", 'hostname' => db_host.hostname) raise "Unable to find host #{db_host.hostname} to create VM on." unless node @logger.info("VM will be started on node #{node.hostname}") @@ -400,7 +405,7 @@ class TaskOmatic result = node.domainDefineXML(xml.to_s) raise "Error defining virtual machine: #{result.text}" unless result.status == 0 - domain = @session.object(:object_id => result.domain) + domain = @qmfc.object(:object_id => result.domain) raise "Cannot find domain on host #{db_host.hostname}, cannot start virtual machine." unless domain result = domain.create @@ -432,7 +437,7 @@ class TaskOmatic def task_suspend_vm(task) @logger.info "starting task_suspend_vm" db_vm = task.vm - dom = @session.object(:class => 'domain', 'uuid' => db_vm.uuid) + dom = @qmfc.object(:class => 'domain', 'uuid' => db_vm.uuid) raise "Unable to locate VM to suspend" unless dom if dom.state != "running" and dom.state != "blocked" @@ -450,7 +455,7 @@ class TaskOmatic def task_resume_vm(task) @logger.info "starting task_resume_vm" db_vm = task.vm - dom = @session.object(:class => 'domain', 'uuid' => db_vm.uuid) + dom = @qmfc.object(:class => 'domain', 'uuid' => db_vm.uuid) raise "Unable to locate VM to resume" unless dom if dom.state == "running" @@ -478,7 +483,7 @@ class TaskOmatic # need to put it on the storage server and mark it in the database # where the image is stored. db_vm = task.vm - dom = @session.object(:class => 'domain', 'uuid' => db_vm.uuid) + dom = @qmfc.object(:class => 'domain', 'uuid' => db_vm.uuid) raise "Unable to locate VM to save" unless dom filename = "/tmp/#{dom.uuid}.save" @@ -495,7 +500,7 @@ class TaskOmatic # FIXME: This is also broken, see task_save_vm FIXME. db_vm = task.vm - dom = @session.object(:class => 'domain', 'uuid' => db_vm.uuid) + dom = @qmfc.object(:class => 'domain', 'uuid' => db_vm.uuid) raise "Unable to locate VM to restore" unless dom filename = "/tmp/#{dom.uuid}.save" @@ -508,9 +513,9 @@ class TaskOmatic def migrate(db_vm, dest = nil) - vm = @session.object(:class => "domain", 'uuid' => db_vm.uuid) + vm = @qmfc.object(:class => "domain", 'uuid' => db_vm.uuid) raise "Unable to find VM to migrate" unless vm - src_node = @session.object(:object_id => vm.node) + src_node = @qmfc.object(:object_id => vm.node) raise "Unable to find node that VM is on??" unless src_node @logger.info "Migrating domain lookup complete, domain is #{vm}" @@ -528,7 +533,7 @@ class TaskOmatic db_dst_host = find_capable_host(db_vm) end - dest_node = @session.object(:class => 'node', 'hostname' => db_dst_host.hostname) + dest_node = @qmfc.object(:class => 'node', 'hostname' => db_dst_host.hostname) raise "Unable to find host #{db_dst_host.hostname} to migrate to." unless dest_node volumes = [] @@ -589,7 +594,7 @@ class TaskOmatic next end puts "searching for node with hostname #{host.hostname}" - node = @session.object(:class => 'node', 'hostname' => host.hostname) + node = @qmfc.object(:class => 'node', 'hostname' => host.hostname) puts "node returned is #{node}" return node if node end @@ -643,13 +648,13 @@ class TaskOmatic @logger.info("refresh being done on node #{node.hostname}") phys_libvirt_pool = LibvirtPool.factory(db_pool_phys, @logger) - phys_libvirt_pool.connect(@session, node) + phys_libvirt_pool.connect(@qmfc, node) db_pool_phys.state = StoragePool::STATE_AVAILABLE db_pool_phys.save! begin # First we do the physical volumes. - volumes = @session.objects(:class => 'volume', + volumes = @qmfc.objects(:class => 'volume', 'storagePool' => phys_libvirt_pool.remote_pool.object_id) volumes.each do |volume| storage_volume = StorageVolume.factory(db_pool_phys.get_type_label) @@ -696,9 +701,9 @@ class TaskOmatic physical_vol.save! lvm_libvirt_pool = LibvirtPool.factory(lvm_db_pool, @logger) - lvm_libvirt_pool.connect(@session, node) + lvm_libvirt_pool.connect(@qmfc, node) - lvm_volumes = @session.objects(:class => 'volume', + lvm_volumes = @qmfc.objects(:class => 'volume', 'storagePool' => lvm_libvirt_pool.remote_pool.object_id) lvm_volumes.each do |lvm_volume| @@ -733,16 +738,16 @@ class TaskOmatic begin if db_volume[:type] == "LvmStorageVolume" phys_libvirt_pool = get_libvirt_lvm_pool_from_volume(db_volume, @logger) - phys_libvirt_pool.connect(@session, node) + phys_libvirt_pool.connect(@qmfc, node) end begin libvirt_pool = LibvirtPool.factory(db_pool, @logger) begin - libvirt_pool.connect(@session, node) + libvirt_pool.connect(@qmfc, node) volume_id = libvirt_pool.create_vol(*db_volume.volume_create_params) - volume = @session.object(:object_id => volume_id) + volume = @qmfc.object(:object_id => volume_id) raise "Unable to find newly created volume" unless volume @logger.debug " volume:" @@ -776,7 +781,7 @@ class TaskOmatic # I currently refresh ALL storage pools at this time as it # shouldn't be a long operation and it doesn't hurt to refresh # them once in a while. - pools = @session.objects(:class => 'pool') + pools = @qmfc.objects(:class => 'pool') pools.each do |pool| result = pool.refresh @logger.info "Problem refreshing pool (you can probably ignore this): #{result.text}" unless result.status == 0 @@ -798,16 +803,16 @@ class TaskOmatic begin if db_volume[:type] == "LvmStorageVolume" phys_libvirt_pool = get_libvirt_lvm_pool_from_volume(db_volume, @logger) - phys_libvirt_pool.connect(@session, node) + phys_libvirt_pool.connect(@qmfc, node) @logger.info "connected to lvm pool.." end begin libvirt_pool = LibvirtPool.factory(db_pool, @logger) - libvirt_pool.connect(@session, node) + libvirt_pool.connect(@qmfc, node) begin - volume = @session.object(:class => 'volume', + volume = @qmfc.object(:class => 'volume', 'storagePool' => libvirt_pool.remote_pool.object_id, 'key' => db_volume.key) @logger.error "Unable to find volume to delete" unless volume @@ -861,7 +866,7 @@ class TaskOmatic was_disconnected = false loop do - if not @broker.connected? + if not @connection.connected? @logger.info("Cannot implement tasks, not connected to broker. Sleeping.") sleep(@sleeptime * 3) was_disconnected = true @@ -870,7 +875,7 @@ class TaskOmatic @logger.info("Reconnected, resuming task checking..") if was_disconnected was_disconnected = false - @session.object(:class => 'agent') + @qmfc.object(:class => 'agent') tasks = Array.new begin -- 1.6.2.5
Somehow I missed some changes for host-register. These are required for the new API. Signed-off-by: Ian Main <imain at redhat.com> --- src/host-browser/host-register.rb | 48 ++++++++++++------------------------ 1 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/host-browser/host-register.rb b/src/host-browser/host-register.rb index e57b077..e49f08e 100755 --- a/src/host-browser/host-register.rb +++ b/src/host-browser/host-register.rb @@ -134,24 +134,19 @@ class HostRegister < Qmf::ConsoleHandler def agent_heartbeat(agent, timestamp) return if agent == nil synchronize do - bank_key = "#{agent.agent_bank}.#{agent.broker_bank}" - @heartbeats[bank_key] = [agent, timestamp] + @heartbeats[agent.key] = [agent, timestamp] end end def agent_added(agent) - agent_bank = agent.agent_bank - broker_bank = agent.broker_bank - key = "#{agent_bank}.#{broker_bank}" - puts "AGENT ADDED: #{key}" - debugputs "Agent #{agent_bank}.#{broker_bank} connected!" - agent_connected(agent_bank, broker_bank) + debugputs "Agent #{agent.key}.connected!" + agent_connected(agent) host_list = @qmfc.objects(:package => 'com.redhat.matahari', :class => 'host') puts "host_list length is #{host_list.length}" host_list.each do |host| - if host.object_id.agent_bank == agent_bank + if host.object_id.agent_key == agent.key # Grab the cpus and nics associated before we take any locks cpu_info = @qmfc.objects(:package => 'com.redhat.matahari', :class => 'cpu', 'host' => host.object_id) nic_info = @qmfc.objects(:package => 'com.redhat.matahari', :class => 'nic', 'host' => host.object_id) @@ -163,13 +158,9 @@ class HostRegister < Qmf::ConsoleHandler end def agent_deleted(agent) - agent_bank = agent.agent_bank - broker_bank = agent.broker_bank - key = "#{agent_bank}.#{broker_bank}" - - debugputs "Agent #{key} disconnected!" - @heartbeats.delete(key) - agent_disconnected(agent_bank, broker_bank) + debugputs "Agent #{agent.key} disconnected!" + @heartbeats.delete(agent.key) + agent_disconnected(agent) end def object_update(obj, hasProps, hasStats) @@ -180,17 +171,15 @@ class HostRegister < Qmf::ConsoleHandler # Fix a race where the properties of an object are published by a reconnecting # host (thus marking it active) right before the heartbeat timer considers it dead # (and marks it inactive) - @heartbeats.delete("#{obj.object_id.agent_bank}.#{obj.object_id.broker_bank}") + @heartbeats.delete("#{obj.object_id.agent_key}") end # def object_props ###### Handlers for QMF Callbacks ###### - def agent_disconnected(agent_bank, broker_bank) + def agent_disconnected(agent) synchronize do - debugputs "Marking objects for agent #{broker_bank}.#{agent_bank} inactive" + debugputs "Marking objects for agent #{agent.key} inactive" @cached_hosts.keys.each do |objkey| - if @cached_hosts[objkey][:broker_bank] == broker_bank and - @cached_hosts[objkey][:agent_bank] == agent_bank - + if @cached_hosts[objkey][:agent_key] == agent.key cached_host = @cached_hosts[objkey] cached_host[:active] = false @logger.info "Host #{cached_host['hostname']} marked inactive" @@ -199,13 +188,11 @@ class HostRegister < Qmf::ConsoleHandler end # synchronize do end - def agent_connected(agent_bank, broker_bank) + def agent_connected(agent) synchronize do - debugputs "Marking objects for agent #{broker_bank}.#{agent_bank} active" + debugputs "Marking objects for agent #{agent.key} active" @cached_hosts.keys.each do |objkey| - if @cached_hosts[objkey][:broker_bank] == broker_bank and - @cached_hosts[objkey][:agent_bank] == agent_bank - + if @cached_hosts[objkey][:agent_key] == agent.key cached_host = @cached_hosts[objkey] cached_host[:active] = true @logger.info "Host #{cached_host['hostname']} marked active" @@ -331,8 +318,7 @@ class HostRegister < Qmf::ConsoleHandler # By now, we either rekeyed a stale entry or started a new one. # Update the bookkeeping parts of the data. cached_host[:obj_key] = obj.object_id.to_s - cached_host[:broker_bank] = obj.object_id.broker_bank - cached_host[:agent_bank] = obj.object_id.agent_bank + cached_host[:agent_key] = obj.object_id.agent_key end # not already_cache # For now, only cache identity information (leave CPU/NIC/etc. to db only) @@ -464,9 +450,7 @@ class HostRegister < Qmf::ConsoleHandler debugputs "Agent #{key} timed out!" @heartbeats.delete(key) - agent_bank = agent.agent_bank - broker_bank = agent.broker_bank - agent_disconnected(agent_bank, broker_bank) + agent_disconnected(agent) end end -- 1.6.2.5
Ian Main
2009-Nov-04 22:24 UTC
[Ovirt-devel] [PATCH server] Update server spec to require new QMF.
Update server spec to require new QMF. ruby-qpid package is no longer required. These newer qmf packages are now in the ovirt repo and will be going into fedora updates shortly. Signed-off-by: Ian Main <imain at redhat.com> --- ovirt-server.spec.in | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/ovirt-server.spec.in b/ovirt-server.spec.in index ad5ace1..02eb94c 100644 --- a/ovirt-server.spec.in +++ b/ovirt-server.spec.in @@ -41,9 +41,8 @@ Requires: rrdtool-ruby Requires: iscsi-initiator-utils Requires: cyrus-sasl-gssapi Requires: qpidd -Requires: ruby-qpid >= 0.5.776856 Requires: qpidc -Requires: qmf +Requires: qmf >= 0.5.829175-2 Requires: ruby-qmf Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig -- 1.6.2.5
Ian Main
2009-Nov-04 22:28 UTC
[Ovirt-devel] Re: [PATCH server] Update daemons to use new QMF.
On Wed, 4 Nov 2009 11:59:37 -0800 Ian Main <imain at redhat.com> wrote:> This patch updates dbomatic, taskomatic and host-register to use the > new C++ wrapped ruby QMF bindings. It also fixes a couple of bugs > along the way including the 0 cpu bug for host-register. This is a > compilation of work done by myself and Arjun Roy. > > Signed-off-by: Ian Main <imain at redhat.com>If anyone wants to test these, the best way is just to install the new qmf rpms from the ovirt repo, apply patches and rebuild only the server. The node will rebuild on f11/x86_64 only because libvirt-qpid and matahari had to be rebuilt and I afaict there's no way to use koji to do that so it's available on all architectures. The new qmf packages are going into fedora updates shortly so once they are in we can build new packages and all will be good again for the node. Ian
Seemingly Similar Threads
- [PATCH] Fix dbomatic state changes.
- [PATCH server] Fixed db-omatic so it doesn't segfault because of newer qmf api.
- [PATCH server] Add svc_vm_actions method to VmService.
- Updating oVirt Server to the latest Matahari 0.4.0 schema
- [PATCH server] Replace the occurence of the type @qmfc.object(Qmf::Query.new(:class => "xxx", 'key' => search_key)) for @qmfc.object(Qmf::Query.new(:class => "xxx"), 'key' => search_key) else the search on the key is not functionnal.