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); 
+        }
     }
 }