You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ao...@apache.org on 2017/09/28 13:25:35 UTC

[46/50] [abbrv] ambari git commit: Merge remote-tracking branch 'remotes/origin/trunk' into branch-3.0-perf

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index c62b4ce,5373ffe..c36e107
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@@ -164,14 -147,9 +158,12 @@@ public class HostResourceProvider exten
    protected static final String FORCE_DELETE_COMPONENTS = "force_delete_components";
  
  
-   private static Set<String> pkPropertyIds =
-     new HashSet<>(Arrays.asList(new String[]{
-       HOST_NAME_PROPERTY_ID}));
+   private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(HOST_HOST_NAME_PROPERTY_ID);
  
    @Inject
 +  private MaintenanceStateHelper maintenanceStateHelper;
 +
 +  @Inject
    private OsFamily osFamily;
  
    @Inject
@@@ -542,41 -497,80 +525,106 @@@
          clusterSet.add(hostRequest.getClusterName());
          allClusterSet.add(hostRequest.getClusterName());
          hostClustersMap.put(hostRequest.getHostname(), clusterSet);
-         if (hostRequest.getHostAttributes() != null) {
-           hostAttributes.put(hostRequest.getHostname(), hostRequest.getHostAttributes());
-         }
 +        Cluster cl = clusters.getCluster(hostRequest.getClusterName());
 +        String clusterId = Long.toString(cl.getClusterId());
 +        if (!addedTopologies.containsKey(clusterId)) {
 +          addedTopologies.put(clusterId, new TopologyCluster());
 +        }
 +        Host addedHost = clusters.getHost(hostRequest.getHostname());
 +        addedTopologies.get(clusterId).addTopologyHost(new TopologyHost(addedHost.getHostId(),
 +            addedHost.getHostName(),
 +            addedHost.getRackInfo(),
 +            addedHost.getIPv4()));
++        //TODO fix repo info param
 +        HostLevelParamsUpdateEvent hostLevelParamsUpdateEvent = new HostLevelParamsUpdateEvent(clusterId, new HostLevelParamsCluster(
-             ambariMetaInfo.getRepoInfo(cl, addedHost),
++            null,//ambariMetaInfo.getRepoInfo(cl, addedHost),
 +            recoveryConfigHelper.getRecoveryConfig(clusters.getCluster(hostRequest.getClusterName()).getClusterName(),
 +                addedHost.getHostName())
 +        ));
 +        hostLevelParamsUpdateEvent.setHostName(addedHost.getHostName());
 +        hostLevelParamsUpdateEvents.add(hostLevelParamsUpdateEvent);
        }
      }
      clusters.updateHostWithClusterAndAttributes(hostClustersMap, hostAttributes);
  
-     for (String clusterName : allClusterSet) {
-       clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
-     }
++    // TODO add rack change to topology update
+     updateHostRackInfoIfChanged(clusters, hostRequests);
+ 
 +    TopologyUpdateEvent topologyUpdateEvent =
 +        new TopologyUpdateEvent(addedTopologies, TopologyUpdateEvent.EventType.UPDATE);
 +    topologyHolder.updateData(topologyUpdateEvent);
 +    for (HostLevelParamsUpdateEvent hostLevelParamsUpdateEvent : hostLevelParamsUpdateEvents) {
 +      hostLevelParamsHolder.updateData(hostLevelParamsUpdateEvent);
 +    }
    }
  
+   /**
+    * Iterates through the provided host request and checks if there is rack info provided.
+    * If the rack info differs from the rack info of the host than updates it with the value from
+    * the host request.
+    * @param clusters
 -   * @param hostRequests 
++   * @param hostRequests
+    * @throws AmbariException
+    * @throws AuthorizationException
+    */
+   private void updateHostRackInfoIfChanged(Clusters clusters, Set<HostRequest> hostRequests)
+     throws AmbariException, AuthorizationException {
+ 
+     HashSet<String> rackChangeAffectedClusters = new HashSet<>();
+ 
+     for (HostRequest hostRequest : hostRequests) {
+       String clusterName = hostRequest.getClusterName();
+ 
+       if (StringUtils.isNotBlank(clusterName)) {
+         Cluster cluster = clusters.getCluster(clusterName);
+         Host host = clusters.getHost(hostRequest.getHostname());
+ 
+         if (updateHostRackInfoIfChanged(cluster, host, hostRequest))
+           rackChangeAffectedClusters.add(clusterName);
+       }
+     }
 -
++    // TODO rack change topology update
+     for (String clusterName: rackChangeAffectedClusters) {
+       getManagementController().registerRackChange(clusterName);
+     }
+   }
+ 
+ 
+ 
+   /**
+    * If the rack info provided in the request differs from the rack info of the host
+    * update the rack info of the host with the value from the host request
+    *
+    * @param cluster The cluster to check user privileges against. User is required
+    *                to have {@link RoleAuthorization#HOST_ADD_DELETE_HOSTS} rights on the cluster.
+    * @param host The host of which rack information is to be updated
+    * @param hostRequest
+    * @return true is host was updated otherwise false
+    * @throws AmbariException
+    * @throws AuthorizationException
+    */
+   private boolean updateHostRackInfoIfChanged(Cluster cluster, Host host, HostRequest hostRequest)
+     throws AmbariException, AuthorizationException {
+ 
+     Long resourceId = cluster.getResourceId();
+ 
+     String hostRackInfo = host.getRackInfo();
+     String requestRackInfo = hostRequest.getRackInfo();
+ 
+     boolean rackChange = requestRackInfo != null && !requestRackInfo.equals(hostRackInfo);
+ 
+     if (rackChange) {
+       if(!AuthorizationHelper.isAuthorized(ResourceType.CLUSTER, resourceId, RoleAuthorization.HOST_ADD_DELETE_HOSTS)) {
+         throw new AuthorizationException("The authenticated user is not authorized to update host rack information");
+       }
++      //TODO topology update
+ 
+       host.setRackInfo(requestRackInfo);
+     }
+ 
+     return rackChange;
+   }
+ 
    private void createHostResource(Clusters clusters, Set<String> duplicates,
                                    Set<String> unknowns, Set<String> allHosts,
                                    HostRequest request)
