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;
+ }
+}