From 490f5e419e84fe34662c519772c9647f6cb091ee Mon Sep 17 00:00:00 2001 From: Vladimir Kozhukalov Date: Fri, 21 Feb 2014 20:27:40 +0400 Subject: [PATCH] Workaround for Adaptec removable disk This is workaround for the case when Adaptec RAID controller is mappet into sysfs as removable device. Change-Id: I3a8f08040b0eaa972ab5f4c1bfc6342c29480822 Closes-bug: #1282068 --- bin/agent | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/bin/agent b/bin/agent index f3015e8cb5..70698f43f5 100755 --- a/bin/agent +++ b/bin/agent @@ -41,6 +41,9 @@ AGENT_CONFIG = "/etc/nailgun-agent/config.yaml" # Please also update the device codes here # https://github.com/stackforge/fuel-astute/blob/master/mcagents/erase_node.rb#L81 STORAGE_CODES = [3, 8, 65, 66, 67, 68, 69, 70, 71, 104, 105, 106, 107, 108, 109, 110, 111, 202, 252, 253] +REMOVABLE_VENDORS = [ + "Adaptec", +] class McollectiveConfig def initialize(logger) @@ -235,9 +238,18 @@ class NodeAgent end begin + @logger.debug("Trying to find block devices") (@os[:block_device] or {} rescue {}).each do |bname, binfo| - if physical_data_storage_devices.include?(bname) && binfo + @logger.debug("Found block device: #{bname}") + @logger.debug("Block device info: #{binfo.inspect}") + if physical_data_storage_devices.map{|d| d[:name]}.include?(bname) && binfo + @logger.debug("Block device seems to be physical data storage: #{bname}") + block = physical_data_storage_devices.select{|d| d[:name] == bname}[0] + if block[:removable] =~ /^1$/ && ! REMOVABLE_VENDORS.include?(binfo[:vendor]) + next + end dname = bname.gsub(/!/, '/') + # 512 bytes is the size of one sector by default block_size = 512 fn = "/sys/block/#{bname}/queue/logical_block_size" @@ -247,11 +259,13 @@ class NodeAgent :name => dname, :model => binfo[:model], :size => (binfo[:size].to_i * block_size), - :disk => _disk_path_by_name(dname) || dname, - :extra => _disk_id_by_name(dname) || [] + :disk => block[:disk], + :extra => block[:extra], + :removable => block[:removable] } end end + @logger.debug("Detailed meta disks: #{detailed_meta[:disks].inspect}") rescue Exception => e @logger.error("Error '#{e.message}' in gathering disks metadata: #{e.backtrace}") end @@ -275,6 +289,7 @@ class NodeAgent @blocks ||= [] return @blocks unless @blocks.empty? + @logger.debug("Trying to get list of physical devices") raise "Path /sys/block does not exist" unless File.exists?("/sys/block") Dir["/sys/block/*"].each do |block_device_dir| @@ -285,20 +300,33 @@ class NodeAgent # device name. devname = basename_dir.gsub(/!/, '/') + @logger.debug("Getting udev properties for device: #{devname}") properties = `udevadm info --query=property --export --name=#{devname}`.inject({}) do |result, raw_propety| key, value = raw_propety.split(/\=/) result.update(key.strip => value.strip.chomp("'").reverse.chomp("'").reverse) end + @logger.debug("Device #{devname} udev properties: #{properties.inspect}") + @logger.debug("Trying to find out if device #{devname} is removable or not") if File.exists?("/sys/block/#{basename_dir}/removable") removable = File.open("/sys/block/#{basename_dir}/removable"){ |f| f.read_nonblock(1024).strip } end + @logger.debug("Device #{devname} removable parameter: #{removable.inspect}") - if STORAGE_CODES.include?(properties['MAJOR'].to_i) && removable =~ /^0$/ + if STORAGE_CODES.include?(properties['MAJOR'].to_i) + @logger.debug("Device #{devname} seems to be appropriate") # Exclude LVM volumes (in CentOS - 253, in Ubuntu - 252) using additional check - @blocks << basename_dir unless properties['DEVPATH'].include?('virtual') + unless properties['DEVPATH'].include?('virtual') + @blocks << { + :name => basename_dir, + :disk => _disk_path_by_name(basename_dir) || basename_dir, + :extra => _disk_id_by_name(basename_dir) || [], + :removable => removable, + } + end end end + @logger.debug("Final list of physical devices is: #{@blocks.inspect}") @blocks end