From 7e0733a4e4ed953a72eb75d62449b674a66aa831 Mon Sep 17 00:00:00 2001 From: Sham Date: Wed, 23 Jun 2021 12:37:40 -0700 Subject: [PATCH 01/13] fix for NA continent geo target limitation on NS1 --- octodns/provider/ns1.py | 50 +++++++++++++++++------------- tests/test_octodns_provider_ns1.py | 28 ++++++++++++++--- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index 9313d0d..cfa7be7 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -350,8 +350,6 @@ class Ns1Provider(BaseProvider): 'AS': ('ASIAPAC',), 'EU': ('EUROPE',), 'SA': ('SOUTH-AMERICA',), - # TODO: what about CA, MX, and all the other NA countries? - 'NA': ('US-CENTRAL', 'US-EAST', 'US-WEST'), } # Necessary for handling unsupported continents in _CONTINENT_TO_REGIONS @@ -359,6 +357,11 @@ class Ns1Provider(BaseProvider): 'OC': {'FJ', 'NC', 'PG', 'SB', 'VU', 'AU', 'NF', 'NZ', 'FM', 'GU', 'KI', 'MH', 'MP', 'NR', 'PW', 'AS', 'CK', 'NU', 'PF', 'PN', 'TK', 'TO', 'TV', 'WF', 'WS'}, + 'NA': {'DO', 'DM', 'BB', 'BL', 'BM', 'HT', 'KN', 'JM', 'VC', 'HN', + 'BS', 'BZ', 'PR', 'NI', 'LC', 'TT', 'VG', 'PA', 'TC', 'PM', + 'GT', 'AG', 'GP', 'AI', 'VI', 'CA', 'GD', 'AW', 'CR', 'GL', + 'CU', 'MF', 'SV', 'US', 'UM', 'MQ', 'MS', 'KY', 'MX', 'CW', + 'BQ', 'SX'} } def __init__(self, id, api_key, retry_count=4, monitor_regions=None, @@ -549,42 +552,45 @@ class Ns1Provider(BaseProvider): geos = set() - # continents are mapped (imperfectly) to regions, but what about - # Canada/North America for georegion in meta.get('georegion', []): geos.add(self._REGION_TO_CONTINENT[georegion]) # Countries are easy enough to map, we just have to find their # continent # - # NOTE: Special handling for Oceania - # NS1 doesn't support Oceania as a region. So the Oceania countries - # will be present in meta['country']. If all the countries in the - # Oceania countries list are found, set the region to OC and remove - # individual oceania country entries - - oc_countries = set() + # NOTE: Some continents need special handling since NS1 + # does not supprt them as regions. These are defined under + # _CONTINENT_TO_LIST_OF_COUNTRIES. So the countries for these + # regions will be present in meta['country']. If all the countries + # in _CONTINENT_TO_LIST_OF_COUNTRIES[] list are found, + # set the continent as the region and remove individual countries + + special_continents = dict() for country in meta.get('country', []): - # country_alpha2_to_continent_code fails for Pitcairn ('PN') + # country_alpha2_to_continent_code fails for Pitcairn ('PN'), + # United States Minor Outlying Islands ('UM') and + # Sint Maarten ('SX') if country == 'PN': con = 'OC' + elif country in ['SX', 'UM']: + con = 'NA' else: con = country_alpha2_to_continent_code(country) - if con == 'OC': - oc_countries.add(country) + if con in self._CONTINENT_TO_LIST_OF_COUNTRIES: + special_continents.setdefault(con, set()).add(country) else: - # Adding only non-OC countries here to geos geos.add('{}-{}'.format(con, country)) - if oc_countries: - if oc_countries == self._CONTINENT_TO_LIST_OF_COUNTRIES['OC']: - # All OC countries found, so add 'OC' to geos - geos.add('OC') + for continent, countries in special_continents.items(): + if countries == self._CONTINENT_TO_LIST_OF_COUNTRIES[ + continent]: + # All countries found, so add it to geos + geos.add(continent) else: - # Partial OC countries found, just add them as-is to geos - for c in oc_countries: - geos.add('{}-{}'.format('OC', c)) + # Partial countries found, so just add them as-is to geos + for c in countries: + geos.add('{}-{}'.format(continent, c)) # States are easy too, just assume NA-US (CA providences aren't # supported by octoDNS currently) diff --git a/tests/test_octodns_provider_ns1.py b/tests/test_octodns_provider_ns1.py index 4ae4757..8535999 100644 --- a/tests/test_octodns_provider_ns1.py +++ b/tests/test_octodns_provider_ns1.py @@ -1034,7 +1034,7 @@ class TestNs1ProviderDynamic(TestCase): rule0 = record.data['dynamic']['rules'][0] rule1 = record.data['dynamic']['rules'][1] rule0['geos'] = ['AF', 'EU'] - rule1['geos'] = ['NA'] + rule1['geos'] = ['AS'] ret, monitor_ids = provider._params_for_A(record) self.assertEquals(10, len(ret['answers'])) self.assertEquals(ret['filters'], @@ -1048,7 +1048,7 @@ class TestNs1ProviderDynamic(TestCase): }, 'iad__georegion': { 'meta': { - 'georegion': ['US-CENTRAL', 'US-EAST', 'US-WEST'], + 'georegion': ['ASIAPAC'], 'note': 'rule-order:1' } }, @@ -1150,7 +1150,7 @@ class TestNs1ProviderDynamic(TestCase): rule0 = record.data['dynamic']['rules'][0] rule1 = record.data['dynamic']['rules'][1] rule0['geos'] = ['AF', 'EU', 'NA-US-CA'] - rule1['geos'] = ['NA', 'NA-US'] + rule1['geos'] = ['AS', 'AS-IN'] ret, _ = provider._params_for_A(record) self.assertEquals(17, len(ret['answers'])) @@ -1210,13 +1210,13 @@ class TestNs1ProviderDynamic(TestCase): }, 'iad__country': { 'meta': { - 'country': ['US'], + 'country': ['IN'], 'note': 'rule-order:1' } }, 'iad__georegion': { 'meta': { - 'georegion': ['US-CENTRAL', 'US-EAST', 'US-WEST'], + 'georegion': ['ASIAPAC'], 'note': 'rule-order:1' } }, @@ -1562,6 +1562,24 @@ class TestNs1ProviderDynamic(TestCase): self.assertTrue( 'OC-{}'.format(c) in data4['dynamic']['rules'][0]['geos']) + # NA test cases + # 1. Full list of countries should return 'NA' in geos + na_countries = Ns1Provider._CONTINENT_TO_LIST_OF_COUNTRIES['NA'] + del ns1_record['regions']['lhr__country']['meta']['us_state'] + ns1_record['regions']['lhr__country']['meta']['country'] = \ + list(na_countries) + data5 = provider._data_for_A('A', ns1_record) + self.assertTrue('NA' in data5['dynamic']['rules'][0]['geos']) + + # 2. Partial list of countries should return just those + partial_na_cntry_list = list(na_countries)[:5] + ns1_record['regions']['lhr__country']['meta']['country'] = \ + partial_na_cntry_list + data6 = provider._data_for_A('A', ns1_record) + for c in partial_na_cntry_list: + self.assertTrue( + 'NA-{}'.format(c) in data6['dynamic']['rules'][0]['geos']) + # Test out fallback only pools and new-style notes ns1_record = { 'answers': [{ From 2c72f840c16c650e7282cee371c8ee3090317454 Mon Sep 17 00:00:00 2001 From: Sham Date: Wed, 23 Jun 2021 21:46:39 -0700 Subject: [PATCH 02/13] CHANGELOG entry --- CHANGELOG.md | 3 +++ README.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70d67c..10e87b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ to data. See the [octodns/processor/](/octodns/processor) directory for examples. The change has been designed to have no impact on the process unless the `processors` key is present in zone configs. +* Fixes NS1 provider's geotarget limitation of using `NA` continent. Now, when + `NA` is used in geos it considers **all** the countries of `North America` + insted of just `us-east`, `us-west` and `us-central` regions ## v0.9.12 - 2021-04-30 - Enough time has passed diff --git a/README.md b/README.md index 3f36e73..8486799 100644 --- a/README.md +++ b/README.md @@ -207,7 +207,7 @@ The above command pulled the existing data out of Route53 and placed the results | [GoogleCloudProvider](/octodns/provider/googlecloud.py) | google-cloud-dns | A, AAAA, CAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, TXT | No | | | [HetznerProvider](/octodns/provider/hetzner.py) | | A, AAAA, CAA, CNAME, MX, NS, SRV, TXT | No | | | [MythicBeastsProvider](/octodns/provider/mythicbeasts.py) | Mythic Beasts | A, AAAA, ALIAS, CNAME, MX, NS, SRV, SSHFP, CAA, TXT | No | | -| [Ns1Provider](/octodns/provider/ns1.py) | ns1-python | All | Yes | Missing `NA` geo target | +| [Ns1Provider](/octodns/provider/ns1.py) | ns1-python | All | Yes | | | [OVH](/octodns/provider/ovh.py) | ovh | A, AAAA, CAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, SSHFP, TXT, DKIM | No | | | [PowerDnsProvider](/octodns/provider/powerdns.py) | | All | No | | | [Rackspace](/octodns/provider/rackspace.py) | | A, AAAA, ALIAS, CNAME, MX, NS, PTR, SPF, TXT | No | | From 3cc0fac817023e8d22f1d69146ccfe8bea00f5d4 Mon Sep 17 00:00:00 2001 From: blanariu Date: Thu, 24 Jun 2021 12:39:56 +0300 Subject: [PATCH 03/13] Fix bug in Manager when using Python 2.7 In Python 2.7 the if statement would catch both cases from the test test_populate_lenient_fallback, so the test was failing. These are the error strings differences between Python 2 and 3: Python 2: NoLenient: populate() got an unexpected keyword argument 'lenient' NoZone: populate() got multiple values for keyword argument 'lenient' Python 3: NoLenient: populate() got an unexpected keyword argument 'lenient' NoZone: populate() got multiple values for argument 'lenient' --- octodns/manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/octodns/manager.py b/octodns/manager.py index 9b10196..dcae0a7 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -243,7 +243,8 @@ class Manager(object): try: source.populate(zone, lenient=lenient) except TypeError as e: - if "keyword argument 'lenient'" not in text_type(e): + if ("unexpected keyword argument 'lenient'" + not in text_type(e)): raise self.log.warn(': provider %s does not accept lenient ' 'param', source.__class__.__name__) From 749f0bd90fae302f23c9d0951c5447b279782fd6 Mon Sep 17 00:00:00 2001 From: blanariu Date: Thu, 24 Jun 2021 12:45:22 +0300 Subject: [PATCH 04/13] Fix bug in envvar source tests when run in Python 2.7 Due to an import error the envvar source tests would not run in Python 2.7 --- tests/test_octodns_source_envvar.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_octodns_source_envvar.py b/tests/test_octodns_source_envvar.py index 0714883..38b63dd 100644 --- a/tests/test_octodns_source_envvar.py +++ b/tests/test_octodns_source_envvar.py @@ -1,6 +1,12 @@ from six import text_type from unittest import TestCase -from unittest.mock import patch + +try: + # Python 3 + from unittest.mock import patch +except ImportError: + # Python 2 + from mock import patch from octodns.source.envvar import EnvVarSource from octodns.source.envvar import EnvironmentVariableNotFoundException From e934ea0423b25c656420948a73f1922db2d61b41 Mon Sep 17 00:00:00 2001 From: blanariu Date: Thu, 24 Jun 2021 12:51:45 +0300 Subject: [PATCH 05/13] Fix bug in ultra provider tests when run in Python 2.7 The test_login test from TestUltraProvider would fail in Python 2.7 due to the dictionary insertion order not being preserved in 2.7 and early 3.x versions. Comparing the dictionaries containing the query parameters solves this. Snippet from test failure: - username=user&password=rightpass&grant_type=password + grant_type=password&username=user&password=rightpass --- tests/test_octodns_provider_ultra.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/test_octodns_provider_ultra.py b/tests/test_octodns_provider_ultra.py index 52e0307..0597d85 100644 --- a/tests/test_octodns_provider_ultra.py +++ b/tests/test_octodns_provider_ultra.py @@ -1,3 +1,12 @@ +from __future__ import unicode_literals + +try: + # Python 3 + from urllib.parse import parse_qs +except ImportError: + # Python 2 + from urlparse import parse_qs + from mock import Mock, call from os.path import dirname, join from requests import HTTPError @@ -55,7 +64,8 @@ class TestUltraProvider(TestCase): self.assertEquals(1, mock.call_count) expected_payload = "grant_type=password&username=user&"\ "password=rightpass" - self.assertEquals(mock.last_request.text, expected_payload) + self.assertEquals(parse_qs(mock.last_request.text), + parse_qs(expected_payload)) def test_get_zones(self): provider = _get_provider() From efc4d99d8dc5409ae870ecd41e20729498019ba3 Mon Sep 17 00:00:00 2001 From: blanariu Date: Thu, 24 Jun 2021 19:17:09 +0300 Subject: [PATCH 06/13] Replaced conditional imports with six --- tests/test_octodns_provider_ultra.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tests/test_octodns_provider_ultra.py b/tests/test_octodns_provider_ultra.py index 0597d85..a22a489 100644 --- a/tests/test_octodns_provider_ultra.py +++ b/tests/test_octodns_provider_ultra.py @@ -1,17 +1,11 @@ from __future__ import unicode_literals -try: - # Python 3 - from urllib.parse import parse_qs -except ImportError: - # Python 2 - from urlparse import parse_qs - from mock import Mock, call from os.path import dirname, join from requests import HTTPError from requests_mock import ANY, mock as requests_mock from six import text_type +from six.moves.urllib import parse from unittest import TestCase from json import load as json_load @@ -64,8 +58,8 @@ class TestUltraProvider(TestCase): self.assertEquals(1, mock.call_count) expected_payload = "grant_type=password&username=user&"\ "password=rightpass" - self.assertEquals(parse_qs(mock.last_request.text), - parse_qs(expected_payload)) + self.assertEquals(parse.parse_qs(mock.last_request.text), + parse.parse_qs(expected_payload)) def test_get_zones(self): provider = _get_provider() From 29532302e28fd16886d782b5eb9544f62b02ea46 Mon Sep 17 00:00:00 2001 From: blanariu Date: Thu, 24 Jun 2021 19:28:53 +0300 Subject: [PATCH 07/13] Leave just importing from mock --- tests/test_octodns_source_envvar.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/test_octodns_source_envvar.py b/tests/test_octodns_source_envvar.py index 38b63dd..ac66a22 100644 --- a/tests/test_octodns_source_envvar.py +++ b/tests/test_octodns_source_envvar.py @@ -1,13 +1,7 @@ +from mock import patch from six import text_type from unittest import TestCase -try: - # Python 3 - from unittest.mock import patch -except ImportError: - # Python 2 - from mock import patch - from octodns.source.envvar import EnvVarSource from octodns.source.envvar import EnvironmentVariableNotFoundException from octodns.zone import Zone From e55da245d9414f4250463b66c3421ad65df40025 Mon Sep 17 00:00:00 2001 From: Sham Date: Thu, 24 Jun 2021 11:29:34 -0700 Subject: [PATCH 08/13] comment for why US-* need to continue to exist under _REGION_TO_CONTINENT --- octodns/provider/ns1.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index cfa7be7..c296ab2 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -341,6 +341,9 @@ class Ns1Provider(BaseProvider): 'ASIAPAC': 'AS', 'EUROPE': 'EU', 'SOUTH-AMERICA': 'SA', + # continent NA has been handled as part of Geofence Country filter + # starting from v0.9.13. These below US-* just need to continue to + # exist here so it doesn't break the ugrade path 'US-CENTRAL': 'NA', 'US-EAST': 'NA', 'US-WEST': 'NA', From d6deabcc522f8a18cfdef39acf0c02abc377f818 Mon Sep 17 00:00:00 2001 From: Viranch Mehta Date: Fri, 25 Jun 2021 10:52:35 -0700 Subject: [PATCH 09/13] Fix duplicate endpoints in Azure DNS dynamic records --- octodns/provider/azuredns.py | 11 +++++- tests/test_octodns_provider_azuredns.py | 45 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/octodns/provider/azuredns.py b/octodns/provider/azuredns.py index 4551c6c..c69c723 100644 --- a/octodns/provider/azuredns.py +++ b/octodns/provider/azuredns.py @@ -922,6 +922,16 @@ class AzureProvider(BaseProvider): for profile in profiles: name = profile.name + + endpoints = set() + for ep in profile.endpoints: + if not ep.target: + continue + if ep.target in endpoints: + msg = '{} contains duplicate endpoint {}' + raise AzureException(msg.format(name, ep.target)) + endpoints.add(ep.target) + if name in seen_profiles: # exit if a possible collision is detected, even though # we've tried to ensure unique mapping @@ -1053,7 +1063,6 @@ class AzureProvider(BaseProvider): while pool_name: # iterate until we reach end of fallback chain - default_seen = False pool = pools[pool_name].data if len(pool['values']) > 1: # create Weighted profile for multi-value pool diff --git a/tests/test_octodns_provider_azuredns.py b/tests/test_octodns_provider_azuredns.py index eb74007..13c1bf4 100644 --- a/tests/test_octodns_provider_azuredns.py +++ b/tests/test_octodns_provider_azuredns.py @@ -999,6 +999,51 @@ class TestAzureDnsProvider(TestCase): 'Collision in Traffic Manager' )) + @patch( + 'octodns.provider.azuredns.AzureProvider._generate_traffic_managers') + def test_extra_changes_non_last_fallback_contains_default(self, mock_gtm): + provider = self._get_provider() + + desired = Zone(zone.name, sub_zones=[]) + record = Record.new(desired, 'foo', { + 'type': 'CNAME', + 'ttl': 60, + 'value': 'default.unit.tests.', + 'dynamic': { + 'pools': { + 'one': { + 'values': [{'value': 'one.unit.tests.'}], + 'fallback': 'def', + }, + 'def': { + 'values': [{'value': 'default.unit.tests.'}], + 'fallback': 'two', + }, + 'two': { + 'values': [{'value': 'two.unit.tests.'}], + }, + }, + 'rules': [ + {'pool': 'one'}, + ] + } + }) + desired.add_record(record) + changes = [Create(record)] + + # assert that no exception is raised + provider._extra_changes(zone, desired, changes) + + # simulate duplicate endpoint and assert exception + endpoint = Endpoint(target='dup.unit.tests.') + mock_gtm.return_value = [Profile( + name='test-profile', + endpoints=[endpoint, endpoint], + )] + with self.assertRaises(AzureException) as ctx: + provider._extra_changes(zone, desired, changes) + self.assertTrue('duplicate endpoint' in text_type(ctx)) + def test_extra_changes_invalid_dynamic_A(self): provider = self._get_provider() From 4848246712d56268b7f074e151466846533c5639 Mon Sep 17 00:00:00 2001 From: Viranch Mehta Date: Fri, 25 Jun 2021 13:58:00 -0700 Subject: [PATCH 10/13] Fix partially re-used fallback chain --- octodns/provider/azuredns.py | 4 ++-- tests/test_octodns_provider_azuredns.py | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/octodns/provider/azuredns.py b/octodns/provider/azuredns.py index c69c723..87bbef0 100644 --- a/octodns/provider/azuredns.py +++ b/octodns/provider/azuredns.py @@ -837,8 +837,8 @@ class AzureProvider(BaseProvider): pool['fallback'] = pool_name if pool_name in pools: - # we've already populated the pool - continue + # we've already populated this and subsequent pools + break # populate the pool from Weighted profile # these should be leaf node entries with no further nesting diff --git a/tests/test_octodns_provider_azuredns.py b/tests/test_octodns_provider_azuredns.py index 13c1bf4..e09de28 100644 --- a/tests/test_octodns_provider_azuredns.py +++ b/tests/test_octodns_provider_azuredns.py @@ -1687,6 +1687,12 @@ class TestAzureDnsProvider(TestCase): 'value': 'default.unit.tests.', 'dynamic': { 'pools': { + 'sto': { + 'values': [ + {'value': 'sto.unit.tests.'}, + ], + 'fallback': 'iad', + }, 'iad': { 'values': [ {'value': 'iad.unit.tests.'}, @@ -1702,13 +1708,14 @@ class TestAzureDnsProvider(TestCase): 'rules': [ {'geos': ['EU'], 'pool': 'iad'}, {'geos': ['EU-GB'], 'pool': 'lhr'}, + {'geos': ['EU-SE'], 'pool': 'sto'}, {'pool': 'lhr'}, ], } }) profiles = provider._generate_traffic_managers(record) - self.assertEqual(len(profiles), 3) + self.assertEqual(len(profiles), 4) self.assertTrue(_profile_is_match(profiles[-1], Profile( name='foo--unit--tests', traffic_routing_method='Geographic', @@ -1728,6 +1735,12 @@ class TestAzureDnsProvider(TestCase): target_resource_id=profiles[1].id, geo_mapping=['GB', 'WORLD'], ), + Endpoint( + name='rule-sto', + type=nested, + target_resource_id=profiles[2].id, + geo_mapping=['SE'], + ), ], ))) From 832c22a513df4d8bceefbbb1c57c18330cecff22 Mon Sep 17 00:00:00 2001 From: Sham Date: Sun, 27 Jun 2021 01:24:13 -0700 Subject: [PATCH 11/13] added SX and UM to partial list of countries test --- octodns/provider/ns1.py | 3 +-- tests/test_octodns_provider_ns1.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index c296ab2..bf08358 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -363,8 +363,7 @@ class Ns1Provider(BaseProvider): 'NA': {'DO', 'DM', 'BB', 'BL', 'BM', 'HT', 'KN', 'JM', 'VC', 'HN', 'BS', 'BZ', 'PR', 'NI', 'LC', 'TT', 'VG', 'PA', 'TC', 'PM', 'GT', 'AG', 'GP', 'AI', 'VI', 'CA', 'GD', 'AW', 'CR', 'GL', - 'CU', 'MF', 'SV', 'US', 'UM', 'MQ', 'MS', 'KY', 'MX', 'CW', - 'BQ', 'SX'} + 'CU', 'MF', 'SV', 'US', 'MQ', 'MS', 'KY', 'MX', 'CW', 'BQ'} } def __init__(self, id, api_key, retry_count=4, monitor_regions=None, diff --git a/tests/test_octodns_provider_ns1.py b/tests/test_octodns_provider_ns1.py index 8535999..df517a2 100644 --- a/tests/test_octodns_provider_ns1.py +++ b/tests/test_octodns_provider_ns1.py @@ -1572,7 +1572,7 @@ class TestNs1ProviderDynamic(TestCase): self.assertTrue('NA' in data5['dynamic']['rules'][0]['geos']) # 2. Partial list of countries should return just those - partial_na_cntry_list = list(na_countries)[:5] + partial_na_cntry_list = list(na_countries)[:5] + ['SX', 'UM'] ns1_record['regions']['lhr__country']['meta']['country'] = \ partial_na_cntry_list data6 = provider._data_for_A('A', ns1_record) From 5c4a46f63ff90bbfa5036593d6827776213d057b Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 27 Jun 2021 13:17:52 -0700 Subject: [PATCH 12/13] Add note about SX & UM country code support --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10e87b9..ce876a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ * Fixes NS1 provider's geotarget limitation of using `NA` continent. Now, when `NA` is used in geos it considers **all** the countries of `North America` insted of just `us-east`, `us-west` and `us-central` regions +* `SX' & 'UM` country support added, not yet in the North America list for + backwards compatibility reasons. They will be added in the next releaser. ## v0.9.12 - 2021-04-30 - Enough time has passed From 0dcbb11bcbe80317448d6d5437d46f950bb5be9c Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 27 Jun 2021 14:51:32 -0700 Subject: [PATCH 13/13] Clarify new NA countries are NS1Provider specific --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce876a6..e6dcb48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,9 @@ * Fixes NS1 provider's geotarget limitation of using `NA` continent. Now, when `NA` is used in geos it considers **all** the countries of `North America` insted of just `us-east`, `us-west` and `us-central` regions -* `SX' & 'UM` country support added, not yet in the North America list for - backwards compatibility reasons. They will be added in the next releaser. +* `SX' & 'UM` country support added to NS1Provider, not yet in the North + America list for backwards compatibility reasons. They will be added in the + next releaser. ## v0.9.12 - 2021-04-30 - Enough time has passed