Explorar o código

AMBARI-7481 - Admin : LDAP sync event API to sync existing users / groups

tbeerbower %!s(int64=10) %!d(string=hai) anos
pai
achega
cb65612062
Modificáronse 14 ficheiros con 603 adicións e 187 borrados
  1. 7 3
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
  2. 30 10
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
  3. 94 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/LdapSyncRequest.java
  4. 11 3
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ControllerResourceProvider.java
  5. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
  6. 93 31
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
  7. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
  8. 90 37
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntity.java
  9. 13 11
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntity.java
  10. 122 32
      ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
  11. 84 0
      ambari-server/src/test/java/org/apache/ambari/server/controller/LdapSyncRequestTest.java
  12. 24 4
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProviderTest.java
  13. 13 34
      ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntityTest.java
  14. 20 20
      ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntityTest.java

+ 7 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java

@@ -702,11 +702,15 @@ public interface AmbariManagementController {
   /**
    * Synchronizes local users and groups with given data.
    *
-   * @param users users to be synchronized
-   * @param groups groups to be synchronized
+   * @param userRequest  users to be synchronized
+   * @param groupRequest groups to be synchronized
+   *
+   * @return the results of the LDAP synchronization
+   *
    * @throws AmbariException if synchronization data was invalid
    */
-  public LdapBatchDto synchronizeLdapUsersAndGroups(Set<String> users, Set<String> groups) throws AmbariException;
+  public LdapBatchDto synchronizeLdapUsersAndGroups(
+      LdapSyncRequest userRequest, LdapSyncRequest groupRequest) throws AmbariException;
 
   /**
    * Checks if LDAP sync process is running.

+ 30 - 10
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java

@@ -3682,21 +3682,41 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
   }
 
   @Override
-  public synchronized LdapBatchDto synchronizeLdapUsersAndGroups(Set<String> users, Set<String> groups)
+  public synchronized LdapBatchDto synchronizeLdapUsersAndGroups(
+      LdapSyncRequest userRequest, LdapSyncRequest groupRequest)
       throws AmbariException {
     ldapSyncInProgress = true;
     try {
+
       final LdapBatchDto batchInfo = new LdapBatchDto();
-      if (users != null) {
-        ldapDataPopulator.synchronizeLdapUsers(users, batchInfo);
-      } else {
-        ldapDataPopulator.synchronizeAllLdapUsers(batchInfo);
-      }
-      if (groups != null) {
-        ldapDataPopulator.synchronizeLdapGroups(groups, batchInfo);
-      } else {
-        ldapDataPopulator.synchronizeAllLdapGroups(batchInfo);
+
+      if (userRequest != null) {
+        switch (userRequest.getType()) {
+          case ALL:
+            ldapDataPopulator.synchronizeAllLdapUsers(batchInfo);
+            break;
+          case EXISTING:
+            ldapDataPopulator.synchronizeExistingLdapUsers(batchInfo);
+            break;
+          case SPECIFIC:
+            ldapDataPopulator.synchronizeLdapUsers(userRequest.getPrincipalNames(), batchInfo);
+            break;
+        }
+      }
+      if (groupRequest != null) {
+        switch (groupRequest.getType()) {
+          case ALL:
+            ldapDataPopulator.synchronizeAllLdapGroups(batchInfo);
+            break;
+          case EXISTING:
+            ldapDataPopulator.synchronizeExistingLdapGroups(batchInfo);
+            break;
+          case SPECIFIC:
+            ldapDataPopulator.synchronizeLdapGroups(groupRequest.getPrincipalNames(), batchInfo);
+            break;
+        }
       }
+
       this.users.processLdapSync(batchInfo);
       return batchInfo;
     } finally {

+ 94 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/LdapSyncRequest.java

@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.controller;
+
+import org.apache.ambari.server.orm.entities.LdapSyncSpecEntity;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Request for LDAP synchronization.
+ */
+public class LdapSyncRequest {
+
+  /**
+   * The principal names for the request.
+   */
+  private final Set<String> principalNames;
+
+  /**
+   * The type of request.
+   */
+  private final LdapSyncSpecEntity.SyncType type;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct an LdapSyncRequest.
+   *
+   * @param type            the request type
+   * @param principalNames  the principal names
+   */
+  public LdapSyncRequest(LdapSyncSpecEntity.SyncType type, Set<String> principalNames) {
+    this.type  = type;
+    this.principalNames = principalNames == null ? new HashSet<String>() : principalNames;
+  }
+
+  /**
+   * Construct an LdapSyncRequest.
+   *
+   * @param type  the request type
+   */
+  public LdapSyncRequest(LdapSyncSpecEntity.SyncType type) {
+    this.principalNames = new HashSet<String>();
+    this.type  = type;
+  }
+
+
+  // ----- LdapSyncRequest ---------------------------------------------------
+
+  /**
+   * Add principal names to the request.
+   *
+   * @param principalNames  the principal names to be added
+   */
+  public void addPrincipalNames(Set<String> principalNames) {
+    this.principalNames.addAll(principalNames);
+  }
+
+  /**
+   * Get the principal names.
+   *
+   * @return the principal names
+   */
+  public Set<String> getPrincipalNames() {
+    return principalNames;
+  }
+
+  /**
+   * Get the request type.
+   *
+   * @return the request type
+   */
+  public LdapSyncSpecEntity.SyncType getType() {
+    return type;
+  }
+}

+ 11 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ControllerResourceProvider.java

@@ -29,6 +29,7 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.ControllerRequest;
 import org.apache.ambari.server.controller.ControllerResponse;
+import org.apache.ambari.server.controller.LdapSyncRequest;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -39,6 +40,7 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.entities.LdapSyncSpecEntity;
 import org.apache.ambari.server.security.ldap.LdapBatchDto;
 import org.apache.ambari.server.security.ldap.LdapGroupDto;
 import org.apache.ambari.server.security.ldap.LdapSyncDto;
@@ -227,7 +229,14 @@ class ControllerResourceProvider extends AbstractControllerResourceProvider {
               }
             }
             if (!getManagementController().isLdapSyncInProgress()) {
-              LdapBatchDto syncInfo = getManagementController().synchronizeLdapUsersAndGroups(users, groups);
+
+              LdapSyncRequest userRequest = users == null ? new LdapSyncRequest(LdapSyncSpecEntity.SyncType.ALL) :
+                  new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC, users);
+
+              LdapSyncRequest groupRequest = groups == null ? new LdapSyncRequest(LdapSyncSpecEntity.SyncType.ALL) :
+                  new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC, groups);
+
+              LdapBatchDto syncInfo = getManagementController().synchronizeLdapUsersAndGroups(userRequest, groupRequest);
               resource.setProperty("Sync/status", "successful");
               resource.setProperty("Sync/summary/Users/created", syncInfo.getUsersToBeCreated().size());
               resource.setProperty("Sync/summary/Users/updated", syncInfo.getUsersToBecomeLdap().size());