@@@ -751,14 -753,10 +807,12 @@@
        }
      }
  
 +    TreeMap<String, TopologyCluster> topologyUpdates = new TreeMap<>();
      for (HostRequest request : requests) {
        if (LOG.isDebugEnabled()) {
-         LOG.debug("Received an updateHost request"
-             + ", hostname=" + request.getHostname()
-             + ", request=" + request);
+         LOG.debug("Received an updateHost request, hostname={}, request={}", request.getHostname(), request);
        }
 +      TopologyHost topologyHost = new TopologyHost();
  
        Host host = clusters.getHost(request.getHostname());
  
@@@ -855,21 -835,11 +893,18 @@@
          }
        }
  
-       if (clusterName != null && !clusterName.isEmpty()) {
-         clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
-         if (rackChange) {
-           // Authorization check for this update was performed before we got to this point.
-           controller.registerRackChange(clusterName);
-         }
+       if (StringUtils.isNotBlank(clusterName) && rackChange) {
+         // Authorization check for this update was performed before we got to this point.
+         controller.registerRackChange(clusterName);
        }
  
 +      if (!topologyUpdates.containsKey(clusterId.toString())) {
 +        topologyUpdates.put(clusterId.toString(), new TopologyCluster());
 +      }
 +      topologyUpdates.get(clusterId.toString()).addTopologyHost(topologyHost);
 +      TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(topologyUpdates,
 +          TopologyUpdateEvent.EventType.UPDATE);
 +      topologyHolder.updateData(topologyUpdateEvent);
        //todo: if attempt was made to update a property other than those
        //todo: that are allowed above, should throw exception
      }
@@@ -1000,12 -960,6 +1035,9 @@@
        }
      }
      clusters.publishHostsDeletion(allClustersWithHosts, hostNames);
-     for (String clustername : hostsClusters) {
-       clusters.getCluster(clustername).recalculateAllClusterVersionStates();
-     }
 +    TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(topologyUpdates,
 +        TopologyUpdateEvent.EventType.DELETE);
 +    topologyHolder.updateData(topologyUpdateEvent);
    }
  
    private void validateHostInDeleteFriendlyState(HostRequest hostRequest, Clusters clusters, boolean forceDelete) throws AmbariException {

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
index d2f3f8d,6455805..44ef9f7
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
@@@ -86,6 -86,8 +86,7 @@@ public class RepositoryVersionResourceP
    public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID      = PropertyHelper.getPropertyId("RepositoryVersions", "stack_version");
    public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("RepositoryVersions", "repository_version");
    public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID       = PropertyHelper.getPropertyId("RepositoryVersions", "display_name");
+   public static final String REPOSITORY_VERSION_HIDDEN_PROPERTY_ID             = PropertyHelper.getPropertyId("RepositoryVersions", "hidden");
 -  public static final String REPOSITORY_VERSION_RESOLVED_PROPERTY_ID           = PropertyHelper.getPropertyId("RepositoryVersions", "resolved");
    public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         = new OperatingSystemResourceDefinition().getPluralName();
    public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID              = new RepositoryResourceDefinition().getPluralName();
  
@@@ -123,16 -122,15 +121,14 @@@
        REPOSITORY_VERSION_PARENT_ID,
        REPOSITORY_VERSION_HAS_CHILDREN,
        REPOSITORY_VERSION_AVAILABLE_SERVICES,
 -      REPOSITORY_VERSION_STACK_SERVICES,
 -      REPOSITORY_VERSION_RESOLVED_PROPERTY_ID);
 +      REPOSITORY_VERSION_STACK_SERVICES);
  
    @SuppressWarnings("serial")
-   public static Map<Type, String> keyPropertyIds = new HashMap<Type, String>() {
-     {
-       put(Type.Stack, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID);
-       put(Type.StackVersion, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
-       put(Type.RepositoryVersion, REPOSITORY_VERSION_ID_PROPERTY_ID);
-     }
-   };
+   public static Map<Type, String> keyPropertyIds = new ImmutableMap.Builder<Type, String>()
+       .put(Type.Stack, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID)
+       .put(Type.StackVersion, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID)
+       .put(Type.RepositoryVersion, REPOSITORY_VERSION_ID_PROPERTY_ID)
+       .build();
  
    @Inject
    private Gson gson;
@@@ -261,9 -256,10 +254,10 @@@
        setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, entity.getStackName(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), requestedIds);
+       setResourceProperty(resource, REPOSITORY_VERSION_HIDDEN_PROPERTY_ID, entity.isHidden(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), requestedIds);
        setResourceProperty(resource, REPOSITORY_VERSION_TYPE_PROPERTY_ID, entity.getType(), requestedIds);
 -      setResourceProperty(resource, REPOSITORY_VERSION_RESOLVED_PROPERTY_ID, entity.isResolved(), requestedIds);
 +
        setResourceProperty(resource, REPOSITORY_VERSION_PARENT_ID, entity.getParentId(), requestedIds);
  
        List<RepositoryVersionEntity> children = entity.getChildren();

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
index 81dc340,81f283c..5a5d27c
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
@@@ -737,7 -790,37 +790,36 @@@ public class RequestResourceProvider ex
        setResourceProperty(resource, REQUEST_SOURCE_SCHEDULE, null, requestedPropertyIds);
      }
  
