Sha256: 748386cb71e73ccda5d70ea1b4408a0b08a219a3da4b8111a6ec128886952bc8

Contents?: true

Size: 1.36 KB

Versions: 1

Compression:

Stored size: 1.36 KB

Contents

require 'mkit/app/model/lease'
require 'mkit/status'
require 'mkit/exceptions'

class Pool < ActiveRecord::Base
  has_many :lease, dependent: :destroy

  def check_status
    if status == MKIt::PoolStatus::EXAUSTED
      raise PoolExaustedException.new
    end
  end

  def next_lease_ip
    self.check_status
    ips = range.split('-')
    next_ip = ips[0]
    next_ip = next_ip.to_i
    lease.select(:status == MKIt::PoolStatus::IN_USE || :status == MKIt::PoolStatus::RESERVED).each { |l|
      leased_ip = l.ip.split('.')[3]
      leased_ip = leased_ip.to_i
      if leased_ip >= next_ip
        next_ip = leased_ip+1
      end
    }
    if next_ip > ips[1].to_i
      self.status = MKIt::PoolStatus::EXAUSTED
      self.save
      raise PoolExaustedException.new
    end

    ip_add = self.ip.split('.')

    "#{ip_add[0]}.#{ip_add[1]}.#{ip_add[2]}.#{next_ip}"
  end

  def request(service:, status:)
    lease_ip = next_lease_ip
    idx = lease_ip.split('.')[3]
    new_lease = Lease.new(
      pool: self,
      service: service,
      interface_name: "vmkit#{idx}",
      interface_type: 'tun',
      status: status,
      ip: lease_ip
    )
    new_lease.save
    new_lease
  end

  def request_for(service)
     request(service: service, status:  MKIt::PoolStatus::IN_USE)
  end

  def reserve_for(service)
     request(service: service, status:  MKIt::PoolStatus::RESERVED)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mkit-0.2.0 lib/mkit/app/model/pool.rb