@@ -268,7 +277,6 @@ class ControllerResourceProvider extends AbstractControllerResourceProvider {
     if (properties == null) {
       return new ControllerRequest(null, properties);
     }
-    final ControllerRequest request = new ControllerRequest((String) properties.get(CONTROLLER_NAME_PROPERTY_ID), properties);
-    return request;
+    return new ControllerRequest((String) properties.get(CONTROLLER_NAME_PROPERTY_ID), properties);
   }
 }

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java

@@ -80,7 +80,7 @@ public class DefaultProviderModule extends AbstractProviderModule {
       case ClusterPrivilege:
         return new ClusterPrivilegeResourceProvider();
       case LdapSyncEvent:
-        return new LdapSyncEventResourceProvider();
+        return new LdapSyncEventResourceProvider(managementController);
       default:
         return AbstractControllerResourceProvider.getResourceProvider(type, propertyIds,
             keyPropertyIds, managementController);

+ 93 - 31
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java

@@ -19,6 +19,8 @@
 package org.apache.ambari.server.controller.internal;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.LdapSyncRequest;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -31,6 +33,7 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.entities.LdapSyncEventEntity;
 import org.apache.ambari.server.orm.entities.LdapSyncSpecEntity;
+import org.apache.ambari.server.security.ldap.LdapBatchDto;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,7 +56,7 @@ import java.util.concurrent.atomic.AtomicLong;
 /**
  * Resource provider for ldap sync events.
  */
-public class LdapSyncEventResourceProvider extends AbstractResourceProvider {
+public class LdapSyncEventResourceProvider extends AbstractControllerResourceProvider {
 
   /**
    * Thread pool
@@ -71,19 +74,16 @@ public class LdapSyncEventResourceProvider extends AbstractResourceProvider {
   public static final String EVENT_ID_PROPERTY_ID            = "Event/id";
   public static final String EVENT_STATUS_PROPERTY_ID        = "Event/status";
   public static final String EVENT_STATUS_DETAIL_PROPERTY_ID = "Event/status_detail";
-  public static final String EVENT_START_TIME_PROPERTY_ID    = "Event/sync_start_time";
-  public static final String EVENT_END_TIME_PROPERTY_ID      = "Event/sync_end_time";
-  public static final String USERS_FETCHED_PROPERTY_ID       = "Event/results/users_fetched";
-  public static final String USERS_CREATED_PROPERTY_ID       = "Event/results/users_created";
-  public static final String USERS_UPDATED_PROPERTY_ID       = "Event/results/users_updated";
-  public static final String USERS_REMOVED_PROPERTY_ID       = "Event/results/users_removed";
-  public static final String GROUPS_FETCHED_PROPERTY_ID      = "Event/results/groups_fetched";
-  public static final String GROUPS_CREATED_PROPERTY_ID      = "Event/results/groups_created";
-  public static final String GROUPS_UPDATED_PROPERTY_ID      = "Event/results/groups_updated";
-  public static final String GROUPS_REMOVED_PROPERTY_ID      = "Event/results/groups_removed";
-  public static final String MEMBERSHIPS_FETCHED_PROPERTY_ID = "Event/results/memberships_fetched";
-  public static final String MEMBERSHIPS_CREATED_PROPERTY_ID = "Event/results/memberships_created";
-  public static final String MEMBERSHIPS_UPDATED_PROPERTY_ID = "Event/results/memberships_updated";
+  public static final String EVENT_START_TIME_PROPERTY_ID    = "Event/sync_time/start";
+  public static final String EVENT_END_TIME_PROPERTY_ID      = "Event/sync_time/end";
+  public static final String USERS_CREATED_PROPERTY_ID       = "Event/summary/users/created";
+  public static final String USERS_UPDATED_PROPERTY_ID       = "Event/summary/users/updated";
+  public static final String USERS_REMOVED_PROPERTY_ID       = "Event/summary/users/removed";
+  public static final String GROUPS_CREATED_PROPERTY_ID      = "Event/summary/groups/created";
+  public static final String GROUPS_UPDATED_PROPERTY_ID      = "Event/summary/groups/updated";
+  public static final String GROUPS_REMOVED_PROPERTY_ID      = "Event/summary/groups/removed";
+  public static final String MEMBERSHIPS_CREATED_PROPERTY_ID = "Event/summary/memberships/created";
+  public static final String MEMBERSHIPS_REMOVED_PROPERTY_ID = "Event/summary/memberships/removed";
   public static final String EVENT_SPECS_PROPERTY_ID         = "Event/specs";
 
   /**
@@ -105,17 +105,14 @@ public class LdapSyncEventResourceProvider extends AbstractResourceProvider {
     propertyIds.add(EVENT_STATUS_DETAIL_PROPERTY_ID);
     propertyIds.add(EVENT_START_TIME_PROPERTY_ID);
     propertyIds.add(EVENT_END_TIME_PROPERTY_ID);
-    propertyIds.add(USERS_FETCHED_PROPERTY_ID);
     propertyIds.add(USERS_CREATED_PROPERTY_ID);
     propertyIds.add(USERS_UPDATED_PROPERTY_ID);
     propertyIds.add(USERS_REMOVED_PROPERTY_ID);
-    propertyIds.add(GROUPS_FETCHED_PROPERTY_ID);
     propertyIds.add(GROUPS_CREATED_PROPERTY_ID);
     propertyIds.add(GROUPS_UPDATED_PROPERTY_ID);
     propertyIds.add(GROUPS_REMOVED_PROPERTY_ID);
-    propertyIds.add(MEMBERSHIPS_FETCHED_PROPERTY_ID);
     propertyIds.add(MEMBERSHIPS_CREATED_PROPERTY_ID);
-    propertyIds.add(MEMBERSHIPS_UPDATED_PROPERTY_ID);
+    propertyIds.add(MEMBERSHIPS_REMOVED_PROPERTY_ID);
     propertyIds.add(EVENT_SPECS_PROPERTY_ID);
   }
 
@@ -157,8 +154,8 @@ public class LdapSyncEventResourceProvider extends AbstractResourceProvider {
   /**
    * Construct a event resource provider.
    */
-  public LdapSyncEventResourceProvider() {
-    super(propertyIds, keyPropertyIds);
+  public LdapSyncEventResourceProvider(AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
   }
 
 
@@ -260,17 +257,14 @@ public class LdapSyncEventResourceProvider extends AbstractResourceProvider {
     setResourceProperty(resource, EVENT_ID_PROPERTY_ID, eventEntity.getId(), requestedIds);
     setResourceProperty(resource, EVENT_STATUS_PROPERTY_ID, eventEntity.getStatus().toString().toUpperCase(), requestedIds);
     setResourceProperty(resource, EVENT_STATUS_DETAIL_PROPERTY_ID, eventEntity.getStatusDetail(), requestedIds);
-    setResourceProperty(resource, USERS_FETCHED_PROPERTY_ID, eventEntity.getUsersFetched(), requestedIds);
     setResourceProperty(resource, USERS_CREATED_PROPERTY_ID, eventEntity.getUsersCreated(), requestedIds);
     setResourceProperty(resource, USERS_UPDATED_PROPERTY_ID, eventEntity.getUsersUpdated(), requestedIds);
     setResourceProperty(resource, USERS_REMOVED_PROPERTY_ID, eventEntity.getUsersRemoved(), requestedIds);
-    setResourceProperty(resource, GROUPS_FETCHED_PROPERTY_ID, eventEntity.getGroupsFetched(), requestedIds);
     setResourceProperty(resource, GROUPS_CREATED_PROPERTY_ID, eventEntity.getGroupsCreated(), requestedIds);
     setResourceProperty(resource, GROUPS_UPDATED_PROPERTY_ID, eventEntity.getGroupsUpdated(), requestedIds);
     setResourceProperty(resource, GROUPS_REMOVED_PROPERTY_ID, eventEntity.getGroupsRemoved(), requestedIds);
-    setResourceProperty(resource, MEMBERSHIPS_FETCHED_PROPERTY_ID, eventEntity.getMembershipsFetched(), requestedIds);
     setResourceProperty(resource, MEMBERSHIPS_CREATED_PROPERTY_ID, eventEntity.getMembershipsCreated(), requestedIds);
-    setResourceProperty(resource, MEMBERSHIPS_UPDATED_PROPERTY_ID, eventEntity.getMembershipsUpdated(), requestedIds);
+    setResourceProperty(resource, MEMBERSHIPS_REMOVED_PROPERTY_ID, eventEntity.getMembershipsRemoved(), requestedIds);
 
     Set<Map<String, String>> specs = new HashSet<Map<String, String>>();
 
@@ -414,25 +408,93 @@ public class LdapSyncEventResourceProvider extends AbstractResourceProvider {
         }
       }
 
-      event.setStatus(LdapSyncEventEntity.Status.Running);
+      event.setStatus(LdapSyncEventEntity.Status.RUNNING);
       event.setStatusDetail("Running LDAP sync.");
       event.setStartTime(System.currentTimeMillis());
 
       try {
 
-        // TODO : call back end code to perform LDAP sync
+        populateLdapSyncEvent(event, syncLdap(event));
 
-        // TODO : update event resource with results of sync
-
-        event.setEndTime(System.currentTimeMillis());
-        event.setStatus(LdapSyncEventEntity.Status.Complete);
+        event.setStatus(LdapSyncEventEntity.Status.COMPLETE);
         event.setStatusDetail("Completed LDAP sync.");
       } catch (Exception e) {
+        event.setStatus(LdapSyncEventEntity.Status.ERROR);
         String msg = "Caught exception running LDAP sync. ";
-        event.setStatus(LdapSyncEventEntity.Status.Error);
         event.setStatusDetail(msg + e.getMessage());
         LOG.error(msg, e);
+      } finally {
+        event.setEndTime(System.currentTimeMillis());
+      }
+    }
+  }
+
+  /**
+   * Sync the users and groups specified in the given sync event with ldap.
+   *
+   * @param event  the sync event
+   *
+   * @return the results of the sync
+   *
+   * @throws AmbariException if the sync could not be completed
+   */
+  private LdapBatchDto syncLdap(LdapSyncEventEntity event) throws AmbariException {
+    LdapSyncRequest userRequest  = null;
+    LdapSyncRequest groupRequest = null;
+
+    for (LdapSyncSpecEntity spec : event.getSpecs()) {
+      switch (spec.getPrincipalType()) {
+        case USERS:
+          userRequest = getLdapRequest(userRequest, spec);
+          break;
+        case GROUPS:
+          groupRequest = getLdapRequest(groupRequest, spec);
+          break;
       }
     }
+    return getManagementController().synchronizeLdapUsersAndGroups(userRequest, groupRequest);
+  }
+
+  /**
+   * Update the given request with the given ldap event spec.
+   *
+   * @param request  the sync request; may be null
+   * @param spec     the specification of what to sync
+   *
+   * @return the updated sync request or a new sync request if the given request is null
+   */
+  private LdapSyncRequest getLdapRequest(LdapSyncRequest request, LdapSyncSpecEntity spec) {
+
+    switch (spec.getSyncType()) {
+      case ALL:
+        return new LdapSyncRequest(LdapSyncSpecEntity.SyncType.ALL);
+      case EXISTING:
+        return new LdapSyncRequest(LdapSyncSpecEntity.SyncType.EXISTING);
+      case SPECIFIC:
+        Set<String> principalNames = new HashSet<String>(spec.getPrincipalNames());
+        if (request == null ) {
+          request = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC, principalNames);
+        } else {
+          request.addPrincipalNames(principalNames);
+        }
+    }
+    return request;
+  }
+
+  /**
+   * Populate the given ldap sync event with the results of an ldap sync.
+   *
+   * @param event     the sync event
+   * @param syncInfo  the sync results
+   */
+  private void populateLdapSyncEvent(LdapSyncEventEntity event, LdapBatchDto syncInfo) {
+    event.setUsersCreated(syncInfo.getUsersToBeCreated().size());
+    event.setUsersUpdated(syncInfo.getUsersToBecomeLdap().size());
+    event.setUsersRemoved(syncInfo.getUsersToBeRemoved().size());
+    event.setGroupsCreated(syncInfo.getGroupsToBeCreated().size());
+    event.setGroupsUpdated(syncInfo.getGroupsToBecomeLdap().size());
+    event.setGroupsRemoved(syncInfo.getGroupsToBeRemoved().size());
+    event.setMembershipsCreated(syncInfo.getMembershipToAdd().size());
+    event.setMembershipsRemoved(syncInfo.getMembershipToRemove().size());
   }
 }

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java

