You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by mr...@apache.org on 2015/12/17 23:14:23 UTC
[4/7] usergrid git commit: Add org1 and org2 options so a user can
ask that two same-named orgs be merged.
Add org1 and org2 options so a user can ask that two same-named orgs be merged.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/33a74e82
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/33a74e82
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/33a74e82
Branch: refs/heads/1.x
Commit: 33a74e822d78c39aa13a1084b79b0a29ae3614ff
Parents: 0e6f4c9
Author: Dave Johnson <sn...@apache.org>
Authored: Mon Dec 14 17:26:32 2015 -0500
Committer: Dave Johnson <sn...@apache.org>
Committed: Mon Dec 14 17:26:32 2015 -0500
----------------------------------------------------------------------
.../usergrid/tools/DuplicateOrgInterface.java | 4 +-
.../usergrid/tools/DuplicateOrgRepair.java | 113 +++++++++++++++++--
.../usergrid/tools/DuplicateOrgRepairTest.java | 50 ++++++++
3 files changed, 158 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/usergrid/blob/33a74e82/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgInterface.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgInterface.java b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgInterface.java
index 596d55e..ab708c9 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgInterface.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgInterface.java
@@ -49,7 +49,9 @@ interface DuplicateOrgInterface {
void addAppToOrg( UUID appId, Org org ) throws Exception;
void logDuplicates(Map<String, Set<Org>> duplicatesByName);
-
+
+ Org getOrg(UUID keeperUuid) throws Exception;
+
class Org implements Comparable<Org> {
private UUID id;
private String name;
http://git-wip-us.apache.org/repos/asf/usergrid/blob/33a74e82/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
index 1795af1..572c9b4 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.usergrid.tools;
import com.google.common.collect.BiMap;
@@ -63,11 +62,17 @@ public class DuplicateOrgRepair extends ToolBase {
static final String THREADS_ARG_NAME = "threads";
int threadCount = 5;
-
+
static final String DRYRUN_ARG_NAME = "dryrun";
boolean dryRun = false;
-
+
+ static final String ORG1_ID = "org2";
+
+ static final String ORG2_ID = "org1";
+
+ boolean testing = false;
+
@Override
@SuppressWarnings("static-access")
@@ -77,7 +82,7 @@ public class DuplicateOrgRepair extends ToolBase {
Option dryRunOption = OptionBuilder.hasArg()
.withType(Boolean.TRUE)
- .withDescription( "-" + DRYRUN_ARG_NAME + "true to print what tool would do and do not alter data.")
+ .withDescription( "-" + DRYRUN_ARG_NAME + " true to print what tool would do and do not alter data.")
.create( DRYRUN_ARG_NAME );
options.addOption( dryRunOption );
@@ -85,7 +90,19 @@ public class DuplicateOrgRepair extends ToolBase {
.withType(0)
.withDescription( "Write Threads -" + THREADS_ARG_NAME )
.create(THREADS_ARG_NAME);
- options.addOption( writeThreadsOption );
+ options.addOption( writeThreadsOption );
+
+ Option org1Option = OptionBuilder.hasArg()
+ .withType(0)
+ .withDescription( "Duplicate org #1 id -" + ORG1_ID)
+ .create(ORG1_ID);
+ options.addOption( org1Option );
+
+ Option org2Option = OptionBuilder.hasArg()
+ .withType(0)
+ .withDescription( "Duplicate org #2 id -" + ORG2_ID)
+ .create(ORG2_ID);
+ options.addOption( org2Option );
return options;
}
@@ -96,6 +113,26 @@ public class DuplicateOrgRepair extends ToolBase {
startSpring();
setVerbose( line );
+ UUID org1uuid = null;
+ UUID org2uuid = null;
+
+ if ( StringUtils.isNotEmpty( line.getOptionValue( ORG1_ID) )) {
+ if ( StringUtils.isNotEmpty( line.getOptionValue( ORG2_ID) )) {
+
+ try {
+ org1uuid = UUID.fromString( line.getOptionValue( ORG1_ID ) );
+ org2uuid = UUID.fromString( line.getOptionValue( ORG2_ID ) );
+ } catch (Exception e) {
+ logger.error("{} and {} must be specified as UUIDs", ORG1_ID, ORG2_ID);
+ return;
+ }
+
+
+ } else {
+ logger.error("- if {} is specified you must also specify {} and vice-versa", ORG1_ID, ORG2_ID);
+ return;
+ }
+ }
if (StringUtils.isNotEmpty( line.getOptionValue( THREADS_ARG_NAME ) )) {
try {
threadCount = Integer.parseInt( line.getOptionValue( THREADS_ARG_NAME ) );
@@ -118,9 +155,23 @@ public class DuplicateOrgRepair extends ToolBase {
}
logger.info( "DuplicateOrgRepair tool starting up... manager: " + manager.getClass().getSimpleName() );
-
- buildOrgMaps();
-
+
+ if ( org1uuid != null && org2uuid != null ) {
+
+ Org org1 = manager.getOrg( org1uuid );
+ Org org2 = manager.getOrg( org2uuid );
+
+ if ( org1.getName().equals( org2.getName() )) {
+ buildOrgMaps( org1, org2 );
+ } else {
+ logger.error("org1 and org2 do not have same duplicate name");
+ return;
+ }
+
+ } else {
+ buildOrgMaps();
+ }
+
augmentUserOrgsMap();
manager.logDuplicates( duplicatesByName );
@@ -137,7 +188,38 @@ public class DuplicateOrgRepair extends ToolBase {
return new RepairManager();
}
+
+ private void buildOrgMaps(Org org1, Org org2) {
+
+ Set<Org> orgs = new HashSet<Org>();
+ orgs.add( org1 );
+ orgs.add( org2 );
+ orgsByName.put( org1.getName(), orgs );
+ duplicatesByName.put( org1.getName(), orgs );
+
+ orgsById.put( org1.getId(), org1 );
+ orgsById.put( org2.getId(), org2 );
+
+ for ( Org org : orgs ) {
+ try {
+ Set<OrgUser> orgUsers = manager.getOrgUsers( org );
+ for (OrgUser user : orgUsers) {
+ Set<Org> usersOrgs = orgsByUser.get( user );
+ if (usersOrgs == null) {
+ usersOrgs = new HashSet<Org>();
+ orgsByUser.put( user, usersOrgs );
+ }
+ usersOrgs.add( org );
+ }
+ } catch (Exception e) {
+ logger.error( "Error getting users for org {}:{}", org.getName(), org.getId() );
+ logger.error( "Stack trace is: ", e );
+ }
+ }
+ }
+
+
/**
* build map of orgs by name, orgs by id, orgs by user and duplicate orgs by name
*/
@@ -528,7 +610,22 @@ public class DuplicateOrgRepair extends ToolBase {
}
}
}
+
+ @Override
+ public Org getOrg(UUID uuid) throws Exception {
+
+ EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
+ Entity entity = em.get( uuid );
+
+ Org org = new Org(
+ entity.getUuid(),
+ entity.getProperty( "path" )+"",
+ entity.getCreated() );
+ org.sourceValue = entity;
+
+ return org;
+ }
}
http://git-wip-us.apache.org/repos/asf/usergrid/blob/33a74e82/stack/tools/src/test/java/org/apache/usergrid/tools/DuplicateOrgRepairTest.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/test/java/org/apache/usergrid/tools/DuplicateOrgRepairTest.java b/stack/tools/src/test/java/org/apache/usergrid/tools/DuplicateOrgRepairTest.java
index f871e50..daf40d3 100644
--- a/stack/tools/src/test/java/org/apache/usergrid/tools/DuplicateOrgRepairTest.java
+++ b/stack/tools/src/test/java/org/apache/usergrid/tools/DuplicateOrgRepairTest.java
@@ -85,6 +85,46 @@ public class DuplicateOrgRepairTest {
}
}).toBlocking().lastOrDefault( null );
}
+
+
+ @org.junit.Test
+ public void testMockWithOneDup() throws Exception {
+
+ int numOrgs = 1; // create 1 org and a dup
+
+ final DuplicateOrgRepair dor = new DuplicateOrgRepair();
+ dor.testing = true;
+
+ dor.manager = new Manager( numOrgs );
+
+ assertEquals( "must start with dups",
+ 2 * numOrgs, (long)dor.manager.getOrgs().count().toBlocking().single());
+
+ dor.startTool( new String[] {
+ "org1", ((Manager)dor.manager).usersByOrg.keySet().iterator().next().getId()+"",
+ "org2", ((Manager)dor.manager).usersByOrg.keySet().iterator().next().getId()+""
+ }, false ); // false means do not call System.exit()
+
+ assertEquals( "must remove dups",
+ numOrgs, (long)dor.manager.getOrgs().count().toBlocking().single());
+
+ dor.manager.getOrgs().doOnNext( new Action1<Org>() {
+ @Override
+ public void call(Org org) {
+ try {
+ assertEquals("remaining orgs should have right number of users",
+ 3, dor.manager.getOrgUsers(org).size());
+
+ assertEquals("remaining orgs should have right number of apps",
+ 3, dor.manager.getOrgApps(org).size());
+
+ } catch (Exception e) {
+ logger.error("Error counting apps or users: " + e.getMessage(), e);
+ fail("Error counting apps or users");
+ }
+ }
+ }).toBlocking().lastOrDefault( null );
+ }
@org.junit.Test
@@ -262,6 +302,8 @@ public class DuplicateOrgRepairTest {
Map<OrgUser, Set<Org>> orgsByUser = new HashMap<OrgUser, Set<Org>>();
Map<Org, Set<UUID>> appsByOrg = new HashMap<Org, Set<UUID>>();
+
+ Map<UUID, Org> orgsById = new HashMap<UUID, Org>();
/**
@@ -283,6 +325,9 @@ public class DuplicateOrgRepairTest {
}
Org org2 = new Org( UUID.randomUUID(), "org_" + i, System.currentTimeMillis() );
+ orgsById.put( org1.getId(), org1 );
+ orgsById.put( org2.getId(), org2 );
+
OrgUser usera = new OrgUser( UUID.randomUUID(), "user_" + i + "_a" );
OrgUser userb = new OrgUser( UUID.randomUUID(), "user_" + i + "_b" );
OrgUser userc = new OrgUser( UUID.randomUUID(), "user_" + i + "_c" );
@@ -403,5 +448,10 @@ public class DuplicateOrgRepairTest {
}
}
}
+
+ @Override
+ public Org getOrg(UUID uuid) throws Exception {
+ return orgsById.get(uuid);
+ }
}
}