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

Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/cb656120
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/cb656120
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/cb656120

Branch: refs/heads/branch-alerts-dev
Commit: cb6561206244ca32ac3193bfb16fcc9f3a080100
Parents: 749bb28
Author: tbeerbower <[email protected]>
Authored: Wed Sep 24 21:12:58 2014 -0700
Committer: tbeerbower <[email protected]>
Committed: Thu Sep 25 13:14:56 2014 -0700

----------------------------------------------------------------------
 .../controller/AmbariManagementController.java  |  10 +-
 .../AmbariManagementControllerImpl.java         |  40 +++--
 .../server/controller/LdapSyncRequest.java      |  94 +++++++++++
 .../internal/ControllerResourceProvider.java    |  14 +-
 .../internal/DefaultProviderModule.java         |   2 +-
 .../internal/LdapSyncEventResourceProvider.java | 124 +++++++++++----
 .../ambari/server/orm/dao/PermissionDAO.java    |   2 +-
 .../orm/entities/LdapSyncEventEntity.java       | 127 ++++++++++-----
 .../server/orm/entities/LdapSyncSpecEntity.java |  24 +--
 .../AmbariManagementControllerImplTest.java     | 154 +++++++++++++++----
 .../server/controller/LdapSyncRequestTest.java  |  84 ++++++++++
 .../LdapSyncEventResourceProviderTest.java      |  28 +++-
 .../orm/entities/LdapSyncEventEntityTest.java   |  47 ++----
 .../orm/entities/LdapSyncSpecEntityTest.java    |  40 ++---
 14 files changed, 603 insertions(+), 187 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
index b932cbb..c37ee79 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
+++ 
b/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.

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 8c0dfeb..3142b66 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ 
b/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 {

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/controller/LdapSyncRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/LdapSyncRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/LdapSyncRequest.java
new file mode 100644
index 0000000..02cf3f0
--- /dev/null
+++ 
b/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;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ControllerResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ControllerResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ControllerResourceProvider.java
index 129824f..afb9ae9 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ControllerResourceProvider.java
+++ 
b/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);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
index 99ac0f1..ab89db2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
+++ 
b/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);

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
index 188c071..f7499fa 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
+++ 
b/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());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
index 97af522..939c32b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PermissionDAO.java
+++ 
b/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) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntity.java
index 9ce3ee0..5b361c3 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntity.java
+++ 
b/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
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntity.java
index 027a4ce..d8e5b8b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntity.java
+++ 
b/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());
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index ecc2c0d..affa4c9 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ 
b/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 {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/test/java/org/apache/ambari/server/controller/LdapSyncRequestTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/LdapSyncRequestTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/LdapSyncRequestTest.java
new file mode 100644
index 0000000..a159671
--- /dev/null
+++ 
b/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());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProviderTest.java
index 92bd7a4..523753d 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProviderTest.java
+++ 
b/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() {
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntityTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntityTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntityTest.java
index 66f9d6d..109988f 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncEventEntityTest.java
+++ 
b/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));
 
@@ -88,13 +88,6 @@ public class LdapSyncEventEntityTest {
   }
 
   @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);
     event.setUsersCreated(98);
@@ -116,13 +109,6 @@ public class LdapSyncEventEntityTest {
   }
 
   @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);
     event.setGroupsCreated(94);
@@ -144,13 +130,6 @@ public class LdapSyncEventEntityTest {
   }
 
   @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);
     event.setMembershipsCreated(90);
@@ -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());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cb656120/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntityTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntityTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntityTest.java
index 468281f..b9e000e 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/LdapSyncSpecEntityTest.java
+++ 
b/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

Reply via email to