@@ -49,7 +49,7 @@ public class PermissionDAO {
   /**
    * Create permission.
    *
-   * @param PermissionEntity entity to store
+   * @param permissionEntity  entity to store
    */
   @Transactional
   public void create(PermissionEntity permissionEntity) {

+ 90 - 37
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntity.java

@@ -49,17 +49,14 @@ public class LdapSyncEventEntity {
   /**
    * Results of sync event.
    */
-  private Integer usersFetched;
   private Integer usersCreated;
   private Integer usersUpdated;
   private Integer usersRemoved;
-  private Integer groupsFetched;
   private Integer groupsCreated;
   private Integer groupsUpdated;
   private Integer groupsRemoved;
-  private Integer membershipsFetched;
   private Integer membershipsCreated;
-  private Integer membershipsUpdated;
+  private Integer membershipsRemoved;
 
   /**
    * The specifications that define the sync event.
@@ -76,7 +73,7 @@ public class LdapSyncEventEntity {
    */
   public LdapSyncEventEntity(long id) {
     this.id = id;
-    this.status = Status.Pending;
+    this.status = Status.PENDING;
   }
 
 
@@ -181,92 +178,148 @@ public class LdapSyncEventEntity {
     this.endTime = endTime;
   }
 
-  public Integer getUsersFetched() {
-    return usersFetched;
-  }
-
-  public void setUsersFetched(Integer usersFetched) {
-    this.usersFetched = usersFetched;
-  }
-
+  /**
+   * Get the number of users created during the sync event.
+   *
+   * @return the number of users created
+   */
   public Integer getUsersCreated() {
     return usersCreated;
   }
 
+  /**
+   * Set the number of users created during the sync event.
+   *
+   * @param usersCreated  the number of users created
+   */
   public void setUsersCreated(Integer usersCreated) {
     this.usersCreated = usersCreated;
   }
 
+  /**
+   * Get the number of users updated during the sync event.
+   *
+   * @return the number of users updated
+   */
   public Integer getUsersUpdated() {
     return usersUpdated;
   }
 
+  /**
+   * Set the number of users updated during the sync event.
+   *
+   * @param usersUpdated  the number of users updated
+   */
   public void setUsersUpdated(Integer usersUpdated) {
     this.usersUpdated = usersUpdated;
   }
 
+  /**
+   * Get the number of users removed during the sync event.
+   *
+   * @return the number of users removed
+   */
   public Integer getUsersRemoved() {
     return usersRemoved;
   }
 
+  /**
+   * Set the number of users removed during the sync event.
+   *
+   * @param usersRemoved  the number of users removed
+   */
   public void setUsersRemoved(Integer usersRemoved) {
     this.usersRemoved = usersRemoved;
   }
 
-  public Integer getGroupsFetched() {
-    return groupsFetched;
-  }
-
-  public void setGroupsFetched(Integer groupsFetched) {
-    this.groupsFetched = groupsFetched;
-  }
-
+  /**
+   * Get the number of groups created during the sync event.
+   *
+   * @return the number of groups created
+   */
   public Integer getGroupsCreated() {
     return groupsCreated;
   }
 
+  /**
+   * Set the number of groups created during the sync event.
+   *
+   * @param groupsCreated  the number of groups created
+   */
   public void setGroupsCreated(Integer groupsCreated) {
     this.groupsCreated = groupsCreated;
   }
 
+  /**
+   * Get the number of groups updated during the sync event.
+   *
+   * @return the number of groups updated
+   */
   public Integer getGroupsUpdated() {
     return groupsUpdated;
   }
 
+  /**
+   * Set the number of groups updated during the sync event.
+   *
+   * @param groupsUpdated  the number of groups updated
+   */
   public void setGroupsUpdated(Integer groupsUpdated) {
     this.groupsUpdated = groupsUpdated;
   }
 
+  /**
+   * Get the number of groups removed during the sync event.
+   *
+   * @return the number of groups removed
+   */
   public Integer getGroupsRemoved() {
     return groupsRemoved;
   }
 
+  /**
+   * Set the number of groups removed during the sync event.
+   *
+   * @param groupsRemoved  the number of groups removed
+   */
   public void setGroupsRemoved(Integer groupsRemoved) {
     this.groupsRemoved = groupsRemoved;
   }
 
-  public Integer getMembershipsFetched() {
-    return membershipsFetched;
-  }
-
-  public void setMembershipsFetched(Integer membershipsFetched) {
-    this.membershipsFetched = membershipsFetched;
-  }
-
+  /**
+   * Get the number of memberships created during the sync event.
+   *
+   * @return the number of memberships created
+   */
   public Integer getMembershipsCreated() {
     return membershipsCreated;
   }
 
+  /**
+   * Set the number of memberships created during the sync event.
+   *
+   * @param membershipsCreated  the number of memberships created
+   */
   public void setMembershipsCreated(Integer membershipsCreated) {
     this.membershipsCreated = membershipsCreated;
   }
 
-  public Integer getMembershipsUpdated() {
-    return membershipsUpdated;
+  /**
+   * Get the number of memberships removed during the sync event.
+   *
+   * @return the number of memberships removed
+   */
+  public Integer getMembershipsRemoved() {
+    return membershipsRemoved;
   }
 
-  public void setMembershipsUpdated(Integer membershipsUpdated) {
-    this.membershipsUpdated = membershipsUpdated;
+  /**
+   * Set the number of memberships removed during the sync event.
+   *
+   * @param membershipsRemoved  the number of memberships removed
+   */
+  public void setMembershipsRemoved(Integer membershipsRemoved) {
+    this.membershipsRemoved = membershipsRemoved;
   }
 
 
@@ -276,9 +329,9 @@ public class LdapSyncEventEntity {
    * LDAP sync event status
    */
   public enum Status {
-    Pending,
-    Running,
-    Error,
-    Complete
+    PENDING,  // sync is queued for execution
+    RUNNING,  // sync is running
+    ERROR,    // error occurred during sync
+    COMPLETE  // sync is complete
   }
 }

+ 13 - 11
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntity.java

@@ -48,14 +48,16 @@ public class LdapSyncSpecEntity {
    *
    * @param principalType   the principal type
    * @param syncType        the sync type
-   * @param principalNames  the list of principal names.
+   * @param principalNames  the list of principal names; may not be null
    */
   public LdapSyncSpecEntity(PrincipalType principalType, SyncType syncType, List<String> principalNames) {
-    this.principalType = principalType;
-    this.syncType = syncType;
+    this.principalType  = principalType;
+    this.syncType       = syncType;
     this.principalNames = principalNames;
 
-    if (syncType == SyncType.Specific) {
+    assert principalNames != null;
+
+    if (syncType == SyncType.SPECIFIC) {
       if (principalNames.isEmpty()) {
         throw new IllegalArgumentException("Missing principal names for " + syncType + " sync-type.");
       }
@@ -103,8 +105,8 @@ public class LdapSyncSpecEntity {
    * LDAP sync principal type.
    */
   public enum PrincipalType {
-    Users,
-    Groups;
+    USERS,
+    GROUPS;
 
     /**
      * Get the enum value for the given principal type name string, ignoring case.
@@ -114,7 +116,7 @@ public class LdapSyncSpecEntity {
      * @return the enum value for the given type name
      */
     public static PrincipalType valueOfIgnoreCase(String type) {
-      return valueOf(Character.toUpperCase(type.charAt(0)) + type.substring(1).toLowerCase());
+      return valueOf(type.toUpperCase());
     }
   }
 
@@ -125,9 +127,9 @@ public class LdapSyncSpecEntity {
    * LDAP sync type.
    */
   public enum SyncType {
-    All,
-    Existing,
-    Specific;
+    ALL,       // sync all principals
+    EXISTING,  // sync only principals that currently exist in Ambari
+    SPECIFIC;  // sync only the named principals
 
     /**
      * Get the enum value for the given sync type name string, ignoring case.
@@ -137,7 +139,7 @@ public class LdapSyncSpecEntity {
      * @return the enum value for the given type name
      */
     public static SyncType valueOfIgnoreCase(String type) {
-      return valueOf(Character.toUpperCase(type.charAt(0)) + type.substring(1).toLowerCase());
+      return valueOf(type.toUpperCase());
     }
   }
 }

+ 122 - 32
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java

@@ -18,32 +18,12 @@
 
 package org.apache.ambari.server.controller;
 
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.createMockBuilder;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.*;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.TreeMap;
-
+import com.google.gson.Gson;
+import com.google.inject.Binder;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
 import junit.framework.Assert;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ClusterNotFoundException;
@@ -52,10 +32,15 @@ import org.apache.ambari.server.ParentObjectNotFoundException;
 import org.apache.ambari.server.ServiceComponentHostNotFoundException;
 import org.apache.ambari.server.ServiceComponentNotFoundException;
 import org.apache.ambari.server.ServiceNotFoundException;
+import org.apache.ambari.server.actionmanager.ActionDBAccessorImpl;
 import org.apache.ambari.server.actionmanager.ActionManager;
-import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.entities.LdapSyncSpecEntity;
+import org.apache.ambari.server.security.authorization.Users;
+import org.apache.ambari.server.security.ldap.AmbariLdapDataPopulator;
+import org.apache.ambari.server.security.ldap.LdapBatchDto;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
@@ -63,21 +48,61 @@ import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
-import org.apache.ambari.server.state.StackId;
-import org.apache.ambari.server.state.ServiceOsSpecific;
 import org.apache.ambari.server.state.ServiceInfo;
-import javax.persistence.RollbackException;
+import org.apache.ambari.server.state.ServiceOsSpecific;
+import org.apache.ambari.server.state.StackId;
 import org.easymock.Capture;
+import org.junit.Before;
 import org.junit.Test;
 
-import com.google.gson.Gson;
-import com.google.inject.Injector;
+import javax.persistence.RollbackException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createMockBuilder;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * AmbariManagementControllerImpl unit tests
  */
 public class AmbariManagementControllerImplTest {
 
+  // Mocks
+  private static final AmbariLdapDataPopulator ldapDataPopulator = createMock(AmbariLdapDataPopulator.class);
+  private static final Clusters clusters = createNiceMock(Clusters.class);
+  private static final ActionDBAccessorImpl actionDBAccessor = createNiceMock(ActionDBAccessorImpl.class);
+  private static final AmbariMetaInfo ambariMetaInfo = createMock(AmbariMetaInfo.class);
+  private static final Users users = createMock(Users.class);
+
+  @Before
+  public void before() throws Exception {
+    reset(ldapDataPopulator, clusters,actionDBAccessor, ambariMetaInfo, users);
+  }
 
   @Test
   public void testgetAmbariServerURI() throws Exception {
@@ -1353,6 +1378,71 @@ public class AmbariManagementControllerImplTest {
     assertEquals(defaultHostParams.get(STACK_VERSION), SOME_STACK_VERSION);
   }
 
+  @Test
+  public void testSynchronizeLdapUsersAndGroups() throws Exception {
+
+    Set<String> userSet = new HashSet<String>();
+    userSet.add("user1");
+
+    Set<String> groupSet = new HashSet<String>();
+    groupSet.add("group1");
+
+    Injector injector = Guice.createInjector(Modules.override(new InMemoryDefaultTestModule()).with(new MockModule()));
+
+    // create mocks
+
+    LdapBatchDto ldapBatchDto = createNiceMock(LdapBatchDto.class);
+
+
+    Capture<LdapBatchDto> ldapBatchDtoCapture = new Capture<LdapBatchDto>();
+
+    // set expectations
+    expect(ldapDataPopulator.synchronizeAllLdapUsers(capture(ldapBatchDtoCapture))).andReturn(ldapBatchDto);
+    expect(ldapDataPopulator.synchronizeAllLdapGroups(capture(ldapBatchDtoCapture))).andReturn(ldapBatchDto);
+
+    expect(ldapDataPopulator.synchronizeExistingLdapUsers(capture(ldapBatchDtoCapture))).andReturn(ldapBatchDto);
+    expect(ldapDataPopulator.synchronizeExistingLdapGroups(capture(ldapBatchDtoCapture))).andReturn(ldapBatchDto);
+
+    expect(ldapDataPopulator.synchronizeLdapUsers(eq(userSet), capture(ldapBatchDtoCapture))).andReturn(ldapBatchDto);
+    expect(ldapDataPopulator.synchronizeLdapGroups(eq(groupSet), capture(ldapBatchDtoCapture))).andReturn(ldapBatchDto);
+
+    users.processLdapSync(capture(ldapBatchDtoCapture));
+    expectLastCall().anyTimes();
+
+    //replay
+    replay(ldapDataPopulator, clusters, actionDBAccessor, ambariMetaInfo, users, ldapBatchDto);
+
+    AmbariManagementControllerImpl controller = injector.getInstance(AmbariManagementControllerImpl.class);
+
+    LdapSyncRequest userRequest  = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.ALL);
+    LdapSyncRequest groupRequest = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.ALL);
+
+    controller.synchronizeLdapUsersAndGroups(userRequest, groupRequest);
+
+    userRequest  = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.EXISTING);
+    groupRequest = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.EXISTING);
+
+    controller.synchronizeLdapUsersAndGroups(userRequest, groupRequest);
+
+    userRequest  = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC, userSet);
+    groupRequest = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC, groupSet);
+
+    controller.synchronizeLdapUsersAndGroups(userRequest, groupRequest);
+
+    verify(ldapDataPopulator, clusters, users, ldapBatchDto);
+  }
+
+  private class MockModule implements Module {
+
+    @Override
+    public void configure(Binder binder) {
+      binder.bind(AmbariLdapDataPopulator.class).toInstance(ldapDataPopulator);
+      binder.bind(Clusters.class).toInstance(clusters);
+      binder.bind(ActionDBAccessorImpl.class).toInstance(actionDBAccessor);
+      binder.bind(AmbariMetaInfo.class).toInstance(ambariMetaInfo);
+      binder.bind(Users.class).toInstance(users);
+    }
+  }
 
   private class NestedTestClass extends AmbariManagementControllerImpl {
 

+ 84 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/LdapSyncRequestTest.java

@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.controller;
+
+import org.apache.ambari.server.orm.entities.LdapSyncSpecEntity;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * LdapSyncRequest tests.
+ */
+public class LdapSyncRequestTest {
+  @Test
+  public void testAddPrincipalNames() throws Exception {
+    Set<String> names = new HashSet<String>();
+    names.add("name1");
+
+    LdapSyncRequest request = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC,names);
+
+    names = new HashSet<String>();
+    names.add("name2");
+    names.add("name3");
+
+    request.addPrincipalNames(names);
+
+    Set<String> principalNames = request.getPrincipalNames();
+    Assert.assertEquals(3, principalNames.size());
+    Assert.assertTrue(principalNames.contains("name1"));
+    Assert.assertTrue(principalNames.contains("name2"));
+    Assert.assertTrue(principalNames.contains("name3"));
+  }
+
+  @Test
+  public void testGetPrincipalNames() throws Exception {
+    Set<String> names = new HashSet<String>();
+    names.add("name1");
+    names.add("name2");
+    names.add("name3");
+
+    LdapSyncRequest request = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC,names);
+
+    Set<String> principalNames = request.getPrincipalNames();
+    Assert.assertEquals(3, principalNames.size());
+    Assert.assertTrue(principalNames.contains("name1"));
+    Assert.assertTrue(principalNames.contains("name2"));
+    Assert.assertTrue(principalNames.contains("name3"));
+  }
+
+  @Test
+  public void testGetType() throws Exception {
+    Set<String> names = new HashSet<String>();
+
+    LdapSyncRequest request = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.SPECIFIC, names);
+
+    Assert.assertEquals(LdapSyncSpecEntity.SyncType.SPECIFIC, request.getType());
+
+    request = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.ALL);
+
+    Assert.assertEquals(LdapSyncSpecEntity.SyncType.ALL, request.getType());
+
+    request = new LdapSyncRequest(LdapSyncSpecEntity.SyncType.EXISTING);
+
+    Assert.assertEquals(LdapSyncSpecEntity.SyncType.EXISTING, request.getType());
+  }
+}

+ 24 - 4
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProviderTest.java

@@ -18,6 +18,7 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
@@ -29,6 +30,7 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
 
 /**
@@ -37,7 +39,9 @@ import static org.easymock.EasyMock.createNiceMock;
 public class LdapSyncEventResourceProviderTest {
   @Test
   public void testCreateResources() throws Exception {
-    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider();
+    AmbariManagementController amc = createMock(AmbariManagementController.class);
+
+    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider(amc);
 
     Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
     Map<String, Object> propertyMap = new HashMap<String, Object>();
@@ -48,11 +52,16 @@ public class LdapSyncEventResourceProviderTest {
     properties.add(propertyMap);
 
     provider.createResources(PropertyHelper.getCreateRequest(properties, null));
+
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(1, resources.size());
   }
 
   @Test
   public void testGetResources() throws Exception {
-    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider();
+    AmbariManagementController amc = createMock(AmbariManagementController.class);
+
+    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider(amc);
 
     Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
     Map<String, Object> propertyMap = new HashMap<String, Object>();
@@ -70,7 +79,9 @@ public class LdapSyncEventResourceProviderTest {
 
   @Test
   public void testUpdateResources() throws Exception {
-    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider();
+    AmbariManagementController amc = createMock(AmbariManagementController.class);
+
+    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider(amc);
 
     Request request = createNiceMock(Request.class);
 
@@ -84,7 +95,9 @@ public class LdapSyncEventResourceProviderTest {
 
   @Test
   public void testDeleteResources() throws Exception {
-    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider();
+    AmbariManagementController amc = createMock(AmbariManagementController.class);
+
+    LdapSyncEventResourceProvider provider = new TestLdapSyncEventResourceProvider(amc);
 
     Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
     Map<String, Object> propertyMap = new HashMap<String, Object>();
@@ -107,6 +120,13 @@ public class LdapSyncEventResourceProviderTest {
 
 
   protected static class TestLdapSyncEventResourceProvider extends LdapSyncEventResourceProvider {
+    /**
+     * Construct a event resource provider.
+     */
+    public TestLdapSyncEventResourceProvider(AmbariManagementController managementController) {
+      super(managementController);
+    }
+
     @Override
     protected void ensureEventProcessor() {
     }

+ 13 - 34
ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntityTest.java

@@ -37,19 +37,19 @@ public class LdapSyncEventEntityTest {
   @Test
   public void testSetGetStatus() throws Exception {
     LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
-    Assert.assertEquals(LdapSyncEventEntity.Status.Pending, event.getStatus());
+    Assert.assertEquals(LdapSyncEventEntity.Status.PENDING, event.getStatus());
 
-    event.setStatus(LdapSyncEventEntity.Status.Running);
-    Assert.assertEquals(LdapSyncEventEntity.Status.Running, event.getStatus());
+    event.setStatus(LdapSyncEventEntity.Status.RUNNING);
+    Assert.assertEquals(LdapSyncEventEntity.Status.RUNNING, event.getStatus());
 
-    event.setStatus(LdapSyncEventEntity.Status.Complete);
-    Assert.assertEquals(LdapSyncEventEntity.Status.Complete, event.getStatus());
+    event.setStatus(LdapSyncEventEntity.Status.COMPLETE);
+    Assert.assertEquals(LdapSyncEventEntity.Status.COMPLETE, event.getStatus());
 
-    event.setStatus(LdapSyncEventEntity.Status.Error);
-    Assert.assertEquals(LdapSyncEventEntity.Status.Error, event.getStatus());
+    event.setStatus(LdapSyncEventEntity.Status.ERROR);
+    Assert.assertEquals(LdapSyncEventEntity.Status.ERROR, event.getStatus());
 
-    event.setStatus(LdapSyncEventEntity.Status.Pending);
-    Assert.assertEquals(LdapSyncEventEntity.Status.Pending, event.getStatus());
+    event.setStatus(LdapSyncEventEntity.Status.PENDING);
+    Assert.assertEquals(LdapSyncEventEntity.Status.PENDING, event.getStatus());
   }
 
   @Test
@@ -62,8 +62,8 @@ public class LdapSyncEventEntityTest {
   @Test
   public void testSetGetSpecs() throws Exception {
     LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
-    LdapSyncSpecEntity spec = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Groups,
-        LdapSyncSpecEntity.SyncType.All, Collections.<String>emptyList());
+    LdapSyncSpecEntity spec = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.GROUPS,
+        LdapSyncSpecEntity.SyncType.ALL, Collections.<String>emptyList());
 
     event.setSpecs(Collections.singletonList(spec));
 
@@ -87,13 +87,6 @@ public class LdapSyncEventEntityTest {
     Assert.assertEquals(90009000L, event.getEndTime());
   }
 
-  @Test
-  public void testSetGetUsersFetched() throws Exception {
-    LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
-    event.setUsersFetched(99);
-    Assert.assertEquals(Integer.valueOf(99), event.getUsersFetched());
-  }
-
   @Test
   public void testSetGetUsersCreated() throws Exception {
     LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
@@ -115,13 +108,6 @@ public class LdapSyncEventEntityTest {
     Assert.assertEquals(Integer.valueOf(96), event.getUsersRemoved());
   }
 
-  @Test
-  public void testSetGetGroupsFetched() throws Exception {
-    LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
-    event.setGroupsFetched(95);
-    Assert.assertEquals(Integer.valueOf(95), event.getGroupsFetched());
-  }
-
   @Test
   public void testSetGetGroupsCreated() throws Exception {
     LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
@@ -143,13 +129,6 @@ public class LdapSyncEventEntityTest {
     Assert.assertEquals(Integer.valueOf(92), event.getGroupsRemoved());
   }
 
-  @Test
-  public void testSetGetMembershipsFetched() throws Exception {
-    LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
-    event.setMembershipsFetched(91);
-    Assert.assertEquals(Integer.valueOf(91), event.getMembershipsFetched());
-  }
-
   @Test
   public void testSetGetMembershipsCreated() throws Exception {
     LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
@@ -160,7 +139,7 @@ public class LdapSyncEventEntityTest {
   @Test
   public void testSetGetMembershipsUpdated() throws Exception {
     LdapSyncEventEntity event = new LdapSyncEventEntity(1L);
-    event.setMembershipsUpdated(99);
-    Assert.assertEquals(Integer.valueOf(99), event.getMembershipsUpdated());
+    event.setMembershipsRemoved(99);
+    Assert.assertEquals(Integer.valueOf(99), event.getMembershipsRemoved());
   }
 }

+ 20 - 20
ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntityTest.java

@@ -31,24 +31,24 @@ import java.util.List;
 public class LdapSyncSpecEntityTest {
   @Test
   public void testGetPrincipalType() throws Exception {
-    LdapSyncSpecEntity entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-        LdapSyncSpecEntity.SyncType.All, Collections.<String>emptyList());
-    Assert.assertEquals(LdapSyncSpecEntity.PrincipalType.Users, entity.getPrincipalType());
+    LdapSyncSpecEntity entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+        LdapSyncSpecEntity.SyncType.ALL, Collections.<String>emptyList());
+    Assert.assertEquals(LdapSyncSpecEntity.PrincipalType.USERS, entity.getPrincipalType());
 
-    entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Groups,
-        LdapSyncSpecEntity.SyncType.All, Collections.<String>emptyList());
-    Assert.assertEquals(LdapSyncSpecEntity.PrincipalType.Groups, entity.getPrincipalType());
+    entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.GROUPS,
+        LdapSyncSpecEntity.SyncType.ALL, Collections.<String>emptyList());
+    Assert.assertEquals(LdapSyncSpecEntity.PrincipalType.GROUPS, entity.getPrincipalType());
   }
 
   @Test
   public void testGetSyncType() throws Exception {
-    LdapSyncSpecEntity entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-        LdapSyncSpecEntity.SyncType.All, Collections.<String>emptyList());
-    Assert.assertEquals(LdapSyncSpecEntity.SyncType.All, entity.getSyncType());
+    LdapSyncSpecEntity entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+        LdapSyncSpecEntity.SyncType.ALL, Collections.<String>emptyList());
+    Assert.assertEquals(LdapSyncSpecEntity.SyncType.ALL, entity.getSyncType());
 
-    entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-        LdapSyncSpecEntity.SyncType.Existing, Collections.<String>emptyList());
-    Assert.assertEquals(LdapSyncSpecEntity.SyncType.Existing, entity.getSyncType());
+    entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+        LdapSyncSpecEntity.SyncType.EXISTING, Collections.<String>emptyList());
+    Assert.assertEquals(LdapSyncSpecEntity.SyncType.EXISTING, entity.getSyncType());
   }
 
   @Test
