class Bosh::Director::DeploymentPlan::InstancePlanSorter

Public Class Methods

new(logger) click to toggle source
# File lib/bosh/director/deployment_plan/instance_plan_sorter.rb, line 3
def initialize(logger)
  @logger = logger
end

Public Instance Methods

sort(instance_plans) click to toggle source
# File lib/bosh/director/deployment_plan/instance_plan_sorter.rb, line 7
def sort(instance_plans)
  return [] if instance_plans.empty?

  @logger.debug('Sorting instance plan to update them always in the same order')

  @sorted_instance_plans = []
  bootstrap_instance_plan = instance_plans.find { |instance_plan| instance_plan.instance.bootstrap? }
  @sorted_instance_plans << bootstrap_instance_plan

  bootstrap_az = bootstrap_instance_plan.instance.availability_zone_name
  remaining_instance_plans = instance_plans - [bootstrap_instance_plan]

  sorted_instance_plans_for_bootstrap_az = sorted_instance_plans_in_special_az(bootstrap_az, remaining_instance_plans)
  remaining_instance_plans = remaining_instance_plans - sorted_instance_plans_for_bootstrap_az

  sorted_instance_plans_for_no_az = sorted_instance_plans_in_special_az(nil, remaining_instance_plans)
  remaining_instance_plans = remaining_instance_plans - sorted_instance_plans_for_no_az

  instance_plans_sorted_by_az = remaining_instance_plans.sort do |plan1, plan2|
    plan1.instance.availability_zone_name <=> plan2.instance.availability_zone_name
  end

  current_az = instance_plans_sorted_by_az.first.instance.availability_zone_name if instance_plans_sorted_by_az.any?
  instance_plans_in_current_az = []
  instance_plans_sorted_by_az.each do |instance_plan|
    if instance_plan.instance.availability_zone_name == current_az
      instance_plans_in_current_az << instance_plan
    else
      @sorted_instance_plans << sort_in_az(instance_plans_in_current_az)
      current_az = instance_plan.instance.availability_zone_name
      instance_plans_in_current_az = [instance_plan]
    end
  end
  @sorted_instance_plans << sort_in_az(instance_plans_in_current_az)
  @sorted_instance_plans.flatten
end

Private Instance Methods

sort_in_az(instance_plans) click to toggle source
# File lib/bosh/director/deployment_plan/instance_plan_sorter.rb, line 45
def sort_in_az(instance_plans)
  instance_plans.sort { |plan1, plan2|
    "#{plan1.instance.job_name}/#{plan1.instance.uuid}" <=> "#{plan2.instance.job_name}/#{plan2.instance.uuid}"
  }
end
sorted_instance_plans_in_special_az(az, instance_plans) click to toggle source
# File lib/bosh/director/deployment_plan/instance_plan_sorter.rb, line 51
def sorted_instance_plans_in_special_az(az, instance_plans)
  all_instance_plans_for_az = instance_plans
                                .select do |instance_plan|
    instance_plan.instance.availability_zone_name == az
  end
  sorted_instances_for_az = sort_in_az(all_instance_plans_for_az)
  @sorted_instance_plans << sorted_instances_for_az
  sorted_instances_for_az
end