in cookbooks/fb_storage/libraries/storage.rb [622:717]
def self.build_mapping(node, maintenance_disks)
devs = sorted_devices(node, maintenance_disks)
config = node['fb_storage']['devices'].to_a
num_requested = config.count
if devs.count > num_requested
fail "fb_storage: #{num_requested} requested devices, " +
"which is fewer than available devices #{devs.count} (#{devs}). " +
'Probably something is wrong. Bailing out!'
elsif devs.count < num_requested
fail "fb_storage: Requested #{num_requested} disks but " +
"only #{devs.count} available. Bailing out!"
end
desired_arrays = {}
node['fb_storage']['arrays']&.each_with_index do |cfg, idx|
desired_arrays["/dev/md#{idx}"] = cfg.to_hash
desired_arrays["/dev/md#{idx}"]['members'] = []
end
{ '/' => self.root_device_name(node),
'/boot' => self.boot_device_name(node) }.each do |fs, dev|
next unless dev && dev.start_with?('md')
dev_path = "/dev/#{dev}"
if desired_arrays[dev_path]
unless desired_arrays[dev_path]['_skip']
fail "fb_storage: Asked to configure #{dev} but that is `#{fs}`!"
end
else
desired_arrays[dev_path] = { 'members' => [], '_skip' => true }
end
end
desired_disks = {}
devs.each_with_index do |device, index|
dpath = FB::Storage.device_path_from_name(device)
Chef::Log.debug(
"fb_storage: Processing #{dpath}(#{device}): " +
(config[index]).to_s,
)
desired_disks[dpath] = config[index]
next if config[index]['_skip']
config[index]['partitions'].each_with_index do |part, pindex|
pdevice = partition_device_name(
dpath,
config[index]['whole_device'] ? '' : pindex + 1,
)
if part['_swraid_array']
array_num = part['_swraid_array']
desired_arrays["/dev/md#{array_num}"]['members'] << pdevice
elsif part['_swraid_array_journal']
array_num = part['_swraid_array_journal']
desired_arrays["/dev/md#{array_num}"]['journal'] = pdevice
elsif part['_xfs_rt_data']
array_num = part['_xfs_rt_data']
desired_arrays["/dev/md#{array_num}"]['members'] << pdevice
desired_disks[dpath]['partitions'][pindex]['part_name'] ||=
desired_arrays["/dev/md#{array_num}"]['mount_point']
elsif part['_xfs_rt_metadata']
array_num = part['_xfs_rt_metadata']
desired_arrays["/dev/md#{array_num}"]['journal'] = pdevice
desired_disks[dpath]['partitions'][pindex]['part_name'] ||=
"md:#{desired_arrays["/dev/md
elsif part['_xfs_rt_rescue']
array_num = part['_xfs_rt_rescue']
desired_arrays["/dev/md#{array_num}"]['rescue'] = pdevice
desired_disks[dpath]['partitions'][pindex]['part_name'] ||=
'md_rescue:' +
desired_arrays["/dev/md#{array_num}"]['mount_point']
end
end
end
data = { :disks => desired_disks, :arrays => desired_arrays }
Chef::Log.debug(
'fb_storage: Disk mapping: ' +
JSON.pretty_generate(data),
)
return data
end