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

[2/4] ambari git commit: AMBARI-21201. Add ConfigChange event to capture config changes (mpapirkovskyy)

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ComponentStatusReports.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ComponentStatusReports.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ComponentStatusReports.java
index 2a3e4bc..a53570c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ComponentStatusReports.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ComponentStatusReports.java
@@ -19,27 +19,27 @@
 package org.apache.ambari.server.agent.stomp.dto;
 
 import java.util.List;
-import java.util.Map;
+import java.util.TreeMap;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ComponentStatusReports {
 
   @JsonProperty("clustersReports")
-  private Map<String, List<ComponentStatusReport>> componentStatusReports;
+  private TreeMap<String, List<ComponentStatusReport>> componentStatusReports;
 
   public ComponentStatusReports() {
   }
 
-  public ComponentStatusReports(Map<String, List<ComponentStatusReport>> componentStatusReports) {
+  public ComponentStatusReports(TreeMap<String, List<ComponentStatusReport>> componentStatusReports) {
     this.componentStatusReports = componentStatusReports;
   }
 
-  public Map<String, List<ComponentStatusReport>> getComponentStatusReports() {
+  public TreeMap<String, List<ComponentStatusReport>> getComponentStatusReports() {
     return componentStatusReports;
   }
 
-  public void setComponentStatusReports(Map<String, List<ComponentStatusReport>> componentStatusReports) {
+  public void setComponentStatusReports(TreeMap<String, List<ComponentStatusReport>> componentStatusReports) {
     this.componentStatusReports = componentStatusReports;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hash.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hash.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hash.java
new file mode 100644
index 0000000..19f9597
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hash.java
@@ -0,0 +1,41 @@
+/**
+ * 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.agent.stomp.dto;
+
+/**
+ * Is used to contain hash code in request from agent
+ */
+public class Hash {
+  private String hash;
+
+  public Hash(String hash) {
+    this.hash = hash;
+  }
+
+  public Hash() {
+  }
+
+  public String getHash() {
+    return hash;
+  }
+
+  public void setHash(String hash) {
+    this.hash = hash;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hashable.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hashable.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hashable.java
new file mode 100644
index 0000000..0035893
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/Hashable.java
@@ -0,0 +1,27 @@
+/**
+ * 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.agent.stomp.dto;
+
+/**
+ * Update event object has hash to identify actual version
+ */
+public interface Hashable {
+  String getHash();
+  void setHash(String hash);
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataCluster.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataCluster.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataCluster.java
new file mode 100644
index 0000000..07e85df
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataCluster.java
@@ -0,0 +1,69 @@
+/**
+ * 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.agent.stomp.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TreeMap;
+
+import org.apache.ambari.server.state.SecurityType;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class MetadataCluster {
+  @JsonProperty("status_commands_to_run")
+  private List<String> statusCommandsToRun = new ArrayList<>();
+  private TreeMap<String, MetadataServiceInfo> serviceLevelParams;
+  private TreeMap<String, String> clusterLevelParams;
+
+  public MetadataCluster(SecurityType securityType, TreeMap<String,MetadataServiceInfo> serviceLevelParams,
+                         TreeMap<String, String> clusterLevelParams) {
+    this.statusCommandsToRun.add("STATUS");
+    if (SecurityType.KERBEROS.equals(securityType)) {
+      this.statusCommandsToRun.add("SECURITY_STATUS");
+    }
+    this.serviceLevelParams = serviceLevelParams;
+    this.clusterLevelParams = clusterLevelParams;
+  }
+
+  public List<String> getStatusCommandsToRun() {
+    return statusCommandsToRun;
+  }
+
+  public void setStatusCommandsToRun(List<String> statusCommandsToRun) {
+    this.statusCommandsToRun = statusCommandsToRun;
+  }
+
+  public TreeMap<String, MetadataServiceInfo> getServiceLevelParams() {
+    return serviceLevelParams;
+  }
+
+  public void setServiceLevelParams(TreeMap<String, MetadataServiceInfo> serviceLevelParams) {
+    this.serviceLevelParams = serviceLevelParams;
+  }
+
+  public TreeMap<String, String> getClusterLevelParams() {
+    return clusterLevelParams;
+  }
+
+  public void setClusterLevelParams(TreeMap<String, String> clusterLevelParams) {
+    this.clusterLevelParams = clusterLevelParams;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java
new file mode 100644
index 0000000..aea8986
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/MetadataServiceInfo.java
@@ -0,0 +1,71 @@
+/**
+ * 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.agent.stomp.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class MetadataServiceInfo {
+  private String version;
+  private Boolean credentialStoreEnabled;
+  @JsonProperty("status_commands_timeout")
+  private Long statusCommandsTimeout;
+
+  @JsonProperty("service_package_folder")
+  private String servicePackageFolder;
+
+  public MetadataServiceInfo(String version, Boolean credentialStoreEnabled, Long statusCommandsTimeout,
+                             String servicePackageFolder) {
+    this.version = version;
+    this.credentialStoreEnabled = credentialStoreEnabled;
+    this.statusCommandsTimeout = statusCommandsTimeout;
+    this.servicePackageFolder = servicePackageFolder;
+  }
+
+  public String getVersion() {
+    return version;
+  }
+
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  public Boolean getCredentialStoreEnabled() {
+    return credentialStoreEnabled;
+  }
+
+  public void setCredentialStoreEnabled(Boolean credentialStoreEnabled) {
+    this.credentialStoreEnabled = credentialStoreEnabled;
+  }
+
+  public Long getStatusCommandsTimeout() {
+    return statusCommandsTimeout;
+  }
+
+  public void setStatusCommandsTimeout(Long statusCommandsTimeout) {
+    this.statusCommandsTimeout = statusCommandsTimeout;
+  }
+
+  public String getServicePackageFolder() {
+    return servicePackageFolder;
+  }
+
+  public void setServicePackageFolder(String servicePackageFolder) {
+    this.servicePackageFolder = servicePackageFolder;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
index 4ddb8a6..7a464df 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
@@ -18,13 +18,22 @@
 package org.apache.ambari.server.agent.stomp.dto;
 
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 
+import org.apache.ambari.server.events.TopologyUpdateEvent;
+
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 @JsonInclude(JsonInclude.Include.NON_EMPTY)
 public class TopologyCluster {
+  private String clusterName;
+
+  @JsonProperty("components")
   private Set<TopologyComponent> topologyComponents = new HashSet<>();
+
+  @JsonProperty("hosts")
   private Set<TopologyHost> topologyHosts = new HashSet<>();
 
   public TopologyCluster() {
@@ -35,6 +44,45 @@ public class TopologyCluster {
     this.topologyHosts = topologyHosts;
   }
 
+  public void update(Set<TopologyComponent> componentsToUpdate, Set<TopologyHost> hostsToUpdate,
+                     TopologyUpdateEvent.EventType eventType) {
+    for (TopologyComponent componentToUpdate : componentsToUpdate) {
+      boolean updated = false;
+      for (Iterator<TopologyComponent> iter = getTopologyComponents().iterator(); iter.hasNext() && !updated; ) {
+        TopologyComponent existsComponent = iter.next();
+        if (existsComponent.equals(componentToUpdate)) {
+          //TODO add case removing not all hostcomponents
+          if (eventType.equals(TopologyUpdateEvent.EventType.DELETE)) {
+            iter.remove();
+          } else {
+            existsComponent.updateComponent(componentToUpdate);
+          }
+          updated = true;
+        }
+      }
+      if (!updated && eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
+        getTopologyComponents().add(componentToUpdate);
+      }
+    }
+    for (TopologyHost hostToUpdate : hostsToUpdate) {
+      boolean updated = false;
+      for (Iterator<TopologyHost> iter = getTopologyHosts().iterator(); iter.hasNext() && !updated; ) {
+        TopologyHost existsHost = iter.next();
+        if (existsHost.equals(hostToUpdate)) {
+          if (eventType.equals(TopologyUpdateEvent.EventType.DELETE)) {
+            iter.remove();
+          } else {
+            existsHost.updateHost(hostToUpdate);
+          }
+          updated = true;
+        }
+      }
+      if (!updated && eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
+        getTopologyHosts().add(hostToUpdate);
+      }
+    }
+  }
+
   public Set<TopologyComponent> getTopologyComponents() {
     return topologyComponents;
   }
@@ -58,4 +106,12 @@ public class TopologyCluster {
   public void addTopologyComponent(TopologyComponent topologyComponent) {
     topologyComponents.add(topologyComponent);
   }
+
+  public String getClusterName() {
+    return clusterName;
+  }
+
+  public void setClusterName(String clusterName) {
+    this.clusterName = clusterName;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
index 019c933..dabbe94 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
@@ -18,7 +18,13 @@
 
 package org.apache.ambari.server.agent.stomp.dto;
 
+import java.util.HashSet;
 import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 
@@ -26,9 +32,12 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 public class TopologyComponent {
   private String componentName;
   private String serviceName;
+  private String displayName;
   private String version;
   private Set<Long> hostIds;
-  private TopologyStatusCommandParams statusCommandParams;
+  private Set<String> hostNames;
+  private Set<String> publicHostNames;
+  private TreeMap<String, String> componentLevelParams;
 
   private TopologyComponent() {
   }
@@ -52,6 +61,11 @@ public class TopologyComponent {
       return this;
     }
 
+    public Builder setDisplayName(String displayName) {
+      TopologyComponent.this.setDisplayName(displayName);
+      return this;
+    }
+
     public Builder setVersion(String version) {
       TopologyComponent.this.setVersion(version);
       return this;
@@ -62,8 +76,18 @@ public class TopologyComponent {
       return this;
     }
 
-    public Builder setStatusCommandParams(TopologyStatusCommandParams statusCommandParams) {
-      TopologyComponent.this.setStatusCommandParams(statusCommandParams);
+    public Builder setHostNames(Set<String> hostNames) {
+      TopologyComponent.this.setHostNames(hostNames);
+      return this;
+    }
+
+    public Builder setPublicHostNames(Set<String> publicHostNames) {
+      TopologyComponent.this.setPublicHostNames(publicHostNames);
+      return this;
+    }
+
+    public Builder setComponentLevelParams(TreeMap<String, String> componentLevelParams) {
+      TopologyComponent.this.setComponentLevelParams(componentLevelParams);
       return this;
     }
 
@@ -72,6 +96,36 @@ public class TopologyComponent {
     }
   }
 
+  public void updateComponent(TopologyComponent componentToUpdate) {
+    //TODO will be a need to change to multi-instance usage
+    if (componentToUpdate.getComponentName().equals(getComponentName())) {
+      if (StringUtils.isNotEmpty(componentToUpdate.getVersion())) {
+        setVersion(componentToUpdate.getVersion());
+      }
+      if (CollectionUtils.isNotEmpty(componentToUpdate.getHostIds())) {
+        if (hostIds == null) {
+          hostIds = new HashSet<>();
+        }
+        hostIds.addAll(componentToUpdate.getHostIds());
+      }
+      if (CollectionUtils.isNotEmpty(componentToUpdate.getHostNames())) {
+        if (hostNames == null) {
+          hostNames = new HashSet<>();
+        }
+        hostNames.addAll(componentToUpdate.getHostNames());
+      }
+      if (CollectionUtils.isNotEmpty(componentToUpdate.getPublicHostNames())) {
+        if (publicHostNames == null) {
+          publicHostNames = new HashSet<>();
+        }
+        publicHostNames.addAll(componentToUpdate.getPublicHostNames());
+      }
+      if (MapUtils.isNotEmpty(componentToUpdate.getComponentLevelParams())) {
+        componentLevelParams.putAll(componentToUpdate.getComponentLevelParams());
+      }
+    }
+  }
+
   public String getComponentName() {
     return componentName;
   }
@@ -108,14 +162,43 @@ public class TopologyComponent {
     this.hostIds.add(hostId);
   }
 
-  public TopologyStatusCommandParams getStatusCommandParams() {
-    return statusCommandParams;
+  public void addHostName(String hostName) {
+    this.hostNames.add(hostName);
+  }
+
+  public TreeMap<String, String> getComponentLevelParams() {
+    return componentLevelParams;
+  }
+
+  public void setComponentLevelParams(TreeMap<String, String> componentLevelParams) {
+    this.componentLevelParams = componentLevelParams;
+  }
+
+  public Set<String> getHostNames() {
+    return hostNames;
+  }
+
+  public void setHostNames(Set<String> hostNames) {
+    this.hostNames = hostNames;
   }
 
-  public void setStatusCommandParams(TopologyStatusCommandParams statusCommandParams) {
-    this.statusCommandParams = statusCommandParams;
+  public String getDisplayName() {
+    return displayName;
   }
 
+  public void setDisplayName(String displayName) {
+    this.displayName = displayName;
+  }
+
+  public Set<String> getPublicHostNames() {
+    return publicHostNames;
+  }
+
+  public void setPublicHostNames(Set<String> publicHostNames) {
+    this.publicHostNames = publicHostNames;
+  }
+
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
@@ -124,13 +207,13 @@ public class TopologyComponent {
     TopologyComponent that = (TopologyComponent) o;
 
     if (!componentName.equals(that.componentName)) return false;
-    return version.equals(that.version);
+    return serviceName.equals(that.serviceName);
   }
 
   @Override
   public int hashCode() {
     int result = componentName.hashCode();
-    result = 31 * result + version.hashCode();
+    result = 31 * result + serviceName.hashCode();
     return result;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
index 1718711..84e3cff 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
@@ -17,6 +17,12 @@
  */
 package org.apache.ambari.server.agent.stomp.dto;
 
+import java.util.TreeMap;
+
+import org.apache.ambari.server.agent.RecoveryConfig;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
@@ -25,6 +31,8 @@ public class TopologyHost {
   private String hostName;
   private String rackName;
   private String ipv4;
+  private TreeMap<String, String> hostLevelParams;
+  private RecoveryConfig recoveryConfig;
 
   public TopologyHost() {
   }
@@ -33,11 +41,31 @@ public class TopologyHost {
     this.hostId = hostId;
   }
 
-  public TopologyHost(Long hostId, String hostName, String rackName, String ipv4) {
+  public TopologyHost(Long hostId, String hostName, String rackName, String ipv4, RecoveryConfig recoveryConfig,
+                      TreeMap<String, String> hostLevelParams) {
     this.hostId = hostId;
     this.hostName = hostName;
     this.rackName = rackName;
     this.ipv4 = ipv4;
+    this.recoveryConfig = recoveryConfig;
+    this.hostLevelParams = hostLevelParams;
+  }
+
+  public void updateHost(TopologyHost hostToUpdate) {
+    if (hostToUpdate.getHostId().equals(getHostId())) {
+      if (StringUtils.isNotEmpty(hostToUpdate.getHostName())) {
+        setHostName(hostToUpdate.getHostName());
+      }
+      if (StringUtils.isNotEmpty(hostToUpdate.getRackName())) {
+        setRackName(hostToUpdate.getRackName());
+      }
+      if (StringUtils.isNotEmpty(hostToUpdate.getIpv4())) {
+        setIpv4(hostToUpdate.getIpv4());
+      }
+      if (MapUtils.isNotEmpty(hostToUpdate.getHostLevelParams())) {
+        hostLevelParams.putAll(hostToUpdate.getHostLevelParams());
+      }
+    }
   }
 
   public Long getHostId() {
@@ -72,6 +100,22 @@ public class TopologyHost {
     this.ipv4 = ipv4;
   }
 
+  public RecoveryConfig getRecoveryConfig() {
+    return recoveryConfig;
+  }
+
+  public void setRecoveryConfig(RecoveryConfig recoveryConfig) {
+    this.recoveryConfig = recoveryConfig;
+  }
+
+  public TreeMap<String, String> getHostLevelParams() {
+    return hostLevelParams;
+  }
+
+  public void setHostLevelParams(TreeMap<String, String> hostLevelParams) {
+    this.hostLevelParams = hostLevelParams;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyStatusCommandParams.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyStatusCommandParams.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyStatusCommandParams.java
deleted file mode 100644
index 1574066..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyStatusCommandParams.java
+++ /dev/null
@@ -1,47 +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.agent.stomp.dto;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class TopologyStatusCommandParams {
-  private String script;
-  private String servicePackageFolder;
-
-  public TopologyStatusCommandParams(String script, String servicePackageFolder) {
-    this.script = script;
-    this.servicePackageFolder = servicePackageFolder;
-  }
-
-  public String getScript() {
-    return script;
-  }
-
-  public void setScript(String script) {
-    this.script = script;
-  }
-
-  public String getServicePackageFolder() {
-    return servicePackageFolder;
-  }
-
-  public void setServicePackageFolder(String servicePackageFolder) {
-    this.servicePackageFolder = servicePackageFolder;
-  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateSummary.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateSummary.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateSummary.java
index 9d3ab9d..fe0198b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateSummary.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateSummary.java
@@ -29,23 +29,27 @@ public final class AlertStateSummary {
    * The {@link AlertState#OK} state information.
    */
   @JsonProperty(value = "OK")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "OK")
   public final AlertStateValues Ok = new AlertStateValues();
 
   /**
    * The {@link AlertState#WARNING} state information.
    */
   @JsonProperty(value = "WARNING")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "WARNING")
   public final AlertStateValues Warning = new AlertStateValues();
 
   /**
    * The {@link AlertState#CRITICAL} state information.
    */
   @JsonProperty(value = "CRITICAL")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "CRITICAL")
   public final AlertStateValues Critical = new AlertStateValues();
 
   /**
    * The {@link AlertState#UNKNOWN} state information.
    */
   @JsonProperty(value = "UNKNOWN")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "UNKNOWN")
   public final AlertStateValues Unknown = new AlertStateValues();
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateValues.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateValues.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateValues.java
index 261aa21..a99a648 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateValues.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertStateValues.java
@@ -20,6 +20,8 @@ package org.apache.ambari.server.api.query.render;
 import org.codehaus.jackson.annotate.JsonProperty;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 /**
  * The {@link AlertStateValues} class holds various information about an alert
  * state, such as the number of instances of that state and the most recent
@@ -30,24 +32,29 @@ public final class AlertStateValues {
    * The total count of non-maintenance mode instances.
    */
   @JsonProperty(value = "count")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "count")
   public int Count = 0;
 
   /**
    * The time of the last state change.
    */
   @JsonProperty(value = "original_timestamp")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "original_timestamp")
   public long Timestamp = 0;
 
   /**
    * The total count of instances in maintenance mode.
    */
   @JsonProperty(value = "maintenance_count")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "maintenance_count")
   public int MaintenanceCount = 0;
 
   /**
    * The most recently received text from any instance of the alert.
    */
   @JsonProperty(value = "latest_text")
+  @com.fasterxml.jackson.annotation.JsonProperty(value = "latest_text")
   @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+  @JsonInclude(JsonInclude.Include.NON_NULL)
   public String AlertText = null;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertSummaryGroupedRenderer.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertSummaryGroupedRenderer.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertSummaryGroupedRenderer.java
index 71f82ad..a2664fa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertSummaryGroupedRenderer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/AlertSummaryGroupedRenderer.java
@@ -138,69 +138,7 @@ public class AlertSummaryGroupedRenderer extends AlertSummaryRenderer {
       MaintenanceState maintenanceState = (MaintenanceState) resource.getPropertyValue(AlertResourceProvider.ALERT_MAINTENANCE_STATE);
       String alertText = (String) resource.getPropertyValue(AlertResourceProvider.ALERT_TEXT);
 
-      // NPE sanity
-      if (null == state) {
-        state = AlertState.UNKNOWN;
-      }
-
-      // NPE sanity
-      long originalTimestamp = 0;
-      if (null != originalTimestampObject) {
-        originalTimestamp = originalTimestampObject.longValue();
-      }
-
-      // NPE sanity
-      boolean isMaintenanceModeEnabled = false;
-      if (null != maintenanceState && maintenanceState != MaintenanceState.OFF) {
-        isMaintenanceModeEnabled = true;
-      }
-
-      // create the group summary info if it doesn't exist yet
-      AlertDefinitionSummary groupSummaryInfo = summaries.get(definitionName);
-      if (null == groupSummaryInfo) {
-        groupSummaryInfo = new AlertDefinitionSummary();
-        groupSummaryInfo.Id = definitionId;
-        groupSummaryInfo.Name = definitionName;
-
-        summaries.put(definitionName, groupSummaryInfo);
-      }
-
-      // set and increment the correct values based on state
-      final AlertStateValues alertStateValues;
-      switch (state) {
-        case CRITICAL: {
-          alertStateValues = groupSummaryInfo.State.Critical;
-          break;
-        }
-        case OK: {
-          alertStateValues = groupSummaryInfo.State.Ok;
-          break;
-        }
-        case WARNING: {
-          alertStateValues = groupSummaryInfo.State.Warning;
-          break;
-        }
-        default:
-        case UNKNOWN: {
-          alertStateValues = groupSummaryInfo.State.Unknown;
-          break;
-        }
-      }
-
-      // update the maintenance count if in MM is enabled, otherwise the
-      // regular count
-      if (isMaintenanceModeEnabled) {
-        alertStateValues.MaintenanceCount++;
-      } else {
-        alertStateValues.Count++;
-      }
-
-      // check to see if this alerts time is sooner; if so, keep track of it
-      // and of its text
-      if (originalTimestamp > alertStateValues.Timestamp) {
-        alertStateValues.Timestamp = originalTimestamp;
-        alertStateValues.AlertText = alertText;
-      }
+      updateSummary(summaries, definitionId, definitionName, state, originalTimestampObject, maintenanceState, alertText);
     }
 
     Set<Entry<String, AlertDefinitionSummary>> entrySet = summaries.entrySet();
@@ -222,6 +160,74 @@ public class AlertSummaryGroupedRenderer extends AlertSummaryRenderer {
     return groupedSummary;
   }
 
+  public static void updateSummary(Map<String, AlertDefinitionSummary> summaries, Long definitionId, String definitionName,
+                            AlertState state, Long originalTimestampObject, MaintenanceState maintenanceState,
+                            String alertText) {
+    // NPE sanity
+    if (null == state) {
+      state = AlertState.UNKNOWN;
+    }
+
+    // NPE sanity
+    long originalTimestamp = 0;
+    if (null != originalTimestampObject) {
+      originalTimestamp = originalTimestampObject.longValue();
+    }
+
+    // NPE sanity
+    boolean isMaintenanceModeEnabled = false;
+    if (null != maintenanceState && maintenanceState != MaintenanceState.OFF) {
+      isMaintenanceModeEnabled = true;
+    }
+
+    // create the group summary info if it doesn't exist yet
+    AlertDefinitionSummary groupSummaryInfo = summaries.get(definitionName);
+    if (null == groupSummaryInfo) {
+      groupSummaryInfo = new AlertDefinitionSummary();
+      groupSummaryInfo.Id = definitionId;
+      groupSummaryInfo.Name = definitionName;
+
+      summaries.put(definitionName, groupSummaryInfo);
+    }
+
+    // set and increment the correct values based on state
+    final AlertStateValues alertStateValues;
+    switch (state) {
+      case CRITICAL: {
+        alertStateValues = groupSummaryInfo.State.Critical;
+        break;
+      }
+      case OK: {
+        alertStateValues = groupSummaryInfo.State.Ok;
+        break;
+      }
+      case WARNING: {
+        alertStateValues = groupSummaryInfo.State.Warning;
+        break;
+      }
+      default:
+      case UNKNOWN: {
+        alertStateValues = groupSummaryInfo.State.Unknown;
+        break;
+      }
+    }
+
+    // update the maintenance count if in MM is enabled, otherwise the
+    // regular count
+    if (isMaintenanceModeEnabled) {
+      alertStateValues.MaintenanceCount++;
+    } else {
+      alertStateValues.Count++;
+    }
+
+    // check to see if this alerts time is sooner; if so, keep track of it
+    // and of its text
+    if (originalTimestamp > alertStateValues.Timestamp) {
+      alertStateValues.Timestamp = originalTimestamp;
+      alertStateValues.AlertText = alertText;
+    }
+  }
+
   /**
    * {@inheritDoc}
    * <p/>
@@ -245,12 +251,15 @@ public class AlertSummaryGroupedRenderer extends AlertSummaryRenderer {
    */
   public final static class AlertDefinitionSummary {
     @JsonProperty(value = "definition_id")
+    @com.fasterxml.jackson.annotation.JsonProperty(value = "definition_id")
     public long Id;
 
     @JsonProperty(value = "definition_name")
+    @com.fasterxml.jackson.annotation.JsonProperty(value = "definition_name")
     public String Name;
 
     @JsonProperty(value = "summary")
+    @com.fasterxml.jackson.annotation.JsonProperty(value = "summary")
     public final AlertStateSummary State = new AlertStateSummary();
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index 4887d52..65e5fd2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -43,7 +43,6 @@ import javax.xml.bind.JAXBException;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ParentObjectNotFoundException;
 import org.apache.ambari.server.StackAccessException;
-import org.apache.ambari.server.agent.stomp.dto.TopologyStatusCommandParams;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
@@ -62,7 +61,6 @@ import org.apache.ambari.server.stack.StackManager;
 import org.apache.ambari.server.stack.StackManagerFactory;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
-import org.apache.ambari.server.state.CommandScriptDefinition;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.DependencyInfo;
 import org.apache.ambari.server.state.ExtensionInfo;
@@ -1487,29 +1485,4 @@ public class AmbariMetaInfo {
 
     return versionDefinitions;
   }
-
-  //TODO will be a need to change to multi-instance usage
-  public TopologyStatusCommandParams getStatusCommandParams(StackId stackId, String serviceName, String componentName) throws AmbariException {
-    ServiceInfo serviceInfo = getService(stackId.getStackName(),
-        stackId.getStackVersion(), serviceName);
-    ComponentInfo componentInfo = getComponent(
-        stackId.getStackName(), stackId.getStackVersion(),
-        serviceName, componentName);
-
-    String scriptName = null;
-    CommandScriptDefinition script = componentInfo.getCommandScript();
-    if (serviceInfo.getSchemaVersion().equals(AmbariMetaInfo.SCHEMA_VERSION_2)) {
-      if (script != null) {
-        scriptName = script.getScript();
-      } else {
-        String message = String.format("Component %s of service %s has not " +
-            "command script defined", componentName, serviceName);
-        throw new AmbariException(message);
-      }
-    }
-    String servicePackageFolder = serviceInfo.getServicePackageFolder();
-    return new TopologyStatusCommandParams(scriptName, servicePackageFolder);
-  }
-
-
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index 17bc718..c11763c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -755,7 +755,7 @@ public class AmbariCustomCommandExecutionHelper {
       }
     }
 
-    String commandTimeout = configs.getDefaultAgentTaskTimeout(false);
+    String commandTimeout = getStatusCommandTimeout(serviceInfo);
 
     if (serviceInfo.getSchemaVersion().equals(AmbariMetaInfo.SCHEMA_VERSION_2)) {
       // Service check command is not custom command
@@ -763,9 +763,6 @@ public class AmbariCustomCommandExecutionHelper {
       if (script != null) {
         commandParams.put(SCRIPT, script.getScript());
         commandParams.put(SCRIPT_TYPE, script.getScriptType().toString());
-        if (script.getTimeout() > 0) {
-          commandTimeout = String.valueOf(script.getTimeout());
-        }
       } else {
         String message = String.format("Service %s has no command script " +
             "defined. It is not possible to run service check" +
@@ -775,12 +772,6 @@ public class AmbariCustomCommandExecutionHelper {
       // We don't need package/repo information to perform service check
     }
 
-    // Try to apply overridden service check timeout value if available
-    Long overriddenTimeout = configs.getAgentServiceCheckTaskTimeout();
-    if (!overriddenTimeout.equals(Configuration.AGENT_SERVICE_CHECK_TASK_TIMEOUT.getDefaultValue())) {
-      commandTimeout = String.valueOf(overriddenTimeout);
-    }
-
     commandParams.put(COMMAND_TIMEOUT, commandTimeout);
     String checkType = configHelper.getValueFromDesiredConfigurations(cluster, ConfigHelper.CLUSTER_ENV, ConfigHelper.SERVICE_CHECK_TYPE);
     if (ConfigHelper.SERVICE_CHECK_MINIMAL.equals(checkType)) {
@@ -1485,4 +1476,30 @@ public class AmbariCustomCommandExecutionHelper {
     hosts.removeAll(removedHosts);
     return removedHosts;
   }
+
+  public String getStatusCommandTimeout(ServiceInfo serviceInfo) throws AmbariException {
+    String commandTimeout = configs.getDefaultAgentTaskTimeout(false);
+
+    if (serviceInfo.getSchemaVersion().equals(AmbariMetaInfo.SCHEMA_VERSION_2)) {
+      // Service check command is not custom command
+      CommandScriptDefinition script = serviceInfo.getCommandScript();
+      if (script != null) {
+        if (script.getTimeout() > 0) {
+          commandTimeout = String.valueOf(script.getTimeout());
+        }
+      } else {
+        String message = String.format("Service %s has no command script " +
+            "defined. It is not possible to run service check" +
+            " for this service", serviceInfo.getName());
+        throw new AmbariException(message);
+      }
+    }
+
+    // Try to apply overridden service check timeout value if available
+    Long overriddenTimeout = configs.getAgentServiceCheckTaskTimeout();
+    if (!overriddenTimeout.equals(Configuration.AGENT_SERVICE_CHECK_TASK_TIMEOUT.getDefaultValue())) {
+      commandTimeout = String.valueOf(overriddenTimeout);
+    }
+    return commandTimeout;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 52497f2..134979e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -18,6 +18,8 @@
 
 package org.apache.ambari.server.controller;
 
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STACK_RETRY_COUNT;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STACK_RETRY_ON_UNAVAILABILITY;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL;
@@ -27,10 +29,19 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_R
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CUSTOM_FOLDER;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_NAME;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOST_SYS_PREPPED;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JAVA_HOME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JAVA_VERSION;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JCE_NAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_NAME;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MAX_DURATION_OF_RETRIES;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MYSQL_JDBC_URL;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.NOT_MANAGED_HDFS_PATH_LIST;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.ORACLE_JDBC_URL;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_VERSION;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO;
@@ -38,6 +49,8 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_GROUPS;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST;
@@ -89,6 +102,8 @@ import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
+import org.apache.ambari.server.agent.stomp.dto.MetadataCluster;
+import org.apache.ambari.server.agent.stomp.dto.MetadataServiceInfo;
 import org.apache.ambari.server.agent.stomp.dto.TopologyCluster;
 import org.apache.ambari.server.agent.stomp.dto.TopologyComponent;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -109,6 +124,7 @@ import org.apache.ambari.server.controller.metrics.MetricsCollectorHAManager;
 import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.customactions.ActionDefinition;
+import org.apache.ambari.server.events.MetadataUpdateEvent;
 import org.apache.ambari.server.events.TopologyUpdateEvent;
 import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.events.publishers.StateUpdateEventPublisher;
@@ -327,7 +343,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
   private StateUpdateEventPublisher stateUpdateEventPublisher;
 
   @Inject
-  TopologyDeleteFormer topologyDeleteFormer;
+  private TopologyDeleteFormer topologyDeleteFormer;
+
+  @Inject
+  private AmbariCustomCommandExecutionHelper ambariCustomCommandExecutionHelper;
 
   /**
    * The KerberosHelper to help setup for enabling for disabling Kerberos
@@ -723,7 +742,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
 
   private TopologyUpdateEvent getAddedComponentsTopologyEvent(Set<ServiceComponentHostRequest> requests)
     throws AmbariException {
-    Map<String, TopologyCluster> topologyUpdates = new HashMap<>();
+    TreeMap<String, TopologyCluster> topologyUpdates = new TreeMap<>();
     for (ServiceComponentHostRequest request : requests) {
       String serviceName = request.getServiceName();
       String componentName = request.getComponentName();
@@ -731,10 +750,15 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       Collection<Host> clusterHosts = cluster.getHosts();
       Service s = cluster.getService(serviceName);
       ServiceComponent sc = s.getServiceComponent(componentName);
-      Set<String> hostNames = cluster.getHosts(serviceName, componentName);
+      String hostName = request.getHostname();
       Set<Long> hostIds = clusterHosts.stream()
-          .filter(h -> hostNames.contains(h.getHostName()))
+          .filter(h -> hostName.equals(h.getHostName()))
           .map(h -> h.getHostId()).collect(Collectors.toSet());
+      Set<String> publicHostNames = clusterHosts.stream()
+          .filter(h -> hostName.equals(h.getHostName()))
+          .map(h -> h.getPublicHostName()).collect(Collectors.toSet());
+      Set<String> hostNames = new HashSet<>();
+      hostNames.add(hostName);
       ServiceComponentHost sch = sc.getServiceComponentHost(request.getHostname());
 
       StackId stackId = cluster.getDesiredStackVersion();
@@ -742,17 +766,27 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       TopologyComponent newComponent = TopologyComponent.newBuilder()
           .setComponentName(sch.getServiceComponentName())
           .setServiceName(sch.getServiceName())
+          .setDisplayName(sc.getDisplayName())
           .setVersion(sch.getVersion())
           .setHostIds(hostIds)
-          .setStatusCommandParams(ambariMetaInfo.getStatusCommandParams(stackId, serviceName, componentName))
+          .setHostNames(hostNames)
+          .setPublicHostNames(publicHostNames)
+          .setComponentLevelParams(getTopologyComponentLevelParams(stackId, serviceName, componentName, cluster.getSecurityType()))
           .build();
       String clusterId = Long.toString(cluster.getClusterId());
       if (!topologyUpdates.containsKey(clusterId)) {
         topologyUpdates.put(clusterId, new TopologyCluster());
       }
-      topologyUpdates.get(clusterId).addTopologyComponent(newComponent);
+      if (topologyUpdates.get(clusterId).getTopologyComponents().contains(newComponent)) {
+        Set<TopologyComponent> newComponents = new HashSet<>();
+        newComponents.add(newComponent);
+        topologyUpdates.get(clusterId).update(newComponents, Collections.emptySet(),
+            TopologyUpdateEvent.EventType.UPDATE);
+      } else {
+        topologyUpdates.get(clusterId).addTopologyComponent(newComponent);
+      }
     }
-    return new TopologyUpdateEvent(topologyUpdates, TopologyUpdateEvent.EventType.ADD);
+    return new TopologyUpdateEvent(topologyUpdates, TopologyUpdateEvent.EventType.UPDATE);
   }
 
   private void setMonitoringServicesRestartRequired(
@@ -2476,14 +2510,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       hostParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName());
     }
 
-    List<String> clientsToUpdateConfigsList = componentInfo.getClientsToUpdateConfigs();
-    if (clientsToUpdateConfigsList == null) {
-      clientsToUpdateConfigsList = new ArrayList<>();
-      clientsToUpdateConfigsList.add("*");
-    }
-
-    String clientsToUpdateConfigs = gson.toJson(clientsToUpdateConfigsList);
-    hostParams.put(CLIENTS_TO_UPDATE_CONFIGS, clientsToUpdateConfigs);
+    hostParams.put(CLIENTS_TO_UPDATE_CONFIGS, getClientsToUpdateConfigs(componentInfo));
 
     // If we are starting a component, calculate whether the unlimited key JCE policy is
     // required for the relevant host.  One of the following indicates that the unlimited
@@ -2492,17 +2519,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     //   * The component explicitly requires it whether Kerberos is enabled or not (example, SMARTSENSE/HST_SERVER)
     //   * The component explicitly requires it only when Kerberos is enabled AND Kerberos is enabled (example, most components)
     //
-    UnlimitedKeyJCERequirement unlimitedKeyJCERequirement = componentInfo.getUnlimitedKeyJCERequired();
-    // Ensure that the unlimited key requirement is set. If null, the default value should be used.
-    if(unlimitedKeyJCERequirement == null) {
-      unlimitedKeyJCERequirement = UnlimitedKeyJCERequirement.DEFAULT;
-    }
-
-    boolean unlimitedKeyJCEPolicyRequired = (UnlimitedKeyJCERequirement.ALWAYS == unlimitedKeyJCERequirement) ||
-        ((UnlimitedKeyJCERequirement.KERBEROS_ENABLED == unlimitedKeyJCERequirement) && (cluster.getSecurityType() == SecurityType.KERBEROS));
-
     // Set/update the unlimited_key_jce_required value as needed
-    hostParams.put(UNLIMITED_KEY_JCE_REQUIRED, (unlimitedKeyJCEPolicyRequired) ? "true" : "false");
+    hostParams.put(UNLIMITED_KEY_JCE_REQUIRED, (getUnlimitedKeyJCERequirement(componentInfo, cluster.getSecurityType())) ? "true" : "false");
 
     execCmd.setHostLevelParams(hostParams);
 
@@ -5622,4 +5640,148 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     return QuickLinkVisibilityControllerFactory.get(quickLinkProfileJson);
   }
 
+  /**
+   * Collects metadata info about clusters for agent.
+   * @return metadata info about clusters
+   * @throws AmbariException
+   */
+  public MetadataUpdateEvent getClustersMetadata() throws AmbariException {
+    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
+
+    for (Cluster cl : clusters.getClusters().values()) {
+      StackId stackId = cl.getDesiredStackVersion();
+
+      SecurityType securityType = cl.getSecurityType();
+
+      TreeMap<String, MetadataServiceInfo> serviceLevelParams = new TreeMap<>();
+      Collection<ServiceInfo> servicesInfo = ambariMetaInfo.getServices(stackId.getStackName(),
+          stackId.getStackVersion()).values();
+      for (ServiceInfo serviceInfo : servicesInfo) {
+        Long statusCommandTimeout = null;
+        if (serviceInfo.getCommandScript() != null) {
+          statusCommandTimeout = new Long (ambariCustomCommandExecutionHelper.getStatusCommandTimeout(serviceInfo));
+        }
+
+        String servicePackageFolder = serviceInfo.getServicePackageFolder();
+
+        serviceLevelParams.put(serviceInfo.getName(),
+            new MetadataServiceInfo(serviceInfo.getVersion(),
+                serviceInfo.isCredentialStoreEnabled(),
+                statusCommandTimeout,
+                servicePackageFolder));
+      }
+
+      MetadataCluster metadataCluster = new MetadataCluster(securityType,
+          serviceLevelParams,
+          getMetadataClusterLevelParams(cl, stackId));
+      metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
+    }
+
+    MetadataUpdateEvent metadataUpdateEvent = new MetadataUpdateEvent(metadataClusters);
+    return metadataUpdateEvent;
+  }
+
+  private String getClientsToUpdateConfigs(ComponentInfo componentInfo) {
+    List<String> clientsToUpdateConfigsList = componentInfo.getClientsToUpdateConfigs();
+    if (clientsToUpdateConfigsList == null) {
+      clientsToUpdateConfigsList = new ArrayList<>();
+      clientsToUpdateConfigsList.add("*");
+    }
+    return gson.toJson(clientsToUpdateConfigsList);
+  }
+
+  private Boolean getUnlimitedKeyJCERequirement(ComponentInfo componentInfo, SecurityType clusterSecurityType) {
+    UnlimitedKeyJCERequirement unlimitedKeyJCERequirement = componentInfo.getUnlimitedKeyJCERequired();
+    // Ensure that the unlimited key requirement is set. If null, the default value should be used.
+    if(unlimitedKeyJCERequirement == null) {
+      unlimitedKeyJCERequirement = UnlimitedKeyJCERequirement.DEFAULT;
+    }
+
+    return (UnlimitedKeyJCERequirement.ALWAYS == unlimitedKeyJCERequirement) ||
+        ((UnlimitedKeyJCERequirement.KERBEROS_ENABLED == unlimitedKeyJCERequirement) &&
+            (clusterSecurityType == SecurityType.KERBEROS));
+
+  }
+
+  //TODO will be a need to change to multi-instance usage
+  public TreeMap<String, String> getTopologyComponentLevelParams(StackId stackId, String serviceName, String componentName,
+                                                             SecurityType clusterSecurityType) throws AmbariException {
+    ServiceInfo serviceInfo = ambariMetaInfo.getService(stackId.getStackName(),
+        stackId.getStackVersion(), serviceName);
+    ComponentInfo componentInfo = ambariMetaInfo.getComponent(
+        stackId.getStackName(), stackId.getStackVersion(),
+        serviceName, componentName);
+
+    String scriptName = null;
+    CommandScriptDefinition script = componentInfo.getCommandScript();
+    if (serviceInfo.getSchemaVersion().equals(AmbariMetaInfo.SCHEMA_VERSION_2)) {
+      if (script != null) {
+        scriptName = script.getScript();
+      } else {
+        String message = String.format("Component %s of service %s has not " +
+            "command script defined", componentName, serviceName);
+        throw new AmbariException(message);
+      }
+    }
+
+    TreeMap<String, String> statusCommandParams = new TreeMap<>();
+    statusCommandParams.put(ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS,
+        getClientsToUpdateConfigs(componentInfo));
+    statusCommandParams.put(ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED,
+         Boolean.toString(getUnlimitedKeyJCERequirement(componentInfo, clusterSecurityType)));
+    statusCommandParams.put(KeyNames.SCRIPT, scriptName);
+    return statusCommandParams;
+  }
+
+  public TreeMap<String, String> getMetadataClusterLevelParams(Cluster cluster, StackId stackId) throws AmbariException {
+    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
+    clusterLevelParams.put(JDK_LOCATION, getJdkResourceUrl());
+    clusterLevelParams.put(JAVA_HOME, getJavaHome());
+    clusterLevelParams.put(JAVA_VERSION, String.valueOf(configs.getJavaVersion()));
+    clusterLevelParams.put(JDK_NAME, getJDKName());
+    clusterLevelParams.put(JCE_NAME, getJCEName());
+    clusterLevelParams.put(STACK_NAME, stackId.getStackName());
+    clusterLevelParams.put(STACK_VERSION, stackId.getStackVersion());
+    clusterLevelParams.put(DB_NAME, getServerDB());
+    clusterLevelParams.put(MYSQL_JDBC_URL, getMysqljdbcUrl());
+    clusterLevelParams.put(ORACLE_JDBC_URL, getOjdbcUrl());
+    clusterLevelParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName());
+    clusterLevelParams.putAll(getRcaParameters());
+    clusterLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped());
+    clusterLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled());
+    clusterLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount());
+
+    StackInfo stackInfo = ambariMetaInfo.getStack(stackId.getStackName(), stackId.getStackVersion());
+    clusterLevelParams.put(HOOKS_FOLDER, stackInfo.getStackHooksFolder());
+
+    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
+    Set<String> notManagedHdfsPathSet = configHelper.getPropertyValuesWithPropertyType(stackId,
+        PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs);
+    String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet);
+    clusterLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, notManagedHdfsPathList);
+
+    Set<String> userSet = configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.USER, cluster, desiredConfigs);
+    String userList = gson.toJson(userSet);
+    clusterLevelParams.put(USER_LIST, userList);
+
+    //Create a user_group mapping and send it as part of the hostLevelParams
+    Map<String, Set<String>> userGroupsMap = configHelper.createUserGroupsMap(
+        stackId, cluster, desiredConfigs);
+    String userGroups = gson.toJson(userGroupsMap);
+    clusterLevelParams.put(USER_GROUPS, userGroups);
+
+    Set<String> groupSet = configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.GROUP, cluster, desiredConfigs);
+    String groupList = gson.toJson(groupSet);
+    clusterLevelParams.put(GROUP_LIST, groupList);
+
+    return clusterLevelParams;
+  }
+
+  public TreeMap<String, String> getTopologyHostLevelParams(Cluster cluster, Host host) throws AmbariException {
+    TreeMap<String, String> hostLevelParams = new TreeMap<>();
+    String repoInfo = customCommandExecutionHelper.getRepoInfo(cluster, host);
+
+    hostLevelParams.put(REPO_INFO, repoInfo);
+    return hostLevelParams;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
index 1a4e34a..477add7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
@@ -32,9 +32,10 @@ public class DeleteHostComponentStatusMetaData extends DeleteStatusMetaData {
     removedHostComponents = new HashSet<>();
   }
 
-  public void addDeletedHostComponent(String componentName, String hostName, Long hostId,
+  public void addDeletedHostComponent(String componentName, String serviceName, String hostName, Long hostId,
                                       String clusterId, String version) {
-    removedHostComponents.add(new HostComponent(componentName, hostId, clusterId, version));
+    removedHostComponents.add(new HostComponent(componentName, serviceName, hostId,
+        hostName, clusterId, version));
     addDeletedKey(componentName + "/" + hostName);
   }
 
@@ -52,13 +53,18 @@ public class DeleteHostComponentStatusMetaData extends DeleteStatusMetaData {
 
   public class HostComponent {
     private String componentName;
+    private String serviceName;
     private Long hostId;
+    private String hostName;
     private String clusterId;
     private String version;
 
-    public HostComponent(String componentName, Long hostId, String clusterId, String version) {
+    public HostComponent(String componentName, String serviceName, Long hostId, String hostName,
+                         String clusterId, String version) {
       this.componentName = componentName;
+      this.serviceName = serviceName;
       this.hostId = hostId;
+      this.hostName = hostName;
       this.clusterId = clusterId;
       this.version = version;
     }
@@ -71,14 +77,6 @@ public class DeleteHostComponentStatusMetaData extends DeleteStatusMetaData {
       this.componentName = componentName;
     }
 
-    public Long getHostId() {
-      return hostId;
-    }
-
-    public void setHostName(Long hostId) {
-      this.hostId = hostId;
-    }
-
     public String getClusterId() {
       return clusterId;
     }
@@ -94,5 +92,29 @@ public class DeleteHostComponentStatusMetaData extends DeleteStatusMetaData {
     public void setVersion(String version) {
       this.version = version;
     }
+
+    public String getServiceName() {
+      return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+      this.serviceName = serviceName;
+    }
+
+    public String getHostName() {
+      return hostName;
+    }
+
+    public void setHostName(String hostName) {
+      this.hostName = hostName;
+    }
+
+    public Long getHostId() {
+      return hostId;
+    }
+
+    public void setHostId(Long hostId) {
+      this.hostId = hostId;
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --git 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
index 1b16b5e..74508c1 100644
--- 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
@@ -28,6 +28,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ClusterNotFoundException;
@@ -35,9 +36,11 @@ import org.apache.ambari.server.DuplicateResourceException;
 import org.apache.ambari.server.HostNotFoundException;
 import org.apache.ambari.server.ObjectNotFoundException;
 import org.apache.ambari.server.ParentObjectNotFoundException;
+import org.apache.ambari.server.agent.RecoveryConfigHelper;
 import org.apache.ambari.server.agent.stomp.dto.TopologyCluster;
 import org.apache.ambari.server.agent.stomp.dto.TopologyHost;
 import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
 import org.apache.ambari.server.controller.ConfigurationRequest;
 import org.apache.ambari.server.controller.HostRequest;
 import org.apache.ambari.server.controller.HostResponse;
@@ -174,6 +177,12 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
   @Inject
   private StateUpdateEventPublisher stateUpdateEventPublisher;
 
+  @Inject
+  private RecoveryConfigHelper recoveryConfigHelper;
+
+  @Inject
+  private AmbariManagementControllerImpl ambariManagementController;
+
   // ----- Constructors ----------------------------------------------------
 
   /**
@@ -515,7 +524,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
     Map<String, Map<String, String>> hostAttributes = new HashMap<>();
     Set<String> allClusterSet = new HashSet<>();
 
-    Map<String, TopologyCluster> addedTopologies = new HashMap<>();
+    TreeMap<String, TopologyCluster> addedTopologies = new TreeMap<>();
     for (HostRequest hostRequest : hostRequests) {
       if (hostRequest.getHostname() != null &&
           !hostRequest.getHostname().isEmpty() &&
@@ -529,7 +538,8 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
         if (hostRequest.getHostAttributes() != null) {
           hostAttributes.put(hostRequest.getHostname(), hostRequest.getHostAttributes());
         }
-        String clusterId = Long.toString(clusters.getCluster(hostRequest.getClusterName()).getClusterId());
+        Cluster cl = clusters.getCluster(hostRequest.getClusterName());
+        String clusterId = Long.toString(cl.getClusterId());
         if (!addedTopologies.containsKey(clusterId)) {
           addedTopologies.put(clusterId, new TopologyCluster());
         }
@@ -537,7 +547,10 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
         addedTopologies.get(clusterId).addTopologyHost(new TopologyHost(addedHost.getHostId(),
             addedHost.getHostName(),
             addedHost.getRackInfo(),
-            addedHost.getIPv4()));
+            addedHost.getIPv4(),
+            recoveryConfigHelper.getRecoveryConfig(clusters.getCluster(hostRequest.getClusterName()).getClusterName(),
+                addedHost.getHostName()),
+            ambariManagementController.getTopologyHostLevelParams(cl, addedHost)));
       }
     }
     clusters.updateHostWithClusterAndAttributes(hostClustersMap, hostAttributes);
@@ -545,7 +558,8 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
     for (String clusterName : allClusterSet) {
       clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
     }
-    TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(addedTopologies, TopologyUpdateEvent.EventType.ADD);
+    TopologyUpdateEvent topologyUpdateEvent =
+        new TopologyUpdateEvent(addedTopologies, TopologyUpdateEvent.EventType.UPDATE);
     stateUpdateEventPublisher.publish(topologyUpdateEvent);
   }
 
@@ -723,7 +737,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
       }
     }
 
-    Map<String, TopologyCluster> topologyUpdates = new HashMap<>();
+    TreeMap<String, TopologyCluster> topologyUpdates = new TreeMap<>();
     for (HostRequest request : requests) {
       if (LOG.isDebugEnabled()) {
         LOG.debug("Received an updateHost request"
@@ -905,7 +919,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
     Set<String> hostsClusters = new HashSet<>();
     Set<String> hostNames = new HashSet<>();
     Set<Cluster> allClustersWithHosts = new HashSet<>();
-    Map<String, TopologyCluster> topologyUpdates = new HashMap<>();
+    TreeMap<String, TopologyCluster> topologyUpdates = new TreeMap<>();
     for (HostRequest hostRequest : requests) {
       // Assume the user also wants to delete it entirely, including all clusters.
       String hostname = hostRequest.getHostname();
@@ -944,24 +958,6 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
         for (String key : componentDeleteStatus.getDeletedKeys()) {
           deleteStatusMetaData.addDeletedKey(key);
         }
-        /*for (DeleteHostComponentStatusMetaData.HostComponent hostComponent : componentDeleteStatus.getRemovedHostComponents()) {
-          String clusterId = hostComponent.getClusterId();
-          if (!topologyUpdates.containsKey(clusterId)) {
-            topologyUpdates.put(clusterId, new TopologyCluster());
-          }
-          TopologyComponent deletedComponent = new TopologyComponent(hostComponent.getComponentName(),
-              null,
-              hostComponent.getVersion(),
-              new HashSet<>(Arrays.asList(hostId)),
-              null);
-          if (!topologyUpdates.get(clusterId).getTopologyComponents().contains(deletedComponent)) {
-            topologyUpdates.get(clusterId).addTopologyComponent(deletedComponent);
-          } else {
-            topologyUpdates.get(clusterId).getTopologyComponents()
-                .stream().filter(t -> t.equals(deletedComponent))
-                .forEach(t -> t.addHostId(hostId));
-          }
-        }*/
         for (String key : componentDeleteStatus.getExceptionForKeys().keySet()) {
           deleteStatusMetaData.addException(key, componentDeleteStatus.getExceptionForKeys().get(key));
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/events/AgentConfigsUpdateEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/AgentConfigsUpdateEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/AgentConfigsUpdateEvent.java
new file mode 100644
index 0000000..23f3559
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/AgentConfigsUpdateEvent.java
@@ -0,0 +1,62 @@
+/**
+ * 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.events;
+
+import java.util.TreeMap;
+
+import org.apache.ambari.server.agent.stomp.dto.ClusterConfigs;
+import org.apache.ambari.server.agent.stomp.dto.Hashable;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AgentConfigsUpdateEvent extends AmbariUpdateEvent implements Hashable {
+
+  private String hash;
+
+  @JsonProperty("clusters")
+  private TreeMap<String, ClusterConfigs> clustersConfigs = new TreeMap<>();
+
+  public AgentConfigsUpdateEvent(TreeMap<String, ClusterConfigs> clustersConfigs) {
+    super(Type.AGENT_CONFIGS);
+    this.clustersConfigs = clustersConfigs;
+  }
+
+  public TreeMap<String, ClusterConfigs> getClustersConfigs() {
+    return clustersConfigs;
+  }
+
+  public void setClustersConfigs(TreeMap<String, ClusterConfigs> clustersConfigs) {
+    this.clustersConfigs = clustersConfigs;
+  }
+
+  @Override
+  public String getHash() {
+    return hash;
+  }
+
+  public void setHash(String hash) {
+    this.hash = hash;
+  }
+
+  public static AgentConfigsUpdateEvent emptyUpdate() {
+    return new AgentConfigsUpdateEvent(null);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/events/AlertUpdateEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/AlertUpdateEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/AlertUpdateEvent.java
index 73862d5..52e2180 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/AlertUpdateEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/AlertUpdateEvent.java
@@ -18,24 +18,24 @@
 
 package org.apache.ambari.server.events;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
-import org.apache.ambari.server.state.Alert;
+import org.apache.ambari.server.api.query.render.AlertSummaryGroupedRenderer;
 
 public class AlertUpdateEvent extends AmbariUpdateEvent {
-  private List<Alert> alerts = new ArrayList<>();
+  private Map<String, AlertSummaryGroupedRenderer.AlertDefinitionSummary> summaries = new HashMap<>();
 
-  public AlertUpdateEvent(List<Alert> alerts) {
+  public AlertUpdateEvent(Map<String, AlertSummaryGroupedRenderer.AlertDefinitionSummary> summaries) {
     super(Type.ALERT);
-    this.alerts = alerts;
+    this.summaries = summaries;
   }
 
-  public List<Alert> getAlerts() {
-    return alerts;
+  public Map<String, AlertSummaryGroupedRenderer.AlertDefinitionSummary> getSummaries() {
+    return summaries;
   }
 
-  public void setAlerts(List<Alert> alerts) {
-    this.alerts = alerts;
+  public void setSummaries(Map<String, AlertSummaryGroupedRenderer.AlertDefinitionSummary> summaries) {
+    this.summaries = summaries;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariUpdateEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariUpdateEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariUpdateEvent.java
index 2b7efa6..b075179 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariUpdateEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariUpdateEvent.java
@@ -44,13 +44,12 @@ public abstract class AmbariUpdateEvent {
   public enum Type {
     ALERT("/events/alerts", "events.alerts"),
     METADATA("/events/metadata", "events.metadata"),
-    TOPOLOGY("/events/topology", "events.topology_update"),
+    TOPOLOGY("/events/topologies", "events.topology_update"),
     AGENT_CONFIGS("/events/configs", "events.agent.configs"),
     CONFIGS("/events/configs", "events.configs"),
     HOSTCOMPONENT("/events/hostcomponents", "events.hostcomponents"),
     NAMEDHOSTCOMPONENT("/events/tasks/", "events.hostrolecommands.named"),
     REQUEST("/events/requests", "events.requests"),
-    NAMEDREQUEST("/events/requests", "events.requests.named"),
     COMMAND("/user/commands", "events.commands");
 
     private String destination;

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/events/ConfigsUpdateEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/ConfigsUpdateEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/ConfigsUpdateEvent.java
index b6eec10..26f6622 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/ConfigsUpdateEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/ConfigsUpdateEvent.java
@@ -19,7 +19,9 @@
 package org.apache.ambari.server.events;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.apache.ambari.server.orm.entities.ServiceConfigEntity;
@@ -34,13 +36,14 @@ public class ConfigsUpdateEvent extends AmbariUpdateEvent {
   private String user;
   private String note;
   private List<String> hostNames;
-  private Long createtime;
+  private Long createTime;
   private String groupName;
-  //TODO configs
 
   private List<ClusterConfig> configs = new ArrayList<>();
+  private Set<String> changedConfigTypes = new HashSet<>();
 
-  public ConfigsUpdateEvent(ServiceConfigEntity configs, String configGroupName, List<String> hostNames) {
+  public ConfigsUpdateEvent(ServiceConfigEntity configs, String configGroupName, List<String> hostNames,
+                            Set<String> changedConfigTypes) {
     super(Type.CONFIGS);
     this.serviceConfigId = configs.getServiceConfigId();
     this.clusterId = configs.getClusterEntity().getClusterId();
@@ -56,8 +59,9 @@ public class ConfigsUpdateEvent extends AmbariUpdateEvent {
         clusterConfigEntity.getTag(),
         clusterConfigEntity.getVersion()));
     }
-    this.createtime = configs.getCreateTimestamp();
+    this.createTime = configs.getCreateTimestamp();
     this.groupName = configGroupName;
+    this.changedConfigTypes = changedConfigTypes;
   }
 
   public Long getServiceConfigId() {
@@ -132,12 +136,12 @@ public class ConfigsUpdateEvent extends AmbariUpdateEvent {
     this.configs = configs;
   }
 
-  public Long getCreatetime() {
-    return createtime;
+  public Long getCreateTime() {
+    return createTime;
   }
 
-  public void setCreatetime(Long createtime) {
-    this.createtime = createtime;
+  public void setCreateTime(Long createTime) {
+    this.createTime = createTime;
   }
 
   public String getGroupName() {
@@ -148,6 +152,14 @@ public class ConfigsUpdateEvent extends AmbariUpdateEvent {
     this.groupName = groupName;
   }
 
+  public Set<String> getChangedConfigTypes() {
+    return changedConfigTypes;
+  }
+
+  public void setChangedConfigTypes(Set<String> changedConfigTypes) {
+    this.changedConfigTypes = changedConfigTypes;
+  }
+
   public class ClusterConfig {
     private Long clusterId;
     private String type;

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/events/MetadataUpdateEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/MetadataUpdateEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/MetadataUpdateEvent.java
index fc660a6..6e7ee90 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/MetadataUpdateEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/MetadataUpdateEvent.java
@@ -17,9 +17,46 @@
  */
 package org.apache.ambari.server.events;
 
-public class MetadataUpdateEvent extends AmbariUpdateEvent {
+import java.util.Map;
+import java.util.TreeMap;
 
-  public MetadataUpdateEvent() {
+import org.apache.ambari.server.agent.stomp.dto.Hashable;
+import org.apache.ambari.server.agent.stomp.dto.MetadataCluster;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MetadataUpdateEvent extends AmbariUpdateEvent implements Hashable {
+
+  private String hash;
+
+  @JsonProperty("clusters")
+  private TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
+
+  public MetadataUpdateEvent(TreeMap<String, MetadataCluster> metadataClusters) {
     super(Type.METADATA);
+    this.metadataClusters = metadataClusters;
+  }
+
+  public Map<String, MetadataCluster> getMetadataClusters() {
+    return metadataClusters;
+  }
+
+  public void setMetadataClusters(TreeMap<String, MetadataCluster> metadataClusters) {
+    this.metadataClusters = metadataClusters;
+  }
+
+  @Override
+  public String getHash() {
+    return hash;
+  }
+
+  public void setHash(String hash) {
+    this.hash = hash;
+  }
+
+  public static MetadataUpdateEvent emptyUpdate() {
+    return new MetadataUpdateEvent(null);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/events/NamedHostRoleCommandUpdateEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/NamedHostRoleCommandUpdateEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/NamedHostRoleCommandUpdateEvent.java
new file mode 100644
index 0000000..3096347
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/NamedHostRoleCommandUpdateEvent.java
@@ -0,0 +1,127 @@
+/**
+ * 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.events;
+
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NamedHostRoleCommandUpdateEvent extends AmbariUpdateEvent {
+
+  private Long id;
+  private Long requestId;
+  private String hostName;
+  private Long endTime;
+  private HostRoleStatus status;
+  private String errorLog;
+  private String outLog;
+  private String stderr;
+  private String stdout;
+
+  public NamedHostRoleCommandUpdateEvent(Long id, Long requestId, String hostName, Long endTime, HostRoleStatus status, String errorLog, String outLog, String stderr, String stdout) {
+    super(Type.NAMEDHOSTCOMPONENT);
+    this.id = id;
+    this.requestId = requestId;
+    this.hostName = hostName;
+    this.endTime = endTime;
+    this.status = status;
+    this.errorLog = errorLog;
+    this.outLog = outLog;
+    this.stderr = stderr;
+    this.stdout = stdout;
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public Long getRequestId() {
+    return requestId;
+  }
+
+  public void setRequestId(Long requestId) {
+    this.requestId = requestId;
+  }
+
+  public String getHostName() {
+    return hostName;
+  }
+
+  public void setHostName(String hostName) {
+    this.hostName = hostName;
+  }
+
+  public Long getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Long endTime) {
+    this.endTime = endTime;
+  }
+
+  public HostRoleStatus getStatus() {
+    return status;
+  }
+
+  public void setStatus(HostRoleStatus status) {
+    this.status = status;
+  }
+
+  public String getErrorLog() {
+    return errorLog;
+  }
+
+  public void setErrorLog(String errorLog) {
+    this.errorLog = errorLog;
+  }
+
+  public String getOutLog() {
+    return outLog;
+  }
+
+  public void setOutLog(String outLog) {
+    this.outLog = outLog;
+  }
+
+  public String getStderr() {
+    return stderr;
+  }
+
+  public void setStderr(String stderr) {
+    this.stderr = stderr;
+  }
+
+  public String getStdout() {
+    return stdout;
+  }
+
+  public void setStdout(String stdout) {
+    this.stdout = stdout;
+  }
+
+  @Override
+  public String getDestination() {
+    return super.getDestination() + getId();
+  }
+}