-     final CalculatedStatus status = CalculatedStatus.statusFromRequest(s_hostRoleCommandDAO, topologyManager, entity.getRequestId());
 -
+     Map<Long, HostRoleCommandStatusSummaryDTO> summary = s_hostRoleCommandDAO.findAggregateCounts(entity.getRequestId());
+ 
+     // get summaries from TopologyManager for logical requests
+     summary.putAll(topologyManager.getStageSummaries(entity.getRequestId()));
+ 
+     // summary might be empty due to delete host have cleared all
+     // HostRoleCommands or due to hosts haven't registered yet with the cluster
+     // when the cluster is provisioned with a Blueprint
+     final CalculatedStatus status;
+     LogicalRequest logicalRequest = topologyManager.getRequest(entity.getRequestId());
+     if (summary.isEmpty() && null != logicalRequest) {
+       // In this case, it appears that there are no tasks but this is a logical
+       // topology request, so it's a matter of hosts simply not registering yet
+       // for tasks to be created ==> status = PENDING.
+       // For a new LogicalRequest there should be at least one HostRequest,
+       // while if they were removed already ==> status = COMPLETED.
+       if (logicalRequest.getHostRequests().isEmpty()) {
+         status = CalculatedStatus.COMPLETED;
+       } else {
+         status = CalculatedStatus.PENDING;
+       }
+     } else {
+       // there are either tasks or this is not a logical request, so do normal
+       // status calculations
+       status = CalculatedStatus.statusFromStageSummary(summary, summary.keySet());
+     }
+ 
+     if (null != logicalRequest) {
+       setResourceProperty(resource, REQUEST_PENDING_HOST_REQUEST_COUNT_ID, logicalRequest.getPendingHostRequestCount(), requestedPropertyIds);
+     }
  
      setResourceProperty(resource, REQUEST_STATUS_PROPERTY_ID, status.getStatus().toString(), requestedPropertyIds);
      setResourceProperty(resource, REQUEST_PROGRESS_PERCENT_ID, status.getPercent(), requestedPropertyIds);

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index 33cab7c,76a4547..3f8b6e9
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@@ -72,7 -75,7 +75,8 @@@ import org.apache.ambari.server.state.S
  import org.apache.ambari.server.state.ServiceInfo;
  import org.apache.ambari.server.state.StackId;
  import org.apache.ambari.server.state.State;
 +import org.apache.ambari.server.topology.TopologyDeleteFormer;
+ import org.apache.commons.collections.CollectionUtils;
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.Validate;
  
@@@ -124,9 -166,11 +167,14 @@@ public class ServiceResourceProvider ex
    @Inject
    private KerberosHelper kerberosHelper;
  
 +  @Inject
 +  private TopologyDeleteFormer topologyDeleteFormer;
 +
+   /**
+    * Used to lookup the repository when creating services.
+    */
+   private final RepositoryVersionDAO repositoryVersionDAO;
+ 
    // ----- Constructors ----------------------------------------------------
  
    /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index b657f03,52f66bc..0ff21a2
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
@@@ -851,22 -731,12 +731,11 @@@ public class UpgradeResourceProvider ex
                itemEntity.setText(wrapper.getText());
                itemEntity.setTasks(wrapper.getTasksJson());
                itemEntity.setHosts(wrapper.getHostsJson());
 +              itemEntities.add(itemEntity);
  
-               // At this point, need to change the effective Stack Id so that subsequent tasks run on the newer value.
-               if (upgradeType == UpgradeType.NON_ROLLING && UpdateStackGrouping.class.equals(group.groupClass)) {
-                 if (direction.isUpgrade()) {
-                   upgradeContext.setEffectiveStackId(upgradeContext.getTargetStackId());
-                 } else {
-                   upgradeContext.setEffectiveStackId(upgradeContext.getOriginalStackId());
-                 }
-               } else if (UpdateStackGrouping.class.equals(group.groupClass)) {
-                 upgradeContext.setEffectiveStackId(upgradeContext.getTargetStackId());
-               }
- 
                injectVariables(configHelper, cluster, itemEntity);
-               makeServerSideStage(upgradeContext, req, itemEntity, (ServerSideActionTask) task,
-                   skippable, supportsAutoSkipOnFailure, allowRetry, pack, configUpgradePack);
 -              if (makeServerSideStage(group, upgradeContext, effectiveRepositoryVersion, req,
 -                  itemEntity, (ServerSideActionTask) task, configUpgradePack)) {
 -                itemEntities.add(itemEntity);
 -              }
