You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/07/21 21:00:10 UTC
[5/5] incubator-usergrid git commit: Added data creator to generate
data for ExportApp testing.
Added data creator to generate data for ExportApp testing.
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/a6e68a0a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/a6e68a0a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/a6e68a0a
Branch: refs/heads/rxportapp
Commit: a6e68a0adc571b0a30138d4cb71b5e0e49a42c0a
Parents: 2748347
Author: Dave Johnson <sn...@apache.org>
Authored: Tue Jul 21 14:59:59 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Tue Jul 21 14:59:59 2015 -0400
----------------------------------------------------------------------
stack/pom.xml | 2 +-
stack/tools/pom.xml | 6 +
.../org/apache/usergrid/tools/ExportApp.java | 17 +-
.../usergrid/tools/ExportDataCreator.java | 244 +++++++++++++++----
.../org/apache/usergrid/tools/ToolBase.java | 2 +-
.../apache/usergrid/tools/ExportAppTest.java | 65 +----
6 files changed, 223 insertions(+), 113 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/a6e68a0a/stack/pom.xml
----------------------------------------------------------------------
diff --git a/stack/pom.xml b/stack/pom.xml
index da1b62c..0e1b32d 100644
--- a/stack/pom.xml
+++ b/stack/pom.xml
@@ -103,7 +103,7 @@
<org.springframework.version>3.1.2.RELEASE</org.springframework.version>
<shiro-version>1.2.0</shiro-version>
<slf4j-version>1.6.1</slf4j-version>
- <snakeyaml-version>1.8</snakeyaml-version>
+ <snakeyaml-version>1.9</snakeyaml-version>
<tomcat-version>7.0.42</tomcat-version>
<antlr.version>3.4</antlr.version>
<tika.version>1.4</tika.version>
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/a6e68a0a/stack/tools/pom.xml
----------------------------------------------------------------------
diff --git a/stack/tools/pom.xml b/stack/tools/pom.xml
index 4be3232..3402612 100644
--- a/stack/tools/pom.xml
+++ b/stack/tools/pom.xml
@@ -249,5 +249,11 @@
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>io.codearte.jfairy</groupId>
+ <artifactId>jfairy</artifactId>
+ <version>0.4.3</version>
+ </dependency>
+
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/a6e68a0a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportApp.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportApp.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportApp.java
index b2da0ea..db975e6 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportApp.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportApp.java
@@ -102,7 +102,7 @@ public class ExportApp extends ExportingToolBase {
*/
@Override
public void runTool(CommandLine line) throws Exception {
-
+
applicationName = line.getOptionValue( APPLICATION_NAME );
if (StringUtils.isNotEmpty( line.getOptionValue( WRITE_THREAD_COUNT ) )) {
@@ -122,8 +122,11 @@ public class ExportApp extends ExportingToolBase {
logger.info( "Export directory: " + outputDir.getAbsolutePath() );
startSpring();
-
+
UUID applicationId = emf.lookupApplication( applicationName );
+ if (applicationId == null) {
+ throw new RuntimeException( "Cannot find application " + applicationName );
+ }
final EntityManager em = emf.getEntityManager( applicationId );
organizationName = em.getApplication().getOrganizationName();
@@ -133,8 +136,9 @@ public class ExportApp extends ExportingToolBase {
Observable<String> collectionsObservable = Observable.create( new CollectionsObservable( em ) );
collectionsObservable.flatMap( new Func1<String, Observable<ExportEntity>>() {
-
+
public Observable<ExportEntity> call(String collection) {
+
return Observable.create( new EntityObservable( em, collection ) )
.doOnNext( new EntityWriteAction() ).subscribeOn( writeScheduler );
}
@@ -142,16 +146,17 @@ public class ExportApp extends ExportingToolBase {
}, writeThreadCount ).flatMap( new Func1<ExportEntity, Observable<ExportConnection>>() {
public Observable<ExportConnection> call(ExportEntity exportEntity) {
+
return Observable.create( new ConnectionsObservable( em, exportEntity ) )
.doOnNext( new ConnectionWriteAction() ).subscribeOn( writeScheduler );
}
- }, writeThreadCount)
+ }, writeThreadCount )
.doOnCompleted( new FileWrapUpAction() )
.toBlocking().last();
}
-
-
+
+
// ----------------------------------------------------------------------------------------
// reading data
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/a6e68a0a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportDataCreator.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportDataCreator.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportDataCreator.java
index a3d6517..6fa4896 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportDataCreator.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportDataCreator.java
@@ -17,90 +17,232 @@
package org.apache.usergrid.tools;
-import java.util.UUID;
-
-import org.apache.usergrid.management.ManagementService;
+import io.codearte.jfairy.Fairy;
+import io.codearte.jfairy.producer.company.Company;
+import io.codearte.jfairy.producer.person.Person;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.OptionBuilder;
+import org.apache.commons.cli.Options;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.usergrid.management.ApplicationInfo;
+import org.apache.usergrid.management.OrganizationInfo;
import org.apache.usergrid.management.OrganizationOwnerInfo;
import org.apache.usergrid.persistence.Entity;
import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.EntityManagerFactory;
+import org.apache.usergrid.persistence.EntityRef;
import org.apache.usergrid.persistence.entities.Activity;
-import org.apache.usergrid.persistence.entities.User;
+import org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException;
-import static org.junit.Assert.assertNotNull;
+import java.util.*;
/**
- * Simple class to create test for for exporting
- *
- * @author tnine
+ * Create an app full of users and data.
*/
-public class ExportDataCreator {
+public class ExportDataCreator extends ToolBase {
+
+ public static final String APP_NAME = "application";
+ public static final String ORG_NAME = "organization";
+ public static final String NUM_USERS = "users";
+ public static final String NUM_COLLECTIONS = "collections";
+ public static final String NUM_ENTITIES = "entities";
+ public static final String ADMIN_USERNAME = "username";
+ public static final String ADMIN_PASSWORD = "password";
- private EntityManagerFactory emf;
+ public String appName = "test-app";
+ public String orgName = "test-organization";
+ public int numUsers = 100;
+ public int numCollections = 20;
+ public int numEntities = 100;
+ public String adminUsername = "adminuser";
+ public String adminPassword = "test";
- private ManagementService managementService;
+ @Override
+ public void runTool(CommandLine line) throws Exception {
- /**
- * @param emf
- * @param managementService
- */
- public ExportDataCreator( EntityManagerFactory emf, ManagementService managementService ) {
- super();
- this.emf = emf;
- this.managementService = managementService;
+ startSpring();
+
+ setVerbose( line );
+
+ if (line.hasOption( APP_NAME )) {
+ appName = line.getOptionValue( APP_NAME );
+ }
+ if (line.hasOption( ORG_NAME )) {
+ orgName = line.getOptionValue( ORG_NAME );
+ }
+ if (line.hasOption( NUM_USERS )) {
+ numUsers = Integer.parseInt( line.getOptionValue( NUM_USERS ) );
+ }
+ if (line.hasOption( NUM_COLLECTIONS )) {
+ numCollections = Integer.parseInt( line.getOptionValue( NUM_COLLECTIONS ) );
+ }
+ if (line.hasOption( NUM_ENTITIES )) {
+ numEntities = Integer.parseInt( line.getOptionValue( NUM_ENTITIES ) );
+ }
+ if (line.hasOption( ADMIN_USERNAME )) {
+ adminUsername = line.getOptionValue( ADMIN_USERNAME );
+ }
+ if (line.hasOption( ADMIN_PASSWORD )) {
+ adminPassword = line.getOptionValue( ADMIN_PASSWORD );
+ }
+
+ createTestData();
}
- public void createTestData() throws Exception {
+ @Override
+ @SuppressWarnings("static-access")
+ public Options createOptions() {
- String orgName = "testexportorg";
+ Options options = super.createOptions();
- //nothing to do
- if ( managementService.getOrganizationByName( orgName ) != null ) {
- return;
- }
+ Option appName = OptionBuilder.hasArg()
+ .withDescription( "Application name to use" ).create( APP_NAME );
- OrganizationOwnerInfo orgInfo = managementService
- .createOwnerAndOrganization( orgName, "textExportUser@apigee.com", "Test User",
- "textExportUser@apigee.com", "password", true, false );
+ Option orgName = OptionBuilder.hasArg()
+ .withDescription( "Organization to use (will create if not present)" ).create( ORG_NAME );
- UUID appId = managementService.createApplication( orgInfo.getOrganization().getUuid(), "application" ).getId();
+ Option numUsers = OptionBuilder.hasArg()
+ .withDescription( "Number of users create (in addition to users)" ).create( NUM_USERS );
- EntityManager em = emf.getEntityManager( appId );
+ Option numCollection = OptionBuilder.hasArg()
+ .withDescription( "Number of collections to create (in addition to users)" ).create( NUM_COLLECTIONS );
- User first = new User();
- first.setUsername( "first" );
- first.setEmail( "first@usergrid.com" );
+ Option numEntities = OptionBuilder.hasArg()
+ .withDescription( "Number of entities to create per collection" ).create( NUM_ENTITIES );
- Entity firstUserEntity = em.create( first );
+ Option adminUsername = OptionBuilder.hasArg()
+ .withDescription( "Admin Username" ).create( ADMIN_USERNAME );
- assertNotNull( firstUserEntity );
+ Option adminPassword = OptionBuilder.hasArg()
+ .withDescription( "Admin Password" ).create( ADMIN_PASSWORD );
- User second = new User();
- second.setUsername( "second" );
- second.setEmail( "second@usergrid.com" );
+ options.addOption( appName );
+ options.addOption( orgName );
+ options.addOption( numUsers );
+ options.addOption( numCollection );
+ options.addOption( numEntities );
+ options.addOption( adminUsername );
+ options.addOption( adminPassword );
- Entity secondUserEntity = em.create( second );
+ return options;
+ }
- assertNotNull( secondUserEntity );
- em.createConnection( firstUserEntity, "likes", secondUserEntity );
+ public void createTestData() throws Exception {
- em.createConnection( secondUserEntity, "dislikes", firstUserEntity );
+ OrganizationInfo orgInfo = managementService.getOrganizationByName( orgName );
- // now create some activities and put them into the user stream
+ if (orgInfo == null) {
+ OrganizationOwnerInfo ownerInfo = managementService.createOwnerAndOrganization(
+ orgName, adminUsername + "@example.com", adminUsername,
+ adminUsername + "@example.com", adminPassword, true, false );
+ orgInfo = ownerInfo.getOrganization();
+ }
- Activity activity = new Activity();
+ ApplicationInfo appInfo = managementService.getApplicationInfo( orgName + "/" + appName );
- Activity.ActivityObject actor = new Activity.ActivityObject();
- actor.setEntityType( "user" );
- actor.setId( firstUserEntity.getUuid().toString() );
+ if (appInfo == null) {
+ UUID appId = managementService.createApplication( orgInfo.getUuid(), appName ).getId();
+ appInfo = managementService.getApplicationInfo( appId );
+ }
- activity.setActor( actor );
- activity.setVerb( "POST" );
+ EntityManager em = emf.getEntityManager( appInfo.getId() );
+
+ Fairy fairy = Fairy.create();
+
+ List<Entity> users = new ArrayList<Entity>( numUsers );
+
+ for (int i = 0; i < numUsers; i++) {
+
+ final Person person = fairy.person();
+ Entity userEntity = null;
+ try {
+ final Map<String, Object> userMap = new HashMap<String, Object>() {{
+ put( "username", person.username() );
+ put( "password", person.password() );
+ put( "email", person.email() );
+ put( "companyEmail", person.companyEmail() );
+ put( "dateOfBirth", person.dateOfBirth() );
+ put( "firstName", person.firstName() );
+ put( "lastName", person.lastName() );
+ put( "nationalIdentificationNumber", person.nationalIdentificationNumber() );
+ put( "telephoneNumber", person.telephoneNumber() );
+ put( "passportNumber", person.passportNumber() );
+ put( "address", person.getAddress() );
+ }};
+
+ userEntity = em.create( "user", userMap );
+ users.add( userEntity );
+
+ } catch (DuplicateUniquePropertyExistsException e) {
+ logger.error( "Dup user generated: " + person.username() );
+ continue;
+ } catch (Exception e) {
+ logger.error("Error creating user", e);
+ continue;
+ }
+
+ final Company company = person.getCompany();
+ try {
+ EntityRef ref = em.getAlias( "company", company.name() );
+ Entity companyEntity = (ref == null) ? null : em.get( ref );
+
+ // create company if it does not exist yet
+ if ( companyEntity == null ) {
+ final Map<String, Object> companyMap = new HashMap<String, Object>() {{
+ put( "name", company.name() );
+ put( "domain", company.domain() );
+ put( "email", company.email() );
+ put( "url", company.url() );
+ put( "vatIdentificationNumber", company.vatIdentificationNumber() );
+ }};
+ companyEntity = em.create( "company", companyMap );
+ } else {
+ logger.info("Company {} already exists", company.name());
+ }
+
+ em.createConnection( userEntity, "employer", companyEntity );
+
+ } catch (DuplicateUniquePropertyExistsException e) {
+ logger.error( "Dup company generated {} property={}", company.name(), e.getPropertyName() );
+ continue;
+ } catch (Exception e) {
+ logger.error("Error creating or connecting company", e);
+ continue;
+ }
+
+ try {
+ for (int j = 0; j < 5; j++) {
+ Activity activity = new Activity();
+ Activity.ActivityObject actor = new Activity.ActivityObject();
+ actor.setEntityType( "user" );
+ actor.setId( userEntity.getUuid().toString() );
+ activity.setActor( actor );
+ activity.setVerb( "POST" );
+ activity.setContent( "User " + person.username() + " generated a random string "
+ + RandomStringUtils.randomAlphanumeric( 5 ) );
+ em.createItemInCollection( userEntity, "activities", "activity", activity.getProperties() );
+ }
+
+ if (users.size() > 10) {
+ for (int j = 0; j < 5; j++) {
+ try {
+ em.createConnection( userEntity, "associate", users.get( (int) (Math.random() * users.size()) ) );
+ } catch (Exception e) {
+ logger.error( "Error connecting user to user: " + e.getMessage() );
+ }
+ }
+ }
+
+ } catch (Exception e) {
+ logger.error("Error creating activities", e);
+ continue;
+ }
- em.createItemInCollection( firstUserEntity, "activities", "activity", activity.getProperties() );
+ }
}
+
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/a6e68a0a/stack/tools/src/main/java/org/apache/usergrid/tools/ToolBase.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ToolBase.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ToolBase.java
index 63187a4..3c427e1 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ToolBase.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ToolBase.java
@@ -116,7 +116,7 @@ public abstract class ToolBase {
public void printCliHelp( String message ) {
System.out.println( message );
HelpFormatter formatter = new HelpFormatter();
- formatter.printHelp( "java -jar usergrid-tools-0.0.1-SNAPSHOT.jar " + getToolName(), createOptions() );
+ formatter.printHelp( "java -jar usergrid-tools-1.0.2.jar " + getToolName(), createOptions() );
System.exit( -1 );
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/a6e68a0a/stack/tools/src/test/java/org/apache/usergrid/tools/ExportAppTest.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/test/java/org/apache/usergrid/tools/ExportAppTest.java b/stack/tools/src/test/java/org/apache/usergrid/tools/ExportAppTest.java
index a1e3f6b..446aa91 100644
--- a/stack/tools/src/test/java/org/apache/usergrid/tools/ExportAppTest.java
+++ b/stack/tools/src/test/java/org/apache/usergrid/tools/ExportAppTest.java
@@ -63,65 +63,23 @@ public class ExportAppTest {
// create app with some data
- OrganizationOwnerInfo orgInfo = setup.getMgmtSvc().createOwnerAndOrganization(
- "org_" + rand, "user_" + rand, rand.toUpperCase(), rand + "@example.com", rand );
-
- ApplicationInfo appInfo = setup.getMgmtSvc().createApplication(
- orgInfo.getOrganization().getUuid(), "app_" + rand );
-
- final EntityManager em = setup.getEmf().getEntityManager( appInfo.getId() );
+ String orgName = "org_" + rand;
+ String appName = "app_" + rand;
+
+ ExportDataCreator creator = new ExportDataCreator();
+ creator.startTool( new String[] {
+ "-organization", orgName,
+ "-application", appName,
+ "-host", "localhost:" + ServiceITSuite.cassandraResource.getRpcPort()
+ }, false);
- // create connected things
-
- final List<Entity> connectedThings = new ArrayList<Entity>();
- String connectedType = "connected_thing";
- em.createApplicationCollection(connectedType);
- for ( int j=0; j<NUM_CONNECTIONS; j++) {
- final String name = "connected_thing_" + j;
- connectedThings.add( em.create( connectedType, new HashMap<String, Object>() {{
- put( "name", name );
- }} ) );
- }
-
- // create collections of things, every other thing is connected to the connected things
-
- final AtomicInteger entitiesCount = new AtomicInteger(0);
- final AtomicInteger connectionCount = new AtomicInteger(0);
-
- ExecutorService execService = Executors.newFixedThreadPool( 50);
- final Scheduler scheduler = Schedulers.from( execService );
-
- for (int i = 0; i < NUM_COLLECTIONS; i++) {
-
- final String type = "thing_" + i;
- em.createApplicationCollection( type );
- connectionCount.getAndIncrement();
-
- for (int j = 0; j < NUM_ENTITIES; j++) {
- final String name = "thing_" + j;
- final Entity source = em.create(
- type, new HashMap<String, Object>() {{
- put( "name", name );
- }} );
- entitiesCount.getAndIncrement();
-
- for (Entity target : connectedThings) {
- em.createConnection( source, "has", target );
- connectionCount.getAndIncrement();
- }
- }
- }
-
- logger.info( "Done. Created {} entities and {} connections", entitiesCount.get(), connectionCount.get() );
-
long start = System.currentTimeMillis();
String directoryName = "target/export" + rand;
ExportApp exportApp = new ExportApp();
exportApp.startTool( new String[]{
- "-application", appInfo.getName(),
- "-readThreads", "100",
+ "-application", orgName + "/" + appName,
"-writeThreads", "100",
"-host", "localhost:" + ServiceITSuite.cassandraResource.getRpcPort(),
"-outputDir", directoryName
@@ -137,8 +95,7 @@ public class ExportAppTest {
File exportDir1 = new File(directoryName + "1");
exportApp.startTool( new String[]{
- "-application", appInfo.getName(),
- "-readThreads", "1",
+ "-application", orgName + "/" + appName,
"-writeThreads", "1",
"-host", "localhost:" + ServiceITSuite.cassandraResource.getRpcPort(),
"-outputDir", directoryName + "1"