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:14 UTC

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

AMBARI-21201. Add ConfigChange event to capture config changes (mpapirkovskyy)


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

Branch: refs/heads/branch-3.0-perf
Commit: 421ac277649f697f022501b17d767c27c83d946e
Parents: 1e64135
Author: Myroslav Papirkovskyi <mp...@hortonworks.com>
Authored: Thu Jun 8 18:02:42 2017 +0300
Committer: Myroslav Papirkovskyi <mp...@hortonworks.com>
Committed: Thu Jun 22 18:25:50 2017 +0300

----------------------------------------------------------------------
 .../actionmanager/ActionDBAccessorImpl.java     |   6 +-
 .../actionmanager/ExecutionCommandWrapper.java  |  44 +---
 .../apache/ambari/server/agent/AgentEnv.java    |  21 ++
 .../server/agent/AgentSessionManager.java       |   4 +
 .../server/agent/AlertDefinitionCommand.java    |   5 +
 .../server/agent/AlertExecutionCommand.java     |   3 +
 .../ambari/server/agent/CancelCommand.java      |   2 +
 .../ambari/server/agent/CommandReport.java      |  26 +++
 .../apache/ambari/server/agent/DiskInfo.java    |  14 ++
 .../ambari/server/agent/ExecutionCommand.java   |  24 +++
 .../apache/ambari/server/agent/HeartBeat.java   |   9 +
 .../ambari/server/agent/HeartBeatHandler.java   |  74 +------
 .../ambari/server/agent/HeartBeatResponse.java  |  12 ++
 .../apache/ambari/server/agent/HostInfo.java    |  62 ++++++
 .../apache/ambari/server/agent/HostStatus.java  |   4 +
 .../ambari/server/agent/RecoveryConfig.java     |   7 +
 .../ambari/server/agent/RecoveryReport.java     |   4 +
 .../apache/ambari/server/agent/Register.java    |   2 +
 .../server/agent/RegistrationResponse.java      |   8 +
 .../ambari/server/agent/StatusCommand.java      |  12 ++
 .../agent/stomp/AgentClusterDataHolder.java     | 112 ++++++++++
 .../agent/stomp/AgentCurrentDataController.java |  77 +++++++
 .../server/agent/stomp/HeartbeatController.java |  14 +-
 .../server/agent/stomp/MetadataHolder.java      |  55 +++++
 .../server/agent/stomp/TopologyHolder.java      | 159 ++++++++++++++
 .../server/agent/stomp/dto/ClusterConfigs.java  |  50 +++++
 .../agent/stomp/dto/ComponentStatusReports.java |  10 +-
 .../ambari/server/agent/stomp/dto/Hash.java     |  41 ++++
 .../ambari/server/agent/stomp/dto/Hashable.java |  27 +++
 .../server/agent/stomp/dto/MetadataCluster.java |  69 ++++++
 .../agent/stomp/dto/MetadataServiceInfo.java    |  71 +++++++
 .../server/agent/stomp/dto/TopologyCluster.java |  56 +++++
 .../agent/stomp/dto/TopologyComponent.java      | 101 ++++++++-
 .../server/agent/stomp/dto/TopologyHost.java    |  46 +++-
 .../stomp/dto/TopologyStatusCommandParams.java  |  47 ----
 .../api/query/render/AlertStateSummary.java     |   6 +-
 .../api/query/render/AlertStateValues.java      |   9 +-
 .../render/AlertSummaryGroupedRenderer.java     | 135 ++++++------
 .../server/api/services/AmbariMetaInfo.java     |  27 ---
 .../AmbariCustomCommandExecutionHelper.java     |  37 +++-
 .../AmbariManagementControllerImpl.java         | 212 ++++++++++++++++---
 .../DeleteHostComponentStatusMetaData.java      |  44 +++-
 .../internal/HostResourceProvider.java          |  44 ++--
 .../server/events/AgentConfigsUpdateEvent.java  |  62 ++++++
 .../ambari/server/events/AlertUpdateEvent.java  |  20 +-
 .../ambari/server/events/AmbariUpdateEvent.java |   3 +-
 .../server/events/ConfigsUpdateEvent.java       |  28 ++-
 .../server/events/MetadataUpdateEvent.java      |  41 +++-
 .../events/NamedHostRoleCommandUpdateEvent.java | 127 +++++++++++
 .../server/events/RequestUpdateEvent.java       |  81 ++++++-
 .../server/events/TopologyUpdateEvent.java      |  33 ++-
 .../listeners/alerts/AlertReceivedListener.java |  32 ++-
 .../listeners/tasks/TaskStatusListener.java     |  39 +++-
 .../ambari/server/orm/dao/ServiceConfigDAO.java |  34 +++
 .../orm/entities/ServiceConfigEntity.java       |   1 +
 .../org/apache/ambari/server/state/Alert.java   |  20 ++
 .../ambari/server/state/ConfigHelper.java       |  98 +++++++++
 .../ambari/server/state/ServiceComponent.java   |   2 +
 .../server/state/ServiceComponentImpl.java      |   5 +
 .../server/state/cluster/ClusterImpl.java       |  80 ++++++-
 .../server/state/cluster/ClustersImpl.java      |  15 ++
 .../svccomphost/ServiceComponentHostImpl.java   |   6 +-
 .../server/topology/TopologyDeleteFormer.java   |  14 +-
 .../listeners/tasks/TaskStatusListenerTest.java |   7 +-
 64 files changed, 2136 insertions(+), 404 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
index d372844..d5ae5b5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
@@ -361,15 +361,16 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
     RequestEntity requestEntity = request.constructNewPersistenceEntity();
 
     Long clusterId = -1L;
+    String clusterName = null;
     Long requestId = requestEntity.getRequestId();
     ClusterEntity clusterEntity = clusterDAO.findById(request.getClusterId());
     if (clusterEntity != null) {
       clusterId = clusterEntity.getClusterId();
+      clusterName = clusterEntity.getClusterName();
     }
 
     requestEntity.setClusterId(clusterId);
     requestDAO.create(requestEntity);
-    stateUpdateEventPublisher.publish(new RequestUpdateEvent(requestEntity, hostRoleCommandDAO, topologyManager));
 
     //TODO wire request to cluster
     List<StageEntity> stageEntities = new ArrayList<>(request.getStages().size());
@@ -460,6 +461,9 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
 
     TaskCreateEvent taskCreateEvent = new TaskCreateEvent(hostRoleCommands);
     taskEventPublisher.publish(taskCreateEvent);
