Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion lib/cloud_controller/diego/reporters/instances_stats_reporter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,26 @@ def get_stats(desired_lrp, process)
def actual_lrp_info(process, stats=nil, quota_stats=nil, log_cache_errors=nil, isolation_segment=nil, state=nil)
# rubocop:enable Metrics/ParameterLists
result = {}
lrp_instances = {}

bbs_instances_client.lrp_instances(process).each do |actual_lrp|
next unless actual_lrp.actual_lrp_key.index < process.instances

lrp_state = state || LrpStateTranslator.translate_lrp_state(actual_lrp)
# if an LRP already exists with the same index use the one with the latest since value
if lrp_instances.include?(actual_lrp.actual_lrp_key.index)
existing_lrp = lrp_instances[actual_lrp.actual_lrp_key.index]
next if actual_lrp.since < existing_lrp.since

lrp_instances.delete(actual_lrp.actual_lrp_key.index)
result.delete(actual_lrp.actual_lrp_key.index)
lrp_instances[actual_lrp.actual_lrp_key.index] = actual_lrp
end

lrp_state = state || LrpStateTranslator.translate_lrp_state(actual_lrp)
info = build_info(lrp_state, actual_lrp, process, stats, quota_stats, log_cache_errors)
info[:isolation_segment] = isolation_segment unless isolation_segment.nil?
result[actual_lrp.actual_lrp_key.index] = info
lrp_instances[actual_lrp.actual_lrp_key.index] = actual_lrp
end

fill_unreported_instances_with_down_instances(result, process, flat: false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,50 @@ def make_actual_lrp(instance_guid:, index:, state:, error:, since:)
end
end

context 'when there are multiple lrps with the same index' do
let(:bbs_actual_lrps_response) { [actual_lrp_1, actual_lrp_2, actual_lrp_3, actual_lrp_4] }
let(:actual_lrp_1) do
make_actual_lrp(
instance_guid: '', index: 0, state: ::Diego::ActualLRPState::UNCLAIMED, error: 'some-details', since: two_days_ago_since_epoch_ns
).tap do |actual_lrp|
actual_lrp.actual_lrp_net_info = lrp_1_net_info
end
end
let(:actual_lrp_2) do
make_actual_lrp(
instance_guid: 'instance-a', index: 0, state: ::Diego::ActualLRPState::RUNNING, error: 'some-details', since: two_days_ago_since_epoch_ns - 1000
).tap do |actual_lrp|
actual_lrp.actual_lrp_net_info = lrp_1_net_info
end
end

let(:actual_lrp_3) do
make_actual_lrp(
instance_guid: '', index: 1, state: ::Diego::ActualLRPState::UNCLAIMED, error: 'some-details', since: two_days_ago_since_epoch_ns
).tap do |actual_lrp|
actual_lrp.actual_lrp_net_info = lrp_1_net_info
end
end

let(:actual_lrp_4) do
make_actual_lrp(
instance_guid: 'instance-b', index: 1, state: ::Diego::ActualLRPState::CLAIMED, error: 'some-details', since: two_days_ago_since_epoch_ns - 1000
).tap do |actual_lrp|
actual_lrp.actual_lrp_net_info = lrp_1_net_info
end
end

before do
allow(bbs_instances_client).to receive_messages(lrp_instances: bbs_actual_lrps_response, desired_lrp_instance: bbs_desired_lrp_response)
end

it 'shows all correct state for all instances' do
result, = instances_reporter.stats_for_app(process)
expect(result[0][:state]).to eq('DOWN')
expect(result[1][:state]).to eq('DOWN')
end
end

context 'when a NoRunningInstances error is thrown for desired_lrp and it exists an actual_lrp' do
let(:error) { CloudController::Errors::NoRunningInstances.new('No running instances ruh roh') }
let(:expected_stopping_response) do
Expand Down