self.build_mapping

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