+    List<HostRoleCommandEntity> hostRoleCommandEntities = hostRoleCommandDAO.findByRequest(requestEntity.getRequestId());
+    stateUpdateEventPublisher.publish(new RequestUpdateEvent(requestEntity,
+        hostRoleCommandDAO, topologyManager, clusterName, hostRoleCommandEntities));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
index fe6707e..1f92ce7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.actionmanager;
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -137,46 +136,9 @@ public class ExecutionCommandWrapper {
       // now that the tags have been updated (if necessary), fetch the
       // configurations
       Map<String, Map<String, String>> configurationTags = executionCommand.getConfigurationTags();
-      if (null != configurationTags && !configurationTags.isEmpty()) {
-        Map<String, Map<String, String>> configProperties = configHelper
-            .getEffectiveConfigProperties(cluster, configurationTags);
-
-        // Apply the configurations saved with the Execution Cmd on top of
-        // derived configs - This will take care of all the hacks
-        for (Map.Entry<String, Map<String, String>> entry : configProperties.entrySet()) {
-          String type = entry.getKey();
-          Map<String, String> allLevelMergedConfig = entry.getValue();
-
-          if (configurations.containsKey(type)) {
-            Map<String, String> mergedConfig = configHelper.getMergedConfig(allLevelMergedConfig,
-                configurations.get(type));
-
-            configurations.get(type).clear();
-            configurations.get(type).putAll(mergedConfig);
-
-          } else {
-            configurations.put(type, new HashMap<String, String>());
-            configurations.get(type).putAll(allLevelMergedConfig);
-          }
-        }
-
-        Map<String, Map<String, Map<String, String>>> configAttributes = configHelper.getEffectiveConfigAttributes(
-            cluster, executionCommand.getConfigurationTags());
-
-        for (Map.Entry<String, Map<String, Map<String, String>>> attributesOccurrence : configAttributes.entrySet()) {
-          String type = attributesOccurrence.getKey();
-          Map<String, Map<String, String>> attributes = attributesOccurrence.getValue();
-
-          if (executionCommand.getConfigurationAttributes() != null) {
-            if (!executionCommand.getConfigurationAttributes().containsKey(type)) {
-              executionCommand.getConfigurationAttributes().put(type,
-                  new TreeMap<String, Map<String, String>>());
-            }
-            configHelper.cloneAttributesMap(attributes,
-                executionCommand.getConfigurationAttributes().get(type));
-            }
-        }
-      }
+      configHelper.getAndMergeHostConfigs(configurations, configurationTags, cluster);
+      configHelper.getAndMergeHostConfigAttributes(executionCommand.getConfigurationAttributes(),
+          configurationTags, cluster);
     } catch (ClusterNotFoundException cnfe) {
       // it's possible that there are commands without clusters; in such cases,
       // just return the de-serialized command and don't try to read configs

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentEnv.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentEnv.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentEnv.java
index 92cdd58..382c985 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentEnv.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentEnv.java
@@ -163,24 +163,28 @@ public class AgentEnv {
      * Java processes running on the system.  Default empty array.
      */
     @SerializedName("activeJavaProcs")
+    @com.fasterxml.jackson.annotation.JsonProperty("activeJavaProcs")
     private JavaProc[] activeJavaProcs = new JavaProc[0];
 
     /**
      * The current time when agent send the host check report
      */
     @SerializedName("agentTimeStampAtReporting")
+    @com.fasterxml.jackson.annotation.JsonProperty("agentTimeStampAtReporting")
     private long agentTimeStampAtReporting = 0;
 
     /**
      * The current time when host check report was received
      */
     @SerializedName("serverTimeStampAtReporting")
+    @com.fasterxml.jackson.annotation.JsonProperty("serverTimeStampAtReporting")
     private long serverTimeStampAtReporting = 0;
 
     /**
      * Live services running on the agent
      */
     @SerializedName("liveServices")
+    @com.fasterxml.jackson.annotation.JsonProperty("liveServices")
     private LiveService[] liveServices = new LiveService[0];
 
     public void setAgentTimeStampAtReporting(long currentTime) {
@@ -218,10 +222,13 @@ public class AgentEnv {
 
   public static class PackageDetail {
     @SerializedName("name")
+    @com.fasterxml.jackson.annotation.JsonProperty("name")
     private String pkgName;
     @SerializedName("version")
+    @com.fasterxml.jackson.annotation.JsonProperty("version")
     private String pkgVersion;
     @SerializedName("repoName")
+    @com.fasterxml.jackson.annotation.JsonProperty("repoName")
     private String pkgRepoName;
 
     public void setName(String name) {
@@ -254,8 +261,10 @@ public class AgentEnv {
    */
   public static class Directory {
     @SerializedName("name")
+    @com.fasterxml.jackson.annotation.JsonProperty("name")
     private String dirName;
     @SerializedName("type")
+    @com.fasterxml.jackson.annotation.JsonProperty("type")
     private String dirType;
     
     public void setName(String name) {
@@ -280,12 +289,16 @@ public class AgentEnv {
    */
   public static class JavaProc {
     @SerializedName("user")        
+    @com.fasterxml.jackson.annotation.JsonProperty("user")
     private String user;
     @SerializedName("pid") 
+    @com.fasterxml.jackson.annotation.JsonProperty("pid")
     private int pid = 0;
     @SerializedName("hadoop") 
+    @com.fasterxml.jackson.annotation.JsonProperty("hadoop")
     private boolean is_hadoop = false;
     @SerializedName("command") 
+    @com.fasterxml.jackson.annotation.JsonProperty("command")
     private String command;
     
     public void setUser(String user) {
@@ -323,8 +336,10 @@ public class AgentEnv {
   
   public static class Alternative {
     @SerializedName("name")
+    @com.fasterxml.jackson.annotation.JsonProperty("name")
     private String altName;
     @SerializedName("target")
+    @com.fasterxml.jackson.annotation.JsonProperty("target")
     private String altTarget;
     
     public void setName(String name) {
@@ -346,10 +361,13 @@ public class AgentEnv {
 
   public static class LiveService {
     @SerializedName("name")
+    @com.fasterxml.jackson.annotation.JsonProperty("name")
     private String svcName;
     @SerializedName("status")
+    @com.fasterxml.jackson.annotation.JsonProperty("status")
     private String svcStatus;
     @SerializedName("desc")
+    @com.fasterxml.jackson.annotation.JsonProperty("desc")
     private String svcDesc;
 
     public void setName(String name) {
@@ -379,10 +397,13 @@ public class AgentEnv {
 
   public static class ExistingUser {
     @SerializedName("name")
+    @com.fasterxml.jackson.annotation.JsonProperty("name")
     private String name;
     @SerializedName("homeDir")
+    @com.fasterxml.jackson.annotation.JsonProperty("homeDir")
     private String homeDir;
     @SerializedName("status")
+    @com.fasterxml.jackson.annotation.JsonProperty("status")
     private String status;
 
     public void setUserName(String userName) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentSessionManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentSessionManager.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentSessionManager.java
index d9b595a..496a697 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentSessionManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentSessionManager.java
@@ -39,6 +39,10 @@ public class AgentSessionManager {
     registeredHosts.put(sessionId, registeredHost);
   }
 
+  public boolean isRegistered(String sessionId) {
+    return registeredHosts.containsKey(sessionId);
+  }
+
   public Host getHost(String sessionId) throws HostNotRegisteredException {
     if (registeredHosts.containsKey(sessionId)) {
       return registeredHosts.get(sessionId);

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
index 4d2e048..07029c7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertDefinitionCommand.java
@@ -41,18 +41,23 @@ import com.google.gson.annotations.SerializedName;
  */
 public class AlertDefinitionCommand extends AgentCommand {
   @SerializedName("clusterName")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
   private final String m_clusterName;
 
   @SerializedName("hostName")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostName")
   private final String m_hostName;
 
   @SerializedName("hash")
+  @com.fasterxml.jackson.annotation.JsonProperty("hash")
   private final String m_hash;
 
   @SerializedName("alertDefinitions")
+  @com.fasterxml.jackson.annotation.JsonProperty("alertDefinitions")
   private final List<AlertDefinition> m_definitions;
 
   @SerializedName("configurations")
+  @com.fasterxml.jackson.annotation.JsonProperty("configurations")
   private Map<String, Map<String, String>> m_configurations;
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertExecutionCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertExecutionCommand.java
index b0781da..7a1bd8b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertExecutionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/AlertExecutionCommand.java
@@ -33,18 +33,21 @@ public class AlertExecutionCommand extends AgentCommand {
    * The name of the cluster.
    */
   @SerializedName("clusterName")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
   private final String m_clusterName;
 
   /**
    * The agent hostname.
    */
   @SerializedName("hostName")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostName")
   private final String m_hostName;
 
   /**
    * The definition to run.
    */
   @SerializedName("alertDefinition")
+  @com.fasterxml.jackson.annotation.JsonProperty("alertDefinition")
   private final AlertDefinition m_definition;
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/CancelCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/CancelCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/CancelCommand.java
index 7aa24c8..ea4ccc2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/CancelCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/CancelCommand.java
@@ -29,9 +29,11 @@ public class CancelCommand extends AgentCommand {
   }
 
   @SerializedName("target_task_id")
+  @com.fasterxml.jackson.annotation.JsonProperty("target_task_id")
   private long targetTaskId;
 
   @SerializedName("reason")
+  @com.fasterxml.jackson.annotation.JsonProperty("reason")
   private String reason;
 
   public long getTargetTaskId() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandReport.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandReport.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandReport.java
index 2c20ae9..bca562a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandReport.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandReport.java
@@ -39,122 +39,146 @@ public class CommandReport {
   private Map<String, Map<String, String>> configurationTags;
 
   @JsonProperty("customCommand")
+  @com.fasterxml.jackson.annotation.JsonProperty("customCommand")
   public String getCustomCommand() {
     return customCommand;
   }
 
   @JsonProperty("customCommand")
+  @com.fasterxml.jackson.annotation.JsonProperty("customCommand")
   public void setCustomCommand(String customCommand) {
     this.customCommand = customCommand;
   }
 
   @JsonProperty("taskId")
+  @com.fasterxml.jackson.annotation.JsonProperty("taskId")
   public long getTaskId() {
     return taskId;
   }
   
   @JsonProperty("taskId")
+  @com.fasterxml.jackson.annotation.JsonProperty("taskId")
   public void setTaskId(long taskId) {
     this.taskId = taskId;
   }
   
   @JsonProperty("clusterName")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
   public void setClusterName(String clusterName) {
     this.clusterName = clusterName;
   }
   
   @JsonProperty("clusterName")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
   public String getClusterName() {
     return this.clusterName;
   }
 
   @JsonProperty("actionId")
+  @com.fasterxml.jackson.annotation.JsonProperty("actionId")
   public String getActionId() {
     return this.actionId;
   }
   
   @JsonProperty("actionId")
+  @com.fasterxml.jackson.annotation.JsonProperty("actionId")
   public void setActionId(String actionId) {
     this.actionId = actionId;
   }
   
   @JsonProperty("stderr")
+  @com.fasterxml.jackson.annotation.JsonProperty("stderr")
   public String getStdErr() {
     return this.stderr;
   }
   
   @JsonProperty("stderr")
+  @com.fasterxml.jackson.annotation.JsonProperty("stderr")
   public void setStdErr(String stderr) {
     this.stderr = stderr;
   }
   
   @JsonProperty("exitcode")
+  @com.fasterxml.jackson.annotation.JsonProperty("exitcode")
   public int getExitCode() {
     return this.exitCode;
   }
   
   @JsonProperty("exitcode")
+  @com.fasterxml.jackson.annotation.JsonProperty("exitcode")
   public void setExitCode(int exitCode) {
     this.exitCode = exitCode;
   }
   
   @JsonProperty("stdout")
+  @com.fasterxml.jackson.annotation.JsonProperty("stdout")
   public String getStdOut() {
     return this.stdout;
   }
   
   @JsonProperty("stdout")
+  @com.fasterxml.jackson.annotation.JsonProperty("stdout")
   public void setStdOut(String stdout) {
     this.stdout = stdout;
   }
 
   @JsonProperty("structuredOut")
+  @com.fasterxml.jackson.annotation.JsonProperty("structuredOut")
   public String getStructuredOut() {
     return this.structuredOut;
   }
 
 
   @JsonProperty("structuredOut")
+  @com.fasterxml.jackson.annotation.JsonProperty("structuredOut")
   public void setStructuredOut(String structuredOut) {
     this.structuredOut = structuredOut;
   }
 
   @JsonProperty("roleCommand")
+  @com.fasterxml.jackson.annotation.JsonProperty("roleCommand")
   public String getRoleCommand() {
     return this.roleCommand;
   }
 
   @JsonProperty("roleCommand")
+  @com.fasterxml.jackson.annotation.JsonProperty("roleCommand")
   public void setRoleCommand(String roleCommand) {
     this.roleCommand = roleCommand;
   }
 
   @JsonProperty("role")
+  @com.fasterxml.jackson.annotation.JsonProperty("role")
   public String getRole() {
     return role;
   }
   
   @JsonProperty("role")
+  @com.fasterxml.jackson.annotation.JsonProperty("role")
   public void setRole(String role) {
     this.role = role;
   }
   
   @JsonProperty("status")
+  @com.fasterxml.jackson.annotation.JsonProperty("status")
   public String getStatus() {
     return status;
   }
   
   @JsonProperty("status")
+  @com.fasterxml.jackson.annotation.JsonProperty("status")
   public void setStatus(String status) {
     this.status = status;
   }
   
   @JsonProperty("serviceName")
+  @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
   public String getServiceName() {
     return serviceName;
   }
   
   @JsonProperty("serviceName")
+  @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
   public void setServiceName(String serviceName) {
     this.serviceName = serviceName;
   }
@@ -163,6 +187,7 @@ public class CommandReport {
    * @param tags the config tags that match this command
    */
   @JsonProperty("configurationTags")
+  @com.fasterxml.jackson.annotation.JsonProperty("configurationTags")
   public void setConfigurationTags(Map<String, Map<String,String>> tags) {
     configurationTags = tags;
   }
@@ -172,6 +197,7 @@ public class CommandReport {
    * if none are present
    */
   @JsonProperty("configurationTags")
+  @com.fasterxml.jackson.annotation.JsonProperty("configurationTags")
   public Map<String, Map<String,String>> getConfigurationTags() {
     return configurationTags;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/DiskInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/DiskInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/DiskInfo.java
index 0f345b8..6d4738c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/DiskInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/DiskInfo.java
@@ -59,71 +59,85 @@ public class DiskInfo {
   public DiskInfo() {}
 
   @JsonProperty("available")
+  @com.fasterxml.jackson.annotation.JsonProperty("available")
   public void setAvailable(String available) {
     this.available = available;
   }
   
   @JsonProperty("available")
+  @com.fasterxml.jackson.annotation.JsonProperty("available")
   public String getAvailable() {
     return this.available;
   }
 
   @JsonProperty("mountpoint")
+  @com.fasterxml.jackson.annotation.JsonProperty("mountpoint")
   public String getMountPoint() {
     return this.mountpoint;
   }
   
   @JsonProperty("mountpoint")
+  @com.fasterxml.jackson.annotation.JsonProperty("mountpoint")
   public void setMountPoint(String mountpoint) {
     this.mountpoint = mountpoint;
   }
 
   @JsonProperty("type")
+  @com.fasterxml.jackson.annotation.JsonProperty("type")
   public String getType() {
     return this.type;
   }
 
   @JsonProperty("type")
+  @com.fasterxml.jackson.annotation.JsonProperty("type")
   public void setType(String type) {
     this.type = type;
   }
   
   @JsonProperty("used")
+  @com.fasterxml.jackson.annotation.JsonProperty("used")
   public String getUsed() {
     return this.used;
   }
 
   @JsonProperty("used")
+  @com.fasterxml.jackson.annotation.JsonProperty("used")
   public void setUsed(String used) {
     this.used = used;
   }
   
   @JsonProperty("percent")
+  @com.fasterxml.jackson.annotation.JsonProperty("percent")
   public String getPercent() {
     return this.percent;
   }
   
   @JsonProperty("percent")
+  @com.fasterxml.jackson.annotation.JsonProperty("percent")
   public void setPercent(String percent) {
     this.percent = percent;
   }
   
   @JsonProperty("size")
+  @com.fasterxml.jackson.annotation.JsonProperty("size")
   public String getSize() {
     return this.size;
   }
   
   @JsonProperty("size")
+  @com.fasterxml.jackson.annotation.JsonProperty("size")
   public void setSize(String size) {
     this.size = size;
   }
 
   @JsonProperty("device")
+  @com.fasterxml.jackson.annotation.JsonProperty("device")
   public String getDevice() {
     return device;
   }
 
   @JsonProperty("device")
+  @com.fasterxml.jackson.annotation.JsonProperty("device")
   public void setDevice(String device) {
     this.device = device;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
index 8c726a0..c2579a9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
@@ -46,70 +46,92 @@ public class ExecutionCommand extends AgentCommand {
   }
 
   @SerializedName("clusterName")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
   private String clusterName;
 
   @SerializedName("requestId")
+  @com.fasterxml.jackson.annotation.JsonProperty("requestId")
   private long requestId;
 
   @SerializedName("stageId")
+  @com.fasterxml.jackson.annotation.JsonProperty("stageId")
   private long stageId;
 
   @SerializedName("taskId")
+  @com.fasterxml.jackson.annotation.JsonProperty("taskId")
   private long taskId;
 
   @SerializedName("commandId")
+  @com.fasterxml.jackson.annotation.JsonProperty("commandId")
   private String commandId;
 
   @SerializedName("hostname")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostname")
   private String hostname;
 
   @SerializedName("role")
+  @com.fasterxml.jackson.annotation.JsonProperty("role")
   private String role;
 
   @SerializedName("hostLevelParams")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostLevelParams")
   private Map<String, String> hostLevelParams = new HashMap<>();
 
   @SerializedName("roleParams")
+  @com.fasterxml.jackson.annotation.JsonProperty("roleParams")
   private Map<String, String> roleParams = null;
 
   @SerializedName("roleCommand")
+  @com.fasterxml.jackson.annotation.JsonProperty("roleCommand")
   private RoleCommand roleCommand;
 
   @SerializedName("clusterHostInfo")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterHostInfo")
   private Map<String, Set<String>> clusterHostInfo =
     new HashMap<>();
 
   @SerializedName("configurations")
+  @com.fasterxml.jackson.annotation.JsonProperty("configurations")
   private Map<String, Map<String, String>> configurations;
 
   @SerializedName("configuration_attributes")
+  @com.fasterxml.jackson.annotation.JsonProperty("configuration_attributes")
   private Map<String, Map<String, Map<String, String>>> configurationAttributes;
 
   @SerializedName("configurationTags")
+  @com.fasterxml.jackson.annotation.JsonProperty("configurationTags")
   private Map<String, Map<String, String>> configurationTags;
 
   @SerializedName("forceRefreshConfigTagsBeforeExecution")
+  @com.fasterxml.jackson.annotation.JsonProperty("forceRefreshConfigTagsBeforeExecution")
   private boolean forceRefreshConfigTagsBeforeExecution = false;
 
   @SerializedName("commandParams")
+  @com.fasterxml.jackson.annotation.JsonProperty("commandParams")
   private Map<String, String> commandParams = new HashMap<>();
 
   @SerializedName("serviceName")
+  @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
   private String serviceName;
 
   @SerializedName("serviceType")
+  @com.fasterxml.jackson.annotation.JsonProperty("serviceType")
   private String serviceType;
 
   @SerializedName("componentName")
+  @com.fasterxml.jackson.annotation.JsonProperty("componentName")
   private String componentName;
 
   @SerializedName("kerberosCommandParams")
+  @com.fasterxml.jackson.annotation.JsonProperty("kerberosCommandParams")
   private List<Map<String, String>> kerberosCommandParams = new ArrayList<>();
 
   @SerializedName("localComponents")
+  @com.fasterxml.jackson.annotation.JsonProperty("localComponents")
   private Set<String> localComponents = new HashSet<>();
 
   @SerializedName("availableServices")
+  @com.fasterxml.jackson.annotation.JsonProperty("availableServices")
   private Map<String, String> availableServices = new HashMap<>();
 
   /**
@@ -117,6 +139,7 @@ public class ExecutionCommand extends AgentCommand {
    * service is enabled for credential store use.
    */
   @SerializedName("credentialStoreEnabled")
+  @com.fasterxml.jackson.annotation.JsonProperty("credentialStoreEnabled")
   private String credentialStoreEnabled;
 
   /**
@@ -142,6 +165,7 @@ public class ExecutionCommand extends AgentCommand {
    *   </pre>
    */
   @SerializedName("configuration_credentials")
+  @com.fasterxml.jackson.annotation.JsonProperty("configuration_credentials")
   private Map<String, Map<String, String>> configurationCredentials;
 
   public void setConfigurationCredentials(Map<String, Map<String, String>> configurationCredentials) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
index 7d5f78c..922f6ee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
@@ -32,7 +32,10 @@ import org.codehaus.jackson.annotate.JsonProperty;
  */
 
 public class HeartBeat {
+
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   private long responseId = -1;
+
   private long timestamp;
   private String hostname;
   List<CommandReport> reports = new ArrayList<>();
@@ -87,11 +90,13 @@ public class HeartBeat {
   }
 
   @JsonProperty("reports")
+  @com.fasterxml.jackson.annotation.JsonProperty("reports")
   public List<CommandReport> getReports() {
     return reports;
   }
 
   @JsonProperty("reports")
+  @com.fasterxml.jackson.annotation.JsonProperty("reports")
   public void setReports(List<CommandReport> reports) {
     this.reports = reports;
   }
@@ -121,21 +126,25 @@ public class HeartBeat {
   }
 
   @JsonProperty("componentStatus")
+  @com.fasterxml.jackson.annotation.JsonProperty("componentStatus")
   public List<ComponentStatus> getComponentStatus() {
     return componentStatus;
   }
 
   @JsonProperty("componentStatus")
+  @com.fasterxml.jackson.annotation.JsonProperty("componentStatus")
   public void setComponentStatus(List<ComponentStatus> componentStatus) {
     this.componentStatus = componentStatus;
   }
 
   @JsonProperty("mounts")
+  @com.fasterxml.jackson.annotation.JsonProperty("mounts")
   public List<DiskInfo> getMounts() {
     return mounts;
   }
 
   @JsonProperty("mounts")
+  @com.fasterxml.jackson.annotation.JsonProperty("mounts")
   public void setMounts(List<DiskInfo> mounts) {
     this.mounts = mounts;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
index 67ec87d..e890761 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
@@ -22,25 +22,18 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.HostNotFoundException;
 import org.apache.ambari.server.actionmanager.ActionManager;
-import org.apache.ambari.server.agent.stomp.dto.TopologyCluster;
-import org.apache.ambari.server.agent.stomp.dto.TopologyComponent;
-import org.apache.ambari.server.agent.stomp.dto.TopologyHost;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
-import org.apache.ambari.server.events.TopologyUpdateEvent;
 import org.apache.ambari.server.serveraction.kerberos.KerberosIdentityDataFileReader;
 import org.apache.ambari.server.serveraction.kerberos.KerberosIdentityDataFileReaderFactory;
 import org.apache.ambari.server.serveraction.kerberos.KerberosServerAction;
@@ -51,8 +44,6 @@ import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostState;
-import org.apache.ambari.server.state.Service;
-import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
@@ -63,7 +54,6 @@ import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
 import org.apache.ambari.server.state.host.HostHealthyHeartbeatEvent;
 import org.apache.ambari.server.state.host.HostRegistrationRequestEvent;
 import org.apache.ambari.server.state.host.HostStatusUpdatesReceivedEvent;
-import org.apache.ambari.server.state.host.HostUnhealthyHeartbeatEvent;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.codec.binary.Base64;
@@ -223,13 +213,8 @@ public class HeartBeatHandler {
     }
 
     try {
-      if (heartbeat.getNodeStatus().getStatus().equals(HostStatus.Status.HEALTHY)) {
-        hostObject.handleEvent(new HostHealthyHeartbeatEvent(hostname, now,
-            heartbeat.getAgentEnv(), heartbeat.getMounts()));
-      } else {
-        hostObject.handleEvent(new HostUnhealthyHeartbeatEvent(hostname, now,
-            null));
-      }
+      hostObject.handleEvent(new HostHealthyHeartbeatEvent(hostname, now,
+          heartbeat.getAgentEnv(), heartbeat.getMounts()));
     } catch (InvalidStateTransitionException ex) {
       LOG.warn("Asking agent to re-register due to " + ex.getMessage(), ex);
       hostObject.setState(HostState.INIT);
@@ -353,7 +338,7 @@ public class HeartBeatHandler {
     return osType.toLowerCase();
   }
 
-  protected HeartBeatResponse createRegisterCommand() {
+  public HeartBeatResponse createRegisterCommand() {
     HeartBeatResponse response = new HeartBeatResponse();
     RegistrationCommand regCmd = new RegistrationCommand();
     response.setResponseId(0);
@@ -481,59 +466,6 @@ public class HeartBeatHandler {
   }
 
   /**
-   * Is used during agent registering to provide base info about clusters topology.
-   * @return filled TopologyUpdateEvent with info about all components and hosts in all clusters
-   * @throws InvalidStateTransitionException
-   * @throws AmbariException
-   */
-  //TODO need move to better place
-  public TopologyUpdateEvent getInitialClusterTopology()
-      throws InvalidStateTransitionException, AmbariException {
-    Map<String, TopologyCluster> topologyClusters = new HashMap<>();
-    for (Cluster cl : clusterFsm.getClusters().values()) {
-      Collection<Host> clusterHosts = cl.getHosts();
-      Set<TopologyComponent> topologyComponents = new HashSet<>();
-      Set<TopologyHost> topologyHosts = new HashSet<>();
-      for (Host host : clusterHosts) {
-        topologyHosts.add(new TopologyHost(host.getHostId(), host.getHostName(),
-            host.getRackInfo(), host.getIPv4()));
-      }
-      for (Service service : cl.getServices().values()) {
-        for (ServiceComponent component : service.getServiceComponents().values()) {
-          Map<String, ServiceComponentHost> componentsMap = component.getServiceComponentHosts();
-          if (!componentsMap.isEmpty()) {
-
-            //TODO will be a need to change to multi-instance usage
-            ServiceComponentHost sch = componentsMap.entrySet().iterator().next().getValue();
-
-            Set<String> hostNames = cl.getHosts(sch.getServiceName(), sch.getServiceComponentName());
-            Set<Long> hostOrderIds = clusterHosts.stream()
-                .filter(h -> hostNames.contains(h.getHostName()))
-                .map(h -> h.getHostId()).collect(Collectors.toSet());
-            String serviceName = sch.getServiceName();
-            String componentName = sch.getServiceComponentName();
-            StackId stackId = cl.getDesiredStackVersion();
-
-            TopologyComponent topologyComponent = TopologyComponent.newBuilder()
-                .setComponentName(sch.getServiceComponentName())
-                .setServiceName(sch.getServiceName())
-                .setVersion(sch.getVersion())
-                .setHostIds(hostOrderIds)
-                .setStatusCommandParams(ambariMetaInfo.getStatusCommandParams(stackId, serviceName, componentName))
-                .build();
-            topologyComponents.add(topologyComponent);
-          }
-        }
-      }
-      topologyClusters.put(Long.toString(cl.getClusterId()),
-          new TopologyCluster(topologyComponents, topologyHosts));
-    }
-    TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(topologyClusters,
-        TopologyUpdateEvent.EventType.UPDATE);
-    return topologyUpdateEvent;
-  }
-
-  /**
    * Annotate the response with some housekeeping details.
    * hasMappedComponents - indicates if any components are mapped to the host
    * hasPendingTasks - indicates if any tasks are pending for the host (they may not be sent yet)

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
index 0cfc68d..b46bac9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
@@ -29,15 +29,19 @@ import com.google.gson.annotations.SerializedName;
 public class HeartBeatResponse {
 
   @SerializedName("responseId")
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   private long responseId;
 
   @SerializedName("executionCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("executionCommands")
   private List<ExecutionCommand> executionCommands = new ArrayList<>();
 
   @SerializedName("statusCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("statusCommands")
   private List<StatusCommand> statusCommands = new ArrayList<>();
 
   @SerializedName("cancelCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("cancelCommands")
   private List<CancelCommand> cancelCommands = new ArrayList<>();
 
   /**
@@ -48,6 +52,7 @@ public class HeartBeatResponse {
    * the agent to abandon all alert definitions that are scheduled.
    */
   @SerializedName("alertDefinitionCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("alertDefinitionCommands")
   private List<AlertDefinitionCommand> alertDefinitionCommands = null;
 
   /**
@@ -55,24 +60,31 @@ public class HeartBeatResponse {
    * immediately.
    */
   @SerializedName("alertExecutionCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("alertExecutionCommands")
   private List<AlertExecutionCommand> alertExecutionCommands = null;
 
   @SerializedName("registrationCommand")
+  @com.fasterxml.jackson.annotation.JsonProperty("registrationCommand")
   private RegistrationCommand registrationCommand;
 
   @SerializedName("restartAgent")
+  @com.fasterxml.jackson.annotation.JsonProperty("restartAgent")
   private boolean restartAgent = false;
 
   @SerializedName("hasMappedComponents")
+  @com.fasterxml.jackson.annotation.JsonProperty("hasMappedComponents")
   private boolean hasMappedComponents = false;
 
   @SerializedName("hasPendingTasks")
+  @com.fasterxml.jackson.annotation.JsonProperty("hasPendingTasks")
   private boolean hasPendingTasks = false;
 
   @SerializedName("recoveryConfig")
+  @com.fasterxml.jackson.annotation.JsonProperty("recoveryConfig")
   private RecoveryConfig recoveryConfig;
 
   @SerializedName("clusterSize")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterSize")
   private int clusterSize = -1;
 
   public long getResponseId() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/HostInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HostInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HostInfo.java
index d1e5dbc..1c27bbb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HostInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HostInfo.java
@@ -63,311 +63,373 @@ public class HostInfo {
 
 
   @JsonProperty("architecture")
+  @com.fasterxml.jackson.annotation.JsonProperty("architecture")
   public String getArchitecture() {
     return this.architecture;
   }
 
   @JsonProperty("architecture")
+  @com.fasterxml.jackson.annotation.JsonProperty("architecture")
   public void setArchitecture(String architecture) {
     this.architecture = architecture;
   }
 
   @JsonProperty("domain")
+  @com.fasterxml.jackson.annotation.JsonProperty("domain")
   public String getDomain() {
     return this.domain;
   }
 
   @JsonProperty("domain")
+  @com.fasterxml.jackson.annotation.JsonProperty("domain")
   public void setDomain(String domain) {
     this.domain = domain;
   }
 
   @JsonProperty("fqdn")
+  @com.fasterxml.jackson.annotation.JsonProperty("fqdn")
   public String getFQDN() {
     return this.fqdn;
   }
 
   @JsonProperty("fqdn")
+  @com.fasterxml.jackson.annotation.JsonProperty("fqdn")
   public void setFQDN(String fqdn) {
     this.fqdn = fqdn;
   }
 
   @JsonProperty("hardwareisa")
+  @com.fasterxml.jackson.annotation.JsonProperty("hardwareisa")
   public String getHardwareIsa() {
     return hardwareisa;
   }
 
   @JsonProperty("hardwareisa")
+  @com.fasterxml.jackson.annotation.JsonProperty("hardwareisa")
   public void setHardwareIsa(String hardwareisa) {
     this.hardwareisa = hardwareisa;
   }
 
   @JsonProperty("hardwaremodel")
+  @com.fasterxml.jackson.annotation.JsonProperty("hardwaremodel")
   public String getHardwareModel() {
     return this.hardwaremodel;
   }
 
   @JsonProperty("hardwaremodel")
+  @com.fasterxml.jackson.annotation.JsonProperty("hardwaremodel")
   public void setHardwareModel(String hardwaremodel) {
     this.hardwaremodel = hardwaremodel;
   }
 
   @JsonProperty("hostname")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostname")
   public String getHostName() {
     return this.hostname;
   }
 
   @JsonProperty("hostname")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostname")
   public void setHostName(String hostname) {
     this.hostname = hostname;
   }
 
   @JsonProperty("id")
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   public String getAgentUserId() {
     return id;
   }
 
   @JsonProperty("id")
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   public void setAgentUserId(String id) {
     this.id = id;
   }
 
   @JsonProperty("interfaces")
+  @com.fasterxml.jackson.annotation.JsonProperty("interfaces")
   public String getInterfaces() {
     return this.interfaces;
   }
 
   @JsonProperty("interfaces")
+  @com.fasterxml.jackson.annotation.JsonProperty("interfaces")
   public void setInterfaces(String interfaces) {
     this.interfaces = interfaces;
   }
 
   @JsonProperty("ipaddress")
+  @com.fasterxml.jackson.annotation.JsonProperty("ipaddress")
   public String getIPAddress() {
     return this.ipaddress;
   }
 
   @JsonProperty("ipaddress")
+  @com.fasterxml.jackson.annotation.JsonProperty("ipaddress")
   public void setIPAddress(String ipaddress) {
     this.ipaddress = ipaddress;
   }
 
   @JsonProperty("kernel")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernel")
   public String getKernel() {
     return this.kernel;
   }
 
   @JsonProperty("kernel")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernel")
   public void setKernel(String kernel) {
     this.kernel = kernel;
   }
 
   @JsonProperty("kernelmajversion")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernelmajversion")
   public String getKernelMajVersion() {
     return this.kernelmajversion;
   }
 
   @JsonProperty("kernelmajversion")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernelmajversion")
   public void setKernelMajVersion(String kernelmajversion) {
     this.kernelmajversion = kernelmajversion;
   }
 
   @JsonProperty("kernelrelease")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernelrelease")
   public String getKernelRelease() {
     return this.kernelrelease;
   }
 
   @JsonProperty("kernelrelease")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernelrelease")
   public void setKernelRelease(String kernelrelease) {
     this.kernelrelease = kernelrelease;
   }
 
   @JsonProperty("kernelversion")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernelversion")
   public String getKernelVersion() {
     return this.kernelversion;
   }
 
   @JsonProperty("kernelversion")
+  @com.fasterxml.jackson.annotation.JsonProperty("kernelversion")
   public void setKernelVersion(String kernelversion) {
     this.kernelversion = kernelversion;
   }
 
   @JsonProperty("macaddress")
+  @com.fasterxml.jackson.annotation.JsonProperty("macaddress")
   public String getMacAddress() {
     return this.macaddress;
   }
 
   @JsonProperty("macaddress")
+  @com.fasterxml.jackson.annotation.JsonProperty("macaddress")
   public void setMacAddress(String macaddress) {
     this.macaddress = macaddress;
   }
 
   @JsonProperty("memoryfree")
+  @com.fasterxml.jackson.annotation.JsonProperty("memoryfree")
   public long getFreeMemory() {
     return this.memoryfree;
   }
 
   @JsonProperty("memoryfree")
+  @com.fasterxml.jackson.annotation.JsonProperty("memoryfree")
   public void setFreeMemory(long memoryfree) {
     this.memoryfree = memoryfree;
   }
 
   @JsonProperty("memorysize")
+  @com.fasterxml.jackson.annotation.JsonProperty("memorysize")
   public long getMemorySize() {
     return this.memorysize;
   }
 
   @JsonProperty("memorysize")
+  @com.fasterxml.jackson.annotation.JsonProperty("memorysize")
   public void setMemorySize(long memorysize) {
     this.memorysize = memorysize;
   }
 
   @JsonProperty("mounts")
+  @com.fasterxml.jackson.annotation.JsonProperty("mounts")
   public List<DiskInfo> getMounts() {
     return this.mounts;
   }
 
   @JsonProperty("mounts")
+  @com.fasterxml.jackson.annotation.JsonProperty("mounts")
   public void setMounts(List<DiskInfo> mounts) {
     this.mounts = mounts;
   }
 
   @JsonProperty("memorytotal")
+  @com.fasterxml.jackson.annotation.JsonProperty("memorytotal")
   public long getMemoryTotal() {
     return this.memorytotal;
   }
 
   @JsonProperty("memorytotal")
+  @com.fasterxml.jackson.annotation.JsonProperty("memorytotal")
   public void setMemoryTotal(long memorytotal) {
     this.memorytotal = memorytotal;
   }
 
   @JsonProperty("netmask")
+  @com.fasterxml.jackson.annotation.JsonProperty("netmask")
   public String getNetMask() {
     return this.netmask;
   }
 
   @JsonProperty("netmask")
+  @com.fasterxml.jackson.annotation.JsonProperty("netmask")
   public void setNetMask(String netmask) {
     this.netmask = netmask;
   }
 
   @JsonProperty("operatingsystem")
+  @com.fasterxml.jackson.annotation.JsonProperty("operatingsystem")
   public String getOS() {
     return this.operatingsystem;
   }
 
   @JsonProperty("operatingsystem")
+  @com.fasterxml.jackson.annotation.JsonProperty("operatingsystem")
   public void setOS(String operatingsystem) {
     this.operatingsystem = operatingsystem;
   }
 
   @JsonProperty("operatingsystemrelease")
+  @com.fasterxml.jackson.annotation.JsonProperty("operatingsystemrelease")
   public String getOSRelease() {
     return this.operatingsystemrelease;
   }
 
   @JsonProperty("operatingsystemrelease")
+  @com.fasterxml.jackson.annotation.JsonProperty("operatingsystemrelease")
   public void setOSRelease(String operatingsystemrelease) {
     this.operatingsystemrelease = operatingsystemrelease;
   }
 
   @JsonProperty("osfamily")
+  @com.fasterxml.jackson.annotation.JsonProperty("osfamily")
   public String getOSFamily() {
     return this.osfamily;
   }
 
   @JsonProperty("osfamily")
+  @com.fasterxml.jackson.annotation.JsonProperty("osfamily")
   public void setOSFamily(String osfamily) {
     this.osfamily = osfamily;
   }
 
   @JsonProperty("physicalprocessorcount")
+  @com.fasterxml.jackson.annotation.JsonProperty("physicalprocessorcount")
   public int getPhysicalProcessorCount() {
     return this.physicalprocessorcount;
   }
 
   @JsonProperty("physicalprocessorcount")
+  @com.fasterxml.jackson.annotation.JsonProperty("physicalprocessorcount")
   public void setPhysicalProcessorCount(int physicalprocessorcount) {
     this.physicalprocessorcount = physicalprocessorcount;
   }
 
   @JsonProperty("processorcount")
+  @com.fasterxml.jackson.annotation.JsonProperty("processorcount")
   public int getProcessorCount() {
     return this.processorcount;
   }
 
   @JsonProperty("processorcount")
+  @com.fasterxml.jackson.annotation.JsonProperty("processorcount")
   public void setProcessorCount(int processorcount) {
     this.processorcount = processorcount;
   }
 
   @JsonProperty("selinux")
+  @com.fasterxml.jackson.annotation.JsonProperty("selinux")
   public boolean getSeLinux() {
     return selinux;
   }
 
   @JsonProperty("selinux")
+  @com.fasterxml.jackson.annotation.JsonProperty("selinux")
   public void setSeLinux(boolean selinux) {
     this.selinux = selinux;
   }
 
   @JsonProperty("swapfree")
+  @com.fasterxml.jackson.annotation.JsonProperty("swapfree")
   public String getSwapFree() {
     return this.swapfree;
   }
 
   @JsonProperty("swapfree")
+  @com.fasterxml.jackson.annotation.JsonProperty("swapfree")
   public void setSwapFree(String swapfree) {
     this.swapfree = swapfree;
   }
 
   @JsonProperty("swapsize")
+  @com.fasterxml.jackson.annotation.JsonProperty("swapsize")
   public String getSwapSize() {
     return swapsize;
   }
 
   @JsonProperty("swapsize")
+  @com.fasterxml.jackson.annotation.JsonProperty("swapsize")
   public void setSwapSize(String swapsize) {
     this.swapsize = swapsize;
   }
 
   @JsonProperty("timezone")
+  @com.fasterxml.jackson.annotation.JsonProperty("timezone")
   public String getTimeZone() {
     return this.timezone;
   }
 
   @JsonProperty("timezone")
+  @com.fasterxml.jackson.annotation.JsonProperty("timezone")
   public void setTimeZone(String timezone) {
     this.timezone = timezone;
   }
 
   @JsonProperty("uptime")
+  @com.fasterxml.jackson.annotation.JsonProperty("uptime")
   public String getUptime() {
     return this.uptime;
   }
 
   @JsonProperty("uptime")
+  @com.fasterxml.jackson.annotation.JsonProperty("uptime")
   public void setUpTime(String uptime) {
     this.uptime = uptime;
   }
 
   @JsonProperty("uptime_hours")
+  @com.fasterxml.jackson.annotation.JsonProperty("uptime_hours")
   public long getUptimeHours() {
     return this.uptime_hours;
   }
 
   @JsonProperty("uptime_hours")
+  @com.fasterxml.jackson.annotation.JsonProperty("uptime_hours")
   public void setUpTimeHours(long uptime_hours) {
     this.uptime_hours = uptime_hours;
   }
 
   @JsonProperty("uptime_days")
+  @com.fasterxml.jackson.annotation.JsonProperty("uptime_days")
   public long getUpTimeDays() {
     return this.uptime_days;
   }
 
   @JsonProperty("uptime_days")
+  @com.fasterxml.jackson.annotation.JsonProperty("uptime_days")
   public void setUpTimeDays(long uptime_days) {
     this.uptime_days = uptime_days;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/HostStatus.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HostStatus.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HostStatus.java
index 2d021e9..3633038 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HostStatus.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HostStatus.java
@@ -43,21 +43,25 @@ public class HostStatus {
   }
 
   @JsonProperty("status")
+  @com.fasterxml.jackson.annotation.JsonProperty("status")
   public Status getStatus() {
     return status;
   }
 
   @JsonProperty("status")
+  @com.fasterxml.jackson.annotation.JsonProperty("status")
   public void setStatus(Status status) {
     this.status = status;
   }
 
   @JsonProperty("cause")
+  @com.fasterxml.jackson.annotation.JsonProperty("cause")
   public String getCause() {
     return cause;
   }
 
   @JsonProperty("cause")
+  @com.fasterxml.jackson.annotation.JsonProperty("cause")
   public void setCause(String cause) {
     this.cause = cause;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfig.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfig.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfig.java
index 235da11..e54fcfd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfig.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryConfig.java
@@ -33,24 +33,31 @@ public class RecoveryConfig {
   }
 
   @SerializedName("type")
+  @com.fasterxml.jackson.annotation.JsonProperty("type")
   private String type;
 
   @SerializedName("maxCount")
+  @com.fasterxml.jackson.annotation.JsonProperty("maxCount")
   private String maxCount;
 
   @SerializedName("windowInMinutes")
+  @com.fasterxml.jackson.annotation.JsonProperty("windowInMinutes")
   private String windowInMinutes;
 
   @SerializedName("retryGap")
+  @com.fasterxml.jackson.annotation.JsonProperty("retryGap")
   private String retryGap;
 
   @SerializedName("maxLifetimeCount")
+  @com.fasterxml.jackson.annotation.JsonProperty("maxLifetimeCount")
   private String maxLifetimeCount;
 
   @SerializedName("components")
+  @com.fasterxml.jackson.annotation.JsonProperty("components")
   private String enabledComponents;
 
   @SerializedName("recoveryTimestamp")
+  @com.fasterxml.jackson.annotation.JsonProperty("recoveryTimestamp")
   private long recoveryTimestamp;
 
   public String getEnabledComponents() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryReport.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryReport.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryReport.java
index 47af7c1..69eb837 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryReport.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/RecoveryReport.java
@@ -34,21 +34,25 @@ public class RecoveryReport {
 
 
   @JsonProperty("summary")
+  @com.fasterxml.jackson.annotation.JsonProperty("summary")
   public String getSummary() {
     return summary;
   }
 
   @JsonProperty("summary")
+  @com.fasterxml.jackson.annotation.JsonProperty("summary")
   public void setSummary(String summary) {
     this.summary = summary;
   }
 
   @JsonProperty("component_reports")
+  @com.fasterxml.jackson.annotation.JsonProperty("component_reports")
   public List<ComponentRecoveryReport> getComponentReports() {
     return componentReports;
   }
 
   @JsonProperty("component_reports")
+  @com.fasterxml.jackson.annotation.JsonProperty("component_reports")
   public void setComponentReports(List<ComponentRecoveryReport> componentReports) {
     this.componentReports = componentReports;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/Register.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/Register.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/Register.java
index a571afd..1a81de3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/Register.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/Register.java
@@ -37,11 +37,13 @@ public class Register {
   private String prefix;
 
   @JsonProperty("responseId")
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   public int getResponseId() {
     return responseId;
   }
 
   @JsonProperty("responseId")
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   public void setResponseId(int responseId) {
     this.responseId=responseId;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
index 8efefde..46f3bb4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
@@ -31,6 +31,7 @@ import org.codehaus.jackson.annotate.JsonProperty;
  */
 public class RegistrationResponse {
   @JsonProperty("response")
+  @com.fasterxml.jackson.annotation.JsonProperty("response")
   private RegistrationStatus response;
 
   /**
@@ -38,6 +39,7 @@ public class RegistrationResponse {
    * alert definitions it needs to schedule.
    */
   @JsonProperty("alertDefinitionCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("alertDefinitionCommands")
   private List<AlertDefinitionCommand> alertDefinitionCommands = new ArrayList<>();
 
   /**
@@ -47,25 +49,31 @@ public class RegistrationResponse {
    *                different version of agent and server)
    */
   @JsonProperty("exitstatus")
+  @com.fasterxml.jackson.annotation.JsonProperty("exitstatus")
   private int exitstatus;
 
   /**
    * log - message, which will be printed to agents  log
    */
   @JsonProperty("log")
+  @com.fasterxml.jackson.annotation.JsonProperty("log")
   private String log;
 
   //Response id to start with, usually zero.
   @JsonProperty("responseId")
+  @com.fasterxml.jackson.annotation.JsonProperty("id")
   private long responseId;
 
   @JsonProperty("recoveryConfig")
+  @com.fasterxml.jackson.annotation.JsonProperty("recoveryConfig")
   private RecoveryConfig recoveryConfig;
 
   @JsonProperty("agentConfig")
+  @com.fasterxml.jackson.annotation.JsonProperty("agentConfig")
   private Map<String, String> agentConfig;
 
   @JsonProperty("statusCommands")
+  @com.fasterxml.jackson.annotation.JsonProperty("statusCommands")
   private List<StatusCommand> statusCommands = null;
 
   public RegistrationStatus getResponseStatus() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
index 9c17e00..8dabbc2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
@@ -34,39 +34,51 @@ public class StatusCommand extends AgentCommand {
   }
 
   @SerializedName("clusterName")
+  @com.fasterxml.jackson.annotation.JsonProperty("clusterName")
   private String clusterName;
 
   @SerializedName("serviceName")
+  @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
   private String serviceName;
 
   @SerializedName("componentName")
+  @com.fasterxml.jackson.annotation.JsonProperty("componentName")
   private String componentName;
 
   @SerializedName("configurations")
+  @com.fasterxml.jackson.annotation.JsonProperty("configurations")
   private Map<String, Map<String, String>> configurations;
 
   @SerializedName("configuration_attributes")
+  @com.fasterxml.jackson.annotation.JsonProperty("configuration_attributes")
   private Map<String, Map<String, Map<String, String>>> configurationAttributes;
 
   @SerializedName("commandParams")
+  @com.fasterxml.jackson.annotation.JsonProperty("commandParams")
   private Map<String, String> commandParams = new HashMap<>();
 
   @SerializedName("hostLevelParams")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostLevelParams")
   private Map<String, String> hostLevelParams = new HashMap<>();
 
   @SerializedName("hostname")
+  @com.fasterxml.jackson.annotation.JsonProperty("hostname")
   private String hostname = null;
 
   @SerializedName("payloadLevel")
+  @com.fasterxml.jackson.annotation.JsonProperty("payloadLevel")
   private StatusCommandPayload payloadLevel = StatusCommandPayload.DEFAULT;
 
   @SerializedName("desiredState")
+  @com.fasterxml.jackson.annotation.JsonProperty("desiredState")
   private State desiredState;
 
   @SerializedName("hasStaleConfigs")
+  @com.fasterxml.jackson.annotation.JsonProperty("hasStaleConfigs")
   private Boolean hasStaleConfigs;
 
   @SerializedName("executionCommandDetails")
+  @com.fasterxml.jackson.annotation.JsonProperty("executionCommandDetails")
   private ExecutionCommand executionCommand;
 
   public ExecutionCommand getExecutionCommand() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentClusterDataHolder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentClusterDataHolder.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentClusterDataHolder.java
new file mode 100644
index 0000000..e3038b6
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentClusterDataHolder.java
@@ -0,0 +1,112 @@
+/**
+ * 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;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.agent.stomp.dto.Hashable;
+import org.apache.commons.lang.StringUtils;
+
+import com.google.gson.Gson;
+
+/**
+ * Is used to saving and updating last version of event
+ * @param <T> event with hash to control version
+ */
+public abstract class AgentClusterDataHolder<T extends Hashable> {
+  private String parentHash;
+  private String currentHash;
+  private T data;
+
+  public final String salt = "";
+
+  public T getUpdateIfChanged(String agentHash) throws AmbariException {
+    if (StringUtils.isEmpty(agentHash) || (StringUtils.isNotEmpty(agentHash) && !agentHash.equals(currentHash))) {
+      if (data == null) {
+        data = getCurrentData();
+        parentHash = currentHash;
+        currentHash = getHash(data);
+        data.setHash(currentHash);
+      }
+      return data;
+    }
+    return getEmptyData();
+  }
+
+  protected abstract T getCurrentData() throws AmbariException;
+
+  protected abstract T getEmptyData();
+
+  protected void regenerateHash() {
+    setCurrentHash(null);
+    setParentHash(getCurrentHash());
+    setCurrentHash(getHash(getData()));
+    getData().setHash(getCurrentHash());
+  }
+
+  protected String getHash(T data) {
+    String json = new Gson().toJson(data);
+    String generatedPassword = null;
+    try {
+      MessageDigest md = MessageDigest.getInstance("SHA-512");
+      md.update(salt.getBytes("UTF-8"));
+      byte[] bytes = md.digest(json.getBytes("UTF-8"));
+      StringBuilder sb = new StringBuilder();
+      for(int i=0; i< bytes.length ;i++){
+        sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
+      }
+      generatedPassword = sb.toString();
+    }
+    catch (NoSuchAlgorithmException e){
+      e.printStackTrace();
+    } catch (UnsupportedEncodingException e) {
+      e.printStackTrace();
+    }
+    return generatedPassword;
+  }
+
+  public abstract void updateData(T update) throws AmbariException;
+
+  public String getParentHash() {
+    return parentHash;
+  }
+
+  public void setParentHash(String parentHash) {
+    this.parentHash = parentHash;
+  }
+
+  public String getCurrentHash() {
+    return currentHash;
+  }
+
+  public void setCurrentHash(String currentHash) {
+    this.currentHash = currentHash;
+  }
+
+  public T getData() {
+    return data;
+  }
+
+  public void setData(T data) {
+    this.data = data;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentCurrentDataController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentCurrentDataController.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentCurrentDataController.java
new file mode 100644
index 0000000..f0f18cc
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AgentCurrentDataController.java
@@ -0,0 +1,77 @@
+/**
+ * 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;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.agent.AgentSessionManager;
+import org.apache.ambari.server.agent.stomp.dto.Hash;
+import org.apache.ambari.server.events.AgentConfigsUpdateEvent;
+import org.apache.ambari.server.events.MetadataUpdateEvent;
+import org.apache.ambari.server.events.TopologyUpdateEvent;
+import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.messaging.handler.annotation.MessageMapping;
+import org.springframework.messaging.simp.annotation.SendToUser;
+import org.springframework.messaging.simp.annotation.SubscribeMapping;
+import org.springframework.stereotype.Controller;
+
+import com.google.inject.Injector;
+
+@Controller
+@SendToUser("/")
+@MessageMapping("/agents")
+public class AgentCurrentDataController {
+  private static Log LOG = LogFactory.getLog(AgentCurrentDataController.class);
+  private final AgentSessionManager agentSessionManager;
+  private final TopologyHolder topologyHolder;
+  private final MetadataHolder metadataHolder;
+  private final ConfigHelper configHelper;
+
+  //TODO remove after hash generation implementing
+  private final String CONFIGS_HASH_STUB = "stubhash";
+
+  public AgentCurrentDataController(Injector injector) {
+    agentSessionManager = injector.getInstance(AgentSessionManager.class);
+    topologyHolder = injector.getInstance(TopologyHolder.class);
+    metadataHolder = injector.getInstance(MetadataHolder.class);
+    configHelper = injector.getInstance(ConfigHelper.class);
+  }
+
+  @SubscribeMapping("/topologies")
+  public TopologyUpdateEvent getCurrentTopology(Hash hash) throws AmbariException, InvalidStateTransitionException {
+    return topologyHolder.getUpdateIfChanged(hash.getHash());
+  }
+
+  @SubscribeMapping("/metadata")
+  public MetadataUpdateEvent getCurrentMetadata(Hash hash) throws AmbariException {
+    return metadataHolder.getUpdateIfChanged(hash.getHash());
+  }
+
+  //TODO method should returns empty response in case hash is relevant
+  @SubscribeMapping("/configs")
+  public AgentConfigsUpdateEvent getCurrentConfigs(@Header String simpSessionId, Hash hash) throws AmbariException {
+    String currentHash = CONFIGS_HASH_STUB;
+    AgentConfigsUpdateEvent agentConfigsUpdateEvent = configHelper.getHostActualConfigs(
+          agentSessionManager.getHost(simpSessionId).getHostName());
+    agentConfigsUpdateEvent.setHash(currentHash);
+    return agentConfigsUpdateEvent;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HeartbeatController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HeartbeatController.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HeartbeatController.java
index b56449e..81fb300 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HeartbeatController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/HeartbeatController.java
@@ -27,7 +27,6 @@ import org.apache.ambari.server.agent.HeartBeatResponse;
 import org.apache.ambari.server.agent.Register;
 import org.apache.ambari.server.agent.RegistrationResponse;
 import org.apache.ambari.server.agent.RegistrationStatus;
-import org.apache.ambari.server.events.publishers.StateUpdateEventPublisher;
 import org.apache.ambari.server.state.cluster.ClustersImpl;
 import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
 import org.apache.commons.logging.Log;
@@ -48,13 +47,11 @@ public class HeartbeatController {
   private final HeartBeatHandler hh;
   private final ClustersImpl clusters;
   private final AgentSessionManager agentSessionManager;
-  private final StateUpdateEventPublisher stateUpdateEventPublisher;
 
   public HeartbeatController(Injector injector) {
     hh = injector.getInstance(HeartBeatHandler.class);
     clusters = injector.getInstance(ClustersImpl.class);
     agentSessionManager = injector.getInstance(AgentSessionManager.class);
-    stateUpdateEventPublisher = injector.getInstance(StateUpdateEventPublisher.class);
   }
 
   @SubscribeMapping("/register")
@@ -75,17 +72,24 @@ public class HeartbeatController {
       response.setLog(ex.getMessage());
       return response;
     }
-    stateUpdateEventPublisher.publish(hh.getInitialClusterTopology());
+    agentSessionManager.register(simpSessionId,
+        clusters.getHost(message.getHostname()));
     return response;
   }
 
   @SubscribeMapping("/heartbeat")
-  public HeartBeatResponse heartbeat(HeartBeat message) {
+  public HeartBeatResponse heartbeat(@Header String simpSessionId, HeartBeat message) {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Received Heartbeat message " + message);
     }
     HeartBeatResponse heartBeatResponse;
     try {
+      if (!agentSessionManager.isRegistered(simpSessionId)) {
+        //Server restarted, or unknown host.
+        LOG.error(String.format("Host with [%s] sessionId not registered", simpSessionId));
+        return hh.createRegisterCommand();
+      }
+      message.setHostname(agentSessionManager.getHost(simpSessionId).getHostName());
       heartBeatResponse = hh.handleHeartBeat(message);
       if (LOG.isDebugEnabled()) {
         LOG.debug("Sending heartbeat response with response id " + heartBeatResponse.getResponseId());

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java
new file mode 100644
index 0000000..b1adcbe
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/MetadataHolder.java
@@ -0,0 +1,55 @@
+/**
+ * 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;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
+import org.apache.ambari.server.events.MetadataUpdateEvent;
+import org.apache.ambari.server.events.publishers.StateUpdateEventPublisher;
+
+import com.google.common.eventbus.Subscribe;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class MetadataHolder extends AgentClusterDataHolder<MetadataUpdateEvent> {
+
+  @Inject
+  private AmbariManagementControllerImpl ambariManagementController;
+
+  @Inject
+  public MetadataHolder(StateUpdateEventPublisher stateUpdateEventPublisher) {
+    stateUpdateEventPublisher.register(this);
+  }
+
+  @Override
+  public MetadataUpdateEvent getCurrentData() throws AmbariException {
+    return ambariManagementController.getClustersMetadata();
+  }
+
+  @Subscribe
+  public void updateData(MetadataUpdateEvent update) throws AmbariException {
+    setData(getCurrentData());
+    regenerateHash();
+  }
+
+  @Override
+  protected MetadataUpdateEvent getEmptyData() {
+    return MetadataUpdateEvent.emptyUpdate();
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
new file mode 100644
index 0000000..a4a7580
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
@@ -0,0 +1,159 @@
+/**
+ * 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;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.ClusterNotFoundException;
+import org.apache.ambari.server.agent.HeartBeatHandler;
+import org.apache.ambari.server.agent.RecoveryConfigHelper;
+import org.apache.ambari.server.agent.stomp.dto.TopologyCluster;
+import org.apache.ambari.server.agent.stomp.dto.TopologyComponent;
+import org.apache.ambari.server.agent.stomp.dto.TopologyHost;
+import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
+import org.apache.ambari.server.events.TopologyUpdateEvent;
+import org.apache.ambari.server.events.publishers.StateUpdateEventPublisher;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.ServiceComponentHost;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
+import org.apache.commons.collections.CollectionUtils;
+
+import com.google.common.eventbus.Subscribe;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class TopologyHolder extends AgentClusterDataHolder<TopologyUpdateEvent> {
+  @Inject
+  private HeartBeatHandler heartBeatHandler;
+
+  @Inject
+  private RecoveryConfigHelper recoveryConfigHelper;
+
+  @Inject
+  private AmbariManagementControllerImpl ambariManagementController;
+
+  @Inject
+  private Clusters clusters;
+
+  @Inject
+  public TopologyHolder(StateUpdateEventPublisher stateUpdateEventPublisher) {
+    stateUpdateEventPublisher.register(this);
+  }
+
+  /**
+   * Is used during agent registering to provide base info about clusters topology.
+   * @return filled TopologyUpdateEvent with info about all components and hosts in all clusters
+   * @throws InvalidStateTransitionException
+   * @throws AmbariException
+   */
+  @Override
+  public TopologyUpdateEvent getCurrentData() throws AmbariException {
+    TreeMap<String, TopologyCluster> topologyClusters = new TreeMap<>();
+    for (Cluster cl : clusters.getClusters().values()) {
+      Collection<Host> clusterHosts = cl.getHosts();
+      Set<TopologyComponent> topologyComponents = new HashSet<>();
+      Set<TopologyHost> topologyHosts = new HashSet<>();
+      for (Host host : clusterHosts) {
+        topologyHosts.add(new TopologyHost(host.getHostId(), host.getHostName(),
+            host.getRackInfo(), host.getIPv4(), recoveryConfigHelper.getRecoveryConfig(cl.getClusterName(),
+            host.getHostName()),
+            ambariManagementController.getTopologyHostLevelParams(cl, host)));
+      }
+      for (Service service : cl.getServices().values()) {
+        for (ServiceComponent component : service.getServiceComponents().values()) {
+          Map<String, ServiceComponentHost> componentsMap = component.getServiceComponentHosts();
+          if (!componentsMap.isEmpty()) {
+
+            //TODO will be a need to change to multi-instance usage
+            ServiceComponentHost sch = componentsMap.entrySet().iterator().next().getValue();
+
+            Set<String> hostNames = cl.getHosts(sch.getServiceName(), sch.getServiceComponentName());
+            Set<Long> hostOrderIds = clusterHosts.stream()
+                .filter(h -> hostNames.contains(h.getHostName()))
+                .map(h -> h.getHostId()).collect(Collectors.toSet());
+            String serviceName = sch.getServiceName();
+            String componentName = sch.getServiceComponentName();
+            StackId stackId = cl.getDesiredStackVersion();
+
+            TopologyComponent topologyComponent = TopologyComponent.newBuilder()
+                .setComponentName(sch.getServiceComponentName())
+                .setServiceName(sch.getServiceName())
+                .setVersion(sch.getVersion())
+                .setHostIds(hostOrderIds)
+                .setComponentLevelParams(ambariManagementController.getTopologyComponentLevelParams(stackId, serviceName,
+                    componentName, cl.getSecurityType()))
+                .build();
+            topologyComponents.add(topologyComponent);
+          }
+        }
+      }
+      topologyClusters.put(Long.toString(cl.getClusterId()),
+          new TopologyCluster(topologyComponents, topologyHosts));
+    }
+    TopologyUpdateEvent topologyUpdateEvent = new TopologyUpdateEvent(topologyClusters,
+        TopologyUpdateEvent.EventType.CREATE);
+    return topologyUpdateEvent;
+  }
+
+  @Subscribe
+  public void updateData(TopologyUpdateEvent update) throws AmbariException {
+    if (getData() == null) {
+      setData(getCurrentData());
+    }
+    TopologyUpdateEvent.EventType eventType = update.getEventType();
+    for (Map.Entry<String, TopologyCluster> updatedCluster : update.getClusters().entrySet()) {
+      String clusterId = updatedCluster.getKey();
+      TopologyCluster cluster = updatedCluster.getValue();
+      if (getData().getClusters().containsKey(clusterId)) {
+        if (eventType.equals(TopologyUpdateEvent.EventType.DELETE) &&
+            CollectionUtils.isEmpty(getData().getClusters().get(clusterId).getTopologyComponents()) &&
+            CollectionUtils.isEmpty(getData().getClusters().get(clusterId).getTopologyHosts())) {
+          getData().getClusters().remove(clusterId);
+        } else {
+          getData().getClusters().get(clusterId).update(update.getClusters().get(clusterId).getTopologyComponents(),
+              update.getClusters().get(clusterId).getTopologyHosts(), eventType);
+        }
+      } else {
+        if (eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
+          getData().getClusters().put(clusterId, cluster);
+        } else {
+          throw new ClusterNotFoundException(Long.getLong(clusterId));
+        }
+      }
+    }
+
+    regenerateHash();
+  }
+
+  @Override
+  protected TopologyUpdateEvent getEmptyData() {
+    return TopologyUpdateEvent.emptyUpdate();
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/421ac277/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ClusterConfigs.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ClusterConfigs.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ClusterConfigs.java
new file mode 100644
index 0000000..b9339a7
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/ClusterConfigs.java
@@ -0,0 +1,50 @@
+/**
+ * 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.Map;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class ClusterConfigs {
+  private Map<String, Map<String, String>> configurations;
+  private Map<String, Map<String, Map<String, String>>> configurationAttributes;
+
+  public ClusterConfigs(Map<String, Map<String, String>> configurations, Map<String, Map<String, Map<String, String>>> configurationAttributes) {
+    this.configurations = configurations;
+    this.configurationAttributes = configurationAttributes;
+  }
+
+  public Map<String, Map<String, String>> getConfigurations() {
+    return configurations;
+  }
+
+  public void setConfigurations(Map<String, Map<String, String>> configurations) {
+    this.configurations = configurations;
+  }
+
+  public Map<String, Map<String, Map<String, String>>> getConfigurationAttributes() {
+    return configurationAttributes;
+  }
+
+  public void setConfigurationAttributes(Map<String, Map<String, Map<String, String>>> configurationAttributes) {
+    this.configurationAttributes = configurationAttributes;
+  }
+}