// 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 com.cloud.agent; import com.cloud.agent.api.AgentControlAnswer; import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.exception.ConnectionException; import com.cloud.host.Host; import com.cloud.host.Status; /** * There are several types of events that the AgentManager forwards * * 1. Agent Connect & Disconnect * 2. Commands sent by the agent. * 3. Answers sent by the agent. */ public interface Listener { /** * * @param agentId id of the agent * @param seq sequence number return by the send() method. * @param answers answers to the commands. * @return true if processed. false if not. */ boolean processAnswers(long agentId, long seq, Answer[] answers); /** * This method is called by the AgentManager when an agent sent * a command to the server. In order to process these commands, * the Listener must be registered for host commands. * * @param agentId id of the agent. * @param seq sequence number of the command sent. * @param commands commands that were sent. * @return true if you processed the commands. false if not. */ boolean processCommands(long agentId, long seq, Command[] commands); /** * process control command sent from agent under its management * @param agentId * @param cmd * @return */ AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd); /** * This method is called by AgentManager when a host is added to a cluster. * @param long the ID of the newly added host */ void processHostAdded(long hostId); /** * This method is called by AgentManager when an agent made a * connection to this server if the listener has * been registered for host events. * @param cmd command sent by the agent to the server on startup. * @param forRebalance TODO * @param agentId id of the agent * @throws ConnectionException if host has problems and needs to put into maintenance state. */ void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException; /** * This method is called by AgentManager when an agent disconnects * from this server if the listener has been registered for host events. * * If the Listener is passed to the send() method, this method is * also called by AgentManager if the agent disconnected. * * @param agentId id of the agent * @param state the current state of the agent. */ boolean processDisconnect(long agentId, Status state); /** * This method is called by AgentManager when a host is about to be removed from a cluster. * @param long the ID of the host that's about to be removed */ void processHostAboutToBeRemoved(long hostId); /** * This method is called by AgentManager when a host is removed from a cluster. * @param long the ID of the newly removed host */ void processHostRemoved(long hostId, long clusterId); /** * If this Listener is passed to the send() method, this method * is called by AgentManager after processing an answer * from the agent. Returning true means you're expecting more * answers from the agent using the same sequence number. * * @return true if expecting more answers using the same sequence number. */ boolean isRecurring(); /** * If the Listener is passed to the send() method, this method is * called to determine how long to wait for the reply. The value * is in seconds. -1 indicates to wait forever. 0 indicates to * use the default timeout. If the timeout is * reached, processTimeout on this same Listener is called. * * @return timeout in seconds before processTimeout is called. */ int getTimeout(); /** * If the Listener is passed to the send() method, this method is * called by the AgentManager to process a command timeout. * @param agentId id of the agent * @param seq sequence number returned by the send(). * @return true if processed; false if not. */ boolean processTimeout(long agentId, long seq); }