示例#1
0
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
示例#2
0
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
示例#3
0
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)
示例#4
0
def test_create_gcp_rrset_raises():
    # Raise when required params are missing
    missing_params = {
        'name': 'test'
    }
    with pytest.raises(TypeError):
        reconciler.ResourceRecordSet(**missing_params)
示例#5
0
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)
示例#6
0
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
示例#7
0
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)
示例#8
0
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
示例#9
0
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)])
示例#10
0
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)
示例#11
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)])
示例#12
0
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
示例#13
0
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)
示例#14
0
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)