From c56f8bd95f772646125bc91ddabb6f03cf0f6bb8 Mon Sep 17 00:00:00 2001 From: Joe Gallo Date: Fri, 18 Oct 2024 16:38:06 -0400 Subject: [PATCH] Switch sample files and update code and tests There are slightly different columns in this sample database than in the one we had been using. Most of the difference is immaterial, but the location columns themselves are named slightly differently, and we need to update our code and tests to match this new schema. --- .../ingest/geoip/IpinfoIpDataLookups.java | 17 ++++----- .../ingest/geoip/GeoIpProcessorTests.java | 6 ++-- .../geoip/IpinfoIpDataLookupsTests.java | 33 +++++++++--------- .../ipinfo/ip_geolocation_sample.mmdb | Bin 32881 -> 0 bytes .../ip_geolocation_standard_sample.mmdb | Bin 0 -> 30105 bytes 5 files changed, 29 insertions(+), 27 deletions(-) delete mode 100644 modules/ingest-geoip/src/test/resources/ipinfo/ip_geolocation_sample.mmdb create mode 100644 modules/ingest-geoip/src/test/resources/ipinfo/ip_geolocation_standard_sample.mmdb diff --git a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookups.java b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookups.java index 5a13ea93ff032..8ce2424844d9d 100644 --- a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookups.java +++ b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookups.java @@ -218,8 +218,8 @@ public record CountryResult( public record GeolocationResult( String city, String country, - Double latitude, - Double longitude, + Double lat, + Double lng, String postalCode, String region, String timezone @@ -229,14 +229,15 @@ public record GeolocationResult( public GeolocationResult( @MaxMindDbParameter(name = "city") String city, @MaxMindDbParameter(name = "country") String country, - @MaxMindDbParameter(name = "latitude") String latitude, - @MaxMindDbParameter(name = "longitude") String longitude, - // @MaxMindDbParameter(name = "network") String network, // for now we're not exposing this + // @MaxMindDbParameter(name = "geoname_id") String geonameId, // for now we're not exposing this + @MaxMindDbParameter(name = "lat") String lat, + @MaxMindDbParameter(name = "lng") String lng, @MaxMindDbParameter(name = "postal_code") String postalCode, @MaxMindDbParameter(name = "region") String region, + // @MaxMindDbParameter(name = "region_code") String regionCode, // for now we're not exposing this @MaxMindDbParameter(name = "timezone") String timezone ) { - this(city, country, parseLocationDouble(latitude), parseLocationDouble(longitude), postalCode, region, timezone); + this(city, country, parseLocationDouble(lat), parseLocationDouble(lng), postalCode, region, timezone); } } @@ -395,8 +396,8 @@ protected Map transform(final Result result) } } case LOCATION -> { - Double latitude = response.latitude; - Double longitude = response.longitude; + Double latitude = response.lat; + Double longitude = response.lng; if (latitude != null && longitude != null) { Map locationObject = new HashMap<>(); locationObject.put("lat", latitude); diff --git a/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/GeoIpProcessorTests.java b/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/GeoIpProcessorTests.java index 9ef12cef66742..4548e92239ce1 100644 --- a/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/GeoIpProcessorTests.java +++ b/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/GeoIpProcessorTests.java @@ -82,13 +82,13 @@ public void testMaxmindCity() throws Exception { } public void testIpinfoGeolocation() throws Exception { - String ip = "4.36.238.62"; + String ip = "72.20.12.220"; GeoIpProcessor processor = new GeoIpProcessor( IP_LOCATION_TYPE, // n.b. this is an "ip_location" processor randomAlphaOfLength(10), null, "source_field", - loader("ipinfo/ip_geolocation_sample.mmdb"), + loader("ipinfo/ip_geolocation_standard_sample.mmdb"), () -> true, "target_field", getIpinfoGeolocationLookup(), @@ -107,7 +107,7 @@ public void testIpinfoGeolocation() throws Exception { Map data = (Map) ingestDocument.getSourceAndMetadata().get("target_field"); assertThat(data, notNullValue()); assertThat(data.get("ip"), equalTo(ip)); - assertThat(data.get("city_name"), equalTo("Pensacola")); + assertThat(data.get("city_name"), equalTo("Chicago")); // see IpinfoIpDataLookupsTests for more tests of the data lookup behavior } diff --git a/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookupsTests.java b/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookupsTests.java index 36c26576cf9de..d0cdc5a3e1b5e 100644 --- a/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookupsTests.java +++ b/modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/IpinfoIpDataLookupsTests.java @@ -194,8 +194,8 @@ public void testCountryFree() { public void testGeolocationStandard() { assumeFalse("https://github.com/elastic/elasticsearch/issues/114266", Constants.WINDOWS); - String databaseName = "ip_geolocation_sample.mmdb"; - String ip = "90.203.36.70"; + String databaseName = "ip_geolocation_standard_sample.mmdb"; + String ip = "62.69.48.19"; assertExpectedLookupResults( databaseName, ip, @@ -204,10 +204,10 @@ public void testGeolocationStandard() { entry("ip", ip), entry("country_iso_code", "GB"), entry("region_name", "England"), - entry("city_name", "Birkenhead"), + entry("city_name", "London"), entry("timezone", "Europe/London"), - entry("postal_code", "CH41"), - entry("location", Map.of("lat", 53.39337, "lon", -3.01479)) + entry("postal_code", "E1W"), + entry("location", Map.of("lat", 51.50853, "lon", -0.12574)) ) ); } @@ -215,36 +215,37 @@ public void testGeolocationStandard() { public void testGeolocationInvariants() { assumeFalse("https://github.com/elastic/elasticsearch/issues/114266", Constants.WINDOWS); Path configDir = tmpDir; - copyDatabase("ipinfo/ip_geolocation_sample.mmdb", configDir.resolve("ip_geolocation_sample.mmdb")); + copyDatabase("ipinfo/ip_geolocation_standard_sample.mmdb", configDir.resolve("ip_geolocation_standard_sample.mmdb")); { final Set expectedColumns = Set.of( - "network", "city", + "geoname_id", "region", + "region_code", "country", "postal_code", "timezone", - "latitude", - "longitude" + "lat", + "lng" ); - Path databasePath = configDir.resolve("ip_geolocation_sample.mmdb"); + Path databasePath = configDir.resolve("ip_geolocation_standard_sample.mmdb"); assertDatabaseInvariants(databasePath, (ip, row) -> { assertThat(row.keySet(), equalTo(expectedColumns)); { - String latitude = (String) row.get("latitude"); + String latitude = (String) row.get("lat"); assertThat(latitude, equalTo(latitude.trim())); Double parsed = parseLocationDouble(latitude); assertThat(parsed, notNullValue()); - assertThat(latitude, equalTo(Double.toString(parsed))); // reverse it + assertThat(Double.parseDouble(latitude), equalTo(Double.parseDouble(Double.toString(parsed)))); // reverse it } { - String longitude = (String) row.get("longitude"); + String longitude = (String) row.get("lng"); assertThat(longitude, equalTo(longitude.trim())); Double parsed = parseLocationDouble(longitude); assertThat(parsed, notNullValue()); - assertThat(longitude, equalTo(Double.toString(parsed))); // reverse it + assertThat(Double.parseDouble(longitude), equalTo(Double.parseDouble(Double.toString(parsed)))); // reverse it } }); } @@ -391,13 +392,13 @@ public void testDatabaseTypeParsing() throws IOException { // pedantic about where precisely it should be. copyDatabase("ipinfo/ip_asn_sample.mmdb", tmpDir.resolve("ip_asn_sample.mmdb")); - copyDatabase("ipinfo/ip_geolocation_sample.mmdb", tmpDir.resolve("ip_geolocation_sample.mmdb")); + copyDatabase("ipinfo/ip_geolocation_standard_sample.mmdb", tmpDir.resolve("ip_geolocation_standard_sample.mmdb")); copyDatabase("ipinfo/asn_sample.mmdb", tmpDir.resolve("asn_sample.mmdb")); copyDatabase("ipinfo/ip_country_sample.mmdb", tmpDir.resolve("ip_country_sample.mmdb")); copyDatabase("ipinfo/privacy_detection_sample.mmdb", tmpDir.resolve("privacy_detection_sample.mmdb")); assertThat(parseDatabaseFromType("ip_asn_sample.mmdb"), is(Database.AsnV2)); - assertThat(parseDatabaseFromType("ip_geolocation_sample.mmdb"), is(Database.CityV2)); + assertThat(parseDatabaseFromType("ip_geolocation_standard_sample.mmdb"), is(Database.CityV2)); assertThat(parseDatabaseFromType("asn_sample.mmdb"), is(Database.AsnV2)); assertThat(parseDatabaseFromType("ip_country_sample.mmdb"), is(Database.CountryV2)); assertThat(parseDatabaseFromType("privacy_detection_sample.mmdb"), is(Database.PrivacyDetection)); diff --git a/modules/ingest-geoip/src/test/resources/ipinfo/ip_geolocation_sample.mmdb b/modules/ingest-geoip/src/test/resources/ipinfo/ip_geolocation_sample.mmdb deleted file mode 100644 index 7f558d440fb1404bcb05a67c9884d8241a7154ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32881 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 AN&o-= diff --git a/modules/ingest-geoip/src/test/resources/ipinfo/ip_geolocation_standard_sample.mmdb b/modules/ingest-geoip/src/test/resources/ipinfo/ip_geolocation_standard_sample.mmdb new file mode 100644 index 0000000000000000000000000000000000000000..205bd77fd53e24eece4bd04460465da2a5dc4b78 GIT binary patch literal 30105 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%0D9V9)+JAXOA=I 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