async def test_validate_rrsets_by_zone(recon_client, fake_response_data, soa_ns_rrsets, extra_rrset, has_desired, caplog, monkeypatch, duplicate_rrset, has_someotherauthority): """Differences are detected and returned.""" rrsets = fake_response_data['rrsets'] + soa_ns_rrsets expected_missing_rrset = rrsets[0] if has_someotherauthority: rrsets = [duplicate_rrset] + rrsets else: rrsets = rrsets + [duplicate_rrset] mock_get_records_for_zone_called = 0 return_rrsets = [] for rrset in fake_response_data['rrsets']: rr = rrset.copy() rr['source'] = 'gdns' return_rrsets.append(rr) return_rrsets[0]['rrdatas'] = ['10.4.5.6'] return_rrsets.append(extra_rrset) async def mock_get_records_for_zone(*args, **kwargs): nonlocal mock_get_records_for_zone_called mock_get_records_for_zone_called += 1 return return_rrsets recon_client.dns_client.get_records_for_zone = mock_get_records_for_zone input_rrsets = [] expected_missing_rrsets = set() expected_extra_rrsets = set() if has_desired: for rrset in rrsets: input_rrset = rrset.copy() input_rrset['source'] = rrset.get('source', 'gceauthority') input_rrsets.append(input_rrset) expected_missing_rrsets = set( reconciler.ResourceRecordSet(**record) for record in [expected_missing_rrset, soa_ns_rrsets[2]] ) expected_extra_rrsets = set( reconciler.ResourceRecordSet(**record) for record in [return_rrsets[0], extra_rrset] ) actual_missing_rrsets, actual_extra_rrsets = ( await recon_client.validate_rrsets_by_zone( 'example.net.', input_rrsets)) assert expected_missing_rrsets == actual_missing_rrsets assert expected_extra_rrsets == actual_extra_rrsets assert 2 == len(caplog.records) assert 1 == mock_get_records_for_zone_called
def test__remove_soa_and_root_ns(fake_response_data, soa_ns_rrsets, recon_client): rrsets = [ reconciler.ResourceRecordSet(**rrset) for rrset in fake_response_data['rrsets'] ] soa_ns_rrsets = [ reconciler.ResourceRecordSet(**rrset) for rrset in soa_ns_rrsets ] rrsets_all = rrsets + soa_ns_rrsets expected = rrsets + [soa_ns_rrsets[2]] actual = recon_client._remove_soa_and_root_ns('example.net.', rrsets_all) assert expected == actual
def test_create_gcp_rrset_no_ttl(rrset_dict, rrset_dict_from_attr): # default TTL when not provided data = rrset_dict.copy() data.pop('ttl') rrset = reconciler.ResourceRecordSet(**data) rrset_dict_from_attr['ttl'] = 300 assert rrset_dict_from_attr == attr.asdict(rrset)
def test_create_gcp_rrset_raises(): # Raise when required params are missing missing_params = { 'name': 'test' } with pytest.raises(TypeError): reconciler.ResourceRecordSet(**missing_params)
def test_create_gcp_rrset_no_ttl(rrset_dict, rrset_dict_after_conversion): # default TTL when not provided data = rrset_dict.copy() data.pop('ttl') rrset = reconciler.ResourceRecordSet(**data) rrset_dict_after_conversion['ttl'] = 300 assert rrset_dict_after_conversion == vars(rrset)
def test_remove_soa_and_root_ns(fake_response_data, soa_ns_rrsets): rrsets = fake_response_data['rrsets'] rrsets_all = rrsets + soa_ns_rrsets rrsets_expected = rrsets + [soa_ns_rrsets[2]] expected = set(reconciler.ResourceRecordSet(**rr) for rr in rrsets_expected) actual = reconciler.GDNSReconciler.create_rrset_set( 'example.net.', rrsets_all) assert expected == actual
async def test_publish_change_messages(recon_client, fake_response_data, caplog): """Publish message to changes queue.""" rrsets = fake_response_data['rrsets'] desired_rrsets = [reconciler.ResourceRecordSet(**kw) for kw in rrsets] await recon_client.publish_change_messages(desired_rrsets) assert 3 == recon_client.changes_channel.qsize() assert 4 == len(caplog.records)
async def test_validate_rrsets_by_zone(recon_client, fake_response_data, soa_ns_rrsets, extra_rrset, has_desired, caplog, monkeypatch): """Differences are detected and returned.""" rrsets = fake_response_data['rrsets'] + soa_ns_rrsets mock_get_records_for_zone_called = 0 async def mock_get_records_for_zone(*args, **kwargs): nonlocal mock_get_records_for_zone_called mock_get_records_for_zone_called += 1 rrsets = fake_response_data['rrsets'] rrsets[0]['rrdatas'] = ['10.4.5.6'] rrsets.append(extra_rrset) return rrsets recon_client.dns_client.get_records_for_zone = mock_get_records_for_zone input_rrsets = [] expected_missing_rrsets = [] expected_extra_rrsets = [] if has_desired: input_rrsets = rrsets expected_missing_rrsets = [ reconciler.ResourceRecordSet(**record) for record in [rrsets[0], soa_ns_rrsets[2]] ] expected_extra_rrsets = [ reconciler.ResourceRecordSet(**record) for record in [extra_rrset] ] actual_missing_rrsets, actual_extra_rrsets = ( await recon_client.validate_rrsets_by_zone('example.net.', input_rrsets)) assert expected_missing_rrsets == actual_missing_rrsets assert expected_extra_rrsets == actual_extra_rrsets assert 2 == len(caplog.records) assert 1 == mock_get_records_for_zone_called
async def test_run(msg, exp_log_records, exp_mock_calls, qsize, additions, deletions, fake_response_data, extra_rrset, caplog, recon_client, monkeypatch): """Start reconciler & continue if certain errors are raised.""" mock_validate_rrsets_by_zone_called = 0 async def mock_validate_rrsets_by_zone(zone, rrsets): nonlocal mock_validate_rrsets_by_zone_called mock_validate_rrsets_by_zone_called += 1 return (rrsets, [reconciler.ResourceRecordSet(**extra_rrset)]) monkeypatch.setattr( recon_client, 'validate_rrsets_by_zone', mock_validate_rrsets_by_zone) if 'rrsets' in msg and msg['rrsets'] == 'FAKE': msg['rrsets'] = [ reconciler.ResourceRecordSet(**rrset) for rrset in fake_response_data['rrsets'] ] await recon_client.rrset_channel.put(msg) await recon_client.rrset_channel.put(None) await recon_client.run() assert qsize == recon_client.changes_channel.qsize() assert exp_log_records == len(caplog.records) assert exp_mock_calls == mock_validate_rrsets_by_zone_called context = {'plugin': 'reconciler'} recon_client.metrics._timer_mock.assert_called_once_with( 'plugin-runtime', context=context) recon_client.metrics.timer_stub.start_mock.assert_called_once_with() recon_client.metrics.timer_stub.stop_mock.assert_called_once_with() context['source'] = 'unknown' if additions: context['action'] = 'additions' recon_client.metrics._set_mock.assert_has_calls( [mock.call( 'rrsets-handled', additions, context=context)]) if deletions: context['source'] = 'gdns' context['action'] = 'deletions' recon_client.metrics._set_mock.assert_has_calls( [mock.call( 'rrsets-handled', deletions, context=context)])
def test_create_gcp_rrset(rrset_dict, rrset_dict_from_attr): """Create valid ResourceRecordSet instances.""" rrset = reconciler.ResourceRecordSet(**rrset_dict) assert rrset_dict_from_attr == attr.asdict(rrset)
async def mock_validate_rrsets_by_zone(zone, rrsets): nonlocal mock_validate_rrsets_by_zone_called mock_validate_rrsets_by_zone_called += 1 return (rrsets, [reconciler.ResourceRecordSet(**extra_rrset)])
def test_rrset_inequality(rrset_dict): other_rrset_dict = rrset_dict.copy() other_rrset_dict['name'] = 'someothername.com.' rrset = reconciler.ResourceRecordSet(**rrset_dict) other_rrset = reconciler.ResourceRecordSet(**other_rrset_dict) assert rrset != other_rrset
def test_create_gcp_rrset(rrset_dict, rrset_dict_after_conversion): """Create valid ResourceRecordSet instances.""" rrset = reconciler.ResourceRecordSet(**rrset_dict) assert rrset_dict_after_conversion == vars(rrset)
def test_rrset_repr(rrset_dict): rrset = reconciler.ResourceRecordSet(**rrset_dict) expected = ("{'name': 'test', 'type': 'A', 'rrdatas': ('10.1.2.3',), " "'kind': 'dns#resourceRecordSet', 'ttl': 500, 'source': None}") assert expected == repr(rrset)