Merge "Adding multipath info to output disk information"
This commit is contained in:
commit
e2b35cd9ed
65
agent
65
agent
|
@ -156,6 +156,7 @@ class NodeAgent
|
||||||
@logger.info("API URL is #{@api_url}")
|
@logger.info("API URL is #{@api_url}")
|
||||||
@os = ohai_system_info
|
@os = ohai_system_info
|
||||||
@numa_topology = get_numa_topology
|
@numa_topology = get_numa_topology
|
||||||
|
@mpath_devices, @skip_devices = multipath_devices
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_scheme_and_port
|
def get_scheme_and_port
|
||||||
|
@ -443,9 +444,21 @@ class NodeAgent
|
||||||
begin
|
begin
|
||||||
Timeout::timeout(30) do
|
Timeout::timeout(30) do
|
||||||
@logger.debug("Trying to find block devices")
|
@logger.debug("Trying to find block devices")
|
||||||
|
|
||||||
|
# ohai reports the disk size according to /sys/block/#{bname}
|
||||||
|
# which is always measured in 512 bytes blocks, no matter what
|
||||||
|
# the physical (minimal unit which can be atomically written)
|
||||||
|
# or logical (minimal # unit which can be addressed) block sizes are, see
|
||||||
|
# http://lxr.free-electrons.com/source/include/linux/types.h?v=4.4#L124
|
||||||
|
# http://lxr.free-electrons.com/source/drivers/scsi/sd.c?v=4.4#L2340
|
||||||
|
block_size = 512
|
||||||
|
|
||||||
(@os[:block_device] or {} rescue {}).each do |bname, binfo|
|
(@os[:block_device] or {} rescue {}).each do |bname, binfo|
|
||||||
@logger.debug("Found block device: #{bname}")
|
@logger.debug("Found block device: #{bname}")
|
||||||
@logger.debug("Block device info: #{binfo.inspect}")
|
@logger.debug("Block device info: #{binfo.inspect}")
|
||||||
|
dname = bname.gsub(/!/, '/')
|
||||||
|
next if @skip_devices.include?(dname)
|
||||||
|
|
||||||
if physical_data_storage_devices.map{|d| d[:name]}.include?(bname) && binfo
|
if physical_data_storage_devices.map{|d| d[:name]}.include?(bname) && binfo
|
||||||
@logger.debug("Block device seems to be physical data storage: #{bname}")
|
@logger.debug("Block device seems to be physical data storage: #{bname}")
|
||||||
block = physical_data_storage_devices.select{|d| d[:name] == bname}[0]
|
block = physical_data_storage_devices.select{|d| d[:name] == bname}[0]
|
||||||
|
@ -457,22 +470,27 @@ class NodeAgent
|
||||||
end
|
end
|
||||||
@logger.debug("Block device #{bname} is accepted by PCI vendor ID")
|
@logger.debug("Block device #{bname} is accepted by PCI vendor ID")
|
||||||
end
|
end
|
||||||
dname = bname.gsub(/!/, '/')
|
|
||||||
|
|
||||||
# ohai reports the disk size according to /sys/block/#{bname}
|
|
||||||
# which is always measured in 512 bytes blocks, no matter what
|
|
||||||
# the physical (minimal unit which can be atomically written)
|
|
||||||
# or logical (minimal # unit which can be addressed) block sizes are, see
|
|
||||||
# http://lxr.free-electrons.com/source/include/linux/types.h?v=4.4#L124
|
|
||||||
# http://lxr.free-electrons.com/source/drivers/scsi/sd.c?v=4.4#L2340
|
|
||||||
block_size = 512
|
|
||||||
detailed_meta[:disks] << {
|
detailed_meta[:disks] << {
|
||||||
:name => dname,
|
:name => dname,
|
||||||
:model => binfo[:model],
|
:model => binfo[:model],
|
||||||
:size => (binfo[:size].to_i * block_size),
|
:size => (binfo[:size].to_i * block_size),
|
||||||
:disk => block[:disk],
|
:disk => block[:disk],
|
||||||
:extra => block[:extra],
|
:extra => block[:extra],
|
||||||
:removable => block[:removable]
|
:removable => block[:removable],
|
||||||
|
:paths => nil
|
||||||
|
}
|
||||||
|
|
||||||
|
elsif @mpath_devices.has_key?(dname)
|
||||||
|
device = @mpath_devices[dname]
|
||||||
|
detailed_meta[:disks] << {
|
||||||
|
:name => 'mapper/' + device["DM_NAME"],
|
||||||
|
:model => binfo[:model],
|
||||||
|
:size => (binfo[:size].to_i * block_size),
|
||||||
|
:disk => dname,
|
||||||
|
:extra => _disk_id_by_name(dname),
|
||||||
|
:removable => 0,
|
||||||
|
:paths => device["DM_BLKDEVS_USED"].map{|name| _disk_path_by_name(name)}.join(', ')
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -485,6 +503,35 @@ class NodeAgent
|
||||||
detailed_meta
|
detailed_meta
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def multipath_devices
|
||||||
|
dmsetup = `/sbin/dmsetup info -c --nameprefixes --noheadings -o blkdevname,subsystem,blkdevs_used,name,uuid`
|
||||||
|
# Example output:
|
||||||
|
# DM_BLKDEVNAME='dm-0':DM_SUBSYSTEM='mpath':DM_BLKDEVS_USED='sdb,sda':DM_NAME='31234567890abcdef':DM_UUID='mpath-31234567890abcdef'
|
||||||
|
# DM_BLKDEVNAME='dm-1':DM_SUBSYSTEM='mpath':DM_BLKDEVS_USED='sdc,sdd':DM_NAME='92344567890abcdef':DM_UUID='mpath-92344567890abcdef'
|
||||||
|
|
||||||
|
mpath_devices = {}
|
||||||
|
mapping = []
|
||||||
|
unless dmsetup.include?("No devices found")
|
||||||
|
dmsetup.lines.each do |line|
|
||||||
|
device = {}
|
||||||
|
line.split(/:/).each do |key_value|
|
||||||
|
k, v = key_value.split('=')
|
||||||
|
device[k] = v.strip().gsub(/'/, '')
|
||||||
|
end
|
||||||
|
next unless device["DM_SUBSYSTEM"] == 'mpath'
|
||||||
|
device["DM_BLKDEVS_USED"] = device["DM_BLKDEVS_USED"].split(',')
|
||||||
|
device["DM_BLKDEVS_USED"].each do | name |
|
||||||
|
mapping << name
|
||||||
|
end
|
||||||
|
mpath_devices[device["DM_BLKDEVNAME"]] = device
|
||||||
|
end
|
||||||
|
end
|
||||||
|
[mpath_devices, mapping]
|
||||||
|
rescue => e
|
||||||
|
@logger.error("Error '#{e.message}' while scanning for multipath devices.")
|
||||||
|
[{}, []]
|
||||||
|
end
|
||||||
|
|
||||||
def _get_pci_vendor_id(devname)
|
def _get_pci_vendor_id(devname)
|
||||||
Timeout::timeout(30) do
|
Timeout::timeout(30) do
|
||||||
udevadm_walk = {}
|
udevadm_walk = {}
|
||||||
|
|
Loading…
Reference in New Issue