Sha256: 2416fd34b9c51d6c8a453575b814b1de4211d1cbe1139110647649a652c3b5c0

Contents?: true

Size: 1.96 KB

Versions: 18

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true

require 'log4r'

require 'vagrant-libvirt/errors'

module VagrantPlugins
  module ProviderLibvirt
    module Util
      class DiskDeviceResolver
        attr_reader :existing

        def initialize(prefix='vd')
          @default_prefix = prefix

          @device_indicies = Hash.new
          @existing = Hash.new
        end

        def resolve!(disks, options={})
          # check for duplicate device entries and raise an exception if one found
          # with enough details that the user should be able to determine what
          # to do to resolve.
          disks.select { |x| !x[:device].nil? }.each do |x|
            if @existing.has_key?(x[:device])
              raise Errors::DuplicateDiskDevice, new_disk: x, existing_disk: @existing[x[:device]]
            end

            @existing[x[:device]] = x
          end

          disks.each_index do |index|
            dev = disks[index][:device]
            if dev.nil?
              prefix = options.fetch(:prefix, @default_prefix)
              dev = next_device(prefix=prefix)
              if dev.nil?
                raise Errors::NoDiskDeviceAvailable, prefix: prefix
              end

              disks[index][:device] = dev
              @existing[dev] = disks[index]
            end
          end
        end

        def resolve(disks)
          new_disks = []
          disks.each do |disk|
            new_disks.push disk.dup
          end

          resolve!(new_disks)

          new_disks
        end

        private

        def next_device(prefix)
          curr = device_index(prefix)
          while curr <= 'z'.ord
            dev = prefix + curr.chr
            if !@existing[dev].nil?
              curr += 1
              next
            else
              @device_indicies[prefix] = curr
              return dev
            end
          end
        end

        def device_index(prefix)
          @device_indicies[prefix] ||= 'a'.ord
        end
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
vagrant-libvirt-0.12.2 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.12.1 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.12.0 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.11.2 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.11.1 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.8 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.7 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.6 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.5 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.4 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.3 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.2 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.1 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.10.0 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.9.0 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.8.2 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.8.1 lib/vagrant-libvirt/util/resolvers.rb
vagrant-libvirt-0.8.0 lib/vagrant-libvirt/util/resolvers.rb