Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
7 changes: 7 additions & 0 deletions src/bosh-director/lib/bosh/director/cloudcheck_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ def recreate_vm_without_wait(instance_model)
def recreate_vm(instance_model, wait_for_running = true)
@logger.debug("Recreating Vm: #{instance_model})")
delete_vm_from_cloud(instance_model)
delete_dns_for_instance_safely(instance_model)

deployment_model = instance_model.deployment
factory = Bosh::Director::DeploymentPlan::PlannerFactory.create(@logger)
Expand Down Expand Up @@ -167,6 +168,12 @@ def vm_creator(template_cache, dns_encoder, link_provider_intents)
@vm_creator ||= VmCreator.new(@logger, template_cache, dns_encoder, agent_broadcaster, link_provider_intents)
end

def delete_dns_for_instance_safely(instance_model)
LocalDnsManager.create(Config.root_domain, @logger).delete_dns_for_instance(instance_model)
rescue StandardError => e
@logger.warn("Failed to clean up DNS records for #{instance_model}, continuing: #{e.message}")
Comment thread
neddp marked this conversation as resolved.
Resolved
end

def validate_spec(spec)
handler_error('Unable to look up VM apply spec') unless spec

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def instance_group

resolution :delete_vm do
plan { 'Delete VM' }
action { validate; delete_vm_from_cloud(@instance) }
action { validate; delete_vm_from_cloud(@instance); delete_dns_for_instance_safely(@instance) }
end

resolution :delete_vm_reference do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,41 @@ def expect_vm_gets_created
end
end
end

context 'DNS cleanup' do
let(:local_dns_manager) { instance_double(LocalDnsManager) }

before do
fake_job_context
allow(Config).to receive(:root_domain).and_return('bosh')
allow(LocalDnsManager).to receive(:create).and_return(local_dns_manager)
allow(local_dns_manager).to receive(:delete_dns_for_instance)
allow(local_dns_manager).to receive(:update_dns_record_for_instance)
allow(vm_deleter).to receive(:delete_for_instance)
allow(vm_creator).to receive(:create_for_instance_plan)
allow(rendered_templates_persister).to receive(:persist)
allow(agent_client).to receive(:apply)
allow(agent_client).to receive(:run_script)
allow(agent_client).to receive(:start)
allow(DnsNameGenerator).to receive(:dns_record_name).and_return('some.dns.record')
allow(template_cache).to receive(:clean_cache!)
end

it 'deletes DNS records before recreating the VM' do
calls = []
allow(vm_deleter).to receive(:delete_for_instance) { calls << :delete_vm }
allow(local_dns_manager).to receive(:delete_dns_for_instance) { calls << :delete_dns }
allow(vm_creator).to receive(:create_for_instance_plan) { calls << :create_vm }
test_problem_handler.apply_resolution(:recreate_vm)
expect(calls).to eq(%i[delete_vm delete_dns create_vm])
end

it 'continues recreation when DNS cleanup raises' do
allow(local_dns_manager).to receive(:delete_dns_for_instance).and_raise(StandardError, 'dns error')
expect(vm_creator).to receive(:create_for_instance_plan)
test_problem_handler.apply_resolution(:recreate_vm)
end
end
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,31 @@ def expect_vm_to_be_created
Models::Vm.where(cid: 'vm-cid').count
}.from(1).to(0)
end

context 'DNS cleanup' do
let(:local_dns_manager) { instance_double(LocalDnsManager) }

before do
allow(agent).to receive(:ping).and_raise(RpcTimeout)
allow(cloud).to receive(:delete_vm).with('vm-cid')
allow(Config).to receive(:root_domain).and_return('bosh')
allow(LocalDnsManager).to receive(:create).and_return(local_dns_manager)
allow(local_dns_manager).to receive(:delete_dns_for_instance)
end

it 'cleans up DNS records after deleting the VM' do
calls = []
allow(cloud).to receive(:delete_vm) { calls << :delete_vm }
allow(local_dns_manager).to receive(:delete_dns_for_instance) { calls << :delete_dns }
handler.apply_resolution(:delete_vm)
expect(calls).to eq(%i[delete_vm delete_dns])
end

it 'continues when DNS cleanup raises' do
allow(local_dns_manager).to receive(:delete_dns_for_instance).and_raise(StandardError, 'dns error')
expect { handler.apply_resolution(:delete_vm) }.not_to raise_error
end
end
end

describe 'delete_vm_reference resolution' do
Expand Down
Loading