From 0d7f1e81b010076ac4c7b3776327dabe98a7067e Mon Sep 17 00:00:00 2001 From: justinjleet Date: Tue, 21 Feb 2017 19:04:21 -0500 Subject: [PATCH 1/4] removing direct usage of Geo from the Parsers. Parsers can still use Stellar to get functionality --- .../main/java/org/apache/metron/parsers/bolt/ParserBolt.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java index 416d3ed829..c1a62fb8fa 100644 --- a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java +++ b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java @@ -73,8 +73,6 @@ public ParserBolt withMessageFilter(MessageFilter filter) { @Override public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { super.prepare(stormConf, context, collector); - String hdfsFile = (String) getConfigurations().getGlobalConfig().get(GeoLiteDatabase.GEO_HDFS_FILE); - GeoLiteDatabase.INSTANCE.update(hdfsFile); this.collector = collector; initializeStellar(); if(getSensorParserConfig() != null && filter == null) { From 50c74c8f8948865c508d0d4848f0b387a6b0f1ce Mon Sep 17 00:00:00 2001 From: justinjleet Date: Tue, 21 Feb 2017 19:37:45 -0500 Subject: [PATCH 2/4] removing setup from parserbolt test --- .../metron/parsers/bolt/ParserBoltTest.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java index de98a64537..05b667a29f 100644 --- a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java +++ b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java @@ -139,8 +139,6 @@ public Map getParserConfig() { }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -179,8 +177,6 @@ public Map getParserConfig() { }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -238,8 +234,6 @@ public Map getParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -286,8 +280,6 @@ protected SensorParserConfig getSensorParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -325,8 +317,6 @@ protected SensorParserConfig getSensorParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -396,8 +386,6 @@ protected SensorParserConfig getSensorParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -432,8 +420,6 @@ public Map getParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -473,8 +459,6 @@ public Map getParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -524,8 +508,6 @@ public Map getParserConfig() { } }; - buildGlobalConfig(parserBolt); - parserBolt.setCuratorFramework(client); parserBolt.setTreeCache(cache); parserBolt.prepare(new HashMap(), topologyContext, outputCollector); @@ -550,14 +532,6 @@ public Map getParserConfig() { } - protected void buildGlobalConfig(ParserBolt parserBolt) { - HashMap globalConfig = new HashMap<>(); - String baseDir = UnitTestHelper.findDir("GeoLite"); - File geoHdfsFile = new File(new File(baseDir), "GeoIP2-City-Test.mmdb.gz"); - globalConfig.put(GeoLiteDatabase.GEO_HDFS_FILE, geoHdfsFile.getAbsolutePath()); - parserBolt.getConfigurations().updateGlobalConfig(globalConfig); - } - private static void writeNonBatch(OutputCollector collector, ParserBolt bolt, Tuple t) { bolt.execute(t); } From 15d83d628306693aa6558fbba780ba86137bc6f8 Mon Sep 17 00:00:00 2001 From: justinjleet Date: Tue, 21 Feb 2017 20:07:20 -0500 Subject: [PATCH 3/4] removing imports and some more geo from an integration test --- .../src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java | 1 - .../test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java | 1 - .../metron/writers/integration/WriterBoltIntegrationTest.java | 1 - 3 files changed, 3 deletions(-) diff --git a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java index c1a62fb8fa..abbd9d8bf3 100644 --- a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java +++ b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java @@ -17,7 +17,6 @@ */ package org.apache.metron.parsers.bolt; -import org.apache.metron.enrichment.adapters.geo.GeoLiteDatabase; import org.apache.commons.lang3.StringUtils; import org.apache.storm.task.OutputCollector; import org.apache.storm.task.TopologyContext; diff --git a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java index 05b667a29f..6b00998e6a 100644 --- a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java +++ b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/bolt/ParserBoltTest.java @@ -19,7 +19,6 @@ import org.apache.metron.common.configuration.*; -import org.apache.metron.enrichment.adapters.geo.GeoLiteDatabase; import org.apache.metron.test.utils.UnitTestHelper; import org.apache.storm.task.OutputCollector; import org.apache.storm.tuple.Tuple; diff --git a/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java b/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java index eaeaeb5f96..f37b1fc642 100644 --- a/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java +++ b/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java @@ -61,7 +61,6 @@ public void initialize(Map validationConfig, Map } /** { - "geo.hdfs.file": "src/test/resources/GeoLite/GeoIP2-City-Test.mmdb.gz", "fieldValidations" : [ { "validation" : "org.apache.metron.writers.integration.WriterBoltIntegrationTest$MockValidator" From 519c66198871906c5cb9fc930271f73f0d677423 Mon Sep 17 00:00:00 2001 From: justinjleet Date: Tue, 21 Feb 2017 22:24:56 -0500 Subject: [PATCH 4/4] Removing Test DB --- .../resources/GeoLite/GeoIP2-City-Test.mmdb.gz | Bin 10011 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 metron-platform/metron-parsers/src/test/resources/GeoLite/GeoIP2-City-Test.mmdb.gz diff --git a/metron-platform/metron-parsers/src/test/resources/GeoLite/GeoIP2-City-Test.mmdb.gz b/metron-platform/metron-parsers/src/test/resources/GeoLite/GeoIP2-City-Test.mmdb.gz deleted file mode 100644 index 406c656306bb1e617a47b5727c97e621969f7975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10011 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