++              makeServerSideStage(group, upgradeContext, effectiveRepositoryVersion, req,
++                  itemEntity, (ServerSideActionTask) task, configUpgradePack);
              }
            }
          } else {
@@@ -1511,13 -1185,13 +1184,13 @@@
     * upgrade
     * @throws AmbariException
     */
-   private void makeServerSideStage(UpgradeContext context, RequestStageContainer request,
-       UpgradeItemEntity entity, ServerSideActionTask task, boolean skippable,
-       boolean supportsAutoSkipOnFailure, boolean allowRetry,
-       UpgradePack upgradePack, ConfigUpgradePack configUpgradePack)
-           throws AmbariException {
 -  private boolean makeServerSideStage(UpgradeGroupHolder group, UpgradeContext context,
++  private void makeServerSideStage(UpgradeGroupHolder group, UpgradeContext context,
+       RepositoryVersionEntity effectiveRepositoryVersion, RequestStageContainer request,
+       UpgradeItemEntity entity, ServerSideActionTask task, ConfigUpgradePack configUpgradePack)
+       throws AmbariException {
  
      Cluster cluster = context.getCluster();
+     UpgradePack upgradePack = context.getUpgradePack();
  
      Map<String, String> commandParams = getNewParameterMap(request, context);
      commandParams.put(UpgradeContext.COMMAND_PARAM_UPGRADE_PACK, upgradePack.getName());
@@@ -1593,8 -1276,12 +1266,8 @@@
          break;
      }
  
 -    if (!process) {
 -      return false;
 -    }
 -
      ActionExecutionContext actionContext = new ActionExecutionContext(cluster.getClusterName(),
-         Role.AMBARI_SERVER_ACTION.toString(), Collections.<RequestResourceFilter> emptyList(),
+         Role.AMBARI_SERVER_ACTION.toString(), Collections.emptyList(),
          commandParams);
  
      actionContext.setTimeout(Short.valueOf((short) -1));

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/AlertReceivedEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigFinishedEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertAggregateListener.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
index c40969e,230b943..1dd8a5b
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/tasks/TaskStatusListener.java
@@@ -26,8 -26,8 +26,9 @@@ import java.util.Iterator
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
+ import java.util.concurrent.ConcurrentHashMap;
  
 +import org.apache.ambari.server.ClusterNotFoundException;
  import org.apache.ambari.server.EagerSingleton;
  import org.apache.ambari.server.Role;
  import org.apache.ambari.server.actionmanager.HostRoleCommand;
@@@ -51,8 -44,6 +52,7 @@@ import org.apache.ambari.server.orm.ent
  import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity;
  import org.apache.ambari.server.orm.entities.StageEntity;
  import org.apache.ambari.server.orm.entities.StageEntityPK;
 +import org.apache.ambari.server.topology.TopologyManager;
- import org.jboss.netty.util.internal.ConcurrentHashMap;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
index cd82957,1944761..aa29894
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
@@@ -107,55 -103,39 +103,31 @@@ public class DistributeRepositoriesActi
            "Distribute repositories did not complete, will set all INSTALLING versions for host {} to INSTALL_FAILED.",
            event.getHostname());
      } else {
-       // Parse structured output
+ 
+       DistributeRepositoriesStructuredOutput structuredOutput = null;
        try {
+         structuredOutput = gson.fromJson(event.getCommandReport().getStructuredOut(),
+             DistributeRepositoriesStructuredOutput.class);
+       } catch (JsonSyntaxException e) {
+         LOG.error("Cannot parse structured output %s", e);
+       }
+ 
+       if (null == structuredOutput || null == structuredOutput.repositoryVersionId) {
+         LOG.error("Received an installation reponse, but it did not contain a repository version id");
+       } else {
          newHostState = RepositoryVersionState.INSTALLED;
-         DistributeRepositoriesStructuredOutput structuredOutput = StageUtils.getGson().fromJson(
-                 event.getCommandReport().getStructuredOut(),
-                 DistributeRepositoriesStructuredOutput.class);
- 
-         repositoryVersion = structuredOutput.getInstalledRepositoryVersion();
- 
-         // Handle the case in which the version to install did not contain the build number,
-         // but the structured output does contain the build number.
-         if (null != structuredOutput.getActualVersion() && !structuredOutput.getActualVersion().isEmpty() &&
-             null != structuredOutput.getInstalledRepositoryVersion() && !structuredOutput.getInstalledRepositoryVersion().isEmpty() &&
-             null != structuredOutput.getStackId() && !structuredOutput.getStackId().isEmpty() &&
-             !structuredOutput.getActualVersion().equals(structuredOutput.getInstalledRepositoryVersion())) {
- 
-           // !!! getInstalledRepositoryVersion() from the agent is the one
-           // entered in the UI.  getActualVersion() is computed.
- 
-           StackId stackId = new StackId(structuredOutput.getStackId());
-           RepositoryVersionEntity version = repoVersionDAO.findByStackAndVersion(
-               stackId, structuredOutput.getInstalledRepositoryVersion());
- 
-           if (null != version) {
-             LOG.info("Repository version {} was found, but {} is the actual value",
-                 structuredOutput.getInstalledRepositoryVersion(),
-                 structuredOutput.getActualVersion());
-             // !!! the entered version is not correct
-             version.setVersion(structuredOutput.getActualVersion());
-             repoVersionDAO.merge(version);
-             repositoryVersion = structuredOutput.getActualVersion();
-           } else {
-             // !!! extra check that the actual version is correct
-             stackId = new StackId(structuredOutput.getStackId());
-             version = repoVersionDAO.findByStackAndVersion(stackId,
-                 structuredOutput.getActualVersion());
- 
-             LOG.debug("Repository version {} was not found, check for {}.  Found={}",
-                 structuredOutput.getInstalledRepositoryVersion(),
-                 structuredOutput.getActualVersion(),
-                 Boolean.valueOf(null != version));
- 
-             if (null != version) {
-               repositoryVersion = structuredOutput.getActualVersion();
-             }
+ 
+         String actualVersion = structuredOutput.actualVersion;
+ 
+         RepositoryVersionEntity repoVersion = repoVersionDAO.findByPK(structuredOutput.repositoryVersionId);
+ 
+         if (null != repoVersion && StringUtils.isNotBlank(actualVersion)) {
+           if (!StringUtils.equals(repoVersion.getVersion(), actualVersion)) {
+             repoVersion.setVersion(actualVersion);
 -            repoVersion.setResolved(true);
+             repoVersionDAO.merge(repoVersion);
+             repositoryVersion = actualVersion;
 -          } else {
 -            // the reported versions are the same - we should ensure that the
 -            // repo is resolved
 -            if (!repoVersion.isResolved()) {
 -              repoVersion.setResolved(true);
 -              repoVersionDAO.merge(repoVersion);
 -            }
            }
          }
-       } catch (JsonSyntaxException e) {
-         LOG.error("Cannot parse structured output %s", e);
        }
      }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
index a35957d,e5298dc..394e9f9
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java
@@@ -108,8 -98,16 +98,8 @@@ public class StackVersionListener 
        if (null != rve) {
          String currentRepoVersion = rve.getVersion();
          if (!StringUtils.equals(currentRepoVersion, newVersion)) {
--          rve.setVersion(newVersion);
 -          rve.setResolved(true);
--          repositoryVersionDAO.merge(rve);
 -        } else {
 -          // the reported versions are the same - we should ensure that the repo
 -          // is resolved
 -          if (!rve.isResolved()) {
 -            rve.setResolved(true);
++            rve.setVersion(newVersion);
+             repositoryVersionDAO.merge(rve);
 -          }
          }
        }
      }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
index ff874a6,096a395..1ef415a
--- a/ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/metadata/CachedRoleCommandOrderProvider.java
@@@ -36,9 -37,10 +36,9 @@@ import com.google.inject.Injector
   * RoleCommandOrderProvider which caches RoleCommandOrder objects for a cluster to avoid the cost of construction of
   * RoleCommandOrder objects each time.
   */
 -@Singleton
  public class CachedRoleCommandOrderProvider implements RoleCommandOrderProvider {
  
-   private static Logger LOG = LoggerFactory.getLogger(CachedRoleCommandOrderProvider.class);
+   private static final Logger LOG = LoggerFactory.getLogger(CachedRoleCommandOrderProvider.class);
  
    @Inject
    private Injector injector;

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/MetricsServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertSummaryDTO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
index 6b34575,010ccec..f634d89
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
@@@ -1007,6 -1027,34 +1008,6 @@@ public class HostRoleCommandDAO 
        taskIds.addAll(daoUtils.selectList(hostRoleCommandQuery));
      }
  
-     return taskIds;
+     return Sets.newHashSet(taskIds);
    }
 -
 -  /**
 -   * A simple DTO for storing the most recent service check time for a given
 -   * {@link Role}.
 -   */
 -  public static class LastServiceCheckDTO {
 -
 -    /**
 -     * The role.
 -     */
 -    public final String role;
 -
 -    /**
 -     * The time that the service check ended.
 -     */
 -    public final long endTime;
 -
 -    /**
 -     * Constructor.
 -     *
 -     * @param role
 -     * @param endTime
 -     */
 -    public LastServiceCheckDTO(String role, long endTime) {
 -      this.role = role;
 -      this.endTime = endTime;
 -    }
 -  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RequestDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
index de2d25a,6bfad54..94f5fa5
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
@@@ -159,29 -145,9 +159,29 @@@ public class ServiceConfigDAO 
    }
  
    /**
 +   *  Gets the latest service config versions of default config group for a service
 +   * @param clusterId
 +   *          the cluster (not {@code null}).
 +   * @param serviceName
 +   *          Name of the service whose latest service config versions needs to be retrieved .
 +   * @return all default group service configurations for the cluster and service.
 +   */
 +  @RequiresSession
 +  public ServiceConfigEntity getLastServiceConfigForServiceDefaultGroup(Long clusterId, String serviceName) {
 +    TypedQuery<ServiceConfigEntity> query = entityManagerProvider.get().createNamedQuery(
 +        "ServiceConfigEntity.findLatestServiceConfigsByServiceDefaultGroup",
 +        ServiceConfigEntity.class);
 +
 +    query.setParameter("clusterId", clusterId);
 +    query.setParameter("serviceName", serviceName);
 +
 +    return daoUtils.selectOne(query);
 +  }
 +
 +  /**
-    * Get all service configurations for the specified cluster and stack. This
-    * will return different versions of the same configuration (HDFS v1 and v2)
-    * if they exist.
+    * Get service configurations for the specified cluster and stack. This will
+    * return different versions of the same configuration (HDFS v1 and v2) if
+    * they exist.
     *
     * @param clusterId
     *          the cluster (not {@code null}).

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
index 772b151,2b56b11..bf9e678
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
@@@ -130,6 -144,19 +144,9 @@@ public class RepositoryVersionEntity 
    @Column(name="version_xsd", insertable = true, updatable = true)
    private String versionXsd;
  
+   @Column(name = "hidden", nullable = false, insertable = true, updatable = true)
+   private short isHidden = 0;
+ 
 -  /**
 -   * Repositories can't be trusted until they have been deployed and we've
 -   * detected their actual version. Most of the time, things match up, but
 -   * editing a VDF could causes the version to be misrepresented. Once we have
 -   * received the correct version of the repository (normally after it's been
 -   * installed), then we can set this flag to {@code true}.
 -   */
 -  @Column(name = "resolved", nullable = false)
 -  private short resolved = 0;
 -
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private RepositoryVersionEntity parent;
@@@ -433,4 -455,45 +438,25 @@@
      return null == parent ? null : parent.getId();
    }
  
