From 27fd6590894f4d60aafd9d65623ee1a99b1d0734 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Fri, 8 May 2020 07:57:56 -0700 Subject: [PATCH] NS1 support for TCP healthchecks --- octodns/provider/ns1.py | 24 +++++++++++++++--------- tests/test_octodns_provider_ns1.py | 7 +++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index fb0a78f..e99dc24 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -856,18 +856,13 @@ class Ns1Provider(BaseProvider): host = record.fqdn[:-1] _type = record._type - request = r'GET {path} HTTP/1.0\r\nHost: {host}\r\n' \ - r'User-agent: NS1\r\n\r\n'.format(path=record.healthcheck_path, - host=record.healthcheck_host) - - return { + ret = { 'active': True, 'config': { 'connect_timeout': 2000, 'host': value, 'port': record.healthcheck_port, 'response_timeout': 10000, - 'send': request, 'ssl': record.healthcheck_protocol == 'HTTPS', }, 'frequency': 60, @@ -881,12 +876,23 @@ class Ns1Provider(BaseProvider): 'rapid_recheck': False, 'region_scope': 'fixed', 'regions': self.monitor_regions, - 'rules': [{ + } + + if record.healthcheck_protocol != 'TCP': + # IF it's HTTP we need to send the request string + path = record.healthcheck_path + host = record.healthcheck_host + request = r'GET {path} HTTP/1.0\r\nHost: {host}\r\n' \ + r'User-agent: NS1\r\n\r\n'.format(path=path, host=host) + ret['config']['send'] = request + # We'll also expect a HTTP response + ret['rules'] = [{ 'comparison': 'contains', 'key': 'output', 'value': '200 OK', - }], - } + }] + + return ret def _monitor_is_match(self, expected, have): # Make sure what we have matches what's in expected exactly. Anything diff --git a/tests/test_octodns_provider_ns1.py b/tests/test_octodns_provider_ns1.py index 8a0dffb..2755580 100644 --- a/tests/test_octodns_provider_ns1.py +++ b/tests/test_octodns_provider_ns1.py @@ -717,6 +717,13 @@ class TestNs1ProviderDynamic(TestCase): monitor = provider._monitor_gen(self.record, value) self.assertTrue(monitor['config']['ssl']) + self.record._octodns['healthcheck']['protocol'] = 'TCP' + monitor = provider._monitor_gen(self.record, value) + # No http send done + self.assertFalse('send' in monitor['config']) + # No http response expected + self.assertFalse('rules' in monitor) + def test_monitor_is_match(self): provider = Ns1Provider('test', 'api-key')