Repository: incubator-sdap-nexus Updated Branches: refs/heads/master 31f7ac2ee -> 2010cd289
http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/be88efc5/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkIntegrationTest.groovy ---------------------------------------------------------------------- diff --git a/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkIntegrationTest.groovy b/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkIntegrationTest.groovy index 96e788b..d806a3b 100644 --- a/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkIntegrationTest.groovy +++ b/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkIntegrationTest.groovy @@ -4,8 +4,10 @@ *****************************************************************************/ package org.nasa.jpl.nexus.ingest.nexussink +import com.amazonaws.regions.Region +import com.amazonaws.regions.Regions +import com.amazonaws.services.s3.AmazonS3Client import com.datastax.driver.core.Cluster -import io.findify.s3mock.S3Mock import org.apache.solr.client.solrj.SolrClient import org.apache.solr.common.params.ModifiableSolrParams import org.cassandraunit.utils.EmbeddedCassandraServerHelper @@ -41,7 +43,6 @@ public class NexusSinkIntegrationTest { private static SingleNodeApplication application - private static final String CASSANDRA_CONFIG = "spring-cassandra.yaml" private static final String CASSANDRA_KEYSPACE = "testNexusSink" @@ -50,9 +51,14 @@ public class NexusSinkIntegrationTest { private static final String CONTACT = "127.0.0.1" + private static final String S3_BUCKET_NAME = "nexus-jpl" + private static final String AWS_REGION = "us-west-2" + private static final String DYNAMO_TABLE_NAME = "nexus-jpl-table" + private static Cluster cluster private static CassandraOperations cassandraTemplate + private static AmazonS3Client s3Client private static String SOLR_URL = "http://embedded" private static String SOLR_CORE = "nexustiles" @@ -62,19 +68,14 @@ public class NexusSinkIntegrationTest { @BeforeClass public static void setUpXd() { - S3Mock api = new S3Mock.Builder().withPort(8001).withInMemoryBackend().build(); - initCassandra() + initS3() - new RandomConfigurationSupport() - - RandomConfigurationSupport randomConfigSupport = new RandomConfigurationSupport(); + RandomConfigurationSupport randomConfigSupport = new RandomConfigurationSupport() application = new SingleNodeApplication().run() - singleNodeIntegrationTestSupport = new SingleNodeIntegrationTestSupport - (application); - singleNodeIntegrationTestSupport.addModuleRegistry(new SingletonModuleRegistry(ModuleType.sink, - MODULE_NAME)); + singleNodeIntegrationTestSupport = new SingleNodeIntegrationTestSupport(application) + singleNodeIntegrationTestSupport.addModuleRegistry(new SingletonModuleRegistry(ModuleType.sink, MODULE_NAME)) } @@ -99,6 +100,11 @@ public class NexusSinkIntegrationTest { } } + private static void initS3() { + s3Client = new AmazonS3Client() + s3Client.setRegion(Region.getRegion(Regions.fromName(AWS_REGION))) + } + @AfterClass public static void cleanup() { @@ -122,6 +128,80 @@ public class NexusSinkIntegrationTest { } } + @Test + public void testS3() { + + def streamName = "testNexusSink" + + NexusContent.NexusTile tile = NexusContent.NexusTile.newBuilder() + .setTile(NexusContent.TileData.newBuilder() + .setTileId(UUID.randomUUID().toString()) + .setGridTile( + NexusContent.GridTile.newBuilder() + .build()) + .build()) + .setSummary(NexusContent.TileSummary.newBuilder() + .setTileId("1") + .setBbox(NexusContent.TileSummary.BBox.newBuilder() + .setLatMin(51) + .setLatMax(55) + .setLonMin(22) + .setLonMax(30) + .build()) + .setDatasetName("test") + .setDatasetUuid("4") + .setDataVarName("sst") + .setGranule("test.nc") + .setSectionSpec("0:1,0:1") + .setStats(NexusContent.TileSummary.DataStats.newBuilder() + .setCount(10) + .setMax(50) + .setMin(50) + .setMean(50) + .setMaxTime(500000) + .setMinTime(500000) + .build()) + .addGlobalAttributes(NexusContent.Attribute.newBuilder() + .setName("day_of_year_i") + .addValues("006") + .build()) + .addGlobalAttributes(NexusContent.Attribute.newBuilder() + .setName("attr_multi_value_test") + .addValues("006") + .addValues("multi") + .build()) + .build()) + .build() + + def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE --$PROPERTY_NAME_S3_BUCKET=$S3_BUCKET_NAME --$PROPERTY_NAME_AWS_REGION=$AWS_REGION" + + SingleNodeProcessingChainProducer chain = chainProducer(application, streamName, processingChainUnderTest) + SolrClient solrClient = singleNodeIntegrationTestSupport.getModule(streamName, MODULE_NAME, 0).applicationContext.getBean("solrClient", SolrClient) + + chain.sendPayload(tile) + + assertEqualsEventually 1, new Supplier<Integer>() { + @Override + Integer get() { + solrClient.commit() + def q = solrClient.query(new ModifiableSolrParams().add("q", "*:*")) + println "query: $q" + return q.results.numFound + } + } + + /* + assertEqualsEventually 1, new Supplier<Integer>() { + @Override + Integer get() { + ObjectListing objectListing = s3Client.listObjects(new ListObjectsRequest().withBucketName(S3_BUCKET_NAME)) + return objectListing.getObjectSummaries().size() + } + }*/ + + chain.destroy() + } + /** * Test a Nexus sink module */ @@ -651,12 +731,42 @@ public class NexusSinkIntegrationTest { } @Test(expected = ModuleConfigurationException.class) - public void testSolrZkAndSolrURLMutalExclusive() throws Exception { + public void testCassandraAndS3MutualExclusive() throws Exception { - def streamName = "testSolrZkAndSolrURLMutalExclusive" + def streamName = "testCassandraAndS3MutualExclusive" + def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_CASSANDRA_CONTACT_POINTS=$CONTACT --$PROPERTY_NAME_CASSANDRA_KEYSPACE=$CASSANDRA_KEYSPACE --$PROPERTY_NAME_CASSANDRA_PORT=$PORT --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE --$PROPERTY_NAME_S3_BUCKET=$S3_BUCKET_NAME" + assertNull(chainProducer(application, streamName, processingChainUnderTest)) + } - def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_CLOUD_ZK_URL=zk1 --$PROPERTY_NAME_CASSANDRA_CONTACT_POINTS=$CONTACT --$PROPERTY_NAME_CASSANDRA_KEYSPACE=$CASSANDRA_KEYSPACE --$PROPERTY_NAME_CASSANDRA_PORT=$PORT --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE" + @Test(expected = ModuleConfigurationException.class) + public void testCassandraConfigured() throws Exception { + + def streamName = "testCassandraConfigured" + def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_CASSANDRA_KEYSPACE=$CASSANDRA_KEYSPACE --$PROPERTY_NAME_CASSANDRA_PORT=$PORT --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE" + assertNull(chainProducer(application, streamName, processingChainUnderTest)) + } + + @Test(expected = ModuleConfigurationException.class) + public void testS3Configured() throws Exception { + def streamName = "testS3Configured" + def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE --$PROPERTY_NAME_S3_BUCKET=$S3_BUCKET_NAME" + assertNull(chainProducer(application, streamName, processingChainUnderTest)) + } + + @Test(expected = ModuleConfigurationException.class) + public void testDynamoConfigured() throws Exception { + + def streamName = "testDynamoConfigured" + def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE --$PROPERTY_NAME_DYNAMO_TABLE_NAME=$DYNAMO_TABLE_NAME" + assertNull(chainProducer(application, streamName, processingChainUnderTest)) + } + + @Test(expected = ModuleConfigurationException.class) + public void testSolrZkAndSolrURLMutualExclusive() throws Exception { + + def streamName = "testSolrZkAndSolrURLMutualExclusive" + def processingChainUnderTest = "$MODULE_NAME --$PROPERTY_NAME_SOLR_SERVER_URL=$SOLR_URL --$PROPERTY_NAME_SOLR_CLOUD_ZK_URL=zk1 --$PROPERTY_NAME_CASSANDRA_CONTACT_POINTS=$CONTACT --$PROPERTY_NAME_CASSANDRA_KEYSPACE=$CASSANDRA_KEYSPACE --$PROPERTY_NAME_CASSANDRA_PORT=$PORT --$PROPERTY_NAME_SOLR_COLLECTION=$SOLR_CORE" assertNull(chainProducer(application, streamName, processingChainUnderTest)) } http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/be88efc5/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/SolrStoreUnitTest.groovy ---------------------------------------------------------------------- diff --git a/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/SolrStoreUnitTest.groovy b/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/SolrStoreUnitTest.groovy new file mode 100644 index 0000000..5b69b26 --- /dev/null +++ b/nexus-ingest/nexus-sink/src/test/groovy/org/nasa/jpl/nexus/ingest/nexussink/SolrStoreUnitTest.groovy @@ -0,0 +1,68 @@ +/***************************************************************************** + * Copyright (c) 2017 Jet Propulsion Laboratory, + * California Institute of Technology. All rights reserved + *****************************************************************************/ +package org.nasa.jpl.nexus.ingest.nexussink + +import org.junit.Test +import org.nasa.jpl.nexus.ingest.wiretypes.NexusContent +import org.springframework.mock.env.MockEnvironment + +import static org.junit.Assert.assertEquals + +/** + * Created by greguska on 5/2/17. + */ +class SolrStoreUnitTest { + + @Test + public void testGetSolrDocFromTileSummary() { + def solrStore = new SolrStore(null); + solrStore.setEnvironment(new MockEnvironment()) + + def tileSummary = NexusContent.TileSummary.newBuilder() + .setTileId("1") + .setBbox(NexusContent.TileSummary.BBox.newBuilder() + .setLatMin(51) + .setLatMax(55) + .setLonMin(22) + .setLonMax(30) + .build()) + .setDatasetName("test") + .setDatasetUuid("4") + .setDataVarName("sst") + .setGranule("test.nc") + .setSectionSpec("0:1,0:1") + .setStats(NexusContent.TileSummary.DataStats.newBuilder() + .setCount(10) + .setMax(50) + .setMin(50) + .setMean(50) + .setMaxTime(1429142399) + .setMinTime(1429142399) + .build()) + .build() + + def doc = solrStore.getSolrDocFromTileSummary(tileSummary) + + assertEquals("2015-04-15T23:59:59Z", doc.get("tile_min_time_dt").value) + assertEquals("2015-04-15T23:59:59Z", doc.get("tile_max_time_dt").value) + assertEquals("sea_surface_temp", doc.get('table_s').value) + assertEquals("POLYGON((22.0 51.0, 30.0 51.0, 30.0 55.0, 22.0 55.0, 22.0 51.0))", doc.get('geo').value) + assertEquals("1", doc.get('id').value) + assertEquals("4", doc.get('dataset_id_s').value) + assertEquals("0:1,0:1", doc.get('sectionSpec_s').value) + assertEquals("test", doc.get('dataset_s').value) + assertEquals("test.nc", doc.get('granule_s').value) + assertEquals("sst", doc.get('tile_var_name_s').value) + assertEquals(22.0f, (Float) doc.get('tile_min_lon').value, 0.01f) + assertEquals(30.0f, (Float) doc.get('tile_max_lon').value, 0.01f) + assertEquals(51.0f, (Float) doc.get('tile_min_lat').value, 0.01f) + assertEquals(55.0f, (Float) doc.get('tile_max_lat').value, 0.01f) + assertEquals(50.0f, (Float) doc.get('tile_min_val_d').value, 0.01f) + assertEquals(50.0f, (Float) doc.get('tile_max_val_d').value, 0.01f) + assertEquals(50.0f, (Float) doc.get('tile_avg_val_d').value, 0.01f) + assertEquals(10, doc.get('tile_count_i').value) + assertEquals("test!1", doc.get('solr_id_s').value) + } +} http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/be88efc5/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkOptionsIntegrationTest.java ---------------------------------------------------------------------- diff --git a/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkOptionsIntegrationTest.java b/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkOptionsIntegrationTest.java index 374483d..7fa1824 100644 --- a/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkOptionsIntegrationTest.java +++ b/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/NexusSinkOptionsIntegrationTest.java @@ -13,9 +13,7 @@ import org.springframework.xd.module.options.ModuleOption; import org.springframework.xd.module.options.ModuleOptionsMetadata; import org.springframework.xd.module.options.ModuleOptionsMetadataResolver; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasProperty; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.nasa.jpl.nexus.ingest.nexussink.NexusSinkOptionsMetadata.*; import static org.springframework.xd.module.ModuleType.processor; @@ -41,7 +39,10 @@ public class NexusSinkOptionsIntegrationTest { moduleOptionNamed(PROPERTY_NAME_CASSANDRA_CONTACT_POINTS), moduleOptionNamed(PROPERTY_NAME_CASSANDRA_KEYSPACE), moduleOptionNamed(PROPERTY_NAME_CASSANDRA_PORT), - moduleOptionNamed(PROPERTY_NAME_INSERT_BUFFER))); + moduleOptionNamed(PROPERTY_NAME_INSERT_BUFFER), + moduleOptionNamed(PROPERTY_NAME_S3_BUCKET), + moduleOptionNamed(PROPERTY_NAME_AWS_REGION), + moduleOptionNamed(PROPERTY_NAME_DYNAMO_TABLE_NAME))); } public static Matcher<ModuleOption> moduleOptionNamed(String name) { http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/be88efc5/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/TestInfrastructureConfiguration.java ---------------------------------------------------------------------- diff --git a/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/TestInfrastructureConfiguration.java b/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/TestInfrastructureConfiguration.java index 84f85ec..17c607a 100644 --- a/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/TestInfrastructureConfiguration.java +++ b/nexus-ingest/nexus-sink/src/test/java/org/nasa/jpl/nexus/ingest/nexussink/TestInfrastructureConfiguration.java @@ -4,6 +4,8 @@ *****************************************************************************/ package org.nasa.jpl.nexus.ingest.nexussink; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.S3ClientOptions; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; import org.springframework.beans.factory.annotation.Value; @@ -47,6 +49,35 @@ public class TestInfrastructureConfiguration { public SolrOperations solrTemplate(SolrClient solrClient) { return new SolrTemplate(solrClient); } + + @Bean + public MetadataStore metadataStore(SolrOperations solrTemplate) { + MetadataStore metadataStore = new SolrStore(solrTemplate); + return metadataStore; + } + + } + + @Configuration + @Profile("s3local") + static class S3LocalConfiguration { + @Value("#{environment[T(org.nasa.jpl.nexus.ingest.nexussink.NexusSinkOptionsMetadata).PROPERTY_NAME_S3_BUCKET]}") + private String s3BucketName; + + @Bean + public AmazonS3Client s3client() { + AmazonS3Client s3Client = new AmazonS3Client(); + S3ClientOptions s3ClientOptions = S3ClientOptions.builder().setPathStyleAccess(true).build(); + s3Client.setS3ClientOptions(s3ClientOptions); + s3Client.setEndpoint("http://localhost:8080"); + return s3Client; + } + + @Bean + public DataStore dataStore(AmazonS3Client s3Client) { + S3Store s3Store = new S3Store(s3Client, s3BucketName); + return s3Store; + } } }