+   /**
+    * Gets whether this repository is hidden.
+    *
+    * @return
+    */
+   public boolean isHidden() {
+     return isHidden != 0;
+   }
+ 
+   /**
+    * Sets whether this repository is hidden. A repository can be hidden for
+    * several reasons, including if it has been removed (but needs to be kept
+    * around for foreign key relationships) or if it just is not longer desired
+    * to see it.
+    *
+    * @param isHidden
+    */
+   public void setHidden(boolean isHidden) {
+     this.isHidden = (short) (isHidden ? 1 : 0);
+   }
+ 
 -  /**
 -   * Gets whether this repository has been installed and has reported back its
 -   * actual version.
 -   *
 -   * @return {@code true} if the version for this repository can be trusted,
 -   *         {@code false} otherwise.
 -   */
 -  public boolean isResolved() {
 -    return resolved == 1;
 -  }
 -
 -  /**
 -   * Sets whether this repository has been installed and has reported back its
 -   * actual version.
 -   *
 -   * @param resolved
 -   */
 -  public void setResolved(boolean resolved) {
 -    this.resolved = resolved ? (short) 1 : (short) 0;
 -  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
index 50dcd1c,b1409ed..6df260d
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
@@@ -46,13 -46,24 +46,27 @@@ import javax.persistence.TableGenerator
    , initialValue = 1
  )
  @NamedQueries({
-     @NamedQuery(name = "ServiceConfigEntity.findAll", query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId ORDER BY serviceConfig.version DESC"),
-     @NamedQuery(name = "ServiceConfigEntity.findNextServiceConfigVersion", query = "SELECT COALESCE(MAX(serviceConfig.version), 0) + 1 AS nextVersion FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.serviceName=:serviceName AND serviceConfig.clusterId=:clusterId"),
-     @NamedQuery(name = "ServiceConfigEntity.findAllServiceConfigsByStack", query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId AND serviceConfig.stack=:stack"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByStack", query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId = :clusterId AND (serviceConfig.groupId = null OR serviceConfig.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND serviceConfig.version = (SELECT MAX(serviceConfig2.version) FROM ServiceConfigEntity serviceConfig2 WHERE serviceConfig2.clusterId= :clusterId AND serviceConfig2.stack = :stack AND serviceConfig2.serviceName = serviceConfig.serviceName)"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByService", query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND (scv.groupId = null OR scv.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND (scv2.groupId = scv.groupId OR (scv2.groupId IS NULL AND scv.groupId IS NULL)))"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByServiceDefaultGroup", query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND scv.groupId = null AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND scv2.groupId IS NULL)"),
-     @NamedQuery(name = "ServiceConfigEntity.findLatestServiceConfigsByCluster", query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceConfigId IN (SELECT MAX(scv1.serviceConfigId) FROM ServiceConfigEntity scv1 WHERE (scv1.clusterId = :clusterId) AND (scv1.groupId IS NULL) GROUP BY scv1.serviceName)")})
+     @NamedQuery(
+         name = "ServiceConfigEntity.findAll",
+         query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId ORDER BY serviceConfig.version DESC"),
+     @NamedQuery(
+         name = "ServiceConfigEntity.findNextServiceConfigVersion",
+         query = "SELECT COALESCE(MAX(serviceConfig.version), 0) + 1 AS nextVersion FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.serviceName=:serviceName AND serviceConfig.clusterId=:clusterId"),
+     @NamedQuery(
 -        name = "ServiceConfigEntity.findServiceConfigsByStack",
++        name = "ServiceConfigEntity.findAllServiceConfigsByStack",
+         query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId=:clusterId AND serviceConfig.stack=:stack AND serviceConfig.serviceName=:serviceName"),
+     @NamedQuery(
+         name = "ServiceConfigEntity.findLatestServiceConfigsByStack",
+         query = "SELECT serviceConfig FROM ServiceConfigEntity serviceConfig WHERE serviceConfig.clusterId = :clusterId AND (serviceConfig.groupId = null OR serviceConfig.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND serviceConfig.version = (SELECT MAX(serviceConfig2.version) FROM ServiceConfigEntity serviceConfig2 WHERE serviceConfig2.clusterId= :clusterId AND serviceConfig2.stack = :stack AND serviceConfig2.serviceName = serviceConfig.serviceName)"),
+     @NamedQuery(
+         name = "ServiceConfigEntity.findLatestServiceConfigsByService",
+         query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND (scv.groupId = null OR scv.groupId IN (SELECT cg.groupId from ConfigGroupEntity cg)) AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND (scv2.groupId = scv.groupId OR (scv2.groupId IS NULL AND scv.groupId IS NULL)))"),
+     @NamedQuery(
++        name = "ServiceConfigEntity.findLatestServiceConfigsByServiceDefaultGroup",
++        query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceName = :serviceName AND scv.groupId = null AND scv.version = (SELECT MAX(scv2.version) FROM ServiceConfigEntity scv2 WHERE (scv2.serviceName = :serviceName AND scv2.clusterId = :clusterId) AND scv2.groupId IS NULL)"),
++    @NamedQuery(
+         name = "ServiceConfigEntity.findLatestServiceConfigsByCluster",
+         query = "SELECT scv FROM ServiceConfigEntity scv WHERE scv.clusterId = :clusterId AND scv.serviceConfigId IN (SELECT MAX(scv1.serviceConfigId) FROM ServiceConfigEntity scv1 WHERE (scv1.clusterId = :clusterId) AND (scv1.groupId IS NULL) GROUP BY scv1.serviceName)") })
  public class ServiceConfigEntity {
    @Id
    @Column(name = "service_config_id")

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/UpgradeItemEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
index cab467f,e804961..95fc973
--- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
@@@ -664,7 -666,7 +663,7 @@@ public class ExecutionScheduleManager 
    }
  
    protected BatchRequestResponse performApiGetRequest(String relativeUri, boolean queryAllFields) {
-     WebResource webResource = ambariWebResource.path(relativeUri);
 -    WebResource webResource = extendApiResource(ambariWebResource, relativeUri);
++    WebResource webResource = ambariWebResource.path(completeRelativeUri(relativeUri));
      if (queryAllFields) {
        webResource = webResource.queryParam("fields", "*");
      }
@@@ -680,7 -682,8 +679,7 @@@
    protected BatchRequestResponse performApiRequest(String relativeUri, String body, String method, Integer userId) {
      ClientResponse response;
      try {
-       response = ambariWebResource.path(relativeUri).header(USER_ID_HEADER, userId).method(method, ClientResponse.class, body);
 -      response = extendApiResource(ambariWebResource, relativeUri)
 -          .header(USER_ID_HEADER, userId).method(method, ClientResponse.class, body);
++      response = ambariWebResource.path(completeRelativeUri(relativeUri)).header(USER_ID_HEADER, userId).method(method, ClientResponse.class, body);
      } catch (UniformInterfaceException e) {
        response = e.getResponse();
      }
@@@ -796,5 -799,19 +795,16 @@@
        requestExecution.updateStatus(RequestExecution.Status.COMPLETED);
      }
    }
+ 
 -  /**
 -   * Returns the absolute web resource with {@link #DEFAULT_API_PATH}
 -   * @param webResource Ambari WebResource as provided by the client {@link #ambariWebResource}
 -   * @param relativeUri relative request URI
 -   * @return  Extended WebResource
 -   */
 -  protected WebResource extendApiResource(WebResource webResource, String relativeUri) {
 -    WebResource result = webResource;
 -    if (StringUtils.isNotEmpty(relativeUri) && !CONTAINS_API_VERSION_PATTERN.matcher(relativeUri).matches()) {
 -      result = webResource.path(DEFAULT_API_PATH);
++  private String completeRelativeUri(String relativeUri){
++    if (StringUtils.isNotEmpty(relativeUri)
++        && !(relativeUri.startsWith("api/v1") || relativeUri.startsWith("/api/v1"))){
++      if (relativeUri.charAt(0) != '/') {
++        relativeUri = '/' + relativeUri;
++      }
++      return "api/v1" + relativeUri;
+     }
 -    return result.path(relativeUri);
++    return relativeUri;
+   }
  }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/security/authentication/AmbariDelegatingAuthenticationFilter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariUserAuthentication.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/AbstractServerAction.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
index 7aac346,3db844a..d6b8ffc
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/AbstractPrepareKerberosServerAction.java
@@@ -75,7 -76,23 +76,21 @@@ public abstract class AbstractPrepareKe
                                      Map<String, Map<String, String>> currentConfigurations,
                                      Map<String, Map<String, String>> kerberosConfigurations,
                                      boolean includeAmbariIdentity,
 -                                    Map<String, Set<String>> propertiesToBeIgnored,
 -                                    boolean excludeHeadless) throws AmbariException {
 +                                    Map<String, Set<String>> propertiesToBeIgnored) throws AmbariException {
+     List<Component> components = new ArrayList<>();
+     for (ServiceComponentHost each : schToProcess) {
+       components.add(Component.fromServiceComponentHost(each));
+     }
 -    processServiceComponents(cluster, kerberosDescriptor, components, identityFilter, dataDirectory, currentConfigurations, kerberosConfigurations, includeAmbariIdentity, propertiesToBeIgnored, excludeHeadless);
++    processServiceComponents(cluster, kerberosDescriptor, components, identityFilter, dataDirectory, currentConfigurations, kerberosConfigurations, includeAmbariIdentity, propertiesToBeIgnored);
+   }
+ 
+   protected void processServiceComponents(Cluster cluster, KerberosDescriptor kerberosDescriptor,
+                                           List<Component> schToProcess,
+                                           Collection<String> identityFilter, String dataDirectory,
+                                           Map<String, Map<String, String>> currentConfigurations,
+                                           Map<String, Map<String, String>> kerberosConfigurations,
+                                           boolean includeAmbariIdentity,
 -                                          Map<String, Set<String>> propertiesToBeIgnored,
 -                                          boolean excludeHeadless) throws AmbariException {
++                                          Map<String, Set<String>> propertiesToBeIgnored) throws AmbariException {
  
      actionLog.writeStdOut("Processing Kerberos identities and configurations");
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
index 5b65833,f56e946..4e63f4a
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareDisableKerberosServerAction.java
@@@ -111,29 -105,25 +105,25 @@@ public class PrepareDisableKerberosServ
  
      // Calculate the current host-specific configurations. These will be used to replace
      // variables within the Kerberos descriptor data
-     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptorProperties);
+     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
  
      processServiceComponentHosts(cluster, kerberosDescriptor, schToProcess, identityFilter, dataDirectory,
 -        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore, false);
 +        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore);
  
      // Add auth-to-local configurations to the set of changes
-     Set<String> authToLocalProperties = kerberosDescriptor.getAllAuthToLocalProperties();
+     Map<String, Set<String>> authToLocalProperties = kerberosHelper.translateConfigurationSpecifications(kerberosDescriptor.getAllAuthToLocalProperties());
      if (authToLocalProperties != null) {
-       for (String authToLocalProperty : authToLocalProperties) {
-         Matcher m = KerberosDescriptor.AUTH_TO_LOCAL_PROPERTY_SPECIFICATION_PATTERN.matcher(authToLocalProperty);
- 
-         if (m.matches()) {
-           String configType = m.group(1);
-           String propertyName = m.group(2);
- 
-           if (configType == null) {
-             configType = "";
-           }
- 
-           // Add existing auth_to_local configuration, if set
-           Map<String, String> configuration = kerberosConfigurations.get(configType);
-           if (configuration != null) {
-             configuration.put(propertyName, "DEFAULT");
+       for (Map.Entry<String, Set<String>> entry : authToLocalProperties.entrySet()) {
+         String configType = entry.getKey();
+         Set<String> propertyNames = entry.getValue();
+ 
+         if (!CollectionUtils.isEmpty(propertyNames)) {
+           for (String propertyName : propertyNames) {
+             // Add existing auth_to_local configuration, if set
+             Map<String, String> configuration = kerberosConfigurations.get(configType);
+             if (configuration != null) {
+               configuration.put(propertyName, "DEFAULT");
+             }
            }
          }
        }

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
index ca15695,3ec84fa..e13f033
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareEnableKerberosServerAction.java
@@@ -87,11 -114,15 +114,15 @@@ public class PrepareEnableKerberosServe
  
      // Calculate the current host-specific configurations. These will be used to replace
      // variables within the Kerberos descriptor data
-     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptorProperties);
+     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
  
      processServiceComponentHosts(cluster, kerberosDescriptor, schToProcess, identityFilter, dataDirectory,
 -        configurations, kerberosConfigurations, true, propertiesToIgnore, false);
 +        configurations, kerberosConfigurations, true, propertiesToIgnore);
  
+     // Calculate the set of configurations to update and replace any variables
+     // using the previously calculated Map of configurations for the host.
+     kerberosConfigurations = kerberosHelper.processPreconfiguredServiceConfigurations(kerberosConfigurations, configurations, cluster, kerberosDescriptor);
+ 
      kerberosHelper.applyStackAdvisorUpdates(cluster, services, configurations, kerberosConfigurations,
            propertiesToIgnore, propertiesToRemove, true);
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
index f239cff,49828cb..00c82a5
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/PrepareKerberosIdentitiesServerAction.java
@@@ -92,16 -92,17 +91,17 @@@ public class PrepareKerberosIdentitiesS
  
      // Calculate the current host-specific configurations. These will be used to replace
      // variables within the Kerberos descriptor data
-     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptorProperties);
+     Map<String, Map<String, String>> configurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
  
      processServiceComponentHosts(cluster, kerberosDescriptor, schToProcess, identityFilter, dataDirectory,
 -        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore, !CollectionUtils.isEmpty(getHostFilter()));
 +        configurations, kerberosConfigurations, includeAmbariIdentity, propertiesToIgnore);
  
      kerberosHelper.applyStackAdvisorUpdates(cluster, services, configurations, kerberosConfigurations,
-         propertiesToIgnore,  propertiesToRemove, true);
+         propertiesToIgnore, propertiesToRemove, true);
  
      if ("true".equalsIgnoreCase(getCommandParameterValue(commandParameters, UPDATE_CONFIGURATIONS))) {
-       processAuthToLocalRules(cluster, kerberosDescriptor, schToProcess, kerberosConfigurations, getDefaultRealm(commandParameters));
+       Map<String, Map<String, String>> calculatedConfigurations = kerberosHelper.calculateConfigurations(cluster, null, kerberosDescriptor, false, false);
+       processAuthToLocalRules(cluster, calculatedConfigurations, kerberosDescriptor, schToProcess, kerberosConfigurations, getDefaultRealm(commandParameters), false);
        processConfigurationChanges(dataDirectory, kerberosConfigurations, propertiesToRemove);
      }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/be73d167/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
index 086055d,451f802..5ec0692
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
@@@ -300,12 -198,22 +198,17 @@@ public class FinalizeUpgradeAction exte
          }
        }
  
-       // Impacts all hosts that have a version
-       outSB.append(
-           String.format("Finalizing the version for %d host(s).\n", hostVersionsAllowed.size()));
-       cluster.mapHostVersions(hostsToUpdate, upgradingClusterVersion, RepositoryVersionState.CURRENT);
+       // move host versions from CURRENT to INSTALLED if their repos are no
+       // longer used
+       finalizeHostRepositoryVersions(cluster);
+ 
 -      if (upgradeContext.getOrchestrationType() == RepositoryType.STANDARD) {
 -        outSB.append(String.format("Finalizing the version for cluster %s.\n", cluster.getClusterName()));
 -        cluster.setCurrentStackVersion(cluster.getDesiredStackVersion());
 -      }
 -
+       // mark revertable
+       if (repositoryType.isRevertable() && direction == Direction.UPGRADE) {
+         UpgradeEntity upgrade = cluster.getUpgradeInProgress();
+         upgrade.setRevertAllowed(true);
+         upgrade = m_upgradeDAO.merge(upgrade);
+       }
  
-       versionEventPublisher.publish(new StackUpgradeFinishEvent(cluster));
        // Reset upgrade state
        cluster.setUpgradeEntity(null);