def test_aggregate_target(self): simple = SimpleProvider() geo = GeoProvider() dynamic = DynamicProvider() nosshfp = NoSshFpProvider() self.assertFalse(_AggregateTarget([simple, simple]).SUPPORTS_GEO) self.assertFalse(_AggregateTarget([simple, geo]).SUPPORTS_GEO) self.assertFalse(_AggregateTarget([geo, simple]).SUPPORTS_GEO) self.assertTrue(_AggregateTarget([geo, geo]).SUPPORTS_GEO) self.assertFalse(_AggregateTarget([simple, simple]).SUPPORTS_DYNAMIC) self.assertFalse(_AggregateTarget([simple, dynamic]).SUPPORTS_DYNAMIC) self.assertFalse(_AggregateTarget([dynamic, simple]).SUPPORTS_DYNAMIC) self.assertTrue(_AggregateTarget([dynamic, dynamic]).SUPPORTS_DYNAMIC) zone = Zone('unit.tests.', []) record = Record.new( zone, 'sshfp', { 'ttl': 60, 'type': 'SSHFP', 'value': { 'algorithm': 1, 'fingerprint_type': 1, 'fingerprint': 'abcdefg', }, }) self.assertTrue(simple.supports(record)) self.assertFalse(nosshfp.supports(record)) self.assertTrue(_AggregateTarget([simple, simple]).supports(record)) self.assertFalse(_AggregateTarget([simple, nosshfp]).supports(record))
def test_geo(self): geo_data = { 'ttl': 42, 'values': ['5.2.3.4', '6.2.3.4'], 'geo': { 'AF': ['1.1.1.1'], 'AS-JP': ['2.2.2.2', '3.3.3.3'], 'NA-US': ['4.4.4.4', '5.5.5.5'], 'NA-US-CA': ['6.6.6.6', '7.7.7.7'] } } geo = ARecord(self.zone, 'geo', geo_data) self.assertEquals(geo_data, geo.data) other_data = { 'ttl': 42, 'values': ['5.2.3.4', '6.2.3.4'], 'geo': { 'AF': ['1.1.1.1'], 'AS-JP': ['2.2.2.2', '3.3.3.3'], 'NA-US': ['4.4.4.4', '5.5.5.5'], 'NA-US-CA': ['6.6.6.6', '7.7.7.7'] } } other = ARecord(self.zone, 'geo', other_data) self.assertEquals(other_data, other.data) simple_target = SimpleProvider() geo_target = GeoProvider() # Geo provider doesn't consider identical geo to be changes self.assertFalse(geo.changes(geo, geo_target)) # geo values don't impact equality other.geo['AF'].values = ['9.9.9.9'] self.assertTrue(geo == other) # Non-geo supporting provider doesn't consider geo diffs to be changes self.assertFalse(geo.changes(other, simple_target)) # Geo provider does consider geo diffs to be changes self.assertTrue(geo.changes(other, geo_target)) # Object without geo doesn't impact equality other.geo = {} self.assertTrue(geo == other) # Non-geo supporting provider doesn't consider lack of geo a diff self.assertFalse(geo.changes(other, simple_target)) # Geo provider does consider lack of geo diffs to be changes self.assertTrue(geo.changes(other, geo_target)) # __repr__ doesn't blow up geo.__repr__()
def test_aggregate_target(self): simple = SimpleProvider() geo = GeoProvider() dynamic = DynamicProvider() nosshfp = NoSshFpProvider() targets = [simple, geo] at = _AggregateTarget(targets) # expected targets self.assertEqual(targets, at.targets) # union of their SUPPORTS self.assertEqual(set(('A')), at.SUPPORTS) # unknown property will go up into super and throw the normal # exception with self.assertRaises(AttributeError) as ctx: at.FOO self.assertEqual('_AggregateTarget object has no attribute FOO', str(ctx.exception)) self.assertFalse(_AggregateTarget([simple, simple]).SUPPORTS_GEO) self.assertFalse(_AggregateTarget([simple, geo]).SUPPORTS_GEO) self.assertFalse(_AggregateTarget([geo, simple]).SUPPORTS_GEO) self.assertTrue(_AggregateTarget([geo, geo]).SUPPORTS_GEO) self.assertFalse(_AggregateTarget([simple, simple]).SUPPORTS_DYNAMIC) self.assertFalse(_AggregateTarget([simple, dynamic]).SUPPORTS_DYNAMIC) self.assertFalse(_AggregateTarget([dynamic, simple]).SUPPORTS_DYNAMIC) self.assertTrue(_AggregateTarget([dynamic, dynamic]).SUPPORTS_DYNAMIC) zone = Zone('unit.tests.', []) record = Record.new( zone, 'sshfp', { 'ttl': 60, 'type': 'SSHFP', 'value': { 'algorithm': 1, 'fingerprint_type': 1, 'fingerprint': 'abcdefg', }, }, ) self.assertTrue(simple.supports(record)) self.assertFalse(nosshfp.supports(record)) self.assertTrue(_AggregateTarget([simple, simple]).supports(record)) self.assertFalse(_AggregateTarget([simple, nosshfp]).supports(record))
def test_populate(self): provider, stubber = self._get_stubbed_provider() got = Zone('unit.tests.', []) with self.assertRaises(ClientError): stubber.add_client_error('list_hosted_zones') provider.populate(got) with self.assertRaises(ClientError): list_hosted_zones_resp = { 'HostedZones': [{ 'Name': 'unit.tests.', 'Id': 'z42', 'CallerReference': 'abc', }], 'Marker': 'm', 'IsTruncated': False, 'MaxItems': '100', } stubber.add_response('list_hosted_zones', list_hosted_zones_resp, {}) stubber.add_client_error('list_resource_record_sets', expected_params={'HostedZoneId': u'z42'}) provider.populate(got) stubber.assert_no_pending_responses() # list_hosted_zones has been cached from now on so we don't have to # worry about stubbing it list_resource_record_sets_resp_p1 = { 'ResourceRecordSets': [{ 'Name': 'simple.unit.tests.', 'Type': 'A', 'ResourceRecords': [{ 'Value': '1.2.3.4', }, { 'Value': '2.2.3.4', }], 'TTL': 60, }, { 'Name': 'unit.tests.', 'Type': 'A', 'GeoLocation': { 'CountryCode': '*', }, 'ResourceRecords': [{ 'Value': '2.2.3.4', }, { 'Value': '3.2.3.4', }], 'TTL': 61, }, { 'Name': 'unit.tests.', 'Type': 'A', 'GeoLocation': { 'ContinentCode': 'AF', }, 'ResourceRecords': [{ 'Value': '4.2.3.4', }], 'TTL': 61, }, { 'Name': 'unit.tests.', 'Type': 'A', 'GeoLocation': { 'CountryCode': 'US', }, 'ResourceRecords': [{ 'Value': '5.2.3.4', }, { 'Value': '6.2.3.4', }], 'TTL': 61, }, { 'Name': 'unit.tests.', 'Type': 'A', 'GeoLocation': { 'CountryCode': 'US', 'SubdivisionCode': 'CA', }, 'ResourceRecords': [{ 'Value': '7.2.3.4', }], 'TTL': 61, }], 'IsTruncated': True, 'NextRecordName': 'next_name', 'NextRecordType': 'next_type', 'MaxItems': '100', } stubber.add_response('list_resource_record_sets', list_resource_record_sets_resp_p1, {'HostedZoneId': 'z42'}) list_resource_record_sets_resp_p2 = { 'ResourceRecordSets': [{ 'Name': 'cname.unit.tests.', 'Type': 'CNAME', 'ResourceRecords': [{ 'Value': 'unit.tests.', }], 'TTL': 62, }, { 'Name': 'txt.unit.tests.', 'Type': 'TXT', 'ResourceRecords': [{ 'Value': '"Hello World!"', }, { 'Value': '"Goodbye World?"', }], 'TTL': 63, }, { 'Name': 'unit.tests.', 'Type': 'MX', 'ResourceRecords': [{ 'Value': '10 smtp-1.unit.tests.', }, { 'Value': '20 smtp-2.unit.tests.', }], 'TTL': 64, }, { 'Name': 'naptr.unit.tests.', 'Type': 'NAPTR', 'ResourceRecords': [{ 'Value': '10 20 "U" "SIP+D2U" ' '"!^.*$!sip:[email protected]!" .', }], 'TTL': 65, }, { 'Name': '_srv._tcp.unit.tests.', 'Type': 'SRV', 'ResourceRecords': [{ 'Value': '10 20 30 cname.unit.tests.', }], 'TTL': 66, }, { 'Name': 'unit.tests.', 'Type': 'NS', 'ResourceRecords': [{ 'Value': 'ns1.unit.tests.', }], 'TTL': 67, }, { 'Name': 'sub.unit.tests.', 'Type': 'NS', 'GeoLocation': { 'ContinentCode': 'AF', }, 'ResourceRecords': [{ 'Value': '5.2.3.4.', }, { 'Value': '6.2.3.4.', }], 'TTL': 68, }, { 'Name': 'soa.unit.tests.', 'Type': 'SOA', 'ResourceRecords': [{ 'Value': 'ns1.unit.tests.', }], 'TTL': 69, }, { 'Name': 'unit.tests.', 'Type': 'CAA', 'ResourceRecords': [{ 'Value': '0 issue "ca.unit.tests"', }], 'TTL': 69, }], 'IsTruncated': False, 'MaxItems': '100', } stubber.add_response('list_resource_record_sets', list_resource_record_sets_resp_p2, {'HostedZoneId': 'z42', 'StartRecordName': 'next_name', 'StartRecordType': 'next_type'}) # Load everything provider.populate(got) # Make sure we got what we expected changes = self.expected.changes(got, GeoProvider()) self.assertEquals(0, len(changes)) stubber.assert_no_pending_responses() # Populate a zone that doesn't exist noexist = Zone('does.not.exist.', []) provider.populate(noexist) self.assertEquals(set(), noexist.records)