class Bosh::Director::DeploymentPlan::CompilationInstancePool

Public Class Methods

new(instance_reuser, vm_creator, deployment_plan, logger, instance_deleter, max_instance_count) click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 4
def initialize(instance_reuser, vm_creator, deployment_plan, logger, instance_deleter, max_instance_count)
  @instance_reuser = instance_reuser
  @logger = logger
  @instance_deleter = instance_deleter
  @max_instance_count = max_instance_count
  @instance_provider = InstanceProvider.new(deployment_plan, vm_creator, logger)
  @mutex = Mutex.new
end

Public Instance Methods

delete_instances(number_of_workers) click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 47
def delete_instances(number_of_workers)
  ThreadPool.new(:max_threads => number_of_workers).wrap do |pool|
     @instance_reuser.each do |instance_memo|
      pool.process do
        @instance_reuser.remove_instance(instance_memo)
        instance_plan = DeploymentPlan::InstancePlan.new(
          existing_instance: instance_memo.instance.model,
          instance: instance_memo.instance,
          desired_instance: DeploymentPlan::DesiredInstance.new,
          network_plans: []
        )
        destroy_instance(instance_plan)
      end
    end
  end
end
with_reused_vm(stemcell) { |instance| ... } click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 13
def with_reused_vm(stemcell)
  begin
    instance_memo = obtain_instance_memo(stemcell)
    yield instance_memo.instance
    release_instance(instance_memo)
  rescue => e
    remove_instance(instance_memo)
    unless instance_memo.instance_plan.nil?
      if Config.keep_unreachable_vms
        @logger.info('Keeping reused compilation VM for debugging')
      else
        destroy_instance(instance_memo.instance_plan)
      end
    end
    raise e
  end
end
with_single_use_vm(stemcell) { |instance| ... } click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 31
def with_single_use_vm(stemcell)
  begin
    keep_failing_vm = false
    instance_memo = InstanceMemo.new(@instance_provider, stemcell)
    yield instance_memo.instance
  rescue => e
    @logger.info('Keeping single-use compilation VM for debugging')
    keep_failing_vm = Config.keep_unreachable_vms
    raise e
  ensure
    unless instance_memo.instance.nil? || keep_failing_vm
      destroy_instance(instance_memo.instance_plan)
    end
  end
end

Private Instance Methods

destroy_instance(instance_plan) click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 97
def destroy_instance(instance_plan)
  @instance_deleter.delete_instance_plan(instance_plan, EventLog::NullStage.new)
end
obtain_instance_memo(stemcell) click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 78
def obtain_instance_memo(stemcell)
  instance_memo = nil
  @mutex.synchronize do
    instance_memo = @instance_reuser.get_instance(stemcell)
    if instance_memo.nil?
      if @instance_reuser.total_instance_count >= @max_instance_count
        instance_memo = @instance_reuser.remove_idle_instance_not_matching_stemcell(stemcell)
        destroy_instance(instance_memo.instance_plan)
      end
      @logger.debug("Creating new compilation VM for stemcell '#{stemcell.model.desc}'")
      instance_memo = InstanceMemo.new(@instance_provider, stemcell)
      @instance_reuser.add_in_use_instance(instance_memo, stemcell)
    else
      @logger.info("Reusing compilation VM '#{instance_memo.instance.model.vm_cid}' for stemcell '#{stemcell.model.desc}'")
    end
  end
  return instance_memo
end
release_instance(instance_memo) click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 72
def release_instance(instance_memo)
  @mutex.synchronize do
    @instance_reuser.release_instance(instance_memo)
  end
end
remove_instance(instance_memo) click to toggle source
# File lib/bosh/director/deployment_plan/compilation_instance_pool.rb, line 66
def remove_instance(instance_memo)
  @mutex.synchronize do
    @instance_reuser.remove_instance(instance_memo)
  end
end