AMBARI-15646. Audit Log Code Cleanup & Safety. (Daniel Gergely via stoader)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6320d589 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6320d589 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6320d589 Branch: refs/heads/trunk Commit: 6320d589f942b41cdab34c1de241423ccb5b4752 Parents: f0645b6 Author: Daniel Gergely <[email protected]> Authored: Thu Apr 7 18:48:43 2016 +0200 Committer: Toader, Sebastian <[email protected]> Committed: Thu Apr 7 20:11:29 2016 +0200 ---------------------------------------------------------------------- .../actionmanager/ActionDBAccessorImpl.java | 277 +++++++++++++++---- .../ambari/server/api/services/BaseService.java | 5 +- .../server/api/services/LogoutService.java | 3 + .../server/audit/AuditLoggerDefaultImpl.java | 13 +- .../ambari/server/audit/AuditLoggerModule.java | 95 +++---- .../audit/event/OperationStatusAuditEvent.java | 14 +- .../audit/event/TaskStatusAuditEvent.java | 13 +- .../MembershipChangeRequestAuditEvent.java | 4 +- .../StartOperationRequestAuditEvent.java | 17 +- .../audit/request/RequestAuditEventCreator.java | 59 ---- .../audit/request/RequestAuditLoggerImpl.java | 1 + .../eventcreator/AlertGroupEventCreator.java | 59 +--- .../eventcreator/AlertTargetEventCreator.java | 66 ++--- .../eventcreator/BlueprintEventCreator.java | 1 - .../BlueprintExportEventCreator.java | 1 - .../eventcreator/ComponentEventCreator.java | 28 +- .../ConfigurationChangeEventCreator.java | 12 +- .../eventcreator/CredentialEventCreator.java | 24 +- .../eventcreator/DefaultEventCreator.java | 1 - .../request/eventcreator/GroupEventCreator.java | 18 +- .../request/eventcreator/HostEventCreator.java | 22 +- .../eventcreator/MemberEventCreator.java | 38 +-- .../eventcreator/PrivilegeEventCreator.java | 16 +- .../RecommendationIgnoreEventCreator.java | 1 - .../eventcreator/RepositoryEventCreator.java | 37 +-- .../RepositoryVersionEventCreator.java | 44 +-- .../eventcreator/RequestAuditEventCreator.java | 59 ++++ .../RequestAuditEventCreatorHelper.java | 112 ++++++++ .../eventcreator/RequestEventCreator.java | 1 - .../ServiceConfigDownloadEventCreator.java | 1 - .../eventcreator/ServiceEventCreator.java | 17 +- .../eventcreator/UnauthorizedEventCreator.java | 1 - .../eventcreator/UpgradeEventCreator.java | 22 +- .../eventcreator/UpgradeItemEventCreator.java | 22 +- .../request/eventcreator/UserEventCreator.java | 15 +- .../ValidationIgnoreEventCreator.java | 1 - .../eventcreator/ViewInstanceEventCreator.java | 37 +-- .../eventcreator/ViewPrivilegeEventCreator.java | 35 +-- .../server/cleanup/ClasspathScannerUtils.java | 4 +- .../internal/AlertGroupResourceProvider.java | 14 +- .../internal/AlertTargetResourceProvider.java | 18 +- .../internal/GroupResourceProvider.java | 6 +- .../internal/HostComponentResourceProvider.java | 30 +- .../internal/MemberResourceProvider.java | 4 +- .../internal/UpgradeItemResourceProvider.java | 10 +- .../internal/UpgradeResourceProvider.java | 28 +- .../internal/UserResourceProvider.java | 18 +- .../dispatchers/EmailDispatcher.java | 2 +- .../AmbariAuthenticationFilter.java | 21 +- .../AmbariAuthorizationFilter.java | 35 ++- .../authorization/PermissionHelper.java | 3 + .../services/AlertNoticeDispatchService.java | 2 +- .../server/agent/TestHeartbeatHandler.java | 7 + .../audit/ActionDBAAccessorAuditlogTest.java | 45 +++ .../audit/OperationStatusAuditEventTest.java | 3 +- .../audit/request/AbstractBaseCreator.java | 1 + .../audit/request/RequestAuditLogModule.java | 1 + .../AmbariManagementControllerTest.java | 3 + .../internal/UpgradeResourceProviderTest.java | 3 + .../server/orm/InMemoryDefaultTestModule.java | 4 +- .../AmbariAuthenticationFilterTest.java | 3 + .../AmbariAuthorizationFilterTest.java | 6 +- 62 files changed, 806 insertions(+), 657 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java index 79d3470..06311c2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java @@ -23,13 +23,10 @@ import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.Objects; import java.util.concurrent.TimeUnit; import org.apache.ambari.annotations.Experimental; @@ -38,9 +35,9 @@ import org.apache.ambari.annotations.TransactionalLock; import org.apache.ambari.annotations.TransactionalLock.LockArea; import org.apache.ambari.annotations.TransactionalLock.LockType; import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.Role; import org.apache.ambari.server.agent.CommandReport; import org.apache.ambari.server.agent.ExecutionCommand; -import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.AuditLogger; import org.apache.ambari.server.audit.event.OperationStatusAuditEvent; @@ -48,6 +45,7 @@ import org.apache.ambari.server.audit.event.TaskStatusAuditEvent; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.CalculatedStatus; import org.apache.ambari.server.events.HostRemovedEvent; +import org.apache.ambari.server.events.ServiceComponentUninstalledEvent; import org.apache.ambari.server.events.publishers.AmbariEventPublisher; import org.apache.ambari.server.orm.dao.ClusterDAO; import org.apache.ambari.server.orm.dao.ExecutionCommandDAO; @@ -65,6 +63,7 @@ import org.apache.ambari.server.orm.entities.RequestEntity; import org.apache.ambari.server.orm.entities.RequestScheduleEntity; import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity; import org.apache.ambari.server.orm.entities.StageEntity; +import org.apache.ambari.server.security.authorization.AuthorizationHelper; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Host; import org.apache.ambari.server.utils.LoopBody; @@ -132,17 +131,12 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { AuditLogger auditLogger; /** - * Caches to store current request and task statuses. - * It is used for avoiding audit log entry duplication + * Cache for auditlog. It stores a {@link RequestDetails} object for every requests. + * {@link RequestDetails} contains the previous status of the request and a map for tasks. + * A task has a {@link RequestDetails.Component} key and the value of that is the previous status of the task. + * {@link RequestDetails.Component} contains the component name and the host name */ - private Map<Long, HostRoleStatus> temporaryStatusCache = new HashMap<Long, HostRoleStatus>(); - private Map<Long, HostRoleStatus> temporaryTaskStatusCache = new HashMap<Long, HostRoleStatus>(); - - /** - * Stores the host role command entities that are not completed for a request id - * It is used to calculate the summary state of the request for audit logging - */ - private Map<Long, Map<Long, HostRoleStatus>> tasksForRequest = new HashMap<>(); + private Cache<Long,RequestDetails> auditlogRequestCache = CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.MINUTES).concurrencyLevel(4).build(); private Cache<Long, HostRoleCommand> hostRoleCommandCache; private long cacheLimit; //may be exceeded to store tasks from one request @@ -333,6 +327,8 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { //TODO wire request to cluster List<StageEntity> stageEntities = new ArrayList<StageEntity>(request.getStages().size()); + addRequestToAuditlogCache(request); + for (Stage stage : request.getStages()) { StageEntity stageEntity = stage.constructNewPersistenceEntity(); stageEntities.add(stageEntity); @@ -517,11 +513,11 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { long[] requestStageIds = StageUtils.getRequestStage(actionId); long requestId = requestStageIds[0]; long stageId = requestStageIds[1]; + if(statusChanged) { + auditLog(commandEntity, requestId); + } if (requestDAO.getLastStageId(requestId).equals(stageId)) { requestsToCheck.add(requestId); - if(statusChanged) { - auditLog(commandEntity, requestId); // wrong requestId !!! - } } } } @@ -810,74 +806,119 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { } /** - * AuditLog operation status change + * Updates auditlog cache and returns the status of the latest task for the given component on the given host. + * @param commandEntity new entity with the new status. It also holds the component and the hostname * @param requestId + * @return */ - private void auditLog(HostRoleCommandEntity commandEntity, Long requestId) { - if(!auditLogger.isEnabled()) { - return; - } + private HostRoleStatus updateAuditlogCache(HostRoleCommandEntity commandEntity, Long requestId) { - if(requestId != null) { + RequestDetails details = auditlogRequestCache.getIfPresent(requestId); + if(details == null) { + return null; + } - HostRoleStatus calculatedStatus = calculateStatus(commandEntity, requestId); + RequestDetails.Component component = new RequestDetails.Component(commandEntity.getRole(), commandEntity.getHostName()); - if (!temporaryStatusCache.containsKey(requestId) || temporaryStatusCache.get(requestId) != calculatedStatus) { - RequestEntity request = requestDAO.findByPK(requestId); - String context = request != null ? request.getRequestContext() : null; - AuditEvent auditEvent = OperationStatusAuditEvent.builder() - .withRequestId(String.valueOf(requestId)) - .withStatus(String.valueOf(calculatedStatus)) - .withRequestContext(context) - .withTimestamp(System.currentTimeMillis()) - .build(); - auditLogger.log(auditEvent); + HostRoleStatus lastTaskStatus = null; + if(details.getTasks().containsKey(component)) { + lastTaskStatus = details.getTasks().get(component); + } + details.getTasks().put(component, commandEntity.getStatus()); + return lastTaskStatus; + } - temporaryStatusCache.put(requestId, calculatedStatus); + /** + * Adds request to auditlog cache + * @param request + */ + private void addRequestToAuditlogCache(Request request) { + if(!auditLogger.isEnabled()) { + return; + } + if(auditlogRequestCache.getIfPresent(request.getRequestId()) == null) { + int numberOfTasks = 0; + for (Stage stage : request.getStages()) { + numberOfTasks += stage.getOrderedHostRoleCommands().size(); } + RequestDetails requestDetails = new RequestDetails(); + requestDetails.setNumberOfTasks(numberOfTasks); + requestDetails.setUserName(AuthorizationHelper.getAuthenticatedName()); + auditlogRequestCache.put(request.getRequestId(), requestDetails); } - logTask(commandEntity, requestId); } /** - * Calculates summary status for the given request id for the new command entity status - * @param commandEntity + * AuditLog operation status change * @param requestId - * @return */ - private HostRoleStatus calculateStatus(HostRoleCommandEntity commandEntity, Long requestId) { - if(!tasksForRequest.containsKey(requestId)) { - tasksForRequest.put(requestId, new HashMap<Long, HostRoleStatus>()); + private void auditLog(HostRoleCommandEntity commandEntity, Long requestId) { + if(!auditLogger.isEnabled()) { + return; } - tasksForRequest.get(requestId).put(commandEntity.getTaskId(), commandEntity.getStatus()); - - HostRoleStatus calculatedStatus = CalculatedStatus.calculateSummaryStatusOfStage(CalculatedStatus.calculateStatusCounts(tasksForRequest.get(requestId).values()), tasksForRequest.get(requestId).size(), false); - - // if all task status is completed, we can remove it from the container - boolean hasInProgress = false; - for(HostRoleStatus hrcs : tasksForRequest.get(requestId).values()) { - if(!hrcs.isCompletedState()) { - hasInProgress = true; - break; + if(requestId != null) { + HostRoleStatus lastTaskStatus = updateAuditlogCache(commandEntity, requestId); + + // details must not be null + RequestDetails details = auditlogRequestCache.getIfPresent(requestId); + if (details != null) { + HostRoleStatus calculatedStatus = calculateStatus(requestId, details.getNumberOfTasks()); + + if (details.getLastStatus() != calculatedStatus) { + RequestEntity request = requestDAO.findByPK(requestId); + String context = request != null ? request.getRequestContext() : null; + AuditEvent auditEvent = OperationStatusAuditEvent.builder() + .withRequestId(String.valueOf(requestId)) + .withStatus(String.valueOf(calculatedStatus)) + .withRequestContext(context) + .withUserName(details.getUserName()) + .withTimestamp(System.currentTimeMillis()) + .build(); + auditLogger.log(auditEvent); + + details.setLastStatus(calculatedStatus); + } } + logTask(commandEntity, requestId, lastTaskStatus); } - if(!hasInProgress) { - tasksForRequest.remove(requestId); + } + + /** + * Calculates summary status for the given request + * @param requestId + * @return + */ + private HostRoleStatus calculateStatus(Long requestId, int numberOfTasks) { + RequestDetails details = auditlogRequestCache.getIfPresent(requestId); + if(details == null) { + return HostRoleStatus.QUEUED; } - return calculatedStatus; + Collection<HostRoleStatus> taskStatuses = details.getTaskStatuses(); + return CalculatedStatus.calculateSummaryStatusOfStage(CalculatedStatus.calculateStatusCounts(taskStatuses), numberOfTasks, false); } /** * Logs task status change * @param commandEntity * @param requestId + * @param lastTaskStatus */ - private void logTask(HostRoleCommandEntity commandEntity, Long requestId) { - if(!temporaryTaskStatusCache.containsKey(commandEntity.getTaskId()) || temporaryTaskStatusCache.get(commandEntity.getTaskId()) != commandEntity.getStatus() ) { + private void logTask(HostRoleCommandEntity commandEntity, Long requestId, HostRoleStatus lastTaskStatus) { + + RequestDetails.Component component = new RequestDetails.Component(commandEntity.getRole(), commandEntity.getHostName()); + RequestDetails details = auditlogRequestCache.getIfPresent(requestId); + if(details == null) { + return; + } + + HostRoleStatus cachedStatus = details.getTasks().get(component); + + if(lastTaskStatus == null || cachedStatus != lastTaskStatus ) { AuditEvent taskEvent = TaskStatusAuditEvent.builder() .withTaskId(String.valueOf(commandEntity.getTaskId())) .withHostName(commandEntity.getHostName()) + .withUserName(details.getUserName()) .withOperation(commandEntity.getRoleCommand().toString() + " " + commandEntity.getRole().toString()) .withDetails(commandEntity.getCommandDetail()) .withStatus(commandEntity.getStatus().toString()) @@ -886,7 +927,125 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { .build(); auditLogger.log(taskEvent); - temporaryTaskStatusCache.put(commandEntity.getTaskId(), commandEntity.getStatus()); + } + } + + /** + * The purpose of this nested class is to store details about the request: lastStatus and the list of tasks + */ + private static class RequestDetails { + /** + * Last summary status of the request + */ + HostRoleStatus lastStatus = null; + + /** + * The number of tasks that can be found in the request + */ + int numberOfTasks = 0; + + /** + * The user who issued the request + */ + String userName; + + /** + * Component and the status of the belonging task + * Size of this container might be less than {@link RequestDetails#numberOfTasks} + */ + Map<Component, HostRoleStatus> tasks = new HashMap<>(); + + public HostRoleStatus getLastStatus() { + return lastStatus; + } + + public void setLastStatus(HostRoleStatus lastStatus) { + this.lastStatus = lastStatus; + } + + public int getNumberOfTasks() { + return numberOfTasks; + } + + public void setNumberOfTasks(int numberOfTasks) { + this.numberOfTasks = numberOfTasks; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Map<Component, HostRoleStatus> getTasks() { + return tasks; + } + + /** + * Returns the list of statuses from {@link RequestDetails#tasks} + * @return + */ + public Collection<HostRoleStatus> getTaskStatuses() { + return getTasks().values(); + } + + /** + * This nested class is the key for the {@link RequestDetails#tasks} map + */ + static class Component { + /** + * Component name + */ + private final Role role; + /** + * Host name + */ + private final String hostName; + Component(Role role, String hostName) { + this.role = role; + this.hostName = hostName; + } + + public Role getRole() { + return role; + } + + public String getHostName() { + return hostName; + } + + /** + * Hash code generation + * @return + */ + @Override + public final int hashCode() { + int hash = 7; + String roleStr = role == null ? "null" : role.toString(); + String hostNameStr = hostName == null ? "null" : hostName; + String str = roleStr.concat(hostNameStr); + for (int i = 0; i < str.length(); i++) { + hash = hash*31 + str.charAt(i); + } + return hash; + } + + /** + * Two components are equal if their component name and host name are the same + * @param other + * @return + */ + @Override + public final boolean equals(final Object other) { + if(other instanceof Component) { + Component comp = (Component) other; + return Objects.equals(comp.role, role) && Objects.equals(comp.hostName, hostName); + } + + return false; + } } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java index 2e5b920..b7156bf 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java @@ -117,7 +117,10 @@ public abstract class BaseService { headers, requestBody, uriInfo, requestType, resource); result = request.process(); - requestAuditLogger.log(request, result); + // if it is not OK, then it is logged below + if(ResultStatus.STATUS.OK.equals(result.getStatus().getStatus())) { + requestAuditLogger.log(request, result); + } } if(requestBodySet.isEmpty() || !ResultStatus.STATUS.OK.equals(result.getStatus().getStatus())) { http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java index 3b449ca..02403f9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java @@ -57,6 +57,9 @@ public class LogoutService { * @param servletRequest */ private void auditLog(HttpServletRequest servletRequest) { + if(!auditLogger.isEnabled()) { + return; + } LogoutAuditEvent logoutEvent = LogoutAuditEvent.builder() .withTimestamp(System.currentTimeMillis()) .withRemoteIp(RequestUtils.getRemoteAddress(servletRequest)) http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerDefaultImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerDefaultImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerDefaultImpl.java index 1cfb740..ea6524f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerDefaultImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerDefaultImpl.java @@ -44,7 +44,13 @@ public class AuditLoggerDefaultImpl implements AuditLogger { */ private final boolean isEnabled; - private ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal<>(); + private ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal<DateFormat>(){ + @Override + protected DateFormat initialValue() { + //2016-03-11T10:42:36.376Z + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); + } + }; @Inject public AuditLoggerDefaultImpl(Configuration configuration) { @@ -61,11 +67,6 @@ public class AuditLoggerDefaultImpl implements AuditLogger { return; } - if(dateFormatThreadLocal.get() == null) { - //2016-03-11T10:42:36.376Z - dateFormatThreadLocal.set(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")); - } - Date date = new Date(event.getTimestamp()); LOG.info("{}, {}", dateFormatThreadLocal.get().format(date), event.getAuditMessage()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java index b20714b..1ab53a9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/AuditLoggerModule.java @@ -18,41 +18,52 @@ package org.apache.ambari.server.audit; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.apache.ambari.server.audit.request.eventcreator.RequestAuditEventCreator; import org.apache.ambari.server.audit.request.RequestAuditLogger; import org.apache.ambari.server.audit.request.RequestAuditLoggerImpl; -import org.apache.ambari.server.audit.request.eventcreator.AlertGroupEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.AlertTargetEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.BlueprintEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.BlueprintExportEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ComponentEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ConfigurationChangeEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.CredentialEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.DefaultEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.GroupEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.HostEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.MemberEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.PrivilegeEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.RecommendationIgnoreEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.RepositoryEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.RepositoryVersionEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.RequestEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ServiceConfigDownloadEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ServiceEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.UnauthorizedEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.UpgradeEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.UpgradeItemEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.UserEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ValidationIgnoreEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ViewInstanceEventCreator; -import org.apache.ambari.server.audit.request.eventcreator.ViewPrivilegeEventCreator; +import org.apache.ambari.server.cleanup.ClasspathScannerUtils; import com.google.inject.AbstractModule; +import com.google.inject.Scopes; import com.google.inject.multibindings.Multibinder; import com.google.inject.name.Names; public class AuditLoggerModule extends AbstractModule { + /** + * Selectors identifying objects to be bound. + * + * @return a list with interface and annotation types + */ + protected List<Class> getSelectors() { + List<Class> selectorList = new ArrayList<>(); + selectorList.add(RequestAuditEventCreator.class); + return selectorList; + } + + /** + * Gets the list of types to be excluded from bindings. + * + * @return a list with types to be left out from dynamic bindings + */ + protected List<Class> getExclusions() { + return Collections.emptyList(); + } + + /** + * Returns the package to be scanned for bindings of this module. + * + * @return the name of the package to be scanned + */ + protected String getPackageToScan() { + return RequestAuditEventCreator.class.getPackage().getName(); + } + @Override protected void configure() { bind(AuditLogger.class).to(AsyncAuditLogger.class); @@ -61,34 +72,12 @@ public class AuditLoggerModule extends AbstractModule { bind(AuditLogger.class).annotatedWith(Names.named(AsyncAuditLogger.InnerLogger)).to(AuditLoggerDefaultImpl.class); // binding for audit event creators - Multibinder<RequestAuditEventCreator> auditLogEventCreatorBinder = Multibinder.newSetBinder(binder(), RequestAuditEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(DefaultEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ComponentEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ServiceEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(UnauthorizedEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ConfigurationChangeEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(UserEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(GroupEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(MemberEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(PrivilegeEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(BlueprintExportEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ServiceConfigDownloadEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(BlueprintEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ViewInstanceEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ViewPrivilegeEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(RepositoryEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(RepositoryVersionEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(AlertGroupEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(AlertTargetEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(HostEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(UpgradeEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(UpgradeItemEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(RecommendationIgnoreEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(ValidationIgnoreEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(CredentialEventCreator.class); - auditLogEventCreatorBinder.addBinding().to(RequestEventCreator.class); + Multibinder<RequestAuditEventCreator> multiBinder = Multibinder.newSetBinder(binder(), RequestAuditEventCreator.class); + Set<Class> bindingSet = ClasspathScannerUtils.findOnClassPath(getPackageToScan(), getExclusions(), getSelectors()); + for (Class clazz : bindingSet) { + multiBinder.addBinding().to(clazz).in(Scopes.SINGLETON); + } bind(RequestAuditLogger.class).to(RequestAuditLoggerImpl.class); - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/event/OperationStatusAuditEvent.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/OperationStatusAuditEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/OperationStatusAuditEvent.java index 319d772..fd0068e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/OperationStatusAuditEvent.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/OperationStatusAuditEvent.java @@ -44,6 +44,11 @@ public class OperationStatusAuditEvent extends AbstractAuditEvent { */ private String operation; + /** + * Name of the logged in user who sent the request + */ + private String userName; + private OperationStatusAuditEventBuilder() { } @@ -60,7 +65,9 @@ public class OperationStatusAuditEvent extends AbstractAuditEvent { @Override protected void buildAuditMessage(StringBuilder builder) { builder - .append("Operation(") + .append("User(") + .append(this.userName) + .append("), Operation(") .append(this.operation) .append("), Status(") .append(this.status) @@ -84,6 +91,11 @@ public class OperationStatusAuditEvent extends AbstractAuditEvent { this.operation = operation; return this; } + + public OperationStatusAuditEventBuilder withUserName(String userName) { + this.userName = userName; + return this; + } } private OperationStatusAuditEvent() { http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/event/TaskStatusAuditEvent.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/TaskStatusAuditEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/TaskStatusAuditEvent.java index eaea058..1682e74 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/TaskStatusAuditEvent.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/TaskStatusAuditEvent.java @@ -59,6 +59,11 @@ public class TaskStatusAuditEvent extends AbstractAuditEvent { */ private String details; + /** + * User name + */ + private String userName; + private TaskStatusAuditEventBuilder() { } @@ -75,7 +80,9 @@ public class TaskStatusAuditEvent extends AbstractAuditEvent { @Override protected void buildAuditMessage(StringBuilder builder) { builder - .append("Operation(") + .append("User(") + .append(this.userName) + .append("), Operation(") .append(this.operation); if (details != null) { @@ -124,6 +131,10 @@ public class TaskStatusAuditEvent extends AbstractAuditEvent { this.details = details; return this; } + public TaskStatusAuditEventBuilder withUserName(String userName) { + this.userName = userName; + return this; + } } private TaskStatusAuditEvent() { http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/MembershipChangeRequestAuditEvent.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/MembershipChangeRequestAuditEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/MembershipChangeRequestAuditEvent.java index 040934e..8bfe9cd 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/MembershipChangeRequestAuditEvent.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/MembershipChangeRequestAuditEvent.java @@ -67,10 +67,10 @@ public class MembershipChangeRequestAuditEvent extends RequestAuditEvent { if (userNameList.isEmpty()) { builder.append("<empty>"); + } else { + builder.append(StringUtils.join(userNameList, ", ")); } - StringUtils.join(userNameList, ", "); - builder.append(")"); } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/StartOperationRequestAuditEvent.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/StartOperationRequestAuditEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/StartOperationRequestAuditEvent.java index 66e37b8..eb92480 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/StartOperationRequestAuditEvent.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/event/request/StartOperationRequestAuditEvent.java @@ -47,6 +47,11 @@ public class StartOperationRequestAuditEvent extends AbstractUserAuditEvent { */ private String operation; + /** + * Target host of the request + */ + private String hostname; + private StartOperationAuditEventBuilder() { } @@ -62,8 +67,11 @@ public class StartOperationRequestAuditEvent extends AbstractUserAuditEvent { builder .append(", Operation(") - .append(operation) - .append("), RequestId(") + .append(operation); + if(hostname != null) { + builder.append("), Host name(").append(hostname); + } + builder.append("), RequestId(") .append(requestId) .append("), Status(") .append(reasonOfFailure == null ? "Successfully queued" : "Failed to queue"); @@ -103,6 +111,11 @@ public class StartOperationRequestAuditEvent extends AbstractUserAuditEvent { this.operation = operation; return this; } + + public StartOperationAuditEventBuilder withHostname(String hostname) { + this.hostname = hostname; + return this; + } } private StartOperationRequestAuditEvent() { http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditEventCreator.java deleted file mode 100644 index ccb39de..0000000 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditEventCreator.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.audit.request; - -import java.util.Set; - -import org.apache.ambari.server.api.services.Request; -import org.apache.ambari.server.api.services.Result; -import org.apache.ambari.server.api.services.ResultStatus; -import org.apache.ambari.server.audit.event.AuditEvent; -import org.apache.ambari.server.controller.spi.Resource; - -/** - * This interface must be implemented by the plugins for the request audit logger - * in order to make custom {@link AuditEvent}s based on {@link org.apache.ambari.server.api.services.Request.Type}s - * and {@link org.apache.ambari.server.controller.spi.Resource.Type} - */ -public interface RequestAuditEventCreator { - - /** - * @return the set of {@link org.apache.ambari.server.api.services.Request.Type}s that are handled by this creator - */ - Set<Request.Type> getRequestTypes(); - - /** - * @return the {@link org.apache.ambari.server.controller.spi.Resource.Type}s that is handled by this creator - */ - Set<Resource.Type> getResourceTypes(); - - /** - * @return the {@link ResultStatus}es that is handled by this creator - */ - Set<ResultStatus.STATUS> getResultStatuses(); - - /** - * Creates and {@link AuditEvent} - * @param request HTTP request object - * @param result HTTP result object - * @return an {@link AuditEvent} - */ - AuditEvent createAuditEvent(Request request, Result result); - -} http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditLoggerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditLoggerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditLoggerImpl.java index 56efd18..2cdedd9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditLoggerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/RequestAuditLoggerImpl.java @@ -26,6 +26,7 @@ import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.AuditLogger; import org.apache.ambari.server.audit.event.AuditEvent; +import org.apache.ambari.server.audit.request.eventcreator.RequestAuditEventCreator; import org.apache.ambari.server.controller.spi.Resource; import com.google.inject.Inject; http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertGroupEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertGroupEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertGroupEventCreator.java index 366dfff..30b7357 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertGroupEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertGroupEventCreator.java @@ -18,8 +18,6 @@ package org.apache.ambari.server.audit.request.eventcreator; -import java.util.Collections; -import java.util.List; import java.util.Set; import org.apache.ambari.server.api.services.Request; @@ -29,9 +27,8 @@ import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddAlertGroupRequestAuditEvent; import org.apache.ambari.server.audit.event.request.ChangeAlertGroupRequestAuditEvent; import org.apache.ambari.server.audit.event.request.DeleteAlertGroupRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.AlertGroupResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -90,9 +87,9 @@ public class AlertGroupEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withName(getName(request)) - .withDefinitionIds(getDefinitionIds(request)) - .withNotificationIds(getNotificationIds(request)) + .withName(RequestAuditEventCreatorHelper.getNamedProperty(request, AlertGroupResourceProvider.ALERT_GROUP_NAME)) + .withDefinitionIds(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS)) + .withNotificationIds(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertGroupResourceProvider.ALERT_GROUP_TARGETS)) .build(); case PUT: return ChangeAlertGroupRequestAuditEvent.builder() @@ -101,9 +98,9 @@ public class AlertGroupEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withName(getName(request)) - .withDefinitionIds(getDefinitionIds(request)) - .withNotificationIds(getNotificationIds(request)) + .withName(RequestAuditEventCreatorHelper.getNamedProperty(request, AlertGroupResourceProvider.ALERT_GROUP_NAME)) + .withDefinitionIds(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS)) + .withNotificationIds(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertGroupResourceProvider.ALERT_GROUP_TARGETS)) .build(); case DELETE: return DeleteAlertGroupRequestAuditEvent.builder() @@ -118,46 +115,4 @@ public class AlertGroupEventCreator implements RequestAuditEventCreator { return null; } } - - /** - * Returns the alert group name from the request - * @param request - * @return - */ - private String getName(Request request) { - if (!request.getBody().getNamedPropertySets().isEmpty()) { - return String.valueOf(request.getBody().getNamedPropertySets().iterator().next().getProperties().get(PropertyHelper.getPropertyId("AlertGroup", "name"))); - } - return null; - } - - /** - * Returns definition ids from the request - * @param request - * @return - */ - private List<String> getDefinitionIds(Request request) { - if (!request.getBody().getNamedPropertySets().isEmpty()) { - List<String> list = (List<String>) request.getBody().getNamedPropertySets().iterator().next().getProperties().get(PropertyHelper.getPropertyId("AlertGroup", "definitions")); - if (list != null) { - return list; - } - } - return Collections.emptyList(); - } - - /** - * Returns notification ids from the request - * @param request - * @return - */ - private List<String> getNotificationIds(Request request) { - if (!request.getBody().getNamedPropertySets().isEmpty()) { - List<String> list = (List<String>) request.getBody().getNamedPropertySets().iterator().next().getProperties().get(PropertyHelper.getPropertyId("AlertGroup", "targets")); - if (list != null) { - return list; - } - } - return Collections.emptyList(); - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertTargetEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertTargetEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertTargetEventCreator.java index abad559..26a856b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertTargetEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/AlertTargetEventCreator.java @@ -18,8 +18,6 @@ package org.apache.ambari.server.audit.request.eventcreator; -import java.util.Collections; -import java.util.List; import java.util.Set; import org.apache.ambari.server.api.services.Request; @@ -29,9 +27,12 @@ import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddAlertTargetRequestAuditEvent; import org.apache.ambari.server.audit.event.request.ChangeAlertTargetRequestAuditEvent; import org.apache.ambari.server.audit.event.request.DeleteAlertTargetRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.AlertTargetResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; +import org.apache.ambari.server.notifications.dispatchers.EmailDispatcher; +import org.apache.ambari.server.state.services.AlertNoticeDispatchService; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; import com.google.common.collect.ImmutableSet; @@ -90,13 +91,13 @@ public class AlertTargetEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withName(getProperty(request, "name")) - .withDescription(getProperty(request, "description")) - .withAlertStates(getPropertyList(request, "alert_states")) - .withGroupIds(getPropertyList(request, "groups")) - .withNotificationType(getProperty(request, "notification_type")) - .withEmailFrom(getProperty(request, "properties/mail.smtp.from")) - .withEmailRecipients(getPropertyList(request, "properties/ambari.dispatch.recipients")) + .withName(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_NAME)) + .withDescription(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_DESCRIPTION)) + .withAlertStates(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertTargetResourceProvider.ALERT_TARGET_STATES)) + .withGroupIds(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertTargetResourceProvider.ALERT_TARGET_GROUPS)) + .withNotificationType(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_NOTIFICATION_TYPE)) + .withEmailFrom(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_PROPERTIES + "/" + EmailDispatcher.JAVAMAIL_FROM_PROPERTY)) + .withEmailRecipients(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertTargetResourceProvider.ALERT_TARGET_PROPERTIES + "/" + AlertNoticeDispatchService.AMBARI_DISPATCH_RECIPIENTS)) .build(); case PUT: return ChangeAlertTargetRequestAuditEvent.builder() @@ -105,13 +106,13 @@ public class AlertTargetEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withName(getProperty(request, "name")) - .withDescription(getProperty(request, "description")) - .withAlertStates(getPropertyList(request, "alert_states")) - .withGroupIds(getPropertyList(request, "groups")) - .withNotificationType(getProperty(request, "notification_type")) - .withEmailFrom(getProperty(request, "properties/mail.smtp.from")) - .withEmailRecipients(getPropertyList(request, "properties/ambari.dispatch.recipients")) + .withName(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_NAME)) + .withDescription(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_DESCRIPTION)) + .withAlertStates(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertTargetResourceProvider.ALERT_TARGET_STATES)) + .withGroupIds(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertTargetResourceProvider.ALERT_TARGET_GROUPS)) + .withNotificationType(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_NOTIFICATION_TYPE)) + .withEmailFrom(RequestAuditEventCreatorHelper.getProperty(request, AlertTargetResourceProvider.ALERT_TARGET_PROPERTIES + "/" + EmailDispatcher.JAVAMAIL_FROM_PROPERTY)) + .withEmailRecipients(RequestAuditEventCreatorHelper.getNamedPropertyList(request, AlertTargetResourceProvider.ALERT_TARGET_PROPERTIES + "/" + AlertNoticeDispatchService.AMBARI_DISPATCH_RECIPIENTS)) .build(); case DELETE: return DeleteAlertTargetRequestAuditEvent.builder() @@ -126,33 +127,4 @@ public class AlertTargetEventCreator implements RequestAuditEventCreator { return null; } } - - /** - * Returns a property list from the request, named by the parameter propertyName - * @param request - * @param propertyName - * @return - */ - private List<String> getPropertyList(Request request, String propertyName) { - if (!request.getBody().getNamedPropertySets().isEmpty()) { - List<String> list = (List<String>) request.getBody().getNamedPropertySets().iterator().next().getProperties().get(PropertyHelper.getPropertyId("AlertTarget", propertyName)); - if (list != null) { - return list; - } - } - return Collections.emptyList(); - } - - /** - * Returns a property from the request, named by the parameter propertyName - * @param request - * @param propertyName - * @return - */ - private String getProperty(Request request, String propertyName) { - if (!request.getBody().getPropertySets().isEmpty()) { - return String.valueOf(request.getBody().getPropertySets().iterator().next().get(PropertyHelper.getPropertyId("AlertTarget", propertyName))); - } - return null; - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintEventCreator.java index a91a9c1..c7351ac 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintEventCreator.java @@ -26,7 +26,6 @@ import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddBlueprintRequestAuditEvent; import org.apache.ambari.server.audit.event.request.DeleteBlueprintRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; import org.apache.ambari.server.controller.spi.Resource; import com.google.common.collect.ImmutableSet; http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintExportEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintExportEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintExportEventCreator.java index 85379d8..fdca748 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintExportEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/BlueprintExportEventCreator.java @@ -25,7 +25,6 @@ import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.BlueprintExportRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; import org.apache.ambari.server.controller.spi.Resource; import com.google.common.collect.ImmutableSet; http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ComponentEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ComponentEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ComponentEventCreator.java index 870a797..8c65a35 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ComponentEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ComponentEventCreator.java @@ -26,10 +26,9 @@ import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.StartOperationRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.HostComponentResourceProvider; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -92,6 +91,7 @@ public class ComponentEventCreator implements RequestAuditEventCreator { .withOperation(operation) .withRemoteIp(request.getRemoteAddress()) .withTimestamp(System.currentTimeMillis()) + .withHostname(RequestAuditEventCreatorHelper.getProperty(request, HostComponentResourceProvider.HOST_COMPONENT_HOST_NAME_PROPERTY_ID)) .withRequestId(String.valueOf(requestId)); if (result.getStatus().isErrorState()) { @@ -112,15 +112,15 @@ public class ComponentEventCreator implements RequestAuditEventCreator { return "Delete component " + request.getResource().getKeyValueMap().get(Resource.Type.HostComponent); } - if (request.getBody().getRequestInfoProperties().containsKey(RequestOperationLevel.OPERATION_LEVEL_ID)) { + if (request.getBody().getRequestInfoProperties() != null && request.getBody().getRequestInfoProperties().containsKey(RequestOperationLevel.OPERATION_LEVEL_ID)) { String operation = ""; switch (request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_LEVEL_ID)) { case "CLUSTER": for (Map<String, Object> map : request.getBody().getPropertySets()) { - if (map.containsKey(PropertyHelper.getPropertyId("HostRoles", "cluster_name"))) { - operation = String.valueOf(map.get(PropertyHelper.getPropertyId("HostRoles", "state"))) + ": all services" + if (map.containsKey(HostComponentResourceProvider.HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)) { + operation = String.valueOf(map.get(HostComponentResourceProvider.HOST_COMPONENT_STATE_PROPERTY_ID)) + ": all services" + " on all hosts" - + (request.getBody().getQueryString().length() > 0 ? " that matches " + request.getBody().getQueryString() : "") + + (request.getBody().getQueryString() != null && request.getBody().getQueryString().length() > 0 ? " that matches " + request.getBody().getQueryString() : "") + " (" + request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_CLUSTER_ID) + ")"; break; } @@ -128,10 +128,10 @@ public class ComponentEventCreator implements RequestAuditEventCreator { break; case "HOST": for (Map<String, Object> map : request.getBody().getPropertySets()) { - if (map.containsKey(PropertyHelper.getPropertyId("HostRoles", "cluster_name"))) { + if (map.containsKey(HostComponentResourceProvider.HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)) { String query = request.getBody().getRequestInfoProperties().get("query"); - operation = String.valueOf(map.get(PropertyHelper.getPropertyId("HostRoles", "state"))) + ": " + query.substring(query.indexOf("(") + 1, query.length() - 1) - + " on " + request.getBody().getRequestInfoProperties().get("operation_level/host_names") + operation = String.valueOf(map.get(HostComponentResourceProvider.HOST_COMPONENT_STATE_PROPERTY_ID)) + ": " + query.substring(query.indexOf("(") + 1, query.length() - 1) + + " on " + request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_HOST_NAME) + " (" + request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_CLUSTER_ID) + ")"; break; } @@ -139,10 +139,10 @@ public class ComponentEventCreator implements RequestAuditEventCreator { break; case "HOST_COMPONENT": for (Map<String, Object> map : request.getBody().getPropertySets()) { - if (map.containsKey(PropertyHelper.getPropertyId("HostRoles", "component_name"))) { - operation = String.valueOf(map.get(PropertyHelper.getPropertyId("HostRoles", "state"))) + ": " + String.valueOf(map.get(PropertyHelper.getPropertyId("HostRoles", "component_name"))) + if (map.containsKey(HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)) { + operation = String.valueOf(map.get(HostComponentResourceProvider.HOST_COMPONENT_STATE_PROPERTY_ID)) + ": " + String.valueOf(map.get(HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)) + "/" + request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_SERVICE_ID) - + " on " + request.getBody().getRequestInfoProperties().get("operation_level/host_name") + + " on " + request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_HOST_NAME) + " (" + request.getBody().getRequestInfoProperties().get(RequestOperationLevel.OPERATION_CLUSTER_ID) + ")"; break; } @@ -153,8 +153,8 @@ public class ComponentEventCreator implements RequestAuditEventCreator { } for (Map<String, Object> map : request.getBody().getPropertySets()) { - if (map.containsKey(PropertyHelper.getPropertyId("HostRoles", "maintenance_state"))) { - return "Turn " + map.get(PropertyHelper.getPropertyId("HostRoles", "maintenance_state")) + " Maintenance Mode for " + map.get(PropertyHelper.getPropertyId("HostRoles", "component_name")); + if (map.containsKey(HostComponentResourceProvider.HOST_COMPONENT_MAINTENANCE_STATE_PROPERTY_ID)) { + return "Turn " + map.get(HostComponentResourceProvider.HOST_COMPONENT_MAINTENANCE_STATE_PROPERTY_ID) + " Maintenance Mode for " + map.get(HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ConfigurationChangeEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ConfigurationChangeEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ConfigurationChangeEventCreator.java index b671138..139f6f6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ConfigurationChangeEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/ConfigurationChangeEventCreator.java @@ -27,9 +27,9 @@ import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.ClusterNameChangeRequestAuditEvent; import org.apache.ambari.server.audit.event.request.ConfigurationChangeRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.ClusterResourceProvider; +import org.apache.ambari.server.controller.internal.ServiceConfigVersionResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -82,8 +82,8 @@ public class ConfigurationChangeEventCreator implements RequestAuditEventCreator if (!request.getBody().getPropertySets().isEmpty()) { Map<String, Object> map = request.getBody().getPropertySets().iterator().next(); - if (map.size() == 1 && map.containsKey(PropertyHelper.getPropertyId("Clusters", "cluster_name"))) { - String newName = String.valueOf(map.get(PropertyHelper.getPropertyId("Clusters", "cluster_name"))); + if (map.size() == 1 && map.containsKey(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID)) { + String newName = String.valueOf(map.get(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID)); String oldName = request.getResource().getKeyValueMap().get(Resource.Type.Cluster); return ClusterNameChangeRequestAuditEvent.builder() .withTimestamp(System.currentTimeMillis()) @@ -115,7 +115,7 @@ public class ConfigurationChangeEventCreator implements RequestAuditEventCreator */ private String getServiceConfigVersion(Result result) { Map<String, Object> map = getServiceConfigMap(result); - return map == null ? null : String.valueOf(map.get("service_config_version")); + return map == null ? null : String.valueOf(map.get(ServiceConfigVersionResourceProvider.SERVICE_CONFIG_VERSION_PROPERTY_ID)); } /** @@ -125,7 +125,7 @@ public class ConfigurationChangeEventCreator implements RequestAuditEventCreator */ private String getServiceConfigVersionNote(Result result) { Map<String, Object> map = getServiceConfigMap(result); - return map == null ? null : String.valueOf(map.get("service_config_version_note")); + return map == null ? null : String.valueOf(map.get(ServiceConfigVersionResourceProvider.SERVICE_CONFIG_VERSION_NOTE_PROPERTY_ID)); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/CredentialEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/CredentialEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/CredentialEventCreator.java index 0647553..aca6885 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/CredentialEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/CredentialEventCreator.java @@ -25,9 +25,8 @@ import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddCredentialRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.CredentialResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -84,24 +83,11 @@ public class CredentialEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withClusterName(getProperty(request, "cluster_name")) - .withType(getProperty(request, "type")) - .withAlias(getProperty(request, "alias")) - .withPrincipal(getProperty(request, "principal")) + .withClusterName(RequestAuditEventCreatorHelper.getProperty(request, CredentialResourceProvider.CREDENTIAL_CLUSTER_NAME_PROPERTY_ID)) + .withType(RequestAuditEventCreatorHelper.getProperty(request, CredentialResourceProvider.CREDENTIAL_TYPE_PROPERTY_ID)) + .withAlias(RequestAuditEventCreatorHelper.getProperty(request, CredentialResourceProvider.CREDENTIAL_ALIAS_PROPERTY_ID)) + .withPrincipal(RequestAuditEventCreatorHelper.getProperty(request, CredentialResourceProvider.CREDENTIAL_PRINCIPAL_PROPERTY_ID)) .build(); } - - /** - * Returns a property from the resquest - * @param request - * @param propertyName - * @return - */ - private String getProperty(Request request, String propertyName) { - if (!request.getBody().getPropertySets().isEmpty()) { - return String.valueOf(request.getBody().getPropertySets().iterator().next().get(PropertyHelper.getPropertyId("Credential", propertyName))); - } - return null; - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/DefaultEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/DefaultEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/DefaultEventCreator.java index feda291..3ca2241 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/DefaultEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/DefaultEventCreator.java @@ -26,7 +26,6 @@ import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.request.RequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; import org.apache.ambari.server.audit.request.RequestAuditLogger; import org.apache.ambari.server.controller.spi.Resource; http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/GroupEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/GroupEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/GroupEventCreator.java index 30fef98..335df46 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/GroupEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/GroupEventCreator.java @@ -26,9 +26,8 @@ import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.CreateGroupRequestAuditEvent; import org.apache.ambari.server.audit.event.request.DeleteGroupRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.GroupResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -87,7 +86,7 @@ public class GroupEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withGroupName(getGroupName(request)) + .withGroupName(RequestAuditEventCreatorHelper.getProperty(request, GroupResourceProvider.GROUP_GROUPNAME_PROPERTY_ID)) .build(); case DELETE: return DeleteGroupRequestAuditEvent.builder() @@ -103,17 +102,4 @@ public class GroupEventCreator implements RequestAuditEventCreator { } return null; } - - /** - * Returns group name from request - * @param request - * @return - */ - private String getGroupName(Request request) { - if (!request.getBody().getPropertySets().isEmpty()) { - return String.valueOf(request.getBody().getPropertySets().iterator().next().get(PropertyHelper.getPropertyId("Groups", "group_name"))); - } - return null; - } - } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/HostEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/HostEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/HostEventCreator.java index 7bc0133..7c27d19 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/HostEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/HostEventCreator.java @@ -28,9 +28,9 @@ import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddComponentToHostRequestAuditEvent; import org.apache.ambari.server.audit.event.request.AddHostRequestAuditEvent; import org.apache.ambari.server.audit.event.request.DeleteHostRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.HostComponentResourceProvider; +import org.apache.ambari.server.controller.internal.HostResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -99,7 +99,7 @@ public class HostEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withHostName(getHostName(request)) + .withHostName(RequestAuditEventCreatorHelper.getNamedProperty(request, HostResourceProvider.HOST_NAME_PROPERTY_ID)) .build(); case QUERY_POST: return AddComponentToHostRequestAuditEvent.builder() @@ -117,18 +117,6 @@ public class HostEventCreator implements RequestAuditEventCreator { } /** - * Returns hostname from the request - * @param request - * @return - */ - private String getHostName(Request request) { - if (!request.getBody().getNamedPropertySets().isEmpty()) { - return String.valueOf(request.getBody().getNamedPropertySets().iterator().next().getProperties().get(PropertyHelper.getPropertyId("Hosts", "host_name"))); - } - return null; - } - - /** * Returns component name from the request * @param request * @return @@ -137,7 +125,7 @@ public class HostEventCreator implements RequestAuditEventCreator { if (!request.getBody().getNamedPropertySets().isEmpty()) { Set<Map<String, String>> set = (Set<Map<String, String>>) request.getBody().getNamedPropertySets().iterator().next().getProperties().get("host_components"); if (set != null && !set.isEmpty()) { - return set.iterator().next().get(PropertyHelper.getPropertyId("HostRoles", "component_name")); + return set.iterator().next().get(HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID); } } return null; @@ -149,7 +137,7 @@ public class HostEventCreator implements RequestAuditEventCreator { * @return */ private String getHostNameFromQuery(Request request) { - final String key = PropertyHelper.getPropertyId("Hosts", "host_name"); + final String key = HostResourceProvider.HOST_NAME_PROPERTY_ID; if (request.getBody().getQueryString().contains(key)) { String q = request.getBody().getQueryString(); int startIndex = q.indexOf(key) + key.length() + 1; http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/MemberEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/MemberEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/MemberEventCreator.java index f0158f5..d10991f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/MemberEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/MemberEventCreator.java @@ -18,9 +18,6 @@ package org.apache.ambari.server.audit.request.eventcreator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; import java.util.Set; import org.apache.ambari.server.api.services.Request; @@ -30,9 +27,8 @@ import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddUserToGroupRequestAuditEvent; import org.apache.ambari.server.audit.event.request.MembershipChangeRequestAuditEvent; import org.apache.ambari.server.audit.event.request.RemoveUserFromGroupRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.MemberResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -111,8 +107,8 @@ public class MemberEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withGroupName(getGroupNameForPut(request)) - .withUserNameList(getUsers(request)) + .withGroupName(RequestAuditEventCreatorHelper.getProperty(request, MemberResourceProvider.MEMBER_GROUP_NAME_PROPERTY_ID)) + .withUserNameList(RequestAuditEventCreatorHelper.getPropertyList(request, MemberResourceProvider.MEMBER_USER_NAME_PROPERTY_ID)) .build(); default: return null; @@ -120,34 +116,6 @@ public class MemberEventCreator implements RequestAuditEventCreator { } /** - * Returns users from the request - * @param request - * @return - */ - private List<String> getUsers(Request request) { - List<String> users = new LinkedList<String>(); - - for (Map<String, Object> propertyMap : request.getBody().getPropertySets()) { - String userName = String.valueOf(propertyMap.get(PropertyHelper.getPropertyId("MemberInfo", "user_name"))); - users.add(userName); - } - return users; - } - - /** - * Returns target group name from the request. This is called when PUT request type is used. - * @param request - * @return - */ - private String getGroupNameForPut(Request request) { - - for (Map<String, Object> propertyMap : request.getBody().getPropertySets()) { - return String.valueOf(propertyMap.get(PropertyHelper.getPropertyId("MemberInfo", "group_name"))); - } - return null; - } - - /** * Returns username from the request * @param request * @return http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/PrivilegeEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/PrivilegeEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/PrivilegeEventCreator.java index 11168f1..cd14dd1 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/PrivilegeEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/PrivilegeEventCreator.java @@ -30,9 +30,11 @@ import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.ClusterPrivilegeChangeRequestAuditEvent; import org.apache.ambari.server.audit.event.request.PrivilegeChangeRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.PrivilegeResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; +import org.apache.ambari.server.orm.entities.PrincipalTypeEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; import com.google.common.collect.ImmutableSet; @@ -83,8 +85,8 @@ public class PrivilegeEventCreator implements RequestAuditEventCreator { @Override public AuditEvent createAuditEvent(Request request, Result result) { - Map<String, List<String>> users = getEntities(request, "USER"); - Map<String, List<String>> groups = getEntities(request, "GROUP"); + Map<String, List<String>> users = getEntities(request, PrincipalTypeEntity.USER_PRINCIPAL_TYPE_NAME); + Map<String, List<String>> groups = getEntities(request, PrincipalTypeEntity.GROUP_PRINCIPAL_TYPE_NAME); switch (request.getRequestType()) { case PUT: @@ -125,10 +127,10 @@ public class PrivilegeEventCreator implements RequestAuditEventCreator { Map<String, List<String>> entities = new HashMap<String, List<String>>(); for (Map<String, Object> propertyMap : request.getBody().getPropertySets()) { - String ptype = String.valueOf(propertyMap.get(PropertyHelper.getPropertyId("PrivilegeInfo", "principal_type"))); + String ptype = String.valueOf(propertyMap.get(PrivilegeResourceProvider.PRINCIPAL_TYPE_PROPERTY_ID)); if (type.equals(ptype)) { - String role = String.valueOf(propertyMap.get(PropertyHelper.getPropertyId("PrivilegeInfo", "permission_name"))); - String name = String.valueOf(propertyMap.get(PropertyHelper.getPropertyId("PrivilegeInfo", "principal_name"))); + String role = String.valueOf(propertyMap.get(PrivilegeResourceProvider.PERMISSION_NAME_PROPERTY_ID)); + String name = String.valueOf(propertyMap.get(PrivilegeResourceProvider.PRINCIPAL_NAME_PROPERTY_ID)); if (!entities.containsKey(role)) { entities.put(role, new LinkedList<String>()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RecommendationIgnoreEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RecommendationIgnoreEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RecommendationIgnoreEventCreator.java index 6b7bb2b..d41177e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RecommendationIgnoreEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RecommendationIgnoreEventCreator.java @@ -24,7 +24,6 @@ import org.apache.ambari.server.api.services.Request; import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; import org.apache.ambari.server.controller.spi.Resource; import com.google.common.collect.ImmutableSet; http://git-wip-us.apache.org/repos/asf/ambari/blob/6320d589/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RepositoryEventCreator.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RepositoryEventCreator.java b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RepositoryEventCreator.java index ca3bac4..aeb9320 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RepositoryEventCreator.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/audit/request/eventcreator/RepositoryEventCreator.java @@ -26,9 +26,8 @@ import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.audit.event.AuditEvent; import org.apache.ambari.server.audit.event.request.AddRepositoryRequestAuditEvent; import org.apache.ambari.server.audit.event.request.UpdateRepositoryRequestAuditEvent; -import org.apache.ambari.server.audit.request.RequestAuditEventCreator; +import org.apache.ambari.server.controller.internal.RepositoryResourceProvider; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import com.google.common.collect.ImmutableSet; @@ -87,11 +86,11 @@ public class RepositoryEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withRepo(getProperty(request, PropertyHelper.getPropertyId("Repositories", "repo_id"))) - .withStackName(getProperty(request, PropertyHelper.getPropertyId("Repositories", "stack_name"))) - .withStackVersion(getProperty(request, PropertyHelper.getPropertyId("Repositories", "stack_version"))) - .withOsType(getProperty(request, PropertyHelper.getPropertyId("Repositories", "os_type"))) - .withBaseUrl(getProperty(request, PropertyHelper.getPropertyId("Repositories", "base_url"))) + .withRepo(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID)) + .withStackName(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_STACK_NAME_PROPERTY_ID)) + .withStackVersion(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_STACK_VERSION_PROPERTY_ID)) + .withOsType(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_OS_TYPE_PROPERTY_ID)) + .withBaseUrl(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_BASE_URL_PROPERTY_ID)) .build(); case PUT: return UpdateRepositoryRequestAuditEvent.builder() @@ -100,28 +99,14 @@ public class RepositoryEventCreator implements RequestAuditEventCreator { .withResultStatus(result.getStatus()) .withUrl(request.getURI()) .withRemoteIp(request.getRemoteAddress()) - .withRepo(getProperty(request, PropertyHelper.getPropertyId("Repositories", "repo_id"))) - .withStackName(getProperty(request, PropertyHelper.getPropertyId("Repositories", "stack_name"))) - .withStackVersion(getProperty(request, PropertyHelper.getPropertyId("Repositories", "stack_version"))) - .withOsType(getProperty(request, PropertyHelper.getPropertyId("Repositories", "os_type"))) - .withBaseUrl(getProperty(request, PropertyHelper.getPropertyId("Repositories", "base_url"))) + .withRepo(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID)) + .withStackName(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_STACK_NAME_PROPERTY_ID)) + .withStackVersion(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_STACK_VERSION_PROPERTY_ID)) + .withOsType(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_OS_TYPE_PROPERTY_ID)) + .withBaseUrl(RequestAuditEventCreatorHelper.getProperty(request, RepositoryResourceProvider.REPOSITORY_BASE_URL_PROPERTY_ID)) .build(); default: return null; } } - - /** - * Returns a property from the request based on the propertyId parameter - * @param request - * @param properyId - * @return - */ - private String getProperty(Request request, String properyId) { - if (!request.getBody().getPropertySets().isEmpty()) { - return String.valueOf(request.getBody().getPropertySets().iterator().next().get(properyId)); - } - return null; - } - }
