diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index 4886c00..6d4f84d 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -234,7 +234,7 @@ class Ns1Provider(BaseProvider): SUPPORTS_GEO = True SUPPORTS_DYNAMIC = True SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CAA', 'CNAME', 'MX', 'NAPTR', - 'NS', 'PTR', 'SPF', 'SRV', 'TXT')) + 'NS', 'PTR', 'SPF', 'SRV', 'TXT', 'URLFWD')) ZONE_NOT_FOUND_MESSAGE = 'server error: zone not found' @@ -749,6 +749,23 @@ class Ns1Provider(BaseProvider): 'values': values, } + def _data_for_URLFWD(self, _type, record): + values = [] + for answer in record['short_answers']: + path, target, code, masking, query = answer.split(' ', 4) + values.append({ + 'path': path, + 'target': target, + 'code': code, + 'masking': masking, + 'query': query, + }) + return { + 'ttl': record['ttl'], + 'type': _type, + 'values': values, + } + def populate(self, zone, target=False, lenient=False): self.log.debug('populate: name=%s, target=%s, lenient=%s', zone.name, @@ -1244,6 +1261,11 @@ class Ns1Provider(BaseProvider): for v in record.values] return {'answers': values, 'ttl': record.ttl}, None + def _params_for_URLFWD(self, record): + values = [(v.path, v.target, v.code, v.masking, v.query) + for v in record.values] + return {'answers': values, 'ttl': record.ttl}, None + def _get_ns1_filters(self, ns1_zone_name): ns1_filters = {} ns1_zone = {} diff --git a/tests/test_octodns_provider_ns1.py b/tests/test_octodns_provider_ns1.py index e21fe0d..875ebbf 100644 --- a/tests/test_octodns_provider_ns1.py +++ b/tests/test_octodns_provider_ns1.py @@ -109,6 +109,17 @@ class TestNs1Provider(TestCase): 'value': 'ca.unit.tests', }, })) + expected.add(Record.new(zone, 'urlfwd', { + 'ttl': 41, + 'type': 'URLFWD', + 'value': { + 'path': '/', + 'target': 'http://foo.unit.tests', + 'code': 301, + 'masking': 2, + 'query': 0, + }, + })) ns1_records = [{ 'type': 'A', @@ -164,6 +175,11 @@ class TestNs1Provider(TestCase): 'ttl': 40, 'short_answers': ['0 issue ca.unit.tests'], 'domain': 'unit.tests.', + }, { + 'type': 'URLFWD', + 'ttl': 41, + 'short_answers': ['/ http://foo.unit.tests 301 2 0'], + 'domain': 'urlfwd.unit.tests.', }] @patch('ns1.rest.records.Records.retrieve') @@ -345,7 +361,7 @@ class TestNs1Provider(TestCase): # Test out the create rate-limit handling, then 9 successes record_create_mock.side_effect = [ RateLimitException('boo', period=0), - ] + ([None] * 9) + ] + ([None] * 10) got_n = provider.apply(plan) self.assertEquals(expected_n, got_n)