- removed mac dependency from managed_node_controller, since we already have nic interface names from host browser, node doesn't need to pass them in when invoking the managed node controller - fixes to managed node configuration concerning proper usage of networks associated w/ nics - fix to host browser correcting comparison of nic mac addresses between those received and those in db --- src/app/controllers/managed_node_controller.rb | 17 +----------- src/host-browser/host-browser.rb | 2 +- src/lib/managed_node_configuration.rb | 34 ++++++++++++------------ 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/src/app/controllers/managed_node_controller.rb b/src/app/controllers/managed_node_controller.rb index f5948be..72908e7 100644 --- a/src/app/controllers/managed_node_controller.rb +++ b/src/app/controllers/managed_node_controller.rb @@ -21,7 +21,6 @@ # class ManagedNodeController < ApplicationController before_filter :load_host, :only => :config - before_filter :load_macs, :only => :config def is_logged_in # this overrides the default which is to force the client to log in @@ -30,7 +29,7 @@ class ManagedNodeController < ApplicationController # Generates a configuration file for the managed node. # def config - context = ManagedNodeConfiguration.generate(@host, @macs) + context = ManagedNodeConfiguration.generate(@host) send_data("#{context}", :type => 'text', :disposition => 'inline') end @@ -46,18 +45,4 @@ class ManagedNodeController < ApplicationController render :nothing => true, :status => :error unless @host end - - def load_macs - @macs = Hash.new - mac_text = params[:macs] - - if mac_text != nil - mac_text.scan(/([^,]+)\,?/).each do |line| - key, value = line.first.split("=") - @macs[key] = value - end - end - - render :nothing => true, :status => :error if @macs.empty? - end end diff --git a/src/host-browser/host-browser.rb b/src/host-browser/host-browser.rb index 1c5cf83..c3ddeaa 100755 --- a/src/host-browser/host-browser.rb +++ b/src/host-browser/host-browser.rb @@ -278,7 +278,7 @@ class HostBrowser nic_info.collect do |detail| # if we have a match, then update the database and remove # the received data to avoid creating a dupe later - if detail['MAC'] == nic.mac + if detail['MAC'].upcase == nic.mac && detail['IFACE_NAME'] == nic.interface_name nic_info.delete(detail) updated_nic = Nic.find_by_id(nic.id) diff --git a/src/lib/managed_node_configuration.rb b/src/lib/managed_node_configuration.rb index c412917..84ecab2 100644 --- a/src/lib/managed_node_configuration.rb +++ b/src/lib/managed_node_configuration.rb @@ -47,10 +47,11 @@ require 'stringio' # +00:11:22:33:44+. It will use DHCP for retrieving it's IP address details, # and will use the +breth0+ interface as a bridge. # + class ManagedNodeConfiguration NIC_ENTRY_PREFIX='/files/etc/sysconfig/network-scripts' - def self.generate(host, macs) + def self.generate(host) result = StringIO.new result.puts "# THIS FILE IS GENERATED!" @@ -77,23 +78,15 @@ class ManagedNodeConfiguration result.puts "#{entry}|ONBOOT=yes" bonding.nics.each do |nic| - process_nic result, nic, macs, bonding + process_nic result, nic, bonding end end - has_bridge = false host.nics.each do |nic| # only process this nic if it doesn't have a bonding # TODO remove the hack to force a bridge into the picture if nic.bondings.empty? - process_nic result, nic, macs, nil, false, true - - # TODO remove this when bridges are properly supported - unless has_bridge - macs[nic.mac] = "breth0" - process_nic result, nic, macs, nil, true, false - has_bridge = true - end + process_nic result, nic, nil, false, true end end @@ -102,8 +95,8 @@ class ManagedNodeConfiguration private - def self.process_nic(result, nic, macs, bonding = nil, is_bridge = false, bridged = true) - iface_name = macs[nic.mac] + def self.process_nic(result, nic, bonding = nil, is_bridge = false, bridged = true) + iface_name = nic.interface_name if iface_name entry = "ifcfg=#{nic.mac}|#{iface_name}" @@ -111,10 +104,17 @@ class ManagedNodeConfiguration if bonding entry += "|MASTER=#{bonding.interface_name}|SLAVE=yes" else - entry += "|BOOTPROTO=#{nic.physical_network.boot_type.proto}" - if nic.physical_network.boot_type.proto == 'static' - ip = nic.ip_addresses[0] - entry += "|IPADDR=#{ip.address}|NETMASK=#{ip.netmask}|BROADCAST=#{ip.broadcast}" + boot_proto = nic.physical_network.nil? ? 'dhcp' : nic.physical_network.boot_type.proto + entry += "|BOOTPROTO=#{boot_proto}" + if boot_proto == 'static' + ip = nic.ip_addresses[0].address + netmask = '255.255.255.0' + broadcast = '255.255.255.255' + unless nic.physical_network.nil? || nic.physical_network.ip_addresses.size == 0 + netmask = nic.physical_network.ip_addresses[0].netmask + broadcast = nic.physical_network.ip_addresses[0].broadcast + end + entry += "|IPADDR=#{ip}|NETMASK=#{netmask}|BROADCAST=#{broadcast}" end entry += "|BRIDGE=#{nic.bridge}" if nic.bridge && !is_bridge entry += "|BRIDGE=breth0" if !nic.bridge && !is_bridge -- 1.6.0.6
On Wed, Mar 25, 2009 at 10:25:23PM -0400, Mohammed Morsi wrote:> - removed mac dependency from managed_node_controller, since we already > have nic interface names from host browser, node doesn't need to pass > them in when invoking the managed node controller > - fixes to managed node configuration concerning proper usage of networks > associated w/ nics > - fix to host browser correcting comparison of nic mac addresses between > those received and those in db > --- > src/app/controllers/managed_node_controller.rb | 17 +----------- > src/host-browser/host-browser.rb | 2 +- > src/lib/managed_node_configuration.rb | 34 ++++++++++++------------ > 3 files changed, 19 insertions(+), 34 deletions(-) > > diff --git a/src/app/controllers/managed_node_controller.rb b/src/app/controllers/managed_node_controller.rb > index f5948be..72908e7 100644 > --- a/src/app/controllers/managed_node_controller.rb > +++ b/src/app/controllers/managed_node_controller.rb > @@ -21,7 +21,6 @@ > # > class ManagedNodeController < ApplicationController > before_filter :load_host, :only => :config > - before_filter :load_macs, :only => :config > > def is_logged_in > # this overrides the default which is to force the client to log in > @@ -30,7 +29,7 @@ class ManagedNodeController < ApplicationController > # Generates a configuration file for the managed node. > # > def config > - context = ManagedNodeConfiguration.generate(@host, @macs) > + context = ManagedNodeConfiguration.generate(@host) > > send_data("#{context}", :type => 'text', :disposition => 'inline') > end > @@ -46,18 +45,4 @@ class ManagedNodeController < ApplicationController > > render :nothing => true, :status => :error unless @host > end > - > - def load_macs > - @macs = Hash.new > - mac_text = params[:macs] > - > - if mac_text != nil > - mac_text.scan(/([^,]+)\,?/).each do |line| > - key, value = line.first.split("=") > - @macs[key] = value > - end > - end > - > - render :nothing => true, :status => :error if @macs.empty? > - end > end > diff --git a/src/host-browser/host-browser.rb b/src/host-browser/host-browser.rb > index 1c5cf83..c3ddeaa 100755 > --- a/src/host-browser/host-browser.rb > +++ b/src/host-browser/host-browser.rb > @@ -278,7 +278,7 @@ class HostBrowser > nic_info.collect do |detail| > # if we have a match, then update the database and remove > # the received data to avoid creating a dupe later > - if detail['MAC'] == nic.mac > + if detail['MAC'].upcase == nic.mac && detail['IFACE_NAME'] == nic.interface_name > nic_info.delete(detail) > > updated_nic = Nic.find_by_id(nic.id) > diff --git a/src/lib/managed_node_configuration.rb b/src/lib/managed_node_configuration.rb > index c412917..84ecab2 100644 > --- a/src/lib/managed_node_configuration.rb > +++ b/src/lib/managed_node_configuration.rb > @@ -47,10 +47,11 @@ require 'stringio' > # +00:11:22:33:44+. It will use DHCP for retrieving it's IP address details, > # and will use the +breth0+ interface as a bridge. > # > + > class ManagedNodeConfiguration > NIC_ENTRY_PREFIX='/files/etc/sysconfig/network-scripts' > > - def self.generate(host, macs) > + def self.generate(host) > result = StringIO.new > > result.puts "# THIS FILE IS GENERATED!" > @@ -77,23 +78,15 @@ class ManagedNodeConfiguration > result.puts "#{entry}|ONBOOT=yes" > > bonding.nics.each do |nic| > - process_nic result, nic, macs, bonding > + process_nic result, nic, bonding > end > end > > - has_bridge = false > host.nics.each do |nic| > # only process this nic if it doesn't have a bonding > # TODO remove the hack to force a bridge into the picture > if nic.bondings.empty? > - process_nic result, nic, macs, nil, false, true > - > - # TODO remove this when bridges are properly supported > - unless has_bridge > - macs[nic.mac] = "breth0" > - process_nic result, nic, macs, nil, true, false > - has_bridge = true > - end > + process_nic result, nic, nil, false, true > end > end > > @@ -102,8 +95,8 @@ class ManagedNodeConfiguration > > private > > - def self.process_nic(result, nic, macs, bonding = nil, is_bridge = false, bridged = true) > - iface_name = macs[nic.mac] > + def self.process_nic(result, nic, bonding = nil, is_bridge = false, bridged = true) > + iface_name = nic.interface_name > > if iface_name > entry = "ifcfg=#{nic.mac}|#{iface_name}" > @@ -111,10 +104,17 @@ class ManagedNodeConfiguration > if bonding > entry += "|MASTER=#{bonding.interface_name}|SLAVE=yes" > else > - entry += "|BOOTPROTO=#{nic.physical_network.boot_type.proto}" > - if nic.physical_network.boot_type.proto == 'static' > - ip = nic.ip_addresses[0] > - entry += "|IPADDR=#{ip.address}|NETMASK=#{ip.netmask}|BROADCAST=#{ip.broadcast}" > + boot_proto = nic.physical_network.nil? ? 'dhcp' : nic.physical_network.boot_type.proto > + entry += "|BOOTPROTO=#{boot_proto}" > + if boot_proto == 'static' > + ip = nic.ip_addresses[0].address > + netmask = '255.255.255.0' > + broadcast = '255.255.255.255' > + unless nic.physical_network.nil? || nic.physical_network.ip_addresses.size == 0 > + netmask = nic.physical_network.ip_addresses[0].netmask > + broadcast = nic.physical_network.ip_addresses[0].broadcast > + end > + entry += "|IPADDR=#{ip}|NETMASK=#{netmask}|BROADCAST=#{broadcast}" > end > entry += "|BRIDGE=#{nic.bridge}" if nic.bridge && !is_bridge > entry += "|BRIDGE=breth0" if !nic.bridge && !is_bridgeOn testing it appears at the very least we are not correctly identifying what is a bridge and what is not, so NACK until we get that sorted out. For the very short term we simply want to be able to define the bridges that the node creates by default correctly. --Hugh
- fix to host browser correcting comparison of nic mac addresses between those received and those in db - fixes to managed node configuration concerning proper usage of networks associated w/ nics / bridges --- src/host-browser/host-browser.rb | 2 +- src/lib/managed_node_configuration.rb | 48 ++++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/host-browser/host-browser.rb b/src/host-browser/host-browser.rb index 1c5cf83..1f9e7d2 100755 --- a/src/host-browser/host-browser.rb +++ b/src/host-browser/host-browser.rb @@ -278,7 +278,7 @@ class HostBrowser nic_info.collect do |detail| # if we have a match, then update the database and remove # the received data to avoid creating a dupe later - if detail['MAC'] == nic.mac + if detail['MAC'].upcase == nic.mac nic_info.delete(detail) updated_nic = Nic.find_by_id(nic.id) diff --git a/src/lib/managed_node_configuration.rb b/src/lib/managed_node_configuration.rb index c412917..e8017ec 100644 --- a/src/lib/managed_node_configuration.rb +++ b/src/lib/managed_node_configuration.rb @@ -47,6 +47,15 @@ require 'stringio' # +00:11:22:33:44+. It will use DHCP for retrieving it's IP address details, # and will use the +breth0+ interface as a bridge. # + +# FIXME +# - look into whether or not we need macs hash here (passed in via url +# by node, only used to lookup interface names which we already have +# via ovirt-identify-node / host-browser (remember this module will only +# be useful on 2nd boot) +# - handle bridges correctly, right now we're only receiving bridges from the +# node, but this will need to change in the future + class ManagedNodeConfiguration NIC_ENTRY_PREFIX='/files/etc/sysconfig/network-scripts' @@ -81,19 +90,11 @@ class ManagedNodeConfiguration end end - has_bridge = false host.nics.each do |nic| # only process this nic if it doesn't have a bonding # TODO remove the hack to force a bridge into the picture if nic.bondings.empty? process_nic result, nic, macs, nil, false, true - - # TODO remove this when bridges are properly supported - unless has_bridge - macs[nic.mac] = "breth0" - process_nic result, nic, macs, nil, true, false - has_bridge = true - end end end @@ -102,6 +103,7 @@ class ManagedNodeConfiguration private + # FIXME remove macs, is_bridge (see FIXME above) def self.process_nic(result, nic, macs, bonding = nil, is_bridge = false, bridged = true) iface_name = macs[nic.mac] @@ -111,14 +113,30 @@ class ManagedNodeConfiguration if bonding entry += "|MASTER=#{bonding.interface_name}|SLAVE=yes" else - entry += "|BOOTPROTO=#{nic.physical_network.boot_type.proto}" - if nic.physical_network.boot_type.proto == 'static' - ip = nic.ip_addresses[0] - entry += "|IPADDR=#{ip.address}|NETMASK=#{ip.netmask}|BROADCAST=#{ip.broadcast}" + boot_proto = nic.physical_network.nil? ? 'dhcp' : nic.physical_network.boot_type.proto + entry += "|BOOTPROTO=#{boot_proto}" + if boot_proto == 'static' + ip = nic.ip_addresses[0].address + netmask = '255.255.255.0' + broadcast = '255.255.255.255' + unless nic.physical_network.nil? || nic.physical_network.ip_addresses.size == 0 + netmask = nic.physical_network.ip_addresses[0].netmask + broadcast = nic.physical_network.ip_addresses[0].broadcast + end + entry += "|IPADDR=#{ip}|NETMASK=#{netmask}|BROADCAST=#{broadcast}" + end + + # handling a bridge + if nic.interface_name =~ /^br.*/ + entry += "|TYPE=bridge" + entry += "|PEERDNS=no" + else + if nic.bridge + entry += "|BRIDGE=#{nic.bridge}" + else + entry += "|BRIDGE=breth0" + end end - entry += "|BRIDGE=#{nic.bridge}" if nic.bridge && !is_bridge - entry += "|BRIDGE=breth0" if !nic.bridge && !is_bridge - entry += "|TYPE=bridge" if is_bridge end entry += "|ONBOOT=yes" end -- 1.6.0.6