@@ -57,16 +57,16 @@ public class LdapSyncSpecEntityTest {
     names.add("joe");
     names.add("fred");
 
-    LdapSyncSpecEntity entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-        LdapSyncSpecEntity.SyncType.Specific, names);
+    LdapSyncSpecEntity entity = new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+        LdapSyncSpecEntity.SyncType.SPECIFIC, names);
     Assert.assertEquals(names, entity.getPrincipalNames());
   }
 
   @Test
   public void testIllegalConstruction() throws Exception {
     try {
-      new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-          LdapSyncSpecEntity.SyncType.Specific, Collections.<String>emptyList());
+      new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+          LdapSyncSpecEntity.SyncType.SPECIFIC, Collections.<String>emptyList());
       Assert.fail("expected IllegalArgumentException");
     } catch (IllegalArgumentException e) {
       // expected
@@ -77,16 +77,16 @@ public class LdapSyncSpecEntityTest {
     names.add("fred");
 
     try {
-      new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-          LdapSyncSpecEntity.SyncType.All, names);
+      new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+          LdapSyncSpecEntity.SyncType.ALL, names);
       Assert.fail("expected IllegalArgumentException");
     } catch (IllegalArgumentException e) {
       // expected
     }
 
     try {
-      new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.Users,
-          LdapSyncSpecEntity.SyncType.Existing, names);
+      new LdapSyncSpecEntity(LdapSyncSpecEntity.PrincipalType.USERS,
+          LdapSyncSpecEntity.SyncType.EXISTING, names);
       Assert.fail("expected IllegalArgumentException");
     } catch (IllegalArgumentException e) {
       // expected