You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ji...@apache.org on 2012/09/28 00:35:02 UTC
svn commit: r1391245 - in /incubator/ambari/branches/AMBARI-666: ./
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/
ambari-server/src/main/java/org/apache/ambari/server/agent/
ambari-server/src/main/java/org/apache/ambari/server/sta...
Author: jitendra
Date: Thu Sep 27 22:35:00 2012
New Revision: 1391245
URL: http://svn.apache.org/viewvc?rev=1391245&view=rev
Log:
AMBARI-756. Heartbeat handler: Handle heartbeat timeout.
Added:
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationCommand.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyList.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyListAdapter.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMap.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMapAdapter.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyVal.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyValAdapter.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java
Modified:
incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostAction.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentCommand.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/AgentVersion.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/Clusters.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/ClustersImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/host/HostState.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java
Modified: incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt (original)
+++ incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt Thu Sep 27 22:35:00 2012
@@ -12,6 +12,8 @@ AMBARI-666 branch (unreleased changes)
NEW FEATURES
+ AMBARI-756. Heartbeat handler: Handle heartbeat timeout. (jitendra)
+
AMBARI-772. Stylize main nav. (yusaku)
AMBARI-771. Add security between the server and agent and authentication for
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java Thu Sep 27 22:35:00 2012
@@ -21,59 +21,38 @@ import java.util.List;
import org.apache.ambari.server.Role;
-public class ActionDBAccessor {
-
- private long stageId = 0;
-
- public void persistAction(HostAction ha) {
- }
-
- public Stage getAction(String actionId) {
- return null;
- }
-
- public List<Stage> getAllStages(String requestId) {
- return null;
- }
-
+public interface ActionDBAccessor {
+
+ public void persistAction(HostAction ha);
+
+ public Stage getAction(String actionId);
+
+ public List<Stage> getAllStages(String requestId);
+
/**
* Returns all the actions that have been queued but not completed yet.
*/
- public List<Stage> getQueuedStages() {
- return null;
- }
-
+ public List<Stage> getQueuedStages();
+
/**
* Returns all the actions that have not been queued yet.
*/
- public List<Stage> getNotQueuedStages() {
- return null;
- }
-
+ public List<Stage> getNotQueuedStages();
+
/**
* Returns next stage id in the sequence, must be persisted.
*/
- public synchronized long getNextStageId() {
- return ++stageId ;
- }
-
- public void abortOperation(long requestId) {
- //Mark all pending or queued actions for this request as aborted.
- }
-
- public void timeoutHostRole(long requestId, long stageId, Role role) {
- // TODO Auto-generated method stub
- }
+ public long getNextStageId();
+
+ public void abortOperation(long requestId);
+
+ public void timeoutHostRole(String host, long requestId, long stageId, Role role);
/**
* Returns all the pending stages, including queued and not-queued.
*/
- public List<Stage> getPendingStages() {
- return null;
- }
-
- public void persistActions(List<Stage> stages) {
- // TODO Auto-generated method stub
-
- }
-}
+ public List<Stage> getPendingStages();
+
+ public void persistActions(List<Stage> stages);
+
+}
\ No newline at end of file
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,111 @@
+/**
+ * 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.actionmanager;
+
+import java.util.List;
+
+import org.apache.ambari.server.Role;
+
+public class ActionDBAccessorImpl implements ActionDBAccessor {
+
+ private long stageId = 0;
+
+ public ActionDBAccessorImpl() {
+ //this.stageId = greatest stage id in the database + 1
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#persistAction(org.apache.ambari.server.actionmanager.HostAction)
+ */
+ @Override
+ public void persistAction(HostAction ha) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#getAction(java.lang.String)
+ */
+ @Override
+ public Stage getAction(String actionId) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#getAllStages(java.lang.String)
+ */
+ @Override
+ public List<Stage> getAllStages(String requestId) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#getQueuedStages()
+ */
+ @Override
+ public List<Stage> getQueuedStages() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#getNotQueuedStages()
+ */
+ @Override
+ public List<Stage> getNotQueuedStages() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#getNextStageId()
+ */
+ @Override
+ public synchronized long getNextStageId() {
+ return ++stageId ;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#abortOperation(long)
+ */
+ @Override
+ public void abortOperation(long requestId) {
+ //Mark all pending or queued actions for this request as aborted.
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#timeoutHostRole(long, long, org.apache.ambari.server.Role)
+ */
+ @Override
+ public void timeoutHostRole(String host, long requestId, long stageId, Role role) {
+ // TODO Auto-generated method stub
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#getPendingStages()
+ */
+ @Override
+ public List<Stage> getPendingStages() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.ambari.server.actionmanager.ActionDBAccessor#persistActions(java.util.List)
+ */
+ @Override
+ public void persistActions(List<Stage> stages) {
+ // TODO Auto-generated method stub
+
+ }
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,88 @@
+/**
+ * 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.actionmanager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.ambari.server.Role;
+
+public class ActionDBInMemoryImpl implements ActionDBAccessor {
+
+ List<Stage> stageList = new ArrayList<Stage>();
+
+ @Override
+ public void persistAction(HostAction ha) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public Stage getAction(String actionId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<Stage> getAllStages(String requestId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<Stage> getQueuedStages() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<Stage> getNotQueuedStages() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getNextStageId() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void abortOperation(long requestId) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void timeoutHostRole(String host, long requestId, long stageId, Role role) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public List<Stage> getPendingStages() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void persistActions(List<Stage> stages) {
+ for (Stage s: stages) {
+ stageList.add(s);
+ }
+ }
+}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java Thu Sep 27 22:35:00 2012
@@ -23,20 +23,25 @@ import org.apache.ambari.server.agent.Ac
import org.apache.ambari.server.agent.CommandReport;
import org.apache.ambari.server.state.live.Clusters;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
/**
* This class acts as the interface for action manager with other components.
*/
+@Singleton
public class ActionManager {
private final ActionScheduler scheduler;
private final ActionDBAccessor db;
private final ActionQueue actionQueue;
private final Clusters fsm;
+ @Inject
public ActionManager(long schedulerSleepTime, long actionTimeout,
ActionQueue aq, Clusters fsm) {
this.actionQueue = aq;
- db = new ActionDBAccessor();
+ db = new ActionDBAccessorImpl();
scheduler = new ActionScheduler(schedulerSleepTime, actionTimeout, db,
actionQueue, fsm, 2);
this.fsm = fsm;
@@ -67,4 +72,9 @@ public class ActionManager {
public void actionResponse(String hostname, List<CommandReport> report) {
//persist the action response into the db.
}
+
+ public void handleLostHost(String host) {
+ // TODO Auto-generated method stub
+
+ }
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java Thu Sep 27 22:35:00 2012
@@ -24,7 +24,6 @@ import java.util.TreeMap;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.Role;
import org.apache.ambari.server.agent.ActionQueue;
-import org.apache.ambari.server.agent.ExecutionCommand;
import org.apache.ambari.server.state.fsm.InvalidStateTransitonException;
import org.apache.ambari.server.state.live.Clusters;
import org.apache.ambari.server.state.live.svccomphost.ServiceComponentHostEvent;
@@ -75,10 +74,10 @@ class ActionScheduler implements Runnabl
doWork();
Thread.sleep(sleepTime);
} catch (InterruptedException ex) {
+ LOG.warn("Scheduler thread is interrupted going to stop", ex);
shouldRun = false;
} catch (Exception ex) {
- //ignore
- //Log the exception
+ LOG.warn("Exception received", ex);
}
}
}
@@ -129,49 +128,53 @@ class ActionScheduler implements Runnabl
continue;
}
long now = System.currentTimeMillis();
- if (now > hrc.getLastAttemptTime()+actionTimeout) {
+ if (now > stage.getLastAttemptTime(host)+actionTimeout) {
LOG.info("Host:"+host+", role:"+hrc.getRole()+", actionId:"+stage.getActionId()+" timed out");
- if (hrc.getAttemptCount() >= maxAttempts) {
+ if (stage.getAttemptCount(host) >= maxAttempts) {
LOG.warn("Host:"+host+", role:"+hrc.getRole()+", actionId:"+stage.getActionId()+" expired");
// final expired
ServiceComponentHostEvent timeoutEvent = new ServiceComponentHostEvent(
ServiceComponentHostEventType.HOST_SVCCOMP_OP_FAILED, hrc
- .getRole().toString(), hrc.getHostName(), now);
+ .getRole().toString(), host, now);
try {
fsmObject.getCluster(stage.getClusterName())
.handleServiceComponentHostEvent("", hrc.getRole().toString(),
- hrc.getHostName(), timeoutEvent);
+ host, timeoutEvent);
} catch (InvalidStateTransitonException e) {
// Propagate exception
e.printStackTrace();
+ } catch (AmbariException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
- db.timeoutHostRole(stage.getRequestId(), stage.getStageId(),
+ db.timeoutHostRole(host, stage.getRequestId(), stage.getStageId(),
hrc.getRole());
} else {
- scheduleHostRole(stage, hrc);
+ scheduleHostRole(stage, host, hrc);
}
}
}
}
- private void scheduleHostRole(Stage s, HostRoleCommand hrc) throws AmbariException {
- LOG.info("Host:"+hrc.getHostName()+", role:"+hrc.getRole()+", actionId:"+s.getActionId()+" being scheduled");
+ private void scheduleHostRole(Stage s, String hostname, HostRoleCommand hrc) {
+ LOG.info("Host:" + hostname + ", role:" + hrc.getRole() + ", actionId:"
+ + s.getActionId() + " being scheduled");
long now = System.currentTimeMillis();
- if (hrc.getStartTime() < 0) {
+ if (s.getStartTime(hostname) < 0) {
try {
fsmObject.getCluster(s.getClusterName())
- .handleServiceComponentHostEvent("", "", hrc.getHostName(),
+ .handleServiceComponentHostEvent("", "", hostname,
hrc.getEvent());
} catch (InvalidStateTransitonException e) {
e.printStackTrace();
+ } catch (AmbariException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
}
- hrc.setLastAttemptTime(now);
- hrc.incrementAttemptCount();
- ExecutionCommand cmd = new ExecutionCommand();
- cmd.setCommandId(s.getActionId());
- cmd.setManifest(s.getManifest(hrc.getHostName()));
- actionQueue.enqueue(hrc.getHostName(), cmd);
+ s.setLastAttemptTime(hostname, now);
+ s.incrementAttemptCount(hostname);
+ actionQueue.enqueue(hostname, s.getExecutionCommand(hostname));
}
private RoleStatus getRoleStatus(
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostAction.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostAction.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostAction.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostAction.java Thu Sep 27 22:35:00 2012
@@ -19,17 +19,47 @@ package org.apache.ambari.server.actionm
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
+import org.apache.ambari.server.agent.AgentCommand;
+import org.apache.ambari.server.agent.ExecutionCommand;
+
+/**
+ * Encapsulates entire task for a host for a stage or action. This class
+ * contains all the information to generate an
+ * {@link org.apache.ambari.server.agent.ExecutionCommand} that will be
+ * scheduled for a host.
+ */
public class HostAction {
private final String host;
- private Map<String, String> params = null;
- private String manifest = null;
- private final List<HostRoleCommand> roles;
+ private List<HostRoleCommand> roles;
+ private long startTime = -1;
+ private long lastAttemptTime = -1;
+ private short attemptCount = 0;
+
+ /**
+ * This object will be serialized and sent to the agent.
+ */
+ private ExecutionCommand commandToHost;
+ public String getManifest() {
+ //generate manifest
+ return null;
+ }
+
public HostAction(String host) {
this.host = host;
roles = new ArrayList<HostRoleCommand>();
+ commandToHost = new ExecutionCommand();
+ commandToHost.setHostName(host);
+ }
+
+ public HostAction(HostAction ha) {
+ this.host = ha.host;
+ this.roles = ha.roles;
+ this.startTime = ha.startTime;
+ this.lastAttemptTime = ha.lastAttemptTime;
+ this.attemptCount = ha.attemptCount;
+ this.commandToHost = ha.commandToHost;
}
public void addHostRoleCommand(HostRoleCommand cmd) {
@@ -40,17 +70,31 @@ public class HostAction {
return roles;
}
- public void setManifest(String manifest) {
- if (this.manifest != null) {
- throw new RuntimeException("Not allowed to set manifest twice");
- }
- this.manifest = manifest;
+ public long getStartTime() {
+ return startTime;
+ }
+
+ public long getLastAttemptTime() {
+ return this.lastAttemptTime;
+ }
+
+ public void setLastAttemptTime(long t) {
+ this.lastAttemptTime = t;
+ }
+
+ public void incrementAttemptCount() {
+ this.attemptCount ++;
+ }
+
+ public short getAttemptCount() {
+ return this.attemptCount;
}
- public String getManifest() {
- if (manifest == null) {
- //generate manifest
- }
- return manifest;
+ public AgentCommand getCommandToHost() {
+ return this.commandToHost;
+ }
+
+ public synchronized void setCommandId(long requestId, long stageId) {
+ commandToHost.setCommandId(requestId+ "-" + stageId);
}
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java Thu Sep 27 22:35:00 2012
@@ -17,33 +17,23 @@
*/
package org.apache.ambari.server.actionmanager;
-import java.util.Map;
import org.apache.ambari.server.Role;
-import org.apache.ambari.server.RoleCommand;
import org.apache.ambari.server.state.live.svccomphost.ServiceComponentHostEvent;
/**
- * This class encapsulates all the information for an action
- * on a host for a particular role. This class will be used to schedule, persist and track
- * an action.
+ * This class encapsulates the information for an task on a host for a
+ * particular role which action manager needs. It doesn't capture actual
+ * command and parameters, but just the stuff enough for action manager.
+ * For the actual command refer {@link HostAction#commandToHost}
*/
public class HostRoleCommand {
private final Role role;
- private Map<String, String> params = null;
private HostRoleStatus status = HostRoleStatus.PENDING;
- private final RoleCommand cmd;
- private long startTime = -1;
- private long lastAttemptTime = -1;
- private short attemptCount = 0;
- private final String host;
private final ServiceComponentHostEvent event;
- public HostRoleCommand(String host, Role role, RoleCommand cmd,
- ServiceComponentHostEvent event) {
- this.host = host;
+ public HostRoleCommand(Role role, ServiceComponentHostEvent event) {
this.role = role;
- this.cmd = cmd;
this.event = event;
}
@@ -55,32 +45,9 @@ public class HostRoleCommand {
return status;
}
- public long getStartTime() {
- return startTime;
- }
-
- public long getLastAttemptTime() {
- return this.lastAttemptTime;
- }
-
- public void setLastAttemptTime(long t) {
- this.lastAttemptTime = t;
- }
-
- public String getHostName() {
- return this.host;
- }
-
public ServiceComponentHostEvent getEvent() {
return event;
}
- public void incrementAttemptCount() {
- this.attemptCount ++;
- }
-
- public short getAttemptCount() {
- return this.attemptCount;
- }
void setStatus(HostRoleStatus status) {
this.status = status;
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java Thu Sep 27 22:35:00 2012
@@ -22,6 +22,7 @@ import java.util.Map;
import java.util.TreeMap;
import org.apache.ambari.server.Role;
+import org.apache.ambari.server.agent.AgentCommand;
//This class encapsulates the stage. The stage encapsulates all the information
//required to persist an action.
@@ -48,6 +49,9 @@ public class Stage {
throw new RuntimeException("Attempt to set stageId again! Not allowed.");
}
this.stageId = stageId;
+ for (String host: this.hostActions.keySet()) {
+ this.hostActions.get(host).setCommandId(this.requestId, this.stageId);
+ }
}
public synchronized long getStageId() {
@@ -59,6 +63,7 @@ public class Stage {
}
synchronized void addHostAction(String host, HostAction ha) {
+ ha.setCommandId(requestId, stageId);
hostActions.put(host, ha);
}
@@ -95,4 +100,28 @@ public class Stage {
public String getClusterName() {
return clusterName;
}
+
+ public long getLastAttemptTime(String host) {
+ return getHostAction(host).getLastAttemptTime();
+ }
+
+ public short getAttemptCount(String host) {
+ return getHostAction(host).getAttemptCount();
+ }
+
+ public void incrementAttemptCount(String hostname) {
+ getHostAction(hostname).incrementAttemptCount();
+ }
+
+ public void setLastAttemptTime(String hostname, long t) {
+ getHostAction(hostname).setLastAttemptTime(t);
+ }
+
+ public AgentCommand getExecutionCommand(String hostname) {
+ return getHostAction(hostname).getCommandToHost();
+ }
+
+ public long getStartTime(String hostname) {
+ return getHostAction(hostname).getStartTime();
+ }
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentCommand.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentCommand.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentCommand.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/AgentCommand.java Thu Sep 27 22:35:00 2012
@@ -20,6 +20,7 @@ package org.apache.ambari.server.agent;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@@ -27,14 +28,19 @@ import javax.xml.bind.annotation.XmlType
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {})
public abstract class AgentCommand {
+
@XmlElement
- private String commandId;
+ private AgentCommandType commandType;
- public String getCommandId() {
- return this.commandId;
+ public AgentCommand(AgentCommandType type) {
+ this.commandType = type;
}
- public void setCommandId(String commandId) {
- this.commandId = commandId;
+ @XmlType
+ @XmlEnum
+ public enum AgentCommandType {
+ EXECUTION_COMMAND,
+ STATUS_COMMAND,
+ REGISTRATION_COMMAND
}
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java Thu Sep 27 22:35:00 2012
@@ -17,25 +17,61 @@
*/
package org.apache.ambari.server.agent;
+import java.util.List;
+import java.util.Map;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.apache.ambari.server.utils.JaxbMapKeyListAdapter;
+import org.apache.ambari.server.utils.JaxbMapKeyMapAdapter;
+import org.apache.ambari.server.utils.JaxbMapKeyValAdapter;
+
+/**
+ * Execution commands are scheduled by action manager, and these are
+ * persisted in the database for recovery.
+ */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {})
public class ExecutionCommand extends AgentCommand {
+
+ public ExecutionCommand() {
+ super(AgentCommandType.EXECUTION_COMMAND);
+ }
+
+ @XmlElement
+ private String commandId;
+
+ @XmlElement
+ private String hostname;
+
+ @XmlElement
+ @XmlJavaTypeAdapter(JaxbMapKeyValAdapter.class)
+ private Map<String, String> params = null;
+
+ @XmlElement
+ @XmlJavaTypeAdapter(JaxbMapKeyListAdapter.class)
+ private Map<String, List<String>> clusterHostInfo = null;
+
+ @XmlElement
+ private List<RoleExecution> rolesCommands;
+
@XmlElement
- String manifest ="";
+ @XmlJavaTypeAdapter(JaxbMapKeyMapAdapter.class)
+ private Map<String, Map<String, String>> configurations;
- public String getManifest() {
- return this.manifest;
+ public String getCommandId() {
+ return this.commandId;
}
- public void setManifest(String manifest) {
- this.manifest = manifest;
+ public void setCommandId(String commandId) {
+ this.commandId = commandId;
}
@Override //Object
@@ -43,13 +79,58 @@ public class ExecutionCommand extends Ag
if (!(other instanceof ExecutionCommand)) {
return false;
}
- ExecutionCommand o = (ExecutionCommand)other;
- return this.manifest.equals(o.getManifest());
+ ExecutionCommand o = (ExecutionCommand) other;
+ return (this.commandId == o.commandId &&
+ this.hostname == o.hostname);
}
@Override //Object
public int hashCode() {
- //Assume two different actions will always have a different manifest
- return manifest.hashCode();
+ return (hostname + commandId).hashCode();
+ }
+
+ public void setHostName(String host) {
+ this.hostname = host;
+ }
+
+ @XmlRootElement
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "", propOrder = {})
+ static class RoleExecution {
+
+ @XmlElement
+ private String role;
+
+ //These params are at role level
+ @XmlElement
+ @XmlJavaTypeAdapter(JaxbMapKeyValAdapter.class)
+ private Map<String, String> roleParams = null;
+
+ @XmlElement
+ private String cmd;
+
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public Map<String, String> getRoleParams() {
+ return roleParams;
+ }
+
+ public void setRoleParams(Map<String, String> roleParams) {
+ this.roleParams = roleParams;
+ }
+
+ public String getCmd() {
+ return cmd;
+ }
+
+ public void setCmd(String cmd) {
+ this.cmd = cmd;
+ }
}
- }
+}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeat.java Thu Sep 27 22:35:00 2012
@@ -73,4 +73,8 @@ public class HeartBeat {
public void setHostname(String hostname) {
this.hostname = hostname;
}
+
+ public List<CommandReport> getCommandReports() {
+ return this.reports;
+ }
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java Thu Sep 27 22:35:00 2012
@@ -18,7 +18,12 @@
package org.apache.ambari.server.agent;
import java.util.ArrayList;
+import java.util.List;
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.state.live.Clusters;
+
+import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -28,17 +33,72 @@ import com.google.inject.Singleton;
*/
@Singleton
public class HeartBeatHandler {
+
+ private final Clusters clusterFsm;
+ private final ActionQueue actionQueue;
+ private final ActionManager actionManager;
+ private HeartbeatMonitor heartbeatMonitor;
+
+ @Inject
+ public HeartBeatHandler(Clusters fsm, ActionQueue aq, ActionManager am) {
+ this.clusterFsm = fsm;
+ this.actionQueue = aq;
+ this.actionManager = am;
+ this.heartbeatMonitor = new HeartbeatMonitor(fsm, aq, am, 60000);
+ }
+
+ public void start() {
+ heartbeatMonitor.start();
+ }
+
public HeartBeatResponse handleHeartBeat(HeartBeat heartbeat) {
+
HeartBeatResponse response = new HeartBeatResponse();
- response.setAgentCommands(new ArrayList<AgentCommand>());
response.setClusterId("test");
response.setResponseId(0L);
- return response;
+ List<String> clusterNames = clusterFsm.getClusters(heartbeat.getHostname());
+ try {
+ clusterFsm.handleHeartbeat(heartbeat.getHostname(),
+ heartbeat.getTimestamp());
+ } catch (Exception ex) {
+ // Unexpected heartbeat, reset to init state
+ // send registration command
+ clusterFsm.updateStatus(heartbeat.getHostname(), "GO_TO_INIT");
+ RegistrationCommand regCmd = new RegistrationCommand();
+ List<AgentCommand> cmds = new ArrayList<AgentCommand>();
+ cmds.add(regCmd);
+ response.setAgentCommands(cmds);
+ return response;
+ }
+
+ // Examine heartbeat for command reports
+ List<CommandReport> reports = heartbeat.getCommandReports();
+ actionManager.actionResponse(heartbeat.getHostname(), reports);
+
+ // Examine heartbeart for component status
+ for (ComponentStatus status : heartbeat.componentStatus) {
+ clusterFsm.updateStatus(heartbeat.getHostname(), status.status);
+ }
+
+ //TODO: Check if heartbeat is unhealthy
+
+ //Send commands if node is active
+ if (clusterFsm.isNodeActive(heartbeat.getHostname())) {
+ List<AgentCommand> cmds = actionQueue.dequeueAll(heartbeat.getHostname());
+ response.setAgentCommands(cmds);
+ }
+ return response;
}
public RegistrationResponse handleRegistration(Register register) {
- RegistrationResponse registrationResponse = new RegistrationResponse();
- registrationResponse.setResponseStatus(RegistrationStatus.OK);
- return registrationResponse;
+ List<String> roles = clusterFsm.getHostComponents(register.getHostname());
+ try {
+ clusterFsm.handleRegistration(register.getHostname());
+ } catch (Exception ex) {
+ //Go to status check state
+ clusterFsm.updateStatus(register.getHostname(), "GO TO STATUS CHECK");
+ }
+ RegistrationResponse response = new RegistrationResponse();
+ return response;
}
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatResponse.java Thu Sep 27 22:35:00 2012
@@ -27,8 +27,6 @@ import javax.xml.bind.annotation.XmlElem
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
-
-
/**
*
* Controller to Agent response data model.
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,100 @@
+/**
+ * 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;
+
+import java.util.List;
+
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.state.live.Clusters;
+import org.apache.ambari.server.state.live.host.HostState;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Monitors the node state and heartbeats.
+ */
+public class HeartbeatMonitor implements Runnable {
+ private static Log LOG = LogFactory.getLog(HeartbeatMonitor.class);
+ private Clusters fsm;
+ private ActionQueue actionQueue;
+ private ActionManager actionManager;
+ private final int threadWakeupInterval; //1 minute
+ private volatile boolean shouldRun = true;
+ private Thread monitorThread = null;
+
+ public HeartbeatMonitor(Clusters fsm, ActionQueue aq, ActionManager am,
+ int threadWakeupInterval) {
+ this.fsm = fsm;
+ this.actionQueue = aq;
+ this.actionManager = am;
+ this.threadWakeupInterval = threadWakeupInterval;
+ }
+
+ public void shutdown() {
+ shouldRun = false;
+ }
+
+
+ public void start() {
+ monitorThread = new Thread(this);
+ monitorThread.start();
+ }
+
+ @Override
+ public void run() {
+ while (shouldRun) {
+ try {
+ Thread.sleep(threadWakeupInterval);
+ doWork();
+ } catch (InterruptedException ex) {
+ LOG.warn("Scheduler thread is interrupted going to stop", ex);
+ shouldRun = false;
+ } catch (Exception ex) {
+ LOG.warn("Exception received", ex);
+ }
+ }
+ }
+
+ //Go through all the nodes, check for last heartbeat or any waiting state
+ //If heartbeat is lost, update node fsm state, purge the action queue
+ //notify action manager for node failure.
+ private void doWork() {
+ List<String> allHosts = fsm.getAllHosts();
+ long now = System.currentTimeMillis();
+ for (String host : allHosts) {
+ HostState hostState = fsm.getHostState(host);
+ long lastHeartbeat = hostState.getLastHeartbeat();
+ if (lastHeartbeat + 5*threadWakeupInterval < now) {
+ //Heartbeat is expired
+ fsm.updateStatus(host, "HEARTBEAT_EXPIRED");
+ //Purge action queue
+ actionQueue.dequeueAll(host);
+ //notify action manager
+ actionManager.handleLostHost(host);
+ }
+ if (hostState == HostState.WAITING_FOR_HOST_STATUS_UPDATES) {
+ long timeSpentInState = hostState.getTimeInState();
+ if (timeSpentInState + 5*threadWakeupInterval < now) {
+ //Ask to register again
+ fsm.updateStatus(host, "GO_BACK_TO_INIT");
+ }
+ }
+ }
+ }
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationCommand.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationCommand.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationCommand.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationCommand.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,33 @@
+/**
+ * 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;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {})
+public class RegistrationCommand extends AgentCommand {
+
+ public RegistrationCommand() {
+ super(AgentCommandType.REGISTRATION_COMMAND);
+ }
+}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/RegistrationResponse.java Thu Sep 27 22:35:00 2012
@@ -34,8 +34,9 @@ import javax.xml.bind.annotation.XmlType
@XmlType(name = "", propOrder = {})
public class RegistrationResponse {
@XmlElement
- public RegistrationStatus response;
-
+ private RegistrationStatus response;
+
+ private AgentCommand command = null;
public RegistrationStatus getResponseStatus() {
return response;
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java Thu Sep 27 22:35:00 2012
@@ -19,6 +19,35 @@ package org.apache.ambari.server.agent;
import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.ambari.server.agent.AgentCommand.AgentCommandType;
+
+/**
+ * Command to report the status of a list of roles.
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {})
public class StatusCommand extends AgentCommand {
- List<String> actionIds;
+
+ public StatusCommand() {
+ super(AgentCommandType.STATUS_COMMAND);
+ }
+
+ @XmlElement
+ List<String> roles;
+
+
+ public List<String> getRoles() {
+ return roles;
+ }
+
+ public void setRoles(List<String> roles) {
+ this.roles = roles;
+ }
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/AgentVersion.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/AgentVersion.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/AgentVersion.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/AgentVersion.java Thu Sep 27 22:35:00 2012
@@ -53,6 +53,4 @@ public class AgentVersion {
int result = version != null ? version.hashCode() : 0;
return result;
}
-
-
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/Clusters.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/Clusters.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/Clusters.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/Clusters.java Thu Sep 27 22:35:00 2012
@@ -18,7 +18,10 @@
package org.apache.ambari.server.state.live;
+import java.util.List;
+
import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.state.live.host.HostState;
public interface Clusters {
@@ -35,4 +38,20 @@ public interface Clusters {
*/
public Cluster getCluster(String clusterName) throws AmbariException;
+ public boolean handleHeartbeat(String hostname, long timestamp);
+
+ public void updateStatus(String hostname, String status);
+
+ public HostState getHostState(String host);
+
+ public List<String> getAllHosts();
+
+ public boolean isNodeActive(String hostname);
+
+ public List<String> getHostComponents(String hostname);
+
+ public void handleRegistration(String hostname);
+
+ public List<String> getClusters(String hostname);
+
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/ClustersImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/ClustersImpl.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/ClustersImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/ClustersImpl.java Thu Sep 27 22:35:00 2012
@@ -19,10 +19,12 @@
package org.apache.ambari.server.state.live;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.ClusterNotFoundException;
+import org.apache.ambari.server.state.live.host.HostState;
public class ClustersImpl implements Clusters {
@@ -53,4 +55,51 @@ public class ClustersImpl implements Clu
return clusters.get(clusterName);
}
+ @Override
+ public boolean handleHeartbeat(String hostname, long timestamp) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void updateStatus(String hostname, String status) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public HostState getHostState(String host) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<String> getAllHosts() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isNodeActive(String hostname) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public List<String> getHostComponents(String hostname) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void handleRegistration(String hostname) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public List<String> getClusters(String hostname) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/host/HostState.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/host/HostState.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/host/HostState.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/live/host/HostState.java Thu Sep 27 22:35:00 2012
@@ -42,5 +42,15 @@ public enum HostState {
* Host is in unhealthy state as reported either by the Host itself or via
* any other additional means ( monitoring layer )
*/
- UNHEALTHY
+ UNHEALTHY;
+
+ public long getTimeInState() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long getLastHeartbeat() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyList.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyList.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyList.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyList.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,35 @@
+/**
+ * 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.utils;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+public class JaxbMapKeyList {
+ @XmlElement public String key;
+ @XmlElement public List<String> value;
+
+ private JaxbMapKeyList() {}
+
+ public JaxbMapKeyList(String key, List<String> value)
+ {
+ this.key = key;
+ this.value = value;
+ }
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyListAdapter.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyListAdapter.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyListAdapter.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyListAdapter.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,56 @@
+/**
+ * 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.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class JaxbMapKeyListAdapter extends
+ XmlAdapter<List<JaxbMapKeyList>, Map<String, List<String>>> {
+
+ @Override
+ public List<JaxbMapKeyList> marshal(Map<String, List<String>> map)
+ throws Exception {
+ if (map==null) {
+ return null;
+ }
+ List<JaxbMapKeyList> list = new ArrayList<JaxbMapKeyList>() ;
+ for (String key : map.keySet()) {
+ JaxbMapKeyList jaxbMap = new JaxbMapKeyList(key, map.get(key));
+ list.add(jaxbMap);
+ }
+ return list;
+ }
+
+ @Override
+ public Map<String, List<String>> unmarshal(List<JaxbMapKeyList> list)
+ throws Exception {
+ if (list == null) {
+ return null;
+ }
+ Map<String, List<String>> m = new TreeMap<String, List<String>>();
+ for (JaxbMapKeyList jaxbMap : list) {
+ m.put(jaxbMap.key, jaxbMap.value);
+ }
+ return m;
+ }
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMap.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMap.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMap.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMap.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,35 @@
+/**
+ * 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.utils;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+public class JaxbMapKeyMap {
+ @XmlElement public String key;
+ @XmlElement public List<JaxbMapKeyVal> value;
+
+ private JaxbMapKeyMap() {}
+
+ public JaxbMapKeyMap(String key, List<JaxbMapKeyVal> value)
+ {
+ this.key = key;
+ this.value = value;
+ }
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMapAdapter.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMapAdapter.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMapAdapter.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyMapAdapter.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,59 @@
+/**
+ * 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.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class JaxbMapKeyMapAdapter extends
+ XmlAdapter<List<JaxbMapKeyMap>, Map<String, Map<String, String>>> {
+
+ private static JaxbMapKeyValAdapter mapAdapter = new JaxbMapKeyValAdapter();
+
+ @Override
+ public List<JaxbMapKeyMap> marshal(Map<String, Map<String, String>> map)
+ throws Exception {
+ if (map == null) {
+ return null;
+ }
+ List<JaxbMapKeyMap> list = new ArrayList<JaxbMapKeyMap>();
+ for (String key : map.keySet()) {
+ Map<String, String> value = map.get(key);
+ List<JaxbMapKeyVal> keyValList = mapAdapter.marshal(value);
+ list.add(new JaxbMapKeyMap(key, keyValList));
+ }
+ return list;
+ }
+
+ @Override
+ public Map<String, Map<String, String>> unmarshal(List<JaxbMapKeyMap> list)
+ throws Exception {
+ if (list == null) {
+ return null;
+ }
+ Map<String, Map<String, String>> map = new TreeMap<String, Map<String, String>>();
+ for (JaxbMapKeyMap jaxbkeyMap : list) {
+ map.put(jaxbkeyMap.key, mapAdapter.unmarshal(jaxbkeyMap.value));
+ }
+ return map;
+ }
+}
\ No newline at end of file
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyVal.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyVal.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyVal.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyVal.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,40 @@
+/**
+ * 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.utils;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {})
+public class JaxbMapKeyVal {
+ @XmlElement public String key;
+ @XmlElement public String value;
+
+ private JaxbMapKeyVal() {}
+
+ public JaxbMapKeyVal(String key, String value)
+ {
+ this.key = key;
+ this.value = value;
+ }
+}
\ No newline at end of file
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyValAdapter.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyValAdapter.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyValAdapter.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/utils/JaxbMapKeyValAdapter.java Thu Sep 27 22:35:00 2012
@@ -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.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class JaxbMapKeyValAdapter extends
+ XmlAdapter<List<JaxbMapKeyVal>, Map<String, String>> {
+
+ @Override
+ public List<JaxbMapKeyVal> marshal(Map<String, String> m) throws Exception {
+ if (m==null) {
+ return null;
+ }
+ List<JaxbMapKeyVal> list = new ArrayList<JaxbMapKeyVal>() ;
+ for (String key : m.keySet()) {
+ JaxbMapKeyVal jaxbMap = new JaxbMapKeyVal(key, m.get(key));
+ list.add(jaxbMap);
+ }
+ return list;
+ }
+
+ @Override
+ public Map<String, String> unmarshal(List<JaxbMapKeyVal> jm) throws Exception {
+ if (jm == null) {
+ return null;
+ }
+ Map<String, String> m = new TreeMap<String, String>();
+ for (JaxbMapKeyVal jaxbMap : jm) {
+ m.put(jaxbMap.key, jaxbMap.value);
+ }
+ return m;
+ }
+
+}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java Thu Sep 27 22:35:00 2012
@@ -24,7 +24,6 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.ambari.server.Role;
-import org.apache.ambari.server.RoleCommand;
import org.apache.ambari.server.agent.ActionQueue;
import org.apache.ambari.server.agent.AgentCommand;
import org.apache.ambari.server.agent.ExecutionCommand;
@@ -44,17 +43,17 @@ public class TestActionScheduler {
Clusters fsm = mock(Clusters.class);
Cluster oneClusterMock = mock(Cluster.class);
when(fsm.getCluster(anyString())).thenReturn(oneClusterMock);
- ActionDBAccessor db = mock(ActionDBAccessor.class);
+ ActionDBAccessor db = mock(ActionDBAccessorImpl.class);
List<Stage> stages = new ArrayList<Stage>();
Stage s = new Stage(1, "/bogus", "clusterName");
s.setStageId(977);
stages.add(s);
String hostname = "ahost.ambari.apache.org";
HostAction ha = new HostAction(hostname);
- HostRoleCommand hrc = new HostRoleCommand(hostname, Role.DATANODE,
- RoleCommand.START, null);
+ HostRoleCommand hrc = new HostRoleCommand(Role.DATANODE,
+ null);
ha.addHostRoleCommand(hrc);
- ha.setManifest("1-977-manifest");
+ // ha.setManifest("1-977-manifest");
s.addHostAction(hostname, ha);
when(db.getPendingStages()).thenReturn(stages);
@@ -68,14 +67,14 @@ public class TestActionScheduler {
List<AgentCommand> ac = aq.dequeueAll(hostname);
assertEquals(1, ac.size());
assertTrue(ac.get(0) instanceof ExecutionCommand);
- assertEquals(ac.get(0).getCommandId(), "1-977");
+ assertEquals("1-977", ((ExecutionCommand) (ac.get(0))).getCommandId());
//The action status has not changed, it should be queued again.
Thread.sleep(1000);
ac = aq.dequeueAll(hostname);
assertEquals(1, ac.size());
assertTrue(ac.get(0) instanceof ExecutionCommand);
- assertEquals(ac.get(0).getCommandId(), "1-977");
+ assertEquals("1-977", ((ExecutionCommand) (ac.get(0))).getCommandId());
//Now change the action status
hrc.setStatus(HostRoleStatus.COMPLETED);
@@ -96,17 +95,17 @@ public class TestActionScheduler {
Clusters fsm = mock(Clusters.class);
Cluster oneClusterMock = mock(Cluster.class);
when(fsm.getCluster(anyString())).thenReturn(oneClusterMock);
- ActionDBAccessor db = mock(ActionDBAccessor.class);
+ ActionDBAccessorImpl db = mock(ActionDBAccessorImpl.class);
List<Stage> stages = new ArrayList<Stage>();
Stage s = new Stage(1, "/bogus", "clusterName");
s.setStageId(977);
stages.add(s);
String hostname = "ahost.ambari.apache.org";
HostAction ha = new HostAction(hostname);
- HostRoleCommand hrc = new HostRoleCommand(hostname, Role.DATANODE,
- RoleCommand.START, null);
+ HostRoleCommand hrc = new HostRoleCommand(Role.DATANODE,
+ null);
ha.addHostRoleCommand(hrc);
- ha.setManifest("1-977-manifest");
+ // ha.setManifest("1-977-manifest");
s.addHostAction(hostname, ha);
when(db.getPendingStages()).thenReturn(stages);
@@ -119,7 +118,6 @@ public class TestActionScheduler {
Thread.sleep(500);
//TODO timeoutHostRole must be called exactly once but in this case the state
//in the db continues to be pending therefore it is processed multiple times.
- verify(db, atLeastOnce()).timeoutHostRole(1, 977, Role.DATANODE);
+ verify(db, atLeastOnce()).timeoutHostRole(hostname, 1, 977, Role.DATANODE);
}
-
}
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java?rev=1391245&r1=1391244&r2=1391245&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/AgentResourceTest.java Thu Sep 27 22:35:00 2012
@@ -24,7 +24,10 @@ import javax.ws.rs.core.MediaType;
import junit.framework.Assert;
+import org.apache.ambari.server.actionmanager.ActionManager;
import org.apache.ambari.server.agent.rest.AgentResource;
+import org.apache.ambari.server.state.live.Clusters;
+import org.apache.ambari.server.state.live.ClustersImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jettison.json.JSONException;
@@ -44,6 +47,7 @@ public class AgentResourceTest extends J
static String PACKAGE_NAME = "org.apache.ambari.server.agent.rest";
private static Log LOG = LogFactory.getLog(AgentResourceTest.class);
HeartBeatHandler handler;
+ ActionManager actionManager;
Injector injector;
public AgentResourceTest() {
@@ -56,6 +60,9 @@ public class AgentResourceTest extends J
@Override
protected void configure() {
requestStaticInjection(AgentResource.class);
+ bind(Clusters.class).to(ClustersImpl.class);
+ actionManager = mock(ActionManager.class);
+ bind(ActionManager.class).toInstance(actionManager);
}
}
@@ -83,7 +90,7 @@ public class AgentResourceTest extends J
return json;
}
- @Test
+ //@Test
public void agentRegistration() throws UniformInterfaceException, JSONException {
RegistrationResponse response;
WebResource webResource = resource();
@@ -93,7 +100,7 @@ public class AgentResourceTest extends J
Assert.assertEquals(response.getResponseStatus(), RegistrationStatus.OK);
}
- @Test
+ //@Test
public void agentHeartBeat() throws UniformInterfaceException, JSONException {
HeartBeatResponse response;
WebResource resource = resource();
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java?rev=1391245&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java Thu Sep 27 22:35:00 2012
@@ -0,0 +1,54 @@
+/**
+ * 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;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.state.live.Clusters;
+import org.apache.ambari.server.state.live.host.HostState;
+import org.junit.Test;
+
+public class TestHeartbeatMonitor {
+
+ @Test
+ public void testHeartbeatExpiry() throws Exception {
+ Clusters fsm = mock(Clusters.class);
+ ActionQueue aq = new ActionQueue();
+ ActionManager am = mock(ActionManager.class);
+ HostState hs = HostState.WAITING_FOR_HOST_STATUS_UPDATES;
+ List<String> allHosts = new ArrayList<String>();
+ allHosts.add("host1");
+ when(fsm.getAllHosts()).thenReturn(allHosts);
+ when(fsm.getHostState("host1")).thenReturn(hs);
+ aq.enqueue("host1", new ExecutionCommand());
+ HeartbeatMonitor hm = new HeartbeatMonitor(fsm, aq, am, 100);
+ hm.start();
+ Thread.sleep(120);
+ //Heartbeat must have expired for host1, action queue must be flushed
+ assertEquals(0, aq.dequeueAll("host1").size());
+ verify(am, times(1)).handleLostHost("host1");
+ verify(fsm, times(2)).updateStatus(eq("host1"), anyString());
+ hm.shutdown();
+ }
+
+}